From 5b2c955043b71b1aead7b2c7d0beb94b2ad15e79 Mon Sep 17 00:00:00 2001 From: Simpcyclassy Date: Sun, 27 Mar 2022 18:24:16 +0100 Subject: [PATCH] Merge branch 'release/v1' into parameter-space-error Signed-off-by: Simpcyclassy --- .github/workflows/close-issues.yaml | 6 +- .gitignore | 2 + CODE_OF_CONDUCT.md | 2 +- CONTRIBUTING.md | 25 +- CONTRIBUTION_LADDER.md | 2 +- CONTRIBUTORS.md | 1 + Makefile | 4 - README.md | 2 +- REVIEWING.md | 12 +- build/azure-pipelines.integration.yml | 2 +- build/azure-pipelines.pr-automatic.yml | 2 +- build/azure-pipelines.release-template.yml | 2 +- build/images/agent/Dockerfile | 3 +- build/images/client/Dockerfile | 10 +- .../testdata/bundles/mysql/.cnab/bundle.json | 2 +- build/testdata/bundles/mysql/helpers.sh | 5 + build/testdata/bundles/mysql/porter.yaml | 68 +- .../bundles/wordpress/.cnab/bundle.json | 2 +- build/testdata/bundles/wordpress/helpers.sh | 4 + build/testdata/bundles/wordpress/porter.yaml | 65 +- cmd/porter/completion_test.go | 23 +- cmd/porter/credentials.go | 28 +- cmd/porter/docs.go | 3 +- cmd/porter/main.go | 89 +- cmd/porter/version.go | 3 +- docs/content/author-bundles.md | 18 +- docs/content/best-practices/gke.md | 10 +- docs/content/build-image.md | 83 +- docs/content/cli/credentials.md | 1 + docs/content/cli/credentials_create.md | 45 + docs/content/cli/credentials_generate.md | 2 +- docs/content/credentials.md | 4 +- docs/content/custom-dockerfile.md | 157 +- docs/content/design/kubernetes-mixin.md | 2 +- docs/content/docs.md | 2 +- docs/content/examples/airgap.md | 2 +- docs/content/mixins/az.md | 2 +- docs/content/mixins/docker-compose.md | 2 +- docs/content/mixins/exec.md | 4 +- docs/content/plugins/types/_index.md | 4 +- docs/content/porter-or-duffle.md | 6 +- docs/content/quickstart/desired-state.md | 6 +- docs/content/reference/file-formats.md | 301 ++- .../slides/pack-your-bags-msp/index.md | 14 +- docs/content/slides/pack-your-bags/index.md | 6 +- docs/content/wiring.md | 12 +- ...s_b95b077eb505d5c0aff8055eaced30ad.content | 2 +- docs/static/_redirects | 3 + docs/themes/porter/static/css/prism.css | 272 +- docs/themes/porter/static/js/custom/prism.js | 2289 ++++++++++++++++- examples/airgap/porter.yaml | 3 +- examples/aks-spring-music/Dockerfile.tmpl | 2 +- examples/aks-spring-music/porter.yaml | 1 + examples/azure-terraform/README.md | 10 +- examples/azure-terraform/porter.yaml | 1 + examples/azure-wordpress/porter.yaml | 11 +- examples/credentials-tutorial/Dockerfile.tmpl | 2 +- examples/credentials-tutorial/porter.yaml | 1 + examples/docker/porter.yaml | 1 + examples/dockerapp/porter.yaml | 1 + examples/exec-outputs/Dockerfile.tmpl | 2 +- examples/exec-outputs/cluster.sh | 6 +- examples/exec-outputs/porter.yaml | 5 +- examples/gke-example/Dockerfile.tmpl | 4 +- examples/gke-example/porter.yaml | 5 +- examples/hello/.cnab/bundle.json | 1 - examples/hello/porter.yaml | 1 + examples/kubernetes/porter.yaml | 13 +- examples/plugins-tutorial/porter.yaml | 1 + examples/porter-discourse/Dockerfile.tmpl | 2 +- .../porter-discourse/porter-discourse.yaml | 1 + examples/service-fabric-cli/Dockerfile.tmpl | 2 +- examples/service-fabric-cli/porter.yaml | 1 + go.mod | 173 +- go.sum | 583 +++-- mage/docs/docs.go | 71 +- mage/docs/docs_test.go | 74 + mage/mixins/magefile.go | 3 +- mage/mixins/magefile_test.go | 3 +- mage/releases/build.go | 7 +- mage/releases/git.go | 11 +- mage/releases/publish.go | 71 +- mage/releases/publish_test.go | 50 + mage/setup.go | 3 +- mage/tests/kind.go | 5 +- magefile.go | 46 +- netlify.toml | 6 +- pkg/agent/agent.go | 3 +- pkg/build/build.go | 9 +- pkg/build/dockerfile-generator.go | 141 +- pkg/build/dockerfile-generator_test.go | 223 +- pkg/build/testdata/buildkit.Dockerfile | 18 +- ...stom-dockerfile-expected-output.Dockerfile | 16 + pkg/build/testdata/docker.Dockerfile | 14 +- ...ng-mixins-token-expected-output.Dockerfile | 17 + pkg/cache/cache.go | 14 +- pkg/cache/cached_bundle.go | 24 +- .../cnab/bundle.json | 2 +- pkg/cache/testdata/cnab/bundle.json | 2 +- pkg/claims/installation.go | 3 + pkg/cli/config_test.go | 28 +- pkg/cnab/config-adapter/adapter_test.go | 8 +- pkg/cnab/config-adapter/helpers.go | 15 + pkg/cnab/config-adapter/stamp.go | 2 +- pkg/cnab/config-adapter/stamp_test.go | 10 +- .../testdata/mybuns.bundle.json | 2 +- .../testdata/porter-with-custom-action.yaml | 7 +- .../testdata/porter-with-custom-metadata.yaml | 1 + .../testdata/porter-with-deps.yaml | 1 + .../testdata/porter-with-maintainers.yaml | 1 + .../testdata/porter-with-parameters.yaml | 5 +- .../porter-with-required-extensions.yaml | 1 + .../testdata/porter-with-templating.yaml | 1 + pkg/cnab/config-adapter/testdata/porter.yaml | 1 + pkg/cnab/provider/docker_linux.go | 48 + pkg/cnab/provider/docker_linux_test.go | 21 + pkg/cnab/provider/driver.go | 34 +- pkg/cnab/provider/driver_darwin.go | 21 + pkg/cnab/provider/driver_test.go | 6 + pkg/cnab/provider/driver_windows.go | 19 + pkg/cnab/provider/helpers.go | 8 + pkg/cnab/provider/main_test.go | 11 + pkg/cnab/reference_test.go | 9 + pkg/config/config.go | 2 +- pkg/config/config_test.go | 6 +- pkg/config/helpers.go | 5 +- pkg/config/loader_test.go | 8 +- pkg/context/context.go | 17 +- pkg/context/context_test.go | 2 +- pkg/context/helpers.go | 52 +- pkg/context/telemetry.go | 9 +- pkg/credentials/credentialset.go | 42 +- pkg/credentials/credentialset_test.go | 36 +- pkg/editor/editor.go | 3 +- pkg/encoding/encoding.go | 3 +- pkg/exec/action.go | 30 +- pkg/exec/builder/execute.go | 14 +- pkg/exec/builder/execute_test.go | 38 +- pkg/exec/builder/output_file_test.go | 3 +- pkg/exec/builder/output_jsonpath_test.go | 4 +- pkg/exec/exec_test.go | 4 +- pkg/exec/execute_test.go | 3 +- pkg/exec/schema/exec.json | 7 + pkg/exec/testdata/install-input.yaml | 2 + pkg/manifest/manifest.go | 30 +- pkg/manifest/manifest_test.go | 91 +- .../testdata/bundles/mysql/porter.yaml | 15 +- .../testdata/bundles/nginx/porter.yaml | 7 +- pkg/manifest/testdata/empty-steps.yaml | 1 + pkg/manifest/testdata/porter-no-name.yaml | 1 + .../testdata/porter-with-custom-metadata.yaml | 1 + pkg/manifest/testdata/porter-with-deps.yaml | 1 + .../testdata/porter-with-templating.yaml | 1 + pkg/manifest/testdata/porter.yaml | 1 + pkg/manifest/testdata/simple.porter.yaml | 7 +- pkg/manifest/testdata/with-credentials.yaml | 9 +- pkg/mixin/pkgmgmt_test.go | 12 +- pkg/mixin/query/testdata/porter.yaml | 2 +- pkg/parameters/parameter_store_test.go | 4 +- pkg/parameters/parameters.go | 6 +- pkg/parameters/parameters_test.go | 4 +- pkg/parameters/parameterset.go | 40 +- pkg/parameters/parameterset_test.go | 11 +- pkg/parameters/testdata/paramset.json | 10 +- pkg/pkgmgmt/client/helpers.go | 8 +- pkg/pkgmgmt/client/install.go | 7 +- pkg/pkgmgmt/client/install_test.go | 28 +- pkg/pkgmgmt/feed/generate.go | 3 +- pkg/porter/archive.go | 5 +- pkg/porter/build.go | 27 +- pkg/porter/build_integration_test.go | 20 +- pkg/porter/cnab.go | 9 +- pkg/porter/cnab_test.go | 35 +- pkg/porter/create.go | 5 +- pkg/porter/create_test.go | 16 +- pkg/porter/credentials.go | 87 +- pkg/porter/credentials_test.go | 136 +- pkg/porter/dependencies.go | 15 +- pkg/porter/generateManifest.go | 3 +- pkg/porter/generateManifest_test.go | 8 +- pkg/porter/install.go | 2 +- pkg/porter/lifecycle.go | 6 +- pkg/porter/lifecycle_integration_test.go | 1 - pkg/porter/lifecycle_test.go | 7 +- pkg/porter/lint.go | 5 +- pkg/porter/options.go | 28 +- pkg/porter/packages_test.go | 27 +- pkg/porter/parameters.go | 27 +- pkg/porter/porter.go | 18 - pkg/porter/porter_integration_test.go | 5 +- pkg/porter/publish.go | 52 +- pkg/porter/publish_test.go | 3 +- pkg/porter/reconcile.go | 2 +- pkg/porter/run.go | 5 +- pkg/porter/run_test.go | 2 +- pkg/porter/stamp.go | 7 +- pkg/porter/storage.go | 11 +- .../testdata/credentials/kool-kreds.json | 10 +- .../testdata/credentials/kool-kreds.yaml | 7 +- .../testdata/credentials/show-output.json | 10 +- .../testdata/credentials/show-output.yaml | 7 +- .../testdata/generateManifest/all-fields.yaml | 1 + .../testdata/generateManifest/new-name.yaml | 1 + .../generateManifest/new-version.yaml | 1 + .../testdata/generateManifest/original.yaml | 1 + pkg/porter/testdata/paramafest.yaml | 7 +- pkg/porter/testdata/parameters/mypset.json | 10 +- pkg/porter/testdata/parameters/mypset.yaml | 7 +- .../testdata/paramset-with-file-param.json | 8 +- pkg/porter/testdata/paramset.json | 8 +- pkg/porter/testdata/paramset2.json | 8 +- .../testdata/porter-with-file-param.yaml | 1 + pkg/porter/testdata/porter.yaml | 3 +- pkg/porter/testdata/schema.json | 44 +- .../testdata/test-creds/kool-kreds.json | 10 +- pkg/runtime/runtime-manifest.go | 5 +- pkg/runtime/runtime.go | 5 +- pkg/runtime/runtime_test.go | 2 +- pkg/runtime/testdata/bundle-images.json | 2 +- .../testdata/dep-metadata-substitution.yaml | 1 + .../testdata/metadata-substitution.yaml | 6 +- .../outputs/bundle-outputs-error.yaml | 15 +- .../testdata/outputs/bundle-outputs.yaml | 15 +- pkg/runtime/testdata/param-test-in-block.yaml | 7 +- pkg/runtime/testdata/porter-images.yaml | 1 + pkg/runtime/testdata/slice-test.yaml | 7 +- pkg/schema/credential-set.schema.json | 4 +- pkg/schema/installation.schema.json | 2 +- .../manifest.schema.json} | 96 +- pkg/schema/parameter-set.schema.json | 4 +- .../testdata/migrated/credentials/mybun.json | 10 +- .../testdata/migrated/parameters/mybun.json | 10 +- pkg/templates/templates.go | 15 +- pkg/templates/templates/.gitignore | 2 + .../templates/build/buildkit.Dockerfile | 6 +- .../templates/build/docker.Dockerfile | 4 +- pkg/templates/templates/create/porter.yaml | 5 +- .../create/template.buildkit.Dockerfile | 26 +- .../create/template.docker.Dockerfile | 20 +- .../credentials/create/credential-set.json | 41 + .../credentials/create/credential-set.yaml | 34 + pkg/templates/templates_test.go | 24 + pkg/test/helper.go | 12 +- pkg/version.go | 24 +- pkg/version_test.go | 6 +- pkg/yaml/yq.go | 3 +- scripts/install/install-linux.sh | 2 +- scripts/install/install-mac.sh | 2 +- tests/integration/archive_test.go | 5 +- tests/integration/install_test.go | 7 +- tests/integration/invoke_test.go | 5 +- tests/integration/outputs_test.go | 19 +- tests/integration/rebuild_test.go | 9 +- tests/integration/suppress_output_test.go | 5 +- .../bundle-with-credentials/helpers.sh | 2 +- .../bundle-with-credentials/porter.yaml | 3 +- .../bundle-with-custom-action/helpers.sh | 2 +- .../bundle-with-custom-action/porter.yaml | 1 + .../bundle-with-file-params/helpers.sh | 2 +- .../bundle-with-file-params/porter.yaml | 9 +- .../bundles/outputs-example/Dockerfile | 8 +- .../bundles/outputs-example/porter.yaml | 1 + .../suppressed-output-example/porter.yaml | 1 + tests/smoke/copy_test.go | 28 +- tests/testdata/config/config.toml | 10 +- tests/testdata/creds/alt-mybuns.yaml | 4 +- tests/testdata/creds/invalid-schema.yaml | 2 - tests/testdata/creds/mybuns.yaml | 4 +- tests/testdata/helpers.go | 2 +- tests/testdata/mybuns/Dockerfile.tmpl | 4 +- tests/testdata/mybuns/porter.yaml | 1 + tests/testdata/mydb/porter.yaml | 1 + tests/testdata/params/mybuns.yaml | 4 +- tests/tester/main.go | 3 +- workshop/etcd-operator/porter.yaml | 2 +- workshop/wordpress/porter.yaml | 2 +- 276 files changed, 5622 insertions(+), 1795 deletions(-) create mode 100644 docs/content/cli/credentials_create.md delete mode 100644 examples/hello/.cnab/bundle.json create mode 100644 mage/docs/docs_test.go create mode 100644 mage/releases/publish_test.go create mode 100644 pkg/build/testdata/custom-dockerfile-expected-output.Dockerfile create mode 100644 pkg/build/testdata/missing-mixins-token-expected-output.Dockerfile create mode 100644 pkg/cnab/config-adapter/helpers.go create mode 100644 pkg/cnab/provider/docker_linux.go create mode 100644 pkg/cnab/provider/docker_linux_test.go create mode 100644 pkg/cnab/provider/driver_darwin.go create mode 100644 pkg/cnab/provider/driver_windows.go create mode 100644 pkg/cnab/provider/main_test.go rename pkg/{templates/templates/schema.json => schema/manifest.schema.json} (83%) create mode 100644 pkg/templates/templates/.gitignore create mode 100644 pkg/templates/templates/credentials/create/credential-set.json create mode 100644 pkg/templates/templates/credentials/create/credential-set.yaml diff --git a/.github/workflows/close-issues.yaml b/.github/workflows/close-issues.yaml index a1c082a7b9..39e7d9feb5 100644 --- a/.github/workflows/close-issues.yaml +++ b/.github/workflows/close-issues.yaml @@ -4,16 +4,16 @@ name: Close Completed Issues on: - pull_request: + pull_request_target: types: [closed] branches: - release/* jobs: - closeIssueOnPrMergeTrigger: + closeIssue: runs-on: ubuntu-latest steps: - name: Closes issues related to a merged pull request. - uses: ldez/gha-mjolnir@v1.0.3 + uses: docker://carolynvs/gha-mjolnir:v1.0.3-pullrequesttarget env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.gitignore b/.gitignore index b212537284..3844d0a091 100644 --- a/.gitignore +++ b/.gitignore @@ -1,10 +1,12 @@ /docs/public/ /docs/content/operator +/docs/sources/ /bin /porter .DS_Store /build/git_askpass.sh tests/smoke/mybuns/ +.env .cnab examples/**/Dockerfile diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index e8c9e84201..a017e8a4c1 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -3,7 +3,7 @@ ## Our Pledge In the interest of fostering an open and welcoming environment, we as -contributors and maintainers pledge to making participation in our project and +contributors and maintainers pledge to make participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 3dd989cf9c..c6fe5599b8 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -19,6 +19,7 @@ * [Code structure and practices](#code-structure-and-practices) * [What is the general code layout?](#what-is-the-general-code-layout) * [Logging](#logging) + * [Breaking Changes](#breaking-changes) * [Infrastructure](#infrastructure) * [CDN Setup](#cdn-setup) * [Releases](#releases) @@ -54,7 +55,7 @@ We have good first issues for new contributors and help wanted issues for our ot because they are not finished being designed or we aren't sure if we want the feature, etc. -Maintainers will do our best regularly make new issues for you to solve and then +Maintainers will do their best to regularly make new issues for you to solve and then help out as you work on them. 💖 We have a [roadmap] that will give you a good idea of the @@ -63,7 +64,7 @@ you would like to work on after you have tackled an issue or two to learn how to contribute to Porter. If you have a big idea for Porter, learn [how to propose a change to Porter][pep]. -Another great way to contribute is to create a mixin! You can start use the +Another great way to contribute is to create a mixin! You can start using the [Porter Skeletor][skeletor] repository as a template to start, along with the [Mixin Developer Guide][mixin-dev-guide]. @@ -94,7 +95,7 @@ things where the motivation/problem is unambiguous. If there isn't an issue for your PR, please make an issue first and explain the problem or motivation for the change you are proposing. When the solution isn't -straightforward, for example "Implement missing command X", then also outline +straightforward, for example, "Implement missing command X", then also outline your proposed solution. Your PR will go smoother if the solution is agreed upon before you've spent a lot of time implementing it. @@ -197,7 +198,7 @@ repository, you can amend your commit with the sign-off by running review, or ping in [slack][slack]. Sometimes we have busy days, sick days, weekends and vacations, so a little patience is appreciated! 🙇‍♀️ 1. The reviewer will leave feedback. - * `nits`: These are suggestions that you may decide incorporate into your pull + * `nits`: These are suggestions that you may decide to incorporate into your pull request or not without further comment. * It can help to put a 👍 on comments that you have implemented so that you can keep track. @@ -235,7 +236,7 @@ kills contributor momentum. # Contribution Ladder -Our [contribution ladder][ladder] defines the roles and responsibilities on this +Our [contribution ladder][ladder] defines the roles and responsibilities for this project and how to participate with the goal of moving from a user to a maintainer. @@ -574,6 +575,20 @@ we send regular command output to `Out` and debug information to `Err`. It allows us to then run the command and see the debug output separately, like so `porter schema --debug 2> err.log`. +## Breaking Changes + +Some changes in Porter break our compatibility with previous versions of Porter. +When that happens, we need to release that change with a new major version number to indicate to users that it contains breaking changes. +When you realize that you may need to make a breaking change, discuss it with a maintainer on the issue or pull request and we'll come up with a plan for how it should be released. +Here are some examples of breaking changes: + +* The schema of porter.yaml changed. +* The schema of Porter's [file formats](https://release-v1.porter.sh/reference/file-formats) changed. +* The schema of Porter's [config file](https://release-v1.porter.sh/configuration/#config-file) changed. +* Flags or behavior of a CLI command changed, such as removing a flag or adding a validation that can result in a hard error, preventing the command from running. + +All of Porter's documents have a schemaVersion field and when the schema of the document is changed, the version number should be incremented as well in the default set on new documents, the supported schema version constant in the code, and in the documentation for that document. + # Infrastructure This section includes overviews of infrastructure Porter relies on, mostly intended diff --git a/CONTRIBUTION_LADDER.md b/CONTRIBUTION_LADDER.md index b6308fc937..4c5a4ec36a 100644 --- a/CONTRIBUTION_LADDER.md +++ b/CONTRIBUTION_LADDER.md @@ -10,7 +10,7 @@ * [How to become an admin](#admin) --- -Our ladder defines the roles and responsibilities on this project and how to +Our ladder defines the roles and responsibilities for this project and how to participate with the goal of moving from a user to a maintainer. You will need to gain people's trust, demonstrate your competence and understanding, and meet the requirements of the role. diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 49745e056d..254ed80b17 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -62,3 +62,4 @@ and we will add you. **All** contributors belong here. 💯 * [Mahendra Bishnoi](https://github.com/mahendrabishnoi2) * [Yingrong Zhao](https://github.com/VinozzZ) * [Chioma Onyekpere](https://github.com/Simpcyclassy) +* [Saksham Sharma](https://github.com/sakkshm26) diff --git a/Makefile b/Makefile index de3e302388..ce9d6a6619 100644 --- a/Makefile +++ b/Makefile @@ -47,10 +47,6 @@ test-integration: test-smoke: go run mage.go -v TestSmoke -.PHONY: docs -docs: - go run mage.go -v docs - publish: publish-bin publish-mixins publish-images publish-bin: diff --git a/README.md b/README.md index daa14b027c..da29977e3a 100644 --- a/README.md +++ b/README.md @@ -92,7 +92,7 @@ open issues and pull requests. The roadmap represents what the maintainers have said that they are currently working on and plan to work on over the next few months. We use the "on-hold" bucket to communicate items of interest that do not have a -maintainer who will be working on it. +maintainer who will be working on them.

Check out our roadmap

diff --git a/REVIEWING.md b/REVIEWING.md index 53a18e47c4..f61cada279 100644 --- a/REVIEWING.md +++ b/REVIEWING.md @@ -13,10 +13,10 @@ Thank you for reviewing pull requests for us! 💖 Here are the values and etiquette that we follow to ensure a welcoming, inclusive project that doesn't burn out our authors or our reviewers. 😅 -* We ask that authors respect reviewers time. Check out the +* We ask that authors respect reviewers' time. Check out the [Contributing Guide](CONTRIBUTING.md) and know that you can ask the - author to do their part to make _your_ part managable. -* We ask that reviewers respect authors time. Please do your best to review + author to do their part to make _your_ part manageable. +* We ask that reviewers respect authors' time. Please do your best to review a pull request in a reasonable amount of time once you have assigned it to yourself. * The definition of "reasonable amount of time" is 3 business days. The ask is @@ -38,9 +38,9 @@ project that doesn't burn out our authors or our reviewers. 😅 For example, it is missing an agreed upon solution, requires an explanation from the author, has a very large set of changes that are not easy to review, etc., ask the author to correct that up-front. -1. When you provide feedback, make it clear if the change must be made in order +1. When you provide feedback, make it clear if the change must be made for the pull request to be approved, or if it is just a suggestion. Mark - suggestions with **nit**, for example `nit: I prefer that the bikeshed be + suggestions with **nit**, for example, `nit: I prefer that the bikeshed be blue`. 1. When the pull request is ready to merge, squash the commits they require tidying unless the author asked to do that themselves. @@ -71,7 +71,7 @@ reviewers. ## Giving feedback * Be kind. Here is [good article][kind-reviews] with example code reviews and - how to improve your feedback. Giving feedback of this caliber is an requirement + how to improve your feedback. Giving feedback of this caliber is a requirement of maintainers and those who cannot do so will have the maintainer role revoked. * Request changes for bugs and program correctness. * Request changes to be consistent with existing precedent in the codebase. diff --git a/build/azure-pipelines.integration.yml b/build/azure-pipelines.integration.yml index e47a3b5755..994bcca6e3 100644 --- a/build/azure-pipelines.integration.yml +++ b/build/azure-pipelines.integration.yml @@ -12,7 +12,7 @@ pool: vmImage: "ubuntu-latest" variables: - GOVERSION: "1.17.6" + GOVERSION: "1.17.8" jobs: - job: integration_test diff --git a/build/azure-pipelines.pr-automatic.yml b/build/azure-pipelines.pr-automatic.yml index 0761c55555..9be157d677 100644 --- a/build/azure-pipelines.pr-automatic.yml +++ b/build/azure-pipelines.pr-automatic.yml @@ -11,7 +11,7 @@ pool: vmImage: "ubuntu-latest" variables: - GOVERSION: "1.17.6" + GOVERSION: "1.17.8" parameters: - name: buildExamples diff --git a/build/azure-pipelines.release-template.yml b/build/azure-pipelines.release-template.yml index f2a9c188d4..c4b808113e 100644 --- a/build/azure-pipelines.release-template.yml +++ b/build/azure-pipelines.release-template.yml @@ -4,7 +4,7 @@ variables: # these are really constants parameters: - name: goVersion type: string - default: "1.17.6" + default: "1.17.8" - name: registry type: string default: getporterci diff --git a/build/images/agent/Dockerfile b/build/images/agent/Dockerfile index b32114c59c..66a07cc587 100644 --- a/build/images/agent/Dockerfile +++ b/build/images/agent/Dockerfile @@ -6,6 +6,7 @@ FROM $REGISTRY/porter:$PORTER_VERSION VOLUME /porter-config ENV PORTER_HOME /app/.porter -COPY --chown=65532:65532 bin/dev/agent-linux-amd64 /app/.porter/agent +COPY --chown=65532:0 --chmod=770 bin/dev/agent-linux-amd64 /app/.porter/agent +USER 65532 ENTRYPOINT ["/app/.porter/agent"] diff --git a/build/images/client/Dockerfile b/build/images/client/Dockerfile index 7784225922..e600d64371 100644 --- a/build/images/client/Dockerfile +++ b/build/images/client/Dockerfile @@ -11,10 +11,14 @@ COPY bin/mixins/exec/dev/exec-linux-amd64 mixins/exec/exec RUN ln -s /app/.porter/porter runtimes/porter-runtime && \ ln -s /app/.porter/mixins/exec/exec mixins/exec/runtimes/exec-runtime -# Copy the porter installation into a distroless container without root -FROM gcr.io/distroless/static:nonroot +# Copy the porter installation into a distroless container +# Explicitly not using the nonroot tag because we don't want the user to exist so it is placed in the root group +# This allows us to run with a random UID, and access a mounted docker socket (which is only accessible via the root group) +FROM gcr.io/distroless/static WORKDIR /app -COPY --from=builder --chown=65532:65532 /app/.porter /app/.porter +COPY --from=builder --chown=65532:0 --chmod=770 /app/.porter /app/.porter ENV PATH "$PATH:/app/.porter" +# Run as a nonroot user +USER 65532 ENTRYPOINT ["/app/.porter/porter"] diff --git a/build/testdata/bundles/mysql/.cnab/bundle.json b/build/testdata/bundles/mysql/.cnab/bundle.json index c187fa4abf..3484ea9787 100644 --- a/build/testdata/bundles/mysql/.cnab/bundle.json +++ b/build/testdata/bundles/mysql/.cnab/bundle.json @@ -1 +1 @@ -{"actions":{"ping":{"description":"ping","modifies":true}},"credentials":{"kubeconfig":{"path":"/root/.kube/config","required":true}},"custom":{"sh.porter":{"commit":"43d077da","manifest":"bWl4aW5zOgotIGV4ZWMKLSBoZWxtMzoKICAgIHJlcG9zaXRvcmllczoKICAgICAgYml0bmFtaToKICAgICAgICB1cmw6ICJodHRwczovL2NoYXJ0cy5iaXRuYW1pLmNvbS9iaXRuYW1pIgoKbmFtZTogbXlzcWwKdmVyc2lvbjogIjAuMS40IgpyZWdpc3RyeTogImxvY2FsaG9zdDo1MDAwIgoKY3JlZGVudGlhbHM6Ci0gbmFtZToga3ViZWNvbmZpZwogIHBhdGg6IC9yb290Ly5rdWJlL2NvbmZpZwoKcGFyYW1ldGVyczoKLSBuYW1lOiBkYXRhYmFzZS1uYW1lCiAgdHlwZTogc3RyaW5nCiAgZGVmYXVsdDogbXlkYgogIGVudjogREFUQUJBU0VfTkFNRQotIG5hbWU6IG15c3FsLXVzZXIKICB0eXBlOiBzdHJpbmcKICBkZWZhdWx0OiBteXNxbC1hZG1pbgogIGVudjogTVlTUUxfVVNFUgotIG5hbWU6IG5hbWVzcGFjZQogIHR5cGU6IHN0cmluZwogIGRlZmF1bHQ6ICdteXNxbCcKLSBuYW1lOiBteXNxbC1uYW1lCiAgdHlwZTogc3RyaW5nCiAgZGVmYXVsdDogcG9ydGVyLWNpLW15c3FsCgppbnN0YWxsOgotIGhlbG0zOgogICAgZGVzY3JpcHRpb246ICJJbnN0YWxsIE15U1FMIgogICAgbmFtZTogInt7IGJ1bmRsZS5wYXJhbWV0ZXJzLm15c3FsLW5hbWUgfX0iCiAgICBjaGFydDogYml0bmFtaS9teXNxbAogICAgdmVyc2lvbjogNi4xNC4xMgogICAgbmFtZXNwYWNlOiAie3sgYnVuZGxlLnBhcmFtZXRlcnMubmFtZXNwYWNlIH19IgogICAgcmVwbGFjZTogdHJ1ZQogICAgc2V0OgogICAgICBkYi5uYW1lOiAie3sgYnVuZGxlLnBhcmFtZXRlcnMuZGF0YWJhc2UtbmFtZX19IgogICAgICBkYi51c2VyOiAie3sgYnVuZGxlLnBhcmFtZXRlcnMubXlzcWwtdXNlciB9fSIKICAgIG91dHB1dHM6CiAgICAtIG5hbWU6IG15c3FsLXJvb3QtcGFzc3dvcmQKICAgICAgc2VjcmV0OiAie3sgYnVuZGxlLnBhcmFtZXRlcnMubXlzcWwtbmFtZSB9fSIKICAgICAga2V5OiBteXNxbC1yb290LXBhc3N3b3JkCiAgICAtIG5hbWU6IG15c3FsLXBhc3N3b3JkCiAgICAgIHNlY3JldDogInt7IGJ1bmRsZS5wYXJhbWV0ZXJzLm15c3FsLW5hbWUgfX0iCiAgICAgIGtleTogbXlzcWwtcGFzc3dvcmQKCnBpbmc6CiAgLSBleGVjOgogICAgICBkZXNjcmlwdGlvbjogIlBpbmciCiAgICAgIGNvbW1hbmQ6IC4vaGVscGVycy5zaAogICAgICBhcmd1bWVudHM6CiAgICAgICAgLSBwaW5nCgp1cGdyYWRlOgogIC0gaGVsbTM6CiAgICAgIGRlc2NyaXB0aW9uOiAiVXBncmFkZSBNeVNRTCIKICAgICAgbmFtZTogInt7IGJ1bmRsZS5wYXJhbWV0ZXJzLm15c3FsLW5hbWUgfX0iCiAgICAgIG5hbWVzcGFjZTogInt7IGJ1bmRsZS5wYXJhbWV0ZXJzLm5hbWVzcGFjZSB9fSIKICAgICAgY2hhcnQ6IGJpdG5hbWkvbXlzcWwKICAgICAgdmVyc2lvbjogNi4xNC4xMgogICAgICBvdXRwdXRzOgogICAgICAtIG5hbWU6IG15c3FsLXJvb3QtcGFzc3dvcmQKICAgICAgICBzZWNyZXQ6ICJ7eyBidW5kbGUucGFyYW1ldGVycy5teXNxbC1uYW1lIH19IgogICAgICAgIGtleTogbXlzcWwtcm9vdC1wYXNzd29yZAogICAgICAtIG5hbWU6IG15c3FsLXBhc3N3b3JkCiAgICAgICAgc2VjcmV0OiAie3sgYnVuZGxlLnBhcmFtZXRlcnMubXlzcWwtbmFtZSB9fSIKICAgICAgICBrZXk6IG15c3FsLXBhc3N3b3JkCgp1bmluc3RhbGw6Ci0gaGVsbTM6CiAgICBkZXNjcmlwdGlvbjogIlVuaW5zdGFsbCBNeVNRTCIKICAgIHB1cmdlOiB0cnVlCiAgICByZWxlYXNlczoKICAgICAgLSAie3sgYnVuZGxlLnBhcmFtZXRlcnMubXlzcWwtbmFtZSB9fSIKCm91dHB1dHM6CiAgLSBuYW1lOiBteXNxbC1wYXNzd29yZAogICAgZGVzY3JpcHRpb246ICJUaGUgbXlzcWwgZGF0YWJhc2UgcGFzc3dvcmQiCiAgICB0eXBlOiBzdHJpbmcKICAgIGRlZmF1bHQ6ICJkZWZhdWx0LXBhc3N3b3JkIgogICAgYXBwbHlUbzoKICAgICAgLSBpbnN0YWxsCiAgICAgIC0gdXBncmFkZQogICAgc2Vuc2l0aXZlOiB0cnVlCiAgLSBuYW1lOiBteXNxbC1yb290LXBhc3N3b3JkCiAgICBkZXNjcmlwdGlvbjogIlRoZSBteXNxbCByb290IHVzZXIgcGFzc3dvcmQiCiAgICBkZWZhdWx0OiAiZGVmYXVsdC1yb290LXBhc3N3b3JkIgogICAgdHlwZTogc3RyaW5nCiAgICBhcHBseVRvOgogICAgICAtIGluc3RhbGwKICAgICAgLSB1cGdyYWRlCiAgICBzZW5zaXRpdmU6IHRydWUK","manifestDigest":"44f4b4714d3a2ac978803ab19137b859350b30e1f06013a30a5ba65d422e6c19","mixins":{"exec":{},"helm3":{}},"version":"v0.38.6"},"sh.porter.file-parameters":{}},"definitions":{"database-name-parameter":{"default":"mydb","type":"string"},"mysql-name-parameter":{"default":"porter-ci-mysql","type":"string"},"mysql-password-output":{"default":"default-password","description":"The mysql database password","type":"string","writeOnly":true},"mysql-root-password-output":{"default":"default-root-password","description":"The mysql root user password","type":"string","writeOnly":true},"mysql-user-parameter":{"default":"mysql-admin","type":"string"},"namespace-parameter":{"default":"mysql","type":"string"},"porter-debug-parameter":{"$comment":"porter-internal","$id":"https://porter.sh/generated-bundle/#porter-debug","default":false,"description":"Print debug information from Porter when executing the bundle","type":"boolean"}},"description":"","invocationImages":[{"image":"localhost:5000/mysql-installer:v0.1.4","imageType":"docker"}],"name":"mysql","outputs":{"mysql-password":{"applyTo":["install","upgrade"],"definition":"mysql-password-output","description":"The mysql database password","path":"/cnab/app/outputs/mysql-password"},"mysql-root-password":{"applyTo":["install","upgrade"],"definition":"mysql-root-password-output","description":"The mysql root user password","path":"/cnab/app/outputs/mysql-root-password"}},"parameters":{"database-name":{"definition":"database-name-parameter","destination":{"env":"DATABASE_NAME"}},"mysql-name":{"definition":"mysql-name-parameter","destination":{"env":"MYSQL_NAME"}},"mysql-user":{"definition":"mysql-user-parameter","destination":{"env":"MYSQL_USER"}},"namespace":{"definition":"namespace-parameter","destination":{"env":"NAMESPACE"}},"porter-debug":{"definition":"porter-debug-parameter","description":"Print debug information from Porter when executing the bundle","destination":{"env":"PORTER_DEBUG"}}},"requiredExtensions":["sh.porter.file-parameters"],"schemaVersion":"v1.0.0","version":"0.1.4"} \ No newline at end of file +{"actions":{"ping":{"description":"ping","modifies":true}},"credentials":{"kubeconfig":{"path":"/home/nonroot/.kube/config","required":true}},"custom":{"sh.porter":{"commit":"43d077da","manifest":"bWl4aW5zOgotIGV4ZWMKLSBoZWxtMzoKICAgIHJlcG9zaXRvcmllczoKICAgICAgYml0bmFtaToKICAgICAgICB1cmw6ICJodHRwczovL2NoYXJ0cy5iaXRuYW1pLmNvbS9iaXRuYW1pIgoKbmFtZTogbXlzcWwKdmVyc2lvbjogIjAuMS40IgpyZWdpc3RyeTogImxvY2FsaG9zdDo1MDAwIgoKY3JlZGVudGlhbHM6Ci0gbmFtZToga3ViZWNvbmZpZwogIHBhdGg6IC9yb290Ly5rdWJlL2NvbmZpZwoKcGFyYW1ldGVyczoKLSBuYW1lOiBkYXRhYmFzZS1uYW1lCiAgdHlwZTogc3RyaW5nCiAgZGVmYXVsdDogbXlkYgogIGVudjogREFUQUJBU0VfTkFNRQotIG5hbWU6IG15c3FsLXVzZXIKICB0eXBlOiBzdHJpbmcKICBkZWZhdWx0OiBteXNxbC1hZG1pbgogIGVudjogTVlTUUxfVVNFUgotIG5hbWU6IG5hbWVzcGFjZQogIHR5cGU6IHN0cmluZwogIGRlZmF1bHQ6ICdteXNxbCcKLSBuYW1lOiBteXNxbC1uYW1lCiAgdHlwZTogc3RyaW5nCiAgZGVmYXVsdDogcG9ydGVyLWNpLW15c3FsCgppbnN0YWxsOgotIGhlbG0zOgogICAgZGVzY3JpcHRpb246ICJJbnN0YWxsIE15U1FMIgogICAgbmFtZTogInt7IGJ1bmRsZS5wYXJhbWV0ZXJzLm15c3FsLW5hbWUgfX0iCiAgICBjaGFydDogYml0bmFtaS9teXNxbAogICAgdmVyc2lvbjogNi4xNC4xMgogICAgbmFtZXNwYWNlOiAie3sgYnVuZGxlLnBhcmFtZXRlcnMubmFtZXNwYWNlIH19IgogICAgcmVwbGFjZTogdHJ1ZQogICAgc2V0OgogICAgICBkYi5uYW1lOiAie3sgYnVuZGxlLnBhcmFtZXRlcnMuZGF0YWJhc2UtbmFtZX19IgogICAgICBkYi51c2VyOiAie3sgYnVuZGxlLnBhcmFtZXRlcnMubXlzcWwtdXNlciB9fSIKICAgIG91dHB1dHM6CiAgICAtIG5hbWU6IG15c3FsLXJvb3QtcGFzc3dvcmQKICAgICAgc2VjcmV0OiAie3sgYnVuZGxlLnBhcmFtZXRlcnMubXlzcWwtbmFtZSB9fSIKICAgICAga2V5OiBteXNxbC1yb290LXBhc3N3b3JkCiAgICAtIG5hbWU6IG15c3FsLXBhc3N3b3JkCiAgICAgIHNlY3JldDogInt7IGJ1bmRsZS5wYXJhbWV0ZXJzLm15c3FsLW5hbWUgfX0iCiAgICAgIGtleTogbXlzcWwtcGFzc3dvcmQKCnBpbmc6CiAgLSBleGVjOgogICAgICBkZXNjcmlwdGlvbjogIlBpbmciCiAgICAgIGNvbW1hbmQ6IC4vaGVscGVycy5zaAogICAgICBhcmd1bWVudHM6CiAgICAgICAgLSBwaW5nCgp1cGdyYWRlOgogIC0gaGVsbTM6CiAgICAgIGRlc2NyaXB0aW9uOiAiVXBncmFkZSBNeVNRTCIKICAgICAgbmFtZTogInt7IGJ1bmRsZS5wYXJhbWV0ZXJzLm15c3FsLW5hbWUgfX0iCiAgICAgIG5hbWVzcGFjZTogInt7IGJ1bmRsZS5wYXJhbWV0ZXJzLm5hbWVzcGFjZSB9fSIKICAgICAgY2hhcnQ6IGJpdG5hbWkvbXlzcWwKICAgICAgdmVyc2lvbjogNi4xNC4xMgogICAgICBvdXRwdXRzOgogICAgICAtIG5hbWU6IG15c3FsLXJvb3QtcGFzc3dvcmQKICAgICAgICBzZWNyZXQ6ICJ7eyBidW5kbGUucGFyYW1ldGVycy5teXNxbC1uYW1lIH19IgogICAgICAgIGtleTogbXlzcWwtcm9vdC1wYXNzd29yZAogICAgICAtIG5hbWU6IG15c3FsLXBhc3N3b3JkCiAgICAgICAgc2VjcmV0OiAie3sgYnVuZGxlLnBhcmFtZXRlcnMubXlzcWwtbmFtZSB9fSIKICAgICAgICBrZXk6IG15c3FsLXBhc3N3b3JkCgp1bmluc3RhbGw6Ci0gaGVsbTM6CiAgICBkZXNjcmlwdGlvbjogIlVuaW5zdGFsbCBNeVNRTCIKICAgIHB1cmdlOiB0cnVlCiAgICByZWxlYXNlczoKICAgICAgLSAie3sgYnVuZGxlLnBhcmFtZXRlcnMubXlzcWwtbmFtZSB9fSIKCm91dHB1dHM6CiAgLSBuYW1lOiBteXNxbC1wYXNzd29yZAogICAgZGVzY3JpcHRpb246ICJUaGUgbXlzcWwgZGF0YWJhc2UgcGFzc3dvcmQiCiAgICB0eXBlOiBzdHJpbmcKICAgIGRlZmF1bHQ6ICJkZWZhdWx0LXBhc3N3b3JkIgogICAgYXBwbHlUbzoKICAgICAgLSBpbnN0YWxsCiAgICAgIC0gdXBncmFkZQogICAgc2Vuc2l0aXZlOiB0cnVlCiAgLSBuYW1lOiBteXNxbC1yb290LXBhc3N3b3JkCiAgICBkZXNjcmlwdGlvbjogIlRoZSBteXNxbCByb290IHVzZXIgcGFzc3dvcmQiCiAgICBkZWZhdWx0OiAiZGVmYXVsdC1yb290LXBhc3N3b3JkIgogICAgdHlwZTogc3RyaW5nCiAgICBhcHBseVRvOgogICAgICAtIGluc3RhbGwKICAgICAgLSB1cGdyYWRlCiAgICBzZW5zaXRpdmU6IHRydWUK","manifestDigest":"44f4b4714d3a2ac978803ab19137b859350b30e1f06013a30a5ba65d422e6c19","mixins":{"exec":{},"helm3":{}},"version":"v0.38.6"},"sh.porter.file-parameters":{}},"definitions":{"database-name-parameter":{"default":"mydb","type":"string"},"mysql-name-parameter":{"default":"porter-ci-mysql","type":"string"},"mysql-password-output":{"default":"default-password","description":"The mysql database password","type":"string","writeOnly":true},"mysql-root-password-output":{"default":"default-root-password","description":"The mysql root user password","type":"string","writeOnly":true},"mysql-user-parameter":{"default":"mysql-admin","type":"string"},"namespace-parameter":{"default":"mysql","type":"string"},"porter-debug-parameter":{"$comment":"porter-internal","$id":"https://porter.sh/generated-bundle/#porter-debug","default":false,"description":"Print debug information from Porter when executing the bundle","type":"boolean"}},"description":"","invocationImages":[{"image":"localhost:5000/mysql-installer:v0.1.4","imageType":"docker"}],"name":"mysql","outputs":{"mysql-password":{"applyTo":["install","upgrade"],"definition":"mysql-password-output","description":"The mysql database password","path":"/cnab/app/outputs/mysql-password"},"mysql-root-password":{"applyTo":["install","upgrade"],"definition":"mysql-root-password-output","description":"The mysql root user password","path":"/cnab/app/outputs/mysql-root-password"}},"parameters":{"database-name":{"definition":"database-name-parameter","destination":{"env":"DATABASE_NAME"}},"mysql-name":{"definition":"mysql-name-parameter","destination":{"env":"MYSQL_NAME"}},"mysql-user":{"definition":"mysql-user-parameter","destination":{"env":"MYSQL_USER"}},"namespace":{"definition":"namespace-parameter","destination":{"env":"NAMESPACE"}},"porter-debug":{"definition":"porter-debug-parameter","description":"Print debug information from Porter when executing the bundle","destination":{"env":"PORTER_DEBUG"}}},"requiredExtensions":["sh.porter.file-parameters"],"schemaVersion":"v1.0.0","version":"0.1.4"} \ No newline at end of file diff --git a/build/testdata/bundles/mysql/helpers.sh b/build/testdata/bundles/mysql/helpers.sh index 69b849b2c3..d3c95e6529 100755 --- a/build/testdata/bundles/mysql/helpers.sh +++ b/build/testdata/bundles/mysql/helpers.sh @@ -1,6 +1,11 @@ #!/usr/bin/env bash set -euo pipefail +install() { + echo "topsecret" >> /cnab/app/outputs/mysql-root-password + echo "moresekrets" >> /cnab/app/outputs/mysql-password +} + ping() { echo ping } diff --git a/build/testdata/bundles/mysql/porter.yaml b/build/testdata/bundles/mysql/porter.yaml index bf82956f7e..9f35eadfcd 100644 --- a/build/testdata/bundles/mysql/porter.yaml +++ b/build/testdata/bundles/mysql/porter.yaml @@ -1,17 +1,18 @@ -mixins: -- exec -- helm3: - repositories: - bitnami: - url: "https://charts.bitnami.com/bitnami" - +schemaVersion: 1.0.0-alpha.1 name: mysql version: 0.1.4 registry: "localhost:5000" +mixins: + - exec + - helm3: + repositories: + bitnami: + url: "https://charts.bitnami.com/bitnami" + credentials: - name: kubeconfig - path: /root/.kube/config + path: /home/nonroot/.kube/config parameters: - name: database-name @@ -34,25 +35,10 @@ parameters: default: 1 install: -- helm3: - description: "Install MySQL" - name: "{{ bundle.parameters.mysql-name }}" - chart: bitnami/mysql - version: 6.14.12 - namespace: "{{ bundle.parameters.namespace }}" - replace: true - set: - db.name: "{{ bundle.parameters.database-name}}" - db.user: "{{ bundle.parameters.mysql-user }}" - primary.readinessProbe.timeout: "{{ bundle.parameters.probe-timeout}}" - primary.livenessProbe.timeout: "{{ bundle.parameters.probe-timeout}}" - outputs: - - name: mysql-root-password - secret: "{{ bundle.parameters.mysql-name }}" - key: mysql-root-password - - name: mysql-password - secret: "{{ bundle.parameters.mysql-name }}" - key: mysql-password +- exec: + command: ./helpers.sh + arguments: + - install ping: - exec: @@ -62,26 +48,16 @@ ping: - ping upgrade: - - helm3: - description: "Upgrade MySQL" - name: "{{ bundle.parameters.mysql-name }}" - namespace: "{{ bundle.parameters.namespace }}" - chart: bitnami/mysql - version: 6.14.12 - outputs: - - name: mysql-root-password - secret: "{{ bundle.parameters.mysql-name }}" - key: mysql-root-password - - name: mysql-password - secret: "{{ bundle.parameters.mysql-name }}" - key: mysql-password + - exec: + command: ./helpers.sh + arguments: + - install uninstall: -- helm3: - description: "Uninstall MySQL" - purge: true - releases: - - "{{ bundle.parameters.mysql-name }}" + - exec: + command: echo + arguments: + - uninstalled outputs: - name: mysql-password @@ -92,6 +68,7 @@ outputs: - install - upgrade sensitive: true + path: /cnab/app/outputs/mysql-password - name: mysql-root-password description: "The mysql root user password" default: "default-root-password" @@ -100,3 +77,4 @@ outputs: - install - upgrade sensitive: true + path: /cnab/app/outputs/mysql-root-password diff --git a/build/testdata/bundles/wordpress/.cnab/bundle.json b/build/testdata/bundles/wordpress/.cnab/bundle.json index 27f4f88a64..c873091041 100644 --- a/build/testdata/bundles/wordpress/.cnab/bundle.json +++ b/build/testdata/bundles/wordpress/.cnab/bundle.json @@ -1 +1 @@ -{"actions":{"ping":{"description":"ping","modifies":true}},"credentials":{"kubeconfig":{"path":"/root/.kube/config","required":true}},"custom":{"io.cnab.dependencies":{"requires":{"mysql":{"bundle":"localhost:5000/mysql:v0.1.4","name":"mysql"}},"sequence":["mysql"]},"io.cnab.parameter-sources":{"porter-mysql-mysql-password-dep-output":{"priority":["dependencies.output"],"sources":{"dependencies.output":{"dependency":"mysql","name":"mysql-password"}}}},"sh.porter":{"commit":"43d077da","manifest":"bWl4aW5zOgotIGV4ZWMKLSBoZWxtMzoKICAgIHJlcG9zaXRvcmllczoKICAgICAgYml0bmFtaToKICAgICAgICB1cmw6ICJodHRwczovL2NoYXJ0cy5iaXRuYW1pLmNvbS9iaXRuYW1pIgoKbmFtZTogd29yZHByZXNzCnZlcnNpb246IDAuMS40CnJlZ2lzdHJ5OiAibG9jYWxob3N0OjUwMDAiCgpkZXBlbmRlbmNpZXM6CiAgLSBuYW1lOiBteXNxbAogICAgcmVmZXJlbmNlOiBsb2NhbGhvc3Q6NTAwMC9teXNxbDp2MC4xLjQKICAgIHBhcmFtZXRlcnM6CiAgICAgIGRhdGFiYXNlLW5hbWU6IHdvcmRwcmVzcwogICAgICBteXNxbC11c2VyOiB3b3JkcHJlc3MKICAgICAgbmFtZXNwYWNlOiB3b3JkcHJlc3MKCmNyZWRlbnRpYWxzOgotIG5hbWU6IGt1YmVjb25maWcKICBwYXRoOiAvcm9vdC8ua3ViZS9jb25maWcKCnBhcmFtZXRlcnM6Ci0gbmFtZTogd29yZHByZXNzLW5hbWUKICB0eXBlOiBzdHJpbmcKICBkZWZhdWx0OiBwb3J0ZXItY2ktd29yZHByZXNzCiAgZW52OiBXT1JEUFJFU1NfTkFNRQotIG5hbWU6IHdvcmRwcmVzcy1wYXNzd29yZAogIHR5cGU6IHN0cmluZwogIHNlbnNpdGl2ZTogdHJ1ZQogIGFwcGx5VG86CiAgICAtIGluc3RhbGwKICAgIC0gdXBncmFkZQotIG5hbWU6IG5hbWVzcGFjZQogIHR5cGU6IHN0cmluZwogIGRlZmF1bHQ6ICd3b3JkcHJlc3MnCgppbnN0YWxsOgogIC0gaGVsbTM6CiAgICAgIGRlc2NyaXB0aW9uOiAiSW5zdGFsbCBXb3JkcHJlc3MiCiAgICAgIG5hbWU6ICJ7eyBidW5kbGUucGFyYW1ldGVycy53b3JkcHJlc3MtbmFtZSB9fSIKICAgICAgY2hhcnQ6IGJpdG5hbWkvd29yZHByZXNzCiAgICAgIHZlcnNpb246ICI5LjkuMyIKICAgICAgbmFtZXNwYWNlOiAie3sgYnVuZGxlLnBhcmFtZXRlcnMubmFtZXNwYWNlIH19IgogICAgICByZXBsYWNlOiB0cnVlCiAgICAgIHNldDoKICAgICAgICB3b3JkcHJlc3NQYXNzd29yZDogInt7IGJ1bmRsZS5wYXJhbWV0ZXJzLndvcmRwcmVzcy1wYXNzd29yZCB9fSIKICAgICAgICBleHRlcm5hbERhdGFiYXNlLmhvc3Q6ICJwb3J0ZXItY2ktbXlzcWwue3sgYnVuZGxlLnBhcmFtZXRlcnMubmFtZXNwYWNlIH19LnN2Yy5jbHVzdGVyLmxvY2FsIgogICAgICAgIGV4dGVybmFsRGF0YWJhc2UuZGF0YWJhc2U6ICJ3b3JkcHJlc3MiCiAgICAgICAgZXh0ZXJuYWxEYXRhYmFzZS51c2VyOiAid29yZHByZXNzIgogICAgICAgIGV4dGVybmFsRGF0YWJhc2UucGFzc3dvcmQ6ICJ7eyBidW5kbGUuZGVwZW5kZW5jaWVzLm15c3FsLm91dHB1dHMubXlzcWwtcGFzc3dvcmQgfX0iCiAgICAgICAgZXh0ZXJuYWxEYXRhYmFzZS5wb3J0OiAzMzA2CiAgICAgICAgbWFyaWFkYi5lbmFibGVkOiBmYWxzZQogICAgICAgIHNlcnZpY2UudHlwZTogTm9kZVBvcnQKICAgICAgb3V0cHV0czoKICAgICAgICAtIG5hbWU6IHdvcmRwcmVzcy1wYXNzd29yZAogICAgICAgICAgc2VjcmV0OiAie3sgYnVuZGxlLnBhcmFtZXRlcnMud29yZHByZXNzLW5hbWUgfX0iCiAgICAgICAgICBrZXk6IHdvcmRwcmVzcy1wYXNzd29yZAoKdXBncmFkZToKICAtIGhlbG0zOgogICAgICBkZXNjcmlwdGlvbjogIlVwZ3JhZGUgV29yZHByZXNzIgogICAgICBuYW1lOiAie3sgYnVuZGxlLnBhcmFtZXRlcnMud29yZHByZXNzLW5hbWUgfX0iCiAgICAgIG5hbWVzcGFjZTogInt7IGJ1bmRsZS5wYXJhbWV0ZXJzLm5hbWVzcGFjZSB9fSIKICAgICAgY2hhcnQ6IGJpdG5hbWkvd29yZHByZXNzCiAgICAgIHZlcnNpb246ICI5LjkuMyIKICAgICAgb3V0cHV0czoKICAgICAgICAtIG5hbWU6IHdvcmRwcmVzcy1wYXNzd29yZAogICAgICAgICAgc2VjcmV0OiAie3sgYnVuZGxlLnBhcmFtZXRlcnMud29yZHByZXNzLW5hbWUgfX0iCiAgICAgICAgICBrZXk6IHdvcmRwcmVzcy1wYXNzd29yZAoKcGluZzoKICAtIGV4ZWM6CiAgICAgIGRlc2NyaXB0aW9uOiAiUGluZyIKICAgICAgY29tbWFuZDogLi9oZWxwZXJzLnNoCiAgICAgIGFyZ3VtZW50czoKICAgICAgICAtIHBpbmcKCnVuaW5zdGFsbDoKICAtIGhlbG0zOgogICAgICBkZXNjcmlwdGlvbjogIlVuaW5zdGFsbCBXb3JkcHJlc3MiCiAgICAgIHB1cmdlOiB0cnVlCiAgICAgIHJlbGVhc2VzOiAKICAgICAgICAtICJ7eyBidW5kbGUucGFyYW1ldGVycy53b3JkcHJlc3MtbmFtZSB9fSIKCm91dHB1dHM6CiAgLSBuYW1lOiB3b3JkcHJlc3MtcGFzc3dvcmQKICAgIGRlc2NyaXB0aW9uOiAiVGhlIFdvcmRwcmVzcyBpbnN0YWxsYXRpb24gcGFzc3dvcmQiCiAgICB0eXBlOiBzdHJpbmcKICAgIGRlZmF1bHQ6ICJkZWZhdWx0LXBhc3N3b3JkIgogICAgYXBwbHlUbzoKICAgICAgLSAiaW5zdGFsbCIKICAgICAgLSAidXBncmFkZSIKICAgIHNlbnNpdGl2ZTogdHJ1ZQ==","manifestDigest":"530a3ed951de0c810cce7a0771e1aef4462e416a39c0c11ebac9a8d4ee7d6387","mixins":{"exec":{},"helm3":{}},"version":"v0.38.6"},"sh.porter.file-parameters":{}},"definitions":{"namespace-parameter":{"default":"wordpress","type":"string"},"porter-debug-parameter":{"$comment":"porter-internal","$id":"https://porter.sh/generated-bundle/#porter-debug","default":false,"description":"Print debug information from Porter when executing the bundle","type":"boolean"},"porter-mysql-mysql-password-dep-output":{"$comment":"porter-internal","$id":"https://porter.sh/generated-bundle/#porter-parameter-source-definition"},"wordpress-name-parameter":{"default":"porter-ci-wordpress","type":"string"},"wordpress-password-output":{"default":"default-password","description":"The Wordpress installation password","type":"string","writeOnly":true},"wordpress-password-parameter":{"type":"string","writeOnly":true}},"description":"","invocationImages":[{"image":"localhost:5000/wordpress-installer:v0.1.4","imageType":"docker"}],"name":"wordpress","outputs":{"wordpress-password":{"applyTo":["install","upgrade"],"definition":"wordpress-password-output","description":"The Wordpress installation password","path":"/cnab/app/outputs/wordpress-password"}},"parameters":{"namespace":{"definition":"namespace-parameter","destination":{"env":"NAMESPACE"}},"porter-debug":{"definition":"porter-debug-parameter","description":"Print debug information from Porter when executing the bundle","destination":{"env":"PORTER_DEBUG"}},"porter-mysql-mysql-password-dep-output":{"definition":"porter-mysql-mysql-password-dep-output","description":"Wires up the mysql dependency mysql-password output for use as a parameter. Porter internal parameter that should not be set manually.","destination":{"env":"PORTER_MYSQL_MYSQL_PASSWORD_DEP_OUTPUT"}},"wordpress-name":{"definition":"wordpress-name-parameter","destination":{"env":"WORDPRESS_NAME"}},"wordpress-password":{"applyTo":["install","upgrade"],"definition":"wordpress-password-parameter","destination":{"env":"WORDPRESS_PASSWORD"},"required":true}},"requiredExtensions":["sh.porter.file-parameters","io.cnab.dependencies","io.cnab.parameter-sources"],"schemaVersion":"v1.0.0","version":"0.1.4"} \ No newline at end of file +{"actions":{"ping":{"description":"ping","modifies":true}},"credentials":{"kubeconfig":{"path":"/home/nonroot/.kube/config","required":true}},"custom":{"io.cnab.dependencies":{"requires":{"mysql":{"bundle":"localhost:5000/mysql:v0.1.4","name":"mysql"}},"sequence":["mysql"]},"io.cnab.parameter-sources":{"porter-mysql-mysql-password-dep-output":{"priority":["dependencies.output"],"sources":{"dependencies.output":{"dependency":"mysql","name":"mysql-password"}}}},"sh.porter":{"commit":"43d077da","manifest":"bWl4aW5zOgotIGV4ZWMKLSBoZWxtMzoKICAgIHJlcG9zaXRvcmllczoKICAgICAgYml0bmFtaToKICAgICAgICB1cmw6ICJodHRwczovL2NoYXJ0cy5iaXRuYW1pLmNvbS9iaXRuYW1pIgoKbmFtZTogd29yZHByZXNzCnZlcnNpb246IDAuMS40CnJlZ2lzdHJ5OiAibG9jYWxob3N0OjUwMDAiCgpkZXBlbmRlbmNpZXM6CiAgLSBuYW1lOiBteXNxbAogICAgcmVmZXJlbmNlOiBsb2NhbGhvc3Q6NTAwMC9teXNxbDp2MC4xLjQKICAgIHBhcmFtZXRlcnM6CiAgICAgIGRhdGFiYXNlLW5hbWU6IHdvcmRwcmVzcwogICAgICBteXNxbC11c2VyOiB3b3JkcHJlc3MKICAgICAgbmFtZXNwYWNlOiB3b3JkcHJlc3MKCmNyZWRlbnRpYWxzOgotIG5hbWU6IGt1YmVjb25maWcKICBwYXRoOiAvcm9vdC8ua3ViZS9jb25maWcKCnBhcmFtZXRlcnM6Ci0gbmFtZTogd29yZHByZXNzLW5hbWUKICB0eXBlOiBzdHJpbmcKICBkZWZhdWx0OiBwb3J0ZXItY2ktd29yZHByZXNzCiAgZW52OiBXT1JEUFJFU1NfTkFNRQotIG5hbWU6IHdvcmRwcmVzcy1wYXNzd29yZAogIHR5cGU6IHN0cmluZwogIHNlbnNpdGl2ZTogdHJ1ZQogIGFwcGx5VG86CiAgICAtIGluc3RhbGwKICAgIC0gdXBncmFkZQotIG5hbWU6IG5hbWVzcGFjZQogIHR5cGU6IHN0cmluZwogIGRlZmF1bHQ6ICd3b3JkcHJlc3MnCgppbnN0YWxsOgogIC0gaGVsbTM6CiAgICAgIGRlc2NyaXB0aW9uOiAiSW5zdGFsbCBXb3JkcHJlc3MiCiAgICAgIG5hbWU6ICJ7eyBidW5kbGUucGFyYW1ldGVycy53b3JkcHJlc3MtbmFtZSB9fSIKICAgICAgY2hhcnQ6IGJpdG5hbWkvd29yZHByZXNzCiAgICAgIHZlcnNpb246ICI5LjkuMyIKICAgICAgbmFtZXNwYWNlOiAie3sgYnVuZGxlLnBhcmFtZXRlcnMubmFtZXNwYWNlIH19IgogICAgICByZXBsYWNlOiB0cnVlCiAgICAgIHNldDoKICAgICAgICB3b3JkcHJlc3NQYXNzd29yZDogInt7IGJ1bmRsZS5wYXJhbWV0ZXJzLndvcmRwcmVzcy1wYXNzd29yZCB9fSIKICAgICAgICBleHRlcm5hbERhdGFiYXNlLmhvc3Q6ICJwb3J0ZXItY2ktbXlzcWwue3sgYnVuZGxlLnBhcmFtZXRlcnMubmFtZXNwYWNlIH19LnN2Yy5jbHVzdGVyLmxvY2FsIgogICAgICAgIGV4dGVybmFsRGF0YWJhc2UuZGF0YWJhc2U6ICJ3b3JkcHJlc3MiCiAgICAgICAgZXh0ZXJuYWxEYXRhYmFzZS51c2VyOiAid29yZHByZXNzIgogICAgICAgIGV4dGVybmFsRGF0YWJhc2UucGFzc3dvcmQ6ICJ7eyBidW5kbGUuZGVwZW5kZW5jaWVzLm15c3FsLm91dHB1dHMubXlzcWwtcGFzc3dvcmQgfX0iCiAgICAgICAgZXh0ZXJuYWxEYXRhYmFzZS5wb3J0OiAzMzA2CiAgICAgICAgbWFyaWFkYi5lbmFibGVkOiBmYWxzZQogICAgICAgIHNlcnZpY2UudHlwZTogTm9kZVBvcnQKICAgICAgb3V0cHV0czoKICAgICAgICAtIG5hbWU6IHdvcmRwcmVzcy1wYXNzd29yZAogICAgICAgICAgc2VjcmV0OiAie3sgYnVuZGxlLnBhcmFtZXRlcnMud29yZHByZXNzLW5hbWUgfX0iCiAgICAgICAgICBrZXk6IHdvcmRwcmVzcy1wYXNzd29yZAoKdXBncmFkZToKICAtIGhlbG0zOgogICAgICBkZXNjcmlwdGlvbjogIlVwZ3JhZGUgV29yZHByZXNzIgogICAgICBuYW1lOiAie3sgYnVuZGxlLnBhcmFtZXRlcnMud29yZHByZXNzLW5hbWUgfX0iCiAgICAgIG5hbWVzcGFjZTogInt7IGJ1bmRsZS5wYXJhbWV0ZXJzLm5hbWVzcGFjZSB9fSIKICAgICAgY2hhcnQ6IGJpdG5hbWkvd29yZHByZXNzCiAgICAgIHZlcnNpb246ICI5LjkuMyIKICAgICAgb3V0cHV0czoKICAgICAgICAtIG5hbWU6IHdvcmRwcmVzcy1wYXNzd29yZAogICAgICAgICAgc2VjcmV0OiAie3sgYnVuZGxlLnBhcmFtZXRlcnMud29yZHByZXNzLW5hbWUgfX0iCiAgICAgICAgICBrZXk6IHdvcmRwcmVzcy1wYXNzd29yZAoKcGluZzoKICAtIGV4ZWM6CiAgICAgIGRlc2NyaXB0aW9uOiAiUGluZyIKICAgICAgY29tbWFuZDogLi9oZWxwZXJzLnNoCiAgICAgIGFyZ3VtZW50czoKICAgICAgICAtIHBpbmcKCnVuaW5zdGFsbDoKICAtIGhlbG0zOgogICAgICBkZXNjcmlwdGlvbjogIlVuaW5zdGFsbCBXb3JkcHJlc3MiCiAgICAgIHB1cmdlOiB0cnVlCiAgICAgIHJlbGVhc2VzOiAKICAgICAgICAtICJ7eyBidW5kbGUucGFyYW1ldGVycy53b3JkcHJlc3MtbmFtZSB9fSIKCm91dHB1dHM6CiAgLSBuYW1lOiB3b3JkcHJlc3MtcGFzc3dvcmQKICAgIGRlc2NyaXB0aW9uOiAiVGhlIFdvcmRwcmVzcyBpbnN0YWxsYXRpb24gcGFzc3dvcmQiCiAgICB0eXBlOiBzdHJpbmcKICAgIGRlZmF1bHQ6ICJkZWZhdWx0LXBhc3N3b3JkIgogICAgYXBwbHlUbzoKICAgICAgLSAiaW5zdGFsbCIKICAgICAgLSAidXBncmFkZSIKICAgIHNlbnNpdGl2ZTogdHJ1ZQ==","manifestDigest":"530a3ed951de0c810cce7a0771e1aef4462e416a39c0c11ebac9a8d4ee7d6387","mixins":{"exec":{},"helm3":{}},"version":"v0.38.6"},"sh.porter.file-parameters":{}},"definitions":{"namespace-parameter":{"default":"wordpress","type":"string"},"porter-debug-parameter":{"$comment":"porter-internal","$id":"https://porter.sh/generated-bundle/#porter-debug","default":false,"description":"Print debug information from Porter when executing the bundle","type":"boolean"},"porter-mysql-mysql-password-dep-output":{"$comment":"porter-internal","$id":"https://porter.sh/generated-bundle/#porter-parameter-source-definition"},"wordpress-name-parameter":{"default":"porter-ci-wordpress","type":"string"},"wordpress-password-output":{"default":"default-password","description":"The Wordpress installation password","type":"string","writeOnly":true},"wordpress-password-parameter":{"type":"string","writeOnly":true}},"description":"","invocationImages":[{"image":"localhost:5000/wordpress-installer:v0.1.4","imageType":"docker"}],"name":"wordpress","outputs":{"wordpress-password":{"applyTo":["install","upgrade"],"definition":"wordpress-password-output","description":"The Wordpress installation password","path":"/cnab/app/outputs/wordpress-password"}},"parameters":{"namespace":{"definition":"namespace-parameter","destination":{"env":"NAMESPACE"}},"porter-debug":{"definition":"porter-debug-parameter","description":"Print debug information from Porter when executing the bundle","destination":{"env":"PORTER_DEBUG"}},"porter-mysql-mysql-password-dep-output":{"definition":"porter-mysql-mysql-password-dep-output","description":"Wires up the mysql dependency mysql-password output for use as a parameter. Porter internal parameter that should not be set manually.","destination":{"env":"PORTER_MYSQL_MYSQL_PASSWORD_DEP_OUTPUT"}},"wordpress-name":{"definition":"wordpress-name-parameter","destination":{"env":"WORDPRESS_NAME"}},"wordpress-password":{"applyTo":["install","upgrade"],"definition":"wordpress-password-parameter","destination":{"env":"WORDPRESS_PASSWORD"},"required":true}},"requiredExtensions":["sh.porter.file-parameters","io.cnab.dependencies","io.cnab.parameter-sources"],"schemaVersion":"v1.0.0","version":"0.1.4"} \ No newline at end of file diff --git a/build/testdata/bundles/wordpress/helpers.sh b/build/testdata/bundles/wordpress/helpers.sh index 69b849b2c3..54f1a8dd99 100755 --- a/build/testdata/bundles/wordpress/helpers.sh +++ b/build/testdata/bundles/wordpress/helpers.sh @@ -1,6 +1,10 @@ #!/usr/bin/env bash set -euo pipefail +install() { + echo "topsecret-blog" >> /cnab/app/outputs/wordpress-password +} + ping() { echo ping } diff --git a/build/testdata/bundles/wordpress/porter.yaml b/build/testdata/bundles/wordpress/porter.yaml index cb5da534c0..94170fe863 100644 --- a/build/testdata/bundles/wordpress/porter.yaml +++ b/build/testdata/bundles/wordpress/porter.yaml @@ -1,14 +1,15 @@ -mixins: -- exec -- helm3: - repositories: - bitnami: - url: "https://charts.bitnami.com/bitnami" - +schemaVersion: 1.0.0-alpha.1 name: wordpress version: 0.1.4 registry: "localhost:5000" +mixins: + - exec + - helm3: + repositories: + bitnami: + url: "https://charts.bitnami.com/bitnami" + dependencies: requires: - name: mysql @@ -20,7 +21,7 @@ dependencies: credentials: - name: kubeconfig - path: /root/.kube/config + path: /home/nonroot/.kube/config parameters: - name: wordpress-name @@ -38,38 +39,16 @@ parameters: default: 'wordpress' install: - - helm3: - description: "Install Wordpress" - name: "{{ bundle.parameters.wordpress-name }}" - chart: bitnami/wordpress - version: "9.9.3" - namespace: "{{ bundle.parameters.namespace }}" - replace: true - set: - wordpressPassword: "{{ bundle.parameters.wordpress-password }}" - externalDatabase.host: "porter-ci-mysql.{{ bundle.parameters.namespace }}.svc.cluster.local" - externalDatabase.database: "wordpress" - externalDatabase.user: "wordpress" - externalDatabase.password: "{{ bundle.dependencies.mysql.outputs.mysql-password }}" - externalDatabase.port: 3306 - mariadb.enabled: false - service.type: NodePort - outputs: - - name: wordpress-password - secret: "{{ bundle.parameters.wordpress-name }}" - key: wordpress-password + - exec: + command: ./helpers.sh + arguments: + - install upgrade: - - helm3: - description: "Upgrade Wordpress" - name: "{{ bundle.parameters.wordpress-name }}" - namespace: "{{ bundle.parameters.namespace }}" - chart: bitnami/wordpress - version: "9.9.3" - outputs: - - name: wordpress-password - secret: "{{ bundle.parameters.wordpress-name }}" - key: wordpress-password + - exec: + command: ./helpers.sh + arguments: + - install ping: - exec: @@ -79,11 +58,10 @@ ping: - ping uninstall: - - helm3: - description: "Uninstall Wordpress" - purge: true - releases: - - "{{ bundle.parameters.wordpress-name }}" + - exec: + command: echo + arguments: + - uninstalled outputs: - name: wordpress-password @@ -94,3 +72,4 @@ outputs: - "install" - "upgrade" sensitive: true + path: /cnab/app/outputs/wordpress-password diff --git a/cmd/porter/completion_test.go b/cmd/porter/completion_test.go index d016028119..a214f867e0 100644 --- a/cmd/porter/completion_test.go +++ b/cmd/porter/completion_test.go @@ -10,20 +10,17 @@ import ( ) func TestCompletion(t *testing.T) { + p := buildRootCommand() - t.Run("completion", func(t *testing.T) { - p := buildRootCommand() + // Capture the output of the command. + var out bytes.Buffer + p.SetOut(&out) - // Capture the output of the command. - var out bytes.Buffer - p.SetOut(&out) + // Run the initial completion command with a bash example. + os.Args = []string{"porter", "completion", "bash"} - // Run the initial completion command with a bash example. - os.Args = []string{"porter", "completion", "bash"} - - err := p.Execute() - require.NoError(t, err) - // Test the output of the command contains a specific string for bash. - assert.Contains(t, out.String(), "bash completion for porter") - }) + err := p.Execute() + require.NoError(t, err) + // Test the output of the command contains a specific string for bash. + assert.Contains(t, out.String(), "bash completion for porter") } diff --git a/cmd/porter/credentials.go b/cmd/porter/credentials.go index cebe61938a..8356ec803d 100644 --- a/cmd/porter/credentials.go +++ b/cmd/porter/credentials.go @@ -19,6 +19,7 @@ func buildCredentialsCommands(p *porter.Porter) *cobra.Command { cmd.AddCommand(buildCredentialsListCommand(p)) cmd.AddCommand(buildCredentialsDeleteCommand(p)) cmd.AddCommand(buildCredentialsShowCommand(p)) + cmd.AddCommand(buildCredentialsCreateCommand(p)) return cmd } @@ -90,7 +91,7 @@ specify a bundle with --file. Bundles define 1 or more credential(s) that are required to interact with a bundle. The bundle definition defines where the credential should be delivered -to the bundle, i.e. at /root/.kube. A credential set, on the other hand, +to the bundle, i.e. at /home/nonroot/.kube. A credential set, on the other hand, represents the source data that you wish to use when interacting with the bundle. These will typically be environment variables or files on your local file system. @@ -214,3 +215,28 @@ func buildCredentialsShowCommand(p *porter.Porter) *cobra.Command { return cmd } + +func buildCredentialsCreateCommand(p *porter.Porter) *cobra.Command { + opts := porter.CredentialCreateOptions{} + + cmd := &cobra.Command{ + Use: "create", + Short: "Create a Credential", + Long: "Create a new blank resource for the definition of a Credential Set.", + Example: ` + porter credentials create FILE [--output yaml|json] + porter credentials create credential-set.json + porter credentials create credential-set --output yaml`, + PreRunE: func(cmd *cobra.Command, args []string) error { + return opts.Validate(args) + }, + RunE: func(cmd *cobra.Command, argrs []string) error { + return p.CreateCredential(opts) + }, + } + + f := cmd.Flags() + f.StringVar(&opts.OutputType, "output", "", "Credential set resource file format") + + return cmd +} diff --git a/cmd/porter/docs.go b/cmd/porter/docs.go index db5310f0e2..8573e13977 100644 --- a/cmd/porter/docs.go +++ b/cmd/porter/docs.go @@ -24,7 +24,8 @@ func buildDocsCommand(p *porter.Porter) *cobra.Command { } cmd.Annotations = map[string]string{ - "group": "meta", + "group": "meta", + skipConfig: "", } flags := cmd.Flags() diff --git a/cmd/porter/main.go b/cmd/porter/main.go index 70f2810c31..05f986fc18 100644 --- a/cmd/porter/main.go +++ b/cmd/porter/main.go @@ -5,6 +5,7 @@ import ( _ "embed" "fmt" "os" + "runtime/debug" "strings" "get.porter.sh/porter/pkg/cli" @@ -21,24 +22,38 @@ var includeDocsCommand = false //go:embed helptext/usage.txt var usageText string +// Indicates that config should not be loaded for this command. +// This is used for commands like help and version which should never +// fail, even with porter is misconfigured. +const skipConfig string = "skipConfig" + func main() { run := func() int { ctx := context.Background() p := porter.New() - if err := p.Connect(ctx); err != nil { - fmt.Fprintln(os.Stderr, err.Error()) - os.Exit(1) - } rootCmd := buildRootCommandFrom(p) // Trace the command that called porter, e.g. porter installation show - calledCommand, formattedCommand := getCalledCommand(rootCmd) - ctx, log := p.StartRootSpan(context.Background(), calledCommand, attribute.String("command", formattedCommand)) + cmd, commandName, formattedCommand := getCalledCommand(rootCmd) + + // Only run init logic that could fail for commands that + // really need it, skip it for commands that should NEVER + // fail. + if !shouldSkipConfig(cmd) { + if err := p.Connect(ctx); err != nil { + fmt.Fprintln(os.Stderr, err.Error()) + os.Exit(1) + } + } + + ctx, log := p.StartRootSpan(context.Background(), commandName, attribute.String("command", formattedCommand)) defer func() { // Capture panics and trace them if panicErr := recover(); panicErr != nil { - log.Error(errors.New(fmt.Sprintf("%s", panicErr)), attribute.Bool("panic", true)) + log.Error(errors.New(fmt.Sprintf("%s", panicErr)), + attribute.Bool("panic", true), + attribute.String("stackTrace", string(debug.Stack()))) log.EndSpan() p.Close() os.Exit(1) @@ -62,32 +77,42 @@ func main() { os.Exit(run()) } +func shouldSkipConfig(cmd *cobra.Command) bool { + if cmd.Name() == "help" { + return true + } + + _, skip := cmd.Annotations[skipConfig] + return skip +} + // Returns the porter command called, e.g. porter installation list // and also the fully formatted command as passed with arguments/flags. -func getCalledCommand(cmd *cobra.Command) (string, string) { +func getCalledCommand(cmd *cobra.Command) (*cobra.Command, string, string) { // Ask cobra what sub-command was called, and walk up the tree to get the full command called. var cmdChain []string - cmd, _, err := cmd.Find(os.Args[1:]) + calledCommand, _, err := cmd.Find(os.Args[1:]) if err != nil { cmdChain = append(cmdChain, "porter") } else { + cmd := calledCommand for cmd != nil { cmdChain = append(cmdChain, cmd.Name()) cmd = cmd.Parent() } } // reverse the command from [list installations porter] to porter installation list - var calledCommand strings.Builder + var calledCommandBuilder strings.Builder for i := len(cmdChain); i > 0; i-- { - calledCommand.WriteString(cmdChain[i-1]) - calledCommand.WriteString(" ") + calledCommandBuilder.WriteString(cmdChain[i-1]) + calledCommandBuilder.WriteString(" ") } - calledCommandStr := calledCommand.String()[0 : calledCommand.Len()-1] + calledCommandStr := calledCommandBuilder.String()[0 : calledCommandBuilder.Len()-1] // Also figure out the full command called, with args/flags. formattedCommand := fmt.Sprintf("porter %s", strings.Join(os.Args[1:], " ")) - return calledCommandStr, formattedCommand + return calledCommand, calledCommandStr, formattedCommand } func buildRootCommand() *cobra.Command { @@ -114,27 +139,23 @@ Try our QuickStart https://porter.sh/quickstart to learn how to use Porter. p.Out = cmd.OutOrStdout() p.Err = cmd.OutOrStderr() - // Only run init logic that could fail for commands that - // really need it, skip it for commands that should NEVER - // fail. - switch cmd.Name() { - case "porter", "help", "version", "docs": + if shouldSkipConfig(cmd) { return nil - default: - // Reload configuration with the now parsed cli flags - p.DataLoader = cli.LoadHierarchicalConfig(cmd) - err := p.Connect(cmd.Context()) - if err != nil { - return err - } + } - if p.Config.IsFeatureEnabled(experimental.FlagStructuredLogs) { - // When structured logging is enabled, the error is printed - // to the console by the logger, we don't need to re-print it again. - cmd.Root().SilenceErrors = true - } - return nil + // Reload configuration with the now parsed cli flags + p.DataLoader = cli.LoadHierarchicalConfig(cmd) + err := p.Connect(cmd.Context()) + if err != nil { + return err + } + + if p.Config.IsFeatureEnabled(experimental.FlagStructuredLogs) { + // When structured logging is enabled, the error is printed + // to the console by the logger, we don't need to re-print it again. + cmd.Root().SilenceErrors = true } + return nil }, RunE: func(cmd *cobra.Command, args []string) error { if printVersion { @@ -150,6 +171,10 @@ Try our QuickStart https://porter.sh/quickstart to learn how to use Porter. SilenceUsage: true, } + cmd.Annotations = map[string]string{ + skipConfig: "", + } + // These flags are available for every command globalFlags := cmd.PersistentFlags() globalFlags.BoolVar(&p.Debug, "debug", false, "Enable debug logging") diff --git a/cmd/porter/version.go b/cmd/porter/version.go index 6643536fc1..93e2c8aeb0 100644 --- a/cmd/porter/version.go +++ b/cmd/porter/version.go @@ -19,7 +19,8 @@ func buildVersionCommand(p *porter.Porter) *cobra.Command { }, } cmd.Annotations = map[string]string{ - "group": "meta", + "group": "meta", + skipConfig: "", } f := cmd.Flags() diff --git a/docs/content/author-bundles.md b/docs/content/author-bundles.md index 07cf8289c5..db228f52dc 100644 --- a/docs/content/author-bundles.md +++ b/docs/content/author-bundles.md @@ -10,7 +10,7 @@ The bundle is defined by its manifest, a porter.yaml file. The manifest supports variable substitution through [templates]. You can [customize the Dockerfile](/custom-dockerfile/) used to build the bundle installer. -The manifest is made up of multiple components: +The manifest is made up of multiple components. See the [Manifest File Format] for a full list of available fields. * [Bundle Metadata](#bundle-metadata) * [Mixins](#mixins) @@ -29,6 +29,7 @@ The manifest is made up of multiple components: We have full [examples](https://porter.sh/src/examples) of Porter manifests in the Porter repository. [templates]: /authors/templates/ +[Manifest File Format]: /reference/file-formats/#manifest ## Bundle Metadata @@ -36,6 +37,7 @@ A lot of the metadata is defined by the [CNAB Spec](https://github.com/cnabio/cn although Porter does have extra fields that are specific to making Porter bundles. ```yaml +schemaVersion: 1.0.0-alpha.1 name: azure-wordpress description: Install Wordpress on Azure version: 0.1.0 @@ -48,6 +50,7 @@ maintainers: url: "https://example.com" ``` +* `schemaVersion`: The version of the schema used by this document. * `name`: The name of the bundle * `description`: A description of the bundle * `version`: The version of the bundle, uses [semver](https://semver.org). A leading v prefix may optionally be used. @@ -180,19 +183,19 @@ porter install --param ./config.json Porter supports passing a file as a parameter to a bundle. -For instance, a bundle might declare a parameter mytar of type file, located at /root/mytar when the bundle is run: +For instance, a bundle might declare a parameter mytar of type file, located at /cnab/app/mytar when the bundle is run: ```yaml - name: mytar type: file - path: /root/mytar + path: /cnab/app/mytar install: - exec: description: "Install" command: bash flags: - c: tar zxvf /root/mytar + c: tar zxvf /cnab/app/mytar ``` The syntax to pass a parameter to porter is the same for both regular and file parameters: @@ -243,7 +246,7 @@ outputs: - upgrade - name: kubeconfig type: file - path: /root/.kube/config + path: /home/nonroot/.kube/config ``` * `name`: The name of the output. @@ -310,7 +313,7 @@ credentials: env: USERNAME required: false - name: kubeconfig - path: /root/.kube/config + path: /home/nonroot/.kube/config applyTo: - upgrade - uninstall @@ -475,6 +478,8 @@ Here is a breakdown of all the supported fields on an image in this section of t * `labels`: Key/value pairs used to specify identifying attributes of the image. * `tag`: The tag of the image (only recommended when/if digest isn't known/available). +When referencing an image, only fully qualified image reference is supported, e.g. library/hello-world instead of just hello-world. + A last note on `digest`. Taking the example of the library `nginx` Docker image, we can get the repository digest like so: ```console @@ -551,6 +556,7 @@ be copied into the final bundle so that you can access them at runtime. The path ## See Also +* [Manifest File Format](/reference/file-formats/#manifest) * [Using Mixins](/use-mixins/) * [Bundle Dependencies](/dependencies/) * [Parameters, Credentials, Outputs, and Images in Porter](/wiring/) diff --git a/docs/content/best-practices/gke.md b/docs/content/best-practices/gke.md index d5d0e8da2a..0040f20da5 100644 --- a/docs/content/best-practices/gke.md +++ b/docs/content/best-practices/gke.md @@ -18,14 +18,14 @@ See the [GKE example][example] for a full working example bundle. ```yaml credentials: - name: kubeconfig - path: /root/.kube/config + path: /home/nonroot/.kube/config - name: google-service-account - path: /root/google-service-account.json + path: /home/nonroot/google-service-account.json ``` 1. Define an environment variable, `GOOGLE_APPLICATION_CREDENTIALS` that contains the path to the service account file, - `/root/google-service-account.json`. + `/home/nonroot/google-service-account.json`. This can be accomplished via one of the methods below. The first method is recommended over using a parameter. Using parameters to define environment @@ -34,7 +34,7 @@ See the [GKE example][example] for a full working example bundle. * Add the following line to your [Custom Dockerfile](/custom-dockerfile): ``` - ENV GOOGLE_APPLICATION_CREDENTIALS=/root/google-service-account.json + ENV GOOGLE_APPLICATION_CREDENTIALS=/home/nonroot/google-service-account.json ``` * Add a parameter to **porter.yaml**: @@ -42,7 +42,7 @@ See the [GKE example][example] for a full working example bundle. parameters: - name: google-app-creds env: GOOGLE_APPLICATION_CREDENTIALS - default: /root/google-service-account.json + default: /home/nonroot/google-service-account.json ``` --- diff --git a/docs/content/build-image.md b/docs/content/build-image.md index 9ec7d4886e..b0040f9b83 100644 --- a/docs/content/build-image.md +++ b/docs/content/build-image.md @@ -7,12 +7,11 @@ When you build a Cloud Native Application Bundle (CNAB) with Porter, a bundle.js ## Starting From Scratch -When you create a new bundle with Porter, your project is bootstrapped with a sample _porter.yaml_ and a new _cnab_ directory. This scaffolding provides almost everything you need to generate your CNAB, including the invocation image. Let's use this to explain how the invocation image is built. +When you create a new bundle with Porter, your project is bootstrapped with a sample porter.yaml. This scaffolding provides almost everything you need to generate your CNAB, including the invocation image. Let's use this to explain how the invocation image is built. -To create a new CNAB with Porter, you first run `porter create`. The generated `porter.yaml` will look like this: +To create a new CNAB with Porter, you first run `porter create`. The generated porter.yaml will look like this: ```yaml - name: porter-hello version: 0.1.0 description: "An example Porter configuration" @@ -43,9 +42,9 @@ uninstall: - uninstall ``` -After the scaffolding is created, you may edit the _porter.yaml_ and modify the `registry: getporter` element representing the Docker registry that you can push to. Note that the bundle is not pushed during the `porter build` workflow. +After the scaffolding is created, you may edit the porter.yaml and modify the `registry: localhost:5000` element representing the Docker registry that you can push to. Note that the bundle is not pushed during porter build. -Once you have modified the `porter.yaml`, you can run `porter build` to generate your first invocation image. Here we add the `--debug` flag to see all of the output: +Once you have modified the porter.yaml, you can run `porter build --debug` to generate your first invocation image. ```console $ porter build --debug @@ -90,11 +89,11 @@ RUN apt-get update && apt-get install -y ca-certificates # exec mixin has no buildtime dependencies -COPY . $BUNDLE_DIR -RUN rm -fr $BUNDLE_DIR/.cnab +COPY . ${BUNDLE_DIR} +RUN rm -fr ${BUNDLE_DIR}/.cnab COPY .cnab /cnab -COPY porter.yaml $BUNDLE_DIR/porter.yaml -WORKDIR $BUNDLE_DIR +COPY porter.yaml ${BUNDLE_DIR}/porter.yaml +WORKDIR ${BUNDLE_DIR} CMD ["/cnab/app/run"] Writing Dockerfile =======> @@ -107,11 +106,11 @@ RUN apt-get update && apt-get install -y ca-certificates # exec mixin has no buildtime dependencies -COPY . $BUNDLE_DIR -RUN rm -fr $BUNDLE_DIR/.cnab +COPY . ${BUNDLE_DIR} +RUN rm -fr ${BUNDLE_DIR}/.cnab COPY .cnab /cnab -COPY porter.yaml $BUNDLE_DIR/porter.yaml -WORKDIR $BUNDLE_DIR +COPY porter.yaml ${BUNDLE_DIR}/porter.yaml +WORKDIR ${BUNDLE_DIR} CMD ["/cnab/app/run"] Starting Invocation Image Build =======> @@ -123,19 +122,19 @@ Step 2/9 : ARG BUNDLE_DIR Step 3/9 : RUN apt-get update && apt-get install -y ca-certificates ---> Using cache ---> afa85b98ed97 -Step 4/9 : COPY . $BUNDLE_DIR +Step 4/9 : COPY . ${BUNDLE_DIR} ---> Using cache ---> e4057b41978c -Step 5/9 : RUN rm -fr $BUNDLE_DIR/.cnab +Step 5/9 : RUN rm -fr ${BUNDLE_DIR}/.cnab ---> Using cache ---> ee114d95bc2d Step 6/9 : COPY .cnab /cnab ---> Using cache ---> 1bb73c63ef65 -Step 7/9 : COPY porter.yaml $BUNDLE_DIR/porter.yaml +Step 7/9 : COPY porter.yaml ${BUNDLE_DIR}/porter.yaml ---> Using cache ---> 483c6b05a0b7 -Step 8/9 : WORKDIR $BUNDLE_DIR +Step 8/9 : WORKDIR ${BUNDLE_DIR} ---> Using cache ---> 9d2497296f3b Step 9/9 : CMD ["/cnab/app/run"] @@ -201,11 +200,11 @@ Copying mixins ===> Copying mixin exec ===> ``` -The first thing that happens after running `porter build`, Porter will copy its runtime plus any mixins into the `.cnab/app` directory of your bundle. +First, Porter copies its runtime plus any mixins into the `.cnab/app` directory of your bundle. -Porter locates available mixins in the `$PORTER_HOME/mixins` directory. By default, the Porter home directory is located in `~/.porter`. In this example, we are using the `exec` mixin, so the `$PORTER_HOME/mixins/exec` directory will be copied into the invocation image. When a mixin is [installed](#tbd) for use with Porter, it contains binaries for multiple operating systems. The correct binary will be copied into the current `.cnab` directory for use in the invocation image. +Porter locates available mixins in the $PORTER_HOME/mixins directory. By default, the Porter home directory is located in ~/.porter. In this example, we are using the exec mixin, so the $PORTER_HOME/mixins/exec directory will be copied into the invocation image. When a mixin is installed, it contains binaries for multiple operating systems. The correct binary will be copied into the bundle's .cnab directory for use in the invocation image. -After copying any mixins to the `.cnab` directory of the bundle, a Dockerfile is generated: +After copying any mixins to the .cnab directory, a Dockerfile is generated: ```console Generating Dockerfile =======> @@ -218,15 +217,15 @@ RUN apt-get update && apt-get install -y ca-certificates # exec mixin has no buildtime dependencies -COPY . $BUNDLE_DIR -RUN rm -fr $BUNDLE_DIR/.cnab +COPY . ${BUNDLE_DIR} +RUN rm -fr ${BUNDLE_DIR}/.cnab COPY .cnab /cnab -COPY porter.yaml $BUNDLE_DIR/porter.yaml -WORKDIR $BUNDLE_DIR +COPY porter.yaml ${BUNDLE_DIR}/porter.yaml +WORKDIR ${BUNDLE_DIR} CMD ["/cnab/app/run"] ``` -Porter starts the Dockerfile by using a base image. You can customize the base image by specifying a Dockerfile template in the **porter.yaml**. Next, a set of CA certificates is added. Next, contents of the current directory are copied into `/cnab/app/` in the invocation image. This will include any contributions from the mixin executables. Finally, an entry point that conforms to the CNAB specification is added to the image. +Porter starts the Dockerfile by using a base image. You can customize the base image by specifying a Dockerfile template in the porter.yaml. Next, a set of CA certificates is added. Next, contents of the current directory are copied into the bundle directory (/cnab/app) in the invocation image. This will include any contributions from the mixin executables. Finally, an entry point that conforms to the CNAB specification is added to the image. Once this is completed, the image is built: @@ -240,16 +239,16 @@ Step 2/9 : ARG BUNDLE_DIR Step 3/9 : RUN apt-get update && apt-get install -y ca-certificates ---> Using cache ---> d60d94e3f701 -Step 4/9 : COPY . $BUNDLE_DIR +Step 4/9 : COPY . ${BUNDLE_DIR} ---> 79290bcf128f -Step 5/9 : RUN rm -fr $BUNDLE_DIR/.cnab +Step 5/9 : RUN rm -fr ${BUNDLE_DIR}/.cnab ---> Running in 7f12cd3f447d ---> 01b633a31bf8 Step 6/9 : COPY .cnab /cnab ---> 25c0b1e5f70a -Step 7/9 : COPY porter.yaml $BUNDLE_DIR/porter.yaml +Step 7/9 : COPY porter.yaml ${BUNDLE_DIR}/porter.yaml ---> dbb26cacf8d8 -Step 8/9 : WORKDIR $BUNDLE_DIR +Step 8/9 : WORKDIR ${BUNDLE_DIR} ---> Running in b051cb2b6ddb ---> e10d6ab60595 Step 9/9 : CMD ["/cnab/app/run"] @@ -261,13 +260,13 @@ Successfully tagged jeremyrickard/porter-hello-installer:0.1.0 ## Mixins Help The Build -In the simple example above, the resulting Dockerfile was built entirely by the default `porter build` functionality. The `porter build` output reported that the `exec` mixin did not have any build time dependencies: +In the simple example above, the build output reported that the exec mixin did not have any build time dependencies: ``` # exec mixin has no buildtime dependencies ``` -In many cases, however, mixins will have build time requirements. Next let's see what happens when we use the Helm mixin. Here is another example `porter.yaml`: +In many cases, however, mixins will have build time requirements. Next let's see what happens when we use the Helm mixin. Here is another example porter.yaml: ```yaml mixins: @@ -282,7 +281,7 @@ registry: jeremyrickard credentials: - name: kubeconfig - path: /root/.kube/config + path: /home/nonroot/.kube/config install: - helm3: @@ -298,7 +297,7 @@ uninstall: purge: true ``` -When we run `porter build` on this, the output is different: +When we run porter build on this, the output is different: ```console $ porter build --verbose @@ -326,15 +325,15 @@ RUN apt-get update && \ mv kubectl /usr/local/bin && \ chmod a+x /usr/local/bin/kubectl -COPY . $BUNDLE_DIR -RUN rm -fr $BUNDLE_DIR/.cnab +COPY . ${BUNDLE_DIR} +RUN rm -fr ${BUNDLE_DIR}/.cnab COPY .cnab /cnab -COPY porter.yaml $BUNDLE_DIR/porter.yaml -WORKDIR $BUNDLE_DIR +COPY porter.yaml ${BUNDLE_DIR}/porter.yaml +WORKDIR ${BUNDLE_DIR} CMD ["/cnab/app/run"] ``` -First, the `helm` mixin is copied instead of `exec` mixin. The Dockerfile looks similar in the beginning, but we can then see our next difference. The following lines of our generated Dockerfile were contributed by the `helm` mixin: +First, the helm mixin is copied instead of exec mixin. The Dockerfile looks similar in the beginning, but we can then see our next difference. The following lines of our generated Dockerfile were contributed by the helm mixin: ``` RUN apt-get update && \ @@ -351,11 +350,11 @@ RUN apt-get update && \ chmod a+x /usr/local/bin/kubectl ``` -How did that happen? To find out, let's first look at the `helm` mixin: +How did that happen? To find out, let's first look at the helm mixin: ```console ~/.porter/mixins/helm/helm -A helm mixin for porter 👩🏽‍✈️ +A helm mixin for porter Usage: helm [command] @@ -377,6 +376,6 @@ Flags: Use "helm [command] --help" for more information about a command. ``` -The [Porter Mixin Contract](#tbd) specifies that mixins must provide a `build` sub command that generates Dockerfile lines to support the runtime execution of the mixin. In the case of the `helm` mixin, this includes installing Helm and running a `helm init --client-only` to prepare the image. At build time, Porter uses the _porter.yaml_ to determine what mixins are required for the bundle. Porter then invokes the build sub-command for each specified mixin and appends that output to the base Dockerfile. +Porter mixins must provide a build command that generates Dockerfile lines to support the runtime execution of the mixin. In the case of the helm mixin, this includes installing Helm and running a `helm init --client-only` to prepare the image. At build time, Porter uses the porter.yaml to determine what mixins are required for the bundle. Then Porter invokes the build sub-command for each specified mixin and appends that output to the base Dockerfile. -In the end, the result is a single invocation image with all of the necessary pieces: the porter-runtime, selected mixins and any relevant configuration files, scripts, charts or manifests. That invocation image can then be executed by any tool that supports the CNAB spec, while still taking advantage of the Porter capabilities. \ No newline at end of file +In the end, the result is a single invocation image with the necessary pieces: the porter-runtime, selected mixins and any relevant configuration files, scripts, charts or manifests. That invocation image can then be executed by any tool that supports the CNAB spec, while still taking advantage of the Porter capabilities. \ No newline at end of file diff --git a/docs/content/cli/credentials.md b/docs/content/cli/credentials.md index a0b9c13fd8..75f8aecef7 100644 --- a/docs/content/cli/credentials.md +++ b/docs/content/cli/credentials.md @@ -30,6 +30,7 @@ Most commands require a Docker daemon, either local or remote. Try our QuickStart https://porter.sh/quickstart to learn how to use Porter. * [porter credentials apply](/cli/porter_credentials_apply/) - Apply changes to a credential set +* [porter credentials create](/cli/porter_credentials_create/) - Create a Credential * [porter credentials delete](/cli/porter_credentials_delete/) - Delete a Credential * [porter credentials edit](/cli/porter_credentials_edit/) - Edit Credential * [porter credentials generate](/cli/porter_credentials_generate/) - Generate Credential Set diff --git a/docs/content/cli/credentials_create.md b/docs/content/cli/credentials_create.md new file mode 100644 index 0000000000..72aa2fc36d --- /dev/null +++ b/docs/content/cli/credentials_create.md @@ -0,0 +1,45 @@ +--- +title: "porter credentials create" +slug: porter_credentials_create +url: /cli/porter_credentials_create/ +--- +## porter credentials create + +Create a Credential + +### Synopsis + +Create a new blank resource for the definition of a Credential Set. + +``` +porter credentials create [flags] +``` + +### Examples + +``` + + porter credentials create FILE [--output yaml|json] + porter credentials create credential-set.json + porter credentials create credential-set --output yaml +``` + +### Options + +``` + -h, --help help for create + --output string Credential set resource file format +``` + +### Options inherited from parent commands + +``` + --debug Enable debug logging + --debug-plugins Enable plugin debug logging + --experimental strings Comma separated list of experimental features to enable. See https://porter.sh/configuration/#experimental-feature-flags for available feature flags. +``` + +### SEE ALSO + +* [porter credentials](/cli/porter_credentials/) - Credentials commands + diff --git a/docs/content/cli/credentials_generate.md b/docs/content/cli/credentials_generate.md index 4376626b7c..0a2bda54d2 100644 --- a/docs/content/cli/credentials_generate.md +++ b/docs/content/cli/credentials_generate.md @@ -18,7 +18,7 @@ specify a bundle with --file. Bundles define 1 or more credential(s) that are required to interact with a bundle. The bundle definition defines where the credential should be delivered -to the bundle, i.e. at /root/.kube. A credential set, on the other hand, +to the bundle, i.e. at /home/nonroot/.kube. A credential set, on the other hand, represents the source data that you wish to use when interacting with the bundle. These will typically be environment variables or files on your local file system. diff --git a/docs/content/credentials.md b/docs/content/credentials.md index 4513b9e293..5dd877fe74 100644 --- a/docs/content/credentials.md +++ b/docs/content/credentials.md @@ -13,14 +13,14 @@ language `{{ bundle.credentials.github_token }}`, or directly access the environment variable or path where the credential is stored. In the example below, the bundle defines two credentials. A kubeconfig file, -which once passed to the bundle is stored at /root/.kube/config, and a GitHub +which once passed to the bundle is stored at /home/nonroot/.kube/config, and a GitHub token which once passed to the bundle is stored in the GITHUB_TOKEN environment variable. ```yaml credentials: - name: kubeconfig - path: /root/.kube/config + path: /home/nonroot/.kube/config - name: token env: GITHUB_TOKEN ``` diff --git a/docs/content/custom-dockerfile.md b/docs/content/custom-dockerfile.md index 7db0c0bbb8..4a0c336e48 100644 --- a/docs/content/custom-dockerfile.md +++ b/docs/content/custom-dockerfile.md @@ -3,22 +3,13 @@ title: Custom Dockerfile description: Defining a custom Dockerfile for your Porter bundle --- -Porter automatically generates a Dockerfile and uses it to build the invocation -image for your bundle. By default, it copies all the files from the current -directory into the bundle, and installs SSL certificates. Sometimes you may want -to full control over your bundle's invocation image, for example to install -additional software used by the bundle. +Porter automatically generates a Dockerfile and uses it to build the invocation image for your bundle. +It runs the container as an unprivileged user with membership in the root group, copies all the files from the current directory into the bundle, and installs SSL certificates. +Sometimes you may want to full control over your bundle's invocation image, for example to install additional software used by the bundle. -When you run `porter create` template Dockerfile is created for you -in the current directory named **template.Dockerfile**: +When you run porter create, a template Dockerfile is created for you in the current directory named **template.Dockerfile**: ```Dockerfile -FROM debian:stretch-slim - -ARG BUNDLE_DIR - -RUN apt-get update && apt-get install -y ca-certificates - # This is a template Dockerfile for the bundle's invocation image # You can customize it to use different base images, install tools and copy configuration files. # @@ -28,26 +19,29 @@ RUN apt-get update && apt-get install -y ca-certificates # Add the following line to porter.yaml to instruct Porter to use this template # dockerfile: template.Dockerfile -# You can control where the mixin's Dockerfile lines are inserted into this file by moving "# PORTER_MIXINS" line -# another location in this file. If you remove that line, the mixins generated content is appended to this file. -# PORTER_MIXINS +# You can control where the mixin's Dockerfile lines are inserted into this file by moving the "# PORTER_*" tokens +# another location in this file. If you remove a token, its content is appended to the end of the Dockerfile. +FROM debian:stretch-slim -# Use the BUNDLE_DIR build argument to copy files into the bundle -COPY . $BUNDLE_DIR +# PORTER_INIT +RUN apt-get update && apt-get install -y ca-certificates + +# PORTER_MIXINS + +# Use the BUNDLE_DIR build argument to copy files into the bundle's working directory +COPY . ${BUNDLE_DIR} ``` -Add the following line to your **porter.yaml** file to instruct porter to use -the template, instead of generating one from scratch: +Add the following line to your **porter.yaml** file to instruct porter to use the template, instead of generating one from scratch: ```yaml dockerfile: template.Dockerfile ``` -It is your responsibility to provide a suitable base image, for example one that -has root ssl certificates installed. *You must use a base image that is -debian-based, such as `debian` or `ubuntu` with apt installed.* Mixins assume -that apt is available to install packages. +It is your responsibility to provide a suitable base image, for example one that has root ssl certificates installed. +*You must use a base image that is debian-based, such as debian or ubuntu with apt installed.* +Mixins assume that apt is available to install packages. # Buildkit @@ -57,15 +51,7 @@ for [build-drivers], and then specifying buildkit as the driver. Below is the template for builds with Buildkit: ```Dockerfile -# syntax=docker/dockerfile:1.2 -FROM debian:stretch-slim - -ARG BUNDLE_DIR - -RUN rm -f /etc/apt/apt.conf.d/docker-clean; echo 'Binary::apt::APT::Keep-Downloaded-Packages "true";' > /etc/apt/apt.conf.d/keep-cache -RUN --mount=type=cache,target=/var/cache/apt --mount=type=cache,target=/var/lib/apt \ - apt-get update && apt-get install -y ca-certificates - +# syntax=docker/dockerfile-upstream:1.4.0-rc2 # This is a template Dockerfile for the bundle's invocation image # You can customize it to use different base images, install tools and copy configuration files. # @@ -75,48 +61,105 @@ RUN --mount=type=cache,target=/var/cache/apt --mount=type=cache,target=/var/lib/ # Add the following line to porter.yaml to instruct Porter to use this template # dockerfile: template.Dockerfile -# You can control where the mixin's Dockerfile lines are inserted into this file by moving "# PORTER_MIXINS" line -# another location in this file. If you remove that line, the mixins generated content is appended to this file. +# You can control where the mixin's Dockerfile lines are inserted into this file by moving the "# PORTER_*" tokens +# another location in this file. If you remove a token, its content is appended to the end of the Dockerfile. +FROM debian:stretch-slim + +# PORTER_INIT + +RUN rm -f /etc/apt/apt.conf.d/docker-clean; echo 'Binary::apt::APT::Keep-Downloaded-Packages "true";' > /etc/apt/apt.conf.d/keep-cache +RUN --mount=type=cache,target=/var/cache/apt --mount=type=cache,target=/var/lib/apt \ + apt-get update && apt-get install -y ca-certificates + # PORTER_MIXINS -# Use the BUNDLE_DIR build argument to copy files into the bundle -COPY . $BUNDLE_DIR +# Use the BUNDLE_DIR build argument to copy files into the bundle's working directory +COPY --link . ${BUNDLE_DIR} ``` -# Variables +# Special Comments +Porter uses comments as placeholders to inject lines into your Dockerfile that all Porter bundles require. +You can move the comment to another location in the file to optimize your Docker build times and layer caching. +If you omit the comment entirely, Porter will still inject the contents for that section into your Dockerfile and we recommend keeping the comments in so that you can control where the contents are injected. -When using a Dockerfile template, you must manually copy any files you need in -your bundle using COPY statements. A few conventions are followed by Porter to -help with this task: +## PORTER_INIT -## BUNDLE_DIR - -Your template must declare `ARG BUNDLE_DIR`, which is the path to the bundle -directory inside the invocation image. You may then use this when copying files -from the local filesystem: +Porter includes additional Dockerfile lines that standardize all Porter bundles, such as declaring the BUNDLE_DIR argument, and creating a user for the bundle to run as. You can control where these lines are injected by placing a comment in your Dockerfile temlate: ```Dockerfile -COPY . $BUNDLE_DIR +# PORTER_INIT ``` +When that line is omitted, the lines are inserted after the FROM statement at the top of your template. + ## PORTER_MIXINS -The mixins used by your bundle generate Dockerfile lines that must be injected -into the Dockerfile template. You can control where they are injected by placing -a comment in your Dockerfile template: +The mixins used by your bundle generate Dockerfile lines that must be injected into the Dockerfile template. +You can control where they are injected by placing a comment in your Dockerfile template: ```Dockerfile # PORTER_MIXINS ``` -When that line is omitted, the mixins Dockerfile lines are appended to the end -of the template. +When that line is omitted, the lines are appended to the end of the template. + +The location of this comment can significantly impact the time it takes to rebuild your bundle, due to image layers and caching. +By default, this line is placed before copying your local files into the bundle, so that you can iterate on your scripts and on the porter manifest without having to rebuild those layers of the invocation image. + + +# Variables + +When using a Dockerfile template, you must manually copy any files you need in your bundle using COPY statements. +A few conventions are followed by Porter to help with this task: + +## BUNDLE_UID + +The **BUNDLE_UID** argument declared in the [PORTER_INIT](#porter_init) section is the user id that the bundle's container runs as. +Below is an example of how to run a command as the bundle's user: + +```Dockerfile +USER ${BUNDLE_UID} +RUN whoami +# 65532 +``` + +## BUNDLE_GID + +The **BUNDLE_GID** argument declared in the [PORTER_INIT](#porter_init) section is the group id that the bundle's container runs as. +Below is an example of how to copy a file into a directory outside [BUNDLE_DIR](#bundle_dir) and set the permissions so that the bundle can access them when it is run: + +```Dockerfile +COPY myapp /myapp +RUN chgrp -R ${BUNDLE_GID} /myapp && chmod -R g=u /myapp +``` + +If you are using buildkit, you can use the following syntax to copy and set permissions in a single line: + +```Dockerfile +# syntax=docker/dockerfile-upstream:1.4.0-rc2 +COPY --chown=${BUNDLE_UID}:${BUNDLE_GID} --chmod=770 myapp /myapp +``` + +## BUNDLE_USER + +The **BUNDLE_USER** argument is the username that the bundle's container runs as. +Below is an example of how to copy files into the user's home directory: + +```Dockerfile +COPY myfile /home/${BUNDLE_USER}/ +``` + +## BUNDLE_DIR + +The **BUNDLE_DIR** argument is declared in the [PORTER_INIT](#porter_init) section is the path to the bundle directory inside the invocation image. +You may then use this when copying files from the local filesystem to the bundle's working directory. +We strongly recommend that you always use this variable and do not copy files into directories outside BUNDLE_DIR. +If you do, you are responsible for setting the file permissions so that the bundle's user ([BUNDLE_USER](#bundle_user)) and the bundle's group (root) have the same permissions. + +```Dockerfile +COPY . ${BUNDLE_DIR} +``` -The location of this comment can significantly impact the time it takes to -rebuild your bundle, due to image layers and caching. By default this line is -placed before copying your local files into the bundle, so that you can iterate -on your scripts and on the porter manifest without having to rebuild those -layers of the invocation image. [Buildkit]: https://docs.docker.com/develop/develop-images/build_enhancements/ [experimental]: /configuration/#experimental-feature-flags diff --git a/docs/content/design/kubernetes-mixin.md b/docs/content/design/kubernetes-mixin.md index e8987e60b6..a1a4274305 100644 --- a/docs/content/design/kubernetes-mixin.md +++ b/docs/content/design/kubernetes-mixin.md @@ -36,7 +36,7 @@ The mixin will use `kubectl apply --dry-run` in order to perform a dry run for t ### Credentials -The Kubernetes Mixin requires a kubeconfig file. The mixin will allow the user to specify where it is mounted at, but will assume it is provided at `/root/.kube/config` if not otherwise specified. The kubeconfig should have sufficient privileges to apply the resources included in the bundle. +The Kubernetes Mixin requires a kubeconfig file. The mixin will allow the user to specify where it is mounted at, but will assume it is provided at `/home/nonroot/.kube/config` if not otherwise specified. The kubeconfig should have sufficient privileges to apply the resources included in the bundle. ### Install diff --git a/docs/content/docs.md b/docs/content/docs.md index 6f1df59b7b..3df62da203 100644 --- a/docs/content/docs.md +++ b/docs/content/docs.md @@ -5,7 +5,7 @@ description: All the magic of Porter explained Porter is an open source project that lets you package your application artifact, client tools, configuration and deployment logic together as a versioned bundle that you can distribute, and then install with a single command. -> � This is documentation for the Porter v1 prerelease. Go to our [stable docs](https://porter.sh/docs/), if you are using a stable release of Porter (v0.38). +> 🚧 This is documentation for the Porter v1 prerelease. Go to our [stable docs](https://porter.sh/docs/), if you are using a stable release of Porter (v0.38). ## Explore documentation diff --git a/docs/content/examples/airgap.md b/docs/content/examples/airgap.md index 9825ecb606..aa94e8552f 100644 --- a/docs/content/examples/airgap.md +++ b/docs/content/examples/airgap.md @@ -109,7 +109,7 @@ Edit the filepath to the kubeconfig with a path to a valid kubeconfig file. ```yaml # mycluster-credentials.yaml schemaType: CredentialSet -schemaVersion: 1.0.0 +schemaVersion: 1.0.1 name: mycluster credentials: - name: kubeconfig diff --git a/docs/content/mixins/az.md b/docs/content/mixins/az.md index ba8bfb1a7a..937a667cc6 100644 --- a/docs/content/mixins/az.md +++ b/docs/content/mixins/az.md @@ -111,7 +111,7 @@ The `path` output saves the content of the specified file path to an output. ```yaml outputs: - name: kubeconfig - path: /root/.kube/config + path: /home/nonroot/.kube/config ``` --- diff --git a/docs/content/mixins/docker-compose.md b/docs/content/mixins/docker-compose.md index c287adcae3..91f1b4058a 100644 --- a/docs/content/mixins/docker-compose.md +++ b/docs/content/mixins/docker-compose.md @@ -112,7 +112,7 @@ The `path` output saves the content of the specified file path to an output. ```yaml outputs: - name: kubeconfig - path: /root/.kube/config + path: /home/nonroot/.kube/config ``` --- diff --git a/docs/content/mixins/exec.md b/docs/content/mixins/exec.md index 915616aeb4..ebc0794015 100644 --- a/docs/content/mixins/exec.md +++ b/docs/content/mixins/exec.md @@ -31,6 +31,8 @@ exec: - flag-value2 suffix-arguments: # These arguments are specified after any flags are passed - suffix-arg1 + envs: # Environment variables to be added to the command execution environment + FOO_KEY: foo-value suppress-output: false # Do not print the command output to the console ignoreError: # Conditions when execution should continue even if the command fails all: true # Ignore all errors @@ -164,7 +166,7 @@ The `path` output saves the content of the specified file path to an output. ```yaml outputs: - name: kubeconfig - path: /root/.kube/config + path: /home/nonroot/.kube/config ``` --- diff --git a/docs/content/plugins/types/_index.md b/docs/content/plugins/types/_index.md index 1e9d537999..58f4979253 100644 --- a/docs/content/plugins/types/_index.md +++ b/docs/content/plugins/types/_index.md @@ -32,8 +32,8 @@ parameters](https://github.com/getporter/porter/issues/878) too. By default, credentials are resolved against the local host: environment variables, files, commands and hard-coded values. -A secrets plugin can implement the [secrets.Store interface][secretstore] and +A secrets plugin can implement the [plugins.SecretsProtocol interface][secretstore] and resolve credentials from remote and ideally more secure locations. For example, the [Azure plugin](/plugins/azure/) resolves secrets from Azure Key Vault. -[secretstore]: https://github.com/cnabio/cnab-go/blob/8ae1722acdeaddc1e720803ca496920c5a4698a2/secrets/store.go#L4-L13 +[secretstore]: https://github.com/getporter/porter/blob/release/v1/pkg/secrets/plugins/secrets_protocol.go diff --git a/docs/content/porter-or-duffle.md b/docs/content/porter-or-duffle.md index 7285270b5b..55ca4fc900 100644 --- a/docs/content/porter-or-duffle.md +++ b/docs/content/porter-or-duffle.md @@ -108,7 +108,7 @@ mixins: credentials: - name: kubeconfig - path: /root/.kube/config + path: /home/nonroot/.kube/config parameters: - name: wordpress_name @@ -216,7 +216,7 @@ mixins: credentials: - name: kubeconfig - path: /root/.kube/config + path: /home/nonroot/.kube/config parameters: - name: database_name @@ -268,7 +268,7 @@ dependencies: credentials: - name: kubeconfig - path: /root/.kube/config + path: /home/nonroot/.kube/config install: - helm3: diff --git a/docs/content/quickstart/desired-state.md b/docs/content/quickstart/desired-state.md index 8fcaaae188..fc966e561f 100644 --- a/docs/content/quickstart/desired-state.md +++ b/docs/content/quickstart/desired-state.md @@ -37,7 +37,7 @@ Instead of creating the credential and parameter sets using the generate command Create a file named creds.yaml, paste the following definition into the file, and then save it. ```yaml -schemaVersion: 1.0.0 +schemaVersion: 1.0.1 name: github credentials: - name: github-token @@ -48,7 +48,7 @@ credentials: Create a file named params.yaml, paste the following definition into the file, and then save it. ```yaml -schemaVersion: 1.0.0 +schemaVersion: 1.0.1 name: credentials-tutorial parameters: - name: user @@ -151,7 +151,7 @@ The installation is out-of-sync, running the install action... Edit params.yaml, change the user parameter value from getporterbot to carolynvs, and then apply the file. ```yaml -schemaVersion: 1.0.0 +schemaVersion: 1.0.1 name: credentials-tutorial parameters: - name: user diff --git a/docs/content/reference/file-formats.md b/docs/content/reference/file-formats.md index c55123ce4c..031246a1ae 100644 --- a/docs/content/reference/file-formats.md +++ b/docs/content/reference/file-formats.md @@ -1,12 +1,230 @@ --- title: File Formats +description: Defines the format of files used by Porter --- +* [Supported Versions](#supported-versions) +* [Manifest](#manifest) * [Credential Sets](#credential-set) * [Parameter Sets](#parameter-set) * [Installation](#installation) * [Porter Operator File Formats](/operator/file-formats/) +## Supported Versions + +Below are schema versions for each of the file formats, and the corresponding Porter version that supports it. + +| Schema Type | Schema Version | Porter Version | +|---------------|----------------|------------------| +| Bundle | (none) | v0.38.* | +| Bundle | 1.0.0-alpha.1 | v1.0.0-alpha.14+ | +| CredentialSet | (none) | v0.38.* | +| CredentialSet | 1.0.1 | v1.0.0-alpha.1+ | +| ParameterSet | (none) | v0.38.* | +| ParameterSet | 1.0.1 | v1.0.0-alpha.1+ | +| Installation | 1.0.0 | v1.0.0-alpha.1+ | + +## Manifest + +The manifest is the porter.yaml file used to build a bundle. +You can use this [json schema][manifest-schema] to validate a Porter manifest. + +```yaml +schemaType: Bundle +schemaVersion: 1.0.0-alpha.1 +name: myapp +version: 1.0.0 +description: Install my great application +registry: localhost:5000 +reference: localhost:5000/myapp:v1.0.0 +dockerfile: template.Dockerfile + +maintainers: + - name: Qi Lu + - email: sal@example.com + - name: Frank + url: https://example.com/frank + +custom: + app: + version: 1.2.3 + commit: abc123 + +required: + - docker: + privileged: true + +mixins: + - exec + - helm3: + clientVersion: 3.1.2 + +credentials: + - name: kubeconfig + description: A kubeconfig with cluster admin role + path: /root/.kube/config + - name: token + env: GITHUB_TOKEN + applyTo: + - release + +parameters: + - name: log-level + description: Log level for MyApp + type: integer + env: MYAPP_LOG_LEVEL + applyTo: + - install + - upgrade + - name: connstr + description: MyApp database connnection string + type: string + env: MYAPP_CONNECTION_STRING + sensitive: true + source: + dependency: mysql + output: admin-connstr + applyTo: + - install + - status + - name: release-name + type: string + env: RELEASE + default: myapp + +state: + - name: tfstate + description: Store terraform state with the bundle instead of a remote backend + path: terraform/terraform.tfstate + +dependencies: + - name: mysql + reference: getporter/mysql:v0.1.1 + parameters: + database: myapp + +outputs: + - name: app-token + description: Access token for MyApp + type: file + path: /cnab/app/myapp_token + sensitive: true + applyTo: + - install + - name: ip-address + type: string + +images: + myapp: + repository: example/myapp + digest: sha256:568461508c8d220742add8abd226b33534d4269868df4b3178fae1cba3818a6e + +install: + - helm3: + description: "Install MyApp" + name: "{{ bundle.parameters.release }}" + chart: ./charts/myapp + replace: true + set: + image.repository: "{{ bundle.images.myapp.repository }}" + image.digest: "{{ bundle.images.myapp.digest }}" + +upgrade: + - helm3: + name: "{{ bundle.parameters.release }}" + chart: ./charts/myapp + set: + image.repository: "{{ bundle.images.myapp.repository }}" + image.digest: "{{ bundle.images.myapp.digest }}" + +uninstall: + - helm3: + purge: true + releases: + - "{{ bundle.parameters.release }}" + +poke: + - exec: + command: ./poke-myapp.sh + +customActions: + status: + description: See what's up in there + modifies: false + stateless: true + +status: + - exec: + command: ./status.sh +``` + +| Field | Required | Description | +|----------------------------------|----------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| schemaType | false | The type of document. This isn't used by Porter but is included when Porter outputs the file, so that editors can determine the resource type. | +| schemaVersion | true | The version of the Bundle schema used in this file. | +| name | true | The name of the bundle. | +| version | true | The version of the bundle, must adhere to [semver v2].
The bundle tag defaults to the version with a v prefix, e.g. mybundle:v1.0.0. Use --tag or the reference field to override. | +| description | false | A description of the bundle. | +| registry | true* | The OCI registry to use when the bundle is published.
\*Either registry or reference must be specified. | +| reference | true* | The full reference to use when the bundle is published to an OCI registry.
\*Either registry or reference must be specified. | +| dockerfile | false | The relative path to a Dockerfile to use as a template during porter build. | +| maintainers | false | A list of maintainers for the bundle. | +| maintainers.name | false | Name of the maintainer. | +| maintainers.email | false | Email of the maintainer. | +| maintainers.url | false | Url of the maintainer. | +| custom | false | An object of custom bundle metadata. | +| required | false | A list of additional features required by the bundle. | +| required.docker | false | Indicate that the bundle requires a Docker host/daemon. | +| required.docker.privileged | false | Run the bundle in a privileged container. | +| mixins | true | A list of mixins used in the bundle. May include additional configuration settings depending on the mixin. | +| credentials | false | A list of credentials used by the bundle. | +| credentials.name | true | The name of the credential. | +| credentials.description | false | A description of the credential, how its used, and how to find it. | +| credentials.required | false | Indicates if the credential is required. | +| credentials.applyTo | false | A list of actions that apply to this item. When none are specified, all actions apply. | +| credentials.env | true | The environment variable name, such as MY_VALUE, into which the credential value is stored. Either env or path must be specified. | +| credentials.path | true | The path inside the bundle where the credential value is stored. Either env or path must be specified. | +| parameters | false | A list of parameters used by the bundle. | +| parameters.name | true | The name of the parameter. | +| parameters.description | false | A description of the parameter and how it is used. | +| parameters.default | false | The default value of the parameter. When no default is set, the parameter is required. | +| parameters.applyTo | false | A list of actions that apply to this item. When none are specified, all actions apply. | +| parameters.env | true | The environment variable name, such as MY_VALUE, into which the parameter value is stored. Either env or path must be specified. | +| parameters.path | true | The path inside the bundle where the parameter value is stored. Either env or path must be specified. | +| parameters.type | true | The parameter type. Allowed values are: string, number, integer, boolean, object, or file. | +| parameters.sensitive | false | Indicates whether this parameter's value is sensitive and should not be logged. | +| parameters.source | false | Indicates that the parameter should get its value from an external source. | +| parameters.source.output | true | An output name. The parameter's value is set to output's last value. | +| parameters.source.dependency | false | The name of the dependency that generated the output. If not set, the output must be generated by the current bundle. | +| state | false | State variables that are generated by the bundle and injected on subsequent runs. | +| state.name | true | The name of this state variable | +| state.description | false | Description of how the variable is used by the bundle. | +| state.mixin | false | The name of the mixin that generates and manages this state variable. | +| state.path | true | The path inside of the bundle where the state variable data is stored. | +| outputs | false | A list of output values produced by the bundle. | +| outputs.name | true | The name of the output. | +| outputs.description | false | A description of the output and what it represents. | +| outputs.default | false | The default value of the output. When no default is set, the output is required. | +| outputs.applyTo | false | A list of actions that apply to this item. When none are specified, all actions apply. | +| outputs.path | true | The path inside the bundle where the output value is stored. | +| outputs.type | true | The output type. Allowed values are: string, number, integer, boolean, object, or file. | +| outputs.sensitive | false | Indicates whether this output's value is sensitive and should not be logged. | +| images | false | A map of images referenced in the bundle. When the bundle is relocated, the referenced images are copied to the new bundle location. | +| images.KEY.description | false | A description of the image and how it is used. | +| images.KEY.repository | true | The repository portion of the image reference, i.e. docker.io/library/nginx | +| images.KEY.digest | true | The repository digest of the image, e.g. sha256:cafebabe... | +| dependencies | false | Other bundles that this bundle relies upon. | +| dependencies.requires | true | A list of bundles that should be executed with this bundle. | +| dependencies.requires.name | true | A name for the dependency, used to refer to the dependency using the template syntax `bundle.dependencies.NAME`. | +| dependencies.requires.reference | true | The full bundle reference for the dependency in the format REGISTRY/NAME:TAG. | +| dependencies.requires.parameters | false | A map of parameter names to their value. | +| customActions | false | A map of action names to a custom action definition. | +| customActions.NAME.description | false | A description of the action. | +| customActions.NAME.modifies | false | Specifies if the action will modify resources in any way. | +| customActions.NAME.stateless | false | Specifies that the action could be run before the bundle is installed and does not require credentials. | + +[semver v2]: https://semver.org/spec/v2.0.0.html + ## Credential Set Credential sets can be defined in either json or yaml. @@ -14,7 +232,7 @@ You can use this [json schema][cs-schema] to validate a credential set file. ```yaml schemaType: CredentialSet -schemaVersion: 1.0.0 +schemaVersion: 1.0.1 name: mycreds namespace: staging labels: @@ -32,16 +250,16 @@ credentials: secret: my-connection-string ``` -| Field | Required | Description | -|---|---|---| -| schemaType | false | The type of document. This isn't used by Porter but is included when Porter outputs the file, so that editors can determine the resource type. | -| schemaVersion | true | The version of the Credential Set schema used in this file. | -| name | true | The name of the credential set. | -| namespace | false | The namespace in which the credential set is defined. Defaults to the empty (global) namespace. | -| labels | false | A set of key-value pairs associated with the credential set. | -| credentials | true | A list of credentials and instructions for Porter to resolve the credential value. | -| credentials.name | true | The name of the credential as defined in the bundle. | -| credentials.source | true | Specifies how the credential should be resolved. Must have only one child property:
secret, value, env, path, or command | +| Field | Required | Description | +|--------------------|----------|------------------------------------------------------------------------------------------------------------------------------------------------| +| schemaType | false | The type of document. This isn't used by Porter but is included when Porter outputs the file, so that editors can determine the resource type. | +| schemaVersion | true | The version of the Credential Set schema used in this file. | +| name | true | The name of the credential set. | +| namespace | false | The namespace in which the credential set is defined. Defaults to the empty (global) namespace. | +| labels | false | A set of key-value pairs associated with the credential set. | +| credentials | true | A list of credentials and instructions for Porter to resolve the credential value. | +| credentials.name | true | The name of the credential as defined in the bundle. | +| credentials.source | true | Specifies how the credential should be resolved. Must have only one child property:
secret, value, env, path, or command | ## Parameter Set @@ -50,7 +268,7 @@ You can use this [json schema][ps-schema] to validate a parameter set file. ```yaml schemaType: ParameterSet -schemaVersion: 1.0.0 +schemaVersion: 1.0.1 name: myparams namespace: staging labels: @@ -68,16 +286,16 @@ parameters: secret: my-connection-string ``` -| Field | Required | Description | -|---|---|---| -| schemaType | false | The type of document. This isn't used by Porter but is included when Porter outputs the file, so that editors can determine the resource type. | -| schemaVersion | true | The version of the Parameter Set schema used in this file. | -| name | true | The name of the parameter set. | -| namespace | false | The namespace in which the parameter set is defined. Defaults to the empty (global) namespace. | -| labels | false | A set of key-value pairs associated with the parameter set. | -| parameters | true | A list of parameters and instructions for Porter to resolve the parameter value. | -| parameters.name | true | The name of the parameter as defined in the bundle. | -| parameters.source | true | Specifies how the parameter should be resolved. Must have only one child property:
secret, value, env, path, or command | +| Field | Required | Description | +|-------------------|----------|------------------------------------------------------------------------------------------------------------------------------------------------| +| schemaType | false | The type of document. This isn't used by Porter but is included when Porter outputs the file, so that editors can determine the resource type. | +| schemaVersion | true | The version of the Parameter Set schema used in this file. | +| name | true | The name of the parameter set. | +| namespace | false | The namespace in which the parameter set is defined. Defaults to the empty (global) namespace. | +| labels | false | A set of key-value pairs associated with the parameter set. | +| parameters | true | A list of parameters and instructions for Porter to resolve the parameter value. | +| parameters.name | true | The name of the parameter as defined in the bundle. | +| parameters.source | true | Specifies how the parameter should be resolved. Must have only one child property:
secret, value, env, path, or command | ## Installation @@ -110,25 +328,26 @@ parameters: log-level: 11 ``` -| Field | Required | Description | -|---|---|---| -| schemaType | false | The type of document. This isn't used by Porter but is included when Porter outputs the file, so that editors can determine the resource type. | -| schemaVersion | true | The version of the Installation schema used in this file. | -| name | true | The name of the installation. | -| namespace | false | The namespace in which the installation is defined. Defaults to the empty (global) namespace. | -| uninstalled | false | Specifies if the installation should be uninstalled. Defaults to false. | -| labels | false | A set of key-value pairs associated with the installation. | -| bundle | true | A reference to where the bundle is published | -| bundle.repository | true | The repository where the bundle is published. | -| bundle.digest | false* | The bundle repository digest. | -| bundle.version | false* | The bundle version. | -| bundle.tag | false* | The bundle tag. This is useful when you do not use Porter's convention of defaulting the bundle tag to the bundle version. | -| parameterSets | false | A list of parameter set names. | -| credentialSets | false | A list of credential set names. | -| parameters | false | Additional parameter values to use with the installation. Overrides any parameters defined in the associated parameter sets. | +| Field | Required | Description | +|-------------------|----------|------------------------------------------------------------------------------------------------------------------------------------------------| +| schemaType | false | The type of document. This isn't used by Porter but is included when Porter outputs the file, so that editors can determine the resource type. | +| schemaVersion | true | The version of the Installation schema used in this file. | +| name | true | The name of the installation. | +| namespace | false | The namespace in which the installation is defined. Defaults to the empty (global) namespace. | +| uninstalled | false | Specifies if the installation should be uninstalled. Defaults to false. | +| labels | false | A set of key-value pairs associated with the installation. | +| bundle | true | A reference to where the bundle is published | +| bundle.repository | true | The repository where the bundle is published. | +| bundle.digest | false* | The bundle repository digest. | +| bundle.version | false* | The bundle version. | +| bundle.tag | false* | The bundle tag. This is useful when you do not use Porter's convention of defaulting the bundle tag to the bundle version. | +| parameterSets | false | A list of parameter set names. | +| credentialSets | false | A list of credential set names. | +| parameters | false | Additional parameter values to use with the installation. Overrides any parameters defined in the associated parameter sets. | \* The bundle section requires a repository and one of the following fields: digest, version, or tag. -[cs-schema]: https://raw.githubusercontent.com/getporter/porter/release/v1/pkg/schema/credential-set.schema.json -[ps-schema]: https://raw.githubusercontent.com/getporter/porter/release/v1/pkg/schema/parameter-set.schema.json -[inst-schema]: https://raw.githubusercontent.com/getporter/porter/release/v1/pkg/schema/installation.schema.json +[manifest-schema]: https://raw.githubusercontent.com/getporter/porter/release/v1/pkg/schema/manifest.schema.json +[cs-schema]: https://porter.sh/schema/v1/credential-set.schema.json +[ps-schema]: https://porter.sh/schema/v1/parameter-set.schema.json +[inst-schema]: https://porter.sh/schema/v1/installation.schema.json diff --git a/docs/content/slides/pack-your-bags-msp/index.md b/docs/content/slides/pack-your-bags-msp/index.md index 6cc9850f39..14829002f7 100644 --- a/docs/content/slides/pack-your-bags-msp/index.md +++ b/docs/content/slides/pack-your-bags-msp/index.md @@ -534,11 +534,11 @@ COPY --from=0 /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates. ARG BUNDLE_DIR COPY .cnab /cnab -COPY . $BUNDLE_DIR -RUN rm -fr $BUNDLE_DIR/.cnab +COPY . ${BUNDLE_DIR} +RUN rm -fr ${BUNDLE_DIR}/.cnab # exec mixin has no buildtime dependencies -WORKDIR $BUNDLE_DIR +WORKDIR ${BUNDLE_DIR} CMD ["/cnab/app/run"] ``` .footnote[🚨 Generated by Porter] @@ -847,7 +847,7 @@ specify a bundle with --file. Bundles define 1 or more credential(s) that are required to interact with a bundle. The bundle definition defines where the credential should be delivered -to the bundle, i.e. at /root/.kube. A credential set, on the other hand, +to the bundle, i.e. at /home/nonroot/.kube. A credential set, on the other hand, represents the source data that you wish to use when interacting with the bundle. These will typically be environment variables or files on your local file system. @@ -874,7 +874,7 @@ credentials: ```yaml credentials: - name: kubeconfig - path: /root/.kube/config + path: /home/nonroot/.kube/config ``` --- @@ -1083,7 +1083,7 @@ Specify a custom Dockerfile for the invocation image * Add users, tweak the environment and configuration * Install tools and applications -⚠️ You are responsible for copying files into the bundle into `$BUNDLE_DIR` +⚠️ You are responsible for copying files into the bundle into `${BUNDLE_DIR}` --- @@ -1102,7 +1102,7 @@ ARG BUNDLE_DIR RUN apt-get install -y curl -COPY myscript.sh $BUNDLE_DIR +COPY myscript.sh ${BUNDLE_DIR} ``` --- diff --git a/docs/content/slides/pack-your-bags/index.md b/docs/content/slides/pack-your-bags/index.md index 6baaedb878..3c9459f2d3 100644 --- a/docs/content/slides/pack-your-bags/index.md +++ b/docs/content/slides/pack-your-bags/index.md @@ -843,7 +843,7 @@ specify a bundle with --file. Bundles define 1 or more credential(s) that are required to interact with a bundle. The bundle definition defines where the credential should be delivered -to the bundle, i.e. at /root/.kube. A credential set, on the other hand, +to the bundle, i.e. at /home/nonroot/.kube. A credential set, on the other hand, represents the source data that you wish to use when interacting with the bundle. These will typically be environment variables or files on your local file system. @@ -869,7 +869,7 @@ credentials: ```yaml credentials: - name: kubeconfig - path: /root/.kube/config + path: /home/nonroot/.kube/config ``` --- @@ -985,7 +985,7 @@ credentials: - name: SUBSCRIPTION_ID env: AZURE_SUBSCRIPTION_ID - name: kubeconfig - path: /root/.kube/config + path: /home/nonroot/.kube/config ``` --- diff --git a/docs/content/wiring.md b/docs/content/wiring.md index 8ffc28576e..42fe3af69f 100644 --- a/docs/content/wiring.md +++ b/docs/content/wiring.md @@ -55,12 +55,12 @@ You can also provide any other attributes, as specified by the CNAB [parameters] Porter also enables the use of file parameters in a bundle. -For instance, a bundle might declare a parameter `mytar` of type `file`, to exist at `/root/mytar` in the execution environment: +For instance, a bundle might declare a parameter `mytar` of type `file`, to exist at `/cnab/app/mytar` in the execution environment: ```yaml - name: mytar type: file - path: /root/mytar + path: /cnab/app/mytar ``` which can be used in a step like `install`: @@ -71,7 +71,7 @@ install: description: "Install" command: bash flags: - c: tar zxvf /root/mytar + c: tar zxvf /cnab/app/mytar ``` The syntax to pass a parameter to porter is the same for both regular and file parameters: @@ -143,7 +143,7 @@ To declare a file injection: ```yaml credentials: - name: kubeconfig - path: /root/.kube/config + path: /home/nonroot/.kube/config ``` To declare an environment variable injection: @@ -303,7 +303,7 @@ mixins: credentials: - name: kubeconfig - path: /root/.kube/config + path: /home/nonroot/.kube/config parameters: - name: database-name @@ -356,7 +356,7 @@ dependencies: credentials: - name: kubeconfig - path: /root/.kube/config + path: /home/nonroot/.kube/config parameters: - name: wordpress-name diff --git a/docs/resources/_gen/assets/scss/sass/styles.scss_b95b077eb505d5c0aff8055eaced30ad.content b/docs/resources/_gen/assets/scss/sass/styles.scss_b95b077eb505d5c0aff8055eaced30ad.content index 75ea87a6b9..1367025b3d 100644 --- a/docs/resources/_gen/assets/scss/sass/styles.scss_b95b077eb505d5c0aff8055eaced30ad.content +++ b/docs/resources/_gen/assets/scss/sass/styles.scss_b95b077eb505d5c0aff8055eaced30ad.content @@ -1,2 +1,2 @@ @charset "UTF-8";/*!normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css*/html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}meta.foundation-version{font-family:"/5.5.3/"}meta.foundation-mq-small{font-family:"/only screen/";width:0}meta.foundation-mq-small-only{font-family:"/only screen and (max-width: 40em)/";width:0}meta.foundation-mq-medium{font-family:"/only screen and (min-width:40.0625em)/";width:40.0625em}meta.foundation-mq-medium-only{font-family:"/only screen and (min-width:40.0625em) and (max-width:64em)/";width:40.0625em}meta.foundation-mq-large{font-family:"/only screen and (min-width:64.0625em)/";width:64.0625em}meta.foundation-mq-large-only{font-family:"/only screen and (min-width:64.0625em) and (max-width:90em)/";width:64.0625em}meta.foundation-mq-xlarge{font-family:"/only screen and (min-width:90.0625em)/";width:90.0625em}meta.foundation-mq-xlarge-only{font-family:"/only screen and (min-width:90.0625em) and (max-width:120em)/";width:90.0625em}meta.foundation-mq-xxlarge{font-family:"/only screen and (min-width:120.0625em)/";width:120.0625em}meta.foundation-data-attribute-namespace{font-family:false}html,body{height:100%}*,*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html,body{font-size:100%}body{background:#fff;color:#222;cursor:auto;font-family:helvetica neue,Helvetica,Roboto,Arial,sans-serif;font-style:normal;font-weight:400;line-height:1.5;margin:0;padding:0;position:relative}a:hover{cursor:pointer}img{max-width:100%;height:auto}img{-ms-interpolation-mode:bicubic}#map_canvas img,#map_canvas embed,#map_canvas object,.map_canvas img,.map_canvas embed,.map_canvas object,.mqa-display img,.mqa-display embed,.mqa-display object{max-width:none!important}.left{float:left!important}.right{float:right!important}.clearfix:before,.clearfix:after{content:" ";display:table}.clearfix:after{clear:both}.hide{display:none}.invisible{visibility:hidden}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}img{display:inline-block;vertical-align:middle}textarea{height:auto;min-height:50px}select{width:100%}.row{margin:0 auto;max-width:62.5rem;width:100%}.row:before,.row:after{content:" ";display:table}.row:after{clear:both}.row.collapse>.column,.row.collapse>.columns{padding-left:0;padding-right:0}.row.collapse .row{margin-left:0;margin-right:0}.row .row{margin:0 -.9375rem;max-width:none;width:auto}.row .row:before,.row .row:after{content:" ";display:table}.row .row:after{clear:both}.row .row.collapse{margin:0;max-width:none;width:auto}.row .row.collapse:before,.row .row.collapse:after{content:" ";display:table}.row .row.collapse:after{clear:both}.column,.columns{padding-left:.9375rem;padding-right:.9375rem;width:100%;float:left}.column+.column:last-child,.column+.columns:last-child,.columns+.column:last-child,.columns+.columns:last-child{float:right}.column+.column.end,.column+.columns.end,.columns+.column.end,.columns+.columns.end{float:left}@media only screen{.small-push-0{position:relative;left:0;right:auto}.small-pull-0{position:relative;right:0;left:auto}.small-push-1{position:relative;left:8.33333333%;right:auto}.small-pull-1{position:relative;right:8.33333333%;left:auto}.small-push-2{position:relative;left:16.66666667%;right:auto}.small-pull-2{position:relative;right:16.66666667%;left:auto}.small-push-3{position:relative;left:25%;right:auto}.small-pull-3{position:relative;right:25%;left:auto}.small-push-4{position:relative;left:33.33333333%;right:auto}.small-pull-4{position:relative;right:33.33333333%;left:auto}.small-push-5{position:relative;left:41.66666667%;right:auto}.small-pull-5{position:relative;right:41.66666667%;left:auto}.small-push-6{position:relative;left:50%;right:auto}.small-pull-6{position:relative;right:50%;left:auto}.small-push-7{position:relative;left:58.33333333%;right:auto}.small-pull-7{position:relative;right:58.33333333%;left:auto}.small-push-8{position:relative;left:66.66666667%;right:auto}.small-pull-8{position:relative;right:66.66666667%;left:auto}.small-push-9{position:relative;left:75%;right:auto}.small-pull-9{position:relative;right:75%;left:auto}.small-push-10{position:relative;left:83.33333333%;right:auto}.small-pull-10{position:relative;right:83.33333333%;left:auto}.small-push-11{position:relative;left:91.66666667%;right:auto}.small-pull-11{position:relative;right:91.66666667%;left:auto}.column,.columns{position:relative;padding-left:.9375rem;padding-right:.9375rem;float:left}.small-1{width:8.33333333%}.small-2{width:16.66666667%}.small-3{width:25%}.small-4{width:33.33333333%}.small-5{width:41.66666667%}.small-6{width:50%}.small-7{width:58.33333333%}.small-8{width:66.66666667%}.small-9{width:75%}.small-10{width:83.33333333%}.small-11{width:91.66666667%}.small-12{width:100%}.small-offset-0{margin-left:0!important}.small-offset-1{margin-left:8.33333333%!important}.small-offset-2{margin-left:16.66666667%!important}.small-offset-3{margin-left:25%!important}.small-offset-4{margin-left:33.33333333%!important}.small-offset-5{margin-left:41.66666667%!important}.small-offset-6{margin-left:50%!important}.small-offset-7{margin-left:58.33333333%!important}.small-offset-8{margin-left:66.66666667%!important}.small-offset-9{margin-left:75%!important}.small-offset-10{margin-left:83.33333333%!important}.small-offset-11{margin-left:91.66666667%!important}.small-reset-order{float:left;left:auto;margin-left:0;margin-right:0;right:auto}.column.small-centered,.columns.small-centered{margin-left:auto;margin-right:auto;float:none}.column.small-uncentered,.columns.small-uncentered{float:left;margin-left:0;margin-right:0}.column.small-centered:last-child,.columns.small-centered:last-child{float:none}.column.small-uncentered:last-child,.columns.small-uncentered:last-child{float:left}.column.small-uncentered.opposite,.columns.small-uncentered.opposite{float:right}.row.small-collapse>.column,.row.small-collapse>.columns{padding-left:0;padding-right:0}.row.small-collapse .row{margin-left:0;margin-right:0}.row.small-uncollapse>.column,.row.small-uncollapse>.columns{padding-left:.9375rem;padding-right:.9375rem;float:left}}@media only screen and (min-width:40.0625em){.medium-push-0{position:relative;left:0;right:auto}.medium-pull-0{position:relative;right:0;left:auto}.medium-push-1{position:relative;left:8.33333333%;right:auto}.medium-pull-1{position:relative;right:8.33333333%;left:auto}.medium-push-2{position:relative;left:16.66666667%;right:auto}.medium-pull-2{position:relative;right:16.66666667%;left:auto}.medium-push-3{position:relative;left:25%;right:auto}.medium-pull-3{position:relative;right:25%;left:auto}.medium-push-4{position:relative;left:33.33333333%;right:auto}.medium-pull-4{position:relative;right:33.33333333%;left:auto}.medium-push-5{position:relative;left:41.66666667%;right:auto}.medium-pull-5{position:relative;right:41.66666667%;left:auto}.medium-push-6{position:relative;left:50%;right:auto}.medium-pull-6{position:relative;right:50%;left:auto}.medium-push-7{position:relative;left:58.33333333%;right:auto}.medium-pull-7{position:relative;right:58.33333333%;left:auto}.medium-push-8{position:relative;left:66.66666667%;right:auto}.medium-pull-8{position:relative;right:66.66666667%;left:auto}.medium-push-9{position:relative;left:75%;right:auto}.medium-pull-9{position:relative;right:75%;left:auto}.medium-push-10{position:relative;left:83.33333333%;right:auto}.medium-pull-10{position:relative;right:83.33333333%;left:auto}.medium-push-11{position:relative;left:91.66666667%;right:auto}.medium-pull-11{position:relative;right:91.66666667%;left:auto}.column,.columns{position:relative;padding-left:.9375rem;padding-right:.9375rem;float:left}.medium-1{width:8.33333333%}.medium-2{width:16.66666667%}.medium-3{width:25%}.medium-4{width:33.33333333%}.medium-5{width:41.66666667%}.medium-6{width:50%}.medium-7{width:58.33333333%}.medium-8{width:66.66666667%}.medium-9{width:75%}.medium-10{width:83.33333333%}.medium-11{width:91.66666667%}.medium-12{width:100%}.medium-offset-0{margin-left:0!important}.medium-offset-1{margin-left:8.33333333%!important}.medium-offset-2{margin-left:16.66666667%!important}.medium-offset-3{margin-left:25%!important}.medium-offset-4{margin-left:33.33333333%!important}.medium-offset-5{margin-left:41.66666667%!important}.medium-offset-6{margin-left:50%!important}.medium-offset-7{margin-left:58.33333333%!important}.medium-offset-8{margin-left:66.66666667%!important}.medium-offset-9{margin-left:75%!important}.medium-offset-10{margin-left:83.33333333%!important}.medium-offset-11{margin-left:91.66666667%!important}.medium-reset-order{float:left;left:auto;margin-left:0;margin-right:0;right:auto}.column.medium-centered,.columns.medium-centered{margin-left:auto;margin-right:auto;float:none}.column.medium-uncentered,.columns.medium-uncentered{float:left;margin-left:0;margin-right:0}.column.medium-centered:last-child,.columns.medium-centered:last-child{float:none}.column.medium-uncentered:last-child,.columns.medium-uncentered:last-child{float:left}.column.medium-uncentered.opposite,.columns.medium-uncentered.opposite{float:right}.row.medium-collapse>.column,.row.medium-collapse>.columns{padding-left:0;padding-right:0}.row.medium-collapse .row{margin-left:0;margin-right:0}.row.medium-uncollapse>.column,.row.medium-uncollapse>.columns{padding-left:.9375rem;padding-right:.9375rem;float:left}.push-0{position:relative;left:0;right:auto}.pull-0{position:relative;right:0;left:auto}.push-1{position:relative;left:8.33333333%;right:auto}.pull-1{position:relative;right:8.33333333%;left:auto}.push-2{position:relative;left:16.66666667%;right:auto}.pull-2{position:relative;right:16.66666667%;left:auto}.push-3{position:relative;left:25%;right:auto}.pull-3{position:relative;right:25%;left:auto}.push-4{position:relative;left:33.33333333%;right:auto}.pull-4{position:relative;right:33.33333333%;left:auto}.push-5{position:relative;left:41.66666667%;right:auto}.pull-5{position:relative;right:41.66666667%;left:auto}.push-6{position:relative;left:50%;right:auto}.pull-6{position:relative;right:50%;left:auto}.push-7{position:relative;left:58.33333333%;right:auto}.pull-7{position:relative;right:58.33333333%;left:auto}.push-8{position:relative;left:66.66666667%;right:auto}.pull-8{position:relative;right:66.66666667%;left:auto}.push-9{position:relative;left:75%;right:auto}.pull-9{position:relative;right:75%;left:auto}.push-10{position:relative;left:83.33333333%;right:auto}.pull-10{position:relative;right:83.33333333%;left:auto}.push-11{position:relative;left:91.66666667%;right:auto}.pull-11{position:relative;right:91.66666667%;left:auto}}@media only screen and (min-width:64.0625em){.large-push-0{position:relative;left:0;right:auto}.large-pull-0{position:relative;right:0;left:auto}.large-push-1{position:relative;left:8.33333333%;right:auto}.large-pull-1{position:relative;right:8.33333333%;left:auto}.large-push-2{position:relative;left:16.66666667%;right:auto}.large-pull-2{position:relative;right:16.66666667%;left:auto}.large-push-3{position:relative;left:25%;right:auto}.large-pull-3{position:relative;right:25%;left:auto}.large-push-4{position:relative;left:33.33333333%;right:auto}.large-pull-4{position:relative;right:33.33333333%;left:auto}.large-push-5{position:relative;left:41.66666667%;right:auto}.large-pull-5{position:relative;right:41.66666667%;left:auto}.large-push-6{position:relative;left:50%;right:auto}.large-pull-6{position:relative;right:50%;left:auto}.large-push-7{position:relative;left:58.33333333%;right:auto}.large-pull-7{position:relative;right:58.33333333%;left:auto}.large-push-8{position:relative;left:66.66666667%;right:auto}.large-pull-8{position:relative;right:66.66666667%;left:auto}.large-push-9{position:relative;left:75%;right:auto}.large-pull-9{position:relative;right:75%;left:auto}.large-push-10{position:relative;left:83.33333333%;right:auto}.large-pull-10{position:relative;right:83.33333333%;left:auto}.large-push-11{position:relative;left:91.66666667%;right:auto}.large-pull-11{position:relative;right:91.66666667%;left:auto}.column,.columns{position:relative;padding-left:.9375rem;padding-right:.9375rem;float:left}.large-1{width:8.33333333%}.large-2{width:16.66666667%}.large-3{width:25%}.large-4{width:33.33333333%}.large-5{width:41.66666667%}.large-6{width:50%}.large-7{width:58.33333333%}.large-8{width:66.66666667%}.large-9{width:75%}.large-10{width:83.33333333%}.large-11{width:91.66666667%}.large-12{width:100%}.large-offset-0{margin-left:0!important}.large-offset-1{margin-left:8.33333333%!important}.large-offset-2{margin-left:16.66666667%!important}.large-offset-3{margin-left:25%!important}.large-offset-4{margin-left:33.33333333%!important}.large-offset-5{margin-left:41.66666667%!important}.large-offset-6{margin-left:50%!important}.large-offset-7{margin-left:58.33333333%!important}.large-offset-8{margin-left:66.66666667%!important}.large-offset-9{margin-left:75%!important}.large-offset-10{margin-left:83.33333333%!important}.large-offset-11{margin-left:91.66666667%!important}.large-reset-order{float:left;left:auto;margin-left:0;margin-right:0;right:auto}.column.large-centered,.columns.large-centered{margin-left:auto;margin-right:auto;float:none}.column.large-uncentered,.columns.large-uncentered{float:left;margin-left:0;margin-right:0}.column.large-centered:last-child,.columns.large-centered:last-child{float:none}.column.large-uncentered:last-child,.columns.large-uncentered:last-child{float:left}.column.large-uncentered.opposite,.columns.large-uncentered.opposite{float:right}.row.large-collapse>.column,.row.large-collapse>.columns{padding-left:0;padding-right:0}.row.large-collapse .row{margin-left:0;margin-right:0}.row.large-uncollapse>.column,.row.large-uncollapse>.columns{padding-left:.9375rem;padding-right:.9375rem;float:left}.push-0{position:relative;left:0;right:auto}.pull-0{position:relative;right:0;left:auto}.push-1{position:relative;left:8.33333333%;right:auto}.pull-1{position:relative;right:8.33333333%;left:auto}.push-2{position:relative;left:16.66666667%;right:auto}.pull-2{position:relative;right:16.66666667%;left:auto}.push-3{position:relative;left:25%;right:auto}.pull-3{position:relative;right:25%;left:auto}.push-4{position:relative;left:33.33333333%;right:auto}.pull-4{position:relative;right:33.33333333%;left:auto}.push-5{position:relative;left:41.66666667%;right:auto}.pull-5{position:relative;right:41.66666667%;left:auto}.push-6{position:relative;left:50%;right:auto}.pull-6{position:relative;right:50%;left:auto}.push-7{position:relative;left:58.33333333%;right:auto}.pull-7{position:relative;right:58.33333333%;left:auto}.push-8{position:relative;left:66.66666667%;right:auto}.pull-8{position:relative;right:66.66666667%;left:auto}.push-9{position:relative;left:75%;right:auto}.pull-9{position:relative;right:75%;left:auto}.push-10{position:relative;left:83.33333333%;right:auto}.pull-10{position:relative;right:83.33333333%;left:auto}.push-11{position:relative;left:91.66666667%;right:auto}.pull-11{position:relative;right:91.66666667%;left:auto}}[class*=block-grid-]{display:block;padding:0;margin:0 -.625rem}[class*=block-grid-]:before,[class*=block-grid-]:after{content:" ";display:table}[class*=block-grid-]:after{clear:both}[class*=block-grid-]>li{display:block;float:left;height:auto;padding:0 .625rem 1.25rem}@media only screen{.small-block-grid-1>li{list-style:none;width:100%}.small-block-grid-1>li:nth-of-type(1n){clear:none}.small-block-grid-1>li:nth-of-type(1n+1){clear:both}.small-block-grid-2>li{list-style:none;width:50%}.small-block-grid-2>li:nth-of-type(1n){clear:none}.small-block-grid-2>li:nth-of-type(2n+1){clear:both}.small-block-grid-3>li{list-style:none;width:33.33333333%}.small-block-grid-3>li:nth-of-type(1n){clear:none}.small-block-grid-3>li:nth-of-type(3n+1){clear:both}.small-block-grid-4>li{list-style:none;width:25%}.small-block-grid-4>li:nth-of-type(1n){clear:none}.small-block-grid-4>li:nth-of-type(4n+1){clear:both}.small-block-grid-5>li{list-style:none;width:20%}.small-block-grid-5>li:nth-of-type(1n){clear:none}.small-block-grid-5>li:nth-of-type(5n+1){clear:both}.small-block-grid-6>li{list-style:none;width:16.66666667%}.small-block-grid-6>li:nth-of-type(1n){clear:none}.small-block-grid-6>li:nth-of-type(6n+1){clear:both}.small-block-grid-7>li{list-style:none;width:14.28571429%}.small-block-grid-7>li:nth-of-type(1n){clear:none}.small-block-grid-7>li:nth-of-type(7n+1){clear:both}.small-block-grid-8>li{list-style:none;width:12.5%}.small-block-grid-8>li:nth-of-type(1n){clear:none}.small-block-grid-8>li:nth-of-type(8n+1){clear:both}.small-block-grid-9>li{list-style:none;width:11.11111111%}.small-block-grid-9>li:nth-of-type(1n){clear:none}.small-block-grid-9>li:nth-of-type(9n+1){clear:both}.small-block-grid-10>li{list-style:none;width:10%}.small-block-grid-10>li:nth-of-type(1n){clear:none}.small-block-grid-10>li:nth-of-type(10n+1){clear:both}.small-block-grid-11>li{list-style:none;width:9.09090909%}.small-block-grid-11>li:nth-of-type(1n){clear:none}.small-block-grid-11>li:nth-of-type(11n+1){clear:both}.small-block-grid-12>li{list-style:none;width:8.33333333%}.small-block-grid-12>li:nth-of-type(1n){clear:none}.small-block-grid-12>li:nth-of-type(12n+1){clear:both}}@media only screen and (min-width:40.0625em){.medium-block-grid-1>li{list-style:none;width:100%}.medium-block-grid-1>li:nth-of-type(1n){clear:none}.medium-block-grid-1>li:nth-of-type(1n+1){clear:both}.medium-block-grid-2>li{list-style:none;width:50%}.medium-block-grid-2>li:nth-of-type(1n){clear:none}.medium-block-grid-2>li:nth-of-type(2n+1){clear:both}.medium-block-grid-3>li{list-style:none;width:33.33333333%}.medium-block-grid-3>li:nth-of-type(1n){clear:none}.medium-block-grid-3>li:nth-of-type(3n+1){clear:both}.medium-block-grid-4>li{list-style:none;width:25%}.medium-block-grid-4>li:nth-of-type(1n){clear:none}.medium-block-grid-4>li:nth-of-type(4n+1){clear:both}.medium-block-grid-5>li{list-style:none;width:20%}.medium-block-grid-5>li:nth-of-type(1n){clear:none}.medium-block-grid-5>li:nth-of-type(5n+1){clear:both}.medium-block-grid-6>li{list-style:none;width:16.66666667%}.medium-block-grid-6>li:nth-of-type(1n){clear:none}.medium-block-grid-6>li:nth-of-type(6n+1){clear:both}.medium-block-grid-7>li{list-style:none;width:14.28571429%}.medium-block-grid-7>li:nth-of-type(1n){clear:none}.medium-block-grid-7>li:nth-of-type(7n+1){clear:both}.medium-block-grid-8>li{list-style:none;width:12.5%}.medium-block-grid-8>li:nth-of-type(1n){clear:none}.medium-block-grid-8>li:nth-of-type(8n+1){clear:both}.medium-block-grid-9>li{list-style:none;width:11.11111111%}.medium-block-grid-9>li:nth-of-type(1n){clear:none}.medium-block-grid-9>li:nth-of-type(9n+1){clear:both}.medium-block-grid-10>li{list-style:none;width:10%}.medium-block-grid-10>li:nth-of-type(1n){clear:none}.medium-block-grid-10>li:nth-of-type(10n+1){clear:both}.medium-block-grid-11>li{list-style:none;width:9.09090909%}.medium-block-grid-11>li:nth-of-type(1n){clear:none}.medium-block-grid-11>li:nth-of-type(11n+1){clear:both}.medium-block-grid-12>li{list-style:none;width:8.33333333%}.medium-block-grid-12>li:nth-of-type(1n){clear:none}.medium-block-grid-12>li:nth-of-type(12n+1){clear:both}}@media only screen and (min-width:64.0625em){.large-block-grid-1>li{list-style:none;width:100%}.large-block-grid-1>li:nth-of-type(1n){clear:none}.large-block-grid-1>li:nth-of-type(1n+1){clear:both}.large-block-grid-2>li{list-style:none;width:50%}.large-block-grid-2>li:nth-of-type(1n){clear:none}.large-block-grid-2>li:nth-of-type(2n+1){clear:both}.large-block-grid-3>li{list-style:none;width:33.33333333%}.large-block-grid-3>li:nth-of-type(1n){clear:none}.large-block-grid-3>li:nth-of-type(3n+1){clear:both}.large-block-grid-4>li{list-style:none;width:25%}.large-block-grid-4>li:nth-of-type(1n){clear:none}.large-block-grid-4>li:nth-of-type(4n+1){clear:both}.large-block-grid-5>li{list-style:none;width:20%}.large-block-grid-5>li:nth-of-type(1n){clear:none}.large-block-grid-5>li:nth-of-type(5n+1){clear:both}.large-block-grid-6>li{list-style:none;width:16.66666667%}.large-block-grid-6>li:nth-of-type(1n){clear:none}.large-block-grid-6>li:nth-of-type(6n+1){clear:both}.large-block-grid-7>li{list-style:none;width:14.28571429%}.large-block-grid-7>li:nth-of-type(1n){clear:none}.large-block-grid-7>li:nth-of-type(7n+1){clear:both}.large-block-grid-8>li{list-style:none;width:12.5%}.large-block-grid-8>li:nth-of-type(1n){clear:none}.large-block-grid-8>li:nth-of-type(8n+1){clear:both}.large-block-grid-9>li{list-style:none;width:11.11111111%}.large-block-grid-9>li:nth-of-type(1n){clear:none}.large-block-grid-9>li:nth-of-type(9n+1){clear:both}.large-block-grid-10>li{list-style:none;width:10%}.large-block-grid-10>li:nth-of-type(1n){clear:none}.large-block-grid-10>li:nth-of-type(10n+1){clear:both}.large-block-grid-11>li{list-style:none;width:9.09090909%}.large-block-grid-11>li:nth-of-type(1n){clear:none}.large-block-grid-11>li:nth-of-type(11n+1){clear:both}.large-block-grid-12>li{list-style:none;width:8.33333333%}.large-block-grid-12>li:nth-of-type(1n){clear:none}.large-block-grid-12>li:nth-of-type(12n+1){clear:both}}button,.button{-webkit-appearance:none;-moz-appearance:none;border-radius:0;border-style:solid;border-width:0;cursor:pointer;font-family:helvetica neue,Helvetica,Roboto,Arial,sans-serif;font-weight:400;line-height:normal;margin:0 0 1.25rem;position:relative;text-align:center;text-decoration:none;display:inline-block;padding:1rem 2rem 1.0625rem;font-size:1rem;background-color:#008cba;border-color:#007095;color:#fff;transition:background-color 300ms ease-out}button:hover,button:focus,.button:hover,.button:focus{background-color:#007095}button:hover,button:focus,.button:hover,.button:focus{color:#fff}button.secondary,.button.secondary{background-color:#e7e7e7;border-color:#b9b9b9;color:#333}button.secondary:hover,button.secondary:focus,.button.secondary:hover,.button.secondary:focus{background-color:#b9b9b9}button.secondary:hover,button.secondary:focus,.button.secondary:hover,.button.secondary:focus{color:#333}button.success,.button.success{background-color:#43ac6a;border-color:#368a55;color:#fff}button.success:hover,button.success:focus,.button.success:hover,.button.success:focus{background-color:#368a55}button.success:hover,button.success:focus,.button.success:hover,.button.success:focus{color:#fff}button.alert,.button.alert{background-color:#f04124;border-color:#cf2a0e;color:#fff}button.alert:hover,button.alert:focus,.button.alert:hover,.button.alert:focus{background-color:#cf2a0e}button.alert:hover,button.alert:focus,.button.alert:hover,.button.alert:focus{color:#fff}button.warning,.button.warning{background-color:#f08a24;border-color:#cf6e0e;color:#fff}button.warning:hover,button.warning:focus,.button.warning:hover,.button.warning:focus{background-color:#cf6e0e}button.warning:hover,button.warning:focus,.button.warning:hover,.button.warning:focus{color:#fff}button.info,.button.info{background-color:#a0d3e8;border-color:#61b6d9;color:#333}button.info:hover,button.info:focus,.button.info:hover,.button.info:focus{background-color:#61b6d9}button.info:hover,button.info:focus,.button.info:hover,.button.info:focus{color:#fff}button.large,.button.large{padding:1.125rem 2.25rem 1.1875rem;font-size:1.25rem}button.small,.button.small{padding:.875rem 1.75rem .9375rem;font-size:.8125rem}button.tiny,.button.tiny{padding:.625rem 1.25rem .6875rem;font-size:.6875rem}button.expand,.button.expand{padding:1rem 2rem 1.0625rem;font-size:1rem;padding-bottom:1.0625rem;padding-top:1rem;padding-left:1rem;padding-right:1rem;width:100%}button.left-align,.button.left-align{text-align:left;text-indent:.75rem}button.right-align,.button.right-align{text-align:right;padding-right:.75rem}button.radius,.button.radius{border-radius:3px}button.round,.button.round{border-radius:1000px}button.disabled,button[disabled],.button.disabled,.button[disabled]{background-color:#008cba;border-color:#007095;color:#fff;box-shadow:none;cursor:default;opacity:.7}button.disabled:hover,button.disabled:focus,button[disabled]:hover,button[disabled]:focus,.button.disabled:hover,.button.disabled:focus,.button[disabled]:hover,.button[disabled]:focus{background-color:#007095}button.disabled:hover,button.disabled:focus,button[disabled]:hover,button[disabled]:focus,.button.disabled:hover,.button.disabled:focus,.button[disabled]:hover,.button[disabled]:focus{color:#fff}button.disabled:hover,button.disabled:focus,button[disabled]:hover,button[disabled]:focus,.button.disabled:hover,.button.disabled:focus,.button[disabled]:hover,.button[disabled]:focus{background-color:#008cba}button.disabled.secondary,button.secondary[disabled],.button.disabled.secondary,.button.secondary[disabled]{background-color:#e7e7e7;border-color:#b9b9b9;color:#333;box-shadow:none;cursor:default;opacity:.7}button.disabled.secondary:hover,button.disabled.secondary:focus,button.secondary[disabled]:hover,button.secondary[disabled]:focus,.button.disabled.secondary:hover,.button.disabled.secondary:focus,.button.secondary[disabled]:hover,.button.secondary[disabled]:focus{background-color:#b9b9b9}button.disabled.secondary:hover,button.disabled.secondary:focus,button.secondary[disabled]:hover,button.secondary[disabled]:focus,.button.disabled.secondary:hover,.button.disabled.secondary:focus,.button.secondary[disabled]:hover,.button.secondary[disabled]:focus{color:#333}button.disabled.secondary:hover,button.disabled.secondary:focus,button.secondary[disabled]:hover,button.secondary[disabled]:focus,.button.disabled.secondary:hover,.button.disabled.secondary:focus,.button.secondary[disabled]:hover,.button.secondary[disabled]:focus{background-color:#e7e7e7}button.disabled.success,button.success[disabled],.button.disabled.success,.button.success[disabled]{background-color:#43ac6a;border-color:#368a55;color:#fff;box-shadow:none;cursor:default;opacity:.7}button.disabled.success:hover,button.disabled.success:focus,button.success[disabled]:hover,button.success[disabled]:focus,.button.disabled.success:hover,.button.disabled.success:focus,.button.success[disabled]:hover,.button.success[disabled]:focus{background-color:#368a55}button.disabled.success:hover,button.disabled.success:focus,button.success[disabled]:hover,button.success[disabled]:focus,.button.disabled.success:hover,.button.disabled.success:focus,.button.success[disabled]:hover,.button.success[disabled]:focus{color:#fff}button.disabled.success:hover,button.disabled.success:focus,button.success[disabled]:hover,button.success[disabled]:focus,.button.disabled.success:hover,.button.disabled.success:focus,.button.success[disabled]:hover,.button.success[disabled]:focus{background-color:#43ac6a}button.disabled.alert,button.alert[disabled],.button.disabled.alert,.button.alert[disabled]{background-color:#f04124;border-color:#cf2a0e;color:#fff;box-shadow:none;cursor:default;opacity:.7}button.disabled.alert:hover,button.disabled.alert:focus,button.alert[disabled]:hover,button.alert[disabled]:focus,.button.disabled.alert:hover,.button.disabled.alert:focus,.button.alert[disabled]:hover,.button.alert[disabled]:focus{background-color:#cf2a0e}button.disabled.alert:hover,button.disabled.alert:focus,button.alert[disabled]:hover,button.alert[disabled]:focus,.button.disabled.alert:hover,.button.disabled.alert:focus,.button.alert[disabled]:hover,.button.alert[disabled]:focus{color:#fff}button.disabled.alert:hover,button.disabled.alert:focus,button.alert[disabled]:hover,button.alert[disabled]:focus,.button.disabled.alert:hover,.button.disabled.alert:focus,.button.alert[disabled]:hover,.button.alert[disabled]:focus{background-color:#f04124}button.disabled.warning,button.warning[disabled],.button.disabled.warning,.button.warning[disabled]{background-color:#f08a24;border-color:#cf6e0e;color:#fff;box-shadow:none;cursor:default;opacity:.7}button.disabled.warning:hover,button.disabled.warning:focus,button.warning[disabled]:hover,button.warning[disabled]:focus,.button.disabled.warning:hover,.button.disabled.warning:focus,.button.warning[disabled]:hover,.button.warning[disabled]:focus{background-color:#cf6e0e}button.disabled.warning:hover,button.disabled.warning:focus,button.warning[disabled]:hover,button.warning[disabled]:focus,.button.disabled.warning:hover,.button.disabled.warning:focus,.button.warning[disabled]:hover,.button.warning[disabled]:focus{color:#fff}button.disabled.warning:hover,button.disabled.warning:focus,button.warning[disabled]:hover,button.warning[disabled]:focus,.button.disabled.warning:hover,.button.disabled.warning:focus,.button.warning[disabled]:hover,.button.warning[disabled]:focus{background-color:#f08a24}button.disabled.info,button.info[disabled],.button.disabled.info,.button.info[disabled]{background-color:#a0d3e8;border-color:#61b6d9;color:#333;box-shadow:none;cursor:default;opacity:.7}button.disabled.info:hover,button.disabled.info:focus,button.info[disabled]:hover,button.info[disabled]:focus,.button.disabled.info:hover,.button.disabled.info:focus,.button.info[disabled]:hover,.button.info[disabled]:focus{background-color:#61b6d9}button.disabled.info:hover,button.disabled.info:focus,button.info[disabled]:hover,button.info[disabled]:focus,.button.disabled.info:hover,.button.disabled.info:focus,.button.info[disabled]:hover,.button.info[disabled]:focus{color:#fff}button.disabled.info:hover,button.disabled.info:focus,button.info[disabled]:hover,button.info[disabled]:focus,.button.disabled.info:hover,.button.disabled.info:focus,.button.info[disabled]:hover,.button.info[disabled]:focus{background-color:#a0d3e8}button::-moz-focus-inner{border:0;padding:0}@media only screen and (min-width:40.0625em){button,.button{display:inline-block}}.inline-list{list-style:none;margin-top:0;margin-bottom:1.0625rem;margin-left:-1.375rem;margin-right:0;overflow:hidden;padding:0}.inline-list>li{display:block;float:left;list-style:none;margin-left:1.375rem}.inline-list>li>*{display:block}form{margin:0 0 1rem}form .row .row{margin:0 -.5rem}form .row .row .column,form .row .row .columns{padding:0 .5rem}form .row .row.collapse{margin:0}form .row .row.collapse .column,form .row .row.collapse .columns{padding:0}form .row .row.collapse input{-webkit-border-bottom-right-radius:0;-webkit-border-top-right-radius:0;border-bottom-right-radius:0;border-top-right-radius:0}form .row input.column,form .row input.columns,form .row textarea.column,form .row textarea.columns{padding-left:.5rem}label{color:#4d4d4d;cursor:pointer;display:block;font-size:.875rem;font-weight:400;line-height:1.5;margin-bottom:0}label.right{float:none!important;text-align:right}label.inline{margin:0 0 1rem;padding:.5625rem 0}label small{text-transform:capitalize;color:#676767}.prefix,.postfix{border-style:solid;border-width:1px;display:block;font-size:.875rem;height:2.3125rem;line-height:2.3125rem;overflow:visible;padding-bottom:0;padding-top:0;position:relative;text-align:center;width:100%;z-index:2}.postfix.button{border:none;padding-left:0;padding-right:0;padding-bottom:0;padding-top:0;text-align:center}.prefix.button{border:none;padding-left:0;padding-right:0;padding-bottom:0;padding-top:0;text-align:center}.prefix.button.radius{border-radius:0;-webkit-border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-bottom-left-radius:3px;border-top-left-radius:3px}.postfix.button.radius{border-radius:0;-webkit-border-bottom-right-radius:3px;-webkit-border-top-right-radius:3px;border-bottom-right-radius:3px;border-top-right-radius:3px}.prefix.button.round{border-radius:0;-webkit-border-bottom-left-radius:1000px;-webkit-border-top-left-radius:1000px;border-bottom-left-radius:1000px;border-top-left-radius:1000px}.postfix.button.round{border-radius:0;-webkit-border-bottom-right-radius:1000px;-webkit-border-top-right-radius:1000px;border-bottom-right-radius:1000px;border-top-right-radius:1000px}span.prefix,label.prefix{background:#f2f2f2;border-right:none;color:#333;border-color:#ccc}span.postfix,label.postfix{background:#f2f2f2;border-left:none;color:#333;border-color:#ccc}input:not([type]),input[type=text],input[type=password],input[type=date],input[type=datetime],input[type=datetime-local],input[type=month],input[type=week],input[type=email],input[type=number],input[type=search],input[type=tel],input[type=time],input[type=url],input[type=color],textarea{-webkit-appearance:none;-moz-appearance:none;border-radius:0;background-color:#fff;border-style:solid;border-width:1px;border-color:#ccc;box-shadow:inset 0 1px 2px rgba(0,0,0,.1);color:rgba(0,0,0,.75);display:block;font-family:inherit;font-size:.875rem;height:2.3125rem;margin:0 0 1rem;padding:.5rem;width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:border-color .15s linear,background .15s linear;-moz-transition:border-color .15s linear,background .15s linear;-ms-transition:border-color .15s linear,background .15s linear;-o-transition:border-color .15s linear,background .15s linear;transition:border-color .15s linear,background .15s linear}input:not([type]):focus,input[type=text]:focus,input[type=password]:focus,input[type=date]:focus,input[type=datetime]:focus,input[type=datetime-local]:focus,input[type=month]:focus,input[type=week]:focus,input[type=email]:focus,input[type=number]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=time]:focus,input[type=url]:focus,input[type=color]:focus,textarea:focus{background:#fafafa;border-color:#999;outline:none}input:not([type]):disabled,input[type=text]:disabled,input[type=password]:disabled,input[type=date]:disabled,input[type=datetime]:disabled,input[type=datetime-local]:disabled,input[type=month]:disabled,input[type=week]:disabled,input[type=email]:disabled,input[type=number]:disabled,input[type=search]:disabled,input[type=tel]:disabled,input[type=time]:disabled,input[type=url]:disabled,input[type=color]:disabled,textarea:disabled{background-color:#ddd;cursor:default}input[disabled]:not([type]),input[readonly]:not([type]),fieldset[disabled] input:not([type]),input[type=text][disabled],input[type=text][readonly],fieldset[disabled] input[type=text],input[type=password][disabled],input[type=password][readonly],fieldset[disabled] input[type=password],input[type=date][disabled],input[type=date][readonly],fieldset[disabled] input[type=date],input[type=datetime][disabled],input[type=datetime][readonly],fieldset[disabled] input[type=datetime],input[type=datetime-local][disabled],input[type=datetime-local][readonly],fieldset[disabled] input[type=datetime-local],input[type=month][disabled],input[type=month][readonly],fieldset[disabled] input[type=month],input[type=week][disabled],input[type=week][readonly],fieldset[disabled] input[type=week],input[type=email][disabled],input[type=email][readonly],fieldset[disabled] input[type=email],input[type=number][disabled],input[type=number][readonly],fieldset[disabled] input[type=number],input[type=search][disabled],input[type=search][readonly],fieldset[disabled] input[type=search],input[type=tel][disabled],input[type=tel][readonly],fieldset[disabled] input[type=tel],input[type=time][disabled],input[type=time][readonly],fieldset[disabled] input[type=time],input[type=url][disabled],input[type=url][readonly],fieldset[disabled] input[type=url],input[type=color][disabled],input[type=color][readonly],fieldset[disabled] input[type=color],textarea[disabled],textarea[readonly],fieldset[disabled] textarea{background-color:#ddd;cursor:default}input.radius:not([type]),input.radius[type=text],input.radius[type=password],input.radius[type=date],input.radius[type=datetime],input.radius[type=datetime-local],input.radius[type=month],input.radius[type=week],input.radius[type=email],input.radius[type=number],input.radius[type=search],input.radius[type=tel],input.radius[type=time],input.radius[type=url],input.radius[type=color],textarea.radius{border-radius:3px}form .row .prefix-radius.row.collapse input,form .row .prefix-radius.row.collapse textarea,form .row .prefix-radius.row.collapse select,form .row .prefix-radius.row.collapse button{border-radius:0;-webkit-border-bottom-right-radius:3px;-webkit-border-top-right-radius:3px;border-bottom-right-radius:3px;border-top-right-radius:3px}form .row .prefix-radius.row.collapse .prefix{border-radius:0;-webkit-border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-bottom-left-radius:3px;border-top-left-radius:3px}form .row .postfix-radius.row.collapse input,form .row .postfix-radius.row.collapse textarea,form .row .postfix-radius.row.collapse select,form .row .postfix-radius.row.collapse button{border-radius:0;-webkit-border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-bottom-left-radius:3px;border-top-left-radius:3px}form .row .postfix-radius.row.collapse .postfix{border-radius:0;-webkit-border-bottom-right-radius:3px;-webkit-border-top-right-radius:3px;border-bottom-right-radius:3px;border-top-right-radius:3px}form .row .prefix-round.row.collapse input,form .row .prefix-round.row.collapse textarea,form .row .prefix-round.row.collapse select,form .row .prefix-round.row.collapse button{border-radius:0;-webkit-border-bottom-right-radius:1000px;-webkit-border-top-right-radius:1000px;border-bottom-right-radius:1000px;border-top-right-radius:1000px}form .row .prefix-round.row.collapse .prefix{border-radius:0;-webkit-border-bottom-left-radius:1000px;-webkit-border-top-left-radius:1000px;border-bottom-left-radius:1000px;border-top-left-radius:1000px}form .row .postfix-round.row.collapse input,form .row .postfix-round.row.collapse textarea,form .row .postfix-round.row.collapse select,form .row .postfix-round.row.collapse button{border-radius:0;-webkit-border-bottom-left-radius:1000px;-webkit-border-top-left-radius:1000px;border-bottom-left-radius:1000px;border-top-left-radius:1000px}form .row .postfix-round.row.collapse .postfix{border-radius:0;-webkit-border-bottom-right-radius:1000px;-webkit-border-top-right-radius:1000px;border-bottom-right-radius:1000px;border-top-right-radius:1000px}input[type=submit]{-webkit-appearance:none;-moz-appearance:none;border-radius:0}textarea[rows]{height:auto}textarea{max-width:100%}::-webkit-input-placeholder{color:#666}:-moz-placeholder{color:#666}::-moz-placeholder{color:#666}:-ms-input-placeholder{color:#666}select{-webkit-appearance:none!important;-moz-appearance:none!important;background-color:#fafafa;border-radius:0;background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHg9IjEyIiB3aWR0aD0iMjQiIGhlaWdodD0iMyIgdmlld0JveD0iMCAwIDYgMyIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgNiAzIj48cG9seWdvbiBwb2ludHM9IjUuOTkyLDAgMi45OTIsMyAtMC4wMDgsMCIvPjwvc3ZnPg==);background-position:100%;background-repeat:no-repeat;border-style:solid;border-width:1px;border-color:#ccc;color:rgba(0,0,0,.75);font-family:inherit;font-size:.875rem;line-height:normal;padding:.5rem;border-radius:0;height:2.3125rem}select::-ms-expand{display:none}select.radius{border-radius:3px}select:focus{background-color:#f3f3f3;border-color:#999}select:disabled{background-color:#ddd;cursor:default}select[multiple]{height:auto}input[type=file],input[type=checkbox],input[type=radio],select{margin:0 0 1rem}input[type=checkbox]+label,input[type=radio]+label{display:inline-block;margin-left:.5rem;margin-right:1rem;margin-bottom:0;vertical-align:baseline}input[type=file]{width:100%}fieldset{border:1px solid #ddd;margin:1.125rem 0;padding:1.25rem}fieldset legend{font-weight:700;margin:0;margin-left:-.1875rem;padding:0 .1875rem}[data-abide] .error small.error,[data-abide] .error span.error,[data-abide] span.error,[data-abide] small.error{display:block;font-size:.75rem;font-style:italic;font-weight:400;margin-bottom:1rem;margin-top:-1px;padding:.375rem .5625rem .5625rem;background:#f04124;color:#fff}[data-abide] span.error,[data-abide] small.error{display:none}span.error,small.error{display:block;font-size:.75rem;font-style:italic;font-weight:400;margin-bottom:1rem;margin-top:-1px;padding:.375rem .5625rem .5625rem;background:#f04124;color:#fff}.error input,.error textarea,.error select{margin-bottom:0}.error input[type=checkbox],.error input[type=radio]{margin-bottom:1rem}.error label,.error label.error{color:#f04124}.error small.error{display:block;font-size:.75rem;font-style:italic;font-weight:400;margin-bottom:1rem;margin-top:-1px;padding:.375rem .5625rem .5625rem;background:#f04124;color:#fff}.error>label>small{background:0 0;color:#676767;display:inline;font-size:60%;font-style:normal;margin:0;padding:0;text-transform:capitalize}.error span.error-message{display:block}input.error,textarea.error,select.error{margin-bottom:0}label.error{color:#f04124}meta.foundation-mq-topbar{font-family:"/only screen and (min-width:40.0625em)/";width:40.0625em}.contain-to-grid{width:100%;background:#333}.contain-to-grid .top-bar{margin-bottom:0}.fixed{position:fixed;top:0;width:100%;z-index:99;left:0}.fixed.expanded:not(.top-bar){height:auto;max-height:100%;overflow-y:auto;width:100%}.fixed.expanded:not(.top-bar) .title-area{position:fixed;width:100%;z-index:99}.fixed.expanded:not(.top-bar) .top-bar-section{margin-top:2.8125rem;z-index:98}.top-bar{background:#333;height:2.8125rem;line-height:2.8125rem;margin-bottom:0;overflow:hidden;position:relative}.top-bar ul{list-style:none;margin-bottom:0}.top-bar .row{max-width:none}.top-bar form,.top-bar input,.top-bar select{margin-bottom:0}.top-bar input,.top-bar select{font-size:.75rem;height:1.75rem;padding-bottom:.35rem;padding-top:.35rem}.top-bar .button,.top-bar button{font-size:.75rem;margin-bottom:0;padding-bottom:.4125rem;padding-top:.4125rem}@media only screen and (max-width:40em){.top-bar .button,.top-bar button{position:relative;top:-1px}}.top-bar .title-area{margin:0;position:relative}.top-bar .name{font-size:16px;height:2.8125rem;margin:0}.top-bar .name h1,.top-bar .name h2,.top-bar .name h3,.top-bar .name h4,.top-bar .name p,.top-bar .name span{font-size:1.0625rem;line-height:2.8125rem;margin:0}.top-bar .name h1 a,.top-bar .name h2 a,.top-bar .name h3 a,.top-bar .name h4 a,.top-bar .name p a,.top-bar .name span a{color:#fff;display:block;font-weight:400;padding:0 .9375rem;width:75%}.top-bar .toggle-topbar{position:absolute;right:0;top:0}.top-bar .toggle-topbar a{color:#fff;display:block;font-size:.8125rem;font-weight:700;height:2.8125rem;line-height:2.8125rem;padding:0 .9375rem;position:relative;text-transform:uppercase}.top-bar .toggle-topbar.menu-icon{margin-top:-16px;top:50%}.top-bar .toggle-topbar.menu-icon a{color:#fff;height:34px;line-height:33px;padding:0 2.5rem 0 .9375rem;position:relative}.top-bar .toggle-topbar.menu-icon a span::after{content:"";display:block;height:0;position:absolute;margin-top:-8px;top:50%;right:.9375rem;box-shadow:0 0 0 1px #fff,0 7px 0 1px #fff,0 14px 0 1px #fff;width:16px}.top-bar .toggle-topbar.menu-icon a span:hover:after{box-shadow:0 0 0 1px "",0 7px 0 1px "",0 14px 0 1px ""}.top-bar.expanded{background:0 0;height:auto}.top-bar.expanded .title-area{background:#333}.top-bar.expanded .toggle-topbar a{color:#888}.top-bar.expanded .toggle-topbar a span::after{box-shadow:0 0 0 1px #888,0 7px 0 1px #888,0 14px 0 1px #888}@media screen and (-webkit-min-device-pixel-ratio:0){.top-bar.expanded .top-bar-section .has-dropdown.moved>.dropdown,.top-bar.expanded .top-bar-section .dropdown{clip:initial}.top-bar.expanded .top-bar-section .has-dropdown:not(.moved)>ul{padding:0}}.top-bar-section{left:0;position:relative;width:auto;transition:left 300ms ease-out}.top-bar-section ul{display:block;font-size:16px;height:auto;margin:0;padding:0;width:100%}.top-bar-section .divider,.top-bar-section [role=separator]{border-top:solid 1px #1a1a1a;clear:both;height:1px;width:100%}.top-bar-section ul li{background:#333}.top-bar-section ul li>a{color:#fff;display:block;font-family:helvetica neue,Helvetica,Roboto,Arial,sans-serif;font-size:.8125rem;font-weight:400;padding-left:.9375rem;padding:12px 0 12px .9375rem;text-transform:none;width:100%}.top-bar-section ul li>a.button{font-size:.8125rem;padding-left:.9375rem;padding-right:.9375rem;background-color:#008cba;border-color:#007095;color:#fff}.top-bar-section ul li>a.button:hover,.top-bar-section ul li>a.button:focus{background-color:#007095}.top-bar-section ul li>a.button:hover,.top-bar-section ul li>a.button:focus{color:#fff}.top-bar-section ul li>a.button.secondary{background-color:#e7e7e7;border-color:#b9b9b9;color:#333}.top-bar-section ul li>a.button.secondary:hover,.top-bar-section ul li>a.button.secondary:focus{background-color:#b9b9b9}.top-bar-section ul li>a.button.secondary:hover,.top-bar-section ul li>a.button.secondary:focus{color:#333}.top-bar-section ul li>a.button.success{background-color:#43ac6a;border-color:#368a55;color:#fff}.top-bar-section ul li>a.button.success:hover,.top-bar-section ul li>a.button.success:focus{background-color:#368a55}.top-bar-section ul li>a.button.success:hover,.top-bar-section ul li>a.button.success:focus{color:#fff}.top-bar-section ul li>a.button.alert{background-color:#f04124;border-color:#cf2a0e;color:#fff}.top-bar-section ul li>a.button.alert:hover,.top-bar-section ul li>a.button.alert:focus{background-color:#cf2a0e}.top-bar-section ul li>a.button.alert:hover,.top-bar-section ul li>a.button.alert:focus{color:#fff}.top-bar-section ul li>a.button.warning{background-color:#f08a24;border-color:#cf6e0e;color:#fff}.top-bar-section ul li>a.button.warning:hover,.top-bar-section ul li>a.button.warning:focus{background-color:#cf6e0e}.top-bar-section ul li>a.button.warning:hover,.top-bar-section ul li>a.button.warning:focus{color:#fff}.top-bar-section ul li>a.button.info{background-color:#a0d3e8;border-color:#61b6d9;color:#333}.top-bar-section ul li>a.button.info:hover,.top-bar-section ul li>a.button.info:focus{background-color:#61b6d9}.top-bar-section ul li>a.button.info:hover,.top-bar-section ul li>a.button.info:focus{color:#fff}.top-bar-section ul li>button{font-size:.8125rem;padding-left:.9375rem;padding-right:.9375rem;background-color:#008cba;border-color:#007095;color:#fff}.top-bar-section ul li>button:hover,.top-bar-section ul li>button:focus{background-color:#007095}.top-bar-section ul li>button:hover,.top-bar-section ul li>button:focus{color:#fff}.top-bar-section ul li>button.secondary{background-color:#e7e7e7;border-color:#b9b9b9;color:#333}.top-bar-section ul li>button.secondary:hover,.top-bar-section ul li>button.secondary:focus{background-color:#b9b9b9}.top-bar-section ul li>button.secondary:hover,.top-bar-section ul li>button.secondary:focus{color:#333}.top-bar-section ul li>button.success{background-color:#43ac6a;border-color:#368a55;color:#fff}.top-bar-section ul li>button.success:hover,.top-bar-section ul li>button.success:focus{background-color:#368a55}.top-bar-section ul li>button.success:hover,.top-bar-section ul li>button.success:focus{color:#fff}.top-bar-section ul li>button.alert{background-color:#f04124;border-color:#cf2a0e;color:#fff}.top-bar-section ul li>button.alert:hover,.top-bar-section ul li>button.alert:focus{background-color:#cf2a0e}.top-bar-section ul li>button.alert:hover,.top-bar-section ul li>button.alert:focus{color:#fff}.top-bar-section ul li>button.warning{background-color:#f08a24;border-color:#cf6e0e;color:#fff}.top-bar-section ul li>button.warning:hover,.top-bar-section ul li>button.warning:focus{background-color:#cf6e0e}.top-bar-section ul li>button.warning:hover,.top-bar-section ul li>button.warning:focus{color:#fff}.top-bar-section ul li>button.info{background-color:#a0d3e8;border-color:#61b6d9;color:#333}.top-bar-section ul li>button.info:hover,.top-bar-section ul li>button.info:focus{background-color:#61b6d9}.top-bar-section ul li>button.info:hover,.top-bar-section ul li>button.info:focus{color:#fff}.top-bar-section ul li:hover:not(.has-form)>a{background-color:#555;color:#fff;background:#222}.top-bar-section ul li.active>a{background:#008cba;color:#fff}.top-bar-section ul li.active>a:hover{background:#0078a0;color:#fff}.top-bar-section .has-form{padding:.9375rem}.top-bar-section .has-dropdown{position:relative}.top-bar-section .has-dropdown>a:after{border:inset 5px;content:"";display:block;height:0;width:0;border-color:transparent transparent transparent rgba(255,255,255,.4);border-left-style:solid;margin-right:.9375rem;margin-top:-4.5px;position:absolute;top:50%;right:0}.top-bar-section .has-dropdown.moved{position:static}.top-bar-section .has-dropdown.moved>.dropdown{position:static!important;height:auto;width:auto;overflow:visible;clip:auto;display:block;position:absolute!important;width:100%}.top-bar-section .has-dropdown.moved>a:after{display:none}.top-bar-section .dropdown{clip:rect(1px,1px,1px,1px);height:1px;overflow:hidden;position:absolute!important;width:1px;display:block;padding:0;position:absolute;top:0;z-index:99;left:100%}.top-bar-section .dropdown li{height:auto;width:100%}.top-bar-section .dropdown li a{font-weight:400;padding:8px .9375rem}.top-bar-section .dropdown li a.parent-link{font-weight:400}.top-bar-section .dropdown li.title h5,.top-bar-section .dropdown li.parent-link{margin-bottom:0;margin-top:0;font-size:1.125rem}.top-bar-section .dropdown li.title h5 a,.top-bar-section .dropdown li.parent-link a{color:#fff;display:block}.top-bar-section .dropdown li.title h5 a:hover,.top-bar-section .dropdown li.parent-link a:hover{background:0 0}.top-bar-section .dropdown li.has-form{padding:8px .9375rem}.top-bar-section .dropdown li .button,.top-bar-section .dropdown li button{top:auto}.top-bar-section .dropdown label{color:#777;font-size:.625rem;font-weight:700;margin-bottom:0;padding:8px .9375rem 2px;text-transform:uppercase}.js-generated{display:block}@media only screen and (min-width:40.0625em){.top-bar{background:#333;overflow:visible}.top-bar:before,.top-bar:after{content:" ";display:table}.top-bar:after{clear:both}.top-bar .toggle-topbar{display:none}.top-bar .title-area{float:left}.top-bar .name h1 a,.top-bar .name h2 a,.top-bar .name h3 a,.top-bar .name h4 a,.top-bar .name h5 a,.top-bar .name h6 a{width:auto}.top-bar input,.top-bar select,.top-bar .button,.top-bar button{font-size:.875rem;height:1.75rem;position:relative;top:.53125rem}.top-bar .has-form>.button,.top-bar .has-form>button{font-size:.875rem;height:1.75rem;position:relative;top:.53125rem}.top-bar.expanded{background:#333}.contain-to-grid .top-bar{margin:0 auto;margin-bottom:0;max-width:62.5rem}.top-bar-section{transition:none 0 0;left:0!important}.top-bar-section ul{display:inline;height:auto!important;width:auto}.top-bar-section ul li{float:left}.top-bar-section ul li .js-generated{display:none}.top-bar-section li.hover>a:not(.button){background-color:#555;background:#222;color:#fff}.top-bar-section li:not(.has-form) a:not(.button){background:#333;line-height:2.8125rem;padding:0 .9375rem}.top-bar-section li:not(.has-form) a:not(.button):hover{background-color:#555;background:#222}.top-bar-section li.active:not(.has-form) a:not(.button){background:#008cba;color:#fff;line-height:2.8125rem;padding:0 .9375rem}.top-bar-section li.active:not(.has-form) a:not(.button):hover{background:#0078a0;color:#fff}.top-bar-section .has-dropdown>a{padding-right:2.1875rem!important}.top-bar-section .has-dropdown>a:after{border:inset 5px;content:"";display:block;height:0;width:0;border-color:rgba(255,255,255,.4)transparent transparent transparent;border-top-style:solid;margin-top:-2.5px;top:1.40625rem}.top-bar-section .has-dropdown.moved{position:relative}.top-bar-section .has-dropdown.moved>.dropdown{clip:rect(1px,1px,1px,1px);height:1px;overflow:hidden;position:absolute!important;width:1px;display:block}.top-bar-section .has-dropdown.hover>.dropdown,.top-bar-section .has-dropdown.not-click:hover>.dropdown{position:static!important;height:auto;width:auto;overflow:visible;clip:auto;display:block;position:absolute!important}.top-bar-section .has-dropdown>a:focus+.dropdown{position:static!important;height:auto;width:auto;overflow:visible;clip:auto;display:block;position:absolute!important}.top-bar-section .has-dropdown .dropdown li.has-dropdown>a:after{border:none;content:"\00bb";top:.1875rem;right:5px}.top-bar-section .dropdown{left:0;background:0 0;min-width:100%;top:auto}.top-bar-section .dropdown li a{background:#333;color:#fff;line-height:2.8125rem;padding:12px .9375rem;white-space:nowrap}.top-bar-section .dropdown li:not(.has-form):not(.active)>a:not(.button){background:#333;color:#fff}.top-bar-section .dropdown li:not(.has-form):not(.active):hover>a:not(.button){background-color:#555;color:#fff;background:#222}.top-bar-section .dropdown li label{background:#333;white-space:nowrap}.top-bar-section .dropdown li .dropdown{left:100%;top:0}.top-bar-section>ul>.divider,.top-bar-section>ul>[role=separator]{border-right:solid 1px #4e4e4e;border-bottom:none;border-top:none;clear:none;height:2.8125rem;width:0}.top-bar-section .has-form{background:#333;height:2.8125rem;padding:0 .9375rem}.top-bar-section .right li .dropdown{left:auto;right:0}.top-bar-section .right li .dropdown li .dropdown{right:100%}.top-bar-section .left li .dropdown{right:auto;left:0}.top-bar-section .left li .dropdown li .dropdown{left:100%}.no-js .top-bar-section ul li:hover>a{background-color:#555;background:#222;color:#fff}.no-js .top-bar-section ul li:active>a{background:#008cba;color:#fff}.no-js .top-bar-section .has-dropdown:hover>.dropdown{position:static!important;height:auto;width:auto;overflow:visible;clip:auto;display:block;position:absolute!important}.no-js .top-bar-section .has-dropdown>a:focus+.dropdown{position:static!important;height:auto;width:auto;overflow:visible;clip:auto;display:block;position:absolute!important}}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}.text-justify{text-align:justify!important}@media only screen and (max-width:40em){.small-only-text-left{text-align:left!important}.small-only-text-right{text-align:right!important}.small-only-text-center{text-align:center!important}.small-only-text-justify{text-align:justify!important}}@media only screen{.small-text-left{text-align:left!important}.small-text-right{text-align:right!important}.small-text-center{text-align:center!important}.small-text-justify{text-align:justify!important}}@media only screen and (min-width:40.0625em) and (max-width:64em){.medium-only-text-left{text-align:left!important}.medium-only-text-right{text-align:right!important}.medium-only-text-center{text-align:center!important}.medium-only-text-justify{text-align:justify!important}}@media only screen and (min-width:40.0625em){.medium-text-left{text-align:left!important}.medium-text-right{text-align:right!important}.medium-text-center{text-align:center!important}.medium-text-justify{text-align:justify!important}}@media only screen and (min-width:64.0625em) and (max-width:90em){.large-only-text-left{text-align:left!important}.large-only-text-right{text-align:right!important}.large-only-text-center{text-align:center!important}.large-only-text-justify{text-align:justify!important}}@media only screen and (min-width:64.0625em){.large-text-left{text-align:left!important}.large-text-right{text-align:right!important}.large-text-center{text-align:center!important}.large-text-justify{text-align:justify!important}}@media only screen and (min-width:90.0625em) and (max-width:120em){.xlarge-only-text-left{text-align:left!important}.xlarge-only-text-right{text-align:right!important}.xlarge-only-text-center{text-align:center!important}.xlarge-only-text-justify{text-align:justify!important}}@media only screen and (min-width:90.0625em){.xlarge-text-left{text-align:left!important}.xlarge-text-right{text-align:right!important}.xlarge-text-center{text-align:center!important}.xlarge-text-justify{text-align:justify!important}}@media only screen and (min-width:120.0625em) and (max-width:6249999.9375em){.xxlarge-only-text-left{text-align:left!important}.xxlarge-only-text-right{text-align:right!important}.xxlarge-only-text-center{text-align:center!important}.xxlarge-only-text-justify{text-align:justify!important}}@media only screen and (min-width:120.0625em){.xxlarge-text-left{text-align:left!important}.xxlarge-text-right{text-align:right!important}.xxlarge-text-center{text-align:center!important}.xxlarge-text-justify{text-align:justify!important}}div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,p,blockquote,th,td{margin:0;padding:0}a{color:#008cba;line-height:inherit;text-decoration:none}a:hover,a:focus{color:#0078a0}a img{border:none}p{font-family:inherit;font-size:1rem;font-weight:400;line-height:1.6;margin-bottom:1.25rem;text-rendering:optimizeLegibility}p.lead{font-size:1.21875rem;line-height:1.6}p aside{font-size:.875rem;font-style:italic;line-height:1.35}h1,h2,h3,h4,h5,h6{color:#222;font-family:helvetica neue,Helvetica,Roboto,Arial,sans-serif;font-style:normal;font-weight:400;line-height:1.4;margin-bottom:.5rem;margin-top:.2rem;text-rendering:optimizeLegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{color:#6f6f6f;font-size:60%;line-height:0}h1{font-size:2.125rem}h2{font-size:1.6875rem}h3{font-size:1.375rem}h4{font-size:1.125rem}h5{font-size:1.125rem}h6{font-size:1rem}.subheader{line-height:1.4;color:#6f6f6f;font-weight:400;margin-top:.2rem;margin-bottom:.5rem}hr{border:solid #ddd;border-width:1px 0 0;clear:both;height:0;margin:1.25rem 0 1.1875rem}em,i{font-style:italic;line-height:inherit}strong,b{font-weight:700;line-height:inherit}small{font-size:60%;line-height:inherit}code{background-color:#f8f8f8;border-color:#dfdfdf;border-style:solid;border-width:1px;color:#333;font-family:Consolas,liberation mono,Courier,monospace;font-weight:400;padding:.125rem .3125rem .0625rem}ul,ol,dl{font-family:inherit;font-size:1rem;line-height:1.6;list-style-position:outside;margin-bottom:1.25rem}ul{margin-left:1.1rem}ul li ul,ul li ol{margin-left:1.25rem;margin-bottom:0}ul.square li ul,ul.circle li ul,ul.disc li ul{list-style:inherit}ul.square{list-style-type:square;margin-left:1.1rem}ul.circle{list-style-type:circle;margin-left:1.1rem}ul.disc{list-style-type:disc;margin-left:1.1rem}ol{margin-left:1.4rem}ol li ul,ol li ol{margin-left:1.25rem;margin-bottom:0}.no-bullet{list-style-type:none;margin-left:0}.no-bullet li ul,.no-bullet li ol{margin-left:1.25rem;margin-bottom:0;list-style:none}dl dt{margin-bottom:.3rem;font-weight:700}dl dd{margin-bottom:.75rem}abbr,acronym{text-transform:uppercase;font-size:90%;color:#222;cursor:help}abbr{text-transform:none}abbr[title]{border-bottom:1px dotted #ddd}blockquote{margin:0 0 1.25rem;padding:.5625rem 1.25rem 0 1.1875rem;border-left:1px solid #ddd}blockquote cite{display:block;font-size:.8125rem;color:#555}blockquote cite:before{content:"\2014 \0020"}blockquote cite a,blockquote cite a:visited{color:#555}blockquote,blockquote p{line-height:1.6;color:#6f6f6f}.vcard{display:inline-block;margin:0 0 1.25rem;border:1px solid #ddd;padding:.625rem .75rem}.vcard li{margin:0;display:block}.vcard .fn{font-weight:700;font-size:.9375rem}.vevent .summary{font-weight:700}.vevent abbr{cursor:default;text-decoration:none;font-weight:700;border:none;padding:0 .0625rem}@media only screen and (min-width:40.0625em){h1,h2,h3,h4,h5,h6{line-height:1.4}h1{font-size:2.75rem}h2{font-size:2.3125rem}h3{font-size:1.6875rem}h4{font-size:1.4375rem}h5{font-size:1.125rem}h6{font-size:1rem}}@media print{*{background:0 0!important;color:#000!important;box-shadow:none!important;text-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href)")"}abbr[title]:after{content:" (" attr(title)")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.34in}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}}.off-canvas-wrap{-webkit-backface-visibility:hidden;position:relative;width:100%;height:100%;overflow-y:visible;overflow-x:clip}.off-canvas-wrap.move-right,.off-canvas-wrap.move-left,.off-canvas-wrap.move-bottom,.off-canvas-wrap.move-top{min-height:100%;-webkit-overflow-scrolling:touch}.inner-wrap{position:relative;width:100%;height:100%;-webkit-transition:-webkit-transform 500ms ease;-moz-transition:-moz-transform 500ms ease;-ms-transition:-ms-transform 500ms ease;-o-transition:-o-transform 500ms ease;transition:transform 500ms ease}.inner-wrap:before,.inner-wrap:after{content:" ";display:table}.inner-wrap:after{clear:both}.tab-bar{-webkit-backface-visibility:hidden;background:#333;color:#fff;height:2.8125rem;line-height:2.8125rem;position:relative}.tab-bar h1,.tab-bar h2,.tab-bar h3,.tab-bar h4,.tab-bar h5,.tab-bar h6{color:#fff;font-weight:700;line-height:2.8125rem;margin:0}.tab-bar h1,.tab-bar h2,.tab-bar h3,.tab-bar h4{font-size:1.125rem}.left-small{height:2.8125rem;position:absolute;top:0;width:2.8125rem;border-right:solid 1px #1a1a1a;left:0}.right-small{height:2.8125rem;position:absolute;top:0;width:2.8125rem;border-left:solid 1px #1a1a1a;right:0}.tab-bar-section{height:2.8125rem;padding:0 .625rem;position:absolute;text-align:center;top:0}.tab-bar-section.left{text-align:left}.tab-bar-section.right{text-align:right}.tab-bar-section.left{left:0;right:2.8125rem}.tab-bar-section.right{left:2.8125rem;right:0}.tab-bar-section.middle{left:2.8125rem;right:2.8125rem}.tab-bar .menu-icon{color:#fff;display:block;height:2.8125rem;padding:0;position:relative;text-indent:2.1875rem;transform:translate3d(0,0,0);width:2.8125rem}.tab-bar .menu-icon span::after{content:"";display:block;height:0;position:absolute;top:50%;margin-top:-.5rem;left:.90625rem;box-shadow:0 0 0 1px #fff,0 7px 0 1px #fff,0 14px 0 1px #fff;width:1rem}.tab-bar .menu-icon span:hover:after{box-shadow:0 0 0 1px #b3b3b3,0 7px 0 1px #b3b3b3,0 14px 0 1px #b3b3b3}.left-off-canvas-menu{-webkit-backface-visibility:hidden;background:#333;bottom:0;box-sizing:content-box;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;overflow-x:hidden;overflow-y:auto;position:absolute;transition:transform 500ms ease 0s;width:15.625rem;z-index:1001;-webkit-transform:translate3d(-100%,0,0);-moz-transform:translate3d(-100%,0,0);-ms-transform:translate(-100%,0);-o-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0);left:0;top:0}.left-off-canvas-menu *{-webkit-backface-visibility:hidden}.right-off-canvas-menu{-webkit-backface-visibility:hidden;background:#333;bottom:0;box-sizing:content-box;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;overflow-x:hidden;overflow-y:auto;position:absolute;transition:transform 500ms ease 0s;width:15.625rem;z-index:1001;-webkit-transform:translate3d(100%,0,0);-moz-transform:translate3d(100%,0,0);-ms-transform:translate(100%,0);-o-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);right:0;top:0}.right-off-canvas-menu *{-webkit-backface-visibility:hidden}.top-off-canvas-menu{-webkit-backface-visibility:hidden;background:#333;bottom:0;box-sizing:content-box;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;overflow-x:hidden;overflow-y:auto;position:absolute;transition:transform 500ms ease 0s;width:15.625rem;z-index:1001;-webkit-transform:translate3d(0,-100%,0);-moz-transform:translate3d(0,-100%,0);-ms-transform:translate(0,-100%);-o-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0);top:0;width:100%;height:18.75rem}.top-off-canvas-menu *{-webkit-backface-visibility:hidden}.bottom-off-canvas-menu{-webkit-backface-visibility:hidden;background:#333;bottom:0;box-sizing:content-box;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;overflow-x:hidden;overflow-y:auto;position:absolute;transition:transform 500ms ease 0s;width:15.625rem;z-index:1001;-webkit-transform:translate3d(0,100%,0);-moz-transform:translate3d(0,100%,0);-ms-transform:translate(0,100%);-o-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0);bottom:0;width:100%;height:18.75rem}.bottom-off-canvas-menu *{-webkit-backface-visibility:hidden}ul.off-canvas-list{list-style-type:none;margin:0;padding:0}ul.off-canvas-list li label{background:#444;border-bottom:none;border-top:1px solid #5e5e5e;color:#999;display:block;font-size:.75rem;font-weight:700;margin:0;padding:.3rem .9375rem;text-transform:uppercase}ul.off-canvas-list li a{border-bottom:1px solid #262626;color:rgba(255,255,255,.7);display:block;padding:.66666667rem;transition:background 300ms ease}ul.off-canvas-list li a:hover{background:#242424}ul.off-canvas-list li a:active{background:#242424}.move-right>.inner-wrap{-webkit-transform:translate3d(15.625rem,0,0);-moz-transform:translate3d(15.625rem,0,0);-ms-transform:translate(15.625rem,0);-o-transform:translate3d(15.625rem,0,0);transform:translate3d(15.625rem,0,0)}.move-right .exit-off-canvas{-webkit-backface-visibility:hidden;box-shadow:-4px 0 4px rgba(0,0,0,.5),4px 0 4px rgba(0,0,0,.5);cursor:pointer;transition:background 300ms ease;-webkit-tap-highlight-color:transparent;background:rgba(255,255,255,.2);bottom:0;display:block;left:0;position:absolute;right:0;top:0;z-index:1002}@media only screen and (min-width:40.0625em){.move-right .exit-off-canvas:hover{background:rgba(255,255,255,.05)}}.move-left>.inner-wrap{-webkit-transform:translate3d(-15.625rem,0,0);-moz-transform:translate3d(-15.625rem,0,0);-ms-transform:translate(-15.625rem,0);-o-transform:translate3d(-15.625rem,0,0);transform:translate3d(-15.625rem,0,0)}.move-left .exit-off-canvas{-webkit-backface-visibility:hidden;box-shadow:-4px 0 4px rgba(0,0,0,.5),4px 0 4px rgba(0,0,0,.5);cursor:pointer;transition:background 300ms ease;-webkit-tap-highlight-color:transparent;background:rgba(255,255,255,.2);bottom:0;display:block;left:0;position:absolute;right:0;top:0;z-index:1002}@media only screen and (min-width:40.0625em){.move-left .exit-off-canvas:hover{background:rgba(255,255,255,.05)}}.move-top>.inner-wrap{-webkit-transform:translate3d(0,-18.75rem,0);-moz-transform:translate3d(0,-18.75rem,0);-ms-transform:translate(0,-18.75rem);-o-transform:translate3d(0,-18.75rem,0);transform:translate3d(0,-18.75rem,0)}.move-top .exit-off-canvas{-webkit-backface-visibility:hidden;box-shadow:-4px 0 4px rgba(0,0,0,.5),4px 0 4px rgba(0,0,0,.5);cursor:pointer;transition:background 300ms ease;-webkit-tap-highlight-color:transparent;background:rgba(255,255,255,.2);bottom:0;display:block;left:0;position:absolute;right:0;top:0;z-index:1002}@media only screen and (min-width:40.0625em){.move-top .exit-off-canvas:hover{background:rgba(255,255,255,.05)}}.move-bottom>.inner-wrap{-webkit-transform:translate3d(0,18.75rem,0);-moz-transform:translate3d(0,18.75rem,0);-ms-transform:translate(0,18.75rem);-o-transform:translate3d(0,18.75rem,0);transform:translate3d(0,18.75rem,0)}.move-bottom .exit-off-canvas{-webkit-backface-visibility:hidden;box-shadow:-4px 0 4px rgba(0,0,0,.5),4px 0 4px rgba(0,0,0,.5);cursor:pointer;transition:background 300ms ease;-webkit-tap-highlight-color:transparent;background:rgba(255,255,255,.2);bottom:0;display:block;left:0;position:absolute;right:0;top:0;z-index:1002}@media only screen and (min-width:40.0625em){.move-bottom .exit-off-canvas:hover{background:rgba(255,255,255,.05)}}.offcanvas-overlap .left-off-canvas-menu,.offcanvas-overlap .right-off-canvas-menu,.offcanvas-overlap .top-off-canvas-menu,.offcanvas-overlap .bottom-off-canvas-menu{-ms-transform:none;-webkit-transform:none;-moz-transform:none;-o-transform:none;transform:none;z-index:1003}.offcanvas-overlap .exit-off-canvas{-webkit-backface-visibility:hidden;box-shadow:-4px 0 4px rgba(0,0,0,.5),4px 0 4px rgba(0,0,0,.5);cursor:pointer;transition:background 300ms ease;-webkit-tap-highlight-color:transparent;background:rgba(255,255,255,.2);bottom:0;display:block;left:0;position:absolute;right:0;top:0;z-index:1002}@media only screen and (min-width:40.0625em){.offcanvas-overlap .exit-off-canvas:hover{background:rgba(255,255,255,.05)}}.offcanvas-overlap-left .right-off-canvas-menu{-ms-transform:none;-webkit-transform:none;-moz-transform:none;-o-transform:none;transform:none;z-index:1003}.offcanvas-overlap-left .exit-off-canvas{-webkit-backface-visibility:hidden;box-shadow:-4px 0 4px rgba(0,0,0,.5),4px 0 4px rgba(0,0,0,.5);cursor:pointer;transition:background 300ms ease;-webkit-tap-highlight-color:transparent;background:rgba(255,255,255,.2);bottom:0;display:block;left:0;position:absolute;right:0;top:0;z-index:1002}@media only screen and (min-width:40.0625em){.offcanvas-overlap-left .exit-off-canvas:hover{background:rgba(255,255,255,.05)}}.offcanvas-overlap-right .left-off-canvas-menu{-ms-transform:none;-webkit-transform:none;-moz-transform:none;-o-transform:none;transform:none;z-index:1003}.offcanvas-overlap-right .exit-off-canvas{-webkit-backface-visibility:hidden;box-shadow:-4px 0 4px rgba(0,0,0,.5),4px 0 4px rgba(0,0,0,.5);cursor:pointer;transition:background 300ms ease;-webkit-tap-highlight-color:transparent;background:rgba(255,255,255,.2);bottom:0;display:block;left:0;position:absolute;right:0;top:0;z-index:1002}@media only screen and (min-width:40.0625em){.offcanvas-overlap-right .exit-off-canvas:hover{background:rgba(255,255,255,.05)}}.offcanvas-overlap-top .bottom-off-canvas-menu{-ms-transform:none;-webkit-transform:none;-moz-transform:none;-o-transform:none;transform:none;z-index:1003}.offcanvas-overlap-top .exit-off-canvas{-webkit-backface-visibility:hidden;box-shadow:-4px 0 4px rgba(0,0,0,.5),4px 0 4px rgba(0,0,0,.5);cursor:pointer;transition:background 300ms ease;-webkit-tap-highlight-color:transparent;background:rgba(255,255,255,.2);bottom:0;display:block;left:0;position:absolute;right:0;top:0;z-index:1002}@media only screen and (min-width:40.0625em){.offcanvas-overlap-top .exit-off-canvas:hover{background:rgba(255,255,255,.05)}}.offcanvas-overlap-bottom .top-off-canvas-menu{-ms-transform:none;-webkit-transform:none;-moz-transform:none;-o-transform:none;transform:none;z-index:1003}.offcanvas-overlap-bottom .exit-off-canvas{-webkit-backface-visibility:hidden;box-shadow:-4px 0 4px rgba(0,0,0,.5),4px 0 4px rgba(0,0,0,.5);cursor:pointer;transition:background 300ms ease;-webkit-tap-highlight-color:transparent;background:rgba(255,255,255,.2);bottom:0;display:block;left:0;position:absolute;right:0;top:0;z-index:1002}@media only screen and (min-width:40.0625em){.offcanvas-overlap-bottom .exit-off-canvas:hover{background:rgba(255,255,255,.05)}}.no-csstransforms .left-off-canvas-menu{left:-15.625rem}.no-csstransforms .right-off-canvas-menu{right:-15.625rem}.no-csstransforms .top-off-canvas-menu{top:-18.75rem}.no-csstransforms .bottom-off-canvas-menu{bottom:-18.75rem}.no-csstransforms .move-left>.inner-wrap{right:15.625rem}.no-csstransforms .move-right>.inner-wrap{left:15.625rem}.no-csstransforms .move-top>.inner-wrap{right:18.75rem}.no-csstransforms .move-bottom>.inner-wrap{left:18.75rem}.left-submenu{-webkit-backface-visibility:hidden;-webkit-overflow-scrolling:touch;background:#333;bottom:0;box-sizing:content-box;margin:0;overflow-x:hidden;overflow-y:auto;position:absolute;top:0;width:15.625rem;height:18.75rem;z-index:1002;-webkit-transform:translate3d(-100%,0,0);-moz-transform:translate3d(-100%,0,0);-ms-transform:translate(-100%,0);-o-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0);left:0;-webkit-transition:-webkit-transform 500ms ease;-moz-transition:-moz-transform 500ms ease;-ms-transition:-ms-transform 500ms ease;-o-transition:-o-transform 500ms ease;transition:transform 500ms ease}.left-submenu *{-webkit-backface-visibility:hidden}.left-submenu .back>a{background:#444;border-bottom:none;border-top:1px solid #5e5e5e;color:#999;font-weight:700;padding:.3rem .9375rem;text-transform:uppercase;margin:0}.left-submenu .back>a:hover{background:#303030;border-bottom:none;border-top:1px solid #5e5e5e}.left-submenu .back>a:before{content:"\AB";margin-right:.5rem;display:inline}.left-submenu.move-right,.left-submenu.offcanvas-overlap-right,.left-submenu.offcanvas-overlap{-webkit-transform:translate3d(0%,0,0);-moz-transform:translate3d(0%,0,0);-ms-transform:translate(0%,0);-o-transform:translate3d(0%,0,0);transform:translate3d(0%,0,0)}.right-submenu{-webkit-backface-visibility:hidden;-webkit-overflow-scrolling:touch;background:#333;bottom:0;box-sizing:content-box;margin:0;overflow-x:hidden;overflow-y:auto;position:absolute;top:0;width:15.625rem;height:18.75rem;z-index:1002;-webkit-transform:translate3d(100%,0,0);-moz-transform:translate3d(100%,0,0);-ms-transform:translate(100%,0);-o-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);right:0;-webkit-transition:-webkit-transform 500ms ease;-moz-transition:-moz-transform 500ms ease;-ms-transition:-ms-transform 500ms ease;-o-transition:-o-transform 500ms ease;transition:transform 500ms ease}.right-submenu *{-webkit-backface-visibility:hidden}.right-submenu .back>a{background:#444;border-bottom:none;border-top:1px solid #5e5e5e;color:#999;font-weight:700;padding:.3rem .9375rem;text-transform:uppercase;margin:0}.right-submenu .back>a:hover{background:#303030;border-bottom:none;border-top:1px solid #5e5e5e}.right-submenu .back>a:after{content:"\BB";margin-left:.5rem;display:inline}.right-submenu.move-left,.right-submenu.offcanvas-overlap-left,.right-submenu.offcanvas-overlap{-webkit-transform:translate3d(0%,0,0);-moz-transform:translate3d(0%,0,0);-ms-transform:translate(0%,0);-o-transform:translate3d(0%,0,0);transform:translate3d(0%,0,0)}.top-submenu{-webkit-backface-visibility:hidden;-webkit-overflow-scrolling:touch;background:#333;bottom:0;box-sizing:content-box;margin:0;overflow-x:hidden;overflow-y:auto;position:absolute;top:0;width:15.625rem;height:18.75rem;z-index:1002;-webkit-transform:translate3d(0,-100%,0);-moz-transform:translate3d(0,-100%,0);-ms-transform:translate(0,-100%);-o-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0);top:0;width:100%;-webkit-transition:-webkit-transform 500ms ease;-moz-transition:-moz-transform 500ms ease;-ms-transition:-ms-transform 500ms ease;-o-transition:-o-transform 500ms ease;transition:transform 500ms ease}.top-submenu *{-webkit-backface-visibility:hidden}.top-submenu .back>a{background:#444;border-bottom:none;border-top:1px solid #5e5e5e;color:#999;font-weight:700;padding:.3rem .9375rem;text-transform:uppercase;margin:0}.top-submenu .back>a:hover{background:#303030;border-bottom:none;border-top:1px solid #5e5e5e}.top-submenu.move-bottom,.top-submenu.offcanvas-overlap-bottom,.top-submenu.offcanvas-overlap{-webkit-transform:translate3d(0,0%,0);-moz-transform:translate3d(0,0%,0);-ms-transform:translate(0,0%);-o-transform:translate3d(0,0%,0);transform:translate3d(0,0%,0)}.bottom-submenu{-webkit-backface-visibility:hidden;-webkit-overflow-scrolling:touch;background:#333;bottom:0;box-sizing:content-box;margin:0;overflow-x:hidden;overflow-y:auto;position:absolute;top:0;width:15.625rem;height:18.75rem;z-index:1002;-webkit-transform:translate3d(0,100%,0);-moz-transform:translate3d(0,100%,0);-ms-transform:translate(0,100%);-o-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0);bottom:0;width:100%;-webkit-transition:-webkit-transform 500ms ease;-moz-transition:-moz-transform 500ms ease;-ms-transition:-ms-transform 500ms ease;-o-transition:-o-transform 500ms ease;transition:transform 500ms ease}.bottom-submenu *{-webkit-backface-visibility:hidden}.bottom-submenu .back>a{background:#444;border-bottom:none;border-top:1px solid #5e5e5e;color:#999;font-weight:700;padding:.3rem .9375rem;text-transform:uppercase;margin:0}.bottom-submenu .back>a:hover{background:#303030;border-bottom:none;border-top:1px solid #5e5e5e}.bottom-submenu.move-top,.bottom-submenu.offcanvas-overlap-top,.bottom-submenu.offcanvas-overlap{-webkit-transform:translate3d(0,0%,0);-moz-transform:translate3d(0,0%,0);-ms-transform:translate(0,0%);-o-transform:translate3d(0,0%,0);transform:translate3d(0,0%,0)}.left-off-canvas-menu ul.off-canvas-list li.has-submenu>a:after{content:"\BB";margin-left:.5rem;display:inline}.right-off-canvas-menu ul.off-canvas-list li.has-submenu>a:before{content:"\AB";margin-right:.5rem;display:inline}@media only screen{.show-for-small-only,.show-for-small-up,.show-for-small,.show-for-small-down,.hide-for-medium-only,.hide-for-medium-up,.hide-for-medium,.show-for-medium-down,.hide-for-large-only,.hide-for-large-up,.hide-for-large,.show-for-large-down,.hide-for-xlarge-only,.hide-for-xlarge-up,.hide-for-xlarge,.show-for-xlarge-down,.hide-for-xxlarge-only,.hide-for-xxlarge-up,.hide-for-xxlarge,.show-for-xxlarge-down{display:inherit!important}.hide-for-small-only,.hide-for-small-up,.hide-for-small,.hide-for-small-down,.show-for-medium-only,.show-for-medium-up,.show-for-medium,.hide-for-medium-down,.show-for-large-only,.show-for-large-up,.show-for-large,.hide-for-large-down,.show-for-xlarge-only,.show-for-xlarge-up,.show-for-xlarge,.hide-for-xlarge-down,.show-for-xxlarge-only,.show-for-xxlarge-up,.show-for-xxlarge,.hide-for-xxlarge-down{display:none!important}.visible-for-small-only,.visible-for-small-up,.visible-for-small,.visible-for-small-down,.hidden-for-medium-only,.hidden-for-medium-up,.hidden-for-medium,.visible-for-medium-down,.hidden-for-large-only,.hidden-for-large-up,.hidden-for-large,.visible-for-large-down,.hidden-for-xlarge-only,.hidden-for-xlarge-up,.hidden-for-xlarge,.visible-for-xlarge-down,.hidden-for-xxlarge-only,.hidden-for-xxlarge-up,.hidden-for-xxlarge,.visible-for-xxlarge-down{position:static!important;height:auto;width:auto;overflow:visible;clip:auto}.hidden-for-small-only,.hidden-for-small-up,.hidden-for-small,.hidden-for-small-down,.visible-for-medium-only,.visible-for-medium-up,.visible-for-medium,.hidden-for-medium-down,.visible-for-large-only,.visible-for-large-up,.visible-for-large,.hidden-for-large-down,.visible-for-xlarge-only,.visible-for-xlarge-up,.visible-for-xlarge,.hidden-for-xlarge-down,.visible-for-xxlarge-only,.visible-for-xxlarge-up,.visible-for-xxlarge,.hidden-for-xxlarge-down{clip:rect(1px,1px,1px,1px);height:1px;overflow:hidden;position:absolute!important;width:1px}table.show-for-small-only,table.show-for-small-up,table.show-for-small,table.show-for-small-down,table.hide-for-medium-only,table.hide-for-medium-up,table.hide-for-medium,table.show-for-medium-down,table.hide-for-large-only,table.hide-for-large-up,table.hide-for-large,table.show-for-large-down,table.hide-for-xlarge-only,table.hide-for-xlarge-up,table.hide-for-xlarge,table.show-for-xlarge-down,table.hide-for-xxlarge-only,table.hide-for-xxlarge-up,table.hide-for-xxlarge,table.show-for-xxlarge-down{display:table!important}thead.show-for-small-only,thead.show-for-small-up,thead.show-for-small,thead.show-for-small-down,thead.hide-for-medium-only,thead.hide-for-medium-up,thead.hide-for-medium,thead.show-for-medium-down,thead.hide-for-large-only,thead.hide-for-large-up,thead.hide-for-large,thead.show-for-large-down,thead.hide-for-xlarge-only,thead.hide-for-xlarge-up,thead.hide-for-xlarge,thead.show-for-xlarge-down,thead.hide-for-xxlarge-only,thead.hide-for-xxlarge-up,thead.hide-for-xxlarge,thead.show-for-xxlarge-down{display:table-header-group!important}tbody.show-for-small-only,tbody.show-for-small-up,tbody.show-for-small,tbody.show-for-small-down,tbody.hide-for-medium-only,tbody.hide-for-medium-up,tbody.hide-for-medium,tbody.show-for-medium-down,tbody.hide-for-large-only,tbody.hide-for-large-up,tbody.hide-for-large,tbody.show-for-large-down,tbody.hide-for-xlarge-only,tbody.hide-for-xlarge-up,tbody.hide-for-xlarge,tbody.show-for-xlarge-down,tbody.hide-for-xxlarge-only,tbody.hide-for-xxlarge-up,tbody.hide-for-xxlarge,tbody.show-for-xxlarge-down{display:table-row-group!important}tr.show-for-small-only,tr.show-for-small-up,tr.show-for-small,tr.show-for-small-down,tr.hide-for-medium-only,tr.hide-for-medium-up,tr.hide-for-medium,tr.show-for-medium-down,tr.hide-for-large-only,tr.hide-for-large-up,tr.hide-for-large,tr.show-for-large-down,tr.hide-for-xlarge-only,tr.hide-for-xlarge-up,tr.hide-for-xlarge,tr.show-for-xlarge-down,tr.hide-for-xxlarge-only,tr.hide-for-xxlarge-up,tr.hide-for-xxlarge,tr.show-for-xxlarge-down{display:table-row}th.show-for-small-only,td.show-for-small-only,th.show-for-small-up,td.show-for-small-up,th.show-for-small,td.show-for-small,th.show-for-small-down,td.show-for-small-down,th.hide-for-medium-only,td.hide-for-medium-only,th.hide-for-medium-up,td.hide-for-medium-up,th.hide-for-medium,td.hide-for-medium,th.show-for-medium-down,td.show-for-medium-down,th.hide-for-large-only,td.hide-for-large-only,th.hide-for-large-up,td.hide-for-large-up,th.hide-for-large,td.hide-for-large,th.show-for-large-down,td.show-for-large-down,th.hide-for-xlarge-only,td.hide-for-xlarge-only,th.hide-for-xlarge-up,td.hide-for-xlarge-up,th.hide-for-xlarge,td.hide-for-xlarge,th.show-for-xlarge-down,td.show-for-xlarge-down,th.hide-for-xxlarge-only,td.hide-for-xxlarge-only,th.hide-for-xxlarge-up,td.hide-for-xxlarge-up,th.hide-for-xxlarge,td.hide-for-xxlarge,th.show-for-xxlarge-down,td.show-for-xxlarge-down{display:table-cell!important}}@media only screen and (min-width:40.0625em){.hide-for-small-only,.show-for-small-up,.hide-for-small,.hide-for-small-down,.show-for-medium-only,.show-for-medium-up,.show-for-medium,.show-for-medium-down,.hide-for-large-only,.hide-for-large-up,.hide-for-large,.show-for-large-down,.hide-for-xlarge-only,.hide-for-xlarge-up,.hide-for-xlarge,.show-for-xlarge-down,.hide-for-xxlarge-only,.hide-for-xxlarge-up,.hide-for-xxlarge,.show-for-xxlarge-down{display:inherit!important}.show-for-small-only,.hide-for-small-up,.show-for-small,.show-for-small-down,.hide-for-medium-only,.hide-for-medium-up,.hide-for-medium,.hide-for-medium-down,.show-for-large-only,.show-for-large-up,.show-for-large,.hide-for-large-down,.show-for-xlarge-only,.show-for-xlarge-up,.show-for-xlarge,.hide-for-xlarge-down,.show-for-xxlarge-only,.show-for-xxlarge-up,.show-for-xxlarge,.hide-for-xxlarge-down{display:none!important}.hidden-for-small-only,.visible-for-small-up,.hidden-for-small,.hidden-for-small-down,.visible-for-medium-only,.visible-for-medium-up,.visible-for-medium,.visible-for-medium-down,.hidden-for-large-only,.hidden-for-large-up,.hidden-for-large,.visible-for-large-down,.hidden-for-xlarge-only,.hidden-for-xlarge-up,.hidden-for-xlarge,.visible-for-xlarge-down,.hidden-for-xxlarge-only,.hidden-for-xxlarge-up,.hidden-for-xxlarge,.visible-for-xxlarge-down{position:static!important;height:auto;width:auto;overflow:visible;clip:auto}.visible-for-small-only,.hidden-for-small-up,.visible-for-small,.visible-for-small-down,.hidden-for-medium-only,.hidden-for-medium-up,.hidden-for-medium,.hidden-for-medium-down,.visible-for-large-only,.visible-for-large-up,.visible-for-large,.hidden-for-large-down,.visible-for-xlarge-only,.visible-for-xlarge-up,.visible-for-xlarge,.hidden-for-xlarge-down,.visible-for-xxlarge-only,.visible-for-xxlarge-up,.visible-for-xxlarge,.hidden-for-xxlarge-down{clip:rect(1px,1px,1px,1px);height:1px;overflow:hidden;position:absolute!important;width:1px}table.hide-for-small-only,table.show-for-small-up,table.hide-for-small,table.hide-for-small-down,table.show-for-medium-only,table.show-for-medium-up,table.show-for-medium,table.show-for-medium-down,table.hide-for-large-only,table.hide-for-large-up,table.hide-for-large,table.show-for-large-down,table.hide-for-xlarge-only,table.hide-for-xlarge-up,table.hide-for-xlarge,table.show-for-xlarge-down,table.hide-for-xxlarge-only,table.hide-for-xxlarge-up,table.hide-for-xxlarge,table.show-for-xxlarge-down{display:table!important}thead.hide-for-small-only,thead.show-for-small-up,thead.hide-for-small,thead.hide-for-small-down,thead.show-for-medium-only,thead.show-for-medium-up,thead.show-for-medium,thead.show-for-medium-down,thead.hide-for-large-only,thead.hide-for-large-up,thead.hide-for-large,thead.show-for-large-down,thead.hide-for-xlarge-only,thead.hide-for-xlarge-up,thead.hide-for-xlarge,thead.show-for-xlarge-down,thead.hide-for-xxlarge-only,thead.hide-for-xxlarge-up,thead.hide-for-xxlarge,thead.show-for-xxlarge-down{display:table-header-group!important}tbody.hide-for-small-only,tbody.show-for-small-up,tbody.hide-for-small,tbody.hide-for-small-down,tbody.show-for-medium-only,tbody.show-for-medium-up,tbody.show-for-medium,tbody.show-for-medium-down,tbody.hide-for-large-only,tbody.hide-for-large-up,tbody.hide-for-large,tbody.show-for-large-down,tbody.hide-for-xlarge-only,tbody.hide-for-xlarge-up,tbody.hide-for-xlarge,tbody.show-for-xlarge-down,tbody.hide-for-xxlarge-only,tbody.hide-for-xxlarge-up,tbody.hide-for-xxlarge,tbody.show-for-xxlarge-down{display:table-row-group!important}tr.hide-for-small-only,tr.show-for-small-up,tr.hide-for-small,tr.hide-for-small-down,tr.show-for-medium-only,tr.show-for-medium-up,tr.show-for-medium,tr.show-for-medium-down,tr.hide-for-large-only,tr.hide-for-large-up,tr.hide-for-large,tr.show-for-large-down,tr.hide-for-xlarge-only,tr.hide-for-xlarge-up,tr.hide-for-xlarge,tr.show-for-xlarge-down,tr.hide-for-xxlarge-only,tr.hide-for-xxlarge-up,tr.hide-for-xxlarge,tr.show-for-xxlarge-down{display:table-row}th.hide-for-small-only,td.hide-for-small-only,th.show-for-small-up,td.show-for-small-up,th.hide-for-small,td.hide-for-small,th.hide-for-small-down,td.hide-for-small-down,th.show-for-medium-only,td.show-for-medium-only,th.show-for-medium-up,td.show-for-medium-up,th.show-for-medium,td.show-for-medium,th.show-for-medium-down,td.show-for-medium-down,th.hide-for-large-only,td.hide-for-large-only,th.hide-for-large-up,td.hide-for-large-up,th.hide-for-large,td.hide-for-large,th.show-for-large-down,td.show-for-large-down,th.hide-for-xlarge-only,td.hide-for-xlarge-only,th.hide-for-xlarge-up,td.hide-for-xlarge-up,th.hide-for-xlarge,td.hide-for-xlarge,th.show-for-xlarge-down,td.show-for-xlarge-down,th.hide-for-xxlarge-only,td.hide-for-xxlarge-only,th.hide-for-xxlarge-up,td.hide-for-xxlarge-up,th.hide-for-xxlarge,td.hide-for-xxlarge,th.show-for-xxlarge-down,td.show-for-xxlarge-down{display:table-cell!important}}@media only screen and (min-width:64.0625em){.hide-for-small-only,.show-for-small-up,.hide-for-small,.hide-for-small-down,.hide-for-medium-only,.show-for-medium-up,.hide-for-medium,.hide-for-medium-down,.show-for-large-only,.show-for-large-up,.show-for-large,.show-for-large-down,.hide-for-xlarge-only,.hide-for-xlarge-up,.hide-for-xlarge,.show-for-xlarge-down,.hide-for-xxlarge-only,.hide-for-xxlarge-up,.hide-for-xxlarge,.show-for-xxlarge-down{display:inherit!important}.show-for-small-only,.hide-for-small-up,.show-for-small,.show-for-small-down,.show-for-medium-only,.hide-for-medium-up,.show-for-medium,.show-for-medium-down,.hide-for-large-only,.hide-for-large-up,.hide-for-large,.hide-for-large-down,.show-for-xlarge-only,.show-for-xlarge-up,.show-for-xlarge,.hide-for-xlarge-down,.show-for-xxlarge-only,.show-for-xxlarge-up,.show-for-xxlarge,.hide-for-xxlarge-down{display:none!important}.hidden-for-small-only,.visible-for-small-up,.hidden-for-small,.hidden-for-small-down,.hidden-for-medium-only,.visible-for-medium-up,.hidden-for-medium,.hidden-for-medium-down,.visible-for-large-only,.visible-for-large-up,.visible-for-large,.visible-for-large-down,.hidden-for-xlarge-only,.hidden-for-xlarge-up,.hidden-for-xlarge,.visible-for-xlarge-down,.hidden-for-xxlarge-only,.hidden-for-xxlarge-up,.hidden-for-xxlarge,.visible-for-xxlarge-down{position:static!important;height:auto;width:auto;overflow:visible;clip:auto}.visible-for-small-only,.hidden-for-small-up,.visible-for-small,.visible-for-small-down,.visible-for-medium-only,.hidden-for-medium-up,.visible-for-medium,.visible-for-medium-down,.hidden-for-large-only,.hidden-for-large-up,.hidden-for-large,.hidden-for-large-down,.visible-for-xlarge-only,.visible-for-xlarge-up,.visible-for-xlarge,.hidden-for-xlarge-down,.visible-for-xxlarge-only,.visible-for-xxlarge-up,.visible-for-xxlarge,.hidden-for-xxlarge-down{clip:rect(1px,1px,1px,1px);height:1px;overflow:hidden;position:absolute!important;width:1px}table.hide-for-small-only,table.show-for-small-up,table.hide-for-small,table.hide-for-small-down,table.hide-for-medium-only,table.show-for-medium-up,table.hide-for-medium,table.hide-for-medium-down,table.show-for-large-only,table.show-for-large-up,table.show-for-large,table.show-for-large-down,table.hide-for-xlarge-only,table.hide-for-xlarge-up,table.hide-for-xlarge,table.show-for-xlarge-down,table.hide-for-xxlarge-only,table.hide-for-xxlarge-up,table.hide-for-xxlarge,table.show-for-xxlarge-down{display:table!important}thead.hide-for-small-only,thead.show-for-small-up,thead.hide-for-small,thead.hide-for-small-down,thead.hide-for-medium-only,thead.show-for-medium-up,thead.hide-for-medium,thead.hide-for-medium-down,thead.show-for-large-only,thead.show-for-large-up,thead.show-for-large,thead.show-for-large-down,thead.hide-for-xlarge-only,thead.hide-for-xlarge-up,thead.hide-for-xlarge,thead.show-for-xlarge-down,thead.hide-for-xxlarge-only,thead.hide-for-xxlarge-up,thead.hide-for-xxlarge,thead.show-for-xxlarge-down{display:table-header-group!important}tbody.hide-for-small-only,tbody.show-for-small-up,tbody.hide-for-small,tbody.hide-for-small-down,tbody.hide-for-medium-only,tbody.show-for-medium-up,tbody.hide-for-medium,tbody.hide-for-medium-down,tbody.show-for-large-only,tbody.show-for-large-up,tbody.show-for-large,tbody.show-for-large-down,tbody.hide-for-xlarge-only,tbody.hide-for-xlarge-up,tbody.hide-for-xlarge,tbody.show-for-xlarge-down,tbody.hide-for-xxlarge-only,tbody.hide-for-xxlarge-up,tbody.hide-for-xxlarge,tbody.show-for-xxlarge-down{display:table-row-group!important}tr.hide-for-small-only,tr.show-for-small-up,tr.hide-for-small,tr.hide-for-small-down,tr.hide-for-medium-only,tr.show-for-medium-up,tr.hide-for-medium,tr.hide-for-medium-down,tr.show-for-large-only,tr.show-for-large-up,tr.show-for-large,tr.show-for-large-down,tr.hide-for-xlarge-only,tr.hide-for-xlarge-up,tr.hide-for-xlarge,tr.show-for-xlarge-down,tr.hide-for-xxlarge-only,tr.hide-for-xxlarge-up,tr.hide-for-xxlarge,tr.show-for-xxlarge-down{display:table-row}th.hide-for-small-only,td.hide-for-small-only,th.show-for-small-up,td.show-for-small-up,th.hide-for-small,td.hide-for-small,th.hide-for-small-down,td.hide-for-small-down,th.hide-for-medium-only,td.hide-for-medium-only,th.show-for-medium-up,td.show-for-medium-up,th.hide-for-medium,td.hide-for-medium,th.hide-for-medium-down,td.hide-for-medium-down,th.show-for-large-only,td.show-for-large-only,th.show-for-large-up,td.show-for-large-up,th.show-for-large,td.show-for-large,th.show-for-large-down,td.show-for-large-down,th.hide-for-xlarge-only,td.hide-for-xlarge-only,th.hide-for-xlarge-up,td.hide-for-xlarge-up,th.hide-for-xlarge,td.hide-for-xlarge,th.show-for-xlarge-down,td.show-for-xlarge-down,th.hide-for-xxlarge-only,td.hide-for-xxlarge-only,th.hide-for-xxlarge-up,td.hide-for-xxlarge-up,th.hide-for-xxlarge,td.hide-for-xxlarge,th.show-for-xxlarge-down,td.show-for-xxlarge-down{display:table-cell!important}}@media only screen and (min-width:90.0625em){.hide-for-small-only,.show-for-small-up,.hide-for-small,.hide-for-small-down,.hide-for-medium-only,.show-for-medium-up,.hide-for-medium,.hide-for-medium-down,.hide-for-large-only,.show-for-large-up,.hide-for-large,.hide-for-large-down,.show-for-xlarge-only,.show-for-xlarge-up,.show-for-xlarge,.show-for-xlarge-down,.hide-for-xxlarge-only,.hide-for-xxlarge-up,.hide-for-xxlarge,.show-for-xxlarge-down{display:inherit!important}.show-for-small-only,.hide-for-small-up,.show-for-small,.show-for-small-down,.show-for-medium-only,.hide-for-medium-up,.show-for-medium,.show-for-medium-down,.show-for-large-only,.hide-for-large-up,.show-for-large,.show-for-large-down,.hide-for-xlarge-only,.hide-for-xlarge-up,.hide-for-xlarge,.hide-for-xlarge-down,.show-for-xxlarge-only,.show-for-xxlarge-up,.show-for-xxlarge,.hide-for-xxlarge-down{display:none!important}.hidden-for-small-only,.visible-for-small-up,.hidden-for-small,.hidden-for-small-down,.hidden-for-medium-only,.visible-for-medium-up,.hidden-for-medium,.hidden-for-medium-down,.hidden-for-large-only,.visible-for-large-up,.hidden-for-large,.hidden-for-large-down,.visible-for-xlarge-only,.visible-for-xlarge-up,.visible-for-xlarge,.visible-for-xlarge-down,.hidden-for-xxlarge-only,.hidden-for-xxlarge-up,.hidden-for-xxlarge,.visible-for-xxlarge-down{position:static!important;height:auto;width:auto;overflow:visible;clip:auto}.visible-for-small-only,.hidden-for-small-up,.visible-for-small,.visible-for-small-down,.visible-for-medium-only,.hidden-for-medium-up,.visible-for-medium,.visible-for-medium-down,.visible-for-large-only,.hidden-for-large-up,.visible-for-large,.visible-for-large-down,.hidden-for-xlarge-only,.hidden-for-xlarge-up,.hidden-for-xlarge,.hidden-for-xlarge-down,.visible-for-xxlarge-only,.visible-for-xxlarge-up,.visible-for-xxlarge,.hidden-for-xxlarge-down{clip:rect(1px,1px,1px,1px);height:1px;overflow:hidden;position:absolute!important;width:1px}table.hide-for-small-only,table.show-for-small-up,table.hide-for-small,table.hide-for-small-down,table.hide-for-medium-only,table.show-for-medium-up,table.hide-for-medium,table.hide-for-medium-down,table.hide-for-large-only,table.show-for-large-up,table.hide-for-large,table.hide-for-large-down,table.show-for-xlarge-only,table.show-for-xlarge-up,table.show-for-xlarge,table.show-for-xlarge-down,table.hide-for-xxlarge-only,table.hide-for-xxlarge-up,table.hide-for-xxlarge,table.show-for-xxlarge-down{display:table!important}thead.hide-for-small-only,thead.show-for-small-up,thead.hide-for-small,thead.hide-for-small-down,thead.hide-for-medium-only,thead.show-for-medium-up,thead.hide-for-medium,thead.hide-for-medium-down,thead.hide-for-large-only,thead.show-for-large-up,thead.hide-for-large,thead.hide-for-large-down,thead.show-for-xlarge-only,thead.show-for-xlarge-up,thead.show-for-xlarge,thead.show-for-xlarge-down,thead.hide-for-xxlarge-only,thead.hide-for-xxlarge-up,thead.hide-for-xxlarge,thead.show-for-xxlarge-down{display:table-header-group!important}tbody.hide-for-small-only,tbody.show-for-small-up,tbody.hide-for-small,tbody.hide-for-small-down,tbody.hide-for-medium-only,tbody.show-for-medium-up,tbody.hide-for-medium,tbody.hide-for-medium-down,tbody.hide-for-large-only,tbody.show-for-large-up,tbody.hide-for-large,tbody.hide-for-large-down,tbody.show-for-xlarge-only,tbody.show-for-xlarge-up,tbody.show-for-xlarge,tbody.show-for-xlarge-down,tbody.hide-for-xxlarge-only,tbody.hide-for-xxlarge-up,tbody.hide-for-xxlarge,tbody.show-for-xxlarge-down{display:table-row-group!important}tr.hide-for-small-only,tr.show-for-small-up,tr.hide-for-small,tr.hide-for-small-down,tr.hide-for-medium-only,tr.show-for-medium-up,tr.hide-for-medium,tr.hide-for-medium-down,tr.hide-for-large-only,tr.show-for-large-up,tr.hide-for-large,tr.hide-for-large-down,tr.show-for-xlarge-only,tr.show-for-xlarge-up,tr.show-for-xlarge,tr.show-for-xlarge-down,tr.hide-for-xxlarge-only,tr.hide-for-xxlarge-up,tr.hide-for-xxlarge,tr.show-for-xxlarge-down{display:table-row}th.hide-for-small-only,td.hide-for-small-only,th.show-for-small-up,td.show-for-small-up,th.hide-for-small,td.hide-for-small,th.hide-for-small-down,td.hide-for-small-down,th.hide-for-medium-only,td.hide-for-medium-only,th.show-for-medium-up,td.show-for-medium-up,th.hide-for-medium,td.hide-for-medium,th.hide-for-medium-down,td.hide-for-medium-down,th.hide-for-large-only,td.hide-for-large-only,th.show-for-large-up,td.show-for-large-up,th.hide-for-large,td.hide-for-large,th.hide-for-large-down,td.hide-for-large-down,th.show-for-xlarge-only,td.show-for-xlarge-only,th.show-for-xlarge-up,td.show-for-xlarge-up,th.show-for-xlarge,td.show-for-xlarge,th.show-for-xlarge-down,td.show-for-xlarge-down,th.hide-for-xxlarge-only,td.hide-for-xxlarge-only,th.hide-for-xxlarge-up,td.hide-for-xxlarge-up,th.hide-for-xxlarge,td.hide-for-xxlarge,th.show-for-xxlarge-down,td.show-for-xxlarge-down{display:table-cell!important}}@media only screen and (min-width:120.0625em){.hide-for-small-only,.show-for-small-up,.hide-for-small,.hide-for-small-down,.hide-for-medium-only,.show-for-medium-up,.hide-for-medium,.hide-for-medium-down,.hide-for-large-only,.show-for-large-up,.hide-for-large,.hide-for-large-down,.hide-for-xlarge-only,.show-for-xlarge-up,.hide-for-xlarge,.hide-for-xlarge-down,.show-for-xxlarge-only,.show-for-xxlarge-up,.show-for-xxlarge,.show-for-xxlarge-down{display:inherit!important}.show-for-small-only,.hide-for-small-up,.show-for-small,.show-for-small-down,.show-for-medium-only,.hide-for-medium-up,.show-for-medium,.show-for-medium-down,.show-for-large-only,.hide-for-large-up,.show-for-large,.show-for-large-down,.show-for-xlarge-only,.hide-for-xlarge-up,.show-for-xlarge,.show-for-xlarge-down,.hide-for-xxlarge-only,.hide-for-xxlarge-up,.hide-for-xxlarge,.hide-for-xxlarge-down{display:none!important}.hidden-for-small-only,.visible-for-small-up,.hidden-for-small,.hidden-for-small-down,.hidden-for-medium-only,.visible-for-medium-up,.hidden-for-medium,.hidden-for-medium-down,.hidden-for-large-only,.visible-for-large-up,.hidden-for-large,.hidden-for-large-down,.hidden-for-xlarge-only,.visible-for-xlarge-up,.hidden-for-xlarge,.hidden-for-xlarge-down,.visible-for-xxlarge-only,.visible-for-xxlarge-up,.visible-for-xxlarge,.visible-for-xxlarge-down{position:static!important;height:auto;width:auto;overflow:visible;clip:auto}.visible-for-small-only,.hidden-for-small-up,.visible-for-small,.visible-for-small-down,.visible-for-medium-only,.hidden-for-medium-up,.visible-for-medium,.visible-for-medium-down,.visible-for-large-only,.hidden-for-large-up,.visible-for-large,.visible-for-large-down,.visible-for-xlarge-only,.hidden-for-xlarge-up,.visible-for-xlarge,.visible-for-xlarge-down,.hidden-for-xxlarge-only,.hidden-for-xxlarge-up,.hidden-for-xxlarge,.hidden-for-xxlarge-down{clip:rect(1px,1px,1px,1px);height:1px;overflow:hidden;position:absolute!important;width:1px}table.hide-for-small-only,table.show-for-small-up,table.hide-for-small,table.hide-for-small-down,table.hide-for-medium-only,table.show-for-medium-up,table.hide-for-medium,table.hide-for-medium-down,table.hide-for-large-only,table.show-for-large-up,table.hide-for-large,table.hide-for-large-down,table.hide-for-xlarge-only,table.show-for-xlarge-up,table.hide-for-xlarge,table.hide-for-xlarge-down,table.show-for-xxlarge-only,table.show-for-xxlarge-up,table.show-for-xxlarge,table.show-for-xxlarge-down{display:table!important}thead.hide-for-small-only,thead.show-for-small-up,thead.hide-for-small,thead.hide-for-small-down,thead.hide-for-medium-only,thead.show-for-medium-up,thead.hide-for-medium,thead.hide-for-medium-down,thead.hide-for-large-only,thead.show-for-large-up,thead.hide-for-large,thead.hide-for-large-down,thead.hide-for-xlarge-only,thead.show-for-xlarge-up,thead.hide-for-xlarge,thead.hide-for-xlarge-down,thead.show-for-xxlarge-only,thead.show-for-xxlarge-up,thead.show-for-xxlarge,thead.show-for-xxlarge-down{display:table-header-group!important}tbody.hide-for-small-only,tbody.show-for-small-up,tbody.hide-for-small,tbody.hide-for-small-down,tbody.hide-for-medium-only,tbody.show-for-medium-up,tbody.hide-for-medium,tbody.hide-for-medium-down,tbody.hide-for-large-only,tbody.show-for-large-up,tbody.hide-for-large,tbody.hide-for-large-down,tbody.hide-for-xlarge-only,tbody.show-for-xlarge-up,tbody.hide-for-xlarge,tbody.hide-for-xlarge-down,tbody.show-for-xxlarge-only,tbody.show-for-xxlarge-up,tbody.show-for-xxlarge,tbody.show-for-xxlarge-down{display:table-row-group!important}tr.hide-for-small-only,tr.show-for-small-up,tr.hide-for-small,tr.hide-for-small-down,tr.hide-for-medium-only,tr.show-for-medium-up,tr.hide-for-medium,tr.hide-for-medium-down,tr.hide-for-large-only,tr.show-for-large-up,tr.hide-for-large,tr.hide-for-large-down,tr.hide-for-xlarge-only,tr.show-for-xlarge-up,tr.hide-for-xlarge,tr.hide-for-xlarge-down,tr.show-for-xxlarge-only,tr.show-for-xxlarge-up,tr.show-for-xxlarge,tr.show-for-xxlarge-down{display:table-row}th.hide-for-small-only,td.hide-for-small-only,th.show-for-small-up,td.show-for-small-up,th.hide-for-small,td.hide-for-small,th.hide-for-small-down,td.hide-for-small-down,th.hide-for-medium-only,td.hide-for-medium-only,th.show-for-medium-up,td.show-for-medium-up,th.hide-for-medium,td.hide-for-medium,th.hide-for-medium-down,td.hide-for-medium-down,th.hide-for-large-only,td.hide-for-large-only,th.show-for-large-up,td.show-for-large-up,th.hide-for-large,td.hide-for-large,th.hide-for-large-down,td.hide-for-large-down,th.hide-for-xlarge-only,td.hide-for-xlarge-only,th.show-for-xlarge-up,td.show-for-xlarge-up,th.hide-for-xlarge,td.hide-for-xlarge,th.hide-for-xlarge-down,td.hide-for-xlarge-down,th.show-for-xxlarge-only,td.show-for-xxlarge-only,th.show-for-xxlarge-up,td.show-for-xxlarge-up,th.show-for-xxlarge,td.show-for-xxlarge,th.show-for-xxlarge-down,td.show-for-xxlarge-down{display:table-cell!important}}.show-for-landscape,.hide-for-portrait{display:inherit!important}.hide-for-landscape,.show-for-portrait{display:none!important}table.hide-for-landscape,table.show-for-portrait{display:table!important}thead.hide-for-landscape,thead.show-for-portrait{display:table-header-group!important}tbody.hide-for-landscape,tbody.show-for-portrait{display:table-row-group!important}tr.hide-for-landscape,tr.show-for-portrait{display:table-row!important}td.hide-for-landscape,td.show-for-portrait,th.hide-for-landscape,th.show-for-portrait{display:table-cell!important}@media only screen and (orientation:landscape){.show-for-landscape,.hide-for-portrait{display:inherit!important}.hide-for-landscape,.show-for-portrait{display:none!important}table.show-for-landscape,table.hide-for-portrait{display:table!important}thead.show-for-landscape,thead.hide-for-portrait{display:table-header-group!important}tbody.show-for-landscape,tbody.hide-for-portrait{display:table-row-group!important}tr.show-for-landscape,tr.hide-for-portrait{display:table-row!important}td.show-for-landscape,td.hide-for-portrait,th.show-for-landscape,th.hide-for-portrait{display:table-cell!important}}@media only screen and (orientation:portrait){.show-for-portrait,.hide-for-landscape{display:inherit!important}.hide-for-portrait,.show-for-landscape{display:none!important}table.show-for-portrait,table.hide-for-landscape{display:table!important}thead.show-for-portrait,thead.hide-for-landscape{display:table-header-group!important}tbody.show-for-portrait,tbody.hide-for-landscape{display:table-row-group!important}tr.show-for-portrait,tr.hide-for-landscape{display:table-row!important}td.show-for-portrait,td.hide-for-landscape,th.show-for-portrait,th.hide-for-landscape{display:table-cell!important}}.show-for-touch{display:none!important}.hide-for-touch{display:inherit!important}.touch .show-for-touch{display:inherit!important}.touch .hide-for-touch{display:none!important}table.hide-for-touch{display:table!important}.touch table.show-for-touch{display:table!important}thead.hide-for-touch{display:table-header-group!important}.touch thead.show-for-touch{display:table-header-group!important}tbody.hide-for-touch{display:table-row-group!important}.touch tbody.show-for-touch{display:table-row-group!important}tr.hide-for-touch{display:table-row!important}.touch tr.show-for-touch{display:table-row!important}td.hide-for-touch{display:table-cell!important}.touch td.show-for-touch{display:table-cell!important}th.hide-for-touch{display:table-cell!important}.touch th.show-for-touch{display:table-cell!important}.show-for-sr{clip:rect(1px,1px,1px,1px);height:1px;overflow:hidden;position:absolute!important;width:1px}.show-on-focus{clip:rect(1px,1px,1px,1px);height:1px;overflow:hidden;position:absolute!important;width:1px}.show-on-focus:focus,.show-on-focus:active{position:static!important;height:auto;width:auto;overflow:visible;clip:auto}.print-only,.show-for-print{display:none!important}@media print{.print-only,.show-for-print{display:block!important}.hide-on-print,.hide-for-print{display:none!important}table.show-for-print{display:table!important}thead.show-for-print{display:table-header-group!important}tbody.show-for-print{display:table-row-group!important}tr.show-for-print{display:table-row!important}td.show-for-print{display:table-cell!important}th.show-for-print{display:table-cell!important}}@font-face{font-family:klinic-reg;src:url(/fonts/klinicslabbook-webfont.eot);src:url(/fonts/klinicslabbook-webfont.eot?#iefix)format("embedded-opentype"),url(/fonts/klinicslabbook-webfont.woff2)format("woff2"),url(/fonts/klinicslabbook-webfont.woff)format("woff"),url(/fonts/klinicslabbook-webfont.ttf)format("truetype"),url(/fonts/klinicslabbook-webfont.svg#klinic_slabbook)format("svg");font-weight:400;font-style:normal}@font-face{font-family:klinic-bold;src:url(/fonts/klinicslabmedium-webfont.eot);src:url(/fonts/klinicslabmedium-webfont.eot?#iefix)format("embedded-opentype"),url(/fonts/klinicslabmedium-webfont.woff2)format("woff2"),url(/fonts/klinicslabmedium-webfont.woff)format("woff"),url(/fonts/klinicslabmedium-webfont.ttf)format("truetype"),url(/fonts/klinicslabmedium-webfont.svg#klinic_slabmedium)format("svg");font-weight:500;font-style:normal}.button{-webkit-border-radius:.15em .15em .15em .15em;-moz-border-radius:.15em .15em .15em .15em;border-radius:.15em .15em .15em .15em;font-family:klinic-bold,klinic bold,helvetica neue,Helvetica,Arial,sans-serif;font-weight:600;letter-spacing:.05em;-webkit-font-smoothing:antialiased;line-height:1.636;background-color:#2dafe9}.x0{font-size:10px}.x1{font-size:12px}.x2{font-size:13px}.x3{font-size:14px}.x4{font-size:15px}.x5{font-size:17.92px}.x6{font-size:20px}.x7{font-size:24px}.x8{font-size:32px}.x9{font-size:36px}.x10{font-size:47.2px}html,body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}h1,h2,h3,h4,h5,h6{font-family:klinic-reg,klinic,helvetica neue,Helvetica,Arial,sans-serif;font-weight:400;letter-spacing:.0075em;-webkit-font-smoothing:antialiased;margin-top:.83333333rem;margin-bottom:.83333333rem}h1{color:#277a9f;font-size:47.2px;text-transform:uppercase;letter-spacing:.25em;font-family:klinic-bold,klinic bold,helvetica neue,Helvetica,Arial,sans-serif;font-weight:600;letter-spacing:.05em;-webkit-font-smoothing:antialiased}h2{font-size:36px}h2.onboard-welcome,h2 .onboard-welcome{color:#277a9f;font-size:47.2px;font-family:klinic-bold,klinic bold,helvetica neue,Helvetica,Arial,sans-serif;font-weight:600;letter-spacing:.05em;-webkit-font-smoothing:antialiased}h2.onboard-tasks,h2 .onboard-tasks{color:#2090cd}h2.onboard,h2 .onboard{color:#277a9f}h2.welcome-text,h2 .welcome-text{color:#277a9f;font-size:28px;font-family:klinic-reg,klinic,helvetica neue,Helvetica,Arial,sans-serif;font-weight:400;letter-spacing:.0075em;-webkit-font-smoothing:antialiased}h3{font-size:24px}.content h3{text-transform:uppercase;letter-spacing:.25em;font-family:klinic-bold,klinic bold,helvetica neue,Helvetica,Arial,sans-serif;font-weight:600;letter-spacing:.05em;-webkit-font-smoothing:antialiased;font-size:13px;color:#999}h4{font-size:12px;font-family:klinic-bold,klinic bold,helvetica neue,Helvetica,Arial,sans-serif;font-weight:600;letter-spacing:.05em;-webkit-font-smoothing:antialiased}h4.day,h4 .day{color:#999}h5{color:#333}.content h5,.line-chart-wrap h5{font-family:klinic-reg,klinic,helvetica neue,Helvetica,Arial,sans-serif;font-weight:400;letter-spacing:.0075em;-webkit-font-smoothing:antialiased;text-transform:uppercase;letter-spacing:.25em;font-size:12px}p,ol,ul,dl,blockquote,table{font-size:14px;padding-right:5%;font-family:helvetica neue,Helvetica,Arial,sans-serif}p{line-height:2.15;color:#666}ol,ul{margin-left:1.8rem;margin-bottom:2.5rem}a{color:#2ba0d3}.text-upper{text-transform:uppercase;letter-spacing:.25em}.regular-text{font-family:klinic-reg,klinic,helvetica neue,Helvetica,Arial,sans-serif;font-weight:400;letter-spacing:.0075em;-webkit-font-smoothing:antialiased}.prefix,.postfix{font-family:klinic-bold,klinic bold,helvetica neue,Helvetica,Arial,sans-serif;font-weight:600;letter-spacing:.05em;-webkit-font-smoothing:antialiased;-webkit-border-radius:3px 3px 3px 3px;-moz-border-radius:3px 3px 3px 3px;border-radius:3px 3px 3px 3px;text-transform:uppercase;letter-spacing:.25em;font-size:14px;height:3.3125rem;line-height:3.3125rem}/*!* Font Awesome 4.5.0 by @davegandy - http://fontawesome.io - @fontawesome -* License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)*/@font-face{font-family:fontawesome;src:url(/fonts/fontawesome-webfont.eot?v=4.5.0);src:url(/fonts/fontawesome-webfont.eot?#iefix&v=4.5.0)format("embedded-opentype"),url(/fonts/fontawesome-webfont.woff2?v=4.5.0)format("woff2"),url(/fonts/fontawesome-webfont.woff?v=4.5.0)format("woff"),url(/fonts/fontawesome-webfont.ttf?v=4.5.0)format("truetype"),url(/fonts/fontawesome-webfont.svg?v=4.5.0#fontawesomeregular)format("svg");font-weight:400;font-style:normal}.fa{display:inline-block;font:14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fadein{from{opacity:0}to{opacity:1}}@-moz-keyframes fadein{from{opacity:0}to{opacity:1}}@-webkit-keyframes fadein{from{opacity:0}to{opacity:1}}@-ms-keyframes fadein{from{opacity:0}to{opacity:1}}@-o-keyframes fadein{from{opacity:0}to{opacity:1}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0);-webkit-transform:scale(-1,1);-ms-transform:scale(-1,1);transform:scale(-1,1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:scale(1,-1);-ms-transform:scale(1,-1);transform:scale(1,-1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-remove:before,.fa-close:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-gear:before,.fa-cog:before{content:""}.fa-trash-o:before{content:""}.fa-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-rotate-right:before,.fa-repeat:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before{content:""}.fa-check-circle:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-warning:before,.fa-exclamation-triangle:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-gears:before,.fa-cogs:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before{content:""}.fa-arrow-circle-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-save:before,.fa-floppy-o:before{content:""}.fa-square:before{content:""}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-unsorted:before,.fa-sort:before{content:""}.fa-sort-down:before,.fa-sort-desc:before{content:""}.fa-sort-up:before,.fa-sort-asc:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-legal:before,.fa-gavel:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-flash:before,.fa-bolt:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-paste:before,.fa-clipboard:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-unlink:before,.fa-chain-broken:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:""}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:""}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:""}.fa-euro:before,.fa-eur:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-rupee:before,.fa-inr:before{content:""}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:""}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:""}.fa-won:before,.fa-krw:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-turkish-lira:before,.fa-try:before{content:""}.fa-plus-square-o:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-institution:before,.fa-bank:before,.fa-university:before{content:""}.fa-mortar-board:before,.fa-graduation-cap:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:""}.fa-file-zip-o:before,.fa-file-archive-o:before{content:""}.fa-file-sound-o:before,.fa-file-audio-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before{content:""}.fa-ge:before,.fa-empire:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-send:before,.fa-paper-plane:before{content:""}.fa-send-o:before,.fa-paper-plane-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-hotel:before,.fa-bed:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-yc:before,.fa-y-combinator:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-tv:before,.fa-television:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}body.home{font-family:helvetica neue,Helvetica,Arial,sans-serif;letter-spacing:0;overflow-x:hidden}body.home .row{max-width:72rem}body.home .row.fullwidth{max-width:100%}body.home h1{font-family:klinic-bold,klinic bold,helvetica neue,Helvetica,Arial,sans-serif;font-weight:600;letter-spacing:.05em;-webkit-font-smoothing:antialiased}body.home h2,body.home h3,body.home h4,body.home h5{font-family:klinic-reg,klinic,helvetica neue,Helvetica,Arial,sans-serif;font-weight:400;letter-spacing:.0075em;-webkit-font-smoothing:antialiased}body.home #footer{max-width:100%}body.home #footer .row{max-width:100%}html,body{height:100%}nav.home-nav{position:absolute;min-height:300px;left:0;right:0;top:0;z-index:2000}nav.home-nav h1{position:absolute;left:5%;top:.5rem;max-width:250px}nav.home-nav ul{position:absolute;top:3.25rem;right:2%}nav.home-nav ul li{list-style:none;display:inline-block}nav.home-nav ul li a{display:inline-block;margin:0 1.333rem;font-size:1.25rem;line-height:2;position:relative;letter-spacing:.0125em;color:#464646;text-decoration:none;font-family:klinic-bold,klinic bold,helvetica neue,Helvetica,Arial,sans-serif;font-weight:600;letter-spacing:.05em;-webkit-font-smoothing:antialiased;position:relative;display:inline-block;text-align:center;transition:all .3s ease-in-out}nav.home-nav ul li a::after{display:inline-block;content:"";background:#f99eac;height:3px;position:absolute;bottom:0;left:50%;width:10%;opacity:0;margin:0 0 0 -5%;transition:all .3s ease-in-out}nav.home-nav ul li a:hover::after{width:100%;left:0;margin-left:0;opacity:1}nav.home-nav ul li a img{max-height:2rem;color:#464646;line-height:2.5;padding-top:.5rem;margin:-.5rem -1rem 0 1rem}nav.home-nav ul li a img:hover{opacity:.7}#helm.home{background:#3fb1e5}#helm.home .billboard{background-color:#fff;background-size:376px;background-attachment:fixed;min-height:480px;padding-top:250px;position:relative;text-align:center}#helm.home .billboard h1{font-family:klinic-bold,klinic bold,helvetica neue,Helvetica,Arial,sans-serif;font-weight:600;letter-spacing:.05em;-webkit-font-smoothing:antialiased;color:#3fb1e5;font-size:2.925rem}#helm.home .billboard h2{font-family:helvetica neue,Helvetica,Arial,sans-serif;letter-spacing:0;color:#27759a;font-size:1.25rem;margin-bottom:30px}#helm.home .billboard:after{background:url(/img/pattern-waves.png)repeat-x;background-size:20px;bottom:0;content:'';display:block;height:6px;position:absolute;width:100%}#helm.home .billboard.blog-billboard{min-height:180px;padding-top:50px}#helm.home #blog{background:#3fb1e5;background:linear-gradient(180deg,#4cb3e1 0%,#2a8cb8 100%);margin-bottom:6rem;min-height:450px}#helm.home #blog .blog-section h1.blog-subhead{font-size:1.5rem;padding:2rem 5rem;opacity:.75}#helm.home #blog article.post__content{padding-top:2rem;padding-bottom:7.5rem}#helm.home #blog article.post__content h1{font-size:3rem}#helm.home #blog p{padding-right:2%;font-size:1.333rem;line-height:1.636;margin-top:1.2rem;margin-bottom:2rem}#helm.home #blog p.date{font-size:.925rem;font-weight:700;margin:-.5rem 0 2.5rem;color:#27759a}#helm.home #blog p.author{margin-top:2.5rem;line-height:1.2}#helm.home #blog p.author small{font-size:1rem}#helm.home .content h1,#helm.home .content h2,#helm.home .content h3,#helm.home .content h5{color:#fff;font-family:klinic-bold,klinic bold,helvetica neue,Helvetica,Arial,sans-serif;font-weight:600;letter-spacing:.05em;-webkit-font-smoothing:antialiased}#helm.home .content h2{font-size:2.5rem;margin:2rem 0;padding-top:1em}#helm.home .content p,#helm.home .content ul,#helm.home .content li{color:#fff;font-size:1.5rem;line-height:1.4;font-family:helvetica neue,Helvetica,Arial,sans-serif;letter-spacing:0;-webkit-font-smoothing:antialiased}#helm.home .content p{margin-bottom:1.4rem}#helm.home .content .github-stats{padding-top:1em}#helm.home .content a{color:#464646}#helm.home .content .helm-overview-img{margin:3.5rem 0 3rem}#helm.home .helm-features{background:url(/img/features-bg.png)no-repeat 50% 0;background-size:cover;text-align:center;margin-top:5em;margin-bottom:2em;padding-bottom:4rem}#helm.home .helm-features .large-3{min-height:280px}#helm.home .helm-features h2{font-family:klinic-bold,klinic bold,helvetica neue,Helvetica,Arial,sans-serif;font-weight:600;letter-spacing:.05em;-webkit-font-smoothing:antialiased;color:#27759a;border-bottom:4px solid #afdff4;margin:1.5rem 0 2.5rem;display:inline-block}#helm.home .helm-features h2 .fa{color:#ff2a53}#helm.home .helm-features h3{color:#27759a;margin:.25em 0 .5em;font-size:1.5rem;position:relative;font-family:klinic-bold,klinic bold,helvetica neue,Helvetica,Arial,sans-serif;font-weight:600;letter-spacing:.05em;-webkit-font-smoothing:antialiased}#helm.home .helm-features h3 small{position:absolute;top:8.667em;color:red;width:10em;left:50%;font-size:.6em;margin-left:-5em}#helm.home .helm-features h3:not(:first-child){padding-top:2em}#helm.home .helm-features .columns{position:relative}#helm.home .helm-features img{top:0;left:50%}#helm.home .helm-features p{font-size:1.5em;padding:0 5%}#helm.home .helm-features p code{border:none}#helm.home .helm-features .row{background-color:#fff}#helm.home .helm-features .row:first-child{border-radius:.5em .5em 0 0}#helm.home .helm-features .row:last-child{padding-bottom:.5em;border-radius:0 0 .5em .5em}#helm.home .get-helm{padding-bottom:50px;border:2px dashed #7fccf0;padding:2em;margin-bottom:4em;position:relative;z-index:100}#helm.home .get-helm:after{position:absolute;display:block;content:" ";top:.667em;left:-.25em;width:100%;height:375px;z-index:-5;background-color:#27759a;transform:rotateX(12deg);opacity:.425}#helm.home .get-helm h2{margin:0 0 .5em;padding:0}#helm.home .get-helm img{margin:.333em 0}#helm.home .get-charts{padding-left:3.5rem}#helm.home .get-charts h2{margin:2.5rem 0 1rem;padding:0}#helm.home .helm-community{background-color:#fff;padding-top:50px;padding-bottom:100px;color:#27759a;background:linear-gradient(0deg,#fff,#F7F7F7)}#helm.home .helm-community h2,#helm.home .helm-community p{color:#27759a}#helm.home .helm-community h2{margin-bottom:.5em}#helm.home .helm-community h2+p{margin-bottom:4.5rem}#helm.home .helm-community .helm-community-links ul{background-color:#fff;padding:1.5em 2.25em;border-radius:1em}#helm.home .helm-community .helm-community-links ul li{font-size:1.5rem;list-style:none;color:#27759a;line-height:2.5;padding-left:2.25em;position:relative;font-family:klinic-reg,klinic,helvetica neue,Helvetica,Arial,sans-serif;font-weight:400;letter-spacing:.0075em;-webkit-font-smoothing:antialiased}#helm.home .helm-community .helm-community-links ul li a{color:#464646;border-bottom:3px solid #3fb1e5;text-decoration:none}#helm.home .helm-community .helm-community-links ul li a:hover{color:#3fb1e5;border-color:#7fccf0}#helm.home .helm-community .helm-community-links ul li .fa{color:#3fb1e5;font-size:2rem;width:1.25em;padding-right:0;position:absolute;left:0;top:.525em}#helm.home .helm-community .helm-community-blocks section{border:1px solid #27759a;border-radius:1rem;margin:0 0 2em;padding:1.25rem 1.5rem;min-height:125px;position:relative}#helm.home .helm-community .helm-community-blocks section h4{color:#27759a;font-size:1.5em;font-family:klinic-bold,klinic bold,helvetica neue,Helvetica,Arial,sans-serif;font-weight:600;letter-spacing:.05em;-webkit-font-smoothing:antialiased;margin:-.25em 0 .667em}#helm.home .helm-community .helm-community-blocks section p{color:#27759a;font-size:1.4rem}#helm.home .helm-community .helm-community-blocks section a{color:#464646}#helm.home .helm-community .helm-community-blocks section iframe{width:35%;display:inline-block;min-width:200px;position:absolute;right:1em;top:1em}#helm.home .helm-community .helm-community-blocks section .right{background-color:#f8f8f8;text-align:center;padding:1.25em 2em 1em;width:33.3%;position:absolute;top:1em;right:1em}#helm.home .helm-community .helm-community-blocks section .right .fa{font-size:2.75rem;float:left;display:inline-block;padding-right:.333em;color:#3fb1e5}#helm.home .helm-community .helm-community-blocks section .right em{font-style:normal;font-size:1.125em;display:inline-block;min-width:50%;color:#3fb1e5;font-weight:700}#helm.home .helm-community .helm-community-blocks section .right small{display:inline-block;font-size:.667rem;min-width:50%;color:#3fb1e5}.helm-contrib-logos{text-align:center;padding-bottom:50px}.helm-contrib-logos .helm-contrib-logos{padding-top:1.5rem}.helm-contrib-logos img{padding:0;display:inline-block;margin:0;max-width:15%}.helm-contrib-logos .helm-logo{margin:0 auto;margin-bottom:2.25em;display:block;text-align:center;padding:3.5em 0 0}.helm-contrib-logos hr{background-color:#7fccf0;height:2px;opacity:.25;width:50%;margin:1rem 25%}.helm-contrib-logos p{color:#4e4e4e;text-align:center;padding:0;margin:0 auto;font-size:1.333em;line-height:2;letter-spacing:.025em;color:#9b9b9b}.helm-contrib-logos p a{color:#464646;border-bottom:2px solid transparent}.helm-contrib-logos p a:hover{border-bottom:2px solid #3fb1e5}.helm-contrib-logos p small{padding-top:1rem;font-size:.925em}.full-width{min-width:100%}.cncf{background:RGBA(246,246,246,1);min-height:5rem;margin-top:4rem;text-align:center;padding-left:0!important}.cncf img{float:left;display:inline-block;max-width:14rem;margin:3rem 5%}.cncf p{float:right;margin:3.5rem 5%;display:inline-block;font-family:helvetica;color:#777}.cncf p:hover{color:#7fccf0}.copyright{background:#3fb1e5;color:#fff;font-size:1.3rem;padding:1rem}.copyright a,.copyright a:focus,.copyright a:visited{color:#464646}@media only screen and (min-device-width:415px){@keyframes animatedBoat{0%{background-position:-150px 25%;bottom:-7px}10%{bottom:-12px}20%{bottom:-7px}30%{bottom:-12px}40%{bottom:-7px}50%{bottom:-12px}60%{bottom:-7px}70%{bottom:-12px}80%{bottom:-7px}90%{bottom:-12px}100%{background-position:145% 0;bottom:-7px}}@-moz-keyframes animatedBoat{0%{background-position:-150px 25%;bottom:-7px}10%{bottom:-12px}20%{bottom:-7px}30%{bottom:-12px}40%{bottom:-7px}50%{bottom:-12px}60%{bottom:-7px}70%{bottom:-12px}80%{bottom:-7px}90%{bottom:-12px}100%{background-position:145% 0;bottom:-7px}}@-webkit-keyframes animatedBoat{0%{background-position:-150px 25%;bottom:-7px}10%{bottom:-12px}20%{bottom:-7px}30%{bottom:-12px}40%{bottom:-7px}50%{bottom:-12px}60%{bottom:-7px}70%{bottom:-12px}80%{bottom:-7px}90%{bottom:-12px}100%{background-position:145% 0;bottom:-7px}}@-ms-keyframes animatedBoat{0%{background-position:-150px 25%;bottom:-7px}10%{bottom:-12px}20%{bottom:-7px}30%{bottom:-12px}40%{bottom:-7px}50%{bottom:-12px}60%{bottom:-7px}70%{bottom:-12px}80%{bottom:-7px}90%{bottom:-12px}100%{background-position:145% 0;bottom:-7px}}@-o-keyframes animatedBoat{0%{background-position:-150px 25%;bottom:-7px}10%{bottom:-12px}20%{bottom:-7px}30%{bottom:-12px}40%{bottom:-7px}50%{bottom:-12px}60%{bottom:-7px}70%{bottom:-12px}80%{bottom:-7px}90%{bottom:-12px}100%{background-position:145% 0;bottom:-7px}}}#boat{height:2em}@media only screen and (min-device-width:415px){#boat{background:url(/img/boat.png)no-repeat;background-size:150px;height:169px;position:relative;-moz-animation:animatedBoat 10s linear infinite;-webkit-animation:animatedBoat 10s linear infinite;-ms-animation:animatedBoat 10s linear infinite;-o-animation:animatedBoat 10s linear infinite;animation:animatedBoat 10s linear infinite;-webkit-animation-duration:20s;-moz-animation-duration:20s;-ms-animation-duration:20s;-o-animation-duration:20s;animation-duration:20s}}@media screen and (max-width:1024px){#helm .billboard .helm-logo{position:absolute;left:50%;top:2.3rem;max-width:112px;margin-left:-66px}#helm .billboard h1{margin:-3rem 10% 0;font-size:2.25rem}#helm .billboard h2{margin:1rem 12.5%;font-size:1.5rem}.contrib-logos-1 img,.contrib-logos-2 img{max-height:80px}.cncf{padding-top:2rem;padding-bottom:2rem;padding-left:0!important}.cncf img,.cncf p{float:none;margin:1.5rem auto}.cncf img{max-width:51%}}#helm .panel{font-size:21px;padding:13.33333333px 0;width:100%;position:relative}@media only screen and (max-width:40em){#helm .panel{padding:10px 0}}#helm .panel.-blue{background-color:#3fb1e5;color:#fff}@media only screen and (min-width:40.063em){#helm .panel.-blue{padding-top:20px}}#helm .panel.-blue h1,#helm .panel.-blue h2,#helm .panel.-blue p{color:#555}#helm .panel.-gray{background-color:#f4f4f4}#helm .geo-shapes-title{margin:0 auto}#helm .geo-shapes-title.blue h2 hr.border{border-color:#3fb1e5}#helm .geo-shapes-title.pink h2 hr.border{border-color:#ff2a53}#helm .geo-shapes-title h2{display:inline-block;line-height:1;padding:0 1em;margin:0 0 1.5em;font-family:klinic-bold,klinic bold,helvetica neue,Helvetica,Arial,sans-serif;font-weight:600;letter-spacing:.05em;-webkit-font-smoothing:antialiased}#helm .geo-shapes-title h2 hr.border{border-color:#ddf5f2;border-width:0 0 5px;margin:.575em -5% 1em}#helm .geo-shapes-title h2 .geo-shapes{padding-bottom:0;font-size:21px;line-height:1.5}#helm .geo-shapes-title h2 .geo-shapes hr{width:42.5%;margin-left:auto;margin-right:auto}#helm .panel.panel--signoff{min-height:320px;overflow:hidden;margin-top:75px}#helm .panel.panel--signoff.panel--signoff-how{min-height:570px}#helm .panel.panel--signoff .text-center{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);margin-top:-5%;z-index:1200}#helm .panel.panel--signoff .text-center .geo-shapes{padding-top:2em;padding-bottom:.5em}#helm .panel.panel--signoff .text-center h2{margin:.5em 0}#helm .panel.panel--signoff .text-center h4 a{position:relative;display:inline-block;text-align:center;transition:all .3s ease-in-out;line-height:1}#helm .panel.panel--signoff .text-center h4 a::after{display:inline-block;content:"";background:#f99eac;height:3px;position:absolute;bottom:0;left:50%;width:10%;opacity:0;margin:0 0 0 -5%;transition:all .3s ease-in-out}#helm .panel.panel--signoff .text-center h4 a:hover::after{width:100%;left:0;margin-left:0;opacity:1}#helm .panel.panel--signoff .text-center p:last-child{margin-bottom:0}#helm .panel.panel--signoff .shape-position.shape-position-bottom{bottom:-10%}#helm .intro{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);margin-top:50px}#helm .intro .geo-shapes{padding-bottom:.5em}#helm .intro p{max-width:92%;font-size:.875em;margin:.5em auto 1.5em}#helm .content .pics p{padding-right:0}#helm .content .text-center p{padding-right:0}#helm .content p{padding-right:5%;line-height:1.636;margin-bottom:1.5rem}@media only screen and (min-width:40.063em){#helm .content p:last-child{margin-bottom:1em}}#helm .content p.lead{font-family:klinic-reg,klinic,helvetica neue,Helvetica,Arial,sans-serif;font-weight:400;letter-spacing:.0075em;-webkit-font-smoothing:antialiased;padding:0;font-size:.925em}#helm .content code,#helm .content pre{font-family:Consolas,liberation mono,Courier,monospace;background:#f0f0f0;border:none;color:#464646;line-height:1.8}#helm .content table{border:2px solid #f4f4f4;margin:1.5em auto;width:100%}#helm .content table th,#helm .content table td{vertical-align:top;padding:.825em 1.5em 1.25em .75em;line-height:1.333}#helm .content table th{font-family:klinic-bold,klinic bold,helvetica neue,Helvetica,Arial,sans-serif;font-weight:600;letter-spacing:.05em;-webkit-font-smoothing:antialiased;color:#fff;font-size:1em;background:#4e4e4e;line-height:1.2}#helm .content table .small{font-size:.75em;line-height:1.7;max-width:50%}#helm .content dl{margin:0 0 1.5em;font-size:1.25rem;line-height:1.5}#helm .content dl dt,#helm .content dl dd{font-family:klinic-reg,klinic,helvetica neue,Helvetica,Arial,sans-serif;font-weight:400;letter-spacing:.0075em;-webkit-font-smoothing:antialiased}#helm .content dl dt{font-family:klinic-bold,klinic bold,helvetica neue,Helvetica,Arial,sans-serif;font-weight:600;letter-spacing:.05em;-webkit-font-smoothing:antialiased;color:#c4c4c4}#helm .content dl.inline-list dt,#helm .content dl.inline-list dd{float:left;display:inline-block;margin-right:1em}#helm .content dl.inline-list dt{clear:left}#helm .content address{font-family:klinic-reg,klinic,helvetica neue,Helvetica,Arial,sans-serif;font-weight:400;letter-spacing:.0075em;-webkit-font-smoothing:antialiased;font-size:1.25rem;margin:2em 0 1em;line-height:1.333}#helm .content address em{font-family:klinic-bold,klinic bold,helvetica neue,Helvetica,Arial,sans-serif;font-weight:600;letter-spacing:.05em;-webkit-font-smoothing:antialiased;font-style:normal;color:#c4c4c4}#helm .content hr.blank{color:#fff;border-color:#fff}#helm .content a.ripple{position:relative;display:inline-block;text-align:center;transition:all .3s ease-in-out;display:inline}#helm .content a.ripple::after{display:inline-block;content:"";background:#f99eac;height:3px;position:absolute;bottom:0;left:50%;width:10%;opacity:0;margin:0 0 0 -5%;transition:all .3s ease-in-out}#helm .content a.ripple:hover::after{width:100%;left:0;margin-left:0;opacity:1}#helm .content a.ripple:after{position:absolute;left:0;bottom:-.2em}#helm .content .breakout-cta-row{background:#fff;box-shadow:0 1px 3px #dedede;padding:1em 1.25em;margin-bottom:1.25em}#helm .content .breakout-cta-row p.left{font-size:.75em;padding:.5em 0;margin:0;color:#787878}@media only screen and (max-width:40em){#helm .content .breakout-cta-row p.left,#helm .content .breakout-cta-row button{float:none;text-align:center;margin:0 auto}}#helm .content .centerer{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}#helm .hidden{display:none}#helm .off-canvas-wrap{height:100%}#helm .off-canvas-wrap.move-left{position:fixed}@media only screen and (max-width:40em){#helm .navbar.top-bar{top:0}}#helm #tos{padding-top:100px}@media only screen and (max-width:40em){#helm #tos{padding:80px 20px 20px}}.blog-layout .main{padding-top:2rem}.blog-layout .main.blog .content-wrap h1{margin-top:0;color:#3c2e53}.blog-layout .main.blog .content-wrap article{padding:0}.blog-layout .main.blog .content-wrap article h2{text-transform:capitalize;letter-spacing:.05em;font-size:2rem}.blog-layout .main.blog .content-wrap article p.date{margin-top:0;padding-top:0;font-weight:700;font-size:1rem;color:#937db7;margin:.5rem 0}.blog-layout .main.blog .content-wrap article .summary p{display:inline;margin:0;padding:0}.blog-layout .main.blog .content-wrap article .summary a{font-weight:900}.blog-layout .main.blog-single .content-wrap article h1{font-size:2.75rem;margin-bottom:.25em}.blog-layout .main.blog-single .content-wrap article p.date{font-style:italic;margin-bottom:2.67em}.blog-layout .main.blog-single .content-wrap article img{box-shadow:none;display:block;margin:0 auto}.blog-layout .main.blog-single .content-wrap article img:hover{-webkit-box-shadow:none 2px 0 rgba(30,30,30,.25);-moz-box-shadow:none 2px 0 rgba(30,30,30,.25);box-shadow:none 2px 0 rgba(30,30,30,.25)}.blog-layout .main.blog-single .content-wrap article .blog-meta{margin-top:7.5rem}.blog-layout .main.blog-single .content-wrap article .blog-author{text-align:left}.blog-layout .main.blog-single .content-wrap article .blog-author figure{display:inline-block;width:100%}.blog-layout .main.blog-single .content-wrap article .blog-author figure a{position:relative;background:#f4e8ca;padding:1rem;display:inline-block;width:100%;min-height:12rem;border-radius:.67em;padding-left:12rem}.blog-layout .main.blog-single .content-wrap article .blog-author figure a img{position:absolute;left:1rem;top:1rem;border-radius:50%;max-width:10rem}.blog-layout .main.blog-single .content-wrap article .blog-author figure a figcaption{text-align:left;font-size:1.35rem;margin-top:2.75rem}.blog-layout .main.blog-single .content-wrap article .blog-tags{position:relative;padding:1rem 2rem;min-height:12rem}.blog-layout .main.blog-single .content-wrap article .blog-tags a.tag{font-size:1.25rem;border-radius:2rem;background:#3fb1e5;color:#fff;padding:.5rem 1.5rem;margin:2.25rem .25rem;font-weight:700;text-transform:uppercase;letter-spacing:.075em}.blog-layout .main.blog-single .content-wrap article .button-rss{displog-single .content-wrap article .button-rss{display:block;background:#dcf1fa;border-radius:3rem;margin:2.5rem 0 0;position:absolute;bottom:0;left:5%;right:5%}html,body{min-height:100%;padding:0;margin:0;background:#fff;background-position:static;background-attachment:fixed}.main{min-height:760px}.sidebar{min-height:100%}.container-full{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;min-height:100%;height:100%;overflow-y:scroll;overflow-x:hidden;padding-left:300px;width:100%}.sidebar{width:25%;width:300px}.flextable{display:flex;flex-flow:row;flex-wrap:wrap;justify-content:space-evenly;align-items:baseline}.sidebar{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;min-height:100%;left:0;top:0;bottom:0;background:#ddf5f2;z-index:700;position:fixed;border-right:1px solid #cfedfa}.sidebar .sidebar-wrap{overflow-x:hidden;overflow-y:scroll;display:block;position:relative;height:100%;margin-top:-5rem;margin-bottom:-4.75rem;z-index:10;padding:0}.sidebar a{transition:all .3s ease-in-out}.sidebar a .ripple{margin:auto 0;display:inline-block}.sidebar a .ripple span{display:block;margin:0 auto;background:#2090cd;width:10%;opacity:0;height:3px;transition:all .3s ease-in-out}.sidebar a:hover .ripple span{width:100%;opacity:1}.sidebar h1{margin:0;padding:0;min-height:5rem;z-index:1020;position:relative;text-transform:none}.sidebar h1 a{display:block;width:100%;padding:.1333em 2.25rem;background-color:#fff;text-align:left}.sidebar h1 a img,.sidebar h1 a svg{display:block;fill:currentColor;transition:all .3s ease-in-out}.sidebar h1 a span{top:1em;position:absolute;font-size:1.5rem;color:#2090cd;left:6.5rem;letter-spacing:-.125rem;font-family:klinic-reg,klinic,helvetica neue,Helvetica,Arial,sans-serif;font-weight:400;letter-spacing:.0075em;-webkit-font-smoothing:antialiased}.sidebar h1 a:hover{background:#e4e4e4}.sidebar h1 a:hover svg{color:#fff!important}.sidebar ul{margin:0 auto .5em;padding:7.5rem 0 6rem}.sidebar ul li a{display:block;padding:0 15% .25em;color:#666;letter-spacing:.035em;line-height:1.4;text-transform:capitalize;font-size:1.5em;font-family:klinic-bold,klinic bold,helvetica neue,Helvetica,Arial,sans-serif;font-weight:600;letter-spacing:.05em;-webkit-font-smoothing:antialiased;letter-spacing:.02em;transition:all .3s cubic-bezier(0.25,0.1,0.25,1)}.sidebar ul li a:hover{color:#277a9f;background:#b8dff4}.sidebar ul li a.active{text-decoration:underline;background:0 0}.sidebar ul li a.active span.ripple{text-decoration:underline;width:100%;opacity:1}.sidebar ul li a.active:hover .ripple span{background:#2090cd}.sidebar ul li a.active+ul{display:block}.sidebar ul li:last-child a.sidebar-nav-item:after{content:'\f08e';font-family:fontawesome;display:inline-block;padding-left:.5em;width:1em;height:1em;font-size:15px;opacity:.5}.sidebar ul li.toctree-l1.current ul{display:block!important}.sidebar ul li ul{margin:0;padding:.5em 0 1.25em;display:none}.sidebar ul li ul li{margin:0}.sidebar ul li ul li a{padding:.25em 0 .25em 17.5%;line-height:1;font-size:14px;border-right:4px solid transparent;transition:all .3s ease-in-out;font-family:helvetica neue,Helvetica,Arial,sans-serif;font-weight:700}.sidebar ul li ul li a:hover{color:#277a9f;background:#b8dff4}.sidebar ul li ul li.active a{color:#277a9f;border-right:4px solid #277a9f;background:#e6f3f9}.sidebar .sidebar-buttons{border-top:2px solid #fff;min-height:4.75rem;background:#ddf5f2}.sidebar .sidebar-buttons .button-wrap{width:300px;padding:.5em 10%}.sidebar .sidebar-buttons .button.expand.small{margin:.333em 0;display:block;padding-top:.5rem;padding-bottom:.575rem;background-color:#fff;color:#2090cd}.sidebar .sidebar-buttons .button.expand.small i{margin:-.05em .5em 0 -.667em;color:#2090cd;font-size:14px}.left-off-canvas-toggle .fa{background-color:#fff}.left-off-canvas-toggle .fa:before{color:#2090cd}.top-bar{perspective:800px;min-height:5.125em;transform-style:preserve-3d;background:#fff;border-bottom:1px solid #cfedfa;transition:transform 200ms linear;position:fixed;left:300px;right:0;top:0;z-index:1000}.top-bar ul{min-width:33.333%;margin-right:0;margin-top:.75em;padding-right:3.5%}.top-bar ul li{display:inline-block;margin:0 .5rem}.top-bar ul li a{padding:1em;color:#277a9f;font-size:1.125rem;font-family:klinic-bold,klinic bold,helvetica neue,Helvetica,Arial,sans-serif;font-weight:600;letter-spacing:.05em;-webkit-font-smoothing:antialiased}.top-bar ul li a img{padding-right:.333em;max-height:1.2rem}.top-bar ul li:last-child,.top-bar ul li:nth-last-child(2){margin-right:-1rem}.top-bar .breadcrumb{position:absolute;top:0;left:1em;z-index:1030;line-height:1.5;font-size:14px;letter-spacing:.05em}.top-bar .breadcrumb a{padding:.333em 0;margin:.575em 0 .575em .5em;float:left;text-transform:capitalize;font-size:1.5rem;color:#2090cd;letter-spacing:-.125rem;font-family:klinic-reg,klinic,helvetica neue,Helvetica,Arial,sans-serif;font-weight:400;letter-spacing:.0075em;-webkit-font-smoothing:antialiased;transition:all .3s ease-in-out}.top-bar .breadcrumb a:hover{color:#2dafe9}.top-bar .breadcrumb a:before{content:'/';display:inline-block;width:.75em;height:2em;margin:0 0 0 -.2em;color:#ccc}.top-bar .breadcrumb a:first-child:before{display:none}.left-off-canvas-toggle{z-index:1100;position:fixed;top:0;left:0}.left-off-canvas-toggle img{padding:1.425em .925em;color:#333}.main{margin-bottom:-5em}.main.footer-expanded{margin-bottom:-11em}.styleguide-footer{min-height:5rem;overflow:hidden;position:relative;z-index:500;padding-top:1.25em;background-color:#333;border-bottom:6px solid #333;min-width:100%;transition:all .3s ease-in-out}.styleguide-footer ul{list-style:none;float:left;margin-bottom:0}.styleguide-footer ul li{display:block;margin:0}.styleguide-footer ul li a{font-weight:400}.styleguide-footer p,.styleguide-footer li{color:#999;line-height:1.7;font-size:.667rem;font-family:klinic-reg,klinic,helvetica neue,Helvetica,Arial,sans-serif;font-weight:400;letter-spacing:.0075em;-webkit-font-smoothing:antialiased}.styleguide-footer li a{font-size:.75rem}.styleguide-footer strong{text-transform:uppercase;letter-spacing:.25em;margin:.75rem 0 .25rem;display:block;font-weight:400}.styleguide-footer strong a{color:#999;cursor:pointer}.styleguide-footer a{color:#2dafe9}.styleguide-footer a:hover{border:none;text-decoration:none;color:#fff}.styleguide-footer .fa.footer-reveal{font-size:1rem;cursor:pointer;width:2em;height:2em;text-align:center;position:absolute;left:-.65em;top:.35rem;-webkit-border-radius:50% 50% 50% 50%;-moz-border-radius:50% 50% 50% 50%;border-radius:50% 50% 50% 50%;transition:all .3s ease-in-out}.styleguide-footer .fa.footer-reveal:hover{background:#262626;color:#999}.styleguide-footer p{margin-top:.75rem;color:#333}.styleguide-footer p:nth-child(2){margin-top:2.67rem;font-size:.75rem;line-height:1.5}.styleguide-footer p:nth-child(2) a{color:#2dafe9}.styleguide-footer img{margin:0;float:right;opacity:.7;transition:all .3s ease-in-out}.styleguide-footer img:hover{opacity:1}.styleguide-footer .sub-nav-social{position:absolute;right:1em;bottom:2em;text-align:right}.styleguide-footer .sub-nav-social li{display:inline-block;margin:1rem .25em;text-align:right}.styleguide-footer .sub-nav-social li a{font-size:1.5em;color:#666;width:2em;height:2em;text-align:center;background:#262626;-webkit-border-radius:50% 50% 50% 50%;-moz-border-radius:50% 50% 50% 50%;border-radius:50% 50% 50% 50%;transition:all .3s ease-in-out}.styleguide-footer .sub-nav-social li a:hover{background:#277a9f;color:#fff}.styleguide-footer .footer-extra div{display:none;opacity:0;height:0;min-height:0;overflow:hidden;transition:all .3s ease-in-out}.styleguide-footer.footer-expanded{margin-top:-11rem;min-height:11rem}.styleguide-footer.footer-expanded .footer-extra div{display:block;opacity:1;min-height:8em}.styleguide-footer.footer-expanded a.fa.footer-reveal{-ms-transform:rotate(180deg);-webkit-transform:rotate(180deg);transform:rotate(180deg)}#contrib{background:#2dafe9;padding-bottom:4rem}.contrib-text p{color:#fff;font-size:1rem;margin:0 auto;padding-left:2rem}.contrib-text p.lead{font-size:1.2rem;margin:2rem auto 3rem;position:relative;line-height:4}.contrib-text p.lead:after{content:" ";display:block;width:14%;position:absolute;bottom:-1.25rem;left:43%;height:5px;background:#ccc;opacity:.25}.contrib-text p img{max-height:24px;margin:-2px 0 0 22px}.contrib-text p a{color:#fff;font-weight:700}.cncf-wrap{max-width:100%}.cncf{background:#e4e4e4;min-height:2rem;text-align:center;padding-left:300px}.cncf img{float:left;display:inline-block;max-width:10rem;margin:1.5rem 0 1.5rem 7.5%}.cncf p{float:right;margin:1.5rem 2.5% 0 0;display:inline-block;font-family:helvetica;color:#222}.cncf p:hover{color:#2ba0d3}.home{box-sizing:border-box;min-height:100%}.home a{text-decoration:underline}.home .docs-home #helm{background:#2dafe9}.home .home-intro-wrap{box-sizing:border-box;min-height:100%;background:#2dafe9}.home h3{color:#f6fbfe;font-size:1.125rem;font-family:klinic-bold,klinic bold,helvetica neue,Helvetica,Arial,sans-serif;font-weight:600;letter-spacing:.05em;-webkit-font-smoothing:antialiased}.home #helm{max-width:100%;position:relative;z-index:500}.home #helm:after{z-index:-100;display:block;height:850px;width:100%;bottom:0;position:fixed}.home #helm .billboard{background-color:#fff;background-size:376px;padding-top:230px;position:relative;text-align:center}.home #helm .billboard .helm-logo{max-width:120px}.home #helm .billboard h1{font-family:klinic-bold,klinic bold,helvetica neue,Helvetica,Arial,sans-serif;font-weight:600;letter-spacing:.05em;-webkit-font-smoothing:antialiased;color:#2dafe9;font-size:2.57rem;text-transform:none!important}.home #helm .billboard h2{font-family:helvetica neue,Helvetica,Arial,sans-serif;color:#277a9f;font-size:1.6rem;margin-bottom:30px}.home #helm .billboard .helm-logo{position:absolute;left:5rem;top:2rem;max-width:102px}.home #helm .billboard .fa{position:absolute;font-size:2.5rem;top:4rem;right:5rem;color:#333}.home #helm .billboard .fa.fa-twitter{right:9rem;color:#2ba0d3;transition:all .3s ease-in-out}.home #helm .billboard .fa:hover{opacity:.7}.home #helm .billboard:after{background:url(/img/pattern-waves.png)repeat-x;background-size:20px;bottom:0;content:'';display:block;height:6px;position:absolute;width:100%}@media only screen and (min-device-width:415px){@keyframes animatedBoat{0%{background-position:-150px 25%;bottom:-7px}10%{bottom:-12px}20%{bottom:-7px}30%{bottom:-12px}40%{bottom:-7px}50%{bottom:-12px}60%{bottom:-7px}70%{bottom:-12px}80%{bottom:-7px}90%{bottom:-12px}100%{background-position:145% 0;bottom:-7px}}@-moz-keyframes animatedBoat{0%{background-position:-150px 25%;bottom:-7px}10%{bottom:-12px}20%{bottom:-7px}30%{bottom:-12px}40%{bottom:-7px}50%{bottom:-12px}60%{bottom:-7px}70%{bottom:-12px}80%{bottom:-7px}90%{bottom:-12px}100%{background-position:145% 0;bottom:-7px}}@-webkit-keyframes animatedBoat{0%{background-position:-150px 25%;bottom:-7px}10%{bottom:-12px}20%{bottom:-7px}30%{bottom:-12px}40%{bottom:-7px}50%{bottom:-12px}60%{bottom:-7px}70%{bottom:-12px}80%{bottom:-7px}90%{bottom:-12px}100%{background-position:145% 0;bottom:-7px}}@-ms-keyframes animatedBoat{.home 0%{background-position:-150px 25%;bottom:-7px}.home 10%{bottom:-12px}.home 20%{bottom:-7px}.home 30%{bottom:-12px}.home 40%{bottom:-7px}.home 50%{bottom:-12px}.home 60%{bottom:-7px}.home 70%{bottom:-12px}.home 80%{bottom:-7px}.home 90%{bottom:-12px}.home 100%{background-position:145% 0;bottom:-7px}}@-o-keyframes animatedBoat{0%{background-position:-150px 25%;bottom:-7px}10%{bottom:-12px}20%{bottom:-7px}30%{bottom:-12px}40%{bottom:-7px}50%{bottom:-12px}60%{bottom:-7px}70%{bottom:-12px}80%{bottom:-7px}90%{bottom:-12px}100%{background-position:145% 0;bottom:-7px}}}.home #boat{height:2em}@media only screen and (min-device-width:415px){.home #boat{background:url(/img/boat.png)no-repeat;background-size:150px;height:120px;position:relative;margin-top:40px;-moz-animation:animatedBoat 10s linear infinite;-webkit-animation:animatedBoat 10s linear infinite;-ms-animation:animatedBoat 10s linear infinite;-o-animation:animatedBoat 10s linear infinite;animation:animatedBoat 10s linear infinite;-webkit-animation-duration:20s;-moz-animation-duration:20s;-ms-animation-duration:20s;-o-animation-duration:20s;animation-duration:20s}}.home .home-featured{background-color:#2dafe9;padding-top:20px;padding-bottom:65px;min-height:400px}.home .home-featured .panels{width:92%;max-width:1140px;min-width:800px}.home .home-featured .panel{background-color:#fff;-webkit-box-shadow:0 1px 4px #277a9f;-moz-box-shadow:0 1px 4px #277a9f;box-shadow:0 1px 4px #277a9f;-webkit-border-radius:.25em .25em .25em .25em;-moz-border-radius:.25em .25em .25em .25em;border-radius:.25em .25em .25em .25em;text-align:center;min-height:125px;color:#333;margin-bottom:1.25rem}.home .home-featured .panel h3{padding:.75rem 0 .5rem;border-bottom:1px solid #e4e4e4;margin:0 auto 1rem;font-size:1rem;color:#2090cd;font-family:klinic-bold,klinic bold,helvetica neue,Helvetica,Arial,sans-serif;font-weight:600;letter-spacing:.05em;-webkit-font-smoothing:antialiased;letter-spacing:.02em}.home .home-featured .panel p{line-height:1.4;display:block;font-size:.925rem;padding:0 3.5% 1rem}.main .list-wrap{padding-top:1em;padding-bottom:1em;font-size:17.92px;font-weight:400;line-height:1.5;z-index:500;position:relative;font-family:klinic-reg,klinic,helvetica neue,Helvetica,Arial,sans-serif;font-weight:400;letter-spacing:.0075em;-webkit-font-smoothing:antialiased}.main .list-wrap h1{text-transform:none;letter-spacing:.03em;margin-top:1em}.main .list-wrap h2{color:#595959;font-size:24px;letter-spacing:.05em;font-family:klinic-bold,klinic bold,helvetica neue,Helvetica,Arial,sans-serif;font-weight:600;letter-spacing:.05em;-webkit-font-smoothing:antialiased;text-transform:uppercase;letter-spacing:.25em;letter-spacing:.125em;margin:0 0 .875em;padding-top:1em}.main .list-wrap h3{color:#333;font-family:klinic-bold,klinic bold,helvetica neue,Helvetica,Arial,sans-serif;font-weight:600;letter-spacing:.05em;-webkit-font-smoothing:antialiased;margin:1.825em 0}.main .list-wrap h4{font-size:17.92px}.main .list-wrap p,.main .list-wrap ul,.main .list-wrap ol,.main .list-wrap blockquote{color:#333;line-height:1.725;font-size:17.92px}.main .list-wrap p{margin:.825rem 0 1.667rem}.main .list-wrap a{color:#1b79ac;background:#fff;transition:all .3s ease-in-out}.main .list-wrap a:hover{color:#2790be;border-bottom:2px solid #2dafe9;background-color:#f6fbfe}.main .list-wrap .header-link{position:absolute;left:-.4em;opacity:0;font-size:1rem;padding-top:.333em;transition:all .3s ease-in-out}.main .list-wrap .header-link:hover{border-bottom:none;background-color:transparent}.main .list-wrap h2:hover,.main .list-wrap h3:hover,.main .list-wrap h4:hover,.main .list-wrap h5:hover,.main .list-wrap h6:hover{color:#277a9f}.main .list-wrap h2:hover .header-link,.main .list-wrap h3:hover .header-link,.main .list-wrap h4:hover .header-link,.main .list-wrap h5:hover .header-link,.main .list-wrap h6:hover .header-link{opacity:1;left:-.825em}.main.docs{padding-top:4rem}.main .content-wrap{padding-top:1em;padding-bottom:10em;font-size:17.92px;font-weight:400;line-height:1.5;z-index:500;position:relative;font-family:klinic-reg,klinic,helvetica neue,Helvetica,Arial,sans-serif;font-weight:400;letter-spacing:.0075em;-webkit-font-smoothing:antialiased}.main .content-wrap h1{text-transform:none;letter-spacing:.03em;margin-top:1em}.main .content-wrap article{padding:2em 0 0;overflow:auto}.main .content-wrap article h1{font-size:32px;color:#2090cd;margin:1em 0}.main .content-wrap h2{color:#595959;font-size:24px;letter-spacing:.05em;font-family:klinic-bold,klinic bold,helvetica neue,Helvetica,Arial,sans-serif;font-weight:600;letter-spacing:.05em;-webkit-font-smoothing:antialiased;text-transform:uppercase;letter-spacing:.25em;letter-spacing:.125em;margin:0 0 .875em;padding-top:1em}.main .content-wrap h3{color:#333;font-family:klinic-bold,klinic bold,helvetica neue,Helvetica,Arial,sans-serif;font-weight:600;letter-spacing:.05em;-webkit-font-smoothing:antialiased;margin:1.825em 0}.main .content-wrap h4{font-size:17.92px}.main .content-wrap figure{width:max-content;text-align:center;margin:0 auto}.main .content-wrap blockquote p:first-child{color:#666}.main .content-wrap p{color:#333;line-height:1.725;margin:.825rem 0 1.667rem;font-size:17.92px}.main .content-wrap.markdown pre,.main .content-wrap pre{background-color:#e4f3f9;color:#000;border:none;padding:.75em 1em;margin:0 0 2.5em;font-size:1rem}.main .content-wrap.markdown pre code,.main .content-wrap pre code{padding:0;background-color:#e4f3f9;font-size:1rem;white-space:pre}.main .content-wrap .code-box{margin:0;width:100%;height:220px;border-bottom:3px solid #ccc;overflow:auto}.main .content-wrap strong{letter-spacing:.0125em}.main .content-wrap code{dispaly:block;color:#000;padding:.5em;background-color:#e4f3f9;border:none;font-size:1rem;white-space:nowrap}.main .content-wrap.markdown ul,.main .content-wrap.markdown ol,.main .content-wrap ul,.main .content-wrap ol{padding:0 .25rem;color:#333;font-size:17.92px;line-height:1.7}.main .content-wrap table{margin:1.5rem 0;border:none;width:100%}.main .content-wrap table th,.main .content-wrap table td{border:none;vertical-align:top;text-align:left;padding:.425em .75em .425em .2em;width:auto}.main .content-wrap table td{color:#333;font-size:17.92px}.main .content-wrap a{color:#1b79ac;background:#fff;transition:all .3s ease-in-out}.main .content-wrap a:hover{color:#2790be;border-bottom:2px solid #2dafe9;background-color:#f6fbfe}.main .content-wrap .header-link{position:absolute;left:-.4em;opacity:0;font-size:1rem;padding-top:.333em;transition:all .3s ease-in-out}.main .content-wrap .header-link:hover{border-bottom:none;background-color:transparent}.main .content-wrap h2:hover,.main .content-wrap h3:hover,.main .content-wrap h4:hover,.main .content-wrap h5:hover,.main .content-wrap h6:hover{color:#277a9f}.main .content-wrap h2:hover .header-link,.main .content-wrap h3:hover .header-link,.main .content-wrap h4:hover .header-link,.main .content-wrap h5:hover .header-link,.main .content-wrap h6:hover .header-link{opacity:1;left:-.825em}.main .content-wrap img{padding:.5em;background-color:#fff;max-width:100%;margin:0 auto;display:block}.main .content-wrap iframe,.main .content-wrap embed,.main .content-wrap .youtube-player{min-height:320px}.copy-button-container{display:flex;justify-content:flex-end}.copy-button-container .copy-button{margin-bottom:0;padding:4px}@media only screen and (max-width:64.063em){.container-full{padding-left:0;overflow-y:auto}.left-off-canvas-toggle .fa{padding:1em 1.25em;line-height:3}.sidebar{display:none}.top-bar{left:0}.top-bar ul.inline{display:none}.blog-logo{position:fixed;z-index:1450;max-width:50%;left:50%;margin:.25rem auto 0 -25%}.st-default-autocomplete{width:90%!important;min-width:320px!important;left:5%!important}nav.top-bar .docs-logo{display:none!important}.main.home{min-height:500px}.main.home .home-featured .panels{min-width:100%}.main.home .fa{display:none}.main.blog{padding-top:6.5rem}.main.docs{padding-top:3.5rem}.main.docs .docs-logo{position:absolute;z-index:1450;max-width:50%;left:50%;margin:.25rem auto 0 -25%;display:block!important}nav.home-nav ul{margin-left:auto;margin-right:auto}nav.home-nav ul li{padding:0;margin:0}nav.home-nav ul li a{background-color:#cfedfa;padding:.25rem 1rem;margin:0 .333rem .75rem;font-size:1rem;border-radius:.35em;min-width:15vw}nav.home-nav h1{position:absolute;left:7%;top:.5rem;margin-left:-3.5%;min-width:86%;text-align:center}nav.home-nav h1 img{max-width:45%;min-height:auto!important;margin:0 auto}nav.home-nav ul{position:absolute;top:7.5rem;left:0%;width:100%;right:0%;text-align:center}.home #helm .billboard h1{font-size:5.755vw;margin:3rem 3.5vw 1.5em;padding:0}.home #helm .billboard h2{font-size:1rem;line-height:1.636;margin:2rem 3.5vw 5rem;padding-bottom:3.5rem}.main .content-wrap h1{font-size:17.92px}.main .content-wrap article{padding:0 0 .5em}.main .content-wrap article h1{font-size:32px}.main .content-wrap article h2{font-size:20px}.main .content-wrap article p:first-child{padding-right:0;font-size:17.92px}aside.left-off-canvas-menu{height:calc(100vh - calc(100vh - 100%));overflow-y:auto}aside.left-off-canvas-menu ul{background:#2ba0d3!important}aside.left-off-canvas-menu ul li{font-family:klinic-bold,klinic bold,helvetica neue,Helvetica,Arial,sans-serif;font-weight:600;letter-spacing:.05em;-webkit-font-smoothing:antialiased;font-size:1.25rem}aside.left-off-canvas-menu ul li a{color:#fff!important;border-bottom:none!important}aside.left-off-canvas-menu ul li a:hover{background:#2ba0d3!important}aside.left-off-canvas-menu ul li a.active{color:#fff!important;background:#277a9f!important}aside.left-off-canvas-menu ul li a+ul{display:none;background:#277a9f!important;margin-left:0;padding:.5em 0 1em 1.5em}aside.left-off-canvas-menu ul li a+ul li{font-family:helvetica neue,Helvetica,Arial,sans-serif;letter-spacing:0;font-size:1rem;list-style:none}aside.left-off-canvas-menu ul li a+ul li a{padding:.1em .66667rem;border-bottom:none;color:#e4e4e4!important}aside.left-off-canvas-menu ul li a.active+ul{display:block}aside.left-off-canvas-menu .button-wrap{padding:.75em 5%}aside.left-off-canvas-menu .button-wrap .button{margin:.4em 0}.top-bar .breadcrumb{left:2.75rem}.top-bar .right li{display:none}.top-bar .right li:nth-child(2){display:inline-block}.top-bar .right li:nth-child(2) a{position:absolute;right:-4em;top:-.35em;font-size:1.75rem}.contrib-text .lead{display:none}.cncf-wrap .cncf{padding-top:2rem;padding-bottom:2rem}.cncf-wrap .cncf img,.cncf-wrap .cncf p{float:none;min-width:80%;margin:1.5rem auto}.cncf-wrap .cncf img{max-width:51%}}@media screen and (min-height:575px){.sidebar{padding-bottom:0}.sidebar .sidebar-buttons{position:fixed;bottom:0}}.section-404{position:relative;min-height:670px}.section-404 #particles-js{position:absolute;width:100%}.section-404 h1{text-transform:none;font-size:32px;letter-spacing:.05em;margin:5em 7.5% 2.5em;position:relative}html{background:#fff!important} \ No newline at end of file +* License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)*/@font-face{font-family:fontawesome;src:url(/fonts/fontawesome-webfont.eot?v=4.5.0);src:url(/fonts/fontawesome-webfont.eot?#iefix&v=4.5.0)format("embedded-opentype"),url(/fonts/fontawesome-webfont.woff2?v=4.5.0)format("woff2"),url(/fonts/fontawesome-webfont.woff?v=4.5.0)format("woff"),url(/fonts/fontawesome-webfont.ttf?v=4.5.0)format("truetype"),url(/fonts/fontawesome-webfont.svg?v=4.5.0#fontawesomeregular)format("svg");font-weight:400;font-style:normal}.fa{display:inline-block;font:14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fadein{from{opacity:0}to{opacity:1}}@-moz-keyframes fadein{from{opacity:0}to{opacity:1}}@-webkit-keyframes fadein{from{opacity:0}to{opacity:1}}@-ms-keyframes fadein{from{opacity:0}to{opacity:1}}@-o-keyframes fadein{from{opacity:0}to{opacity:1}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0);-webkit-transform:scale(-1,1);-ms-transform:scale(-1,1);transform:scale(-1,1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:scale(1,-1);-ms-transform:scale(1,-1);transform:scale(1,-1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-remove:before,.fa-close:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-gear:before,.fa-cog:before{content:""}.fa-trash-o:before{content:""}.fa-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-rotate-right:before,.fa-repeat:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before{content:""}.fa-check-circle:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-warning:before,.fa-exclamation-triangle:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-gears:before,.fa-cogs:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before{content:""}.fa-arrow-circle-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-save:before,.fa-floppy-o:before{content:""}.fa-square:before{content:""}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-unsorted:before,.fa-sort:before{content:""}.fa-sort-down:before,.fa-sort-desc:before{content:""}.fa-sort-up:before,.fa-sort-asc:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-legal:before,.fa-gavel:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-flash:before,.fa-bolt:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-paste:before,.fa-clipboard:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-unlink:before,.fa-chain-broken:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:""}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:""}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:""}.fa-euro:before,.fa-eur:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-rupee:before,.fa-inr:before{content:""}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:""}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:""}.fa-won:before,.fa-krw:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-turkish-lira:before,.fa-try:before{content:""}.fa-plus-square-o:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-institution:before,.fa-bank:before,.fa-university:before{content:""}.fa-mortar-board:before,.fa-graduation-cap:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:""}.fa-file-zip-o:before,.fa-file-archive-o:before{content:""}.fa-file-sound-o:before,.fa-file-audio-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before{content:""}.fa-ge:before,.fa-empire:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-send:before,.fa-paper-plane:before{content:""}.fa-send-o:before,.fa-paper-plane-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-hotel:before,.fa-bed:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-yc:before,.fa-y-combinator:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-tv:before,.fa-television:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}body.home{font-family:helvetica neue,Helvetica,Arial,sans-serif;letter-spacing:0;overflow-x:hidden}body.home .row{max-width:72rem}body.home .row.fullwidth{max-width:100%}body.home h1{font-family:klinic-bold,klinic bold,helvetica neue,Helvetica,Arial,sans-serif;font-weight:600;letter-spacing:.05em;-webkit-font-smoothing:antialiased}body.home h2,body.home h3,body.home h4,body.home h5{font-family:klinic-reg,klinic,helvetica neue,Helvetica,Arial,sans-serif;font-weight:400;letter-spacing:.0075em;-webkit-font-smoothing:antialiased}body.home #footer{max-width:100%}body.home #footer .row{max-width:100%}html,body{height:100%}nav.home-nav{position:absolute;min-height:300px;left:0;right:0;top:0;z-index:2000}nav.home-nav h1{position:absolute;left:5%;top:.5rem;max-width:250px}nav.home-nav ul{position:absolute;top:3.25rem;right:2%}nav.home-nav ul li{list-style:none;display:inline-block}nav.home-nav ul li a{display:inline-block;margin:0 1.333rem;font-size:1.25rem;line-height:2;position:relative;letter-spacing:.0125em;color:#464646;text-decoration:none;font-family:klinic-bold,klinic bold,helvetica neue,Helvetica,Arial,sans-serif;font-weight:600;letter-spacing:.05em;-webkit-font-smoothing:antialiased;position:relative;display:inline-block;text-align:center;transition:all .3s ease-in-out}nav.home-nav ul li a::after{display:inline-block;content:"";background:#f99eac;height:3px;position:absolute;bottom:0;left:50%;width:10%;opacity:0;margin:0 0 0 -5%;transition:all .3s ease-in-out}nav.home-nav ul li a:hover::after{width:100%;left:0;margin-left:0;opacity:1}nav.home-nav ul li a img{max-height:2rem;color:#464646;line-height:2.5;padding-top:.5rem;margin:-.5rem -1rem 0 1rem}nav.home-nav ul li a img:hover{opacity:.7}#helm.home{background:#3fb1e5}#helm.home .billboard{background-color:#fff;background-size:376px;background-attachment:fixed;min-height:480px;padding-top:250px;position:relative;text-align:center}#helm.home .billboard h1{font-family:klinic-bold,klinic bold,helvetica neue,Helvetica,Arial,sans-serif;font-weight:600;letter-spacing:.05em;-webkit-font-smoothing:antialiased;color:#3fb1e5;font-size:2.925rem}#helm.home .billboard h2{font-family:helvetica neue,Helvetica,Arial,sans-serif;letter-spacing:0;color:#27759a;font-size:1.25rem;margin-bottom:30px}#helm.home .billboard:after{background:url(/img/pattern-waves.png)repeat-x;background-size:20px;bottom:0;content:'';display:block;height:6px;position:absolute;width:100%}#helm.home .billboard.blog-billboard{min-height:180px;padding-top:50px}#helm.home #blog{background:#3fb1e5;background:linear-gradient(180deg,#4cb3e1 0%,#2a8cb8 100%);margin-bottom:6rem;min-height:450px}#helm.home #blog .blog-section h1.blog-subhead{font-size:1.5rem;padding:2rem 5rem;opacity:.75}#helm.home #blog article.post__content{padding-top:2rem;padding-bottom:7.5rem}#helm.home #blog article.post__content h1{font-size:3rem}#helm.home #blog p{padding-right:2%;font-size:1.333rem;line-height:1.636;margin-top:1.2rem;margin-bottom:2rem}#helm.home #blog p.date{font-size:.925rem;font-weight:700;margin:-.5rem 0 2.5rem;color:#27759a}#helm.home #blog p.author{margin-top:2.5rem;line-height:1.2}#helm.home #blog p.author small{font-size:1rem}#helm.home .content h1,#helm.home .content h2,#helm.home .content h3,#helm.home .content h5{color:#fff;font-family:klinic-bold,klinic bold,helvetica neue,Helvetica,Arial,sans-serif;font-weight:600;letter-spacing:.05em;-webkit-font-smoothing:antialiased}#helm.home .content h2{font-size:2.5rem;margin:2rem 0;padding-top:1em}#helm.home .content p,#helm.home .content ul,#helm.home .content li{color:#fff;font-size:1.5rem;line-height:1.4;font-family:helvetica neue,Helvetica,Arial,sans-serif;letter-spacing:0;-webkit-font-smoothing:antialiased}#helm.home .content p{margin-bottom:1.4rem}#helm.home .content .github-stats{padding-top:1em}#helm.home .content a{color:#464646}#helm.home .content .helm-overview-img{margin:3.5rem 0 3rem}#helm.home .helm-features{background:url(/img/features-bg.png)no-repeat 50% 0;background-size:cover;text-align:center;margin-top:5em;margin-bottom:2em;padding-bottom:4rem}#helm.home .helm-features .large-3{min-height:280px}#helm.home .helm-features h2{font-family:klinic-bold,klinic bold,helvetica neue,Helvetica,Arial,sans-serif;font-weight:600;letter-spacing:.05em;-webkit-font-smoothing:antialiased;color:#27759a;border-bottom:4px solid #afdff4;margin:1.5rem 0 2.5rem;display:inline-block}#helm.home .helm-features h2 .fa{color:#ff2a53}#helm.home .helm-features h3{color:#27759a;margin:.25em 0 .5em;font-size:1.5rem;position:relative;font-family:klinic-bold,klinic bold,helvetica neue,Helvetica,Arial,sans-serif;font-weight:600;letter-spacing:.05em;-webkit-font-smoothing:antialiased}#helm.home .helm-features h3 small{position:absolute;top:8.667em;color:red;width:10em;left:50%;font-size:.6em;margin-left:-5em}#helm.home .helm-features h3:not(:first-child){padding-top:2em}#helm.home .helm-features .columns{position:relative}#helm.home .helm-features img{top:0;left:50%}#helm.home .helm-features p{font-size:1.5em;padding:0 5%}#helm.home .helm-features p code{border:none}#helm.home .helm-features .row{background-color:#fff}#helm.home .helm-features .row:first-child{border-radius:.5em .5em 0 0}#helm.home .helm-features .row:last-child{padding-bottom:.5em;border-radius:0 0 .5em .5em}#helm.home .get-helm{padding-bottom:50px;border:2px dashed #7fccf0;padding:2em;margin-bottom:4em;position:relative;z-index:100}#helm.home .get-helm:after{position:absolute;display:block;content:" ";top:.667em;left:-.25em;width:100%;height:375px;z-index:-5;background-color:#27759a;transform:rotateX(12deg);opacity:.425}#helm.home .get-helm h2{margin:0 0 .5em;padding:0}#helm.home .get-helm img{margin:.333em 0}#helm.home .get-charts{padding-left:3.5rem}#helm.home .get-charts h2{margin:2.5rem 0 1rem;padding:0}#helm.home .helm-community{background-color:#fff;padding-top:50px;padding-bottom:100px;color:#27759a;background:linear-gradient(0deg,#fff,#F7F7F7)}#helm.home .helm-community h2,#helm.home .helm-community p{color:#27759a}#helm.home .helm-community h2{margin-bottom:.5em}#helm.home .helm-community h2+p{margin-bottom:4.5rem}#helm.home .helm-community .helm-community-links ul{background-color:#fff;padding:1.5em 2.25em;border-radius:1em}#helm.home .helm-community .helm-community-links ul li{font-size:1.5rem;list-style:none;color:#27759a;line-height:2.5;padding-left:2.25em;position:relative;font-family:klinic-reg,klinic,helvetica neue,Helvetica,Arial,sans-serif;font-weight:400;letter-spacing:.0075em;-webkit-font-smoothing:antialiased}#helm.home .helm-community .helm-community-links ul li a{color:#464646;border-bottom:3px solid #3fb1e5;text-decoration:none}#helm.home .helm-community .helm-community-links ul li a:hover{color:#3fb1e5;border-color:#7fccf0}#helm.home .helm-community .helm-community-links ul li .fa{color:#3fb1e5;font-size:2rem;width:1.25em;padding-right:0;position:absolute;left:0;top:.525em}#helm.home .helm-community .helm-community-blocks section{border:1px solid #27759a;border-radius:1rem;margin:0 0 2em;padding:1.25rem 1.5rem;min-height:125px;position:relative}#helm.home .helm-community .helm-community-blocks section h4{color:#27759a;font-size:1.5em;font-family:klinic-bold,klinic bold,helvetica neue,Helvetica,Arial,sans-serif;font-weight:600;letter-spacing:.05em;-webkit-font-smoothing:antialiased;margin:-.25em 0 .667em}#helm.home .helm-community .helm-community-blocks section p{color:#27759a;font-size:1.4rem}#helm.home .helm-community .helm-community-blocks section a{color:#464646}#helm.home .helm-community .helm-community-blocks section iframe{width:35%;display:inline-block;min-width:200px;position:absolute;right:1em;top:1em}#helm.home .helm-community .helm-community-blocks section .right{background-color:#f8f8f8;text-align:center;padding:1.25em 2em 1em;width:33.3%;position:absolute;top:1em;right:1em}#helm.home .helm-community .helm-community-blocks section .right .fa{font-size:2.75rem;float:left;display:inline-block;padding-right:.333em;color:#3fb1e5}#helm.home .helm-community .helm-community-blocks section .right em{font-style:normal;font-size:1.125em;display:inline-block;min-width:50%;color:#3fb1e5;font-weight:700}#helm.home .helm-community .helm-community-blocks section .right small{display:inline-block;font-size:.667rem;min-width:50%;color:#3fb1e5}.helm-contrib-logos{text-align:center;padding-bottom:50px}.helm-contrib-logos .helm-contrib-logos{padding-top:1.5rem}.helm-contrib-logos img{padding:0;display:inline-block;margin:0;max-width:15%}.helm-contrib-logos .helm-logo{margin:0 auto;margin-bottom:2.25em;display:block;text-align:center;padding:3.5em 0 0}.helm-contrib-logos hr{background-color:#7fccf0;height:2px;opacity:.25;width:50%;margin:1rem 25%}.helm-contrib-logos p{color:#4e4e4e;text-align:center;padding:0;margin:0 auto;font-size:1.333em;line-height:2;letter-spacing:.025em;color:#9b9b9b}.helm-contrib-logos p a{color:#464646;border-bottom:2px solid transparent}.helm-contrib-logos p a:hover{border-bottom:2px solid #3fb1e5}.helm-contrib-logos p small{padding-top:1rem;font-size:.925em}.full-width{min-width:100%}.cncf{background:RGBA(246,246,246,1);min-height:5rem;margin-top:4rem;text-align:center;padding-left:0!important}.cncf img{float:left;display:inline-block;max-width:14rem;margin:3rem 5%}.cncf p{float:right;margin:3.5rem 5%;display:inline-block;font-family:helvetica;color:#777}.cncf p:hover{color:#7fccf0}.copyright{background:#3fb1e5;color:#fff;font-size:1.3rem;padding:1rem}.copyright a,.copyright a:focus,.copyright a:visited{color:#464646}@media only screen and (min-device-width:415px){@keyframes animatedBoat{0%{background-position:-150px 25%;bottom:-7px}10%{bottom:-12px}20%{bottom:-7px}30%{bottom:-12px}40%{bottom:-7px}50%{bottom:-12px}60%{bottom:-7px}70%{bottom:-12px}80%{bottom:-7px}90%{bottom:-12px}100%{background-position:145% 0;bottom:-7px}}@-moz-keyframes animatedBoat{0%{background-position:-150px 25%;bottom:-7px}10%{bottom:-12px}20%{bottom:-7px}30%{bottom:-12px}40%{bottom:-7px}50%{bottom:-12px}60%{bottom:-7px}70%{bottom:-12px}80%{bottom:-7px}90%{bottom:-12px}100%{background-position:145% 0;bottom:-7px}}@-webkit-keyframes animatedBoat{0%{background-position:-150px 25%;bottom:-7px}10%{bottom:-12px}20%{bottom:-7px}30%{bottom:-12px}40%{bottom:-7px}50%{bottom:-12px}60%{bottom:-7px}70%{bottom:-12px}80%{bottom:-7px}90%{bottom:-12px}100%{background-position:145% 0;bottom:-7px}}@-ms-keyframes animatedBoat{0%{background-position:-150px 25%;bottom:-7px}10%{bottom:-12px}20%{bottom:-7px}30%{bottom:-12px}40%{bottom:-7px}50%{bottom:-12px}60%{bottom:-7px}70%{bottom:-12px}80%{bottom:-7px}90%{bottom:-12px}100%{background-position:145% 0;bottom:-7px}}@-o-keyframes animatedBoat{0%{background-position:-150px 25%;bottom:-7px}10%{bottom:-12px}20%{bottom:-7px}30%{bottom:-12px}40%{bottom:-7px}50%{bottom:-12px}60%{bottom:-7px}70%{bottom:-12px}80%{bottom:-7px}90%{bottom:-12px}100%{background-position:145% 0;bottom:-7px}}}#boat{height:2em}@media only screen and (min-device-width:415px){#boat{background:url(/img/boat.png)no-repeat;background-size:150px;height:169px;position:relative;-moz-animation:animatedBoat 10s linear infinite;-webkit-animation:animatedBoat 10s linear infinite;-ms-animation:animatedBoat 10s linear infinite;-o-animation:animatedBoat 10s linear infinite;animation:animatedBoat 10s linear infinite;-webkit-animation-duration:20s;-moz-animation-duration:20s;-ms-animation-duration:20s;-o-animation-duration:20s;animation-duration:20s}}@media screen and (max-width:1024px){#helm .billboard .helm-logo{position:absolute;left:50%;top:2.3rem;max-width:112px;margin-left:-66px}#helm .billboard h1{margin:-3rem 10% 0;font-size:2.25rem}#helm .billboard h2{margin:1rem 12.5%;font-size:1.5rem}.contrib-logos-1 img,.contrib-logos-2 img{max-height:80px}.cncf{padding-top:2rem;padding-bottom:2rem;padding-left:0!important}.cncf img,.cncf p{float:none;margin:1.5rem auto}.cncf img{max-width:51%}}#helm .panel{font-size:21px;padding:13.33333333px 0;width:100%;position:relative}@media only screen and (max-width:40em){#helm .panel{padding:10px 0}}#helm .panel.-blue{background-color:#3fb1e5;color:#fff}@media only screen and (min-width:40.063em){#helm .panel.-blue{padding-top:20px}}#helm .panel.-blue h1,#helm .panel.-blue h2,#helm .panel.-blue p{color:#555}#helm .panel.-gray{background-color:#f4f4f4}#helm .geo-shapes-title{margin:0 auto}#helm .geo-shapes-title.blue h2 hr.border{border-color:#3fb1e5}#helm .geo-shapes-title.pink h2 hr.border{border-color:#ff2a53}#helm .geo-shapes-title h2{display:inline-block;line-height:1;padding:0 1em;margin:0 0 1.5em;font-family:klinic-bold,klinic bold,helvetica neue,Helvetica,Arial,sans-serif;font-weight:600;letter-spacing:.05em;-webkit-font-smoothing:antialiased}#helm .geo-shapes-title h2 hr.border{border-color:#ddf5f2;border-width:0 0 5px;margin:.575em -5% 1em}#helm .geo-shapes-title h2 .geo-shapes{padding-bottom:0;font-size:21px;line-height:1.5}#helm .geo-shapes-title h2 .geo-shapes hr{width:42.5%;margin-left:auto;margin-right:auto}#helm .panel.panel--signoff{min-height:320px;overflow:hidden;margin-top:75px}#helm .panel.panel--signoff.panel--signoff-how{min-height:570px}#helm .panel.panel--signoff .text-center{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);margin-top:-5%;z-index:1200}#helm .panel.panel--signoff .text-center .geo-shapes{padding-top:2em;padding-bottom:.5em}#helm .panel.panel--signoff .text-center h2{margin:.5em 0}#helm .panel.panel--signoff .text-center h4 a{position:relative;display:inline-block;text-align:center;transition:all .3s ease-in-out;line-height:1}#helm .panel.panel--signoff .text-center h4 a::after{display:inline-block;content:"";background:#f99eac;height:3px;position:absolute;bottom:0;left:50%;width:10%;opacity:0;margin:0 0 0 -5%;transition:all .3s ease-in-out}#helm .panel.panel--signoff .text-center h4 a:hover::after{width:100%;left:0;margin-left:0;opacity:1}#helm .panel.panel--signoff .text-center p:last-child{margin-bottom:0}#helm .panel.panel--signoff .shape-position.shape-position-bottom{bottom:-10%}#helm .intro{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);margin-top:50px}#helm .intro .geo-shapes{padding-bottom:.5em}#helm .intro p{max-width:92%;font-size:.875em;margin:.5em auto 1.5em}#helm .content .pics p{padding-right:0}#helm .content .text-center p{padding-right:0}#helm .content p{padding-right:5%;line-height:1.636;margin-bottom:1.5rem}@media only screen and (min-width:40.063em){#helm .content p:last-child{margin-bottom:1em}}#helm .content p.lead{font-family:klinic-reg,klinic,helvetica neue,Helvetica,Arial,sans-serif;font-weight:400;letter-spacing:.0075em;-webkit-font-smoothing:antialiased;padding:0;font-size:.925em}#helm .content code,#helm .content pre{font-family:Consolas,liberation mono,Courier,monospace;background:#f0f0f0;border:none;color:#464646;line-height:1.8}#helm .content table{border:2px solid #f4f4f4;margin:1.5em auto;width:100%}#helm .content table th,#helm .content table td{vertical-align:top;padding:.825em 1.5em 1.25em .75em;line-height:1.333}#helm .content table th{font-family:klinic-bold,klinic bold,helvetica neue,Helvetica,Arial,sans-serif;font-weight:600;letter-spacing:.05em;-webkit-font-smoothing:antialiased;color:#fff;font-size:1em;background:#4e4e4e;line-height:1.2}#helm .content table .small{font-size:.75em;line-height:1.7;max-width:50%}#helm .content dl{margin:0 0 1.5em;font-size:1.25rem;line-height:1.5}#helm .content dl dt,#helm .content dl dd{font-family:klinic-reg,klinic,helvetica neue,Helvetica,Arial,sans-serif;font-weight:400;letter-spacing:.0075em;-webkit-font-smoothing:antialiased}#helm .content dl dt{font-family:klinic-bold,klinic bold,helvetica neue,Helvetica,Arial,sans-serif;font-weight:600;letter-spacing:.05em;-webkit-font-smoothing:antialiased;color:#c4c4c4}#helm .content dl.inline-list dt,#helm .content dl.inline-list dd{float:left;display:inline-block;margin-right:1em}#helm .content dl.inline-list dt{clear:left}#helm .content address{font-family:klinic-reg,klinic,helvetica neue,Helvetica,Arial,sans-serif;font-weight:400;letter-spacing:.0075em;-webkit-font-smoothing:antialiased;font-size:1.25rem;margin:2em 0 1em;line-height:1.333}#helm .content address em{font-family:klinic-bold,klinic bold,helvetica neue,Helvetica,Arial,sans-serif;font-weight:600;letter-spacing:.05em;-webkit-font-smoothing:antialiased;font-style:normal;color:#c4c4c4}#helm .content hr.blank{color:#fff;border-color:#fff}#helm .content a.ripple{position:relative;display:inline-block;text-align:center;transition:all .3s ease-in-out;display:inline}#helm .content a.ripple::after{display:inline-block;content:"";background:#f99eac;height:3px;position:absolute;bottom:0;left:50%;width:10%;opacity:0;margin:0 0 0 -5%;transition:all .3s ease-in-out}#helm .content a.ripple:hover::after{width:100%;left:0;margin-left:0;opacity:1}#helm .content a.ripple:after{position:absolute;left:0;bottom:-.2em}#helm .content .breakout-cta-row{background:#fff;box-shadow:0 1px 3px #dedede;padding:1em 1.25em;margin-bottom:1.25em}#helm .content .breakout-cta-row p.left{font-size:.75em;padding:.5em 0;margin:0;color:#787878}@media only screen and (max-width:40em){#helm .content .breakout-cta-row p.left,#helm .content .breakout-cta-row button{float:none;text-align:center;margin:0 auto}}#helm .content .centerer{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}#helm .hidden{display:none}#helm .off-canvas-wrap{height:100%}#helm .off-canvas-wrap.move-left{position:fixed}@media only screen and (max-width:40em){#helm .navbar.top-bar{top:0}}#helm #tos{padding-top:100px}@media only screen and (max-width:40em){#helm #tos{padding:80px 20px 20px}}.blog-layout .main{padding-top:2rem}.blog-layout .main.blog .content-wrap h1{margin-top:0;color:#3c2e53}.blog-layout .main.blog .content-wrap article{padding:0}.blog-layout .main.blog .content-wrap article h2{text-transform:capitalize;letter-spacing:.05em;font-size:2rem}.blog-layout .main.blog .content-wrap article p.date{margin-top:0;padding-top:0;font-weight:700;font-size:1rem;color:#937db7;margin:.5rem 0}.blog-layout .main.blog .content-wrap article .summary p{display:inline;margin:0;padding:0}.blog-layout .main.blog .content-wrap article .summary a{font-weight:900}.blog-layout .main.blog-single .content-wrap article h1{font-size:2.75rem;margin-bottom:.25em}.blog-layout .main.blog-single .content-wrap article p.date{font-style:italic;margin-bottom:2.67em}.blog-layout .main.blog-single .content-wrap article img{box-shadow:none;display:block;margin:0 auto}.blog-layout .main.blog-single .content-wrap article img:hover{-webkit-box-shadow:none 2px 0 rgba(30,30,30,.25);-moz-box-shadow:none 2px 0 rgba(30,30,30,.25);box-shadow:none 2px 0 rgba(30,30,30,.25)}.blog-layout .main.blog-single .content-wrap article .blog-meta{margin-top:7.5rem}.blog-layout .main.blog-single .content-wrap article .blog-author{text-align:left}.blog-layout .main.blog-single .content-wrap article .blog-author figure{display:inline-block;width:100%}.blog-layout .main.blog-single .content-wrap article .blog-author figure a{position:relative;background:#f4e8ca;padding:1rem;display:inline-block;width:100%;min-height:12rem;border-radius:.67em;padding-left:12rem}.blog-layout .main.blog-single .content-wrap article .blog-author figure a img{position:absolute;left:1rem;top:1rem;border-radius:50%;max-width:10rem}.blog-layout .main.blog-single .content-wrap article .blog-author figure a figcaption{text-align:left;font-size:1.35rem;margin-top:2.75rem}.blog-layout .main.blog-single .content-wrap article .blog-tags{position:relative;padding:1rem 2rem;min-height:12rem}.blog-layout .main.blog-single .content-wrap article .blog-tags a.tag{font-size:1.25rem;border-radius:2rem;background:#3fb1e5;color:#fff;padding:.5rem 1.5rem;margin:2.25rem .25rem;font-weight:700;text-transform:uppercase;letter-spacing:.075em}.blog-layout .main.blog-single .content-wrap article .button-rss{display:block;background:#dcf1fa;border-radius:3rem;margin:2.5rem 0 0;position:absolute;bottom:0;left:5%;right:5%}html,body{min-height:100%;padding:0;margin:0;background:#fff;background-position:static;background-attachment:fixed}.main{min-height:760px}.sidebar{min-height:100%}.container-full{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;min-height:100%;height:100%;overflow-y:scroll;overflow-x:hidden;padding-left:300px;width:100%}.sidebar{width:25%;width:300px}.flextable{display:flex;flex-flow:row;flex-wrap:wrap;justify-content:space-evenly;align-items:baseline}.sidebar{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;min-height:100%;left:0;top:0;bottom:0;background:#ddf5f2;z-index:700;position:fixed;border-right:1px solid #cfedfa}.sidebar .sidebar-wrap{overflow-x:hidden;overflow-y:scroll;display:block;position:relative;height:100%;margin-top:-5rem;margin-bottom:-4.75rem;z-index:10;padding:0}.sidebar a{transition:all .3s ease-in-out}.sidebar a .ripple{margin:auto 0;display:inline-block}.sidebar a .ripple span{display:block;margin:0 auto;background:#2090cd;width:10%;opacity:0;height:3px;transition:all .3s ease-in-out}.sidebar a:hover .ripple span{width:100%;opacity:1}.sidebar h1{margin:0;padding:0;min-height:5rem;z-index:1020;position:relative;text-transform:none}.sidebar h1 a{display:block;width:100%;padding:.1333em 2.25rem;background-color:#fff;text-align:left}.sidebar h1 a img,.sidebar h1 a svg{display:block;fill:currentColor;transition:all .3s ease-in-out}.sidebar h1 a span{top:1em;position:absolute;font-size:1.5rem;color:#2090cd;left:6.5rem;letter-spacing:-.125rem;font-family:klinic-reg,klinic,helvetica neue,Helvetica,Arial,sans-serif;font-weight:400;letter-spacing:.0075em;-webkit-font-smoothing:antialiased}.sidebar h1 a:hover{background:#e4e4e4}.sidebar h1 a:hover svg{color:#fff!important}.sidebar ul{margin:0 auto .5em;padding:7.5rem 0 6rem}.sidebar ul li a{display:block;padding:0 15% .25em;color:#666;letter-spacing:.035em;line-height:1.4;text-transform:capitalize;font-size:1.5em;font-family:klinic-bold,klinic bold,helvetica neue,Helvetica,Arial,sans-serif;font-weight:600;letter-spacing:.05em;-webkit-font-smoothing:antialiased;letter-spacing:.02em;transition:all .3s cubic-bezier(0.25,0.1,0.25,1)}.sidebar ul li a:hover{color:#277a9f;background:#b8dff4}.sidebar ul li a.active{text-decoration:underline;background:0 0}.sidebar ul li a.active span.ripple{text-decoration:underline;width:100%;opacity:1}.sidebar ul li a.active:hover .ripple span{background:#2090cd}.sidebar ul li a.active+ul{display:block}.sidebar ul li:last-child a.sidebar-nav-item:after{content:'\f08e';font-family:fontawesome;display:inline-block;padding-left:.5em;width:1em;height:1em;font-size:15px;opacity:.5}.sidebar ul li.toctree-l1.current ul{display:block!important}.sidebar ul li.toctree-l2 ul{display:block!important}.sidebar ul li.toctree-l3{padding-left:2em}.sidebar ul li ul{margin:0;padding:.5em 0 1.25em;display:none}.sidebar ul li ul li{margin:0}.sidebar ul li ul li a{padding:.25em 0 .25em 17.5%;line-height:1;font-size:14px;border-right:4px solid transparent;transition:all .3s ease-in-out;font-family:helvetica neue,Helvetica,Arial,sans-serif;font-weight:700}.sidebar ul li ul li a:hover{color:#277a9f;background:#b8dff4}.sidebar ul li ul li.active a{color:#277a9f;border-right:4px solid #277a9f;background:#e6f3f9}.sidebar .sidebar-buttons{border-top:2px solid #fff;min-height:4.75rem;background:#ddf5f2}.sidebar .sidebar-buttons .button-wrap{width:300px;padding:.5em 10%}.sidebar .sidebar-buttons .button.expand.small{margin:.333em 0;display:block;padding-top:.5rem;padding-bottom:.575rem;background-color:#fff;color:#2090cd}.sidebar .sidebar-buttons .button.expand.small i{margin:-.05em .5em 0 -.667em;color:#2090cd;font-size:14px}.left-off-canvas-toggle .fa{background-color:#fff}.left-off-canvas-toggle .fa:before{color:#2090cd}.top-bar{perspective:800px;min-height:5.125em;transform-style:preserve-3d;background:#fff;border-bottom:1px solid #cfedfa;transition:transform 200ms linear;position:fixed;left:300px;right:0;top:0;z-index:1000}.top-bar ul{min-width:33.333%;margin-right:0;margin-top:.75em;padding-right:3.5%}.top-bar ul li{display:inline-block;margin:0 .5rem}.top-bar ul li a{padding:1em;color:#277a9f;font-size:1.125rem;font-family:klinic-bold,klinic bold,helvetica neue,Helvetica,Arial,sans-serif;font-weight:600;letter-spacing:.05em;-webkit-font-smoothing:antialiased}.top-bar ul li a img{padding-right:.333em;max-height:1.2rem}.top-bar ul li:last-child,.top-bar ul li:nth-last-child(2){margin-right:-1rem}.top-bar .breadcrumb{position:absolute;top:0;left:1em;z-index:1030;line-height:1.5;font-size:14px;letter-spacing:.05em}.top-bar .breadcrumb a{padding:.333em 0;margin:.575em 0 .575em .5em;float:left;text-transform:capitalize;font-size:1.5rem;color:#2090cd;letter-spacing:-.125rem;font-family:klinic-reg,klinic,helvetica neue,Helvetica,Arial,sans-serif;font-weight:400;letter-spacing:.0075em;-webkit-font-smoothing:antialiased;transition:all .3s ease-in-out}.top-bar .breadcrumb a:hover{color:#2dafe9}.top-bar .breadcrumb a:before{content:'/';display:inline-block;width:.75em;height:2em;margin:0 0 0 -.2em;color:#ccc}.top-bar .breadcrumb a:first-child:before{display:none}.left-off-canvas-toggle{z-index:1100;position:fixed;top:0;left:0}.left-off-canvas-toggle img{padding:1.425em .925em;color:#333}.main{margin-bottom:-5em}.main.footer-expanded{margin-bottom:-11em}.styleguide-footer{min-height:5rem;overflow:hidden;position:relative;z-index:500;padding-top:1.25em;background-color:#333;border-bottom:6px solid #333;min-width:100%;transition:all .3s ease-in-out}.styleguide-footer ul{list-style:none;float:left;margin-bottom:0}.styleguide-footer ul li{display:block;margin:0}.styleguide-footer ul li a{font-weight:400}.styleguide-footer p,.styleguide-footer li{color:#999;line-height:1.7;font-size:.667rem;font-family:klinic-reg,klinic,helvetica neue,Helvetica,Arial,sans-serif;font-weight:400;letter-spacing:.0075em;-webkit-font-smoothing:antialiased}.styleguide-footer li a{font-size:.75rem}.styleguide-footer strong{text-transform:uppercase;letter-spacing:.25em;margin:.75rem 0 .25rem;display:block;font-weight:400}.styleguide-footer strong a{color:#999;cursor:pointer}.styleguide-footer a{color:#2dafe9}.styleguide-footer a:hover{border:none;text-decoration:none;color:#fff}.styleguide-footer .fa.footer-reveal{font-size:1rem;cursor:pointer;width:2em;height:2em;text-align:center;position:absolute;left:-.65em;top:.35rem;-webkit-border-radius:50% 50% 50% 50%;-moz-border-radius:50% 50% 50% 50%;border-radius:50% 50% 50% 50%;transition:all .3s ease-in-out}.styleguide-footer .fa.footer-reveal:hover{background:#262626;color:#999}.styleguide-footer p{margin-top:.75rem;color:#333}.styleguide-footer p:nth-child(2){margin-top:2.67rem;font-size:.75rem;line-height:1.5}.styleguide-footer p:nth-child(2) a{color:#2dafe9}.styleguide-footer img{margin:0;float:right;opacity:.7;transition:all .3s ease-in-out}.styleguide-footer img:hover{opacity:1}.styleguide-footer .sub-nav-social{position:absolute;right:1em;bottom:2em;text-align:right}.styleguide-footer .sub-nav-social li{display:inline-block;margin:1rem .25em;text-align:right}.styleguide-footer .sub-nav-social li a{font-size:1.5em;color:#666;width:2em;height:2em;text-align:center;background:#262626;-webkit-border-radius:50% 50% 50% 50%;-moz-border-radius:50% 50% 50% 50%;border-radius:50% 50% 50% 50%;transition:all .3s ease-in-out}.styleguide-footer .sub-nav-social li a:hover{background:#277a9f;color:#fff}.styleguide-footer .footer-extra div{display:none;opacity:0;height:0;min-height:0;overflow:hidden;transition:all .3s ease-in-out}.styleguide-footer.footer-expanded{margin-top:-11rem;min-height:11rem}.styleguide-footer.footer-expanded .footer-extra div{display:block;opacity:1;min-height:8em}.styleguide-footer.footer-expanded a.fa.footer-reveal{-ms-transform:rotate(180deg);-webkit-transform:rotate(180deg);transform:rotate(180deg)}#contrib{background:#2dafe9;padding-bottom:4rem}.contrib-text p{color:#fff;font-size:1rem;margin:0 auto;padding-left:2rem}.contrib-text p.lead{font-size:1.2rem;margin:2rem auto 3rem;position:relative;line-height:4}.contrib-text p.lead:after{content:" ";display:block;width:14%;position:absolute;bottom:-1.25rem;left:43%;height:5px;background:#ccc;opacity:.25}.contrib-text p img{max-height:24px;margin:-2px 0 0 22px}.contrib-text p a{color:#fff;font-weight:700}.cncf-wrap{max-width:100%}.cncf{background:#e4e4e4;min-height:2rem;text-align:center;padding-left:300px}.cncf img{float:left;display:inline-block;max-width:10rem;margin:1.5rem 0 1.5rem 7.5%}.cncf p{float:right;margin:1.5rem 2.5% 0 0;display:inline-block;font-family:helvetica;color:#222}.cncf p:hover{color:#2ba0d3}.home{box-sizing:border-box;min-height:100%}.home a{text-decoration:underline}.home .docs-home #helm{background:#2dafe9}.home .home-intro-wrap{box-sizing:border-box;min-height:100%;background:#2dafe9}.home h3{color:#f6fbfe;font-size:1.125rem;font-family:klinic-bold,klinic bold,helvetica neue,Helvetica,Arial,sans-serif;font-weight:600;letter-spacing:.05em;-webkit-font-smoothing:antialiased}.home #helm{max-width:100%;position:relative;z-index:500}.home #helm:after{z-index:-100;display:block;height:850px;width:100%;bottom:0;position:fixed}.home #helm .billboard{background-color:#fff;background-size:376px;padding-top:230px;position:relative;text-align:center}.home #helm .billboard .helm-logo{max-width:120px}.home #helm .billboard h1{font-family:klinic-bold,klinic bold,helvetica neue,Helvetica,Arial,sans-serif;font-weight:600;letter-spacing:.05em;-webkit-font-smoothing:antialiased;color:#2dafe9;font-size:2.57rem;text-transform:none!important}.home #helm .billboard h2{font-family:helvetica neue,Helvetica,Arial,sans-serif;color:#277a9f;font-size:1.6rem;margin-bottom:30px}.home #helm .billboard .helm-logo{position:absolute;left:5rem;top:2rem;max-width:102px}.home #helm .billboard .fa{position:absolute;font-size:2.5rem;top:4rem;right:5rem;color:#333}.home #helm .billboard .fa.fa-twitter{right:9rem;color:#2ba0d3;transition:all .3s ease-in-out}.home #helm .billboard .fa:hover{opacity:.7}.home #helm .billboard:after{background:url(/img/pattern-waves.png)repeat-x;background-size:20px;bottom:0;content:'';display:block;height:6px;position:absolute;width:100%}@media only screen and (min-device-width:415px){@keyframes animatedBoat{0%{background-position:-150px 25%;bottom:-7px}10%{bottom:-12px}20%{bottom:-7px}30%{bottom:-12px}40%{bottom:-7px}50%{bottom:-12px}60%{bottom:-7px}70%{bottom:-12px}80%{bottom:-7px}90%{bottom:-12px}100%{background-position:145% 0;bottom:-7px}}@-moz-keyframes animatedBoat{0%{background-position:-150px 25%;bottom:-7px}10%{bottom:-12px}20%{bottom:-7px}30%{bottom:-12px}40%{bottom:-7px}50%{bottom:-12px}60%{bottom:-7px}70%{bottom:-12px}80%{bottom:-7px}90%{bottom:-12px}100%{background-position:145% 0;bottom:-7px}}@-webkit-keyframes animatedBoat{0%{background-position:-150px 25%;bottom:-7px}10%{bottom:-12px}20%{bottom:-7px}30%{bottom:-12px}40%{bottom:-7px}50%{bottom:-12px}60%{bottom:-7px}70%{bottom:-12px}80%{bottom:-7px}90%{bottom:-12px}100%{background-position:145% 0;bottom:-7px}}@-ms-keyframes animatedBoat{.home 0%{background-position:-150px 25%;bottom:-7px}.home 10%{bottom:-12px}.home 20%{bottom:-7px}.home 30%{bottom:-12px}.home 40%{bottom:-7px}.home 50%{bottom:-12px}.home 60%{bottom:-7px}.home 70%{bottom:-12px}.home 80%{bottom:-7px}.home 90%{bottom:-12px}.home 100%{background-position:145% 0;bottom:-7px}}@-o-keyframes animatedBoat{0%{background-position:-150px 25%;bottom:-7px}10%{bottom:-12px}20%{bottom:-7px}30%{bottom:-12px}40%{bottom:-7px}50%{bottom:-12px}60%{bottom:-7px}70%{bottom:-12px}80%{bottom:-7px}90%{bottom:-12px}100%{background-position:145% 0;bottom:-7px}}}.home #boat{height:2em}@media only screen and (min-device-width:415px){.home #boat{background:url(/img/boat.png)no-repeat;background-size:150px;height:120px;position:relative;margin-top:40px;-moz-animation:animatedBoat 10s linear infinite;-webkit-animation:animatedBoat 10s linear infinite;-ms-animation:animatedBoat 10s linear infinite;-o-animation:animatedBoat 10s linear infinite;animation:animatedBoat 10s linear infinite;-webkit-animation-duration:20s;-moz-animation-duration:20s;-ms-animation-duration:20s;-o-animation-duration:20s;animation-duration:20s}}.home .home-featured{background-color:#2dafe9;padding-top:20px;padding-bottom:65px;min-height:400px}.home .home-featured .panels{width:92%;max-width:1140px;min-width:800px}.home .home-featured .panel{background-color:#fff;-webkit-box-shadow:0 1px 4px #277a9f;-moz-box-shadow:0 1px 4px #277a9f;box-shadow:0 1px 4px #277a9f;-webkit-border-radius:.25em .25em .25em .25em;-moz-border-radius:.25em .25em .25em .25em;border-radius:.25em .25em .25em .25em;text-align:center;min-height:125px;color:#333;margin-bottom:1.25rem}.home .home-featured .panel h3{padding:.75rem 0 .5rem;border-bottom:1px solid #e4e4e4;margin:0 auto 1rem;font-size:1rem;color:#2090cd;font-family:klinic-bold,klinic bold,helvetica neue,Helvetica,Arial,sans-serif;font-weight:600;letter-spacing:.05em;-webkit-font-smoothing:antialiased;letter-spacing:.02em}.home .home-featured .panel p{line-height:1.4;display:block;font-size:.925rem;padding:0 3.5% 1rem}.main .list-wrap{padding-top:1em;padding-bottom:1em;font-size:17.92px;font-weight:400;line-height:1.5;z-index:500;position:relative;font-family:klinic-reg,klinic,helvetica neue,Helvetica,Arial,sans-serif;font-weight:400;letter-spacing:.0075em;-webkit-font-smoothing:antialiased}.main .list-wrap h1{text-transform:none;letter-spacing:.03em;margin-top:1em}.main .list-wrap h2{color:#595959;font-size:24px;letter-spacing:.05em;font-family:klinic-bold,klinic bold,helvetica neue,Helvetica,Arial,sans-serif;font-weight:600;letter-spacing:.05em;-webkit-font-smoothing:antialiased;text-transform:uppercase;letter-spacing:.25em;letter-spacing:.125em;margin:0 0 .875em;padding-top:1em}.main .list-wrap h3{color:#333;font-family:klinic-bold,klinic bold,helvetica neue,Helvetica,Arial,sans-serif;font-weight:600;letter-spacing:.05em;-webkit-font-smoothing:antialiased;margin:1.825em 0}.main .list-wrap h4{font-size:17.92px}.main .list-wrap p,.main .list-wrap ul,.main .list-wrap ol,.main .list-wrap blockquote{color:#333;line-height:1.725;font-size:17.92px}.main .list-wrap p{margin:.825rem 0 1.667rem}.main .list-wrap a{color:#1b79ac;background:#fff;transition:all .3s ease-in-out}.main .list-wrap a:hover{color:#2790be;border-bottom:2px solid #2dafe9;background-color:#f6fbfe}.main .list-wrap .header-link{position:absolute;left:-.4em;opacity:0;font-size:1rem;padding-top:.333em;transition:all .3s ease-in-out}.main .list-wrap .header-link:hover{border-bottom:none;background-color:transparent}.main .list-wrap h2:hover,.main .list-wrap h3:hover,.main .list-wrap h4:hover,.main .list-wrap h5:hover,.main .list-wrap h6:hover{color:#277a9f}.main .list-wrap h2:hover .header-link,.main .list-wrap h3:hover .header-link,.main .list-wrap h4:hover .header-link,.main .list-wrap h5:hover .header-link,.main .list-wrap h6:hover .header-link{opacity:1;left:-.825em}.main.docs{padding-top:4rem}.main .content-wrap{padding-top:1em;padding-bottom:10em;font-size:17.92px;font-weight:400;line-height:1.5;z-index:500;position:relative;font-family:klinic-reg,klinic,helvetica neue,Helvetica,Arial,sans-serif;font-weight:400;letter-spacing:.0075em;-webkit-font-smoothing:antialiased}.main .content-wrap h1{text-transform:none;letter-spacing:.03em;margin-top:1em;scroll-margin-top:1.6em}.main .content-wrap article{padding:2em 0 0;overflow:auto}.main .content-wrap article h1{font-size:32px;color:#2090cd;margin:1em 0}.main .content-wrap h2{color:#595959;font-size:24px;letter-spacing:.05em;font-family:klinic-bold,klinic bold,helvetica neue,Helvetica,Arial,sans-serif;font-weight:600;letter-spacing:.05em;-webkit-font-smoothing:antialiased;text-transform:uppercase;letter-spacing:.25em;letter-spacing:.125em;margin:0 0 .875em;padding-top:1em;scroll-margin-top:2.5em}.main .content-wrap h3{color:#333;font-family:klinic-bold,klinic bold,helvetica neue,Helvetica,Arial,sans-serif;font-weight:600;letter-spacing:.05em;-webkit-font-smoothing:antialiased;margin:1.825em 0}.main .content-wrap h4{font-size:17.92px}.main .content-wrap figure{width:max-content;text-align:center;margin:0 auto}.main .content-wrap blockquote p:first-child{color:#666}.main .content-wrap p{color:#333;line-height:1.725;margin:.825rem 0 1.667rem;font-size:17.92px}.main .content-wrap.markdown pre,.main .content-wrap pre{background-color:#e4f3f9;color:#000;border:none;padding:.75em 1em;margin:0 0 2.5em;font-size:1rem}.main .content-wrap.markdown pre code,.main .content-wrap pre code{padding:0;background-color:#e4f3f9;font-size:1rem;white-space:pre}.main .content-wrap .code-box{margin:0;width:100%;height:220px;border-bottom:3px solid #ccc;overflow:auto}.main .content-wrap strong{letter-spacing:.0125em}.main .content-wrap code{dispaly:block;color:#000;padding:.5em;background-color:#e4f3f9;border:none;font-size:1rem;white-space:nowrap}.main .content-wrap.markdown ul,.main .content-wrap.markdown ol,.main .content-wrap ul,.main .content-wrap ol{padding:0 .25rem;color:#333;font-size:17.92px;line-height:1.7}.main .content-wrap table{margin:1.5rem 0;border:none;width:100%}.main .content-wrap table th,.main .content-wrap table td{border:none;vertical-align:top;text-align:left;padding:.425em .75em .425em .2em;width:auto}.main .content-wrap table td{color:#333;font-size:17.92px}.main .content-wrap a{color:#1b79ac;background:#fff;transition:all .3s ease-in-out}.main .content-wrap a:hover{color:#2790be;border-bottom:2px solid #2dafe9;background-color:#f6fbfe}.main .content-wrap .header-link{position:absolute;left:-.4em;opacity:0;font-size:1rem;padding-top:.333em;transition:all .3s ease-in-out}.main .content-wrap .header-link:hover{border-bottom:none;background-color:transparent}.main .content-wrap h1:hover,.main .content-wrap h2:hover,.main .content-wrap h3:hover,.main .content-wrap h4:hover,.main .content-wrap h5:hover,.main .content-wrap h6:hover{color:#277a9f}.main .content-wrap h1:hover .header-link,.main .content-wrap h2:hover .header-link,.main .content-wrap h3:hover .header-link,.main .content-wrap h4:hover .header-link,.main .content-wrap h5:hover .header-link,.main .content-wrap h6:hover .header-link{opacity:1;left:-.825em}.main .content-wrap img{padding:.5em;background-color:#fff;max-width:100%;margin:0 auto;display:block}.main .content-wrap iframe,.main .content-wrap embed,.main .content-wrap .youtube-player{min-height:320px}.copy-button-container{display:flex;justify-content:flex-end}.copy-button-container .copy-button{margin-bottom:0;padding:4px}@media only screen and (max-width:64.063em){.container-full{padding-left:0;overflow-y:auto}.left-off-canvas-toggle .fa{padding:1em 1.25em;line-height:3}.sidebar{display:none}.top-bar{left:0}.top-bar ul.inline{display:none}.blog-logo{position:fixed;z-index:1450;max-width:50%;left:50%;margin:.25rem auto 0 -25%}.st-default-autocomplete{width:90%!important;min-width:320px!important;left:5%!important}nav.top-bar .docs-logo{display:none!important}.main.home{min-height:500px}.main.home .home-featured .panels{min-width:100%}.main.home .fa{display:none}.main.blog{padding-top:6.5rem}.main.docs{padding-top:3.5rem}.main.docs .docs-logo{position:absolute;z-index:1450;max-width:50%;left:50%;margin:.25rem auto 0 -25%;display:block!important}nav.home-nav ul{margin-left:auto;margin-right:auto}nav.home-nav ul li{padding:0;margin:0}nav.home-nav ul li a{background-color:#cfedfa;padding:.25rem 1rem;margin:0 .333rem .75rem;font-size:1rem;border-radius:.35em;min-width:15vw}nav.home-nav h1{position:absolute;left:7%;top:.5rem;margin-left:-3.5%;min-width:86%;text-align:center}nav.home-nav h1 img{max-width:45%;min-height:auto!important;margin:0 auto}nav.home-nav ul{position:absolute;top:7.5rem;left:0%;width:100%;right:0%;text-align:center}.home #helm .billboard h1{font-size:5.755vw;margin:3rem 3.5vw 1.5em;padding:0}.home #helm .billboard h2{font-size:1rem;line-height:1.636;margin:2rem 3.5vw 5rem;padding-bottom:3.5rem}.main .content-wrap h1{font-size:17.92px}.main .content-wrap article{padding:0 0 .5em}.main .content-wrap article h1{font-size:32px}.main .content-wrap article h2{font-size:20px}.main .content-wrap article p:first-child{padding-right:0;font-size:17.92px}aside.left-off-canvas-menu{height:calc(100vh - calc(100vh - 100%));overflow-y:auto}aside.left-off-canvas-menu ul{background:#2ba0d3!important}aside.left-off-canvas-menu ul li{font-family:klinic-bold,klinic bold,helvetica neue,Helvetica,Arial,sans-serif;font-weight:600;letter-spacing:.05em;-webkit-font-smoothing:antialiased;font-size:1.25rem}aside.left-off-canvas-menu ul li a{color:#fff!important;border-bottom:none!important}aside.left-off-canvas-menu ul li a:hover{background:#2ba0d3!important}aside.left-off-canvas-menu ul li a.active{color:#fff!important;background:#277a9f!important}aside.left-off-canvas-menu ul li a+ul{display:none;background:#277a9f!important;margin-left:0;padding:.5em 0 1em 1.5em}aside.left-off-canvas-menu ul li a+ul li{font-family:helvetica neue,Helvetica,Arial,sans-serif;letter-spacing:0;font-size:1rem;list-style:none}aside.left-off-canvas-menu ul li a+ul li a{padding:.1em .66667rem;border-bottom:none;color:#e4e4e4!important}aside.left-off-canvas-menu ul li a.active+ul{display:block}aside.left-off-canvas-menu .button-wrap{padding:.75em 5%}aside.left-off-canvas-menu .button-wrap .button{margin:.4em 0}.top-bar .breadcrumb{left:2.75rem}.top-bar .right li{display:none}.top-bar .right li:nth-child(2){display:inline-block}.top-bar .right li:nth-child(2) a{position:absolute;right:-4em;top:-.35em;font-size:1.75rem}.contrib-text .lead{display:none}.cncf-wrap .cncf{padding-top:2rem;padding-bottom:2rem}.cncf-wrap .cncf img,.cncf-wrap .cncf p{float:none;min-width:80%;margin:1.5rem auto}.cncf-wrap .cncf img{max-width:51%}}@media screen and (min-height:575px){.sidebar{padding-bottom:0}.sidebar .sidebar-buttons{position:fixed;bottom:0}}.section-404{position:relative;min-height:670px}.section-404 #particles-js{position:absolute;width:100%}.section-404 h1{text-transform:none;font-size:32px;letter-spacing:.05em;margin:5em 7.5% 2.5em;position:relative}html{background:#fff!important} \ No newline at end of file diff --git a/docs/static/_redirects b/docs/static/_redirects index 6ee9a3d0f8..2a72969854 100644 --- a/docs/static/_redirects +++ b/docs/static/_redirects @@ -50,3 +50,6 @@ /:version/porter-darwin-amd64 https://github.com/getporter/porter/releases/download/:version/porter-darwin-amd64 302 /:version/porter-linux-amd64 https://github.com/getporter/porter/releases/download/:version/porter-linux-amd64 302 /:version/porter-windows-amd64.exe https://github.com/getporter/porter/releases/download/:version/porter-windows-amd64.exe 302 + +# Redirect the schema json files +/schema/:version/* https://raw.githubusercontent.com/getporter/porter/release/:version/pkg/schema/:splat diff --git a/docs/themes/porter/static/css/prism.css b/docs/themes/porter/static/css/prism.css index 64a80eb8d9..cad11c7829 100644 --- a/docs/themes/porter/static/css/prism.css +++ b/docs/themes/porter/static/css/prism.css @@ -1,141 +1,143 @@ -/* PrismJS 1.19.0 -https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript+bash+go+toml+yaml */ +/* PrismJS 1.27.0 +https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript+bash+docker+go+go-module+powershell+toml+yaml */ /** * prism.js default theme for JavaScript, CSS and HTML * Based on dabblet (http://dabblet.com) * @author Lea Verou */ - code[class*="language-"], - pre[class*="language-"] { - color: black; - background: none; - text-shadow: 0 1px white; - font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; - font-size: 1em; - text-align: left; - white-space: pre; - word-spacing: normal; - word-break: normal; - word-wrap: normal; - line-height: 1.5; - - -moz-tab-size: 4; - -o-tab-size: 4; - tab-size: 4; - - -webkit-hyphens: none; - -moz-hyphens: none; - -ms-hyphens: none; - hyphens: none; - } - - pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, - code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { - text-shadow: none; - background: #b3d4fc; - } - - pre[class*="language-"]::selection, pre[class*="language-"] ::selection, - code[class*="language-"]::selection, code[class*="language-"] ::selection { - text-shadow: none; - background: #b3d4fc; - } - - @media print { - code[class*="language-"], - pre[class*="language-"] { - text-shadow: none; - } - } - - /* Code blocks */ - pre[class*="language-"] { - padding: 1em; - margin: .5em 0; - overflow: auto; - } - - :not(pre) > code[class*="language-"], - pre[class*="language-"] { - background: #f5f2f0; - } - - /* Inline code */ - :not(pre) > code[class*="language-"] { - padding: .1em; - border-radius: .3em; - white-space: normal; - } - - .token.comment, - .token.prolog, - .token.doctype, - .token.cdata { - color: slategray; - } - - .token.punctuation { - color: #999; - } - - .token.namespace { - opacity: .7; - } - - .token.property, - .token.tag, - .token.boolean, - .token.number, - .token.constant, - .token.symbol, - .token.deleted { - color: #905; - } - - .token.selector, - .token.attr-name, - .token.string, - .token.char, - .token.builtin, - .token.inserted { - color: #690; - } - - .token.operator, - .token.entity, - .token.url, - .language-css .token.string, - .style .token.string { - color: #9a6e3a; - background: hsla(0, 0%, 100%, .5); - } - - .token.atrule, - .token.attr-value, - .token.keyword { - color: #07a; - } - - .token.function, - .token.class-name { - color: #DD4A68; - } - - .token.regex, - .token.important, - .token.variable { - color: #e90; - } - - .token.important, - .token.bold { - font-weight: bold; - } - .token.italic { - font-style: italic; - } - - .token.entity { - cursor: help; - } \ No newline at end of file +code[class*="language-"], +pre[class*="language-"] { + color: black; + background: none; + text-shadow: 0 1px white; + font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; + font-size: 1em; + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + word-wrap: normal; + line-height: 1.5; + + -moz-tab-size: 4; + -o-tab-size: 4; + tab-size: 4; + + -webkit-hyphens: none; + -moz-hyphens: none; + -ms-hyphens: none; + hyphens: none; +} + +pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, +code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { + text-shadow: none; + background: #b3d4fc; +} + +pre[class*="language-"]::selection, pre[class*="language-"] ::selection, +code[class*="language-"]::selection, code[class*="language-"] ::selection { + text-shadow: none; + background: #b3d4fc; +} + +@media print { + code[class*="language-"], + pre[class*="language-"] { + text-shadow: none; + } +} + +/* Code blocks */ +pre[class*="language-"] { + padding: 1em; + margin: .5em 0; + overflow: auto; +} + +:not(pre) > code[class*="language-"], +pre[class*="language-"] { + background: #f5f2f0; +} + +/* Inline code */ +:not(pre) > code[class*="language-"] { + padding: .1em; + border-radius: .3em; + white-space: normal; +} + +.token.comment, +.token.prolog, +.token.doctype, +.token.cdata { + color: slategray; +} + +.token.punctuation { + color: #999; +} + +.token.namespace { + opacity: .7; +} + +.token.property, +.token.tag, +.token.boolean, +.token.number, +.token.constant, +.token.symbol, +.token.deleted { + color: #905; +} + +.token.selector, +.token.attr-name, +.token.string, +.token.char, +.token.builtin, +.token.inserted { + color: #690; +} + +.token.operator, +.token.entity, +.token.url, +.language-css .token.string, +.style .token.string { + color: #9a6e3a; + /* This background color was intended by the author of this theme. */ + background: hsla(0, 0%, 100%, .5); +} + +.token.atrule, +.token.attr-value, +.token.keyword { + color: #07a; +} + +.token.function, +.token.class-name { + color: #DD4A68; +} + +.token.regex, +.token.important, +.token.variable { + color: #e90; +} + +.token.important, +.token.bold { + font-weight: bold; +} +.token.italic { + font-style: italic; +} + +.token.entity { + cursor: help; +} + diff --git a/docs/themes/porter/static/js/custom/prism.js b/docs/themes/porter/static/js/custom/prism.js index 2469f54a98..73f7ab7537 100644 --- a/docs/themes/porter/static/js/custom/prism.js +++ b/docs/themes/porter/static/js/custom/prism.js @@ -1,11 +1,2278 @@ -/* PrismJS 1.19.0 -https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript+bash+go+toml+yaml */ -var _self="undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},Prism=function(u){var c=/\blang(?:uage)?-([\w-]+)\b/i,n=0,C={manual:u.Prism&&u.Prism.manual,disableWorkerMessageHandler:u.Prism&&u.Prism.disableWorkerMessageHandler,util:{encode:function(e){return e instanceof _?new _(e.type,C.util.encode(e.content),e.alias):Array.isArray(e)?e.map(C.util.encode):e.replace(/&/g,"&").replace(/e.length)return;if(!(k instanceof _)){if(h&&y!=n.length-1){if(c.lastIndex=v,!(O=c.exec(e)))break;for(var b=O.index+(f&&O[1]?O[1].length:0),w=O.index+O[0].length,A=y,P=v,x=n.length;A"+r.content+""},!u.document)return u.addEventListener&&(C.disableWorkerMessageHandler||u.addEventListener("message",function(e){var n=JSON.parse(e.data),r=n.language,t=n.code,a=n.immediateClose;u.postMessage(C.highlight(t,C.languages[r],r)),a&&u.close()},!1)),C;var e=C.util.currentScript();function r(){C.manual||C.highlightAll()}if(e&&(C.filename=e.src,e.hasAttribute("data-manual")&&(C.manual=!0)),!C.manual){var t=document.readyState;"loading"===t||"interactive"===t&&e&&e.defer?document.addEventListener("DOMContentLoaded",r):window.requestAnimationFrame?window.requestAnimationFrame(r):window.setTimeout(r,16)}return C}(_self);"undefined"!=typeof module&&module.exports&&(module.exports=Prism),"undefined"!=typeof global&&(global.Prism=Prism); -Prism.languages.markup={comment://,prolog:/<\?[\s\S]+?\?>/,doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:(?!)*\]\s*)?>/i,greedy:!0},cdata://i,tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/i,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/i,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/i,inside:{punctuation:[/^=/,{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:/&#?[\da-z]{1,8};/i},Prism.languages.markup.tag.inside["attr-value"].inside.entity=Prism.languages.markup.entity,Prism.hooks.add("wrap",function(a){"entity"===a.type&&(a.attributes.title=a.content.replace(/&/,"&"))}),Object.defineProperty(Prism.languages.markup.tag,"addInlined",{value:function(a,e){var s={};s["language-"+e]={pattern:/(^$)/i,lookbehind:!0,inside:Prism.languages[e]},s.cdata=/^$/i;var n={"included-cdata":{pattern://i,inside:s}};n["language-"+e]={pattern:/[\s\S]+/,inside:Prism.languages[e]};var t={};t[a]={pattern:RegExp("(<__[\\s\\S]*?>)(?:\\s*|[\\s\\S])*?(?=<\\/__>)".replace(/__/g,a),"i"),lookbehind:!0,greedy:!0,inside:n},Prism.languages.insertBefore("markup","cdata",t)}}),Prism.languages.xml=Prism.languages.extend("markup",{}),Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup; -!function(s){var e=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;s.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-]+[\s\S]*?(?:;|(?=\s*\{))/,inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\((?!\s*\))\s*)(?:[^()]|\((?:[^()]|\([^()]*\))*\))+?(?=\s*\))/,lookbehind:!0,alias:"selector"}}},url:{pattern:RegExp("url\\((?:"+e.source+"|[^\n\r()]*)\\)","i"),inside:{function:/^url/i,punctuation:/^\(|\)$/}},selector:RegExp("[^{}\\s](?:[^{};\"']|"+e.source+")*?(?=\\s*\\{)"),string:{pattern:e,greedy:!0},property:/[-_a-z\xA0-\uFFFF][-\w\xA0-\uFFFF]*(?=\s*:)/i,important:/!important\b/i,function:/[-a-z0-9]+(?=\()/i,punctuation:/[(){};:,]/},s.languages.css.atrule.inside.rest=s.languages.css;var t=s.languages.markup;t&&(t.tag.addInlined("style","css"),s.languages.insertBefore("inside","attr-value",{"style-attr":{pattern:/\s*style=("|')(?:\\[\s\S]|(?!\1)[^\\])*\1/i,inside:{"attr-name":{pattern:/^\s*style/i,inside:t.tag.inside},punctuation:/^\s*=\s*['"]|['"]\s*$/,"attr-value":{pattern:/.+/i,inside:s.languages.css}},alias:"language-css"}},t.tag))}(Prism); -Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|interface|extends|implements|trait|instanceof|new)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/,boolean:/\b(?:true|false)\b/,function:/\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+\.?\d*|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/}; -Prism.languages.javascript=Prism.languages.extend("clike",{"class-name":[Prism.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])[_$A-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\.(?:prototype|constructor))/,lookbehind:!0}],keyword:[{pattern:/((?:^|})\s*)(?:catch|finally)\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],number:/\b(?:(?:0[xX](?:[\dA-Fa-f](?:_[\dA-Fa-f])?)+|0[bB](?:[01](?:_[01])?)+|0[oO](?:[0-7](?:_[0-7])?)+)n?|(?:\d(?:_\d)?)+n|NaN|Infinity)\b|(?:\b(?:\d(?:_\d)?)+\.?(?:\d(?:_\d)?)*|\B\.(?:\d(?:_\d)?)+)(?:[Ee][+-]?(?:\d(?:_\d)?)+)?/,function:/#?[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,operator:/--|\+\+|\*\*=?|=>|&&|\|\||[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?[.?]?|[~:]/}),Prism.languages.javascript["class-name"][0].pattern=/(\b(?:class|interface|extends|implements|instanceof|new)\s+)[\w.\\]+/,Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s])\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*]|\\.|[^/\\\[\r\n])+\/[gimyus]{0,6}(?=(?:\s|\/\*[\s\S]*?\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0},"function-variable":{pattern:/#?[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+[_$A-Za-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)?\s*\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\))/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*=>)/i,inside:Prism.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\)\s*=>)/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:[_$A-Za-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*\s*)\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\)\s*\{)/,lookbehind:!0,inside:Prism.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),Prism.languages.insertBefore("javascript","string",{"template-string":{pattern:/`(?:\\[\s\S]|\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})+}|(?!\${)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})+}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\${|}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}}}),Prism.languages.markup&&Prism.languages.markup.tag.addInlined("script","javascript"),Prism.languages.js=Prism.languages.javascript; -!function(e){var t="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",n={environment:{pattern:RegExp("\\$"+t),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+\.?\d*|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--?|-=|\+\+?|\+=|!=?|~|\*\*?|\*=|\/=?|%=?|<<=?|>>=?|<=?|>=?|==?|&&?|&=|\^=?|\|\|?|\|=|\?|:/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+t),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|x[0-9a-fA-F]{1,2}|u[0-9a-fA-F]{4}|U[0-9a-fA-F]{8})/};e.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)\w+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b\w+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+t),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+?)\s*(?:\r?\n|\r)[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:n},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s*(?:\r?\n|\r)[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0},{pattern:/(["'])(?:\\[\s\S]|\$\([^)]+\)|`[^`]+`|(?!\1)[^\\])*\1/,greedy:!0,inside:n}],environment:{pattern:RegExp("\\$?"+t),alias:"constant"},variable:n.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|aptitude|apt-cache|apt-get|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:if|then|else|elif|fi|for|while|in|case|esac|function|select|do|done|until)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|break|cd|continue|eval|exec|exit|export|getopts|hash|pwd|readonly|return|shift|test|times|trap|umask|unset|alias|bind|builtin|caller|command|declare|echo|enable|help|let|local|logout|mapfile|printf|read|readarray|source|type|typeset|ulimit|unalias|set|shopt)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:true|false)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|==?|!=?|=~|<<[<-]?|[&\d]?>>|\d?[<>]&?|&[>&]?|\|[&|]?|<=?|>=?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}};for(var a=["comment","function-name","for-or-select","assign-left","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],r=n.variable[1].inside,s=0;s(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,number:/(?:\b0x[a-f\d]+|(?:\b\d+\.?\d*|\B\.\d+)(?:e[-+]?\d+)?)i?/i,string:{pattern:/(["'`])(?:\\[\s\S]|(?!\1)[^\\])*\1/,greedy:!0}}),delete Prism.languages.go["class-name"]; -!function(e){var d="(?:[\\w-]+|'[^'\n\r]*'|\"(?:\\.|[^\\\\\"\r\n])*\")";Prism.languages.toml={comment:{pattern:/#.*/,greedy:!0},table:{pattern:RegExp("(^\\s*\\[\\s*(?:\\[\\s*)?)"+d+"(?:\\s*\\.\\s*"+d+")*(?=\\s*\\])","m"),lookbehind:!0,greedy:!0,alias:"class-name"},key:{pattern:RegExp("(^\\s*|[{,]\\s*)"+d+"(?:\\s*\\.\\s*"+d+")*(?=\\s*=)","m"),lookbehind:!0,greedy:!0,alias:"property"},string:{pattern:/"""(?:\\[\s\S]|[^\\])*?"""|'''[\s\S]*?'''|'[^'\n\r]*'|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},date:[{pattern:/\d{4}-\d{2}-\d{2}(?:[T\s]\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})?)?/i,alias:"number"},{pattern:/\d{2}:\d{2}:\d{2}(?:\.\d+)?/i,alias:"number"}],number:/(?:\b0(?:x[\da-zA-Z]+(?:_[\da-zA-Z]+)*|o[0-7]+(?:_[0-7]+)*|b[10]+(?:_[10]+)*))\b|[-+]?\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?\b|[-+]?(?:inf|nan)\b/,boolean:/\b(?:true|false)\b/,punctuation:/[.,=[\]{}]/}}(); -Prism.languages.yaml={scalar:{pattern:/([\-:]\s*(?:![^\s]+)?[ \t]*[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)[^\r\n]+(?:\2[^\r\n]+)*)/,lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:/(\s*(?:^|[:\-,[{\r\n?])[ \t]*(?:![^\s]+)?[ \t]*)[^\r\n{[\]},#\s]+?(?=\s*:\s)/,lookbehind:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:/([:\-,[{]\s*(?:![^\s]+)?[ \t]*)(?:\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?)?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?)(?=[ \t]*(?:$|,|]|}))/m,lookbehind:!0,alias:"number"},boolean:{pattern:/([:\-,[{]\s*(?:![^\s]+)?[ \t]*)(?:true|false)[ \t]*(?=$|,|]|})/im,lookbehind:!0,alias:"important"},null:{pattern:/([:\-,[{]\s*(?:![^\s]+)?[ \t]*)(?:null|~)[ \t]*(?=$|,|]|})/im,lookbehind:!0,alias:"important"},string:{pattern:/([:\-,[{]\s*(?:![^\s]+)?[ \t]*)("|')(?:(?!\2)[^\\\r\n]|\\.)*\2(?=[ \t]*(?:$|,|]|}|\s*#))/m,lookbehind:!0,greedy:!0},number:{pattern:/([:\-,[{]\s*(?:![^\s]+)?[ \t]*)[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+\.?\d*|\.?\d+)(?:e[+-]?\d+)?|\.inf|\.nan)[ \t]*(?=$|,|]|})/im,lookbehind:!0},tag:/![^\s]+/,important:/[&*][\w]+/,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},Prism.languages.yml=Prism.languages.yaml; +/* PrismJS 1.27.0 +https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript+bash+docker+go+go-module+powershell+toml+yaml */ +/// + +var _self = (typeof window !== 'undefined') + ? window // if in browser + : ( + (typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope) + ? self // if in worker + : {} // if in node js + ); + +/** + * Prism: Lightweight, robust, elegant syntax highlighting + * + * @license MIT + * @author Lea Verou + * @namespace + * @public + */ +var Prism = (function (_self) { + + // Private helper vars + var lang = /(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i; + var uniqueId = 0; + + // The grammar object for plaintext + var plainTextGrammar = {}; + + + var _ = { + /** + * By default, Prism will attempt to highlight all code elements (by calling {@link Prism.highlightAll}) on the + * current page after the page finished loading. This might be a problem if e.g. you wanted to asynchronously load + * additional languages or plugins yourself. + * + * By setting this value to `true`, Prism will not automatically highlight all code elements on the page. + * + * You obviously have to change this value before the automatic highlighting started. To do this, you can add an + * empty Prism object into the global scope before loading the Prism script like this: + * + * ```js + * window.Prism = window.Prism || {}; + * Prism.manual = true; + * // add a new