From 61425caedf0d56c8a773b42ccde85ec972465f2e Mon Sep 17 00:00:00 2001 From: Isaac Mills Date: Sat, 6 Apr 2024 23:30:42 -0400 Subject: [PATCH 01/11] Finish up our first article --- .gitattributes | 1 + assets/giga_chad.jpg | Bin 0 -> 9885 bytes assets/the_pipeline.svg | 4 ++ src/how_to_run_a_journal.dj | 93 ++++++++++++++++++++++++++++++++++++ 4 files changed, 98 insertions(+) create mode 100644 .gitattributes create mode 100644 assets/giga_chad.jpg create mode 100644 assets/the_pipeline.svg create mode 100644 src/how_to_run_a_journal.dj diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..c0c4e47 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +assets/ filter=lfs diff=lfs merge=lfs -text diff --git a/assets/giga_chad.jpg b/assets/giga_chad.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7150f96a62943b91c98f0a2eca953a7dd7982df0 GIT binary patch literal 9885 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 + + +
Articles are
served with
Articles are...
Search is powered
by
Search is powered...
Merges to prod
trigger CI
Merges to prod...
If article is good,
it gets merged
to prod
If article is good,...
Large assets
like images are
stored here
Large assets...
Forgejo
Compiles articles to HTML
Compiles articles to HTML
Woodpecker CI
Writers, editors, etc.
Write...
Articles are
statically
compressed
Articles are...
Articles are registered
and updated with
Articles are registered...
Pull requests are opened on
Pull requests are opened on

Djot

Articles are written in
Djot...
Uses git for incremental
rendering, and author
annotations
Uses git for incremental...
Gitfile_type_nginxNGINXBrotli
Compressed articles
are written back to
server
Compressed articles...
Meilisearch Meilisearch Git LFS
\ No newline at end of file diff --git a/src/how_to_run_a_journal.dj b/src/how_to_run_a_journal.dj new file mode 100644 index 0000000..b3dbeaa --- /dev/null +++ b/src/how_to_run_a_journal.dj @@ -0,0 +1,93 @@ +# How to Run a Journal + +Hi! I'm Isaac Mills, I'm the guy managing the infrastructure behind Compute! In this article, I'd like to talk about just that: the infra behind this journal, how it all works, and why it is the way it is. + +## Plain text + +Plain text is kind of insane. It's capable of being anything, and can also be transmuted into anything. It's infinite extensibility makes it a powerful tool that every developer should have in their arsenal. For this journal, we use a lot of plain text. In fact, the article you're reading right now is written in plain text, _not with some web UI_. A while back, I found a markup language called [djot](https://djot.net). It was created by the same person who created CommonMark, a flavor of markdown, to be easier to parse and more featureful. Below is some example djot + +```djot +# Heading + +paragraph + +*bold* _italic_ _*bold italic*_ {-strikethorugh-} {+underline+} + +- list +- list + +1. list +2. list +``` + +The benefit of using djot is that it compiles directly to HTML, thus the jorunalists who have joined Compute don't need to learn HTML to write articles. They also don't need to learn a clunky slow website editor like Wix or Squarespace. + +This is another superpower of plain text, if we used Wix for our website, our journalists would need to learn how to use the Wix UI, and how to write articles _for_ that UI. If we needed to change our tooling at any time, they would need to re-learn everything for _that_ tool. Not only that, but we would need to port the entire journal (_every_ article), to use that new tooling. This is not so with plain text, if things change in the pipeline, or even if you're just joining the journal, there's no need to re-learn how to write text. At worst, you just need to convert the plain text to another format of plain text (djot to HTML for example). All our journalists need to know how to do is write their articles in djot, and submit it to the team via the pipeline + +## The Pipeline + +![A flowchart of the pipeline](assets/the_pipeline.svg) + +Pictured above is the full pipeline that articles go through in order to reach you readers at home, it goes like this + +1. Articles are written by our journalists in a plain text format (djot in our case) +2. Once an article is done, the journalist who wrote the article opens a pull request on our git repository with their new article and associated assets +3. The article can be reviewed by the team and edits can be made by them. +4. Once the article has been edited, the pull request gets merged into the main branch of our git repository, which is where the articles you see live +5. From there, the article goes through CI and gets deployed (we'll get into that in more detail later) + +Basically, this is just the workflow you would use for code, but adapted for journalism. In other words, no learning curve for our journalists! And if they do need to learn it, then this is information that they *should* know _anyway_. The workflow you see above has been in the making since git was created in 2005, with the sole purpose of efficiently moving code from development, into production. The more efficiently we can accomplish that, and the more bad code we can filter out of production, the better. If this workflow has worked for nearly 2 decades for a pathologically huge project like the Linux kernel (which git was tailor-made to handle), the better. + +## CI + +Consider the following: If I'm accepting untrusted code from the public into my open source project, and I need that code to be production ready, how can I ensure that the code I accept _is_ actually production ready. The answer is with _continuous integration_, or _CI_. The idea is that every piece of code submitted to an open source project would undergo automated testing, linting, and checking to ensure that nothing will break upon merging the code into the production code base. For a project like [`egui`](https://lib.rs/crates/egui), their CI pipeline contains 19 checks. + +Their pipeline checks if the library with your new code compiles to every platform it's compatible with, with every feature enabled. It also makes sure that your code is well-formatted, contains no conflicts of license, uses no libraries banned by the project, and contains no security advisories. The _only_ way this many checks can be done on every git commit, is through CI, GitHub Actions in egui's case. + +If you're making an open source project, and it becomes big enough to pull in contributions from a lot of developers, CI can not only serve as a means to filter bugs out of pull requests, but also as a way to communicate to open source developers _what a project wants_ out of their code. Instead of having to read a big `CONTRIBUTORS.md` file to get an idea of that, developers can know that their code is good quality if it just passes CI. + +Fortunately, the level of CI I've described above is not required for journalism. Our CI simply compiles our journalists' unreviewed articles, and serves them on an un-indexed (not visible on production) web page so that they and the team can preview their work before merging it. Our CI is also responsible for indexing and publishing finished articles onto our production website. We could get the CI to do an automated grammar check, but there are too many tech-terms that the checker would need to know in order for it to pass consistently. + +## Deployment + +Deployment is the most complex part of our pipeline; getting the written, production ready articles, onto the website _you_ are reading this on. As I said earlier in the article, we use CI to compile and index finished articles. The CI tool we use is called [Woodpecker CI](https://woodpecker-ci.org/), a self-hosted docker-based CI tool. Self-hosted basically means that we can run the CI tool on the same server we use to serve our website, making deployment to there as easy as moving the generated files into the directory that our web server is serving (NGINX in our case). What's important to know is that when a pull request is opened on this journal's git repository, and when a pull request is merged into production, Woodpecker CI will run a custom program that I wrote in Rust to... + +- Compile djot articles to HTML +- Minify and compress compiled HTML +- Index articles with our search engine + +Because our CI tool is running this code, we can know which articles need compilation, who wrote those articles, and if any articles need to be deleted. Via environment variables, our CI tool will pass to our code the git branch we're running on, the git commit that came before the latest one, and the latest git commit. Our code can then use this information to... + +- Run a diff between the two commits, which is how we know which files need to be compiled, and which files have been deleted +- Run a blame on the new articles, which is how we figure out who wrote them +- See if we are we have changed the main branch, and index new articles if so + +In our case, what CI allows us to do is keep as much of our pipeline as automated as possible. Our journalists should only need to focus on writing good articles, not wrestling with tooling. Coming back to the benefits of plain text, git is an extremely powerful tool for working with plain text. + +- It allows us to separate the WIP and the finished articles +- It allows us to keep an accurate and automated reference of who wrote and edited each article +- It allows a copy of the entire journal to be stored in many different places as backups. +- It allows us to easily sync new articles and changes to any git-compatible software forge of our choice (we use [forgejo](https://forgejo.org/)) + +By and large, with the power of git, plain text can fill more use cases than you could possibly imagine. + +## Our webpages (and staying based) + +![An image of the giga-chad](assets/giga_chad.jpg) + +The modern web sucks. Most webpages are not only bloated with ads, cookie banners, autoplaying BS, popups and the like; most webpages are also inundated with copious amounts of JavaScript. We only use JavaScript in 2 places + +1. On our homepage to power the search bar and display articles +2. Our web design tool, Webflow, bundles a small amount of JavaScript in every page (more on that later) + +Other than that, the actual article pages, such as this one, depend on nothing but the JavaScript that Webflow bundles in. And for our homepage, it's built and optimized so it can be served statically with it's _one_ dependency. Basically, I wanted to make our website as [suckless](https://suckless.org/philosophy/) (as lightweight, and as free from bloat) as possible. I say _I_ wanted to because our founder wanted to use Wix originally, yuck. + +Instead of _that_, I used [Webflow](https://webflow.com/) to design our webpages. For a one-time fee of $24, you can have access to the Webflow editor for 1 month, and then export your web pages to HTML/CSS/JS. Webflow is very different from your average Wix/Squarespace, those editors are designed for non-programmers who don't know and don't want to know HTML or CSS. Webflow is an editor for _developers_ that know what they're doing. It gives you the full power of HTML and CSS in a responsive, visual editor; making it an incredibly flexible tool capable of generating very based and performant webpages. Unlike the latter tools which generate bloated and obfuscated garbage. + +## Search engine + +I was expecting to have to put most of the effort of getting our website ready into getting a search bar working. Instead, I found [Meilisearch](https://www.meilisearch.com/), and I fell in love immediately. Not only is it incredibly easy to deploy _and_ use, but it's also much more than just a search engine. You can basically use it as a way to index and display pages on your website. And by using [instantsearch-meilisearch](https://github.com/meilisearch/meilisearch-js-plugins/tree/main/packages/instant-meilisearch) (that one dependency that our homepage uses), we can just make an article browser and search experience, _incredibly_ easily. It's not just easy on the front-end, the [meilisearch-sdk](https://lib.rs/crates/meilisearch-sdk) is also incredibly easy to use to index articles. Meilisearch, despite being a complex full-text search engine, is incredibly simple to use. Just initialize a search index, and send documents to it in a structured JSON format. On the front end, you can get that JSON back with a simple HTTP request containing the search query and field constraints (sorting, only sending snippets of big fields, etc.). All in all, Meilisearch's unexpected simplicity suprised me in a big way, and it made my job so _sooo_ much easier! + +## In conclusion + +Computers have an inconcievable amount of potential, but they're only as smart as their programmer. When you're building something with a computer, it's often much better to do more with less, than less with more. Don't use 17 different JavaScript frameworks with your hypervisor GPU WEB2.0 interface-driven scripting framework to drive your map/reduce-aware proxy-oriented software API. Just start simple, build simple, and if you need complexity, create it with the simple. Often times in computer software, plain text is the simplest place to start. From there, you can add complexity by processing the plain text in some way (hell, I made a whole ass [PowerPoint clone](https://github.com/StratusFearMe21/grezi-next) centered around plain text). If you need more than plain text, try the terminal. And if you need more than that, try [wxWidgets](https://www.wxwidgets.org/). The point I'm trying to make here is that bloat is your enemy, and it's often better for you, your team, and your users to just KISS (Keep it simple, stupid!) -- 2.46.2 From cd2fccb0dbe49be59e134dce8998b210dcdd3b2d Mon Sep 17 00:00:00 2001 From: Isaac Mills Date: Sun, 7 Apr 2024 00:18:42 -0400 Subject: [PATCH 02/11] Initialize CI --- .woodpecker.yml | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 .woodpecker.yml diff --git a/.woodpecker.yml b/.woodpecker.yml new file mode 100644 index 0000000..44ad97f --- /dev/null +++ b/.woodpecker.yml @@ -0,0 +1,7 @@ +steps: + - name: build + image: journal + commands: + - bruin-journal-gen + volumes: + - /var/woodpecker:/var/woodpecker -- 2.46.2 From f05c2b2b274b4b145ee08a071f1aeed9957ac5e0 Mon Sep 17 00:00:00 2001 From: Isaac Mills Date: Sun, 7 Apr 2024 02:05:26 -0400 Subject: [PATCH 03/11] Reflect how I changed CI slightly --- src/how_to_run_a_journal.dj | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/how_to_run_a_journal.dj b/src/how_to_run_a_journal.dj index b3dbeaa..0e21d63 100644 --- a/src/how_to_run_a_journal.dj +++ b/src/how_to_run_a_journal.dj @@ -56,11 +56,11 @@ Deployment is the most complex part of our pipeline; getting the written, produc - Minify and compress compiled HTML - Index articles with our search engine -Because our CI tool is running this code, we can know which articles need compilation, who wrote those articles, and if any articles need to be deleted. Via environment variables, our CI tool will pass to our code the git branch we're running on, the git commit that came before the latest one, and the latest git commit. Our code can then use this information to... +Because our CI tool is running this code, we can know which articles need compilation, who wrote those articles, and if any articles need to be deleted. Our CI tools will put our code in the working directory of our git repo. And via environment variables, the CI tool will tell us which files have changed, how the pipeline was triggered (via pull request, code push, etc.), as well as which git branch production resides in, and which branch our code is currently in. Our code can then use this information to... -- Run a diff between the two commits, which is how we know which files need to be compiled, and which files have been deleted -- Run a blame on the new articles, which is how we figure out who wrote them -- See if we are we have changed the main branch, and index new articles if so +- Stat the changed files, which is how we know which files need to be compiled, and which files have been deleted +- Run a blame on new articles, which is how we figure out who wrote them +- See if we are we have changed the production branch, and index new articles if so In our case, what CI allows us to do is keep as much of our pipeline as automated as possible. Our journalists should only need to focus on writing good articles, not wrestling with tooling. Coming back to the benefits of plain text, git is an extremely powerful tool for working with plain text. -- 2.46.2 From 51c60968405e3f181b0bc4ba96215e0234f7ce01 Mon Sep 17 00:00:00 2001 From: Isaac Mills Date: Sun, 7 Apr 2024 07:38:48 -0400 Subject: [PATCH 04/11] Clarify conclusion paragraph --- src/how_to_run_a_journal.dj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/how_to_run_a_journal.dj b/src/how_to_run_a_journal.dj index 0e21d63..8599aeb 100644 --- a/src/how_to_run_a_journal.dj +++ b/src/how_to_run_a_journal.dj @@ -90,4 +90,4 @@ I was expecting to have to put most of the effort of getting our website ready i ## In conclusion -Computers have an inconcievable amount of potential, but they're only as smart as their programmer. When you're building something with a computer, it's often much better to do more with less, than less with more. Don't use 17 different JavaScript frameworks with your hypervisor GPU WEB2.0 interface-driven scripting framework to drive your map/reduce-aware proxy-oriented software API. Just start simple, build simple, and if you need complexity, create it with the simple. Often times in computer software, plain text is the simplest place to start. From there, you can add complexity by processing the plain text in some way (hell, I made a whole ass [PowerPoint clone](https://github.com/StratusFearMe21/grezi-next) centered around plain text). If you need more than plain text, try the terminal. And if you need more than that, try [wxWidgets](https://www.wxwidgets.org/). The point I'm trying to make here is that bloat is your enemy, and it's often better for you, your team, and your users to just KISS (Keep it simple, stupid!) +Computers have an inconcievable amount of potential, but they're only as smart as their programmer. When you're building something with a computer, it's often much better to do more with less, than less with more. Don't use 17 different JavaScript frameworks with your hypervisor GPU WEB2.0 interface-driven scripting framework to drive your map/reduce-aware proxy-oriented software API. Just start simple, build simple, and if you need complexity, build it with more simple. Often times in computer software, plain text is the simplest place to start. From there, you can add complexity by processing the plain text in some way (hell, I made a whole ass [PowerPoint clone](https://github.com/StratusFearMe21/grezi-next) centered around plain text). If you need more than plain text, try the terminal. And if you need more than that, try [wxWidgets](https://www.wxwidgets.org/). The point I'm trying to make here is that bloat is your enemy, and it's often better for you, your team, and your users to just KISS (Keep it simple, stupid!) -- 2.46.2 From d37ad8ef32cdcacb8cca5e2b97a19e1c6140489d Mon Sep 17 00:00:00 2001 From: Isaac Mills Date: Sun, 7 Apr 2024 12:49:55 -0400 Subject: [PATCH 05/11] Move templates to this repo --- .gitattributes | 1 + templates/article.html | 56 + templates/assets | 1 + templates/css/compute-c23f91.webflow.css | 276 +++ templates/css/normalize.css | 355 ++++ templates/css/webflow.css | 2141 ++++++++++++++++++++++ templates/images/favicon.ico | Bin 0 -> 20490 bytes templates/images/logo-z.svg | 1 + templates/images/webclip.png | Bin 0 -> 4807 bytes templates/js/webflow.js | 36 + 10 files changed, 2867 insertions(+) create mode 100644 templates/article.html create mode 120000 templates/assets create mode 100644 templates/css/compute-c23f91.webflow.css create mode 100644 templates/css/normalize.css create mode 100644 templates/css/webflow.css create mode 100644 templates/images/favicon.ico create mode 100644 templates/images/logo-z.svg create mode 100644 templates/images/webclip.png create mode 100644 templates/js/webflow.js diff --git a/.gitattributes b/.gitattributes index c0c4e47..32ba157 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1 +1,2 @@ assets/ filter=lfs diff=lfs merge=lfs -text +templates/images/ filter=lfs diff=lfs merge=lfs -text diff --git a/templates/article.html b/templates/article.html new file mode 100644 index 0000000..d810462 --- /dev/null +++ b/templates/article.html @@ -0,0 +1,56 @@ + + + + + + + {{title}} + + + + + + + + + + + + + + +
+

{{title}}

+
+ {% for author in authors %} + {{author.full_name}}'s Avatar +
{{author.full_name}}
+ {% endfor %} +
+

{{published}}

+
+
{{body}}
+
+ +

Read more from Compute

+
+ + + + + diff --git a/templates/assets b/templates/assets new file mode 120000 index 0000000..bae6859 --- /dev/null +++ b/templates/assets @@ -0,0 +1 @@ +../assets/ \ No newline at end of file diff --git a/templates/css/compute-c23f91.webflow.css b/templates/css/compute-c23f91.webflow.css new file mode 100644 index 0000000..8587062 --- /dev/null +++ b/templates/css/compute-c23f91.webflow.css @@ -0,0 +1,276 @@ +:root { + --white: white; + --black: black; +} + +.w-layout-vflex { + flex-direction: column; + align-items: flex-start; + display: flex; +} + +.w-layout-blockcontainer { + max-width: 940px; + margin-left: auto; + margin-right: auto; + display: block; +} + +.w-layout-grid { + grid-row-gap: 16px; + grid-column-gap: 16px; + grid-template-rows: auto auto; + grid-template-columns: 1fr 1fr; + grid-auto-columns: 1fr; + display: grid; +} + +.w-layout-hflex { + flex-direction: row; + align-items: flex-start; + display: flex; +} + +@media screen and (max-width: 991px) { + .w-layout-blockcontainer { + max-width: 728px; + } +} + +@media screen and (max-width: 767px) { + .w-layout-blockcontainer { + max-width: none; + } +} + +article { + margin: 20px; +} + +h1 { + margin-top: auto; + font-size: 128px; + font-weight: 700; +} + +p { + margin-bottom: 10px; + margin-top: 10px; + font-size: 18px; +} + +li { + font-size: 18px; +} + +.utility-page-wrap { + justify-content: center; + align-items: center; + width: 100vw; + max-width: 100%; + height: 100vh; + max-height: 100%; + display: flex; +} + +.utility-page-content { + text-align: center; + flex-direction: column; + width: 260px; + display: flex; +} + +.utility-page-form { + flex-direction: column; + align-items: stretch; + display: flex; +} + +.container-2 { + padding-top: 8px; + padding-bottom: 8px; +} + +.flex-block-2 { + justify-content: center; + align-items: center; +} + +.flex-block-2.purple { + color: #333; + background-color: #552a85; + flex-flow: column; + justify-content: space-around; + padding-top: 0; + display: flex; + overflow-x: hidden; +} + +.heading-3 { + color: #f6c415; + font-size: 22vw; + overflow-x: hidden; +} + +.heading-3.wrapped-compute { + display: none; +} + +.heading-3.unwrapped-compute.compute-gradiant { + -webkit-text-fill-color: transparent; + background-image: linear-gradient(90deg, #f6c415, #f6c41533); + -webkit-background-clip: text; + background-clip: text; + margin-bottom: 20px; +} + +.text-block { + color: #fff; + text-align: left; + margin-left: 20px; + margin-right: 20px; + font-size: 18px; +} + +.container-3 { + height: 20vh; + margin-top: 8px; + margin-bottom: 8px; + padding-left: 16px; + padding-right: 16px; +} + +.heading-4 { + margin-top: 0; + margin-bottom: 0; + font-size: 5vw; +} + +.heading-5 { + margin-top: 0; + margin-bottom: 0; +} + +.heading-6 { + margin-top: 0; + margin-bottom: 0; + font-size: 64px; +} + +.paragraph { + font-size: 24px; +} + +.heading-7 { + font-size: 64px; +} + +.grid { + padding-left: 16px; + padding-right: 16px; +} + +.heading-8 { + color: #f6c415; + text-align: left; + -webkit-text-fill-color: transparent; + background-image: linear-gradient(90deg, #f6c415, rgba(246, 196, 21, .3)); + -webkit-background-clip: text; + background-clip: text; + margin-bottom: 20px; + margin-left: 20px; + margin-right: 20px; +} + +.image { + -webkit-text-fill-color: inherit; + background-clip: border-box; + border-radius: 50%; + margin-bottom: 0; + margin-left: 20px; + margin-right: 10px; +} + +.flex-block-3 { + align-items: center; + margin-bottom: 20px; +} + +.text-block-2 { + color: #fff; + font-size: 18px; +} + +@media screen and (max-width: 991px) { + .heading-3.unwrapped-compute.compute-gradiant { + height: 22vw; + min-height: 0%; + } + + .grid { + grid-template-columns: 1fr; + } + + .heading-8 { + margin-bottom: 20px; + font-size: 64px; + } +} + +@media screen and (max-width: 767px) { + .heading-3.wrapped-compute.compute-gradiant { + -webkit-text-fill-color: transparent; + background-image: linear-gradient(90deg, #f6c415, #f6c41533); + -webkit-background-clip: text; + background-clip: text; + margin-bottom: 20px; + display: block; + } + + .ais-Hits-item { + margin-bottom: 1em; + width: calc(50% - 1rem); + } + + .heading-3.unwrapped-compute.compute-gradiant { + display: none; + } + + .heading-8 { + font-size: 64px; + } +} + +@media screen and (max-width: 479px) { + .flex-block-2.purple { + flex-flow: column; + justify-content: space-around; + } + + .heading-3 { + font-size: 48vw; + } + + .heading-3.wrapped-compute { + display: block; + } + + .heading-3.wrapped-compute.compute-gradiant { + -webkit-text-fill-color: transparent; + background-image: linear-gradient(90deg, #f6c415, #f6c41533); + -webkit-background-clip: text; + background-clip: text; + min-height: 48vw; + margin-top: 0; + margin-bottom: 10px; + overflow-y: hidden; + } + + .heading-3.unwrapped-compute { + display: none; + } + + .text-block { + font-size: 6vw; + } +} \ No newline at end of file diff --git a/templates/css/normalize.css b/templates/css/normalize.css new file mode 100644 index 0000000..411d0b2 --- /dev/null +++ b/templates/css/normalize.css @@ -0,0 +1,355 @@ +/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */ +/** + * 1. Set default font family to sans-serif. + * 2. Prevent iOS and IE text size adjust after device orientation change, + * without disabling user zoom. + */ +html { + font-family: sans-serif; + /* 1 */ + -ms-text-size-adjust: 100%; + /* 2 */ + -webkit-text-size-adjust: 100%; + /* 2 */ +} +/** + * Remove default margin. + */ +body { + margin: 0; +} +/* HTML5 display definitions + ========================================================================== */ +/** + * Correct `block` display not defined for any HTML5 element in IE 8/9. + * Correct `block` display not defined for `details` or `summary` in IE 10/11 + * and Firefox. + * Correct `block` display not defined for `main` in IE 11. + */ +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +menu, +nav, +section, +summary { + display: block; +} +/** + * 1. Correct `inline-block` display not defined in IE 8/9. + * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera. + */ +audio, +canvas, +progress, +video { + display: inline-block; + /* 1 */ + vertical-align: baseline; + /* 2 */ +} +/** + * Prevent modern browsers from displaying `audio` without controls. + * Remove excess height in iOS 5 devices. + */ +audio:not([controls]) { + display: none; + height: 0; +} +/** + * Address `[hidden]` styling not present in IE 8/9/10. + * Hide the `template` element in IE 8/9/10/11, Safari, and Firefox < 22. + */ +[hidden], +template { + display: none; +} +/* Links + ========================================================================== */ +/** + * Remove the gray background color from active links in IE 10. + */ +a { + background-color: transparent; +} +/** + * Improve readability of focused elements when they are also in an + * active/hover state. + */ +a:active, +a:hover { + outline: 0; +} +/* Text-level semantics + ========================================================================== */ +/** + * Address styling not present in IE 8/9/10/11, Safari, and Chrome. + */ +abbr[title] { + border-bottom: 1px dotted; +} +/** + * Address style set to `bolder` in Firefox 4+, Safari, and Chrome. + */ +b, +strong { + font-weight: bold; +} +/** + * Address styling not present in Safari and Chrome. + */ +dfn { + font-style: italic; +} +/** + * Address variable `h1` font-size and margin within `section` and `article` + * contexts in Firefox 4+, Safari, and Chrome. + */ +h1 { + font-size: 2em; + margin: 0.67em 0; +} +/** + * Address styling not present in IE 8/9. + */ +mark { + background: #ff0; + color: #000; +} +/** + * Address inconsistent and variable font size in all browsers. + */ +small { + font-size: 80%; +} +/** + * Prevent `sub` and `sup` affecting `line-height` in all browsers. + */ +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} +sup { + top: -0.5em; +} +sub { + bottom: -0.25em; +} +/* Embedded content + ========================================================================== */ +/** + * Remove border when inside `a` element in IE 8/9/10. + */ +img { + border: 0; +} +/** + * Correct overflow not hidden in IE 9/10/11. + */ +svg:not(:root) { + overflow: hidden; +} +/* Grouping content + ========================================================================== */ +/** + * Address margin not present in IE 8/9 and Safari. + */ +figure { + margin: 1em 40px; +} +/** + * Address differences between Firefox and other browsers. + */ +hr { + box-sizing: content-box; + height: 0; +} +/** + * Contain overflow in all browsers. + */ +pre { + overflow: auto; +} +/** + * Address odd `em`-unit font size rendering in all browsers. + */ +code, +kbd, +pre, +samp { + font-family: monospace, monospace; + font-size: 1em; +} +/* Forms + ========================================================================== */ +/** + * Known limitation: by default, Chrome and Safari on OS X allow very limited + * styling of `select`, unless a `border` property is set. + */ +/** + * 1. Correct color not being inherited. + * Known issue: affects color of disabled elements. + * 2. Correct font properties not being inherited. + * 3. Address margins set differently in Firefox 4+, Safari, and Chrome. + */ +button, +input, +optgroup, +select, +textarea { + color: inherit; + /* 1 */ + font: inherit; + /* 2 */ + margin: 0; + /* 3 */ +} +/** + * Address `overflow` set to `hidden` in IE 8/9/10/11. + */ +button { + overflow: visible; +} +/** + * Address inconsistent `text-transform` inheritance for `button` and `select`. + * All other form control elements do not inherit `text-transform` values. + * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera. + * Correct `select` style inheritance in Firefox. + */ +button, +select { + text-transform: none; +} +/** + * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` + * and `video` controls. + * 2. Correct inability to style clickable `input` types in iOS. + * 3. Improve usability and consistency of cursor style between image-type + * `input` and others. + * 4. CUSTOM FOR WEBFLOW: Removed the input[type="submit"] selector to reduce + * specificity and defer to the .w-button selector + */ +button, +html input[type="button"], +input[type="reset"] { + -webkit-appearance: button; + /* 2 */ + cursor: pointer; + /* 3 */ +} +/** + * Re-set default cursor for disabled elements. + */ +button[disabled], +html input[disabled] { + cursor: default; +} +/** + * Remove inner padding and border in Firefox 4+. + */ +button::-moz-focus-inner, +input::-moz-focus-inner { + border: 0; + padding: 0; +} +/** + * Address Firefox 4+ setting `line-height` on `input` using `!important` in + * the UA stylesheet. + */ +input { + line-height: normal; +} +/** + * It's recommended that you don't attempt to style these elements. + * Firefox's implementation doesn't respect box-sizing, padding, or width. + * + * 1. Address box sizing set to `content-box` in IE 8/9/10. + * 2. Remove excess padding in IE 8/9/10. + */ +input[type='checkbox'], +input[type='radio'] { + box-sizing: border-box; + /* 1 */ + padding: 0; + /* 2 */ +} +/** + * Fix the cursor style for Chrome's increment/decrement buttons. For certain + * `font-size` values of the `input`, it causes the cursor style of the + * decrement button to change from `default` to `text`. + */ +input[type='number']::-webkit-inner-spin-button, +input[type='number']::-webkit-outer-spin-button { + height: auto; +} +/** + * 1. CUSTOM FOR WEBFLOW: changed from `textfield` to `none` to normalize iOS rounded input + * 2. CUSTOM FOR WEBFLOW: box-sizing: content-box rule removed + * (similar to normalize.css >=4.0.0) + */ +input[type='search'] { + -webkit-appearance: none; + /* 1 */ +} +/** + * Remove inner padding and search cancel button in Safari and Chrome on OS X. + * Safari (but not Chrome) clips the cancel button when the search input has + * padding (and `textfield` appearance). + */ +input[type='search']::-webkit-search-cancel-button, +input[type='search']::-webkit-search-decoration { + -webkit-appearance: none; +} +/** + * Define consistent border, margin, and padding. + */ +fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; +} +/** + * 1. Correct `color` not being inherited in IE 8/9/10/11. + * 2. Remove padding so people aren't caught out if they zero out fieldsets. + */ +legend { + border: 0; + /* 1 */ + padding: 0; + /* 2 */ +} +/** + * Remove default vertical scrollbar in IE 8/9/10/11. + */ +textarea { + overflow: auto; +} +/** + * Don't inherit the `font-weight` (applied by a rule above). + * NOTE: the default cannot safely be changed in Chrome and Safari on OS X. + */ +optgroup { + font-weight: bold; +} +/* Tables + ========================================================================== */ +/** + * Remove most spacing between table cells. + */ +table { + border-collapse: collapse; + border-spacing: 0; +} +td, +th { + padding: 0; +} diff --git a/templates/css/webflow.css b/templates/css/webflow.css new file mode 100644 index 0000000..e7c3b3a --- /dev/null +++ b/templates/css/webflow.css @@ -0,0 +1,2141 @@ +@font-face { + font-family: 'webflow-icons'; + src: url("data:application/x-font-ttf;charset=utf-8;base64,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") format('truetype'); + font-weight: normal; + font-style: normal; +} + +[class^="w-icon-"], +[class*=" w-icon-"] { + /* use !important to prevent issues with browser extensions that change fonts */ + font-family: 'webflow-icons' !important; + speak: none; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + /* Better Font Rendering =========== */ + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.w-icon-slider-right:before { + content: "\e600"; +} + +.w-icon-slider-left:before { + content: "\e601"; +} + +.w-icon-nav-menu:before { + content: "\e602"; +} + +.w-icon-arrow-down:before, +.w-icon-dropdown-toggle:before { + content: "\e603"; +} + +.w-icon-file-upload-remove:before { + content: "\e900"; +} + +.w-icon-file-upload-icon:before { + content: "\e903"; +} + +* { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +html { + height: 100%; +} + +body { + margin: 0; + min-height: 100%; + background-color: #fff; + font-family: Arial, sans-serif; + font-size: 14px; + color: #333; +} + +img { + max-width: 100%; + vertical-align: middle; + display: inline-block; +} + +html.w-mod-touch * { + background-attachment: scroll !important; +} + +.w-block { + display: block; +} + +.w-inline-block { + max-width: 100%; + display: inline-block; +} + +.w-clearfix:before, +.w-clearfix:after { + content: " "; + display: table; + grid-column-start: 1; + grid-row-start: 1; + grid-column-end: 2; + grid-row-end: 2; +} + +.w-clearfix:after { + clear: both; +} + +.w-hidden { + display: none; +} + +.w-button { + display: inline-block; + padding: 9px 15px; + background-color: #3898EC; + color: white; + border: 0; + line-height: inherit; + text-decoration: none; + cursor: pointer; + border-radius: 0; +} + +input.w-button { + -webkit-appearance: button; +} + +html[data-w-dynpage] [data-w-cloak] { + color: transparent !important; +} + +.w-code-block { + margin: unset; +} + +pre.w-code-block code { + all: inherit; +} + +.w-webflow-badge, +.w-webflow-badge * { + position: static; + left: auto; + top: auto; + right: auto; + bottom: auto; + z-index: auto; + display: block; + visibility: visible; + overflow: visible; + overflow-x: visible; + overflow-y: visible; + box-sizing: border-box; + width: auto; + height: auto; + max-height: none; + max-width: none; + min-height: 0; + min-width: 0; + margin: 0; + padding: 0; + float: none; + clear: none; + border: 0 none transparent; + border-radius: 0; + background: none; + background-image: none; + background-position: 0% 0%; + background-size: auto auto; + background-repeat: repeat; + background-origin: padding-box; + background-clip: border-box; + background-attachment: scroll; + background-color: transparent; + box-shadow: none; + opacity: 1; + transform: none; + transition: none; + direction: ltr; + font-family: inherit; + font-weight: inherit; + color: inherit; + font-size: inherit; + line-height: inherit; + font-style: inherit; + font-variant: inherit; + text-align: inherit; + letter-spacing: inherit; + text-decoration: inherit; + text-indent: 0; + text-transform: inherit; + list-style-type: disc; + text-shadow: none; + font-smoothing: auto; + vertical-align: baseline; + cursor: inherit; + white-space: inherit; + word-break: normal; + word-spacing: normal; + word-wrap: normal; +} + +.w-webflow-badge { + position: fixed !important; + display: inline-block !important; + visibility: visible !important; + z-index: 2147483647 !important; + top: auto !important; + right: 12px !important; + bottom: 12px !important; + left: auto !important; + color: #aaadb0 !important; + background-color: #fff !important; + border-radius: 3px !important; + padding: 6px !important; + font-size: 12px !important; + opacity: 1 !important; + line-height: 14px !important; + text-decoration: none !important; + transform: none !important; + margin: 0 !important; + width: auto !important; + height: auto !important; + overflow: visible !important; + white-space: nowrap; + box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.1), 0px 1px 3px rgba(0, 0, 0, 0.1); + cursor: pointer; +} + +.w-webflow-badge>img { + display: inline-block !important; + visibility: visible !important; + opacity: 1 !important; + vertical-align: middle !important; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + font-weight: bold; + margin-bottom: 10px; +} + +h1 { + font-size: 38px; + margin-top: 20px; +} + +h2 { + font-size: 32px; + margin-top: 20px; +} + +h3 { + font-size: 24px; + margin-top: 20px; +} + +h4 { + font-size: 18px; + margin-top: 10px; +} + +h5 { + font-size: 14px; + margin-top: 10px; +} + +h6 { + font-size: 12px; + margin-top: 10px; +} + +p { + margin-top: 0; + margin-bottom: 10px; +} + +blockquote { + margin: 0 0 10px 0; + padding: 10px 20px; + border-left: 5px solid #E2E2E2; + font-size: 18px; +} + +figure { + margin: 0; + margin-bottom: 10px; +} + +figcaption { + margin-top: 5px; + text-align: center; +} + +ul, +ol { + margin-top: 0px; + margin-bottom: 10px; + padding-left: 40px; +} + +.w-list-unstyled { + padding-left: 0; + list-style: none; +} + +.w-embed:before, +.w-embed:after { + content: " "; + display: table; + grid-column-start: 1; + grid-row-start: 1; + grid-column-end: 2; + grid-row-end: 2; +} + +.w-embed:after { + clear: both; +} + +.w-video { + width: 100%; + position: relative; + padding: 0; +} + +.w-video iframe, +.w-video object, +.w-video embed { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + border: none; +} + +fieldset { + padding: 0; + margin: 0; + border: 0; +} + +button, +[type='button'], +[type='reset'] { + border: 0; + cursor: pointer; + -webkit-appearance: button; +} + +.w-form { + margin: 0 0 15px; +} + +.w-form-done { + display: none; + padding: 20px; + text-align: center; + background-color: #dddddd; +} + +.w-form-fail { + display: none; + margin-top: 10px; + padding: 10px; + background-color: #ffdede; +} + +label { + display: block; + margin-bottom: 5px; + font-weight: bold; +} + +.w-input, +.w-select { + display: block; + width: 100%; + height: 38px; + padding: 8px 12px; + margin-bottom: 10px; + font-size: 14px; + line-height: 1.42857143; + color: #333333; + vertical-align: middle; + background-color: #ffffff; + border: 1px solid #cccccc; +} + +.w-input:-moz-placeholder, +.w-select:-moz-placeholder { + color: #999; +} + +.w-input::-moz-placeholder, +.w-select::-moz-placeholder { + color: #999; + opacity: 1; +} + +.w-input::-webkit-input-placeholder, +.w-select::-webkit-input-placeholder { + color: #999; +} + +.w-input:focus, +.w-select:focus { + border-color: #3898EC; + outline: 0; +} + +.w-input[disabled], +.w-select[disabled], +.w-input[readonly], +.w-select[readonly], +fieldset[disabled] .w-input, +fieldset[disabled] .w-select { + cursor: not-allowed; +} + +.w-input[disabled]:not(.w-input-disabled), +.w-select[disabled]:not(.w-input-disabled), +.w-input[readonly], +.w-select[readonly], +fieldset[disabled]:not(.w-input-disabled) .w-input, +fieldset[disabled]:not(.w-input-disabled) .w-select { + background-color: #eeeeee; +} + +textarea.w-input, +textarea.w-select { + height: auto; +} + +.w-select { + background-color: #f3f3f3; +} + +.w-select[multiple] { + height: auto; +} + +.w-form-label { + display: inline-block; + cursor: pointer; + font-weight: normal; + margin-bottom: 0px; +} + +.w-radio { + display: block; + margin-bottom: 5px; + padding-left: 20px; +} + +.w-radio:before, +.w-radio:after { + content: " "; + display: table; + grid-column-start: 1; + grid-row-start: 1; + grid-column-end: 2; + grid-row-end: 2; +} + +.w-radio:after { + clear: both; +} + +.w-radio-input { + margin: 4px 0 0; + line-height: normal; + float: left; + margin-left: -20px; +} + +.w-radio-input { + margin-top: 3px; +} + +.w-file-upload { + display: block; + margin-bottom: 10px; +} + +.w-file-upload-input { + width: 0.1px; + height: 0.1px; + opacity: 0; + overflow: hidden; + position: absolute; + z-index: -100; +} + +.w-file-upload-default, +.w-file-upload-uploading, +.w-file-upload-success { + display: inline-block; + color: #333333; +} + +.w-file-upload-error { + display: block; + margin-top: 10px; +} + +.w-file-upload-default.w-hidden, +.w-file-upload-uploading.w-hidden, +.w-file-upload-error.w-hidden, +.w-file-upload-success.w-hidden { + display: none; +} + +.w-file-upload-uploading-btn { + display: flex; + font-size: 14px; + font-weight: normal; + cursor: pointer; + margin: 0; + padding: 8px 12px; + border: 1px solid #cccccc; + background-color: #fafafa; +} + +.w-file-upload-file { + display: flex; + flex-grow: 1; + justify-content: space-between; + margin: 0; + padding: 8px 9px 8px 11px; + border: 1px solid #cccccc; + background-color: #fafafa; +} + +.w-file-upload-file-name { + font-size: 14px; + font-weight: normal; + display: block; +} + +.w-file-remove-link { + margin-top: 3px; + margin-left: 10px; + width: auto; + height: auto; + padding: 3px; + display: block; + cursor: pointer; +} + +.w-icon-file-upload-remove { + margin: auto; + font-size: 10px; +} + +.w-file-upload-error-msg { + display: inline-block; + color: #ea384c; + padding: 2px 0; +} + +.w-file-upload-info { + display: inline-block; + line-height: 38px; + padding: 0 12px; +} + +.w-file-upload-label { + display: inline-block; + font-size: 14px; + font-weight: normal; + cursor: pointer; + margin: 0; + padding: 8px 12px; + border: 1px solid #cccccc; + background-color: #fafafa; +} + +.w-icon-file-upload-icon, +.w-icon-file-upload-uploading { + display: inline-block; + margin-right: 8px; + width: 20px; +} + +.w-icon-file-upload-uploading { + height: 20px; +} + +.w-container { + margin-left: auto; + margin-right: auto; + max-width: 940px; +} + +.w-container:before, +.w-container:after { + content: " "; + display: table; + grid-column-start: 1; + grid-row-start: 1; + grid-column-end: 2; + grid-row-end: 2; +} + +.w-container:after { + clear: both; +} + +.w-container .w-row { + margin-left: -10px; + margin-right: -10px; +} + +.w-row:before, +.w-row:after { + content: " "; + display: table; + grid-column-start: 1; + grid-row-start: 1; + grid-column-end: 2; + grid-row-end: 2; +} + +.w-row:after { + clear: both; +} + +.w-row .w-row { + margin-left: 0; + margin-right: 0; +} + +.w-col { + position: relative; + float: left; + width: 100%; + min-height: 1px; + padding-left: 10px; + padding-right: 10px; +} + +.w-col .w-col { + padding-left: 0; + padding-right: 0; +} + +.w-col-1 { + width: 8.33333333%; +} + +.w-col-2 { + width: 16.66666667%; +} + +.w-col-3 { + width: 25%; +} + +.w-col-4 { + width: 33.33333333%; +} + +.w-col-5 { + width: 41.66666667%; +} + +.w-col-6 { + width: 50%; +} + +.w-col-7 { + width: 58.33333333%; +} + +.w-col-8 { + width: 66.66666667%; +} + +.w-col-9 { + width: 75%; +} + +.w-col-10 { + width: 83.33333333%; +} + +.w-col-11 { + width: 91.66666667%; +} + +.w-col-12 { + width: 100%; +} + +.w-hidden-main { + display: none !important; +} + +@media screen and (max-width: 991px) { + .w-container { + max-width: 728px; + } + + .w-hidden-main { + display: inherit !important; + } + + .w-hidden-medium { + display: none !important; + } + + .w-col-medium-1 { + width: 8.33333333%; + } + + .w-col-medium-2 { + width: 16.66666667%; + } + + .w-col-medium-3 { + width: 25%; + } + + .w-col-medium-4 { + width: 33.33333333%; + } + + .w-col-medium-5 { + width: 41.66666667%; + } + + .w-col-medium-6 { + width: 50%; + } + + .w-col-medium-7 { + width: 58.33333333%; + } + + .w-col-medium-8 { + width: 66.66666667%; + } + + .w-col-medium-9 { + width: 75%; + } + + .w-col-medium-10 { + width: 83.33333333%; + } + + .w-col-medium-11 { + width: 91.66666667%; + } + + .w-col-medium-12 { + width: 100%; + } + + .w-col-stack { + width: 100%; + left: auto; + right: auto; + } +} + +@media screen and (max-width: 767px) { + .w-hidden-main { + display: inherit !important; + } + + .w-hidden-medium { + display: inherit !important; + } + + .w-hidden-small { + display: none !important; + } + + .w-row, + .w-container .w-row { + margin-left: 0; + margin-right: 0; + } + + .w-col { + width: 100%; + left: auto; + right: auto; + } + + .w-col-small-1 { + width: 8.33333333%; + } + + .w-col-small-2 { + width: 16.66666667%; + } + + .w-col-small-3 { + width: 25%; + } + + .w-col-small-4 { + width: 33.33333333%; + } + + .w-col-small-5 { + width: 41.66666667%; + } + + .w-col-small-6 { + width: 50%; + } + + .w-col-small-7 { + width: 58.33333333%; + } + + .w-col-small-8 { + width: 66.66666667%; + } + + .w-col-small-9 { + width: 75%; + } + + .w-col-small-10 { + width: 83.33333333%; + } + + .w-col-small-11 { + width: 91.66666667%; + } + + .w-col-small-12 { + width: 100%; + } +} + +@media screen and (max-width: 479px) { + .w-container { + max-width: none; + } + + .w-hidden-main { + display: inherit !important; + } + + .w-hidden-medium { + display: inherit !important; + } + + .w-hidden-small { + display: inherit !important; + } + + .w-hidden-tiny { + display: none !important; + } + + .w-col { + width: 100%; + } + + .w-col-tiny-1 { + width: 8.33333333%; + } + + .w-col-tiny-2 { + width: 16.66666667%; + } + + .w-col-tiny-3 { + width: 25%; + } + + .w-col-tiny-4 { + width: 33.33333333%; + } + + .w-col-tiny-5 { + width: 41.66666667%; + } + + .w-col-tiny-6 { + width: 50%; + } + + .w-col-tiny-7 { + width: 58.33333333%; + } + + .w-col-tiny-8 { + width: 66.66666667%; + } + + .w-col-tiny-9 { + width: 75%; + } + + .w-col-tiny-10 { + width: 83.33333333%; + } + + .w-col-tiny-11 { + width: 91.66666667%; + } + + .w-col-tiny-12 { + width: 100%; + } +} + +.w-widget { + position: relative; +} + +.w-widget-map { + width: 100%; + height: 400px; +} + +.w-widget-map label { + width: auto; + display: inline; +} + +.w-widget-map img { + max-width: inherit; +} + +.w-widget-map .gm-style-iw { + text-align: center; +} + +.w-widget-map .gm-style-iw>button { + display: none !important; +} + +.w-widget-twitter { + overflow: hidden; +} + +.w-widget-twitter-count-shim { + display: inline-block; + vertical-align: top; + position: relative; + width: 28px; + height: 20px; + text-align: center; + background: white; + border: #758696 solid 1px; + border-radius: 3px; +} + +.w-widget-twitter-count-shim * { + pointer-events: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.w-widget-twitter-count-shim .w-widget-twitter-count-inner { + position: relative; + font-size: 15px; + line-height: 12px; + text-align: center; + color: #999; + font-family: serif; +} + +.w-widget-twitter-count-shim .w-widget-twitter-count-clear { + position: relative; + display: block; +} + +.w-widget-twitter-count-shim.w--large { + width: 36px; + height: 28px; +} + +.w-widget-twitter-count-shim.w--large .w-widget-twitter-count-inner { + font-size: 18px; + line-height: 18px; +} + +.w-widget-twitter-count-shim:not(.w--vertical) { + margin-left: 5px; + margin-right: 8px; +} + +.w-widget-twitter-count-shim:not(.w--vertical).w--large { + margin-left: 6px; +} + +.w-widget-twitter-count-shim:not(.w--vertical):before, +.w-widget-twitter-count-shim:not(.w--vertical):after { + top: 50%; + left: 0; + border: solid transparent; + content: ' '; + height: 0; + width: 0; + position: absolute; + pointer-events: none; +} + +.w-widget-twitter-count-shim:not(.w--vertical):before { + border-color: rgba(117, 134, 150, 0); + border-right-color: #5d6c7b; + border-width: 4px; + margin-left: -9px; + margin-top: -4px; +} + +.w-widget-twitter-count-shim:not(.w--vertical).w--large:before { + border-width: 5px; + margin-left: -10px; + margin-top: -5px; +} + +.w-widget-twitter-count-shim:not(.w--vertical):after { + border-color: rgba(255, 255, 255, 0); + border-right-color: white; + border-width: 4px; + margin-left: -8px; + margin-top: -4px; +} + +.w-widget-twitter-count-shim:not(.w--vertical).w--large:after { + border-width: 5px; + margin-left: -9px; + margin-top: -5px; +} + +.w-widget-twitter-count-shim.w--vertical { + width: 61px; + height: 33px; + margin-bottom: 8px; +} + +.w-widget-twitter-count-shim.w--vertical:before, +.w-widget-twitter-count-shim.w--vertical:after { + top: 100%; + left: 50%; + border: solid transparent; + content: ' '; + height: 0; + width: 0; + position: absolute; + pointer-events: none; +} + +.w-widget-twitter-count-shim.w--vertical:before { + border-color: rgba(117, 134, 150, 0); + border-top-color: #5d6c7b; + border-width: 5px; + margin-left: -5px; +} + +.w-widget-twitter-count-shim.w--vertical:after { + border-color: rgba(255, 255, 255, 0); + border-top-color: white; + border-width: 4px; + margin-left: -4px; +} + +.w-widget-twitter-count-shim.w--vertical .w-widget-twitter-count-inner { + font-size: 18px; + line-height: 22px; +} + +.w-widget-twitter-count-shim.w--vertical.w--large { + width: 76px; +} + +.w-background-video { + position: relative; + overflow: hidden; + height: 500px; + color: white; +} + +.w-background-video>video { + background-size: cover; + background-position: 50% 50%; + position: absolute; + margin: auto; + width: 100%; + height: 100%; + right: -100%; + bottom: -100%; + top: -100%; + left: -100%; + object-fit: cover; + z-index: -100; +} + +.w-background-video>video::-webkit-media-controls-start-playback-button { + display: none !important; + -webkit-appearance: none; +} + +.w-background-video--control { + position: absolute; + bottom: 1em; + right: 1em; + background-color: transparent; + padding: 0; +} + +.w-background-video--control>[hidden] { + display: none !important; +} + +.w-slider { + position: relative; + height: 300px; + text-align: center; + background: #dddddd; + clear: both; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); + tap-highlight-color: rgba(0, 0, 0, 0); +} + +.w-slider-mask { + position: relative; + display: block; + overflow: hidden; + z-index: 1; + left: 0; + right: 0; + height: 100%; + white-space: nowrap; +} + +.w-slide { + position: relative; + display: inline-block; + vertical-align: top; + width: 100%; + height: 100%; + white-space: normal; + text-align: left; +} + +.w-slider-nav { + position: absolute; + z-index: 2; + top: auto; + right: 0; + bottom: 0; + left: 0; + margin: auto; + padding-top: 10px; + height: 40px; + text-align: center; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); + tap-highlight-color: rgba(0, 0, 0, 0); +} + +.w-slider-nav.w-round>div { + border-radius: 100%; +} + +.w-slider-nav.w-num>div { + width: auto; + height: auto; + padding: 0.2em 0.5em; + font-size: inherit; + line-height: inherit; +} + +.w-slider-nav.w-shadow>div { + box-shadow: 0 0 3px rgba(51, 51, 51, 0.4); +} + +.w-slider-nav-invert { + color: #fff; +} + +.w-slider-nav-invert>div { + background-color: rgba(34, 34, 34, 0.4); +} + +.w-slider-nav-invert>div.w-active { + background-color: #222; +} + +.w-slider-dot { + position: relative; + display: inline-block; + width: 1em; + height: 1em; + background-color: rgba(255, 255, 255, 0.4); + cursor: pointer; + margin: 0 3px 0.5em; + transition: background-color 100ms, color 100ms; +} + +.w-slider-dot.w-active { + background-color: #fff; +} + +.w-slider-dot:focus { + outline: none; + box-shadow: 0px 0px 0px 2px #fff; +} + +.w-slider-dot:focus.w-active { + box-shadow: none; +} + +.w-slider-arrow-left, +.w-slider-arrow-right { + position: absolute; + width: 80px; + top: 0; + right: 0; + bottom: 0; + left: 0; + margin: auto; + cursor: pointer; + overflow: hidden; + color: white; + font-size: 40px; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); + tap-highlight-color: rgba(0, 0, 0, 0); + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.w-slider-arrow-left [class^='w-icon-'], +.w-slider-arrow-right [class^='w-icon-'], +.w-slider-arrow-left [class*=' w-icon-'], +.w-slider-arrow-right [class*=' w-icon-'] { + position: absolute; +} + +.w-slider-arrow-left:focus, +.w-slider-arrow-right:focus { + outline: 0; +} + +.w-slider-arrow-left { + z-index: 3; + right: auto; +} + +.w-slider-arrow-right { + z-index: 4; + left: auto; +} + +.w-icon-slider-left, +.w-icon-slider-right { + top: 0; + right: 0; + bottom: 0; + left: 0; + margin: auto; + width: 1em; + height: 1em; +} + +.w-slider-aria-label { + border: 0; + clip: rect(0 0 0 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; +} + +.w-slider-force-show { + display: block !important; +} + +.w-dropdown { + display: inline-block; + position: relative; + text-align: left; + margin-left: auto; + margin-right: auto; + z-index: 900; +} + +.w-dropdown-btn, +.w-dropdown-toggle, +.w-dropdown-link { + position: relative; + vertical-align: top; + text-decoration: none; + color: #222222; + padding: 20px; + text-align: left; + margin-left: auto; + margin-right: auto; + white-space: nowrap; +} + +.w-dropdown-toggle { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + display: inline-block; + cursor: pointer; + padding-right: 40px; +} + +.w-dropdown-toggle:focus { + outline: 0; +} + +.w-icon-dropdown-toggle { + position: absolute; + top: 0; + right: 0; + bottom: 0; + margin: auto; + margin-right: 20px; + width: 1em; + height: 1em; +} + +.w-dropdown-list { + position: absolute; + background: #dddddd; + display: none; + min-width: 100%; +} + +.w-dropdown-list.w--open { + display: block; +} + +.w-dropdown-link { + padding: 10px 20px; + display: block; + color: #222222; +} + +.w-dropdown-link.w--current { + color: #0082f3; +} + +.w-dropdown-link:focus { + outline: 0; +} + +@media screen and (max-width: 767px) { + .w-nav-brand { + padding-left: 10px; + } +} + +/** + * ## Note + * Safari (on both iOS and OS X) does not handle viewport units (vh, vw) well. + * For example percentage units do not work on descendants of elements that + * have any dimensions expressed in viewport units. It also doesn’t handle them at + * all in `calc()`. + */ +/** + * Wrapper around all lightbox elements + * + * 1. Since the lightbox can receive focus, IE also gives it an outline. + * 2. Fixes flickering on Chrome when a transition is in progress + * underneath the lightbox. + */ +.w-lightbox-backdrop { + cursor: auto; + font-style: normal; + letter-spacing: normal; + list-style: disc; + text-indent: 0; + text-shadow: none; + text-transform: none; + visibility: visible; + white-space: normal; + word-break: normal; + word-spacing: normal; + word-wrap: normal; + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + color: #fff; + font-family: "Helvetica Neue", Helvetica, Ubuntu, "Segoe UI", Verdana, sans-serif; + font-size: 17px; + line-height: 1.2; + font-weight: 300; + text-align: center; + background: rgba(0, 0, 0, 0.9); + z-index: 2000; + outline: 0; + /* 1 */ + opacity: 0; + -webkit-user-select: none; + -moz-user-select: none; + -webkit-tap-highlight-color: transparent; + -webkit-transform: translate(0, 0); + /* 2 */ +} + +/** + * Neat trick to bind the rubberband effect to our canvas instead of the whole + * document on iOS. It also prevents a bug that causes the document underneath to scroll. + */ +.w-lightbox-backdrop, +.w-lightbox-container { + height: 100%; + overflow: auto; + -webkit-overflow-scrolling: touch; +} + +.w-lightbox-content { + position: relative; + height: 100vh; + overflow: hidden; +} + +.w-lightbox-view { + position: absolute; + width: 100vw; + height: 100vh; + opacity: 0; +} + +.w-lightbox-view:before { + content: ""; + height: 100vh; +} + +/* .w-lightbox-content */ +.w-lightbox-group, +.w-lightbox-group .w-lightbox-view, +.w-lightbox-group .w-lightbox-view:before { + height: 86vh; +} + +.w-lightbox-frame, +.w-lightbox-view:before { + display: inline-block; + vertical-align: middle; +} + +/* + * 1. Remove default margin set by user-agent on the
element. + */ +.w-lightbox-figure { + position: relative; + margin: 0; + /* 1 */ +} + +.w-lightbox-group .w-lightbox-figure { + cursor: pointer; +} + +/** + * IE adds image dimensions as width and height attributes on the IMG tag, + * but we need both width and height to be set to auto to enable scaling. + */ +.w-lightbox-img { + width: auto; + height: auto; + max-width: none; +} + +/** + * 1. Reset if style is set by user on "All Images" + */ +.w-lightbox-image { + display: block; + float: none; + /* 1 */ + max-width: 100vw; + max-height: 100vh; +} + +.w-lightbox-group .w-lightbox-image { + max-height: 86vh; +} + +.w-lightbox-caption { + position: absolute; + right: 0; + bottom: 0; + left: 0; + padding: 0.5em 1em; + background: rgba(0, 0, 0, 0.4); + text-align: left; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} + +.w-lightbox-embed { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + width: 100%; + height: 100%; +} + +.w-lightbox-control { + position: absolute; + top: 0; + width: 4em; + background-size: 24px; + background-repeat: no-repeat; + background-position: center; + cursor: pointer; + -webkit-transition: all 0.3s; + transition: all 0.3s; +} + +.w-lightbox-left { + display: none; + bottom: 0; + left: 0; + /* */ + background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9Ii0yMCAwIDI0IDQwIiB3aWR0aD0iMjQiIGhlaWdodD0iNDAiPjxnIHRyYW5zZm9ybT0icm90YXRlKDQ1KSI+PHBhdGggZD0ibTAgMGg1djIzaDIzdjVoLTI4eiIgb3BhY2l0eT0iLjQiLz48cGF0aCBkPSJtMSAxaDN2MjNoMjN2M2gtMjZ6IiBmaWxsPSIjZmZmIi8+PC9nPjwvc3ZnPg=="); +} + +.w-lightbox-right { + display: none; + right: 0; + bottom: 0; + /* */ + background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9Ii00IDAgMjQgNDAiIHdpZHRoPSIyNCIgaGVpZ2h0PSI0MCI+PGcgdHJhbnNmb3JtPSJyb3RhdGUoNDUpIj48cGF0aCBkPSJtMC0waDI4djI4aC01di0yM2gtMjN6IiBvcGFjaXR5PSIuNCIvPjxwYXRoIGQ9Im0xIDFoMjZ2MjZoLTN2LTIzaC0yM3oiIGZpbGw9IiNmZmYiLz48L2c+PC9zdmc+"); +} + +/* + * Without specifying the with and height inside the SVG, all versions of IE render the icon too small. + * The bug does not seem to manifest itself if the elements are tall enough such as the above arrows. + * (http://stackoverflow.com/questions/16092114/background-size-differs-in-internet-explorer) + */ +.w-lightbox-close { + right: 0; + height: 2.6em; + /* */ + background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9Ii00IDAgMTggMTciIHdpZHRoPSIxOCIgaGVpZ2h0PSIxNyI+PGcgdHJhbnNmb3JtPSJyb3RhdGUoNDUpIj48cGF0aCBkPSJtMCAwaDd2LTdoNXY3aDd2NWgtN3Y3aC01di03aC03eiIgb3BhY2l0eT0iLjQiLz48cGF0aCBkPSJtMSAxaDd2LTdoM3Y3aDd2M2gtN3Y3aC0zdi03aC03eiIgZmlsbD0iI2ZmZiIvPjwvZz48L3N2Zz4="); + background-size: 18px; +} + +/** + * 1. All IE versions add extra space at the bottom without this. + */ +.w-lightbox-strip { + position: absolute; + bottom: 0; + left: 0; + right: 0; + padding: 0 1vh; + line-height: 0; + /* 1 */ + white-space: nowrap; + overflow-x: auto; + overflow-y: hidden; +} + +/* + * 1. We use content-box to avoid having to do `width: calc(10vh + 2vw)` + * which doesn’t work in Safari anyway. + * 2. Chrome renders images pixelated when switching to GPU. Making sure + * the parent is also rendered on the GPU (by setting translate3d for + * example) fixes this behavior. + */ +.w-lightbox-item { + display: inline-block; + width: 10vh; + padding: 2vh 1vh; + box-sizing: content-box; + /* 1 */ + cursor: pointer; + -webkit-transform: translate3d(0, 0, 0); + /* 2 */ +} + +.w-lightbox-active { + opacity: 0.3; +} + +.w-lightbox-thumbnail { + position: relative; + height: 10vh; + background: #222; + overflow: hidden; +} + +.w-lightbox-thumbnail-image { + position: absolute; + top: 0; + left: 0; +} + +.w-lightbox-thumbnail .w-lightbox-tall { + top: 50%; + width: 100%; + -webkit-transform: translate(0, -50%); + transform: translate(0, -50%); +} + +.w-lightbox-thumbnail .w-lightbox-wide { + left: 50%; + height: 100%; + -webkit-transform: translate(-50%, 0); + transform: translate(-50%, 0); +} + +/* + * Spinner + * + * Absolute pixel values are used to avoid rounding errors that would cause + * the white spinning element to be misaligned with the track. + */ +.w-lightbox-spinner { + position: absolute; + top: 50%; + left: 50%; + box-sizing: border-box; + width: 40px; + height: 40px; + margin-top: -20px; + margin-left: -20px; + border: 5px solid rgba(0, 0, 0, 0.4); + border-radius: 50%; + -webkit-animation: spin 0.8s infinite linear; + animation: spin 0.8s infinite linear; +} + +.w-lightbox-spinner:after { + content: ""; + position: absolute; + top: -4px; + right: -4px; + bottom: -4px; + left: -4px; + border: 3px solid transparent; + border-bottom-color: #fff; + border-radius: 50%; +} + +/* + * Utility classes + */ +.w-lightbox-hide { + display: none; +} + +.w-lightbox-noscroll { + overflow: hidden; +} + +@media (min-width: 768px) { + .w-lightbox-content { + height: 96vh; + margin-top: 2vh; + } + + .w-lightbox-view, + .w-lightbox-view:before { + height: 96vh; + } + + /* .w-lightbox-content */ + .w-lightbox-group, + .w-lightbox-group .w-lightbox-view, + .w-lightbox-group .w-lightbox-view:before { + height: 84vh; + } + + .w-lightbox-image { + max-width: 96vw; + max-height: 96vh; + } + + .w-lightbox-group .w-lightbox-image { + max-width: 82.3vw; + max-height: 84vh; + } + + .w-lightbox-left, + .w-lightbox-right { + display: block; + opacity: 0.5; + } + + .w-lightbox-close { + opacity: 0.8; + } + + .w-lightbox-control:hover { + opacity: 1; + } +} + +.w-lightbox-inactive, +.w-lightbox-inactive:hover { + opacity: 0; +} + +.w-richtext:before, +.w-richtext:after { + content: " "; + display: table; + grid-column-start: 1; + grid-row-start: 1; + grid-column-end: 2; + grid-row-end: 2; +} + +.w-richtext:after { + clear: both; +} + +.w-richtext[contenteditable="true"]:before, +.w-richtext[contenteditable="true"]:after { + white-space: initial; +} + +.w-richtext ol, +.w-richtext ul { + overflow: hidden; +} + +.w-richtext .w-richtext-figure-selected.w-richtext-figure-type-video div:after, +.w-richtext .w-richtext-figure-selected[data-rt-type="video"] div:after { + outline: 2px solid #2895f7; +} + +.w-richtext .w-richtext-figure-selected.w-richtext-figure-type-image div, +.w-richtext .w-richtext-figure-selected[data-rt-type="image"] div { + outline: 2px solid #2895f7; +} + +.w-richtext figure.w-richtext-figure-type-video>div:after, +.w-richtext figure[data-rt-type="video"]>div:after { + content: ''; + position: absolute; + display: none; + left: 0; + top: 0; + right: 0; + bottom: 0; +} + +.w-richtext figure { + position: relative; + max-width: 60%; +} + +.w-richtext figure>div:before { + cursor: default !important; +} + +.w-richtext figure img { + width: 100%; +} + +.w-richtext figure figcaption.w-richtext-figcaption-placeholder { + opacity: 0.6; +} + +.w-richtext figure div { + /* fix incorrectly sized selection border in the data manager */ + font-size: 0px; + color: transparent; +} + +.w-richtext figure.w-richtext-figure-type-image, +.w-richtext figure[data-rt-type="image"] { + display: table; +} + +.w-richtext figure.w-richtext-figure-type-image>div, +.w-richtext figure[data-rt-type="image"]>div { + display: inline-block; +} + +.w-richtext figure.w-richtext-figure-type-image>figcaption, +.w-richtext figure[data-rt-type="image"]>figcaption { + display: table-caption; + caption-side: bottom; +} + +.w-richtext figure.w-richtext-figure-type-video, +.w-richtext figure[data-rt-type="video"] { + width: 60%; + height: 0; +} + +.w-richtext figure.w-richtext-figure-type-video iframe, +.w-richtext figure[data-rt-type="video"] iframe { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +} + +.w-richtext figure.w-richtext-figure-type-video>div, +.w-richtext figure[data-rt-type="video"]>div { + width: 100%; +} + +.w-richtext figure.w-richtext-align-center { + margin-right: auto; + margin-left: auto; + clear: both; +} + +.w-richtext figure.w-richtext-align-center.w-richtext-figure-type-image>div, +.w-richtext figure.w-richtext-align-center[data-rt-type="image"]>div { + max-width: 100%; +} + +.w-richtext figure.w-richtext-align-normal { + clear: both; +} + +.w-richtext figure.w-richtext-align-fullwidth { + width: 100%; + max-width: 100%; + text-align: center; + clear: both; + display: block; + margin-right: auto; + margin-left: auto; +} + +.w-richtext figure.w-richtext-align-fullwidth>div { + display: inline-block; + /* padding-bottom is used for aspect ratios in video figures + we want the div to inherit that so hover/selection borders in the designer-canvas + fit right*/ + padding-bottom: inherit; +} + +.w-richtext figure.w-richtext-align-fullwidth>figcaption { + display: block; +} + +.w-richtext figure.w-richtext-align-floatleft { + float: left; + margin-right: 15px; + clear: none; +} + +.w-richtext figure.w-richtext-align-floatright { + float: right; + margin-left: 15px; + clear: none; +} + +.w-nav { + position: relative; + background: #dddddd; + z-index: 1000; +} + +.w-nav:before, +.w-nav:after { + content: " "; + display: table; + grid-column-start: 1; + grid-row-start: 1; + grid-column-end: 2; + grid-row-end: 2; +} + +.w-nav:after { + clear: both; +} + +.w-nav-brand { + position: relative; + float: left; + text-decoration: none; + color: #333333; +} + +.w-nav-link { + position: relative; + display: inline-block; + vertical-align: top; + text-decoration: none; + color: #222222; + padding: 20px; + text-align: left; + margin-left: auto; + margin-right: auto; +} + +.w-nav-link.w--current { + color: #0082f3; +} + +.w-nav-menu { + position: relative; + float: right; +} + +[data-nav-menu-open] { + display: block !important; + position: absolute; + top: 100%; + left: 0; + right: 0; + background: #C8C8C8; + text-align: center; + overflow: visible; + min-width: 200px; +} + +.w--nav-link-open { + display: block; + position: relative; +} + +.w-nav-overlay { + position: absolute; + overflow: hidden; + display: none; + top: 100%; + left: 0; + right: 0; + width: 100%; +} + +.w-nav-overlay [data-nav-menu-open] { + top: 0; +} + +.w-nav[data-animation="over-left"] .w-nav-overlay { + width: auto; +} + +.w-nav[data-animation="over-left"] .w-nav-overlay, +.w-nav[data-animation="over-left"] [data-nav-menu-open] { + right: auto; + z-index: 1; + top: 0; +} + +.w-nav[data-animation="over-right"] .w-nav-overlay { + width: auto; +} + +.w-nav[data-animation="over-right"] .w-nav-overlay, +.w-nav[data-animation="over-right"] [data-nav-menu-open] { + left: auto; + z-index: 1; + top: 0; +} + +.w-nav-button { + position: relative; + float: right; + padding: 18px; + font-size: 24px; + display: none; + cursor: pointer; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); + tap-highlight-color: rgba(0, 0, 0, 0); + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.w-nav-button:focus { + outline: 0; +} + +.w-nav-button.w--open { + background-color: #C8C8C8; + color: white; +} + +.w-nav[data-collapse="all"] .w-nav-menu { + display: none; +} + +.w-nav[data-collapse="all"] .w-nav-button { + display: block; +} + +.w--nav-dropdown-open { + display: block; +} + +.w--nav-dropdown-toggle-open { + display: block; +} + +.w--nav-dropdown-list-open { + position: static; +} + +@media screen and (max-width: 991px) { + .w-nav[data-collapse="medium"] .w-nav-menu { + display: none; + } + + .w-nav[data-collapse="medium"] .w-nav-button { + display: block; + } +} + +@media screen and (max-width: 767px) { + .w-nav[data-collapse="small"] .w-nav-menu { + display: none; + } + + .w-nav[data-collapse="small"] .w-nav-button { + display: block; + } + + .w-nav-brand { + padding-left: 10px; + } +} + +@media screen and (max-width: 479px) { + .w-nav[data-collapse="tiny"] .w-nav-menu { + display: none; + } + + .w-nav[data-collapse="tiny"] .w-nav-button { + display: block; + } +} + +.w-tabs { + position: relative; +} + +.w-tabs:before, +.w-tabs:after { + content: " "; + display: table; + grid-column-start: 1; + grid-row-start: 1; + grid-column-end: 2; + grid-row-end: 2; +} + +.w-tabs:after { + clear: both; +} + +.w-tab-menu { + position: relative; +} + +.w-tab-link { + position: relative; + display: inline-block; + vertical-align: top; + text-decoration: none; + padding: 9px 30px; + text-align: left; + cursor: pointer; + color: #222222; + background-color: #dddddd; +} + +.w-tab-link.w--current { + background-color: #C8C8C8; +} + +.w-tab-link:focus { + outline: 0; +} + +.w-tab-content { + position: relative; + display: block; + overflow: hidden; +} + +.w-tab-pane { + position: relative; + display: none; +} + +.w--tab-active { + display: block; +} + +@media screen and (max-width: 479px) { + .w-tab-link { + display: block; + } +} + +.w-ix-emptyfix:after { + content: ""; +} + +@keyframes spin { + 0% { + transform: rotate(0deg); + } + + 100% { + transform: rotate(360deg); + } +} + +.w-dyn-empty { + padding: 10px; + background-color: #dddddd; +} + +.w-dyn-hide { + display: none !important; +} + +.w-dyn-bind-empty { + display: none !important; +} + +.w-condition-invisible { + display: none !important; +} + +.wf-layout-layout { + display: grid; +} \ No newline at end of file diff --git a/templates/images/favicon.ico b/templates/images/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..052c539cba4203f536476ef7a11719adf36131c9 GIT binary patch literal 20490 zcmcdyg;(6n+s)$cu8X_7FQvF^ap+sTxH}6JDemr8pg0tFX>o50#T|+-P@Mhv{S#ku zl1$E=WRiK#%-nOIdjSCSy8mwj0bt--697nF%b&G06tOWVFkXw;%1Uo_{#X0I0}bW% zV(MOL^S?V6cMUzzOo>kp0BF`Jzm?VV{c~!D>Z>>M$GrbzSH@R}w@5L&Kk+aME7%ZH zO;7)6Js@=*AFqntQm&zh)qpcP%u}gp8A*#1u7A?Qp)zGdsI_0{Gd;O1)@+-q-jr+Q zV_R?#5Jr$9<*^@d@b&z_^{_nC-2dqR(!jAWll|Lo{m_?tA`IZmT)nNXSfUCsyRzxU!BthB z9BA{}6u0-cSuv#Og2Lj;yIjsNDSnN~-b z3I}^om0E>6ZTgq0n$o8Dn9T7mJ?SDCekSf6e4?Z&f1FaUpx9j|y-E*7%U*7eo&6_> zp2(9OC4}S)14~c!kRnrNSjua6>Bpt_-ESnUN(sHmK4~9W)1%NnlC{Q37t-Ue3{>6& zh-K14DwEL0l-d3CUdmv^sL7<2t8(SI>C7m+qBEm6oy4Srdw2FBUO!}3gut&MIEDFr z6-}@=yN3SmvwcHw2?hA{fg7a^!^Dd%(ZGMAN_%qbGrHue<>cGgy;wf-Ki`aA zmWe9mNE7;xG}E5D%~P&TF&15%9QRc%?zHW*pC!`bsLoaC?0f7D!zH?#DeiAhF-L#b zo2y8h1__M?-igEh4d#wbEJ!5jf6y6&759uj2caafD0nf1IM*tNL{2>UeEs3Ye0xKq zL_wRuH$iPLi(b1xqqPVKPFBi$H_46D|$A9%i{)(hr3jEpM5hzM_@R#&C# zbMA%)!Up#kp9l7L)3e)>6r*k!eSBy%zHdk-V>yY3Upw(eUAG6)9C30rqpAz#x~uT9PweP;UzH=;tqLsoiTBBQcXziC_Xh7sC-PBUvq zf*h%A75uw+_sGp`G=WJZMYEtU@2Rnaq>X400f}}-K~jS$T_wI-jco#QJD-_-0)l7LugaEI0(kJO;vXKo*adG%bZKv1}^OLBo}Kh z72gOi3#$nyq{1pFoBtfMP>A19GaB%X>V?znQ`tMVI!UBz{^G+7%XRYWVL ztV-c<8cy5Oqoxq}qwT87nKJeFC-2n)rjE7Oe^kM;REQb{L0BQYoS*KkTvM|-GcKNX zSH`+D1^+7?X$ZqWLNwHb|IjU-(!SemW_vrYTF)wfxrWmeoaMQsv-#U%l;Mwy?)_JA z`H#YoHD9{ro)SJke@9aOZ_i}&^#fExZ8jp-o@w=x0MtpcxQ-5uSHn@DKvK9#V#4_8 z+JJgNpB2DLVp>+Vrb<_JmkKow@4jXv5tvo2N6WsKP4}%V@5>&?V7Iu6ZdG4g*YamI z{#U9#x>MT8H*y^G)AZ`XhYQ)d85wF|jR|-cqJx)?V*(5-K;+mna#N!-l&oY#&g4)1 zJIHMpG*J-U)XYwFlW+P(@3dVW)jkrz+etg@y;l;qMP?djLnT=z8i!g&)MctpMdu&K zJ1XogNH7f6LH)4%cKOBBFc3d=1D2)Gb8km0xd=K4$+fG=4?e^c%odx}9A%91hkf>| z7F=3lSyuY%mtSilNB~uXlB>e6JmEy8@E|+ z*nNB4a#%gV!8pWw|J6f4W`#S5 z#W`RVGU`-%VNG>o6#o=>gbX9V2WrTXOV=&0<8`xQFV0fqM+Z)YFq$xuGy)UHiP*hf zmi;rzNkPQ9){O~s8zG!p1m=NKpAepGB0@HJfD1_zO2wgV|HYFFFb79QaY~WCl2Rrb4x+HGo-9MDTeWF7~YxpUHtJ5 ze9j)feLDZ=LG(Hj1gJe`Cb;~O4-B!)cdi6>6Qz$E+ zjv{uIX>#-TDf0HygCA*4!wf*B7fK}`*}{JWMpC^3$J!86g+;R^ z05pB@f%E&0*Yku*EJ?vfC_Q6{H-9}kx>t4whYlc`YLVjQ`-R2RjyL^CFT)*{j%_Nk zzS9X~`ki0cA&s8@ko=?cLMp&7;Eugcu~NJz4e_&QG6@|aeJ;bxBoV4&@tmG8%%Xs{ zycf39{o%wGht*!MptK1(uEl;@X*xZ38J8NszTzZ|3EMrbD3qF*VtDu-i@)j{oOne< zvn1!Wd|u3cJ$uu7+xXFF2Q$WVyvwC<6tJ`Snw5FqsNl4ez@X>-vlu zL=F1dKf)vDpKHU!*UEsen8XzFNG=-i<&wF6LNtJYD3GS_(EHLns?ZmE=#usCEKgqM zd-|G4!gcnFuR9@a4(~^}Gf*WGAJr^A{f^=uu8QU$LLk-GLjQ-#Q@=KSe9Yo5*fR(* zysa8w%zSf6J}z=#_h`#HqB!;Nx}+renMLt0@EZgMU<2L|ODjAruV@0R7J*m~@{;yL z>(cK-e#S}@3p-Dw@2(&8oXhzOet&Y@Kb`LLP^citzePJ*@X*9jSk< z6Ry}VSJCs<4F!!Ek4R3Dyz^HP1dX@&7ZvsU(a#JJkLX}rwI-@`SNatdQEjY-(SzD@ z$dX7E=YF8CD~ryP!elWz56S(+nIAZMzrJuKLueh0YGx22P63o$O}egWrC$CuYil@> z1-T&@7V~I#BwulM`epm@ILFuRFpc$*{-hwmp#FQpPzs_Bm6o+Fl9;7COexm=HWteD zEvs%TV6$MncH6Ibp~R&9kw%<*la#B5=C{~2rA1>Gb>b}U?dfr5(g|_=7^TOb6c$Av zCe??3EFN80AD(xYEbqp4TnhSemWO}s7`EGrJmN}O)d z8({;s2jFMCyq;nahd|{t#HUDZhbjM!?#~vJGpkkH+Z*!!m$l>OKLYPi-|`|aDmm_F z#7b?AU$#_l|DzpVVBSXrMc_S~FM8mS&jnH(dF`3n{Kp52Rz(atM2@`-x(nXfAoDXT z^RTR->y!8!$yP&%voG?;QdYe2^o4S)mxVI9{%|79D>R-co?!$)A!O<+$&HYM>ZPF3 zk6dl>kO2<-Ng8QV{T<<(oTbKuYoALBz)vfZuBieavpB@qNs6N_wcq%#aFeD9mwLZf zd2F;2l-fb8?}@!GwxzMP80M_$Br1?bhmkyC8P*Qfoqh=Pt}XlxUQ`Ah&v1tn6`B&v#(P7s?E@>T^qy&>0+&hiN7eGC_Sx9;@g{ z95J<^zqfShB7Y-?^#YwhM8U0*x?re0@EgMVqV3;kS>NxD^dQt;cY8|>VQ!=R!OdiY zZ6Unj?vWYQjGQ0A;Rbb+5x4&BE9&_?bMjZ^@5}@SzIl4kt`yOl)`EF~$9faGwILRY zIx+h-baW=JFT7X+HuSmXjsh6;!FE*!YapxQlY;+oWChng6*9FW+fUTJmv}z zj1)VGN*F*s?T1C-A>pbQ7j+K&0M)h^Z(PlqVcB6(AXHRd_LLX*v*zi~QL%IMwsS2HBL4%0IcJ--)Wh={$x#}Lz;RULvO=#%I$ z9^15i$Zc+rz^$8&LM@I&mvl2ID+Pgt(|cm6Qnv>j-tHuq1UMN4G<`g}*>^;~PVMLU zQ5)BcORXhFk0`|VMsxM#5&uNtpTo@fM{?pPglbY(b)944$^EB4W~cf95dQOM5__{P zgxGwwzZXP{wI7m+w=WaSS`s(95!?O2O~)OXMET-cr7p#MSv7>Er0!zQ(jFX->KUJ@ zvo;R`C`mUBumO2{RfWG4_QT8h3MuIf{tfi}tQBUR#g$)zhEjLaSGQCy5i z_orkwt|*=*y9jo}F!{04kij)n>vCPl5kS8vHZan8zZF~RXv`gPOByr?v*>;#S_|yD zAN_Y@%2Kc=-js7ZX}ta^%6_sil3gZ}yMzYR!(ryM?Kv8A+V&l!b@*Ez1zK0~fV*+s zXIuB5%p{IFFY^8YHfeRo2&eRZHN*LmN3*&0Ut29W@?``@_xW;iZp0x&ZkmURa|Na6 zp92`d2<9Ep>aReWXS41tTTImG4NQs}I^n^q3$L<+z1u^%uORStleJr{Yt4FKF#6fS zczoT$vL1?#y=pl~=2-dZL=IJ>_P2% z#fs&{YZAld*tc&Dr%fZrfmzMf&O2t_8t{@$R9Le!t$mJ^&X2hexu$eq$A_}!6l&?Y zUK2>4jB+2D?D)dHjoEip=eV7q)uV2y`!drmXpw5ozrP;=)(sNiF9Olk3!_WljjOz( zj|1vltH$j=tPq=YjID-;J14_X&Ty;nF4M0bNqjq2Xc;Rbr~b2;d^^Q9uP7B89e8|Y z*O1_|@r=m)z2!QpyTq#Eeb|#SFV{p0;{ddwl=_jSD+A1W^E2Pvz8eH&hP%wL09fnvndvgItOg z0D<6133_`;NDTqNSImnOeMh^9HD-pt3H`Y(=zdf;CDKV-zT#`cT;FY{Rln|UI!f=K zCSKEh*OLE(&_C04^?i)fHa3#Ai~$jUOB8_CHlhP1pD_>IU3aoMZz8`_N?Hg8(;luh zXNYJMA1zDPepnm01={!cPN#nN9{1_X+`a2u{Jx_*sNdc|uVpBN0MWOVhwOGWZI$^DXR>%ju>8@8VZ^vaH#h@;+}+p>$_kL`bc0Lp^Y6Fn zlCFRYIB0y%mnQ9op0dcWKlkWBRM!$puF0%M-4l5c^%{anBv>O8v+hi#Gf>XVSYu<={D4ssg`JBHfwX!cVpNR8gqf4E+s0xNV zvKjjle}d>Rh;g_7O;vwnX=Ea%vz^ZsILol^S<6J=kNIw{WKA?!_*t8;wkfIuwMJB;8 zZ^9e#EoJf5Wm04WSvGXb5h|J=1WfTa(E8>ky3J5H;yxo_stDq+;NVlF!fGi+({V*R z3R07LdBQ4@r*NLSsgQ7y0VFc_2^`>UcbUbI7-!b)_@oK>W#qC2f$`Cm7&_;^N(+oU zf?v)$6YtFMoHadSr>B@)5d`%SEj4({g1zTAZF^9VSVzgSa3ecwZ8G~ZD1=8&`{MEx zn8M#&X)U~YbzcO!+8mt3_4>LE-@z*tQ(TUgiQq_*3z0Ri5cp3z$qIp*pbxiqD(p^ALKi~dTZnuG`}mHxmz)!h(bHirv@(cX4aJ;GO2BV3YQ;uXofz3&*fOyr zffgf)vPbk4)AX}ubvn0=!Ka73SKig&7C*b$DmLQmpaPTD%JKz4ZJ1nVl&4>T6^&uG z!GO^$)KvIybkKKXnC)Bt53}EVJqB?TvciPnhB z5oZjG3ZU(ZG|~nCJtW_I{b~RzlqHf~1K~ZNWA3i}u0QLlnf%`P$HWlNMXZ~7AoF@7 zGz|KEg;ayRYj{Quxg5rtrOO>j-0SF%(p?vg+}+XM9^hm??Q83r{>J3+iX5Pqs)YV! z=rB6aZ&1Tb37-4L?<4)hqxPNc#2Yz=qYl`L$A%{$p(z#Cv(x5VIU^aqD^=9%gd&&p z`kfMxZ@RZ1(ef^Ik7e=MQNs?cL-or(DqOrABW@w#YB%1@7Olr+uu}{SB>}FgR-k_F zEYu8BqT~qtNr}<5?#sNYzk(A*nQ=sl>+9@)@7v$xncWLc}+?q*&SDtyD*JLBg{``857VP zfdbv;h()uZ&qB>~<@z>08%$xti<@77d&xa}WnB*c5JDU!v$iLiv4?fgs`M!Yj-=xSkE`*@Sm4F^ z(s2;?w4q23$R;Uy;8R9sZ&c#5uv%{1g(`E<(HPA3L2)`{8~jC~u^lA}m9lOzIDoTd zT;BAa{H(~p4kM1(*V@44H4Ua{@)ZIF1qBZ?#gw)rBSGu(%+N~fKFvqrPYwliL#`9h z`qs~tz4Mj=6qKK=uc!K$IO5!7IpZ7@5QFGl-H13)odyziq)G^Fg(BB=z=w7-laIo92!-Rp7*F!gKJpkco zwsQHgbl57~K2LU35FY9(RigG3Iut%{K2l;dgKIKY+I^jYNWl@b!RpcbX>Yk)_7$FAB zlV8YeWeu!i^Ki<4rUc1wJ0n@wm%{4&!Isto!(0i-yuxn)=(%DMuDZ4`xS>#YD&HP` zzx<0RtchVo&_i^hTk1R$MDX*|9CzP$^1Mv(G^#&FX8F8WwzQA<48^vepd8cu_ zxf!*dMTC$4EsZT)T+&#~oLF0gtJ{bR@%w=f)kL&TpPWGo22i9RVWS<40ksR|(g0dM zB7q=pa|hnzifDsCGA_nqs**EfEjilD0x1TvC(A_S0A5k7f>?vU0%YoWE{Ef1bMSei z8r}*KLBC+F%mG{8UyhAx4=*|I{pxe#W%}HiMiayJ_qNP|;<=VupOT}o3NKxhp8yDA=4P6RY^|Xu%q3c=y1uHV zo%rW({k)OZ@=j`IZ;fZC3Y#U$5q$35ccW!&&?Zm$C2MZOZlM*le6|q!i?n4ujBQy(Dor1E3Z^#o+f@6{t3;O4ZjDN! z^Y6>IR<z6_+Mx* z+YRO3c59*Nc_@U7hM$`#c2JQq(kZO6KS*I$ifQp%`jz~*c;FW4c(LVd!DIep)%&qK z)%yM0C+kjrPc`;{zUi7TtbYq05t!=U!BPyaP$EM%WYqq01>#1=J=y2$u>XmAq{gq} zD^~zenQTQKyUHD&ub`|yeOI!*3yr#ZVIBHJ%LbYs=d=jwOC;^Z@bnt-!uf2*Gf!G$ z1cA}8b|j21j`L8LXb90x(M4wo2$+iKV(fgY9brh}v~<`x)b796WXRP-?LJF6bACXA zkNSCI*C*Z=L6kKH*5!kY3wjPek192kMCLWYI~-pgbKX9Jg}%i*Lw^7btr@msDUB`N zeGcK3e#3^5;KjIL_3U<4$K&B)xu0gRfPuh+aXF@~z0hy|U#kE;>Tefycz4Awpg+vt z)p8?R>YX46kfCL&Y>#(@0DR@*YIMSSZoB1*U_>apZemAB<~X8rgA1!adph&iPRy}! z{I#EHmu=gA@b%-?tY@n0l`%F8S+S@Soc~D8hFYXu2iQYpNWw2{^=hNd)AP17m{j#f z^sQx9XE;)rzmby`gbZdYYxn=B%Wxr(zLIr*%qL#O7@J z4AQ{)YbEuE(Lrjx_(?nh!K@v$;)}d-L_%>GcOgQFDwEij;2v4(sek`|uq00?h1t;_ zfI!~_6YW46K%g=q$_KS$mZu=ZrH7grIM4bftYUl&ilM;}-P({A_Wf$~-=mA(8Wejw zZ`V()8IEFpue>`xf_-It*_(TDjSgwNS{cn9{+AOCd65PxOZ8~%m z7^p%f4z_|DF7vQ`A6w+_`-&W8E6c{^vT$@B4=3jg`6&D{9S24{ zi1TRpV$>-{Iqx&)SevKJRiw8w&@kJmw?mj#3GW3JHHgnJ@C_6q@zSLb(;n_BrgCMCktV-`EKV)| zAy$2a()^;d(o3Zd$ac>WT9 zD9CBUP3VY7cR%-}TO(w|`o&zo>*_^k1=}?w)v`ND%i(zz`KgL=_}nAPj%)s$iL3rq z;%ba`tn&VWc;p?aVqOaF^VxmCWX@A--p!9y*Nf6E12zma;8d8$+5U^xhTBF+v*Syt zP;0=mU-`qE5gUfgK#TKGPA0pSZ+{R5ZsSO~7xY!*ifW-fp^rlJn_G#w=+3#I%^#7iVj-x(l-HI(Y zB_=ED`}rnu=VSBbaUWD(%5D~h&o;8+h6z#zl2KZVGd_Codc1Q>I3Vy-@NdTv%BFND*wycC9-Y%evpG1PyT8%0~v^Zrd)Rv=cs8~7D)5E zy(E|WAa9*#Oe+(eI*_M#i#>Dklf#Srm5QlSQ+{`J{@quc$vcgO@Dyz?%GwC8{2l8t zIZ61`vdM|aw#}qUjK(+peix}+pIRenB!~K~9a7@gEH?+S+S_luF<~ilG#a7&yS6Oe z^cygu;;9Kd!qkA63cS(J)RS?i_O_kdykJ}EQxgs=tfJ?vO8A+c^x(&pAd$wEKeUqw zf|Cc>p6KrM=_`J=tCyC&NDQh72CUj8=KpN1q;+)`&!ZeZe=o3=T&js4PZZwh*wrU_ zi|d{*BA*&BK_oGQ+&z^!iY>>ZdEC$Ob5JG;+_BVMS#G8Vb)u)~l*C@bL&X+35_dSG z+n_2T7EW9U{kBDHB)6Cg^tbK2rf2Y0O>b0K%!nO9i|oWe(uRn*f?HC$R5-arvVe@m zjII8i-rj(D>0caD97C6p87|Gz3Em3s#nrHD)STwd=aO!h_CE04TN}CM=ES$gLLvg4 zrDN?JNs|ahI(Ww>-wdd66U84&Li-(m`7(qOG@11^KA_3b1;I#*whU-!KgMVeGX&l=iM`6t9?-TLV-ZoTPWch83lGLd2cbt#`j%;QCULm5N zqu?CXx_)iHz08v83F+aowsmyKyLHs;l6_FEYh%u0OLxCu?JqHtKayb&)K8`qC# zkGEsJKaN;`j?D9!XYRCleWPA&k*W^s&r!}_QXpa*l_f@yrjD`X^(9=j*>mbOmxTZg z#((-~kB#sk73?zO!hFs(?bJb+0I=N*h`Jdqtvc5*;BXVnmyk^*VA2~flkF^9lGA&9 za)X;}=6p-ylj^XMT{Q#m&S8!ejOkilPK00Th*nf5TQ z0bO3qa*wWr@^c)hfYOHh@3+1pOQ<0I$Lq>>-i2Q!K~PT1X4x2GssOO0tW(fQVR#8L z>m?2zo`NHqb7DMfrugNhs$);~USAbFGXzU2-L=eYK;bP$YDS4C6_>HGuyZ5Av4|4P z9x!+GyL%PV6cPi`27B+d(~&a>ouAJ3IGZet&ryP&i@I?6MBZ0Vel>I^S=Re;;tumO ziubnANUZT}{YjUYc=A0O^TSAHtmof`lN};V@{u&Yj0pfBs+~L&$^MhvoMOo|=G1m&V%*Y=M-Kg(KWEY`?UpsLf$3njLsNjiOg zYBm$1*(dyO*uMni;Ri^h1vA744og#pg;x4dX?WzW;-j_|9#}m3}QC(gWI%8*$SSQIP}E^&(!7@s{Z(BFGU1Xx$gv_X$>jcE zuaRrA@dGuCnNnU_gPHFeBR&2A6Ex>6sJOGeL~5U-IKA&u%^=jK^xEQU&yi>x8M26J zIArlDNXwT_o~Fd`ghAnO%d5%KLZf2Ejh_6xR)LHIcN(b6<=;=)zb6GDEX)t!w-etCRfBE$|8DNAyJp*l6-rGNH-nk zzwJBB-{rA~Sniu)XJdSA8I#^Izpu|8aUZ8c2W%pZOKkD|rfDSamO>kqgJyeX0F74#zHBoKUovaIzm~QrQ2V_h%9T zA#6~k@9QX5{=h1dbtKT~K)n$d=s;x*5CO2JCC>izru)MCQLh?nL)tikrW4-a5t8Dx zzHekd^zojBJuthS-(w4+*X?@Zzske}(cTVYXZ={u+(zkE+n8f>J3vvg9@O~xk4$s5Dg1~Yr8$>j-ov#LP@f8dEVZ}{G-FDmS2R0+SBdrFQM}xs z{_f9KI;?SlmCeAyC6)ky30KcJ(b~0y;j)*Xnv{aTF`B}S_QhP;?5sal?mvlH#JR0z zs7&K6IFfagqlEs4$#2n6K_s%-_`yg)3PN=cpM)bxc}G&|A?$qaeU7bq%BpLb_3oU< zbxbH_$u7TF86^I}e2xMs>Yzp=irUpt?Z<`$bT@sWjm{=;Ykaa#9|3i$Bt@0b?QJIf zjXT#wgj}YD?1UK^PFRNxA$?2*!yRGGUzrN(xDkl|{$Wk`_Kb)Y@s#Y9x`MU@T zLI|Etm&XVtJwhvIIiFqR++!gT?u*PMZ#IBKb#FlRyMd&|Hr> zt%jfjbq8%}$u9wq2>iu2zCk8Lx*6BUF76M?Q7A*kv_&E}M#(6lP*|7d4q?*O?h0-9 z4eP;K-G+K2gxUkUFJ$Mx`=EW@j`-661FSEI9{f{t(}a5~2-2E;kshA#5cJo?78LLw zXFx$nSq>3T54hXH%6eIGXfil!B3q;32~#mlYG5^3Lm&y9N_Y>9%E{|iToL)D@V;_( zIxSUXba-e5GN^dIOFZgK+zC8KGp-Y*Q^ikLVQGaA&m56AmTOKAL1~4)|Hn#)((Hv&8LwSN5KU5L zk1EwXhG^>K%VtnyK8&_#yf4s>rw5MDjrnq^u4=>^E$hP1$?J0h>fb0dqsP(lan9hs zf-jIB3$#+4BD^I*nzcws-gsr1=mCVYH?okJe{%Pv$ZYV897nA$>$jsAk>kM^o`^y? zykR}Dab$6bN&}@v%=auyAv6x(zegTt(%hTu_O4SQHHASet?Pb!)fMH5XPXc7no3+u zPjBwllI+1hsB#JSD4hFvBB`6*8vuqj-I-)HXxEJ$K#lLNy%-Q(f*SOwh>LV~DwRZx z!3GAJKL0>MgCw}fNZ@^KWQS+#o$Y)>CfN&7;t0{(0cJGX<*|>%+Y=AB`l{Um@?a4I z&?cw!`sglvfgGxX5L!SdyQ%Du{j5m7g(6G5MWBC=-!cNm?5Uqah2F14RuhLFV%1Ph z08mQnC@kQDP6$ZDLF4?(7p+~l0_|t-`w>(?bnz&1CF0j$VDN&9^6%%PkqXcd9oEXv zvuVbDFv1M*VzB>0x~>ka+&r)&ExLvPUi);AO?w#+)Kyywrr{WvOSO6i_UyPt4j+_w zD4>$MV8s_Aj1mj&=H^4&1&Lu^w4Nbwdf^$)2BA&xy|&t%SN8M2f2G4@bvf&O{O1^f z`|ZDt=y*sd!=A`(9uMt0uzfdDb5Ls3AVs-cXojfY`1kst>14-296<%BvvnL^K(qUD ze+Jnua+0By@x-S?tak?o)NAAgBMps#(h{*5Kr zu_l_~oW72EcvUAT3aTC!1oEb?viCzx#7eqQp!|}KxBn=VaGdK0D!VVFXFtI%lGgvQ za|~hi&%ZnymgbeQWc@N_YV86EnBp{bh(k8rFsYYHG9E@Ui-~z3zO&UR0B!NC*V#1( z0%=DQey{qLpF$?N$8LoLsqv6dQRuR+v>G?+i``Uu+=6*-uJv!f3WR>5se^Ym^N-bC zV-krLr6|A`zN-))EW&UVeVZ%+A43fR^~E$x3ZR9IWEop`u|2MkuwLAKL5GU3rz{&v z`%woE8!#TEN4z(fM4MbQ68i-LoS`Pg$g1?mx=Oec5*T+^gKQ48JG$58}^NqbrYzz0Df%~r)# ztIo$V&2e2c8;{CebhN*>lcuN}fV`?GtzYMs6X`4}bUq?R=ZuZxNThhw72dvdX*6pP z!1elYrca~y_u7FE1Kno}Rm1pz)t4nf6tS_FgE}x`eRg?xs5JsW>Hx5QkkzHi*;zyZ zd(P=RN7DjHzWep%?n-KD$UWCBCg+Q&uPfAcHvC#DuFH@9ctESN--P@ngbD;DLKQ7+ z&Kssy1gD{TVOPDM2s>2nu{;_tpD4$4Y6h}SV*8HSgIs23swkb<0yjD@dSX%G@K8|D z&j+|>72}U|xJxH!v4+lM+TFFlUjQem^~8UE2ewqe5oLZR<`V~gh1CiLWNYa)odW4K z6og4%zI)SYCLTMEJFw5FwTCw{pc@G^5>nzaVZw%ZGVG77ao+`x3Lv=e3l^fl0euwaa~8IgLkH<2QRB+dDDcdOv3;Yv=oQUw(}7PbP$Wff^s z6KUW94&&PRz%ueAiN8(?C53_wJ}8O`kR@D=Vcz`o;lmJ5>FaWM0zv9nl!1OGz2FoV zS}lW-YRcKt7s-?th(}6cK2eIjqN){gK>U98`n#!kBcIE-9xeCb06Oj3r? zs=IbG?_YGWmHJQ`jYv2T^ETz8L>nv`*3Z;_b37fZUfeMH6^whtNXl7%V|)cbD#<^V zTMD5yyM&?Eep%z;F`Ro(aPOwY{YTo?`wouujpz2Mg8*Yc6v+jOJ+Z=f|F-4V1z;HP zhsMrAt(+5L_0bEP#$#dn;N%-S!k=)9oZKz#g8 z8_0LHIWKL+G1HWu3wFRwWrg`tL#V@zfh(qp=8;`tPc?qmMkCVEL6-q}>Cs=@kskzd zbnh9J?rDY6WHM%ArWiK^+1q|tKWLgW)@F!;mGxdUgF6!AX|pSR%m;V8GdQ-?i%C zs1$sURyOjmXo|1$-?M-u0*cvtSms}5ZM<;YDN@#0@t zuKpFA*k3GWBKyA+n(rZGJ~V z>ise={UddlGqgS7A@V&of7>YUV=gL3U#yk1yO}9#A1_>+H&PrWWK&EQ9z-kvZ(c=5 z2EJ(f=}x0``)TI3S9d6uF8m5`k_GyGFo^*0<}D))no{@&u!z>Zntrg_IQbt>h1F}; zqCAS9$tn*#QZ|ZEQlGsteNvv_ZY-cOF6^F)=jj>&sg=`NHjw5un~*dl3+4&MfzBNB zPX^alJy{^J!R4l~_7Y2tkb@{E-?N>A|It=pqVMAD+hnbU#`_`@34F%USwLgfk@PBm zC4fGmgwm3uU9?Bf9BWYRiM;ms-i$BrOB$^$MU85RW2+immc85BnZ7gZsd%P%I~h@$ zH(6)L@eMX&s6zATzC0HjTDv|T#K`kUcO0Xf*tRGEXJ9bRqn+%YYAj4wIix|1eBMf7 zH6H}@r}}v7Z#<*wRWn;rjgEe9UYwB>qrQ6`joDR1i9vTjsQN$fg#d;uj6Z&bkEUw? zYft3riA#Sks!R&lDq6IN@Gkbp5PN49s!B_cr%k9=;*8X&y> zw`Fal>r@y>;(OL~TsFHSJJyX5Tgbi3egsd(fg;IyEJ zKCSRROW+cKo(Sv!yrJuvxQPA(JL&n6p^%|vs~rRrygTHm!NM`N#ceP%boJHA!5Z>4 zX?(-iW)+7;{^2~Cu4nN!en}C#`yln4S%Scwym`hDIH6m{Ug~Lbn{4$bK}Xte`!8zH z1recxT%Wp;hKgW(CbrM`D#b1qc5dn~XUZY-k-RUE=9o}>5-!y1=)+`TfIu34-=xk_ zgm@q)VuRus2hRqHUOcm+IcEL-gM$=Yo}z+_=7IcQqwMg^LT-nV+WpE!1#2v<)CJ+0 z@UrG9?2$ITF6BNEV@X={QL#CdkQ9J<>*E7SHNQe+gi8WeXRvr7mN0P8vYO-0kbMUAov>RjPCPr_sBW>gcxtpKjq;UbN0xJX&yoH|t1_O&10Re%xU_aU zEy6s3UO4+c{A&lz?>=`aZpA^KDk{NrMTP7tq(2U`%wL%M=|btRxyX<@;rZGB*=UUW zv}~xIx3=j9Un^p%;qCnpNU)Pm4}5%JYPt_e8ONJLsRMy$sSWeT54MYn9GqWWa_9o$ zYEYoE&JnVS>#6yYpP}cB7(S>z##i#(HXd*O#+8sF+>+qK3ow0_();{6f3Qr)9u=J% zAwu!FDx#Q&^pl;(b(<)mHh5ajEc3GouP!V)m&rzCkZ1hO__BF=m-^npzl%#d86Nwy ze$~9sSo^FI8jO3S`!WS4d~k~|?hf=mp(MK~o~7>en<$IQWFin`&;^WkLa7xoblu7} z-2DSOFEcI1=Dk8oU+LtXBWqu-qxovejhv@?!!25HtV`Gw{5@yEPE`%@h9E7XX{gZR zK3+IGXQP6_)`g`r6^i>OAXIvn+9%rQr%9^M!hiuX2W)uiWx(*m-U4we8)CK*y)XKwsf6A09zeJhi7 z%6W4F{3m>uf3IM2OWo~1SMs#kqpG(@I@$MXyf74o!;ATo)L-r|)M_vOif34Nf}GQF zY2=6qyxg70z`UD>b-Nhl#Du)f!d=Uce;vO(vAQW#dC;@JPN|u=r&YgRO3A7d@Sip3 zFlfiIMIX37VET*NxuQvEeU_N-5mf|XpbUeKJM&30xy4PYOy`ieYLmMLe&XX#J=6Igsj`q{Hr$JlsT6BQs@ zY?M$rJ(L66vbR$N7r8a^V5vYANlWFK-g2|A?c}c7zOjAMup*aQ|gzW?BE4}Z(>$)`u$}Yx>$Kk)EYK<)9 z=sEfTAkP2Y`qYm_e-)cX!bI*DHrGABuZ{GiUcsCHvwaTWeGcv?L(?L>+B<3myJn5g zQn~CxAZk40LM6{@e)jH=dx6!ssq885#q-E?v5=O1mGs*XqxE$PN5KN~i0qtoBDWn= zE?VI@9e+Em!cT12+$TlF+J9fcU<5+w`;P4Cm=2~I!qGj3E+u1YzELKn``K> zX7}Jj6yJ}= zXXMrIdw*A1*WCjj_+8LVJ5c@P)An=RW$bxlNSr!-bHkh6mXCD&D#rQdYFK^lT7o{C!(JOkwQ%|~+*Iv(q{XTyCIx>~5LHPn;{fHUw@SF<>kg|EGAkJR zf4!XhKhxg>$KRV_4Kvl;N=6@%skx;l=6)}f>yS(3QlXGAnYn$^MXt*&5mBylNr<_` z$7Nw6q1;2{mLaCuzU!a({sHHQa~_ZLIOp{`=lQJY`5`~$&kr^!e$r3YB_&yV>2Shh z(%xb)SPioD8EAK>&%AK+zI?5O74iP2Z1B2RzP8g3_G5C0Mmb5q6CUOWTE~5g7rdcq zAgwO|?e#|e;$lj81dR{UX)RaLQNP#JhC&fwaBKqFbm+(qA8wi_w1` zzgx_991@;zt1fb#(x@RLUZ2I&le^MViUPrfpj z*DhlblreG|JIGqz#q+vLRrYN6mPjrVIJeVRyIOrZBCyE}-qKYb!Ra36t;Z`(-&tsY z_rD?7;>t4QcUxPVUzOsX>!C=qX~W+&Qw`cs)88eYiQJ#Kvt_|r02`&&I>B;Y+!F0Cji;#P?-kGj&20W zAgVRPHqaUbg0K)h#DJS7#jU>01+Dd=bC5;P>`t(brjwfhXLa6uL7iGqs&2K*&3yCn~8a6!}czI zj_IHBuo5ay@~pC^`#XV;$+Id=><~ctZZ$h%`=z}?X$+8;!v};Vir$m<6enL(*p-VQE(eZDxl6@n-%`_%iKssV#MbCM4i}QuX|e0FWR6%DUv)W$ zGA++XR=SW{ah6wS&Rhcvm!L=nPY3(fwzoke07BFBk-93HaR9!neJXpO@HPbN%qi2c z>w}MD_!3|UpkRPYkyn|9%F@LL0C$Wqe5KvRxbTB8jRWy6SxB(?x`N@TfC`kaRXHie z>Wg2HRDBOU6yl4#;BpAi7`b}a{vnpwxA@aprHLO~SzF}vPh99AEV5|XW$4FLX=cRL zlSZMMm`}Z_dO)m1-hg>Wpo0+5<~dl}`RZ%%_P*b%^c=5bVYAW_GMZ0sTHR7%*5;$D zM2}Il%6M!b=%5e)NuQMrpM(g$rlvQh{L5G$(nL0*rh{|!Tb|b46OlyT5%(sWZY~E4 zwvNU$AKrCq%cynN@Kn$2dwG_#6c?cI)2@F+g@OjaOHU35WyEbo_q`2Dma_1_el+G` z9`FzjJZWFg!VB&OfD|s^rp+>DH{Y}6hSPnF9)($u9E29U)fTdGs>Sh@eAUm+${eTU zO755^bpxayJOk^Ffjm6KmNQ+69*PBTYzGsx16JU3YJnmeBW(U!sozvPp`Q9|`OaF| zSP1DHhPSgO;k}1q_UXd$y;wKs{(teo<*WcWm`K4!vx1nYyxnV@&Ggizx=D#TS}OtM zbiu3da=wJZBnY6N;a2SoZmL+RN8Aw^Pj0D$C5qih)#;xArT0WxwP?I#G{eAC&BO!v zfe2F z>B{0v8x@~yss++h05T+B1Egoa5K<8UyAwpX8?h<>{QUHeQ<1Qr^);{p98~JBg%msh z?8-rb&JH19TH?}lO`u`O7pPYO>xS*=LsXXLU~c6z-Gjlrm*@0eS$$mX$ai1-D+bXU znM8`g4z2?LU+!PIL#>+TC~_Bp3!D`HI#XV9n{DXE{6WdBBZ3w*psCbJkW-imPBgMm9M2@;~CPFK?@d$U!_p#~y;fXZn=JHAJ3&+{SDI4FrSF$sYE zL&xFS;r`V=nj}mS$*6OLduQS+0D@ zvn*#3kZKn*&>@Gt-k+Z7ZRcMl0VmrdtTbdT{_I>k)j9v^j5~0rMhHl2XL#FeEF~mP zFRvjJ@Ha8Bv(g0&K{7h%!gAkgHy!67eVuBaC8vB1{8`mhU%8lGZ@Yi(IzvmdU6?_zno?%`hz=S3~q`4@@Qe0QN=fuCGvL__iBOZODN zU8kuGpV^&Kb5Lo;R}hmo4kB6KKYRtG^(hBWDo$)7o*=*2lIVYiJqpDXaDT%X31X1#4B+~JGA7}fq(DY!fWxqt7Q^KgKYwH~xBsr#7iyN~2pRmAl2 z-$KzfGYp;i*-H!UdeW~DZ3Uo+(t|1Vi_JNOn@RWsFL%2?gcb{`J_xF;x-)zfo9VQ% ztytP&|`kuwocy;JOO0=K=&OQ@9h*+L6SLOTGUJP8Lh)8K%3 z6gBS2GpW29qW_UEyw0KHi|^e{XrY(4oN*yJgMp%d$|idHl^LENS~vK31GPzwHYPHDs`+0yB_wsVNnKuM$-)y&xn2VT*Yo$xrT)Ok)2*6wF8HcV`k0(9vTKE^o&;E;G614Z zTUByVMYm*=WAA1JUsoLHr5C2OeJm|yHuVIqbj*Al#5KEa_#y|gg&w#Z5Pvrt5bdVl zz^@cuxuM^AOSqzO){!?E4BV$Ic4trdLC31=d6``CiBiRrgrn2!eLpR~pU^uDkKZqF zM+kBQw3qz3O{ubVsN-Zd3z-6aJg_A)27PsWX4UB4JT2iyblfz*r>F zl_0mJ`E35~?j_rQBohTwM=usilj~Lo`+bDGt=h--myP zD;gBr(&V^pR0RY|LtAhpYZFcX76|RavS(7w$?AQ z+3spyvqzFyNp<^XFJ>Ig3gvz{sFjow8A3N17Ij)oBxCjBSd)ryBdNPTWnX7#*^p z%%0{3gi9vV0mb%uHfs)%?js2bR=V(wkjTv$@o>9$1sl?0m1&tVF|4wfLNlnu(L6@(^NAnWxhAUcTj%$etuRy?eJ`By zEkLQgoFSgI7M+L=^HFZwX)toGk+tlq${9Y2qr508_`j*`R<=3tIs&N?rE-F+@dM0^ LEDbC4-J|~pHZ%%} literal 0 HcmV?d00001 diff --git a/templates/images/logo-z.svg b/templates/images/logo-z.svg new file mode 100644 index 0000000..1d41aa7 --- /dev/null +++ b/templates/images/logo-z.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/templates/images/webclip.png b/templates/images/webclip.png new file mode 100644 index 0000000000000000000000000000000000000000..7fd380c4eb58ca37f0a79040599e0c03ec7ff916 GIT binary patch literal 4807 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 literal 0 HcmV?d00001 diff --git a/templates/js/webflow.js b/templates/js/webflow.js new file mode 100644 index 0000000..6cd0459 --- /dev/null +++ b/templates/js/webflow.js @@ -0,0 +1,36 @@ + +/*! + * Webflow: Front-end site library + * @license MIT + * Inline scripts may access the api using an async handler: + * var Webflow = Webflow || []; + * Webflow.push(readyFunction); + */ + +(()=>{var be=(t,f)=>()=>(f||t((f={exports:{}}).exports,f),f.exports);var Ke=be(()=>{"use strict";window.tram=function(t){function f(e,r){var o=new h.Bare;return o.init(e,r)}function v(e){return e.replace(/[A-Z]/g,function(r){return"-"+r.toLowerCase()})}function A(e){var r=parseInt(e.slice(1),16),o=r>>16&255,a=r>>8&255,i=255&r;return[o,a,i]}function $(e,r,o){return"#"+(1<<24|e<<16|r<<8|o).toString(16).slice(1)}function L(){}function N(e,r){J("Type warning: Expected: ["+e+"] Got: ["+typeof r+"] "+r)}function S(e,r,o){J("Units do not match ["+e+"]: "+r+", "+o)}function W(e,r,o){if(r!==void 0&&(o=r),e===void 0)return o;var a=o;return Re.test(e)||!Se.test(e)?a=parseInt(e,10):Se.test(e)&&(a=1e3*parseFloat(e)),0>a&&(a=0),a===a?a:o}function J(e){te.debug&&window&&window.console.warn(e)}function se(e){for(var r=-1,o=e?e.length:0,a=[];++rme&&(me=le.span),le.stop(),le.animate(qt)},function(le){"wait"in le&&(me=W(le.wait,0))}),fe.call(this),me>0&&(this.timer=new ie({duration:me,context:this}),this.active=!0,j&&(this.timer.complete=s));var Ee=this,we=!1,We={};c(function(){_e.call(Ee,C,function(le){le.active&&(we=!0,We[le.name]=le.nextStyle)}),we&&Ee.$el.css(We)})}}}function a(C){C=W(C,0),this.active?this.queue.push({options:C}):(this.timer=new ie({duration:C,context:this,complete:s}),this.active=!0)}function i(C){return this.active?(this.queue.push({options:C,args:arguments}),void(this.timer.complete=s)):J("No active transition timer. Use start() or wait() before then().")}function s(){if(this.timer&&this.timer.destroy(),this.active=!1,this.queue.length){var C=this.queue.shift();o.call(this,C.options,!0,C.args)}}function O(C){this.timer&&this.timer.destroy(),this.queue=[],this.active=!1;var j;typeof C=="string"?(j={},j[C]=1):j=typeof C=="object"&&C!=null?C:this.props,_e.call(this,j,pe),fe.call(this)}function D(C){O.call(this,C),_e.call(this,C,Ne,Dt)}function oe(C){typeof C!="string"&&(C="block"),this.el.style.display=C}function m(){O.call(this),this.el.style.display="none"}function z(){this.el.offsetHeight}function X(){O.call(this),t.removeData(this.el,V),this.$el=this.el=null}function fe(){var C,j,ue=[];this.upstream&&ue.push(this.upstream);for(C in this.props)j=this.props[C],j.active&&ue.push(j.string);ue=ue.join(","),this.style!==ue&&(this.style=ue,this.el.style[b.transition.dom]=ue)}function _e(C,j,ue){var ne,me,Ee,we,We=j!==pe,le={};for(ne in C)Ee=C[ne],ne in ae?(le.transform||(le.transform={}),le.transform[ne]=Ee):(F.test(ne)&&(ne=v(ne)),ne in g?le[ne]=Ee:(we||(we={}),we[ne]=Ee));for(ne in le){if(Ee=le[ne],me=this.props[ne],!me){if(!We)continue;me=r.call(this,ne)}j.call(this,me,Ee)}ue&&we&&ue.call(this,we)}function pe(C){C.stop()}function Ne(C,j){C.set(j)}function Dt(C){this.$el.css(C)}function ye(C,j){e[C]=function(){return this.children?Pt.call(this,j,arguments):(this.el&&j.apply(this,arguments),this)}}function Pt(C,j){var ue,ne=this.children.length;for(ue=0;ne>ue;ue++)C.apply(this.children[ue],j);return this}e.init=function(C){if(this.$el=t(C),this.el=this.$el[0],this.props={},this.queue=[],this.style="",this.active=!1,te.keepInherited&&!te.fallback){var j=p(this.el,"transition");j&&!ve.test(j)&&(this.upstream=j)}b.backface&&te.hideBackface&&n(this.el,b.backface.css,"hidden")},ye("add",r),ye("start",o),ye("wait",a),ye("then",i),ye("next",s),ye("stop",O),ye("set",D),ye("show",oe),ye("hide",m),ye("redraw",z),ye("destroy",X)}),h=K(k,function(e){function r(o,a){var i=t.data(o,V)||t.data(o,V,new k.Bare);return i.el||i.init(o),a?i.start(a):i}e.init=function(o,a){var i=t(o);if(!i.length)return this;if(i.length===1)return r(i[0],a);var s=[];return i.each(function(O,D){s.push(r(D,a))}),this.children=s,this}}),d=K(function(e){function r(){var s=this.get();this.update("auto");var O=this.get();return this.update(s),O}function o(s,O,D){return O!==void 0&&(D=O),s in G?s:D}function a(s){var O=/rgba?\((\d+),\s*(\d+),\s*(\d+)/.exec(s);return(O?$(O[1],O[2],O[3]):s).replace(/#(\w)(\w)(\w)$/,"#$1$1$2$2$3$3")}var i={duration:500,ease:"ease",delay:0};e.init=function(s,O,D,oe){this.$el=s,this.el=s[0];var m=O[0];D[2]&&(m=D[2]),_[m]&&(m=_[m]),this.name=m,this.type=D[1],this.duration=W(O[1],this.duration,i.duration),this.ease=o(O[2],this.ease,i.ease),this.delay=W(O[3],this.delay,i.delay),this.span=this.duration+this.delay,this.active=!1,this.nextStyle=null,this.auto=Ce.test(this.name),this.unit=oe.unit||this.unit||te.defaultUnit,this.angle=oe.angle||this.angle||te.defaultAngle,te.fallback||oe.fallback?this.animate=this.fallback:(this.animate=this.transition,this.string=this.name+ge+this.duration+"ms"+(this.ease!="ease"?ge+G[this.ease][0]:"")+(this.delay?ge+this.delay+"ms":""))},e.set=function(s){s=this.convert(s,this.type),this.update(s),this.redraw()},e.transition=function(s){this.active=!0,s=this.convert(s,this.type),this.auto&&(this.el.style[this.name]=="auto"&&(this.update(this.get()),this.redraw()),s=="auto"&&(s=r.call(this))),this.nextStyle=s},e.fallback=function(s){var O=this.el.style[this.name]||this.convert(this.get(),this.type);s=this.convert(s,this.type),this.auto&&(O=="auto"&&(O=this.convert(this.get(),this.type)),s=="auto"&&(s=r.call(this))),this.tween=new R({from:O,to:s,duration:this.duration,delay:this.delay,ease:this.ease,update:this.update,context:this})},e.get=function(){return p(this.el,this.name)},e.update=function(s){n(this.el,this.name,s)},e.stop=function(){(this.active||this.nextStyle)&&(this.active=!1,this.nextStyle=null,n(this.el,this.name,this.get()));var s=this.tween;s&&s.context&&s.destroy()},e.convert=function(s,O){if(s=="auto"&&this.auto)return s;var D,oe=typeof s=="number",m=typeof s=="string";switch(O){case w:if(oe)return s;if(m&&s.replace(H,"")==="")return+s;D="number(unitless)";break;case Q:if(m){if(s===""&&this.original)return this.original;if(O.test(s))return s.charAt(0)=="#"&&s.length==7?s:a(s)}D="hex or rgb string";break;case q:if(oe)return s+this.unit;if(m&&O.test(s))return s;D="number(px) or string(unit)";break;case Y:if(oe)return s+this.unit;if(m&&O.test(s))return s;D="number(px) or string(unit or %)";break;case ce:if(oe)return s+this.angle;if(m&&O.test(s))return s;D="number(deg) or string(angle)";break;case he:if(oe||m&&Y.test(s))return s;D="number(unitless) or string(unit or %)"}return N(D,s),s},e.redraw=function(){this.el.offsetHeight}}),T=K(d,function(e,r){e.init=function(){r.init.apply(this,arguments),this.original||(this.original=this.convert(this.get(),Q))}}),B=K(d,function(e,r){e.init=function(){r.init.apply(this,arguments),this.animate=this.fallback},e.get=function(){return this.$el[this.name]()},e.update=function(o){this.$el[this.name](o)}}),U=K(d,function(e,r){function o(a,i){var s,O,D,oe,m;for(s in a)oe=ae[s],D=oe[0],O=oe[1]||s,m=this.convert(a[s],D),i.call(this,O,m,D)}e.init=function(){r.init.apply(this,arguments),this.current||(this.current={},ae.perspective&&te.perspective&&(this.current.perspective=te.perspective,n(this.el,this.name,this.style(this.current)),this.redraw()))},e.set=function(a){o.call(this,a,function(i,s){this.current[i]=s}),n(this.el,this.name,this.style(this.current)),this.redraw()},e.transition=function(a){var i=this.values(a);this.tween=new Ae({current:this.current,values:i,duration:this.duration,delay:this.delay,ease:this.ease});var s,O={};for(s in this.current)O[s]=s in i?i[s]:this.current[s];this.active=!0,this.nextStyle=this.style(O)},e.fallback=function(a){var i=this.values(a);this.tween=new Ae({current:this.current,values:i,duration:this.duration,delay:this.delay,ease:this.ease,update:this.update,context:this})},e.update=function(){n(this.el,this.name,this.style(this.current))},e.style=function(a){var i,s="";for(i in a)s+=i+"("+a[i]+") ";return s},e.values=function(a){var i,s={};return o.call(this,a,function(O,D,oe){s[O]=D,this.current[O]===void 0&&(i=0,~O.indexOf("scale")&&(i=1),this.current[O]=this.convert(i,oe))}),s}}),R=K(function(e){function r(m){D.push(m)===1&&c(o)}function o(){var m,z,X,fe=D.length;if(fe)for(c(o),z=y(),m=fe;m--;)X=D[m],X&&X.render(z)}function a(m){var z,X=t.inArray(m,D);X>=0&&(z=D.slice(X+1),D.length=X,z.length&&(D=D.concat(z)))}function i(m){return Math.round(m*oe)/oe}function s(m,z,X){return $(m[0]+X*(z[0]-m[0]),m[1]+X*(z[1]-m[1]),m[2]+X*(z[2]-m[2]))}var O={ease:G.ease[1],from:0,to:1};e.init=function(m){this.duration=m.duration||0,this.delay=m.delay||0;var z=m.ease||O.ease;G[z]&&(z=G[z][1]),typeof z!="function"&&(z=O.ease),this.ease=z,this.update=m.update||L,this.complete=m.complete||L,this.context=m.context||this,this.name=m.name;var X=m.from,fe=m.to;X===void 0&&(X=O.from),fe===void 0&&(fe=O.to),this.unit=m.unit||"",typeof X=="number"&&typeof fe=="number"?(this.begin=X,this.change=fe-X):this.format(fe,X),this.value=this.begin+this.unit,this.start=y(),m.autoplay!==!1&&this.play()},e.play=function(){this.active||(this.start||(this.start=y()),this.active=!0,r(this))},e.stop=function(){this.active&&(this.active=!1,a(this))},e.render=function(m){var z,X=m-this.start;if(this.delay){if(X<=this.delay)return;X-=this.delay}if(X{"use strict";var Nt=window.$,Wt=Ke()&&Nt.tram;et.exports=function(){var t={};t.VERSION="1.6.0-Webflow";var f={},v=Array.prototype,A=Object.prototype,$=Function.prototype,L=v.push,N=v.slice,S=v.concat,W=A.toString,J=A.hasOwnProperty,se=v.forEach,K=v.map,G=v.reduce,M=v.reduceRight,Z=v.filter,ee=v.every,V=v.some,H=v.indexOf,F=v.lastIndexOf,w=Array.isArray,Q=Object.keys,q=$.bind,Y=t.each=t.forEach=function(u,l,E){if(u==null)return u;if(se&&u.forEach===se)u.forEach(l,E);else if(u.length===+u.length){for(var b=0,P=u.length;b/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var he=/(.)^/,ve={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},Ce=/\\|'|\r|\n|\u2028|\u2029/g,ge=function(u){return"\\"+ve[u]},x=/^\s*(\w|\$)+\s*$/;return t.template=function(u,l,E){!l&&E&&(l=E),l=t.defaults({},l,t.templateSettings);var b=RegExp([(l.escape||he).source,(l.interpolate||he).source,(l.evaluate||he).source].join("|")+"|$","g"),P=0,I="__p+='";u.replace(b,function(h,d,T,B,U){return I+=u.slice(P,U).replace(Ce,ge),P=U+h.length,d?I+=`'+ +((__t=(`+d+`))==null?'':_.escape(__t))+ +'`:T?I+=`'+ +((__t=(`+T+`))==null?'':__t)+ +'`:B&&(I+=`'; +`+B+` +__p+='`),h}),I+=`'; +`;var c=l.variable;if(c){if(!x.test(c))throw new Error("variable is not a bare identifier: "+c)}else I=`with(obj||{}){ +`+I+`} +`,c="obj";I=`var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');}; +`+I+`return __p; +`;var y;try{y=new Function(l.variable||"obj","_",I)}catch(h){throw h.source=I,h}var k=function(h){return y.call(this,h,t)};return k.source="function("+c+`){ +`+I+"}",k},t}()});var Te=be((nn,ct)=>{"use strict";var re={},De={},Pe=[],Ye=window.Webflow||[],Me=window.jQuery,ke=Me(window),zt=Me(document),Oe=Me.isFunction,xe=re._=tt(),rt=re.tram=Ke()&&Me.tram,He=!1,Ge=!1;rt.config.hideBackface=!1;rt.config.keepInherited=!0;re.define=function(t,f,v){De[t]&&ot(De[t]);var A=De[t]=f(Me,xe,v)||{};return it(A),A};re.require=function(t){return De[t]};function it(t){re.env()&&(Oe(t.design)&&ke.on("__wf_design",t.design),Oe(t.preview)&&ke.on("__wf_preview",t.preview)),Oe(t.destroy)&&ke.on("__wf_destroy",t.destroy),t.ready&&Oe(t.ready)&&Ht(t)}function Ht(t){if(He){t.ready();return}xe.contains(Pe,t.ready)||Pe.push(t.ready)}function ot(t){Oe(t.design)&&ke.off("__wf_design",t.design),Oe(t.preview)&&ke.off("__wf_preview",t.preview),Oe(t.destroy)&&ke.off("__wf_destroy",t.destroy),t.ready&&Oe(t.ready)&&Ut(t)}function Ut(t){Pe=xe.filter(Pe,function(f){return f!==t.ready})}re.push=function(t){if(He){Oe(t)&&t();return}Ye.push(t)};re.env=function(t){var f=window.__wf_design,v=typeof f<"u";if(!t)return v;if(t==="design")return v&&f;if(t==="preview")return v&&!f;if(t==="slug")return v&&window.__wf_slug;if(t==="editor")return window.WebflowEditor;if(t==="test")return window.__wf_test;if(t==="frame")return window!==window.top};var ze=navigator.userAgent.toLowerCase(),at=re.env.touch="ontouchstart"in window||window.DocumentTouch&&document instanceof window.DocumentTouch,Bt=re.env.chrome=/chrome/.test(ze)&&/Google/.test(navigator.vendor)&&parseInt(ze.match(/chrome\/(\d+)\./)[1],10),$t=re.env.ios=/(ipod|iphone|ipad)/.test(ze);re.env.safari=/safari/.test(ze)&&!Bt&&!$t;var Ve;at&&zt.on("touchstart mousedown",function(t){Ve=t.target});re.validClick=at?function(t){return t===Ve||Me.contains(t,Ve)}:function(){return!0};var st="resize.webflow orientationchange.webflow load.webflow",Xt="scroll.webflow "+st;re.resize=Ze(ke,st);re.scroll=Ze(ke,Xt);re.redraw=Ze();function Ze(t,f){var v=[],A={};return A.up=xe.throttle(function($){xe.each(v,function(L){L($)})}),t&&f&&t.on(f,A.up),A.on=function($){typeof $=="function"&&(xe.contains(v,$)||v.push($))},A.off=function($){if(!arguments.length){v=[];return}v=xe.filter(v,function(L){return L!==$})},A}re.location=function(t){window.location=t};re.env()&&(re.location=function(){});re.ready=function(){He=!0,Ge?Kt():xe.each(Pe,nt),xe.each(Ye,nt),re.resize.up()};function nt(t){Oe(t)&&t()}function Kt(){Ge=!1,xe.each(De,it)}var Ie;re.load=function(t){Ie.then(t)};function ut(){Ie&&(Ie.reject(),ke.off("load",Ie.resolve)),Ie=new Me.Deferred,ke.on("load",Ie.resolve)}re.destroy=function(t){t=t||{},Ge=!0,ke.triggerHandler("__wf_destroy"),t.domready!=null&&(He=t.domready),xe.each(De,ot),re.resize.off(),re.scroll.off(),re.redraw.off(),Pe=[],Ye=[],Ie.state()==="pending"&&ut()};Me(re.ready);ut();ct.exports=window.Webflow=re});var dt=be((rn,lt)=>{"use strict";var ft=Te();ft.define("brand",lt.exports=function(t){var f={},v=document,A=t("html"),$=t("body"),L=".w-webflow-badge",N=window.location,S=/PhantomJS/i.test(navigator.userAgent),W="fullscreenchange webkitfullscreenchange mozfullscreenchange msfullscreenchange",J;f.ready=function(){var M=A.attr("data-wf-status"),Z=A.attr("data-wf-domain")||"";/\.webflow\.io$/i.test(Z)&&N.hostname!==Z&&(M=!0),M&&!S&&(J=J||K(),G(),setTimeout(G,500),t(v).off(W,se).on(W,se))};function se(){var M=v.fullScreen||v.mozFullScreen||v.webkitIsFullScreen||v.msFullscreenElement||!!v.webkitFullscreenElement;t(J).attr("style",M?"display: none !important;":"")}function K(){var M=t('').attr("href","https://webflow.com?utm_campaign=brandjs"),Z=t("").attr("src","https://d3e54v103j8qbb.cloudfront.net/img/webflow-badge-icon-d2.89e12c322e.svg").attr("alt","").css({marginRight:"4px",width:"26px"}),ee=t("").attr("src","https://d3e54v103j8qbb.cloudfront.net/img/webflow-badge-text-d2.c82cec3b78.svg").attr("alt","Made in Webflow");return M.append(Z,ee),M[0]}function G(){var M=$.children(L),Z=M.length&&M.get(0)===J,ee=ft.env("editor");if(Z){ee&&M.remove();return}M.length&&M.remove(),ee||$.append(J)}return f})});var vt=be((on,ht)=>{"use strict";var Vt=Te();Vt.define("focus-visible",ht.exports=function(){function t(v){var A=!0,$=!1,L=null,N={text:!0,search:!0,url:!0,tel:!0,email:!0,password:!0,number:!0,date:!0,month:!0,week:!0,time:!0,datetime:!0,"datetime-local":!0};function S(w){return!!(w&&w!==document&&w.nodeName!=="HTML"&&w.nodeName!=="BODY"&&"classList"in w&&"contains"in w.classList)}function W(w){var Q=w.type,q=w.tagName;return!!(q==="INPUT"&&N[Q]&&!w.readOnly||q==="TEXTAREA"&&!w.readOnly||w.isContentEditable)}function J(w){w.getAttribute("data-wf-focus-visible")||w.setAttribute("data-wf-focus-visible","true")}function se(w){w.getAttribute("data-wf-focus-visible")&&w.removeAttribute("data-wf-focus-visible")}function K(w){w.metaKey||w.altKey||w.ctrlKey||(S(v.activeElement)&&J(v.activeElement),A=!0)}function G(){A=!1}function M(w){S(w.target)&&(A||W(w.target))&&J(w.target)}function Z(w){S(w.target)&&w.target.hasAttribute("data-wf-focus-visible")&&($=!0,window.clearTimeout(L),L=window.setTimeout(function(){$=!1},100),se(w.target))}function ee(){document.visibilityState==="hidden"&&($&&(A=!0),V())}function V(){document.addEventListener("mousemove",F),document.addEventListener("mousedown",F),document.addEventListener("mouseup",F),document.addEventListener("pointermove",F),document.addEventListener("pointerdown",F),document.addEventListener("pointerup",F),document.addEventListener("touchmove",F),document.addEventListener("touchstart",F),document.addEventListener("touchend",F)}function H(){document.removeEventListener("mousemove",F),document.removeEventListener("mousedown",F),document.removeEventListener("mouseup",F),document.removeEventListener("pointermove",F),document.removeEventListener("pointerdown",F),document.removeEventListener("pointerup",F),document.removeEventListener("touchmove",F),document.removeEventListener("touchstart",F),document.removeEventListener("touchend",F)}function F(w){w.target.nodeName&&w.target.nodeName.toLowerCase()==="html"||(A=!1,H())}document.addEventListener("keydown",K,!0),document.addEventListener("mousedown",G,!0),document.addEventListener("pointerdown",G,!0),document.addEventListener("touchstart",G,!0),document.addEventListener("visibilitychange",ee,!0),V(),v.addEventListener("focus",M,!0),v.addEventListener("blur",Z,!0)}function f(){if(typeof document<"u")try{document.querySelector(":focus-visible")}catch{t(document)}}return{ready:f}})});var gt=be((an,mt)=>{"use strict";var pt=Te();pt.define("focus",mt.exports=function(){var t=[],f=!1;function v(N){f&&(N.preventDefault(),N.stopPropagation(),N.stopImmediatePropagation(),t.unshift(N))}function A(N){var S=N.target,W=S.tagName;return/^a$/i.test(W)&&S.href!=null||/^(button|textarea)$/i.test(W)&&S.disabled!==!0||/^input$/i.test(W)&&/^(button|reset|submit|radio|checkbox)$/i.test(S.type)&&!S.disabled||!/^(button|input|textarea|select|a)$/i.test(W)&&!Number.isNaN(Number.parseFloat(S.tabIndex))||/^audio$/i.test(W)||/^video$/i.test(W)&&S.controls===!0}function $(N){A(N)&&(f=!0,setTimeout(()=>{for(f=!1,N.target.focus();t.length>0;){var S=t.pop();S.target.dispatchEvent(new MouseEvent(S.type,S))}},0))}function L(){typeof document<"u"&&document.body.hasAttribute("data-wf-focus-within")&&pt.env.safari&&(document.addEventListener("mousedown",$,!0),document.addEventListener("mouseup",v,!0),document.addEventListener("click",v,!0))}return{ready:L}})});var bt=be((sn,wt)=>{"use strict";var qe=Te();qe.define("links",wt.exports=function(t,f){var v={},A=t(window),$,L=qe.env(),N=window.location,S=document.createElement("a"),W="w--current",J=/index\.(html|php)$/,se=/\/$/,K,G;v.ready=v.design=v.preview=M;function M(){$=L&&qe.env("design"),G=qe.env("slug")||N.pathname||"",qe.scroll.off(ee),K=[];for(var H=document.links,F=0;F=0)){var w=t(H);if(S.hash.length>1&&S.host+S.pathname===N.host+N.pathname){if(!/^#[a-zA-Z0-9\-\_]+$/.test(S.hash))return;var Q=t(S.hash);Q.length&&K.push({link:w,sec:Q,active:!1});return}if(!(F==="#"||F==="")){var q=S.href===N.href||F===G||J.test(F)&&se.test(G);V(w,W,q)}}}}function ee(){var H=A.scrollTop(),F=A.height();f.each(K,function(w){if(!w.link.attr("hreflang")){var Q=w.link,q=w.sec,Y=q.offset().top,ce=q.outerHeight(),he=F*.5,ve=q.is(":visible")&&Y+ce-he>=H&&Y+he<=H+F;w.active!==ve&&(w.active=ve,V(Q,W,ve))}})}function V(H,F,w){var Q=H.hasClass(F);w&&Q||!w&&!Q||(w?H.addClass(F):H.removeClass(F))}return v})});var Et=be((un,yt)=>{"use strict";var Ue=Te();Ue.define("scroll",yt.exports=function(t){var f={WF_CLICK_EMPTY:"click.wf-empty-link",WF_CLICK_SCROLL:"click.wf-scroll"},v=window.location,A=Z()?null:window.history,$=t(window),L=t(document),N=t(document.body),S=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||function(x){window.setTimeout(x,15)},W=Ue.env("editor")?".w-editor-body":"body",J="header, "+W+" > .header, "+W+" > .w-nav:not([data-no-scroll])",se='a[href="#"]',K='a[href*="#"]:not(.w-tab-link):not('+se+")",G='.wf-force-outline-none[tabindex="-1"]:focus{outline:none;}',M=document.createElement("style");M.appendChild(document.createTextNode(G));function Z(){try{return!!window.frameElement}catch{return!0}}var ee=/^#[a-zA-Z0-9][\w:.-]*$/;function V(x){return ee.test(x.hash)&&x.host+x.pathname===v.host+v.pathname}let H=typeof window.matchMedia=="function"&&window.matchMedia("(prefers-reduced-motion: reduce)");function F(){return document.body.getAttribute("data-wf-scroll-motion")==="none"||H.matches}function w(x,u){var l;switch(u){case"add":l=x.attr("tabindex"),l?x.attr("data-wf-tabindex-swap",l):x.attr("tabindex","-1");break;case"remove":l=x.attr("data-wf-tabindex-swap"),l?(x.attr("tabindex",l),x.removeAttr("data-wf-tabindex-swap")):x.removeAttr("tabindex");break}x.toggleClass("wf-force-outline-none",u==="add")}function Q(x){var u=x.currentTarget;if(!(Ue.env("design")||window.$.mobile&&/(?:^|\s)ui-link(?:$|\s)/.test(u.className))){var l=V(u)?u.hash:"";if(l!==""){var E=t(l);E.length&&(x&&(x.preventDefault(),x.stopPropagation()),q(l,x),window.setTimeout(function(){Y(E,function(){w(E,"add"),E.get(0).focus({preventScroll:!0}),w(E,"remove")})},x?0:300))}}}function q(x){if(v.hash!==x&&A&&A.pushState&&!(Ue.env.chrome&&v.protocol==="file:")){var u=A.state&&A.state.hash;u!==x&&A.pushState({hash:x},"",x)}}function Y(x,u){var l=$.scrollTop(),E=ce(x);if(l!==E){var b=he(x,l,E),P=Date.now(),I=function(){var c=Date.now()-P;window.scroll(0,ve(l,E,c,b)),c<=b?S(I):typeof u=="function"&&u()};S(I)}}function ce(x){var u=t(J),l=u.css("position")==="fixed"?u.outerHeight():0,E=x.offset().top-l;if(x.data("scroll")==="mid"){var b=$.height()-l,P=x.outerHeight();P=0&&(E=I)}),(472.143*Math.log(Math.abs(u-l)+125)-2e3)*E}function ve(x,u,l,E){return l>E?u:x+(u-x)*Ce(l/E)}function Ce(x){return x<.5?4*x*x*x:(x-1)*(2*x-2)*(2*x-2)+1}function ge(){var{WF_CLICK_EMPTY:x,WF_CLICK_SCROLL:u}=f;L.on(u,K,Q),L.on(x,se,function(l){l.preventDefault()}),document.head.insertBefore(M,document.head.firstChild)}return{ready:ge}})});var kt=be((cn,xt)=>{"use strict";var Yt=Te();Yt.define("touch",xt.exports=function(t){var f={},v=window.getSelection;t.event.special.tap={bindType:"click",delegateType:"click"},f.init=function(L){return L=typeof L=="string"?t(L).get(0):L,L?new A(L):null};function A(L){var N=!1,S=!1,W=Math.min(Math.round(window.innerWidth*.04),40),J,se;L.addEventListener("touchstart",K,!1),L.addEventListener("touchmove",G,!1),L.addEventListener("touchend",M,!1),L.addEventListener("touchcancel",Z,!1),L.addEventListener("mousedown",K,!1),L.addEventListener("mousemove",G,!1),L.addEventListener("mouseup",M,!1),L.addEventListener("mouseout",Z,!1);function K(V){var H=V.touches;H&&H.length>1||(N=!0,H?(S=!0,J=H[0].clientX):J=V.clientX,se=J)}function G(V){if(N){if(S&&V.type==="mousemove"){V.preventDefault(),V.stopPropagation();return}var H=V.touches,F=H?H[0].clientX:V.clientX,w=F-se;se=F,Math.abs(w)>W&&v&&String(v())===""&&($("swipe",V,{direction:w>0?"right":"left"}),Z())}}function M(V){if(N&&(N=!1,S&&V.type==="mouseup")){V.preventDefault(),V.stopPropagation(),S=!1;return}}function Z(){N=!1}function ee(){L.removeEventListener("touchstart",K,!1),L.removeEventListener("touchmove",G,!1),L.removeEventListener("touchend",M,!1),L.removeEventListener("touchcancel",Z,!1),L.removeEventListener("mousedown",K,!1),L.removeEventListener("mousemove",G,!1),L.removeEventListener("mouseup",M,!1),L.removeEventListener("mouseout",Z,!1),L=null}this.destroy=ee}function $(L,N,S){var W=t.Event(L,{originalEvent:N});t(N.target).trigger(W,S)}return f.instance=f.init(document),f})});var Ot=be((fn,_t)=>{"use strict";var Qe=Te();Qe.define("forms",_t.exports=function(t,f){var v={},A=t(document),$,L=window.location,N=window.XDomainRequest&&!window.atob,S=".w-form",W,J=/e(-)?mail/i,se=/^\S+@\S+$/,K=window.alert,G=Qe.env(),M,Z,ee,V=/list-manage[1-9]?.com/i,H=f.debounce(function(){K("Oops! This page has improperly configured forms. Please contact your website administrator to fix this issue.")},100);v.ready=v.design=v.preview=function(){F(),!G&&!M&&Q()};function F(){W=t("html").attr("data-wf-site"),Z="https://webflow.com/api/v1/form/"+W,N&&Z.indexOf("https://webflow.com")>=0&&(Z=Z.replace("https://webflow.com","https://formdata.webflow.com")),ee=`${Z}/signFile`,$=t(S+" form"),$.length&&$.each(w)}function w(c,y){var k=t(y),h=t.data(y,S);h||(h=t.data(y,S,{form:k})),q(h);var d=k.closest("div.w-form");h.done=d.find("> .w-form-done"),h.fail=d.find("> .w-form-fail"),h.fileUploads=d.find(".w-file-upload"),h.fileUploads.each(function(U){b(U,h)});var T=h.form.attr("aria-label")||h.form.attr("data-name")||"Form";h.done.attr("aria-label")||h.form.attr("aria-label",T),h.done.attr("tabindex","-1"),h.done.attr("role","region"),h.done.attr("aria-label")||h.done.attr("aria-label",T+" success"),h.fail.attr("tabindex","-1"),h.fail.attr("role","region"),h.fail.attr("aria-label")||h.fail.attr("aria-label",T+" failure");var B=h.action=k.attr("action");if(h.handler=null,h.redirect=k.attr("data-redirect"),V.test(B)){h.handler=u;return}if(!B){if(W){h.handler=x;return}H()}}function Q(){M=!0,A.on("submit",S+" form",function(U){var R=t.data(this,S);R.handler&&(R.evt=U,R.handler(R))});let c=".w-checkbox-input",y=".w-radio-input",k="w--redirected-checked",h="w--redirected-focus",d="w--redirected-focus-visible",T=":focus-visible, [data-wf-focus-visible]",B=[["checkbox",c],["radio",y]];A.on("change",S+' form input[type="checkbox"]:not('+c+")",U=>{t(U.target).siblings(c).toggleClass(k)}),A.on("change",S+' form input[type="radio"]',U=>{t(`input[name="${U.target.name}"]:not(${c})`).map((ie,Ae)=>t(Ae).siblings(y).removeClass(k));let R=t(U.target);R.hasClass("w-radio-input")||R.siblings(y).addClass(k)}),B.forEach(([U,R])=>{A.on("focus",S+` form input[type="${U}"]:not(`+R+")",ie=>{t(ie.target).siblings(R).addClass(h),t(ie.target).filter(T).siblings(R).addClass(d)}),A.on("blur",S+` form input[type="${U}"]:not(`+R+")",ie=>{t(ie.target).siblings(R).removeClass(`${h} ${d}`)})})}function q(c){var y=c.btn=c.form.find(':input[type="submit"]');c.wait=c.btn.attr("data-wait")||null,c.success=!1,y.prop("disabled",!1),c.label&&y.val(c.label)}function Y(c){var y=c.btn,k=c.wait;y.prop("disabled",!0),k&&(c.label=y.val(),y.val(k))}function ce(c,y){var k=null;return y=y||{},c.find(':input:not([type="submit"]):not([type="file"])').each(function(h,d){var T=t(d),B=T.attr("type"),U=T.attr("data-name")||T.attr("name")||"Field "+(h+1);U=encodeURIComponent(U);var R=T.val();if(B==="checkbox")R=T.is(":checked");else if(B==="radio"){if(y[U]===null||typeof y[U]=="string")return;R=c.find('input[name="'+T.attr("name")+'"]:checked').val()||null}typeof R=="string"&&(R=t.trim(R)),y[U]=R,k=k||ge(T,B,U,R)}),k}function he(c){var y={};return c.find(':input[type="file"]').each(function(k,h){var d=t(h),T=d.attr("data-name")||d.attr("name")||"File "+(k+1),B=d.attr("data-value");typeof B=="string"&&(B=t.trim(B)),y[T]=B}),y}let ve={_mkto_trk:"marketo"};function Ce(){return document.cookie.split("; ").reduce(function(y,k){let h=k.split("="),d=h[0];if(d in ve){let T=ve[d],B=h.slice(1).join("=");y[T]=B}return y},{})}function ge(c,y,k,h){var d=null;return y==="password"?d="Passwords cannot be submitted.":c.attr("required")?h?J.test(c.attr("type"))&&(se.test(h)||(d="Please enter a valid email address for: "+k)):d="Please fill out the required field: "+k:k==="g-recaptcha-response"&&!h&&(d="Please confirm you\u2019re not a robot."),d}function x(c){E(c),l(c)}function u(c){q(c);var y=c.form,k={};if(/^https/.test(L.href)&&!/^https/.test(c.action)){y.attr("method","post");return}E(c);var h=ce(y,k);if(h)return K(h);Y(c);var d;f.each(k,function(R,ie){J.test(ie)&&(k.EMAIL=R),/^((full[ _-]?)?name)$/i.test(ie)&&(d=R),/^(first[ _-]?name)$/i.test(ie)&&(k.FNAME=R),/^(last[ _-]?name)$/i.test(ie)&&(k.LNAME=R)}),d&&!k.FNAME&&(d=d.split(" "),k.FNAME=d[0],k.LNAME=k.LNAME||d[1]);var T=c.action.replace("/post?","/post-json?")+"&c=?",B=T.indexOf("u=")+2;B=T.substring(B,T.indexOf("&",B));var U=T.indexOf("id=")+3;U=T.substring(U,T.indexOf("&",U)),k["b_"+B+"_"+U]="",t.ajax({url:T,data:k,dataType:"jsonp"}).done(function(R){c.success=R.result==="success"||/already/.test(R.msg),c.success||console.info("MailChimp error: "+R.msg),l(c)}).fail(function(){l(c)})}function l(c){var y=c.form,k=c.redirect,h=c.success;if(h&&k){Qe.location(k);return}c.done.toggle(h),c.fail.toggle(!h),h?c.done.focus():c.fail.focus(),y.toggle(!h),q(c)}function E(c){c.evt&&c.evt.preventDefault(),c.evt=null}function b(c,y){if(!y.fileUploads||!y.fileUploads[c])return;var k,h=t(y.fileUploads[c]),d=h.find("> .w-file-upload-default"),T=h.find("> .w-file-upload-uploading"),B=h.find("> .w-file-upload-success"),U=h.find("> .w-file-upload-error"),R=d.find(".w-file-upload-input"),ie=d.find(".w-file-upload-label"),Ae=ie.children(),te=U.find(".w-file-upload-error-msg"),n=B.find(".w-file-upload-file"),p=B.find(".w-file-remove-link"),_=n.find(".w-file-upload-file-name"),g=te.attr("data-w-size-error"),ae=te.attr("data-w-type-error"),Re=te.attr("data-w-generic-error");if(G||ie.on("click keydown",function(i){i.type==="keydown"&&i.which!==13&&i.which!==32||(i.preventDefault(),R.click())}),ie.find(".w-icon-file-upload-icon").attr("aria-hidden","true"),p.find(".w-icon-file-upload-remove").attr("aria-hidden","true"),G)R.on("click",function(i){i.preventDefault()}),ie.on("click",function(i){i.preventDefault()}),Ae.on("click",function(i){i.preventDefault()});else{p.on("click keydown",function(i){if(i.type==="keydown"){if(i.which!==13&&i.which!==32)return;i.preventDefault()}R.removeAttr("data-value"),R.val(""),_.html(""),d.toggle(!0),B.toggle(!1),ie.focus()}),R.on("change",function(i){k=i.target&&i.target.files&&i.target.files[0],k&&(d.toggle(!1),U.toggle(!1),T.toggle(!0),T.focus(),_.text(k.name),a()||Y(y),y.fileUploads[c].uploading=!0,P(k,r))});var Se=ie.outerHeight();R.height(Se),R.width(1)}function e(i){var s=i.responseJSON&&i.responseJSON.msg,O=Re;typeof s=="string"&&s.indexOf("InvalidFileTypeError")===0?O=ae:typeof s=="string"&&s.indexOf("MaxFileSizeError")===0&&(O=g),te.text(O),R.removeAttr("data-value"),R.val(""),T.toggle(!1),d.toggle(!0),U.toggle(!0),U.focus(),y.fileUploads[c].uploading=!1,a()||q(y)}function r(i,s){if(i)return e(i);var O=s.fileName,D=s.postData,oe=s.fileId,m=s.s3Url;R.attr("data-value",oe),I(m,D,k,O,o)}function o(i){if(i)return e(i);T.toggle(!1),B.css("display","inline-block"),B.focus(),y.fileUploads[c].uploading=!1,a()||q(y)}function a(){var i=y.fileUploads&&y.fileUploads.toArray()||[];return i.some(function(s){return s.uploading})}}function P(c,y){var k=new URLSearchParams({name:c.name,size:c.size});t.ajax({type:"GET",url:`${ee}?${k}`,crossDomain:!0}).done(function(h){y(null,h)}).fail(function(h){y(h)})}function I(c,y,k,h,d){var T=new FormData;for(var B in y)T.append(B,y[B]);T.append("file",k,h),t.ajax({type:"POST",url:c,data:T,processData:!1,contentType:!1}).done(function(){d(null)}).fail(function(U){d(U)})}return v})});var St=be((ln,At)=>{"use strict";var je=window.jQuery,Le={},Be=[],Lt=".w-ix",$e={reset:function(t,f){f.__wf_intro=null},intro:function(t,f){f.__wf_intro||(f.__wf_intro=!0,je(f).triggerHandler(Le.types.INTRO))},outro:function(t,f){f.__wf_intro&&(f.__wf_intro=null,je(f).triggerHandler(Le.types.OUTRO))}};Le.triggers={};Le.types={INTRO:"w-ix-intro"+Lt,OUTRO:"w-ix-outro"+Lt};Le.init=function(){for(var t=Be.length,f=0;f{"use strict";var Je=St();function Tt(t,f){var v=document.createEvent("CustomEvent");v.initCustomEvent(f,!0,!0,null),t.dispatchEvent(v)}var Gt=window.jQuery,Xe={},Ct=".w-ix",Zt={reset:function(t,f){Je.triggers.reset(t,f)},intro:function(t,f){Je.triggers.intro(t,f),Tt(f,"COMPONENT_ACTIVE")},outro:function(t,f){Je.triggers.outro(t,f),Tt(f,"COMPONENT_INACTIVE")}};Xe.triggers={};Xe.types={INTRO:"w-ix-intro"+Ct,OUTRO:"w-ix-outro"+Ct};Gt.extend(Xe.triggers,Zt);Mt.exports=Xe});var It=be((hn,Rt)=>{"use strict";var Fe=Te(),Qt=Ft(),de={ARROW_LEFT:37,ARROW_UP:38,ARROW_RIGHT:39,ARROW_DOWN:40,ESCAPE:27,SPACE:32,ENTER:13,HOME:36,END:35};Fe.define("navbar",Rt.exports=function(t,f){var v={},A=t.tram,$=t(window),L=t(document),N=f.debounce,S,W,J,se,K=Fe.env(),G='
',M=".w-nav",Z="w--open",ee="w--nav-dropdown-open",V="w--nav-dropdown-toggle-open",H="w--nav-dropdown-list-open",F="w--nav-link-open",w=Qt.triggers,Q=t();v.ready=v.design=v.preview=q,v.destroy=function(){Q=t(),Y(),W&&W.length&&W.each(Ce)};function q(){J=K&&Fe.env("design"),se=Fe.env("editor"),S=t(document.body),W=L.find(M),W.length&&(W.each(ve),Y(),ce())}function Y(){Fe.resize.off(he)}function ce(){Fe.resize.on(he)}function he(){W.each(d)}function ve(n,p){var _=t(p),g=t.data(p,M);g||(g=t.data(p,M,{open:!1,el:_,config:{},selectedIdx:-1})),g.menu=_.find(".w-nav-menu"),g.links=g.menu.find(".w-nav-link"),g.dropdowns=g.menu.find(".w-dropdown"),g.dropdownToggle=g.menu.find(".w-dropdown-toggle"),g.dropdownList=g.menu.find(".w-dropdown-list"),g.button=_.find(".w-nav-button"),g.container=_.find(".w-container"),g.overlayContainerId="w-nav-overlay-"+n,g.outside=k(g);var ae=_.find(".w-nav-brand");ae&&ae.attr("href")==="/"&&ae.attr("aria-label")==null&&ae.attr("aria-label","home"),g.button.attr("style","-webkit-user-select: text;"),g.button.attr("aria-label")==null&&g.button.attr("aria-label","menu"),g.button.attr("role","button"),g.button.attr("tabindex","0"),g.button.attr("aria-controls",g.overlayContainerId),g.button.attr("aria-haspopup","menu"),g.button.attr("aria-expanded","false"),g.el.off(M),g.button.off(M),g.menu.off(M),u(g),J?(ge(g),g.el.on("setting"+M,l(g))):(x(g),g.button.on("click"+M,c(g)),g.menu.on("click"+M,"a",y(g)),g.button.on("keydown"+M,E(g)),g.el.on("keydown"+M,b(g))),d(n,p)}function Ce(n,p){var _=t.data(p,M);_&&(ge(_),t.removeData(p,M))}function ge(n){n.overlay&&(te(n,!0),n.overlay.remove(),n.overlay=null)}function x(n){n.overlay||(n.overlay=t(G).appendTo(n.el),n.overlay.attr("id",n.overlayContainerId),n.parent=n.menu.parent(),te(n,!0))}function u(n){var p={},_=n.config||{},g=p.animation=n.el.attr("data-animation")||"default";p.animOver=/^over/.test(g),p.animDirect=/left$/.test(g)?-1:1,_.animation!==g&&n.open&&f.defer(I,n),p.easing=n.el.attr("data-easing")||"ease",p.easing2=n.el.attr("data-easing2")||"ease";var ae=n.el.attr("data-duration");p.duration=ae!=null?Number(ae):400,p.docHeight=n.el.attr("data-doc-height"),n.config=p}function l(n){return function(p,_){_=_||{};var g=$.width();u(n),_.open===!0&&ie(n,!0),_.open===!1&&te(n,!0),n.open&&f.defer(function(){g!==$.width()&&I(n)})}}function E(n){return function(p){switch(p.keyCode){case de.SPACE:case de.ENTER:return c(n)(),p.preventDefault(),p.stopPropagation();case de.ESCAPE:return te(n),p.preventDefault(),p.stopPropagation();case de.ARROW_RIGHT:case de.ARROW_DOWN:case de.HOME:case de.END:return n.open?(p.keyCode===de.END?n.selectedIdx=n.links.length-1:n.selectedIdx=0,P(n),p.preventDefault(),p.stopPropagation()):(p.preventDefault(),p.stopPropagation())}}}function b(n){return function(p){if(n.open)switch(n.selectedIdx=n.links.index(document.activeElement),p.keyCode){case de.HOME:case de.END:return p.keyCode===de.END?n.selectedIdx=n.links.length-1:n.selectedIdx=0,P(n),p.preventDefault(),p.stopPropagation();case de.ESCAPE:return te(n),n.button.focus(),p.preventDefault(),p.stopPropagation();case de.ARROW_LEFT:case de.ARROW_UP:return n.selectedIdx=Math.max(-1,n.selectedIdx-1),P(n),p.preventDefault(),p.stopPropagation();case de.ARROW_RIGHT:case de.ARROW_DOWN:return n.selectedIdx=Math.min(n.links.length-1,n.selectedIdx+1),P(n),p.preventDefault(),p.stopPropagation()}}}function P(n){if(n.links[n.selectedIdx]){var p=n.links[n.selectedIdx];p.focus(),y(p)}}function I(n){n.open&&(te(n,!0),ie(n,!0))}function c(n){return N(function(){n.open?te(n):ie(n)})}function y(n){return function(p){var _=t(this),g=_.attr("href");if(!Fe.validClick(p.currentTarget)){p.preventDefault();return}g&&g.indexOf("#")===0&&n.open&&te(n)}}function k(n){return n.outside&&L.off("click"+M,n.outside),function(p){var _=t(p.target);se&&_.closest(".w-editor-bem-EditorOverlay").length||h(n,_)}}var h=N(function(n,p){if(n.open){var _=p.closest(".w-nav-menu");n.menu.is(_)||te(n)}});function d(n,p){var _=t.data(p,M),g=_.collapsed=_.button.css("display")!=="none";if(_.open&&!g&&!J&&te(_,!0),_.container.length){var ae=B(_);_.links.each(ae),_.dropdowns.each(ae)}_.open&&Ae(_)}var T="max-width";function B(n){var p=n.container.css(T);return p==="none"&&(p=""),function(_,g){g=t(g),g.css(T,""),g.css(T)==="none"&&g.css(T,p)}}function U(n,p){p.setAttribute("data-nav-menu-open","")}function R(n,p){p.removeAttribute("data-nav-menu-open")}function ie(n,p){if(n.open)return;n.open=!0,n.menu.each(U),n.links.addClass(F),n.dropdowns.addClass(ee),n.dropdownToggle.addClass(V),n.dropdownList.addClass(H),n.button.addClass(Z);var _=n.config,g=_.animation;(g==="none"||!A.support.transform||_.duration<=0)&&(p=!0);var ae=Ae(n),Re=n.menu.outerHeight(!0),Se=n.menu.outerWidth(!0),e=n.el.height(),r=n.el[0];if(d(0,r),w.intro(0,r),Fe.redraw.up(),J||L.on("click"+M,n.outside),p){i();return}var o="transform "+_.duration+"ms "+_.easing;if(n.overlay&&(Q=n.menu.prev(),n.overlay.show().append(n.menu)),_.animOver){A(n.menu).add(o).set({x:_.animDirect*Se,height:ae}).start({x:0}).then(i),n.overlay&&n.overlay.width(Se);return}var a=e+Re;A(n.menu).add(o).set({y:-a}).start({y:0}).then(i);function i(){n.button.attr("aria-expanded","true")}}function Ae(n){var p=n.config,_=p.docHeight?L.height():S.height();return p.animOver?n.menu.height(_):n.el.css("position")!=="fixed"&&(_-=n.el.outerHeight(!0)),n.overlay&&n.overlay.height(_),_}function te(n,p){if(!n.open)return;n.open=!1,n.button.removeClass(Z);var _=n.config;if((_.animation==="none"||!A.support.transform||_.duration<=0)&&(p=!0),w.outro(0,n.el[0]),L.off("click"+M,n.outside),p){A(n.menu).stop(),r();return}var g="transform "+_.duration+"ms "+_.easing2,ae=n.menu.outerHeight(!0),Re=n.menu.outerWidth(!0),Se=n.el.height();if(_.animOver){A(n.menu).add(g).start({x:Re*_.animDirect}).then(r);return}var e=Se+ae;A(n.menu).add(g).start({y:-e}).then(r);function r(){n.menu.height(""),A(n.menu).set({x:0,y:0}),n.menu.each(R),n.links.removeClass(F),n.dropdowns.removeClass(ee),n.dropdownToggle.removeClass(V),n.dropdownList.removeClass(H),n.overlay&&n.overlay.children().length&&(Q.length?n.menu.insertAfter(Q):n.menu.prependTo(n.parent),n.overlay.attr("style","").hide()),n.el.triggerHandler("w-close"),n.button.attr("aria-expanded","false")}}return v})});dt();vt();gt();bt();Et();kt();Ot();It();})(); +/*! + * tram.js v0.8.2-global + * Cross-browser CSS3 transitions in JavaScript + * https://github.com/bkwld/tram + * MIT License + */ +/*! + * Webflow._ (aka) Underscore.js 1.6.0 (custom build) + * + * http://underscorejs.org + * (c) 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + * Underscore may be freely distributed under the MIT license. + * @license MIT + */ -- 2.46.2 From bad3c5e0d382b2dd68ca0d4a21d387a5525b77a1 Mon Sep 17 00:00:00 2001 From: Isaac Mills Date: Sun, 7 Apr 2024 14:32:45 -0400 Subject: [PATCH 06/11] Add Open Graph to articles --- templates/article.html | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/templates/article.html b/templates/article.html index d810462..f812049 100644 --- a/templates/article.html +++ b/templates/article.html @@ -6,6 +6,16 @@ {{title}} + + + + + {% for author in authors %} + + + + {% endfor %} + @@ -53,4 +63,4 @@ - + \ No newline at end of file -- 2.46.2 From 2300b0aefaa22b9b20e158578093117adc3c7d44 Mon Sep 17 00:00:00 2001 From: Isaac Mills Date: Sun, 7 Apr 2024 14:38:34 -0400 Subject: [PATCH 07/11] Canonicalize og:image --- templates/article.html | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/templates/article.html b/templates/article.html index f812049..36e68e4 100644 --- a/templates/article.html +++ b/templates/article.html @@ -7,7 +7,8 @@ {{title}} - + + {% for author in authors %} -- 2.46.2 From c617d6e6fad9ff7bd9b6724774104f7e391925cb Mon Sep 17 00:00:00 2001 From: Isaac Mills Date: Sun, 7 Apr 2024 14:40:28 -0400 Subject: [PATCH 08/11] Make og:image a PNG --- templates/article.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/templates/article.html b/templates/article.html index 36e68e4..8bf21d4 100644 --- a/templates/article.html +++ b/templates/article.html @@ -7,8 +7,8 @@ {{title}} - - + + {% for author in authors %} -- 2.46.2 From 78ab45bb97801fd9a2e3f04eef25ad0f62db9555 Mon Sep 17 00:00:00 2001 From: Isaac Mills Date: Sun, 7 Apr 2024 14:43:41 -0400 Subject: [PATCH 09/11] Canonicalize og:image --- templates/article.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/templates/article.html b/templates/article.html index 8bf21d4..98b2258 100644 --- a/templates/article.html +++ b/templates/article.html @@ -7,8 +7,8 @@ {{title}} - - + + {% for author in authors %} @@ -64,4 +64,4 @@ - \ No newline at end of file + -- 2.46.2 From 8b8c68632d9b7883ff05b369eb2ce4cfeb410f03 Mon Sep 17 00:00:00 2001 From: Isaac Mills Date: Sun, 7 Apr 2024 14:46:50 -0400 Subject: [PATCH 10/11] Add more og:image metadata --- templates/article.html | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/templates/article.html b/templates/article.html index 98b2258..e5846a6 100644 --- a/templates/article.html +++ b/templates/article.html @@ -9,6 +9,9 @@ + + + {% for author in authors %} @@ -64,4 +67,4 @@ - + \ No newline at end of file -- 2.46.2 From 09adcb2ad9e5e2f118fb105e6c6f655f54a81cef Mon Sep 17 00:00:00 2001 From: Isaac Mills Date: Sun, 7 Apr 2024 14:47:29 -0400 Subject: [PATCH 11/11] Add more og:image metadata --- templates/article.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/templates/article.html b/templates/article.html index e5846a6..517cac3 100644 --- a/templates/article.html +++ b/templates/article.html @@ -7,8 +7,8 @@ {{title}} - - + + -- 2.46.2