Date: Wed, 4 Apr 2018 18:26:19 +0530
Subject: [PATCH 114/915] update changelog
---
Changelog | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/Changelog b/Changelog
index 899849ff..de1c0d8a 100644
--- a/Changelog
+++ b/Changelog
@@ -1,3 +1,5 @@
+next:
+ * #4378: [dcl cms] update CMS Integration to have different content for different domains
1.6.2: 2018-04-01:
* bgfix: [dcl] Fix user activation email style; add/correct some DE text
* #4373: [dcl] update footer menu for pw reset/login/signup/activation request pages
@@ -70,7 +72,7 @@
* [cms] Introduce UngleichHeaderBackgroundImageAndTextSliderPlugin that allows to have scrolling images and texts
* [cms] Remove tag for ungleich cms customer item template
1.2.12: 2017-12-09
- * #3594: [digitalglarus] Remove white scroll bar on the right in mobile
+ * #3594: [digitalglarus] Remove white scroll bar on the right in mobile
* #3905: [ungleich] Update ungleich.ch header into a slider
* #3968: [ungleich] Fix navbar logo alignment
* [all] Enable logging custom modules
From 80f4ac52e87ca44331b37c0ad3c4fc27f8b338a3 Mon Sep 17 00:00:00 2001
From: Arvind Tiwari
Date: Wed, 4 Apr 2018 18:36:45 +0530
Subject: [PATCH 115/915] update changelog
---
Changelog | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/Changelog b/Changelog
index 899849ff..86a30b00 100644
--- a/Changelog
+++ b/Changelog
@@ -1,3 +1,5 @@
+next:
+ * bgfix: [cms] header btn external link fix
1.6.2: 2018-04-01:
* bgfix: [dcl] Fix user activation email style; add/correct some DE text
* #4373: [dcl] update footer menu for pw reset/login/signup/activation request pages
@@ -70,7 +72,7 @@
* [cms] Introduce UngleichHeaderBackgroundImageAndTextSliderPlugin that allows to have scrolling images and texts
* [cms] Remove tag for ungleich cms customer item template
1.2.12: 2017-12-09
- * #3594: [digitalglarus] Remove white scroll bar on the right in mobile
+ * #3594: [digitalglarus] Remove white scroll bar on the right in mobile
* #3905: [ungleich] Update ungleich.ch header into a slider
* #3968: [ungleich] Fix navbar logo alignment
* [all] Enable logging custom modules
From 5cb51db6d703192bfb51d96400bb03471534a487 Mon Sep 17 00:00:00 2001
From: PCoder
Date: Thu, 5 Apr 2018 23:31:47 +0200
Subject: [PATCH 116/915] Update .travis.yml
Add code to compile .po files before beginning tests
---
.travis.yml | 1 +
1 file changed, 1 insertion(+)
diff --git a/.travis.yml b/.travis.yml
index 6a3cca25..3a3d7027 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -9,6 +9,7 @@ env:
install: "pip install -r requirements.txt"
script:
- flake8
+- python manage.py compilemessages
- python manage.py test -v 3
# - coverage run --source='.' manage.py test dynamicweb -v 3
# - coverage report
From 1e81587551a9cdad583690320b1654151960e719 Mon Sep 17 00:00:00 2001
From: Arvind Tiwari
Date: Fri, 6 Apr 2018 03:20:44 +0530
Subject: [PATCH 117/915] Update Changelog
---
Changelog | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/Changelog b/Changelog
index 806d56ff..811bc44c 100644
--- a/Changelog
+++ b/Changelog
@@ -1,7 +1,7 @@
-next:
- * bgfix: [cms] header btn external link fix
+1.6.3: 2018-04-05
+ * #4377: [cms] header btn external link fix
* #4378: [dcl cms] update CMS Integration to have different content for different domains
-1.6.2: 2018-04-01:
+1.6.2: 2018-04-01
* bgfix: [dcl] Fix user activation email style; add/correct some DE text
* #4373: [dcl] update footer menu for pw reset/login/signup/activation request pages
1.6.1: 2018-03-28
From 28de423a1475f1fc4f167311be292a4ab41d34eb Mon Sep 17 00:00:00 2001
From: PCoder
Date: Fri, 6 Apr 2018 00:51:44 +0200
Subject: [PATCH 118/915] Add VMPricing model
---
datacenterlight/models.py | 13 +++++++++++++
1 file changed, 13 insertions(+)
diff --git a/datacenterlight/models.py b/datacenterlight/models.py
index 6fcf24a9..01ddfdcf 100644
--- a/datacenterlight/models.py
+++ b/datacenterlight/models.py
@@ -12,6 +12,19 @@ class VMTemplate(models.Model):
return vm_template
+class VMPricing(models.Model):
+ name = models.CharField(max_length=255, unique=True)
+ vat_inclusive = models.BooleanField(default=True)
+ vat_percentage = models.DecimalField(decimal_places=2, blank=True)
+ cores_unit_price = models.DecimalField(decimal_places=2, default=0)
+ ram_unit_price = models.DecimalField(decimal_places=2, default= 0)
+ ssd_unit_price = models.DecimalField(decimal_places=2, default=0)
+ hdd_unit_price = models.DecimalField(decimal_places=2, default=0)
+
+ def __str__(self):
+ return self.name
+
+
class StripePlan(models.Model):
"""
A model to store Data Center Light's created Stripe plans
From 9fca25ec5a4c1e8c264888f029d19fe01e0b5eeb Mon Sep 17 00:00:00 2001
From: PCoder
Date: Fri, 6 Apr 2018 20:28:15 +0200
Subject: [PATCH 119/915] Update Changelog
---
Changelog | 2 ++
1 file changed, 2 insertions(+)
diff --git a/Changelog b/Changelog
index 811bc44c..d3991e4c 100644
--- a/Changelog
+++ b/Changelog
@@ -1,3 +1,5 @@
+Next:
+ * #4362: [cms] Fix the need of dummy home page for different CMS-based sites
1.6.3: 2018-04-05
* #4377: [cms] header btn external link fix
* #4378: [dcl cms] update CMS Integration to have different content for different domains
From c167e1ca944d4c97828e48064d4d103bdbb48438 Mon Sep 17 00:00:00 2001
From: PCoder
Date: Fri, 6 Apr 2018 22:31:39 +0200
Subject: [PATCH 120/915] Update Changelog for 1.6.4
---
Changelog | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Changelog b/Changelog
index d3991e4c..49459422 100644
--- a/Changelog
+++ b/Changelog
@@ -1,4 +1,4 @@
-Next:
+1.6.4: 2018-04-06
* #4362: [cms] Fix the need of dummy home page for different CMS-based sites
1.6.3: 2018-04-05
* #4377: [cms] header btn external link fix
From 24a9b8ab78eff5e414c791bc9c659714857ab99c Mon Sep 17 00:00:00 2001
From: PCoder
Date: Sat, 7 Apr 2018 00:13:24 +0200
Subject: [PATCH 121/915] Redirect multi-tenant urls to /cms also
---
dynamicweb/urls_multi.py | 2 ++
1 file changed, 2 insertions(+)
diff --git a/dynamicweb/urls_multi.py b/dynamicweb/urls_multi.py
index 752c353e..ffe59db5 100644
--- a/dynamicweb/urls_multi.py
+++ b/dynamicweb/urls_multi.py
@@ -3,10 +3,12 @@ from django.conf.urls import include, url
from django.conf.urls.i18n import i18n_patterns
from django.contrib import admin
from django.views import static as static_view
+from django.views.generic import RedirectView
urlpatterns = i18n_patterns(
url(r'^admin/', include(admin.site.urls)),
url(r'^cms/', include('cms.urls')),
+ url(r'^$', RedirectView.as_view(url='/cms')),
)
urlpatterns += [
From ffe4eb41239a019b9a90d9f3eecce9a66baffa2e Mon Sep 17 00:00:00 2001
From: PCoder
Date: Sat, 7 Apr 2018 10:25:21 +0200
Subject: [PATCH 122/915] Use REDIRECT_TO_CMS and MULTISITE_CMS_FALLBACK to
construct /hosting footer urls
---
.../templates/datacenterlight/includes/_footer.html | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/datacenterlight/templates/datacenterlight/includes/_footer.html b/datacenterlight/templates/datacenterlight/includes/_footer.html
index 7d27eaef..4be5b928 100644
--- a/datacenterlight/templates/datacenterlight/includes/_footer.html
+++ b/datacenterlight/templates/datacenterlight/includes/_footer.html
@@ -4,15 +4,15 @@
From 399c91d636dbe775ccdc00614a74484c6d7dd91c Mon Sep 17 00:00:00 2001
From: PCoder
Date: Sat, 7 Apr 2018 12:51:40 +0200
Subject: [PATCH 123/915] Add HostingContextMixin that sets the REDIRECT_TO_CMS
and MULTISITE_CMS_FALLBACK urls
---
hosting/mixins.py | 17 +++++++++++++++++
1 file changed, 17 insertions(+)
diff --git a/hosting/mixins.py b/hosting/mixins.py
index 666cbcbe..7ef05581 100644
--- a/hosting/mixins.py
+++ b/hosting/mixins.py
@@ -1,4 +1,7 @@
+from cms.models.pagemodel import Page
from django.shortcuts import redirect
+from django.conf import settings
+from django.contrib.sites.models import Site
from django.core.urlresolvers import reverse
from opennebula_api.serializers import VirtualMachineTemplateSerializer
@@ -24,3 +27,17 @@ class ProcessVMSelectionMixin(object):
request.session['next'] = reverse('hosting:payment')
return redirect(reverse('hosting:login'))
return redirect(reverse('hosting:payment'))
+
+
+class HostingContextMixin(object):
+ def get_context_data(self, **kwargs):
+ context = super().get_context_data(**kwargs)
+ context['REDIRECT_TO_CMS'] = (Page
+ .objects
+ .filter(site_id=Site
+ .objects
+ .get_current()
+ .id)
+ .count())
+ context['MULTISITE_CMS_FALLBACK'] = settings.MULTISITE_CMS_FALLBACK
+ return context
From f911d6b4035e068701d4563025811ee5cb68eb64 Mon Sep 17 00:00:00 2001
From: PCoder
Date: Sat, 7 Apr 2018 12:53:53 +0200
Subject: [PATCH 124/915] Add HostingContextMixin to various hosting views
---
hosting/views.py | 18 ++++++++++--------
1 file changed, 10 insertions(+), 8 deletions(-)
diff --git a/hosting/views.py b/hosting/views.py
index 8e7380fb..7c11e1f6 100644
--- a/hosting/views.py
+++ b/hosting/views.py
@@ -54,7 +54,7 @@ from .forms import (
HostingUserSignupForm, HostingUserLoginForm, UserHostingKeyForm,
generate_ssh_key_name
)
-from .mixins import ProcessVMSelectionMixin
+from .mixins import ProcessVMSelectionMixin, HostingContextMixin
from .models import (
HostingOrder, HostingBill, HostingPlan, UserHostingKey, VMDetail
)
@@ -213,13 +213,13 @@ class IndexView(View):
return render(request, self.template_name, context)
-class LoginView(LoginViewMixin):
+class LoginView(HostingContextMixin, LoginViewMixin):
template_name = "hosting/login.html"
form_class = HostingUserLoginForm
success_url = reverse_lazy('hosting:dashboard')
-class SignupView(CreateView):
+class SignupView(HostingContextMixin, CreateView):
template_name = 'hosting/signup.html'
form_class = HostingUserSignupForm
model = CustomUser
@@ -248,7 +248,7 @@ class SignupView(CreateView):
return super(SignupView, self).get(request, *args, **kwargs)
-class SignupValidateView(TemplateView):
+class SignupValidateView(HostingContextMixin, TemplateView):
template_name = "hosting/signup_validate.html"
def get_context_data(self, **kwargs):
@@ -272,7 +272,7 @@ class SignupValidateView(TemplateView):
return context
-class SignupValidatedView(SignupValidateView):
+class SignupValidatedView(HostingContextMixin, SignupValidateView):
template_name = "hosting/signup_validate.html"
def get_context_data(self, **kwargs):
@@ -325,7 +325,8 @@ class SignupValidatedView(SignupValidateView):
return super(SignupValidatedView, self).get(request, *args, **kwargs)
-class ResendActivationEmailView(ResendActivationLinkViewMixin):
+class ResendActivationEmailView(HostingContextMixin,
+ ResendActivationLinkViewMixin):
template_name = 'hosting/resend_activation_link.html'
form_class = ResendActivationEmailForm
success_url = reverse_lazy('hosting:login')
@@ -333,7 +334,7 @@ class ResendActivationEmailView(ResendActivationLinkViewMixin):
email_template_name = 'user_activation'
-class PasswordResetView(PasswordResetViewMixin):
+class PasswordResetView(HostingContextMixin, PasswordResetViewMixin):
site = 'dcl'
template_name = 'hosting/reset_password.html'
form_class = PasswordResetRequestForm
@@ -341,7 +342,8 @@ class PasswordResetView(PasswordResetViewMixin):
template_email_path = 'hosting/emails/'
-class PasswordResetConfirmView(PasswordResetConfirmViewMixin):
+class PasswordResetConfirmView(HostingContextMixin,
+ PasswordResetConfirmViewMixin):
template_name = 'hosting/confirm_reset_password.html'
success_url = reverse_lazy('hosting:login')
From c6e3963303728b98ac2b4dcf1fd30ca7d7c164d4 Mon Sep 17 00:00:00 2001
From: PCoder
Date: Sat, 7 Apr 2018 12:55:32 +0200
Subject: [PATCH 125/915] Update footer links in dcl _footer.html
---
.../templates/datacenterlight/includes/_footer.html | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/datacenterlight/templates/datacenterlight/includes/_footer.html b/datacenterlight/templates/datacenterlight/includes/_footer.html
index 4be5b928..1fb1b963 100644
--- a/datacenterlight/templates/datacenterlight/includes/_footer.html
+++ b/datacenterlight/templates/datacenterlight/includes/_footer.html
@@ -4,11 +4,11 @@
- {% trans "Home" %}
+ {% trans "Home" %}
- {% trans "Contact" %}
+ {% trans "Contact" %}
From 178ff8da382b687046a3581f83e381442c1be7ea Mon Sep 17 00:00:00 2001
From: PCoder
Date: Sat, 7 Apr 2018 13:13:53 +0200
Subject: [PATCH 126/915] CMS home page can now be accessed at /cms/ for all
sites
---
datacenterlight/urls.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/datacenterlight/urls.py b/datacenterlight/urls.py
index af8e76f2..006e7fc3 100644
--- a/datacenterlight/urls.py
+++ b/datacenterlight/urls.py
@@ -13,7 +13,7 @@ urlpatterns = [
url(r'^g/$', IndexView.as_view(), name='index_g'),
url(r'^f/$', IndexView.as_view(), name='index_f'),
url(r'^l/$', IndexView.as_view(), name='index_l'),
- url(r'^new/$', RedirectView.as_view(url='/cms/datacenterlight/'),
+ url(r'^new/$', RedirectView.as_view(url='/cms/'),
name='cms_index'),
url(r'^whydatacenterlight/?$', WhyDataCenterLightView.as_view(),
name='whydatacenterlight'),
From 7b1cb975df344c8739b3c86ccf3c0621cee09847 Mon Sep 17 00:00:00 2001
From: PCoder
Date: Sat, 7 Apr 2018 13:15:44 +0200
Subject: [PATCH 127/915] Fix Method Resolution Order
---
hosting/views.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/hosting/views.py b/hosting/views.py
index 7c11e1f6..59239b96 100644
--- a/hosting/views.py
+++ b/hosting/views.py
@@ -272,7 +272,7 @@ class SignupValidateView(HostingContextMixin, TemplateView):
return context
-class SignupValidatedView(HostingContextMixin, SignupValidateView):
+class SignupValidatedView(SignupValidateView, HostingContextMixin):
template_name = "hosting/signup_validate.html"
def get_context_data(self, **kwargs):
From 698cf7f1ee3190ca7213607add6b4f58ff77ba67 Mon Sep 17 00:00:00 2001
From: PCoder
Date: Sat, 7 Apr 2018 13:16:36 +0200
Subject: [PATCH 128/915] Fix link in signup message
---
hosting/views.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/hosting/views.py b/hosting/views.py
index 59239b96..6e143760 100644
--- a/hosting/views.py
+++ b/hosting/views.py
@@ -307,7 +307,7 @@ class SignupValidatedView(SignupValidateView, HostingContextMixin):
email.send()
else:
home_url = 'Data Center Light '
message = '{sorry_message} {go_back_to} {hurl}'.format(
sorry_message=_("Sorry. Your request is invalid."),
From c3dff3155e13b9cbc4df5318069dcd5a67171af3 Mon Sep 17 00:00:00 2001
From: PCoder
Date: Sun, 8 Apr 2018 00:29:39 +0200
Subject: [PATCH 129/915] Redirect the contact link to dcl always
---
datacenterlight/templates/datacenterlight/includes/_footer.html | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/datacenterlight/templates/datacenterlight/includes/_footer.html b/datacenterlight/templates/datacenterlight/includes/_footer.html
index 1fb1b963..9583271e 100644
--- a/datacenterlight/templates/datacenterlight/includes/_footer.html
+++ b/datacenterlight/templates/datacenterlight/includes/_footer.html
@@ -8,7 +8,7 @@
- {% trans "Contact" %}
+ {% trans "Contact" %}
From 30d7785700c597507327e5914f5fa8230325b101 Mon Sep 17 00:00:00 2001
From: PCoder
Date: Sun, 8 Apr 2018 08:36:00 +0200
Subject: [PATCH 130/915] Redirect to DCL home on hosting footer for all
domains
---
datacenterlight/templates/datacenterlight/includes/_footer.html | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/datacenterlight/templates/datacenterlight/includes/_footer.html b/datacenterlight/templates/datacenterlight/includes/_footer.html
index 9583271e..c4950807 100644
--- a/datacenterlight/templates/datacenterlight/includes/_footer.html
+++ b/datacenterlight/templates/datacenterlight/includes/_footer.html
@@ -4,7 +4,7 @@
- {% trans "Home" %}
+ {% trans "Home" %}
From fb7ccff5847658a6fd6b25b57c8f3ddb5f08c172 Mon Sep 17 00:00:00 2001
From: Arvind Tiwari
Date: Mon, 9 Apr 2018 01:11:45 +0530
Subject: [PATCH 131/915] remove old migrations from squashed migration
---
datacenterlight/migrations/0018_auto_20180403_1930.py | 2 --
1 file changed, 2 deletions(-)
diff --git a/datacenterlight/migrations/0018_auto_20180403_1930.py b/datacenterlight/migrations/0018_auto_20180403_1930.py
index 5c418898..a894c66b 100644
--- a/datacenterlight/migrations/0018_auto_20180403_1930.py
+++ b/datacenterlight/migrations/0018_auto_20180403_1930.py
@@ -8,8 +8,6 @@ import django.db.models.deletion
class Migration(migrations.Migration):
- replaces = [('datacenterlight', '0018_auto_20180403_1930'), ('datacenterlight', '0019_auto_20180403_2054')]
-
dependencies = [
('datacenterlight', '0017_auto_20180329_0056'),
('sites', '0002_alter_domain_unique'),
From ff1908d2e6de295d121f4f0b94f156fa12897be2 Mon Sep 17 00:00:00 2001
From: Arvind Tiwari
Date: Mon, 9 Apr 2018 01:52:49 +0530
Subject: [PATCH 132/915] added navbar-transparent styles to glasfaser.css
---
datacenterlight/static/datacenterlight/css/common.css | 5 ++++-
.../static/datacenterlight/css/landing-page.css | 4 ----
ungleich_page/static/ungleich_page/css/glasfaser.css | 8 +++++---
3 files changed, 9 insertions(+), 8 deletions(-)
diff --git a/datacenterlight/static/datacenterlight/css/common.css b/datacenterlight/static/datacenterlight/css/common.css
index 88db9376..895256ef 100644
--- a/datacenterlight/static/datacenterlight/css/common.css
+++ b/datacenterlight/static/datacenterlight/css/common.css
@@ -74,6 +74,10 @@ a.list-group-item-danger.active:focus {
padding: 10px;
}
+.navbar-brand > img {
+ height: 100%;
+}
+
#logoWhite,
.navbar-transparent #logoBlack {
display: none;
@@ -82,7 +86,6 @@ a.list-group-item-danger.active:focus {
#logoBlack,
.navbar-transparent #logoWhite {
display: block;
- width: 220px;
}
@media (min-width: 768px) {
diff --git a/datacenterlight/static/datacenterlight/css/landing-page.css b/datacenterlight/static/datacenterlight/css/landing-page.css
index 41c5a42f..33bf6425 100755
--- a/datacenterlight/static/datacenterlight/css/landing-page.css
+++ b/datacenterlight/static/datacenterlight/css/landing-page.css
@@ -89,10 +89,6 @@ textarea {
border-radius: 6px;
}
-.navbar-brand > img {
- max-height: 30px;
-}
-
@media (max-width: 767px) {
.navbar-default .navbar-nav>li>a{
font-weight: 400;
diff --git a/ungleich_page/static/ungleich_page/css/glasfaser.css b/ungleich_page/static/ungleich_page/css/glasfaser.css
index b9062087..a3262aaf 100644
--- a/ungleich_page/static/ungleich_page/css/glasfaser.css
+++ b/ungleich_page/static/ungleich_page/css/glasfaser.css
@@ -1,9 +1,11 @@
-.topnav img {
- height: 100%;
+#logoWhite,
+.navbar-transparent #logoBlack {
+ display: none;
}
+#logoBlack,
.navbar-transparent #logoWhite {
- width: 140px;
+ display: block;
}
.navbar-default {
From e6629a1357a14e8e097332dbc3301e8e2c909efa Mon Sep 17 00:00:00 2001
From: Arvind Tiwari
Date: Mon, 9 Apr 2018 02:00:42 +0530
Subject: [PATCH 133/915] update changelog
---
Changelog | 3 +++
1 file changed, 3 insertions(+)
diff --git a/Changelog b/Changelog
index 49459422..a325a822 100644
--- a/Changelog
+++ b/Changelog
@@ -1,3 +1,6 @@
+next:
+ * #4327: [dcl] fix navbar logo repeat
+ * bgfix: [dcl] remove ghost migrations from squashed migration
1.6.4: 2018-04-06
* #4362: [cms] Fix the need of dummy home page for different CMS-based sites
1.6.3: 2018-04-05
From f4b6949d3922496cd5f2225c8205abb71c706d98 Mon Sep 17 00:00:00 2001
From: Arvind Tiwari
Date: Mon, 9 Apr 2018 02:16:57 +0530
Subject: [PATCH 134/915] corrected favicon link on pages
---
.../templates/new_base_glarus_c.html | 26 +++++++++----------
.../cms/ungleichch/base_ungleich.html | 2 ++
.../templates/ungleich_page/404.html | 2 +-
3 files changed, 16 insertions(+), 14 deletions(-)
diff --git a/digitalglarus/templates/new_base_glarus_c.html b/digitalglarus/templates/new_base_glarus_c.html
index edef1751..918b27b0 100644
--- a/digitalglarus/templates/new_base_glarus_c.html
+++ b/digitalglarus/templates/new_base_glarus_c.html
@@ -57,7 +57,7 @@
ga('send', 'pageview');
-
+
+This site uses cookies for analytics. By continuing to browse this site, you agree to use this.
Learn more Accept
+
+
+
+
+
+
+
+
Some text in the modal.
+
+
+
+
+
+
+
+
+{% endif %}
\ No newline at end of file
From 44fb184436e74f11fa3c8b218cb292b8c03ce7b7 Mon Sep 17 00:00:00 2001
From: PCoder
Date: Sat, 21 Jul 2018 10:49:58 +0200
Subject: [PATCH 366/915] Add templates/gdpr to the template path
---
dynamicweb/settings/base.py | 1 +
1 file changed, 1 insertion(+)
diff --git a/dynamicweb/settings/base.py b/dynamicweb/settings/base.py
index 7d333a2f..5a1cd2e4 100644
--- a/dynamicweb/settings/base.py
+++ b/dynamicweb/settings/base.py
@@ -192,6 +192,7 @@ TEMPLATES = [
os.path.join(PROJECT_DIR,
'ungleich_page/templates/ungleich_page'),
os.path.join(PROJECT_DIR, 'templates/analytics'),
+ os.path.join(PROJECT_DIR, 'templates/gdpr'),
],
'APP_DIRS': True,
'OPTIONS': {
From 4dce0ee5bde98e96654adcebc19ac21b1bf72bcc Mon Sep 17 00:00:00 2001
From: PCoder
Date: Sat, 21 Jul 2018 10:51:11 +0200
Subject: [PATCH 367/915] Add gdpr banner to dcl template
---
datacenterlight/templates/datacenterlight/base.html | 2 +-
datacenterlight/templates/datacenterlight/cms/base.html | 1 +
2 files changed, 2 insertions(+), 1 deletion(-)
diff --git a/datacenterlight/templates/datacenterlight/base.html b/datacenterlight/templates/datacenterlight/base.html
index 75cb8de2..4bff9f59 100644
--- a/datacenterlight/templates/datacenterlight/base.html
+++ b/datacenterlight/templates/datacenterlight/base.html
@@ -43,7 +43,7 @@
-
+ {% include "gdpr_banner.html" %}
{% block navbar %}
{% include "datacenterlight/includes/_navbar.html" %}
{% endblock navbar %}
diff --git a/datacenterlight/templates/datacenterlight/cms/base.html b/datacenterlight/templates/datacenterlight/cms/base.html
index a614db67..c155a55d 100644
--- a/datacenterlight/templates/datacenterlight/cms/base.html
+++ b/datacenterlight/templates/datacenterlight/cms/base.html
@@ -49,6 +49,7 @@
+ {% include "gdpr_banner.html" %}
{% cms_toolbar %}
{% placeholder 'datacenterlight_navbar' %}
From 069cd18268395d75ca96f4af99583a991c2df353 Mon Sep 17 00:00:00 2001
From: PCoder
Date: Sat, 21 Jul 2018 13:27:15 +0200
Subject: [PATCH 368/915] Add gdpr banner to all base templates
---
datacenterlight/templates/datacenterlight/base_hosting.html | 1 +
hosting/templates/hosting/base.html | 1 +
hosting/templates/hosting/base_short.html | 1 +
ungleich/templates/cms/ungleichch/base_ungleich.html | 1 +
ungleich_page/templates/ungleich_page/glasfaser.html | 1 +
ungleich_page/templates/ungleich_page/glasfaser_cms_page.html | 1 +
ungleich_page/templates/ungleich_page/landing.html | 2 +-
ungleich_page/templates/ungleich_page/ungleich_cms_page.html | 4 +++-
8 files changed, 10 insertions(+), 2 deletions(-)
diff --git a/datacenterlight/templates/datacenterlight/base_hosting.html b/datacenterlight/templates/datacenterlight/base_hosting.html
index e863d46b..e50c4975 100644
--- a/datacenterlight/templates/datacenterlight/base_hosting.html
+++ b/datacenterlight/templates/datacenterlight/base_hosting.html
@@ -49,6 +49,7 @@
+ {% include "gdpr_banner.html" %}
{% cms_toolbar %}
{% render_placeholder cms_integration.navbar_placeholder %}
diff --git a/hosting/templates/hosting/base.html b/hosting/templates/hosting/base.html
index cbf0874f..aca42e0f 100644
--- a/hosting/templates/hosting/base.html
+++ b/hosting/templates/hosting/base.html
@@ -48,6 +48,7 @@
+ {% include "gdpr_banner.html" %}
{% include "hosting/includes/_navbar.html" %}
diff --git a/hosting/templates/hosting/base_short.html b/hosting/templates/hosting/base_short.html
index 63f2b499..18ed3e26 100644
--- a/hosting/templates/hosting/base_short.html
+++ b/hosting/templates/hosting/base_short.html
@@ -51,6 +51,7 @@
+ {% include "gdpr_banner.html" %}
{% cms_toolbar %}
{% block navbar %}
diff --git a/ungleich/templates/cms/ungleichch/base_ungleich.html b/ungleich/templates/cms/ungleichch/base_ungleich.html
index ba314b25..74a0b985 100644
--- a/ungleich/templates/cms/ungleichch/base_ungleich.html
+++ b/ungleich/templates/cms/ungleichch/base_ungleich.html
@@ -43,6 +43,7 @@
+ {% include "gdpr_banner.html" %}
{% cms_toolbar %}
{% show_menu 0 0 0 1 "cms/ungleichch/_menu.html" %}
diff --git a/ungleich_page/templates/ungleich_page/glasfaser.html b/ungleich_page/templates/ungleich_page/glasfaser.html
index e1c350aa..a2e2c33e 100644
--- a/ungleich_page/templates/ungleich_page/glasfaser.html
+++ b/ungleich_page/templates/ungleich_page/glasfaser.html
@@ -40,6 +40,7 @@
+ {% include "gdpr_banner.html" %}
diff --git a/ungleich_page/templates/ungleich_page/glasfaser_cms_page.html b/ungleich_page/templates/ungleich_page/glasfaser_cms_page.html
index 03c1ed12..e13cf7bf 100644
--- a/ungleich_page/templates/ungleich_page/glasfaser_cms_page.html
+++ b/ungleich_page/templates/ungleich_page/glasfaser_cms_page.html
@@ -43,6 +43,7 @@
+{% include "gdpr_banner.html" %}
{% cms_toolbar %}
diff --git a/ungleich_page/templates/ungleich_page/landing.html b/ungleich_page/templates/ungleich_page/landing.html
index 703c8fc8..2fd1bfd8 100644
--- a/ungleich_page/templates/ungleich_page/landing.html
+++ b/ungleich_page/templates/ungleich_page/landing.html
@@ -37,7 +37,7 @@
-
+ {% include "gdpr_banner.html" %}
diff --git a/ungleich_page/templates/ungleich_page/ungleich_cms_page.html b/ungleich_page/templates/ungleich_page/ungleich_cms_page.html
index 42293b04..2267d266 100644
--- a/ungleich_page/templates/ungleich_page/ungleich_cms_page.html
+++ b/ungleich_page/templates/ungleich_page/ungleich_cms_page.html
@@ -41,7 +41,9 @@
-{% cms_toolbar %}
+ {% include "gdpr_banner.html" %}
+
+ {% cms_toolbar %}
{% placeholder 'Ungleich Page Contents' %}
From 028a27c538d9286aeb8001aa093f048de1eebab6 Mon Sep 17 00:00:00 2001
From: PCoder
Date: Sat, 21 Jul 2018 13:28:04 +0200
Subject: [PATCH 369/915] Reformat code
---
templates/gdpr/gdpr_banner.html | 16 ++++++++--------
1 file changed, 8 insertions(+), 8 deletions(-)
diff --git a/templates/gdpr/gdpr_banner.html b/templates/gdpr/gdpr_banner.html
index 1e132865..94f401e8 100644
--- a/templates/gdpr/gdpr_banner.html
+++ b/templates/gdpr/gdpr_banner.html
@@ -10,14 +10,14 @@ div#gdprBanner {
z-index: 999;
color: #ffffff;
}
- #gdprBanner a {
- cursor: pointer;
- color: #ffffff;
- font-weight: 600;
- }
- #gdprBanner button {
- margin-left: 25px;
- }
+#gdprBanner a {
+ cursor: pointer;
+ color: #ffffff;
+ font-weight: 600;
+}
+#gdprBanner button {
+ margin-left: 25px;
+}
This site uses cookies for analytics. By continuing to browse this site, you agree to use this.
Learn more Accept
From 33cf6cdd2b5babd0a0545db02342d01d37cd701c Mon Sep 17 00:00:00 2001
From: PCoder
Date: Sat, 21 Jul 2018 13:28:43 +0200
Subject: [PATCH 370/915] Create IS_TENANT_SITE context variable
---
templates/gdpr/gdpr_banner.html | 2 +-
utils/context_processor.py | 17 +++++++++++++----
2 files changed, 14 insertions(+), 5 deletions(-)
diff --git a/templates/gdpr/gdpr_banner.html b/templates/gdpr/gdpr_banner.html
index 94f401e8..001fb408 100644
--- a/templates/gdpr/gdpr_banner.html
+++ b/templates/gdpr/gdpr_banner.html
@@ -1,4 +1,4 @@
-{% if request.COOKIES.gdpr_accepted %}
+{% if request.COOKIES.gdpr_accepted or IS_TENANT_SITE %}
{% else %}
-This site uses cookies for analytics. By continuing to browse this site, you agree to use this.
Learn more Accept
+
+ {% blocktrans %}This site uses cookies for analytics. By continuing to browse this site, you agree to use this.{% endblocktrans %}
+
{% trans "Learn more" %} Accept
From e2c8ab084f11485617313f2f1c5572683bc80c13 Mon Sep 17 00:00:00 2001
From: PCoder
Date: Wed, 30 Jan 2019 22:02:08 +0100
Subject: [PATCH 585/915] Change chief information officer name, email
Malcolm -> Sanghee
---
templates/gdpr/gdpr_banner.html | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/templates/gdpr/gdpr_banner.html b/templates/gdpr/gdpr_banner.html
index 7865247a..d2b007ef 100644
--- a/templates/gdpr/gdpr_banner.html
+++ b/templates/gdpr/gdpr_banner.html
@@ -70,11 +70,11 @@ blog.ungleich.ch
The Data Privacy Officer:
-Malcolm Anyakee
+Sanghee Kim
ungleich glarus ag
Bahnhofstrasse 1
8783 Linthal (CH)
-E-Mail: malcolm.anyakee@ungleich.ch
+E-Mail: sanghee.kim@ungleich.ch
2. General
From c1ecef9b76294fa1dd480fb0460efb21c7f9f96c Mon Sep 17 00:00:00 2001
From: PCoder
Date: Wed, 30 Jan 2019 22:03:23 +0100
Subject: [PATCH 586/915] GDPR: Add/update DE translations
---
digitalglarus/locale/de/LC_MESSAGES/django.po | 541 ++++++------------
1 file changed, 183 insertions(+), 358 deletions(-)
diff --git a/digitalglarus/locale/de/LC_MESSAGES/django.po b/digitalglarus/locale/de/LC_MESSAGES/django.po
index 64d00233..d1d73171 100644
--- a/digitalglarus/locale/de/LC_MESSAGES/django.po
+++ b/digitalglarus/locale/de/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-10-25 21:14+0000\n"
+"POT-Creation-Date: 2019-01-30 20:55+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
@@ -334,6 +334,16 @@ msgstr ""
msgid "DG.Detail"
msgstr ""
+msgid ""
+"This site uses cookies for analytics. By continuing to browse this site, you "
+"agree to use this."
+msgstr ""
+"Diese Website verwendet Cookies für Analysezwecke. Mit dem weiterem Besuch "
+"dieser Website erklärst Du Dich damit einverstanden, diese zu nutzen."
+
+msgid "Learn more"
+msgstr "Learn mehr"
+
msgid "Privacy policy"
msgstr "Datenschutz-Bestimmungen"
@@ -370,12 +380,12 @@ msgid ""
" \n"
"The Data Privacy Officer: \n"
" \n"
-"Malcolm Anyakee \n"
+"Sanghee Kim \n"
"ungleich glarus ag \n"
"Bahnhofstrasse 1 \n"
"8783 Linthal (CH) \n"
-"E-Mail: malcolm."
-"anyakee@ungleich.ch \n"
+"E-Mail: sanghee.kim@ungleich.ch"
+"a> \n"
" \n"
" \n"
"2. General \n"
@@ -533,360 +543,175 @@ msgid ""
"websites. \n"
" \n"
" \n"
-msgstr "\n1. Verantwortung und Geltungsbereich "
-" "
-" "
-"Verantwortlich im Sinne der EU-Datenschutzgrundverordnung („DSGVO“) und sonstiger"
-" "
-"datenschutzrechtlicher Bestimmungen ist:"
-" "
-" "
-"ungleich glarus ag"
-" "
-"Bahnhofstrasse 1"
-" "
-"8783 Linthal (CH)"
-" "
-"Tel.: (044) 534-66-22"
-" "
-"E-Mail: info@ungleich.ch"
-" "
-" "
-"Diese Datenschutzerklärung gilt für das Internetangebot der ungleich glarus ag, welches unter"
-" "
-"den nachfolgenden Domains erreichbar ist:"
-" "
-" "
-"ungleich.ch"
-" "
-"datacenterlight.ch"
-" "
-"devuanhosting.com"
-" "
-"devuanhosting.ch"
-" "
-"digitalglarus.ch"
-" "
-"hack4lgarus.ch"
-" "
-"ipv6onlyhosting.com"
-" "
-"ipv6onlyhosting.ch"
-" "
-"ipv6onlyhosting.net"
-" "
-"django-hosting.ch"
-" "
-"rails-hosting.ch"
-" "
-"node-hosting.ch"
-" "
-"blog.ungleich.ch"
-" "
-" "
-"Der Datenschutzbeauftragte des Verantwortlichen ist:"
-" "
-" "
-"Malcolm Anyakee"
-" "
-"ungleich glarus ag"
-" "
-"Bahnhofstrasse 1"
-" "
-"8783 Linthal (CH)"
-" "
-"E-Mail: malcolm.anyakee@ungleich.ch "
-" "
-" "
-" "
-"2. Grundsätzliches "
-" "
-" "
-"Bei personenbezogenen Daten handelt es sich um alle Informationen, die sich auf eine"
-" "
-"identifizierte oder identifizierbare natürliche Person beziehen. Hierzu gehört zum Beispiel dein"
-" "
-"Name, deine Anschrift, dein Geburtsdatum, deine E-Mail-Adresse oder deine IP-Adresse. Wir"
-" "
-"speichern und verwenden deine personenbezogenen Daten ausschließlich für die Bearbeitung"
-" "
-"deiner Aufträge und für die Kontaktaufnahme mit dir."
-" "
-" "
-" "
-"3. Verarbeitung deiner personenbezogenen Daten "
-" "
-" "
-"Bei jedem Aufruf einer unserer Internetseiten wird u. a. deine IP-Adresse gespeichert. Wenn du"
-" "
-"dich bei uns registrierst, werden deine Kontaktdaten gespeichert. Wenn du Aufträge an uns"
-" "
-"richtest oder Produkte bei uns bestellst, werden darüber hinaus auch deine Anschrift und deine"
-" "
-"Zahlungsdaten gespeichert."
-" "
-" "
-"I. Registrierungsdaten "
-" "
-" "
-"Im Rahmen der Registrierung müssen wir einige personenbezogene Daten von dir erheben"
-" "
-"und verarbeiten. Beispielsweise benötigen wir deinen Namen, deine Anschrift, deine"
-" "
-"Telefonnummer, deine E-Mail-Adresse und deine Zahlungsdaten um deine Aufträge zu verarbeiten. "
-" "
-"Bei der Zahlung mittels Kreditkarte erfassen und speichern wir keine Zahlungsverkehrsinformationen wie Kreditkartennummern, das Ablaufdatum oder die Prüfziffer. "
-" "
-"Diese gibst du ausschließlich direkt dem entsprechenden Zahlungsdienstleister bekannt. Bei der Bezahlung mit Kreditkarte erfolgt die Abwicklung der Bezahlung durch einen externen Dienstleister. "
-" "
-"Für die Kreditkartenzahlung werden deine Angaben direkt vom Diensteanbieter Stripe Payments Europe Ltd. („Stripe“) verarbeitet."
-" "
-" "
-"II. Serverlogdateien "
-" "
-" "
-"Bei jedem Aufruf einer unserer Internetseiten speichern wir automatisch bestimmte Daten. Dazu"
-" "
-"gehören u. a. deine IP-Adresse, Typ und Version des verwendeten Browsers, Uhrzeit, Datum"
-" "
-"und die Webseite von der du auf unsere Seite gelangst (sog. „Referer“). Deine IP-Adresse wird"
-" "
-"bei uns nur anonymisiert gespeichert, sodass ein Personenbezug nicht mehr herstellbar ist. Die"
-" "
-"Erfassung der Daten zur Bereitstellung unserer Internetseiten und die Speicherung der Daten in"
-" "
-"den Server Logfiles ist für den Betrieb der Internetseite zwingend erforderlich und dient damit"
-" "
-"der Wahrung eines berechtigten Interesses unseres Unternehmens. Die Rechtsgrundlage für"
-" "
-"diese Verarbeitung ist Art. 6. Abs. 1 lit. f DSGVO."
-" "
-" "
-" "
-"4. Speicherdauer "
-" "
-" "
-"Sofern die verarbeiteten personenbezogenen Daten für die Durchführung eines ggf."
-" "
-"geschlossenen Vertrages nicht mehr erforderlich sind, werden sie umgehend gelöscht. Jedoch"
-" "
-"kann es auch nach Abschluss des Vertrags erforderlich sein, personenbezogene Daten von dir"
-" "
-"zu speichern, um unseren vertraglichen oder gesetzlichen Verpflichtungen nachzukommen."
-" "
-" "
-" "
-"5. Weitergabe von personenbezogenen Daten "
-" "
-" "
-"Wir geben deine personenbezogenen Daten grundsätzlich nicht an Dritte weiter, es sei denn:"
-" "
-" "
-"a) Du erteilst uns hierzu deine ausdrückliche Einwilligung nach Art. 6 Abs. 1 S. 1 lit. a DSGVO."
-" "
-" "
-"b) Die Weitergabe der Daten ist gesetzlich zulässig und nach Art. 6. Abs. 1 S. 1 lit b DSGVO zur"
-" "
-"Erfüllung unserer vertraglichen Pflichten mit Ihnen erforderlich."
-" "
-" "
-"c) Für die Weitergabe der Daten besteht nach Art. 6. Abs. 1 S. 1 lit. c DSGVO eine gesetzliche"
-" "
-"Verpflichtung."
-" "
-" "
-"d) Die Weitergabe der Daten ist nach Art. 6. Abs. 1 S. 1 lit. f DSGVO zur Wahrung unserer"
-" "
-"berechtigten Interessen, sowie zur Geltendmachung, Ausübung oder Verteidigung von"
-" "
-"Rechtsansprüchen erforderlich und darüber hinaus kein Grund zu der Annahme besteht, dass"
-" "
-"du ein überwiegendes schutzwürdiges Interesse an der Nichtweitergabe deiner Daten hast."
-" "
-" "
-" "
-" "
-"6. Cookies, Google Analytics und Twitter "
-" "
-" "
-"Wir setzen auf unseren Internetseiten sog. „Cookies“ ein. Cookies sind kleine Textdateien, die"
-" "
-"im Rahmen deines Besuchs einer unserer Internetseiten von uns an den Browser deines"
-" "
-"Endgeräts gesendet und dort gespeichert werden. Einige Funktionen unseres Angebots"
-" "
-"können ohne den Einsatz bestimmter Cookies grundsätzlich aus technischen Gründen nicht"
-" "
-"angeboten werden. Du kannst deinen Browser allerdings so konfigurieren, dass er nur noch"
-" "
-"bestimmte oder auch gar keine Cookies mehr akzeptiert. Es kann jedoch passieren, dass du"
-" "
-"dadurch möglicherweise nicht mehr alle Funktionen unserer Internetseiten nutzen kannst."
-" "
-"Andere Cookies ermöglichen es uns hingegen verschiedene Analysen deines Verhaltens oder"
-" "
-"etwa eine Verbindung zu deinen sozialen Netzwerken aufzubauen. Mithilfe dieser Cookies"
-" "
-"können wir beispielsweise unser Internetangebot für dich nutzerfreundlicher und effektiver"
-" "
-"gestalten. Daraus folgt, dass wir auf Grundlage unserer berechtigten Unternehmensinteressen"
-" "
-"(Optimierung und wirtschaftlicher Betrieb unseres Internetangebots) den Werbeanalysedienst"
-" "
-"„Google Analytics“ der Google Inc., 1600 Amphitheatre Parkway, Mountainview, CA 94043,"
-" "
-"Vereinigte Staaten von Amerika („Google“) einsetzen. Google verwendet Cookies. Die durch"
-" "
-"das Cookie erzeugten Informationen werden an einen Server von Google in den Vereinigten"
-" "
-"Staaten von Amerika übertragen und dort erhoben und gespeichert. Google nutzt diese"
-" "
-"Informationen in unserem Auftrag dafür, die Nutzung unseres Internetangebots auszuwerten"
-" "
-"und Berichte über die Aktivitäten auf unserem Onlineangebot uns gegenüber zu erbringen."
-" "
-"Dabei werden aus den verarbeiteten Daten anonymisierte bzw. pseudonyme Nutzungsprofile"
-" "
-"einiger Nutzer erstellt. Diese Nutzungsprofile sind nicht auf eine IP-Adresse oder einen"
-" "
-"spezifischen Nutzer zurückzuführen. Darüber hinaus setzen wir Google Analytics nur mit IP-Anonymisierung"
-" "
-"ein. Das heißt, dass die IP-Adresse von Google gekürzt wird. Nur in wenigen"
-" "
-"Ausnahmefällen wird die vollständige IP-Adresse an Google übertragen und dort gekürzt. Du"
-" "
-"kannst der Verarbeitung von deinen erfassten Daten durch die Installation dieses"
-" "
-"Browserplugins widersprechen: http://tools.google.com/dlpage/gaoptout?hl=de "
-" "
-" "
-"Weitere Informationen zur Nutzung der Daten durch Google und weiterführende"
-" "
-"Widerspruchsmöglichkeiten erhältst du in der Datenschutzerklärung von Google:"
-" "
-" "
-"https://policies.google.com/technologies/ads "
-" "
-" "
-"und auf den folgenden Webseiten:"
-" "
-" "
-"https://www.privacyshield.gov/participant?id=a2zt000000001L5AAI&status=Active "
-" "
-" "
-"https://adssettings.google.com/authenticated "
-" "
-" "
-"Die personenbezogenen Daten werden nach 14 Monaten gelöscht oder anonymisiert."
-" "
-"Rechtliche Grundlage hierfür ist Art. 6 Abs. 1 lit. f DSGVO."
-" "
-" "
-"Innerhalb unseres Onlineangebots können Funktionen und Inhalte des Dienstes Twitter"
-" "
-"eingebunden werden. Twitter ist ein Dienst der Twitter Inc., 1355 Market Street, Suite 900, San"
-" "
-"Francisco, CA 94103, Vereinigte Staaten von Amerika. Hierzu können beispielsweise Inhalte wie"
-" "
-"Bilder, Videos oder Texte und Schaltflächen gehören. Sofern du Mitglied der Plattform Twitter"
-" "
-"bist, kann Twitter den Aufruf der Funktionalitäten deinem dortigen Profil zuordnen."
-" "
-"Weitere Informationen zum Datenschutz bei Twitter, findest du in der Datenschutzerklärung von"
-" "
-"Twitter unter https://twitter.com/de/privacy ."
-" "
-" "
-" "
-" "
-"7. Rechte des Betroffenen "
-" "
-" "
-"Aus der DSGVO ergeben sich für dich als Betroffener die folgenden Rechte:"
-" "
-" "
-"a) Du kannst gem. Art. 15 DSGVO Auskunft über deine von uns verarbeiteten"
-" "
-"personenbezogenen Daten verlangen. Du kannst insbesondere Auskunft über den Zweck der"
-" "
-"Verarbeitung, die Kategorien der erhobenen personenbezogenen Daten, die Kategorien von"
-" "
-"Dritten, gegenüber denen deine Daten offengelegt werden und die voraussichtliche"
-" "
-"Speicherdauer verlangen."
-" "
-" "
-"b) Du hast gem. Art. 15 u. Art. 16 DSGVO ein Recht auf Berichtigung, Vervollständigung,"
-" "
-"Löschung und die Bestimmung von Einschränkungen hinsichtlich der Verarbeitung deiner"
-" "
-"personenbezogenen Daten."
-" "
-" "
-"c) Gemäß Art. 17 DSGVO kannst du von uns die Löschung deiner bei uns gespeicherten"
-" "
-"personenbezogenen Daten verlangen, soweit die Verarbeitung nicht zur Erfüllung unserer"
-" "
-"rechtlichen Verpflichtungen, aus Gründen des öffentlichen Interesses oder zur"
-" "
-"Geltendmachung, Ausübung oder Verteidigung von Rechtsansprüchen erforderlich ist."
-" "
-" "
-"d) Gemäß Art. 18 DSGVO kannst du von uns die Einschränkung der Verarbeitung deiner"
-" "
-"personenbezogenen Daten verlangen, soweit die Richtigkeit der Daten von dir bestritten wird,"
-" "
-"die Verarbeitung grundsätzlich unrechtmäßig ist oder die Löschung deiner"
-" "
-"personenbezogenen Daten durch uns ablehnen, weil du diese zur Geltendmachung, Ausübung"
-" "
-"oder Verteidigung von Rechtsansprüchen benötigst."
-" "
-" "
-"e) Gemäß Art. 20 DSGVO kannst du von uns verlangen, dass deine personenbezogenen"
-" "
-"Daten, die du uns zur Verfügung gestellt hast, in einem strukturierten, maschinenlesbaren und"
-" "
-"gängigen Format zu erhalten oder du kannst die Übermittlung an eine andere Stelle verlangen."
-" "
-" "
-"f) Gemäß Art. 7 Abs. 3 DSGVO kannst du deine erteilte Einwilligung gegenüber uns jederzeit"
-" "
-"widerrufen. Dies hat zur Folge, dass wir die auf dieser Einwilligung beruhende"
-" "
-"Datenverarbeitung für die Zukunft nicht mehr fortführen dürfen."
-" "
-" "
-"g) Gemäß Art. 77 DSGVO steht dir das Recht zu, dich bei einer Aufsichtsbehörde zu"
-" "
-"beschweren."
-" "
-" "
-" "
-"8. Hyperlinks und Haftungsausschluss "
-" "
-" "
-"Auf unseren Internetseiten befinden sich sog. „Hyperlinks“, also Verbindungen bzw."
-" "
-"Weiterleitungen zu den Internetseiten Dritter. Bei Aktivierung dieser Hyperlinks durch"
-" "
-"Anklicken, wirst du von unserer Internetseite direkt auf die Internetseite eines Dritten"
-" "
-"weitergeleitet. Wir können keine Verantwortung für den vertraulichen Umgang deiner Daten auf"
-" "
-"diesen Webseiten Dritter übernehmen, da wir keinen Einfluss darauf haben, dass diese"
-" "
-"Unternehmen die Datenschutzbestimmungen der DSGVO einhalten. Wir weisen dich außerdem"
-" "
-"darauf hin, dass es aufgrund der Struktur des Internets möglich ist, dass die Regelungen des"
-" "
-"Datenschutzes bzw. der DSGVO von anderen, dritten Personen oder Institutionen die nicht"
-" "
-"innerhalb unseres Verantwortungsbereichs liegen nicht beachtet werden, oder dass sich"
-" "
-"spontan, kurzfristig schwerwiegende Sicherheitslücken in verbreiteten Standards und"
-" "
-"technischen Protokollen auftun, die die Datenintegrität gefährden könnten. \n"
+msgstr ""
+"\n"
+"1. Verantwortung und Geltungsbereich Verantwortlich im Sinne der EU-Datenschutzgrundverordnung („DSGVO“) und "
+"sonstiger datenschutzrechtlicher Bestimmungen ist: ungleich "
+"glarus ag Bahnhofstrasse 1 8783 Linthal (CH) Tel.: (044) "
+"534-66-22 E-Mail: info@ungleich.ch Diese Datenschutzerklärung "
+"gilt für das Internetangebot der ungleich glarus ag, welches unter den "
+"nachfolgenden Domains erreichbar ist: ungleich.ch datacenterlight.ch devuanhosting.com devuanhosting.ch digitalglarus.ch hack4lgarus.ch ipv6onlyhosting.com ipv6onlyhosting.ch ipv6onlyhosting.net django-hosting.ch rails-"
+"hosting.ch node-hosting.ch blog.ungleich.ch Der "
+"Datenschutzbeauftragte des Verantwortlichen ist: Sanghee Kim ungleich glarus ag Bahnhofstrasse 1 8783 Linthal (CH) E-Mail: "
+"sanghee.kim@ungleich.ch"
+"a>2. Grundsätzliches Bei "
+"personenbezogenen Daten handelt es sich um alle Informationen, die sich auf "
+"eine identifizierte oder identifizierbare natürliche Person beziehen. "
+"Hierzu gehört zum Beispiel dein Name, deine Anschrift, dein "
+"Geburtsdatum, deine E-Mail-Adresse oder deine IP-Adresse. Wir speichern "
+"und verwenden deine personenbezogenen Daten ausschließlich für die "
+"Bearbeitung deiner Aufträge und für die Kontaktaufnahme mit dir.3. Verarbeitung deiner personenbezogenen Daten Bei jedem Aufruf einer unserer Internetseiten wird u. a. deine IP-"
+"Adresse gespeichert. Wenn du dich bei uns registrierst, werden deine "
+"Kontaktdaten gespeichert. Wenn du Aufträge an uns richtest oder Produkte "
+"bei uns bestellst, werden darüber hinaus auch deine Anschrift und deine Zahlungsdaten gespeichert.I. Registrierungsdaten"
+"strong> Im Rahmen der Registrierung müssen wir einige "
+"personenbezogene Daten von dir erheben und verarbeiten. Beispielsweise "
+"benötigen wir deinen Namen, deine Anschrift, deine Telefonnummer, deine "
+"E-Mail-Adresse und deine Zahlungsdaten um deine Aufträge zu verarbeiten. Bei der Zahlung mittels Kreditkarte erfassen und speichern wir keine "
+"Zahlungsverkehrsinformationen wie Kreditkartennummern, das Ablaufdatum oder "
+"die Prüfziffer. Diese gibst du ausschließlich direkt dem entsprechenden "
+"Zahlungsdienstleister bekannt. Bei der Bezahlung mit Kreditkarte erfolgt die "
+"Abwicklung der Bezahlung durch einen externen Dienstleister. Für die "
+"Kreditkartenzahlung werden deine Angaben direkt vom Diensteanbieter Stripe "
+"Payments Europe Ltd. („Stripe“) verarbeitet.II. "
+"Serverlogdateien Bei jedem Aufruf einer unserer "
+"Internetseiten speichern wir automatisch bestimmte Daten. Dazu gehören "
+"u. a. deine IP-Adresse, Typ und Version des verwendeten Browsers, Uhrzeit, "
+"Datum und die Webseite von der du auf unsere Seite gelangst (sog. "
+"„Referer“). Deine IP-Adresse wird bei uns nur anonymisiert gespeichert, "
+"sodass ein Personenbezug nicht mehr herstellbar ist. Die Erfassung der "
+"Daten zur Bereitstellung unserer Internetseiten und die Speicherung der "
+"Daten in den Server Logfiles ist für den Betrieb der Internetseite "
+"zwingend erforderlich und dient damit der Wahrung eines berechtigten "
+"Interesses unseres Unternehmens. Die Rechtsgrundlage für diese "
+"Verarbeitung ist Art. 6. Abs. 1 lit. f DSGVO.4. "
+"Speicherdauer Sofern die verarbeiteten personenbezogenen "
+"Daten für die Durchführung eines ggf. geschlossenen Vertrages nicht mehr "
+"erforderlich sind, werden sie umgehend gelöscht. Jedoch kann es auch "
+"nach Abschluss des Vertrags erforderlich sein, personenbezogene Daten von "
+"dir zu speichern, um unseren vertraglichen oder gesetzlichen "
+"Verpflichtungen nachzukommen.5. Weitergabe von "
+"personenbezogenen Daten Wir geben deine personenbezogenen "
+"Daten grundsätzlich nicht an Dritte weiter, es sei denn: a) Du "
+"erteilst uns hierzu deine ausdrückliche Einwilligung nach Art. 6 Abs. 1 S. 1 "
+"lit. a DSGVO. b) Die Weitergabe der Daten ist gesetzlich zulässig "
+"und nach Art. 6. Abs. 1 S. 1 lit b DSGVO zur Erfüllung unserer "
+"vertraglichen Pflichten mit Ihnen erforderlich. c) Für die "
+"Weitergabe der Daten besteht nach Art. 6. Abs. 1 S. 1 lit. c DSGVO eine "
+"gesetzliche Verpflichtung. d) Die Weitergabe der Daten ist nach "
+"Art. 6. Abs. 1 S. 1 lit. f DSGVO zur Wahrung unserer berechtigten "
+"Interessen, sowie zur Geltendmachung, Ausübung oder Verteidigung von Rechtsansprüchen erforderlich und darüber hinaus kein Grund zu der Annahme "
+"besteht, dass du ein überwiegendes schutzwürdiges Interesse an der "
+"Nichtweitergabe deiner Daten hast.6. Cookies, "
+"Google Analytics und Twitter Wir setzen auf unseren "
+"Internetseiten sog. „Cookies“ ein. Cookies sind kleine Textdateien, die im Rahmen deines Besuchs einer unserer Internetseiten von uns an den "
+"Browser deines Endgeräts gesendet und dort gespeichert werden. Einige "
+"Funktionen unseres Angebots können ohne den Einsatz bestimmter Cookies "
+"grundsätzlich aus technischen Gründen nicht angeboten werden. Du kannst "
+"deinen Browser allerdings so konfigurieren, dass er nur noch bestimmte "
+"oder auch gar keine Cookies mehr akzeptiert. Es kann jedoch passieren, dass "
+"du dadurch möglicherweise nicht mehr alle Funktionen unserer "
+"Internetseiten nutzen kannst. Andere Cookies ermöglichen es uns hingegen "
+"verschiedene Analysen deines Verhaltens oder etwa eine Verbindung zu "
+"deinen sozialen Netzwerken aufzubauen. Mithilfe dieser Cookies können "
+"wir beispielsweise unser Internetangebot für dich nutzerfreundlicher und "
+"effektiver gestalten. Daraus folgt, dass wir auf Grundlage unserer "
+"berechtigten Unternehmensinteressen (Optimierung und wirtschaftlicher "
+"Betrieb unseres Internetangebots) den Werbeanalysedienst „Google "
+"Analytics“ der Google Inc., 1600 Amphitheatre Parkway, Mountainview, CA "
+"94043, Vereinigte Staaten von Amerika („Google“) einsetzen. Google "
+"verwendet Cookies. Die durch das Cookie erzeugten Informationen werden "
+"an einen Server von Google in den Vereinigten Staaten von Amerika "
+"übertragen und dort erhoben und gespeichert. Google nutzt diese Informationen in unserem Auftrag dafür, die Nutzung unseres "
+"Internetangebots auszuwerten und Berichte über die Aktivitäten auf "
+"unserem Onlineangebot uns gegenüber zu erbringen. Dabei werden aus den "
+"verarbeiteten Daten anonymisierte bzw. pseudonyme Nutzungsprofile einiger Nutzer erstellt. Diese Nutzungsprofile sind nicht auf eine IP-"
+"Adresse oder einen spezifischen Nutzer zurückzuführen. Darüber hinaus "
+"setzen wir Google Analytics nur mit IP-Anonymisierung ein. Das heißt, "
+"dass die IP-Adresse von Google gekürzt wird. Nur in wenigen Ausnahmefällen wird die vollständige IP-Adresse an Google übertragen und "
+"dort gekürzt. Du kannst der Verarbeitung von deinen erfassten Daten "
+"durch die Installation dieses Browserplugins widersprechen: http://tools.google.com/"
+"dlpage/gaoptout?hl=de Weitere Informationen zur Nutzung der "
+"Daten durch Google und weiterführende Widerspruchsmöglichkeiten erhältst "
+"du in der Datenschutzerklärung von Google:https://policies.google.com/"
+"technologies/ads und auf den folgenden Webseiten:https://www.privacyshield.gov/"
+"participant?id=a2zt000000001L5AAI&status=Active https://adssettings.google."
+"com/authenticated Die personenbezogenen Daten werden nach 14 "
+"Monaten gelöscht oder anonymisiert. Rechtliche Grundlage hierfür ist "
+"Art. 6 Abs. 1 lit. f DSGVO. Innerhalb unseres Onlineangebots können "
+"Funktionen und Inhalte des Dienstes Twitter eingebunden werden. Twitter "
+"ist ein Dienst der Twitter Inc., 1355 Market Street, Suite 900, San Francisco, CA 94103, Vereinigte Staaten von Amerika. Hierzu können "
+"beispielsweise Inhalte wie Bilder, Videos oder Texte und Schaltflächen "
+"gehören. Sofern du Mitglied der Plattform Twitter bist, kann Twitter den "
+"Aufruf der Funktionalitäten deinem dortigen Profil zuordnen. Weitere "
+"Informationen zum Datenschutz bei Twitter, findest du in der "
+"Datenschutzerklärung von Twitter unter https://twitter.com/de/privacy .7. "
+"Rechte des Betroffenen Aus der DSGVO ergeben sich für dich "
+"als Betroffener die folgenden Rechte: a) Du kannst gem. Art. 15 "
+"DSGVO Auskunft über deine von uns verarbeiteten personenbezogenen Daten "
+"verlangen. Du kannst insbesondere Auskunft über den Zweck der Verarbeitung, die Kategorien der erhobenen personenbezogenen Daten, die "
+"Kategorien von Dritten, gegenüber denen deine Daten offengelegt werden "
+"und die voraussichtliche Speicherdauer verlangen. b) Du hast "
+"gem. Art. 15 u. Art. 16 DSGVO ein Recht auf Berichtigung, Vervollständigung,"
+" Löschung und die Bestimmung von Einschränkungen hinsichtlich der "
+"Verarbeitung deiner personenbezogenen Daten. c) Gemäß Art. 17 "
+"DSGVO kannst du von uns die Löschung deiner bei uns gespeicherten personenbezogenen Daten verlangen, soweit die Verarbeitung nicht zur "
+"Erfüllung unserer rechtlichen Verpflichtungen, aus Gründen des "
+"öffentlichen Interesses oder zur Geltendmachung, Ausübung oder "
+"Verteidigung von Rechtsansprüchen erforderlich ist. d) Gemäß Art. "
+"18 DSGVO kannst du von uns die Einschränkung der Verarbeitung deiner personenbezogenen Daten verlangen, soweit die Richtigkeit der Daten von dir "
+"bestritten wird, die Verarbeitung grundsätzlich unrechtmäßig ist oder "
+"die Löschung deiner personenbezogenen Daten durch uns ablehnen, weil du "
+"diese zur Geltendmachung, Ausübung oder Verteidigung von "
+"Rechtsansprüchen benötigst. e) Gemäß Art. 20 DSGVO kannst du von "
+"uns verlangen, dass deine personenbezogenen Daten, die du uns zur "
+"Verfügung gestellt hast, in einem strukturierten, maschinenlesbaren und gängigen Format zu erhalten oder du kannst die Übermittlung an eine andere "
+"Stelle verlangen. f) Gemäß Art. 7 Abs. 3 DSGVO kannst du deine "
+"erteilte Einwilligung gegenüber uns jederzeit widerrufen. Dies hat zur "
+"Folge, dass wir die auf dieser Einwilligung beruhende Datenverarbeitung "
+"für die Zukunft nicht mehr fortführen dürfen. g) Gemäß Art. 77 "
+"DSGVO steht dir das Recht zu, dich bei einer Aufsichtsbehörde zu beschweren.8. Hyperlinks und Haftungsausschluss"
+"strong> Auf unseren Internetseiten befinden sich sog. „Hyperlinks“, "
+"also Verbindungen bzw. Weiterleitungen zu den Internetseiten Dritter. "
+"Bei Aktivierung dieser Hyperlinks durch Anklicken, wirst du von unserer "
+"Internetseite direkt auf die Internetseite eines Dritten weitergeleitet. "
+"Wir können keine Verantwortung für den vertraulichen Umgang deiner Daten "
+"auf diesen Webseiten Dritter übernehmen, da wir keinen Einfluss darauf "
+"haben, dass diese Unternehmen die Datenschutzbestimmungen der DSGVO "
+"einhalten. Wir weisen dich außerdem darauf hin, dass es aufgrund der "
+"Struktur des Internets möglich ist, dass die Regelungen des Datenschutzes bzw. der DSGVO von anderen, dritten Personen oder "
+"Institutionen die nicht innerhalb unseres Verantwortungsbereichs liegen "
+"nicht beachtet werden, oder dass sich spontan, kurzfristig "
+"schwerwiegende Sicherheitslücken in verbreiteten Standards und technischen Protokollen auftun, die die Datenintegrität gefährden könnten."
+" \n"
msgid "Page Header"
msgstr ""
From 13a606aac0fe7c5a38e9cd95eac269be1d2dc574 Mon Sep 17 00:00:00 2001
From: PCoder
Date: Wed, 30 Jan 2019 22:11:16 +0100
Subject: [PATCH 587/915] Add translation for 'accept' and fix styles
---
digitalglarus/locale/de/LC_MESSAGES/django.po | 9 ++++++---
templates/gdpr/gdpr_banner.html | 2 +-
2 files changed, 7 insertions(+), 4 deletions(-)
diff --git a/digitalglarus/locale/de/LC_MESSAGES/django.po b/digitalglarus/locale/de/LC_MESSAGES/django.po
index d1d73171..b2776a0d 100644
--- a/digitalglarus/locale/de/LC_MESSAGES/django.po
+++ b/digitalglarus/locale/de/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-01-30 20:55+0000\n"
+"POT-Creation-Date: 2019-01-30 21:08+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
@@ -344,6 +344,9 @@ msgstr ""
msgid "Learn more"
msgstr "Learn mehr"
+msgid "Accept"
+msgstr "Annehmen"
+
msgid "Privacy policy"
msgstr "Datenschutz-Bestimmungen"
@@ -558,8 +561,8 @@ msgstr ""
"hosting.ch node-hosting.ch blog.ungleich.ch Der "
"Datenschutzbeauftragte des Verantwortlichen ist: Sanghee Kim ungleich glarus ag Bahnhofstrasse 1 8783 Linthal (CH) E-Mail: "
-"sanghee.kim@ungleich.ch"
-"a>2. Grundsätzliches Bei "
+" sanghee.kim@ungleich.ch 2. Grundsätzliches Bei "
"personenbezogenen Daten handelt es sich um alle Informationen, die sich auf "
"eine identifizierte oder identifizierbare natürliche Person beziehen. "
"Hierzu gehört zum Beispiel dein Name, deine Anschrift, dein "
diff --git a/templates/gdpr/gdpr_banner.html b/templates/gdpr/gdpr_banner.html
index d2b007ef..cfb7d5b3 100644
--- a/templates/gdpr/gdpr_banner.html
+++ b/templates/gdpr/gdpr_banner.html
@@ -28,7 +28,7 @@ div#gdprBanner {
{% blocktrans %}This site uses cookies for analytics. By continuing to browse this site, you agree to use this.{% endblocktrans %}
-
{% trans "Learn more" %} Accept
+ {% trans "Learn more" %} {% trans "Accept" %}
From 10137d86755e57995a87d3421e936376d3800d9c Mon Sep 17 00:00:00 2001
From: PCoder
Date: Wed, 30 Jan 2019 22:16:07 +0100
Subject: [PATCH 588/915] Fix button letter spacing style
---
templates/gdpr/gdpr_banner.html | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/templates/gdpr/gdpr_banner.html b/templates/gdpr/gdpr_banner.html
index cfb7d5b3..6368982e 100644
--- a/templates/gdpr/gdpr_banner.html
+++ b/templates/gdpr/gdpr_banner.html
@@ -28,7 +28,7 @@ div#gdprBanner {
{% blocktrans %}This site uses cookies for analytics. By continuing to browse this site, you agree to use this.{% endblocktrans %}
-
{% trans "Learn more" %} {% trans "Accept" %}
+ {% trans "Learn more" %} {% trans "Accept" %}
From 4c77678a36b368e1b26e38c82779d5559b10dafe Mon Sep 17 00:00:00 2001
From: PCoder
Date: Wed, 30 Jan 2019 23:04:02 +0100
Subject: [PATCH 589/915] Remove unnecessary brs from DE translation
---
digitalglarus/locale/de/LC_MESSAGES/django.po | 165 ++++++++----------
1 file changed, 77 insertions(+), 88 deletions(-)
diff --git a/digitalglarus/locale/de/LC_MESSAGES/django.po b/digitalglarus/locale/de/LC_MESSAGES/django.po
index b2776a0d..817b6ec2 100644
--- a/digitalglarus/locale/de/LC_MESSAGES/django.po
+++ b/digitalglarus/locale/de/LC_MESSAGES/django.po
@@ -550,10 +550,10 @@ msgstr ""
"\n"
"1. Verantwortung und Geltungsbereich Verantwortlich im Sinne der EU-Datenschutzgrundverordnung („DSGVO“) und "
-"sonstiger datenschutzrechtlicher Bestimmungen ist: ungleich "
+"sonstiger datenschutzrechtlicher Bestimmungen ist: ungleich "
"glarus ag Bahnhofstrasse 1 8783 Linthal (CH) Tel.: (044) "
"534-66-22 E-Mail: info@ungleich.ch Diese Datenschutzerklärung "
-"gilt für das Internetangebot der ungleich glarus ag, welches unter den "
+"gilt für das Internetangebot der ungleich glarus ag, welches unter den "
"nachfolgenden Domains erreichbar ist: ungleich.ch datacenterlight.ch devuanhosting.com devuanhosting.ch digitalglarus.ch hack4lgarus.ch ipv6onlyhosting.com sanghee.kim@ungleich.ch2. Grundsätzliches Bei "
"personenbezogenen Daten handelt es sich um alle Informationen, die sich auf "
-"eine identifizierte oder identifizierbare natürliche Person beziehen. "
-"Hierzu gehört zum Beispiel dein Name, deine Anschrift, dein "
-"Geburtsdatum, deine E-Mail-Adresse oder deine IP-Adresse. Wir speichern "
+"eine identifizierte oder identifizierbare natürliche Person beziehen. "
+"Hierzu gehört zum Beispiel dein Name, deine Anschrift, dein "
+"Geburtsdatum, deine E-Mail-Adresse oder deine IP-Adresse. Wir speichern "
"und verwenden deine personenbezogenen Daten ausschließlich für die "
-"Bearbeitung deiner Aufträge und für die Kontaktaufnahme mit dir.3. Verarbeitung deiner personenbezogenen Daten Bei jedem Aufruf einer unserer Internetseiten wird u. a. deine IP-"
-"Adresse gespeichert. Wenn du dich bei uns registrierst, werden deine "
-"Kontaktdaten gespeichert. Wenn du Aufträge an uns richtest oder Produkte "
+"Adresse gespeichert. Wenn du dich bei uns registrierst, werden deine "
+"Kontaktdaten gespeichert. Wenn du Aufträge an uns richtest oder Produkte "
"bei uns bestellst, werden darüber hinaus auch deine Anschrift und deine Zahlungsdaten gespeichert.I. Registrierungsdaten"
"strong> Im Rahmen der Registrierung müssen wir einige "
-"personenbezogene Daten von dir erheben und verarbeiten. Beispielsweise "
-"benötigen wir deinen Namen, deine Anschrift, deine Telefonnummer, deine "
+"personenbezogene Daten von dir erheben und verarbeiten. Beispielsweise "
+"benötigen wir deinen Namen, deine Anschrift, deine Telefonnummer, deine "
"E-Mail-Adresse und deine Zahlungsdaten um deine Aufträge zu verarbeiten. Bei der Zahlung mittels Kreditkarte erfassen und speichern wir keine "
"Zahlungsverkehrsinformationen wie Kreditkartennummern, das Ablaufdatum oder "
-"die Prüfziffer. Diese gibst du ausschließlich direkt dem entsprechenden "
+"die Prüfziffer. Diese gibst du ausschließlich direkt dem entsprechenden "
"Zahlungsdienstleister bekannt. Bei der Bezahlung mit Kreditkarte erfolgt die "
"Abwicklung der Bezahlung durch einen externen Dienstleister. Für die "
"Kreditkartenzahlung werden deine Angaben direkt vom Diensteanbieter Stripe "
"Payments Europe Ltd. („Stripe“) verarbeitet.II. "
"Serverlogdateien Bei jedem Aufruf einer unserer "
-"Internetseiten speichern wir automatisch bestimmte Daten. Dazu gehören "
+"Internetseiten speichern wir automatisch bestimmte Daten. Dazu gehören "
"u. a. deine IP-Adresse, Typ und Version des verwendeten Browsers, Uhrzeit, "
-"Datum und die Webseite von der du auf unsere Seite gelangst (sog. "
-"„Referer“). Deine IP-Adresse wird bei uns nur anonymisiert gespeichert, "
-"sodass ein Personenbezug nicht mehr herstellbar ist. Die Erfassung der "
+"Datum und die Webseite von der du auf unsere Seite gelangst (sog. "
+"„Referer“). Deine IP-Adresse wird bei uns nur anonymisiert gespeichert, "
+"sodass ein Personenbezug nicht mehr herstellbar ist. Die Erfassung der "
"Daten zur Bereitstellung unserer Internetseiten und die Speicherung der "
-"Daten in den Server Logfiles ist für den Betrieb der Internetseite "
-"zwingend erforderlich und dient damit der Wahrung eines berechtigten "
-"Interesses unseres Unternehmens. Die Rechtsgrundlage für diese "
+"Daten in den Server Logfiles ist für den Betrieb der Internetseite "
+"zwingend erforderlich und dient damit der Wahrung eines berechtigten "
+"Interesses unseres Unternehmens. Die Rechtsgrundlage für diese "
"Verarbeitung ist Art. 6. Abs. 1 lit. f DSGVO.4. "
"Speicherdauer Sofern die verarbeiteten personenbezogenen "
"Daten für die Durchführung eines ggf. geschlossenen Vertrages nicht mehr "
-"erforderlich sind, werden sie umgehend gelöscht. Jedoch kann es auch "
+"erforderlich sind, werden sie umgehend gelöscht. Jedoch kann es auch "
"nach Abschluss des Vertrags erforderlich sein, personenbezogene Daten von "
-"dir zu speichern, um unseren vertraglichen oder gesetzlichen "
+"dir zu speichern, um unseren vertraglichen oder gesetzlichen "
"Verpflichtungen nachzukommen.5. Weitergabe von "
"personenbezogenen Daten Wir geben deine personenbezogenen "
"Daten grundsätzlich nicht an Dritte weiter, es sei denn: a) Du "
"erteilst uns hierzu deine ausdrückliche Einwilligung nach Art. 6 Abs. 1 S. 1 "
"lit. a DSGVO. b) Die Weitergabe der Daten ist gesetzlich zulässig "
-"und nach Art. 6. Abs. 1 S. 1 lit b DSGVO zur Erfüllung unserer "
+"und nach Art. 6. Abs. 1 S. 1 lit b DSGVO zur Erfüllung unserer "
"vertraglichen Pflichten mit Ihnen erforderlich. c) Für die "
"Weitergabe der Daten besteht nach Art. 6. Abs. 1 S. 1 lit. c DSGVO eine "
-"gesetzliche Verpflichtung. d) Die Weitergabe der Daten ist nach "
-"Art. 6. Abs. 1 S. 1 lit. f DSGVO zur Wahrung unserer berechtigten "
+"gesetzliche Verpflichtung. d) Die Weitergabe der Daten ist nach "
+"Art. 6. Abs. 1 S. 1 lit. f DSGVO zur Wahrung unserer berechtigten "
"Interessen, sowie zur Geltendmachung, Ausübung oder Verteidigung von Rechtsansprüchen erforderlich und darüber hinaus kein Grund zu der Annahme "
-"besteht, dass du ein überwiegendes schutzwürdiges Interesse an der "
+"besteht, dass du ein überwiegendes schutzwürdiges Interesse an der "
"Nichtweitergabe deiner Daten hast.6. Cookies, "
"Google Analytics und Twitter Wir setzen auf unseren "
"Internetseiten sog. „Cookies“ ein. Cookies sind kleine Textdateien, die im Rahmen deines Besuchs einer unserer Internetseiten von uns an den "
-"Browser deines Endgeräts gesendet und dort gespeichert werden. Einige "
-"Funktionen unseres Angebots können ohne den Einsatz bestimmter Cookies "
-"grundsätzlich aus technischen Gründen nicht angeboten werden. Du kannst "
-"deinen Browser allerdings so konfigurieren, dass er nur noch bestimmte "
+"Browser deines Endgeräts gesendet und dort gespeichert werden. Einige "
+"Funktionen unseres Angebots können ohne den Einsatz bestimmter Cookies "
+"grundsätzlich aus technischen Gründen nicht angeboten werden. Du kannst "
+"deinen Browser allerdings so konfigurieren, dass er nur noch bestimmte "
"oder auch gar keine Cookies mehr akzeptiert. Es kann jedoch passieren, dass "
-"du dadurch möglicherweise nicht mehr alle Funktionen unserer "
+"du dadurch möglicherweise nicht mehr alle Funktionen unserer "
"Internetseiten nutzen kannst. Andere Cookies ermöglichen es uns hingegen "
-"verschiedene Analysen deines Verhaltens oder etwa eine Verbindung zu "
-"deinen sozialen Netzwerken aufzubauen. Mithilfe dieser Cookies können "
+"verschiedene Analysen deines Verhaltens oder etwa eine Verbindung zu "
+"deinen sozialen Netzwerken aufzubauen. Mithilfe dieser Cookies können "
"wir beispielsweise unser Internetangebot für dich nutzerfreundlicher und "
-"effektiver gestalten. Daraus folgt, dass wir auf Grundlage unserer "
-"berechtigten Unternehmensinteressen (Optimierung und wirtschaftlicher "
-"Betrieb unseres Internetangebots) den Werbeanalysedienst „Google "
+"effektiver gestalten. Daraus folgt, dass wir auf Grundlage unserer "
+"berechtigten Unternehmensinteressen (Optimierung und wirtschaftlicher "
+"Betrieb unseres Internetangebots) den Werbeanalysedienst „Google "
"Analytics“ der Google Inc., 1600 Amphitheatre Parkway, Mountainview, CA "
-"94043, Vereinigte Staaten von Amerika („Google“) einsetzen. Google "
-"verwendet Cookies. Die durch das Cookie erzeugten Informationen werden "
-"an einen Server von Google in den Vereinigten Staaten von Amerika "
-"übertragen und dort erhoben und gespeichert. Google nutzt diese Informationen in unserem Auftrag dafür, die Nutzung unseres "
-"Internetangebots auszuwerten und Berichte über die Aktivitäten auf "
+"94043, Vereinigte Staaten von Amerika („Google“) einsetzen. Google "
+"verwendet Cookies. Die durch das Cookie erzeugten Informationen werden "
+"an einen Server von Google in den Vereinigten Staaten von Amerika "
+"übertragen und dort erhoben und gespeichert. Google nutzt dies Informationen in unserem Auftrag dafür, die Nutzung unseres "
+"Internetangebots auszuwerten und Berichte über die Aktivitäten auf "
"unserem Onlineangebot uns gegenüber zu erbringen. Dabei werden aus den "
-"verarbeiteten Daten anonymisierte bzw. pseudonyme Nutzungsprofile einiger Nutzer erstellt. Diese Nutzungsprofile sind nicht auf eine IP-"
-"Adresse oder einen spezifischen Nutzer zurückzuführen. Darüber hinaus "
-"setzen wir Google Analytics nur mit IP-Anonymisierung ein. Das heißt, "
-"dass die IP-Adresse von Google gekürzt wird. Nur in wenigen Ausnahmefällen wird die vollständige IP-Adresse an Google übertragen und "
-"dort gekürzt. Du kannst der Verarbeitung von deinen erfassten Daten "
-"durch die Installation dieses Browserplugins widersprechen: http://tools.google.com/"
"dlpage/gaoptout?hl=de Weitere Informationen zur Nutzung der "
-"Daten durch Google und weiterführende Widerspruchsmöglichkeiten erhältst "
+"Daten durch Google und weiterführende Widerspruchsmöglichkeiten erhältst "
"du in der Datenschutzerklärung von Google:https://policies.google.com/"
"technologies/ads und auf den folgenden Webseiten: Die personenbezogenen Daten werden nach 14 "
"Monaten gelöscht oder anonymisiert. Rechtliche Grundlage hierfür ist "
"Art. 6 Abs. 1 lit. f DSGVO. Innerhalb unseres Onlineangebots können "
-"Funktionen und Inhalte des Dienstes Twitter eingebunden werden. Twitter "
-"ist ein Dienst der Twitter Inc., 1355 Market Street, Suite 900, San Francisco, CA 94103, Vereinigte Staaten von Amerika. Hierzu können "
-"beispielsweise Inhalte wie Bilder, Videos oder Texte und Schaltflächen "
-"gehören. Sofern du Mitglied der Plattform Twitter bist, kann Twitter den "
+"Funktionen und Inhalte des Dienstes Twitter eingebunden werden. Twitter "
+"ist ein Dienst der Twitter Inc., 1355 Market Street, Suite 900, San Francisco, CA 94103, Vereinigte Staaten von Amerika. Hierzu können "
+"beispielsweise Inhalte wie Bilder, Videos oder Texte und Schaltflächen "
+"gehören. Sofern du Mitglied der Plattform Twitter bist, kann Twitter den "
"Aufruf der Funktionalitäten deinem dortigen Profil zuordnen. Weitere "
"Informationen zum Datenschutz bei Twitter, findest du in der "
"Datenschutzerklärung von Twitter unter https://twitter.com/de/privacy .7. "
"Rechte des Betroffenen Aus der DSGVO ergeben sich für dich "
"als Betroffener die folgenden Rechte: a) Du kannst gem. Art. 15 "
-"DSGVO Auskunft über deine von uns verarbeiteten personenbezogenen Daten "
-"verlangen. Du kannst insbesondere Auskunft über den Zweck der Verarbeitung, die Kategorien der erhobenen personenbezogenen Daten, die "
-"Kategorien von Dritten, gegenüber denen deine Daten offengelegt werden "
-"und die voraussichtliche Speicherdauer verlangen. b) Du hast "
-"gem. Art. 15 u. Art. 16 DSGVO ein Recht auf Berichtigung, Vervollständigung,"
-" Löschung und die Bestimmung von Einschränkungen hinsichtlich der "
-"Verarbeitung deiner personenbezogenen Daten. c) Gemäß Art. 17 "
-"DSGVO kannst du von uns die Löschung deiner bei uns gespeicherten personenbezogenen Daten verlangen, soweit die Verarbeitung nicht zur "
-"Erfüllung unserer rechtlichen Verpflichtungen, aus Gründen des "
-"öffentlichen Interesses oder zur Geltendmachung, Ausübung oder "
+"DSGVO Auskunft über deine von uns verarbeiteten personenbezogenen Daten "
+"verlangen. Du kannst insbesondere Auskunft über den Zweck der Verarbeitung, die Kategorien der erhobenen personenbezogenen Daten, die "
+"Kategorien von Dritten, gegenüber denen deine Daten offengelegt werden "
+"und die voraussichtliche Speicherdauer verlangen. b) Du hast "
+"gem. Art. 15 u. Art. 16 DSGVO ein Recht auf Berichtigung, Vervollständigung, "
+"Löschung und die Bestimmung von Einschränkungen hinsichtlich der "
+"Verarbeitung deiner personenbezogenen Daten. c) Gemäß Art. 17 "
+"DSGVO kannst du von uns die Löschung deiner bei uns gespeicherten personenbezogenen Daten verlangen, soweit die Verarbeitung nicht zur "
+"Erfüllung unserer rechtlichen Verpflichtungen, aus Gründen des "
+"öffentlichen Interesses oder zur Geltendmachung, Ausübung oder "
"Verteidigung von Rechtsansprüchen erforderlich ist. d) Gemäß Art. "
-"18 DSGVO kannst du von uns die Einschränkung der Verarbeitung deiner personenbezogenen Daten verlangen, soweit die Richtigkeit der Daten von dir "
-"bestritten wird, die Verarbeitung grundsätzlich unrechtmäßig ist oder "
+"18 DSGVO kannst du von uns die Einschränkung der Verarbeitung deiner personenbezogenen Daten verlangen, soweit die Richtigkeit der Daten von dir "
+"bestritten wird, die Verarbeitung grundsätzlich unrechtmäßig ist oder "
"die Löschung deiner personenbezogenen Daten durch uns ablehnen, weil du "
-"diese zur Geltendmachung, Ausübung oder Verteidigung von "
+"diese zur Geltendmachung, Ausübung oder Verteidigung von "
"Rechtsansprüchen benötigst. e) Gemäß Art. 20 DSGVO kannst du von "
-"uns verlangen, dass deine personenbezogenen Daten, die du uns zur "
-"Verfügung gestellt hast, in einem strukturierten, maschinenlesbaren und gängigen Format zu erhalten oder du kannst die Übermittlung an eine andere "
+"uns verlangen, dass deine personenbezogenen Daten, die du uns zur "
+"Verfügung gestellt hast, in einem strukturierten, maschinenlesbaren und gängigen Format zu erhalten oder du kannst die Übermittlung an eine andere "
"Stelle verlangen. f) Gemäß Art. 7 Abs. 3 DSGVO kannst du deine "
-"erteilte Einwilligung gegenüber uns jederzeit widerrufen. Dies hat zur "
-"Folge, dass wir die auf dieser Einwilligung beruhende Datenverarbeitung "
+"erteilte Einwilligung gegenüber uns jederzeit widerrufen. Dies hat zur "
+"Folge, dass wir die auf dieser Einwilligung beruhende Datenverarbeitung "
"für die Zukunft nicht mehr fortführen dürfen. g) Gemäß Art. 77 "
-"DSGVO steht dir das Recht zu, dich bei einer Aufsichtsbehörde zu beschweren.8. Hyperlinks und Haftungsausschluss"
+"DSGVO steht dir das Recht zu, dich bei einer Aufsichtsbehörde zu beschweren.8. Hyperlinks und Haftungsausschluss"
"strong> Auf unseren Internetseiten befinden sich sog. „Hyperlinks“, "
"also Verbindungen bzw. Weiterleitungen zu den Internetseiten Dritter. "
-"Bei Aktivierung dieser Hyperlinks durch Anklicken, wirst du von unserer "
-"Internetseite direkt auf die Internetseite eines Dritten weitergeleitet. "
+"Bei Aktivierung dieser Hyperlinks durch Anklicken, wirst du von unserer "
+"Internetseite direkt auf die Internetseite eines Dritten weitergeleitet. "
"Wir können keine Verantwortung für den vertraulichen Umgang deiner Daten "
-"auf diesen Webseiten Dritter übernehmen, da wir keinen Einfluss darauf "
-"haben, dass diese Unternehmen die Datenschutzbestimmungen der DSGVO "
-"einhalten. Wir weisen dich außerdem darauf hin, dass es aufgrund der "
-"Struktur des Internets möglich ist, dass die Regelungen des Datenschutzes bzw. der DSGVO von anderen, dritten Personen oder "
-"Institutionen die nicht innerhalb unseres Verantwortungsbereichs liegen "
-"nicht beachtet werden, oder dass sich spontan, kurzfristig "
-"schwerwiegende Sicherheitslücken in verbreiteten Standards und technischen Protokollen auftun, die die Datenintegrität gefährden könnten."
+"auf diesen Webseiten Dritter übernehmen, da wir keinen Einfluss darauf "
+"haben, dass diese Unternehmen die Datenschutzbestimmungen der DSGVO "
+"einhalten. Wir weisen dich außerdem darauf hin, dass es aufgrund der "
+"Struktur des Internets möglich ist, dass die Regelungen des Datenschutzes bzw. der DSGVO von anderen, dritten Personen oder "
+"Institutionen die nicht innerhalb unseres Verantwortungsbereichs liegen "
+"nicht beachtet werden, oder dass sich spontan, kurzfristig "
+"schwerwiegende Sicherheitslücken in verbreiteten Standards und technischen Protokollen auftun, die die Datenintegrität gefährden könnten."
" \n"
msgid "Page Header"
From 681b1a1d933646f2a2e30834dfd34aabe748de5d Mon Sep 17 00:00:00 2001
From: PCoder
Date: Wed, 30 Jan 2019 23:08:43 +0100
Subject: [PATCH 590/915] Remove some more
---
digitalglarus/locale/de/LC_MESSAGES/django.po | 6 ++----
1 file changed, 2 insertions(+), 4 deletions(-)
diff --git a/digitalglarus/locale/de/LC_MESSAGES/django.po b/digitalglarus/locale/de/LC_MESSAGES/django.po
index 817b6ec2..a4962c61 100644
--- a/digitalglarus/locale/de/LC_MESSAGES/django.po
+++ b/digitalglarus/locale/de/LC_MESSAGES/django.po
@@ -612,13 +612,11 @@ msgstr ""
"Weitergabe der Daten besteht nach Art. 6. Abs. 1 S. 1 lit. c DSGVO eine "
"gesetzliche Verpflichtung. d) Die Weitergabe der Daten ist nach "
"Art. 6. Abs. 1 S. 1 lit. f DSGVO zur Wahrung unserer berechtigten "
-"Interessen, sowie zur Geltendmachung, Ausübung oder Verteidigung von Rechtsansprüchen erforderlich und darüber hinaus kein Grund zu der Annahme "
+"Interessen, sowie zur Geltendmachung, Ausübung oder 6. Cookies, "
"Google Analytics und Twitter Wir setzen auf unseren "
-"Internetseiten sog. „Cookies“ ein. Cookies sind kleine Textdateien, die im Rahmen deines Besuchs einer unserer Internetseiten von uns an den "
+"Internetseiten sog. „Cookies“ ein. Cookies sind kleine Textdateien, die im Rahmen deines Besuchs einer unserer Internetseiten von uns an den "
"Browser deines Endgeräts gesendet und dort gespeichert werden. Einige "
"Funktionen unseres Angebots können ohne den Einsatz bestimmter Cookies "
"grundsätzlich aus technischen Gründen nicht angeboten werden. Du kannst "
From f730f4c00df35ea7de91ae8d952acbaf5c6d0709 Mon Sep 17 00:00:00 2001
From: PCoder
Date: Thu, 31 Jan 2019 21:14:31 +0100
Subject: [PATCH 591/915] Update Changelog
---
Changelog | 2 ++
1 file changed, 2 insertions(+)
diff --git a/Changelog b/Changelog
index 23a6e52a..a9b537d9 100644
--- a/Changelog
+++ b/Changelog
@@ -1,3 +1,5 @@
+Next:
+ * #5151: [all] Add GDPR banner (MR!678 by pcoder)
2.4.7: 2019-01-30
* #6213: [cms] Make ungleich product items equal heights and add option to animate or not animate the contents (MR!682 by Aatish)
2.4.6: 2019-01-09
From 541b08584c4688b343953e55627e32492288313b Mon Sep 17 00:00:00 2001
From: PCoder
Date: Thu, 31 Jan 2019 21:24:36 +0100
Subject: [PATCH 592/915] Update Changelog for 2.4.8
---
Changelog | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/Changelog b/Changelog
index a9b537d9..301e936c 100644
--- a/Changelog
+++ b/Changelog
@@ -1,5 +1,6 @@
-Next:
+2.4.8: 2019-01-31
* #5151: [all] Add GDPR banner (MR!678 by pcoder)
+ * #6059: [dcl] Change topnav font to 400 by default (MR! 680 by Sanghee)
2.4.7: 2019-01-30
* #6213: [cms] Make ungleich product items equal heights and add option to animate or not animate the contents (MR!682 by Aatish)
2.4.6: 2019-01-09
From 2ae3e695e873077476c390724ee661e022e5876d Mon Sep 17 00:00:00 2001
From: PCoder
Date: Thu, 31 Jan 2019 22:43:56 +0100
Subject: [PATCH 593/915] Add styles
---
templates/gdpr/gdpr_banner.html | 13 +++++++++++--
1 file changed, 11 insertions(+), 2 deletions(-)
diff --git a/templates/gdpr/gdpr_banner.html b/templates/gdpr/gdpr_banner.html
index 6368982e..5974a924 100644
--- a/templates/gdpr/gdpr_banner.html
+++ b/templates/gdpr/gdpr_banner.html
@@ -2,6 +2,15 @@
{% if request.COOKIES.gdpr_accepted or IS_TENANT_SITE %}
{% else %}
-
+
{% blocktrans %}This site uses cookies for analytics. By continuing to browse this site, you agree to use this.{% endblocktrans %}
{% trans "Learn more" %} {% trans "Accept" %}
-
+
From 8ec32e4a5e5af75cff5e4a7b2faa1bd59e5f36e3 Mon Sep 17 00:00:00 2001
From: PCoder
Date: Thu, 31 Jan 2019 22:58:23 +0100
Subject: [PATCH 594/915] Add missing styles
---
templates/gdpr/gdpr_banner.html | 521 ++++++++++++++++++++------------
1 file changed, 321 insertions(+), 200 deletions(-)
diff --git a/templates/gdpr/gdpr_banner.html b/templates/gdpr/gdpr_banner.html
index 5974a924..81138c35 100644
--- a/templates/gdpr/gdpr_banner.html
+++ b/templates/gdpr/gdpr_banner.html
@@ -2,214 +2,335 @@
{% if request.COOKIES.gdpr_accepted or IS_TENANT_SITE %}
{% else %}
-
- {% blocktrans %}This site uses cookies for analytics. By continuing to browse this site, you agree to use this.{% endblocktrans %}
-
{% trans "Learn more" %} {% trans "Accept" %}
-
-
-
-
-
-
-
-
-{% blocktrans %}
-1. Responsibility and scope
-
-Responsible in regards to EU General Data Protection Regulation ("GDPR") and other applicable data protection laws:
-
-ungleich glarus ag
-Bahnhofstrasse 1
-8783 Linthal (CH)
-Tel.: (044) 534-66-22
-E-Mail: info@ungleich.ch
-
-This privacy statement applies to the web content of ungleich glarus ag, available at the
-following domains:
-
-ungleich.ch
-datacenterlight.ch
-devuanhosting.com
-devuanhosting.ch
-digitalglarus.ch
-hack4lgarus.ch
-ipv6onlyhosting.com
-ipv6onlyhosting.ch
-ipv6onlyhosting.net
-django-hosting.ch
-rails-hosting.ch
-node-hosting.ch
-blog.ungleich.ch
-
-The Data Privacy Officer:
-
-Sanghee Kim
-ungleich glarus ag
-Bahnhofstrasse 1
-8783 Linthal (CH)
-E-Mail: sanghee.kim@ungleich.ch
-
-
-2. General
-
-User data is personal data which is necessary to establish or change the contractual relations
-between ungleich glarus ag ("us") and you. This includes among other things for example the
-name, the address, the date of birth, the e-mail address or the IP address. We save and use
-your personal data only for the processing of your orders or for getting in contact with you.
-
-
-3. Processing of personal data
-
-When you call one of our websites we collect your IP address. When you register an account with us your contact data will be stored. When you order products on our platform we also collect among others your address and your payment details.
-
-I. Registration data
-
-In the process of registration we need to collect some of your personal data. For example we collect your name, your address, your telephone number, your e-mail address and your payment details to process orders. We do not collect your payment details such as credit card number, expiration date or the cvv code when you pay with credit card. You expose those data directly to the respective payment processor. Payments with credit card are processed by Stripe Payments Europe Ltd. ("Stripe").
-
-
-II. Server log files
-
-When you call one of our websites we automatically save traffic data. Normally the IP address, the type and version of your browser, the time and the website that lead to our website ("Referer") will be saved. Your IP address is collected anonymously so that we cannot match it with your person. The collection of those data is necessary to provide our websites and services, according to Art. 6 par. 1 lit. f GDPR.
-
-
-4. Storage durations
-
-Your data will be deleted immediately, as soon as it isn't relevant anymore for any contract between you and us. In some cases it could be necessary to store your data further, to comply with our contractual or other legal obligatons.
-
-
-5. Disclosure of your personal data
-
-We don't disclose your personal data to third parties, except:
-
-a) You grant us your explicit permission according to Art. 6 par. 1 S. 1 lit. a GDPR.
-
-b) The disclosure of your data is legal and it is necessary to comply with our contractual or other legal obligations, according to Art. 6 par. 1 S. 1 lit b GDPR.
-
-c) There is a law or legal obligation to disclose your data or the disclosure is necessary for the performance of a task carried out in the public interest or in the exercise of an official authority according to Art. 6 par. 1 S. 1 lit. c GDPR.
-
-d) The disclosure of your data is necessary for the purposes of the legitimate interests pursued by us or by a third party, except where such interests are overridden by the interests or your fundamental right according to Art. 6. par. 1 S. 1 lit. f GDPR.
-
-
-6. Cookies, Google Analytics, Twitter
-
-We use Cookies. When you visit one of our websites, information is stored on your terminal device in the form of a "cookie". Cookies are small text files that are stored on your terminal device by your browser. You can opt-out of the storage of cookies in the settings of your browser-software, but however, in this case you might not be able to fully use all functions and services on our website.
-
-We use Google Analytics, a service provided by Google Inc., 1600 Amphitheatre Parkway, Mountainview, CA 94043, USA ("Google"). Google uses Cookies. Google will use these cookies on our behalf to analyse how you use our websites and to generate reports about the activities on our websites. The information collected by those cookies will be transmitted to a Google server in the United States of America. We have Google's IP anonymization activated, so your IP address will be shortened before transmitting to Google. Only in exceptional cases the full IP address will be transmitted and then shortened afterwards.
-
-You may opt out from thecollection of these cookies by downloading and installing a browser plugin available at the following link:
-
-http://tools.google.com/dlpage/gaoptout
-
-You may find further information about the processing of your personal data at the following links:
-
-https://policies.google.com/technologies/ads
-
-https://www.privacyshield.gov/participant?id=a2zt000000001L5AAI&status=Active
-
-https://adssettings.google.com/authenticated
-
-The collected personal data will be deleted or anonymized after 14 months according to Art. 6 par. 1 lit. f GDPR.
-
-Our websites use several functions from the social network Twitter, a service provided by Twitter Inc., 1355 Market Street, Suite 900, San Francisco, CA 94103, USA. We may embed content of Twitter in our websites, such as photos, videos, texts or buttons. If you are registered with Twitter, they may combine your use of these functionalities on our websites with your Twitter account. You may find further information at https://twitter.com/de/privacy.
-
-
-7. Your rights concerning your personal data
-
-Under applicable GDPR you may have the right to:
-
-a) Obtain confirmation as to whether or not personal data concerning you are being processed, and where that is the case, access to the personal data, according to Art. 15 GDPR.
-
-b) Obtain the rectification of false or inaccurate data concerning you, according to Art. 15, Art. 16 GDPR.
-
-c) Obtain the deletion of your personal data, according to Art. 17 GDPR.
-
-d) Obtain the restriction of processing your personal data, according to Art. 18 GDPR.
-
-e) Obtain a digital copy of your personal data processed by us, according to Art. 20 GDPR.
-
-f) Revoke a granted permission regarding your personal data at any time, according to Art. 7 par. 3 GDPR.
-
-g) Complain at a data protection authority, according to Art. 77 GDPR.
-
-
-
-8. Hyperlinks / Disclaimer
-
-This privacy policy applies only to our websites and not to other websites or applications operated by third parties. We may provide links to other websites but we are not responsible for the privacy practices of such other websites.
-
-
-{% endblocktrans %}
-
-
-
-
-
+
+
+ {% blocktrans %}This site uses cookies for analytics. By continuing to
+ browse this site, you agree to use this.{% endblocktrans %}
+
{% trans "Learn more"
+ %}
+
{% trans "Accept" %}
+
+
+
+
+
+
+
+
+
+ {% blocktrans %}
+ 1. Responsibility and scope
+
+ Responsible in regards to EU General Data Protection
+ Regulation ("GDPR") and other applicable data protection
+ laws:
+
+ ungleich glarus ag
+ Bahnhofstrasse 1
+ 8783 Linthal (CH)
+ Tel.: (044) 534-66-22
+ E-Mail: info@ungleich.ch
+
+ This privacy statement applies to the web content of
+ ungleich glarus ag, available at the
+ following domains:
+
+ ungleich.ch
+ datacenterlight.ch
+ devuanhosting.com
+ devuanhosting.ch
+ digitalglarus.ch
+ hack4lgarus.ch
+ ipv6onlyhosting.com
+ ipv6onlyhosting.ch
+ ipv6onlyhosting.net
+ django-hosting.ch
+ rails-hosting.ch
+ node-hosting.ch
+ blog.ungleich.ch
+
+ The Data Privacy Officer:
+
+ Sanghee Kim
+ ungleich glarus ag
+ Bahnhofstrasse 1
+ 8783 Linthal (CH)
+ E-Mail: sanghee.kim@ungleich.ch
+
+
+ 2. General
+
+ User data is personal data which is necessary to establish
+ or change the contractual relations
+ between ungleich glarus ag ("us") and you. This includes
+ among other things for example the
+ name, the address, the date of birth, the e-mail address or
+ the IP address. We save and use
+ your personal data only for the processing of your orders
+ or for getting in contact with you.
+
+
+ 3. Processing of personal data
+
+ When you call one of our websites we collect your IP
+ address. When you register an account with us your contact
+ data will be stored. When you order products on our
+ platform we also collect among others your address and your
+ payment details.
+
+ I. Registration data
+
+ In the process of registration we need to collect some of
+ your personal data. For example we collect your name, your
+ address, your telephone number, your e-mail address and
+ your payment details to process orders. We do not collect
+ your payment details such as credit card number, expiration
+ date or the cvv code when you pay with credit card. You
+ expose those data directly to the respective payment
+ processor. Payments with credit card are processed by
+ Stripe Payments Europe Ltd. ("Stripe").
+
+
+ II. Server log files
+
+ When you call one of our websites we automatically save
+ traffic data. Normally the IP address, the type and version
+ of your browser, the time and the website that lead to our
+ website ("Referer") will be saved. Your IP address is
+ collected anonymously so that we cannot match it with your
+ person. The collection of those data is necessary to
+ provide our websites and services, according to Art. 6 par.
+ 1 lit. f GDPR.
+
+
+ 4. Storage durations
+
+ Your data will be deleted immediately, as soon as it isn't
+ relevant anymore for any contract between you and us. In
+ some cases it could be necessary to store your data
+ further, to comply with our contractual or other legal
+ obligatons.
+
+
+ 5. Disclosure of your personal data
+
+ We don't disclose your personal data to third parties,
+ except:
+
+ a) You grant us your explicit permission according to Art.
+ 6 par. 1 S. 1 lit. a GDPR.
+
+ b) The disclosure of your data is legal and it is necessary
+ to comply with our contractual or other legal obligations,
+ according to Art. 6 par. 1 S. 1 lit b GDPR.
+
+ c) There is a law or legal obligation to disclose your data
+ or the disclosure is necessary for the performance of a
+ task carried out in the public interest or in the exercise
+ of an official authority according to Art. 6 par. 1 S. 1
+ lit. c GDPR.
+
+ d) The disclosure of your data is necessary for the
+ purposes of the legitimate interests pursued by us or by a
+ third party, except where such interests are overridden by
+ the interests or your fundamental right according to Art.
+ 6. par. 1 S. 1 lit. f GDPR.
+
+
+ 6. Cookies, Google Analytics, Twitter
+
+ We use Cookies. When you visit one of our websites,
+ information is stored on your terminal device in the form
+ of a "cookie". Cookies are small text files that are stored
+ on your terminal device by your browser. You can opt-out of
+ the storage of cookies in the settings of your
+ browser-software, but however, in this case you might not
+ be able to fully use all functions and services on our
+ website.
+
+ We use Google Analytics, a service provided by Google Inc.,
+ 1600 Amphitheatre Parkway, Mountainview, CA 94043, USA
+ ("Google"). Google uses Cookies. Google will use these
+ cookies on our behalf to analyse how you use our websites
+ and to generate reports about the activities on our
+ websites. The information collected by those cookies will
+ be transmitted to a Google server in the United States of
+ America. We have Google's IP anonymization activated, so
+ your IP address will be shortened before transmitting to
+ Google. Only in exceptional cases the full IP address will
+ be transmitted and then shortened afterwards.
+
+ You may opt out from thecollection of these cookies by
+ downloading and installing a browser plugin available at
+ the following link:
+
+ http://tools.google.com/dlpage/gaoptout
+
+ You may find further information about the processing of
+ your personal data at the following links:
+
+ https://policies.google.com/technologies/ads
+
+ https://www.privacyshield.gov/participant?id=a2zt000000001L5AAI&status=Active
+
+ https://adssettings.google.com/authenticated
+
+ The collected personal data will be deleted or anonymized
+ after 14 months according to Art. 6 par. 1 lit. f
+ GDPR.
+
+ Our websites use several functions from the social network
+ Twitter, a service provided by Twitter Inc., 1355 Market
+ Street, Suite 900, San Francisco, CA 94103, USA. We may
+ embed content of Twitter in our websites, such as photos,
+ videos, texts or buttons. If you are registered with
+ Twitter, they may combine your use of these functionalities
+ on our websites with your Twitter account. You may find
+ further information at https://twitter.com/de/privacy.
+
+
+ 7. Your rights concerning your personal
+ data
+
+ Under applicable GDPR you may have the right to:
+
+ a) Obtain confirmation as to whether or not personal data
+ concerning you are being processed, and where that is the
+ case, access to the personal data, according to Art. 15
+ GDPR.
+
+ b) Obtain the rectification of false or inaccurate data
+ concerning you, according to Art. 15, Art. 16 GDPR.
+
+ c) Obtain the deletion of your personal data, according to
+ Art. 17 GDPR.
+
+ d) Obtain the restriction of processing your personal data,
+ according to Art. 18 GDPR.
+
+ e) Obtain a digital copy of your personal data processed by
+ us, according to Art. 20 GDPR.
+
+ f) Revoke a granted permission regarding your personal data
+ at any time, according to Art. 7 par. 3 GDPR.
+
+ g) Complain at a data protection authority, according to
+ Art. 77 GDPR.
+
+
+
+ 8. Hyperlinks / Disclaimer
+
+ This privacy policy applies only to our websites and not to
+ other websites or applications operated by third parties.
+ We may provide links to other websites but we are not
+ responsible for the privacy practices of such other
+ websites.
+
+
+ {% endblocktrans %}
+
+
+
+
+
+
{% endif %}
From 596bddb3234fb1f10abc55571a89a0d0fd45474c Mon Sep 17 00:00:00 2001
From: PCoder
Date: Thu, 31 Jan 2019 23:23:51 +0100
Subject: [PATCH 595/915] Add styles by Sanghee
---
templates/gdpr/gdpr_banner.html | 11 +++++------
1 file changed, 5 insertions(+), 6 deletions(-)
diff --git a/templates/gdpr/gdpr_banner.html b/templates/gdpr/gdpr_banner.html
index 81138c35..a016e773 100644
--- a/templates/gdpr/gdpr_banner.html
+++ b/templates/gdpr/gdpr_banner.html
@@ -18,7 +18,7 @@
bottom: 0;
width: 100%;
padding: 10px;
- background-color: #29427A;
+ background-color: #26262766;
z-index: 999;
color: #ffffff;
}
@@ -30,6 +30,7 @@
}
#gdprBanner button {
+ background-color: #3f44466e;
margin-left: 25px;
display: inline-block;
padding: 6px 12px;
@@ -43,8 +44,7 @@
-ms-touch-action: manipulation;
touch-action: manipulation;
cursor: pointer;
- background-image: none;
- border: 1px solid transparent;
+ border: 1.5px solid #fdfeffe3;
border-radius: 4px;
}
@@ -66,7 +66,7 @@
%}
{% trans "Accept" %}
+ data-dismiss="modal">{% trans "OK" %}
@@ -78,8 +78,7 @@
×
-
{% blocktrans %}Privacy policy{%
- endblocktrans %}
+ {% trans "Privacy policy" %}
From 9277208b1686f54e0f6c4bc30351bf4224b49123 Mon Sep 17 00:00:00 2001
From: PCoder
Date: Fri, 1 Feb 2019 00:48:52 +0100
Subject: [PATCH 596/915] More styles
---
templates/gdpr/gdpr_banner.html | 11 +++++------
1 file changed, 5 insertions(+), 6 deletions(-)
diff --git a/templates/gdpr/gdpr_banner.html b/templates/gdpr/gdpr_banner.html
index a016e773..a92bfa84 100644
--- a/templates/gdpr/gdpr_banner.html
+++ b/templates/gdpr/gdpr_banner.html
@@ -33,7 +33,7 @@
background-color: #3f44466e;
margin-left: 25px;
display: inline-block;
- padding: 6px 12px;
+ padding: 6px;
margin-bottom: 0;
font-size: 14px;
font-weight: 400;
@@ -46,6 +46,7 @@
cursor: pointer;
border: 1.5px solid #fdfeffe3;
border-radius: 4px;
+ box-shadow: unset;
}
.gdpr-text-letter-spacing {
@@ -56,14 +57,12 @@
letter-spacing: 0.6px;
}
-
+
{% blocktrans %}This site uses cookies for analytics. By continuing to
browse this site, you agree to use this.{% endblocktrans %}
-
{% trans "Learn more"
- %}
+
{% trans "Learn more" %}
{% trans "OK" %}
@@ -295,7 +294,7 @@
{% endblocktrans %}
-
diff --git a/digitalglarus/templates/digitalglarus/membership_activated.html b/digitalglarus/templates/digitalglarus/membership_activated.html
index db641555..a63cf2cc 100644
--- a/digitalglarus/templates/digitalglarus/membership_activated.html
+++ b/digitalglarus/templates/digitalglarus/membership_activated.html
@@ -45,7 +45,7 @@
In der Au 7 Schwanden 8762 Switzerland
info@digitalglarus.ch
- (044) 534-66-22
+ +41 55 505 6266
diff --git a/digitalglarus/templates/digitalglarus/membership_deactivated.html b/digitalglarus/templates/digitalglarus/membership_deactivated.html
index 408a9350..89f862d7 100644
--- a/digitalglarus/templates/digitalglarus/membership_deactivated.html
+++ b/digitalglarus/templates/digitalglarus/membership_deactivated.html
@@ -101,7 +101,7 @@
In der Au 7 Schwanden 8762 Switzerland
info@digitalglarus.ch
- (044) 534-66-22
+ +41 55 505 6266
diff --git a/digitalglarus/templates/digitalglarus/membership_deactivated_success.html b/digitalglarus/templates/digitalglarus/membership_deactivated_success.html
index 97f41a04..0156359d 100644
--- a/digitalglarus/templates/digitalglarus/membership_deactivated_success.html
+++ b/digitalglarus/templates/digitalglarus/membership_deactivated_success.html
@@ -42,7 +42,7 @@
In der Au 7 Schwanden 8762 Switzerland
info@digitalglarus.ch
- (044) 534-66-22
+ +41 55 505 6266
diff --git a/digitalglarus/templates/digitalglarus/membership_payment.html b/digitalglarus/templates/digitalglarus/membership_payment.html
index 0e68be43..8a2b79c7 100644
--- a/digitalglarus/templates/digitalglarus/membership_payment.html
+++ b/digitalglarus/templates/digitalglarus/membership_payment.html
@@ -238,7 +238,7 @@
In der Au 7 Schwanden 8762 Switzerland
info@digitalglarus.ch
- (044) 534-66-22
+ +41 55 505 6266
diff --git a/digitalglarus/templates/digitalglarus/membership_pricing.html b/digitalglarus/templates/digitalglarus/membership_pricing.html
index 1342a365..28de2bda 100644
--- a/digitalglarus/templates/digitalglarus/membership_pricing.html
+++ b/digitalglarus/templates/digitalglarus/membership_pricing.html
@@ -123,7 +123,7 @@
In der Au 7 Schwanden 8762 Switzerland
info@digitalglarus.ch
- (044) 534-66-22
+ +41 55 505 6266
diff --git a/digitalglarus/templates/digitalglarus/reset_password.html b/digitalglarus/templates/digitalglarus/reset_password.html
index 9272ce36..2cd0c2b9 100644
--- a/digitalglarus/templates/digitalglarus/reset_password.html
+++ b/digitalglarus/templates/digitalglarus/reset_password.html
@@ -46,7 +46,7 @@
In der Au 7 Schwanden 8762 Switzerland
info@digitalglarus.ch
- (044) 534-66-22
+ +41 55 505 6266
diff --git a/digitalglarus/templates/digitalglarus/signup.html b/digitalglarus/templates/digitalglarus/signup.html
index 6a46294a..fbc8646c 100644
--- a/digitalglarus/templates/digitalglarus/signup.html
+++ b/digitalglarus/templates/digitalglarus/signup.html
@@ -50,7 +50,7 @@
In der Au 7 Schwanden 8762 Switzerland
info@digitalglarus.ch
- (044) 534-66-22
+ +41 55 505 6266
diff --git a/digitalglarus/templates/digitalglarus/user_billing_address.html b/digitalglarus/templates/digitalglarus/user_billing_address.html
index ec5fddf2..b5e86d56 100644
--- a/digitalglarus/templates/digitalglarus/user_billing_address.html
+++ b/digitalglarus/templates/digitalglarus/user_billing_address.html
@@ -78,7 +78,7 @@
In der Au 7 Schwanden 8762 Switzerland
info@digitalglarus.ch
- (044) 534-66-22
+ +41 55 505 6266
diff --git a/templates/gdpr/gdpr_banner.html b/templates/gdpr/gdpr_banner.html
index 76e60008..7e9f5c7f 100644
--- a/templates/gdpr/gdpr_banner.html
+++ b/templates/gdpr/gdpr_banner.html
@@ -120,7 +120,7 @@
ungleich glarus ag
Bahnhofstrasse 1
8783 Linthal (CH)
- Tel.: (044) 534-66-22
+ Tel.: +41 55 505 6266
E-Mail: info@ungleich.ch
This privacy statement applies to the web content of
diff --git a/ungleich_page/templates/ungleich_page/includes/_contact_us.html b/ungleich_page/templates/ungleich_page/includes/_contact_us.html
index 1038f358..55b86706 100644
--- a/ungleich_page/templates/ungleich_page/includes/_contact_us.html
+++ b/ungleich_page/templates/ungleich_page/includes/_contact_us.html
@@ -22,7 +22,7 @@
info@ungleich.ch
-
(044) 534-66-22
+
+41 55 505 6266
From 46c3bb1ce4dd6fa2b57c166a8c3a2cf57c7dc810 Mon Sep 17 00:00:00 2001
From: PCoder
Date: Thu, 14 Feb 2019 20:56:12 +0100
Subject: [PATCH 609/915] Update Changelog for 2.4.10
---
Changelog | 2 ++
1 file changed, 2 insertions(+)
diff --git a/Changelog b/Changelog
index 0c6c61d1..96108b80 100644
--- a/Changelog
+++ b/Changelog
@@ -1,3 +1,5 @@
+2.4.10: 2019-02-14
+ * #6451: [dg, gdpr banner] Update phone number (MR!688 by pcoder)
2.4.9: 2019-02-01
* bugfix: Fix inconsistent styles in GDPR modal (MR!679 by pcoder)
2.4.8: 2019-01-31
From 0e84081880404955b5c2746e731f9ee026ba78e9 Mon Sep 17 00:00:00 2001
From: PCoder
Date: Tue, 2 Apr 2019 09:18:15 +0200
Subject: [PATCH 610/915] Add monthlyhostingbill model + code
---
hosting/models.py | 22 ++++++++++++++++++++++
utils/stripe_utils.py | 20 ++++++++++++++++++++
2 files changed, 42 insertions(+)
diff --git a/hosting/models.py b/hosting/models.py
index 707b072d..4e4e2a59 100644
--- a/hosting/models.py
+++ b/hosting/models.py
@@ -232,6 +232,28 @@ class HostingBill(AssignPermissionsMixin, models.Model):
return instance
+class MonthlyHostingBill(AssignPermissionsMixin, models.Model):
+ customer = models.ForeignKey(StripeCustomer)
+ order = models.ForeignKey(HostingOrder)
+ receipt_number = models.CharField(
+ help_text="The receipt number that is generated on Stripe"
+ )
+ invoice_number = models.CharField(
+ help_text="The invoice number that is generated on Stripe"
+ )
+ billing_period = models.CharField(
+ help_text="The billing period for which the bill is valid"
+ )
+ date_paid = models.DateField(help_text="Date on which the bill was paid")
+
+ permissions = ('view_monthlyhostingbill',)
+
+ class Meta:
+ permissions = (
+ ('view_monthlyhostingbill', 'View Monthly Hosting'),
+ )
+
+
class VMDetail(models.Model):
user = models.ForeignKey(CustomUser)
vm_id = models.IntegerField(default=0)
diff --git a/utils/stripe_utils.py b/utils/stripe_utils.py
index a3224a0e..d412cbd0 100644
--- a/utils/stripe_utils.py
+++ b/utils/stripe_utils.py
@@ -122,6 +122,26 @@ class StripeUtils(object):
}
return card_details
+ @handleStripeError
+ def get_all_invoices(self, customer_id):
+ invoices = stripe.Invoice.list(limit=100, customer=customer_id)
+ return_list = []
+ for invoice in invoices:
+ invoice_details = {
+ 'created': invoice.created,
+ 'receipt_number': invoice.receipt_number,
+ 'invoice_number': invoice.number,
+ 'date_paid': invoice.date_paid,
+ 'period_start': invoice.period_start,
+ 'period_end': invoice.period_end,
+ 'paid': invoice.paid,
+ 'billing_reason': invoice.billing_reason,
+ 'discount': invoice.discount.coupon.amount_off if invoice.discount else 0,
+ 'total': invoice.total
+ }
+ return_list.append(invoice_details)
+ return return_list
+
@handleStripeError
def get_cards_details_from_token(self, token):
stripe_token = stripe.Token.retrieve(token)
From 8dc00c9dd9040d1921bee56c3a67fd908def5ee3 Mon Sep 17 00:00:00 2001
From: PCoder
Date: Tue, 2 Apr 2019 09:18:46 +0200
Subject: [PATCH 611/915] Add management command
---
.../management/commands/fetch_stripe_bills.py | 28 +++++++++++++++++++
1 file changed, 28 insertions(+)
create mode 100644 hosting/management/commands/fetch_stripe_bills.py
diff --git a/hosting/management/commands/fetch_stripe_bills.py b/hosting/management/commands/fetch_stripe_bills.py
new file mode 100644
index 00000000..3a06a1d9
--- /dev/null
+++ b/hosting/management/commands/fetch_stripe_bills.py
@@ -0,0 +1,28 @@
+from django.core.management.base import BaseCommand
+
+from hosting.models import UserCardDetail
+from membership.models import CustomUser
+from utils.stripe_utils import StripeUtils
+
+
+class Command(BaseCommand):
+ help = '''Fetches invoices from Stripe and creates bills for a given
+ customer in the MonthlyHostingBill model'''
+
+ def add_arguments(self, parser):
+ parser.add_argument('customer_email', nargs='+', type=str)
+
+ def handle(self, *args, **options):
+ try:
+ for email in options['customer_email']:
+ stripe_utils = StripeUtils()
+ user = CustomUser.objects.get(email=email)
+ if hasattr(user, 'stripecustomer'):
+ self.stdout.write(self.style.SUCCESS('Found %s. Fetching bills for him.' % email))
+ stripe_utils.get_all_invoices(
+ user.stripecustomer.stripe_id
+ )
+ else:
+ self.stdout.write(self.style.SUCCESS('Customer email %s does not have a stripe customer.' % email))
+ except Exception as e:
+ print(" *** Error occurred. Details {}".format(str(e)))
From 6d42f88be1c2d3955812ac50a3ada803afcabe35 Mon Sep 17 00:00:00 2001
From: PCoder
Date: Wed, 3 Apr 2019 06:12:48 +0200
Subject: [PATCH 612/915] Complete implementation of fetch_stripe_bills
---
.../management/commands/fetch_stripe_bills.py | 35 +++++++++++--
hosting/models.py | 38 +++++++++++---
utils/stripe_utils.py | 51 +++++++++++++------
3 files changed, 97 insertions(+), 27 deletions(-)
diff --git a/hosting/management/commands/fetch_stripe_bills.py b/hosting/management/commands/fetch_stripe_bills.py
index 3a06a1d9..6285ec0a 100644
--- a/hosting/management/commands/fetch_stripe_bills.py
+++ b/hosting/management/commands/fetch_stripe_bills.py
@@ -1,9 +1,13 @@
+import logging
+
from django.core.management.base import BaseCommand
-from hosting.models import UserCardDetail
+from hosting.models import MonthlyHostingBill
from membership.models import CustomUser
from utils.stripe_utils import StripeUtils
+logger = logging.getLogger(__name__)
+
class Command(BaseCommand):
help = '''Fetches invoices from Stripe and creates bills for a given
@@ -18,11 +22,32 @@ class Command(BaseCommand):
stripe_utils = StripeUtils()
user = CustomUser.objects.get(email=email)
if hasattr(user, 'stripecustomer'):
- self.stdout.write(self.style.SUCCESS('Found %s. Fetching bills for him.' % email))
- stripe_utils.get_all_invoices(
- user.stripecustomer.stripe_id
+ self.stdout.write(self.style.SUCCESS(
+ 'Found %s. Fetching bills for him.' % email))
+ mhb = MonthlyHostingBill.objects.last(
+ customer=user.stripecustomer
)
+ created_gt = {}
+ if mhb is not None:
+ # fetch only invoices which is created after
+ # mhb.created, because we already have invoices till
+ # this date
+ created_gt = {'gt': mhb.created}
+
+ all_invoices_response = stripe_utils.get_all_invoices(
+ user.stripecustomer.stripe_id,
+ created=created_gt
+ )
+ all_invoices = all_invoices_response['response_object']
+ logger.debug(
+ "Obtained {} invoices".format(len(all_invoices))
+ )
+ for invoice in all_invoices:
+ MonthlyHostingBill.create(
+ invoice, stripe_customer=user.stripecustomer
+ )
else:
- self.stdout.write(self.style.SUCCESS('Customer email %s does not have a stripe customer.' % email))
+ self.stdout.write(self.style.SUCCESS(
+ 'Customer email %s does not have a stripe customer.' % email))
except Exception as e:
print(" *** Error occurred. Details {}".format(str(e)))
diff --git a/hosting/models.py b/hosting/models.py
index 4e4e2a59..856e83ea 100644
--- a/hosting/models.py
+++ b/hosting/models.py
@@ -235,16 +235,24 @@ class HostingBill(AssignPermissionsMixin, models.Model):
class MonthlyHostingBill(AssignPermissionsMixin, models.Model):
customer = models.ForeignKey(StripeCustomer)
order = models.ForeignKey(HostingOrder)
+ created = models.DateTimeField(help_text="When the invoice was created")
receipt_number = models.CharField(
- help_text="The receipt number that is generated on Stripe"
+ help_text="The receipt number that is generated on Stripe",
+ max_length=100
)
invoice_number = models.CharField(
- help_text="The invoice number that is generated on Stripe"
+ help_text="The invoice number that is generated on Stripe",
+ max_length=100
)
- billing_period = models.CharField(
- help_text="The billing period for which the bill is valid"
- )
- date_paid = models.DateField(help_text="Date on which the bill was paid")
+ paid_at = models.DateTimeField(help_text="Date on which the bill was paid")
+ period_start = models.DateTimeField()
+ period_end = models.DateTimeField()
+ billing_reason = models.CharField(max_length=25)
+ discount = models.PositiveIntegerField()
+ total = models.IntegerField()
+ lines_data_count = models.IntegerField()
+ invoice_id = models.CharField(unique=True, max_length=100)
+ lines_meta_data_csv = models.TextField()
permissions = ('view_monthlyhostingbill',)
@@ -253,6 +261,24 @@ class MonthlyHostingBill(AssignPermissionsMixin, models.Model):
('view_monthlyhostingbill', 'View Monthly Hosting'),
)
+ @classmethod
+ def create(cls, stripe_customer, **args):
+ instance = cls.objects.create(args)
+ instance.customer = stripe_customer
+ if len(instance.lines_meta_data_csv) > 0:
+ vm_ids = [vm_id.strip() for vm_id in instance.lines_meta_data_csv.split(",")]
+ if len(vm_ids) == 1:
+ instance.order = HostingOrder.objects.get(vm_id=vm_ids[0])
+ else:
+ logger.debug(
+ "More than one VM_ID"
+ "for MonthlyHostingBill {}".format(instance.invoice_id)
+ )
+ logger.debug("VM_IDS=".format(','.join(vm_ids)))
+ instance.assign_permissions(stripe_customer.user)
+ instance.save()
+ return instance
+
class VMDetail(models.Model):
user = models.ForeignKey(CustomUser)
diff --git a/utils/stripe_utils.py b/utils/stripe_utils.py
index d412cbd0..63df0133 100644
--- a/utils/stripe_utils.py
+++ b/utils/stripe_utils.py
@@ -123,23 +123,42 @@ class StripeUtils(object):
return card_details
@handleStripeError
- def get_all_invoices(self, customer_id):
- invoices = stripe.Invoice.list(limit=100, customer=customer_id)
+ def get_all_invoices(self, customer_id, created):
return_list = []
- for invoice in invoices:
- invoice_details = {
- 'created': invoice.created,
- 'receipt_number': invoice.receipt_number,
- 'invoice_number': invoice.number,
- 'date_paid': invoice.date_paid,
- 'period_start': invoice.period_start,
- 'period_end': invoice.period_end,
- 'paid': invoice.paid,
- 'billing_reason': invoice.billing_reason,
- 'discount': invoice.discount.coupon.amount_off if invoice.discount else 0,
- 'total': invoice.total
- }
- return_list.append(invoice_details)
+ has_more_invoices = True
+ starting_after = False
+ while has_more_invoices:
+ if starting_after:
+ invoices = stripe.Invoice.list(
+ limit=10, customer=customer_id, created=created
+ )
+ else:
+ invoices = stripe.Invoice.list(
+ limit=10, customer=customer_id, created=created,
+ starting_after=starting_after
+ )
+ has_more_invoices = invoices.has_more
+ for invoice in invoices.data:
+ invoice_details = {
+ 'created': invoice.created,
+ 'receipt_number': invoice.receipt_number,
+ 'invoice_number': invoice.number,
+ 'paid_at': invoice.status_transitions.paid_at if invoice.paid else 0,
+ 'period_start': invoice.period_start,
+ 'period_end': invoice.period_end,
+ 'billing_reason': invoice.billing_reason,
+ 'discount': invoice.discount.coupon.amount_off if invoice.discount else 0,
+ 'total': invoice.total,
+ # to see how many line items we have in this invoice and
+ # then later check if we have more than 1
+ 'lines_data_count': len(invoice.lines.data),
+ 'invoice_id': invoice.id,
+ 'lines_meta_data_csv': ','.join(
+ [line.metadata.VM_ID for line in invoice.lines.data]
+ )
+ }
+ starting_after = invoice.id
+ return_list.append(invoice_details)
return return_list
@handleStripeError
From 0bc8c350312216baf3a23ea3d2d1a366eefe6ae8 Mon Sep 17 00:00:00 2001
From: PCoder
Date: Wed, 3 Apr 2019 06:13:12 +0200
Subject: [PATCH 613/915] Add migration
---
hosting/migrations/0050_monthlyhostingbill.py | 42 +++++++++++++++++++
1 file changed, 42 insertions(+)
create mode 100644 hosting/migrations/0050_monthlyhostingbill.py
diff --git a/hosting/migrations/0050_monthlyhostingbill.py b/hosting/migrations/0050_monthlyhostingbill.py
new file mode 100644
index 00000000..34d29e68
--- /dev/null
+++ b/hosting/migrations/0050_monthlyhostingbill.py
@@ -0,0 +1,42 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.9.4 on 2019-04-03 03:47
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+import django.db.models.deletion
+import utils.mixins
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('membership', '0007_auto_20180213_0128'),
+ ('hosting', '0049_auto_20181005_0736'),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='MonthlyHostingBill',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('created', models.DateTimeField(help_text='When the invoice was created')),
+ ('receipt_number', models.CharField(help_text='The receipt number that is generated on Stripe', max_length=100)),
+ ('invoice_number', models.CharField(help_text='The invoice number that is generated on Stripe', max_length=100)),
+ ('paid_at', models.DateTimeField(help_text='Date on which the bill was paid')),
+ ('period_start', models.DateTimeField()),
+ ('period_end', models.DateTimeField()),
+ ('billing_reason', models.CharField(max_length=25)),
+ ('discount', models.PositiveIntegerField()),
+ ('total', models.IntegerField()),
+ ('lines_data_count', models.IntegerField()),
+ ('invoice_id', models.CharField(max_length=100, unique=True)),
+ ('lines_meta_data_csv', models.TextField()),
+ ('customer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='membership.StripeCustomer')),
+ ('order', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='hosting.HostingOrder')),
+ ],
+ options={
+ 'permissions': (('view_monthlyhostingbill', 'View Monthly Hosting'),),
+ },
+ bases=(utils.mixins.AssignPermissionsMixin, models.Model),
+ ),
+ ]
From b1566c4c61605ff5f9122af6a00d10ebfb2b2dfd Mon Sep 17 00:00:00 2001
From: PCoder
Date: Wed, 3 Apr 2019 06:22:49 +0200
Subject: [PATCH 614/915] Get the last monthly hosting bill
---
hosting/management/commands/fetch_stripe_bills.py | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/hosting/management/commands/fetch_stripe_bills.py b/hosting/management/commands/fetch_stripe_bills.py
index 6285ec0a..fb4718c7 100644
--- a/hosting/management/commands/fetch_stripe_bills.py
+++ b/hosting/management/commands/fetch_stripe_bills.py
@@ -24,9 +24,8 @@ class Command(BaseCommand):
if hasattr(user, 'stripecustomer'):
self.stdout.write(self.style.SUCCESS(
'Found %s. Fetching bills for him.' % email))
- mhb = MonthlyHostingBill.objects.last(
- customer=user.stripecustomer
- )
+ mhb = MonthlyHostingBill.objects.filter(
+ customer=user.stripecustomer).last()
created_gt = {}
if mhb is not None:
# fetch only invoices which is created after
From 6f1449836a654cad5eefe23720d07764017de077 Mon Sep 17 00:00:00 2001
From: PCoder
Date: Wed, 3 Apr 2019 06:27:54 +0200
Subject: [PATCH 615/915] Fix a bug: use starting_after if its defined
---
utils/stripe_utils.py | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/utils/stripe_utils.py b/utils/stripe_utils.py
index 63df0133..ee6e1b18 100644
--- a/utils/stripe_utils.py
+++ b/utils/stripe_utils.py
@@ -130,12 +130,12 @@ class StripeUtils(object):
while has_more_invoices:
if starting_after:
invoices = stripe.Invoice.list(
- limit=10, customer=customer_id, created=created
+ limit=10, customer=customer_id, created=created,
+ starting_after=starting_after
)
else:
invoices = stripe.Invoice.list(
- limit=10, customer=customer_id, created=created,
- starting_after=starting_after
+ limit=10, customer=customer_id, created=created
)
has_more_invoices = invoices.has_more
for invoice in invoices.data:
From b7dd4acb0798d655a9becc8c5e09d0a37071f4f4 Mon Sep 17 00:00:00 2001
From: PCoder
Date: Wed, 3 Apr 2019 06:33:28 +0200
Subject: [PATCH 616/915] Correct the way of getting VM_ID meta data
---
utils/stripe_utils.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/utils/stripe_utils.py b/utils/stripe_utils.py
index ee6e1b18..53346626 100644
--- a/utils/stripe_utils.py
+++ b/utils/stripe_utils.py
@@ -154,7 +154,7 @@ class StripeUtils(object):
'lines_data_count': len(invoice.lines.data),
'invoice_id': invoice.id,
'lines_meta_data_csv': ','.join(
- [line.metadata.VM_ID for line in invoice.lines.data]
+ [line.metadata.VM_ID if line.metadata.VM_ID is not None else '' for line in invoice.lines.data]
)
}
starting_after = invoice.id
From 3eaa53ca78bb7e52027853ce53409d46493fd471 Mon Sep 17 00:00:00 2001
From: PCoder
Date: Wed, 3 Apr 2019 06:36:28 +0200
Subject: [PATCH 617/915] Use stdout instead of logger
---
hosting/management/commands/fetch_stripe_bills.py | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/hosting/management/commands/fetch_stripe_bills.py b/hosting/management/commands/fetch_stripe_bills.py
index fb4718c7..89fffb27 100644
--- a/hosting/management/commands/fetch_stripe_bills.py
+++ b/hosting/management/commands/fetch_stripe_bills.py
@@ -38,9 +38,7 @@ class Command(BaseCommand):
created=created_gt
)
all_invoices = all_invoices_response['response_object']
- logger.debug(
- "Obtained {} invoices".format(len(all_invoices))
- )
+ self.stdout.write(self.style.SUCCESS("Obtained {} invoices".format(len(all_invoices))))
for invoice in all_invoices:
MonthlyHostingBill.create(
invoice, stripe_customer=user.stripecustomer
From 033db01810643f9c9129b57103269ee7622b70cf Mon Sep 17 00:00:00 2001
From: PCoder
Date: Wed, 3 Apr 2019 06:51:19 +0200
Subject: [PATCH 618/915] Correct error in getting lines data count
---
utils/stripe_utils.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/utils/stripe_utils.py b/utils/stripe_utils.py
index 53346626..834b2201 100644
--- a/utils/stripe_utils.py
+++ b/utils/stripe_utils.py
@@ -151,7 +151,7 @@ class StripeUtils(object):
'total': invoice.total,
# to see how many line items we have in this invoice and
# then later check if we have more than 1
- 'lines_data_count': len(invoice.lines.data),
+ 'lines_data_count': len(invoice.lines.data) if invoice.lines.data is not None else 0,
'invoice_id': invoice.id,
'lines_meta_data_csv': ','.join(
[line.metadata.VM_ID if line.metadata.VM_ID is not None else '' for line in invoice.lines.data]
From c85a4f379652c8fb19031164b234c84f442db885 Mon Sep 17 00:00:00 2001
From: PCoder
Date: Wed, 3 Apr 2019 06:59:05 +0200
Subject: [PATCH 619/915] Catch error from stripe call
---
hosting/management/commands/fetch_stripe_bills.py | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/hosting/management/commands/fetch_stripe_bills.py b/hosting/management/commands/fetch_stripe_bills.py
index 89fffb27..7219341b 100644
--- a/hosting/management/commands/fetch_stripe_bills.py
+++ b/hosting/management/commands/fetch_stripe_bills.py
@@ -37,8 +37,11 @@ class Command(BaseCommand):
user.stripecustomer.stripe_id,
created=created_gt
)
+ if all_invoices_response['error'] is not None:
+ self.stdout.write(self.style.ERROR(all_invoices_response['error']))
+ exit(1)
all_invoices = all_invoices_response['response_object']
- self.stdout.write(self.style.SUCCESS("Obtained {} invoices".format(len(all_invoices))))
+ self.stdout.write(self.style.SUCCESS("Obtained {} invoices".format(len(all_invoices) if all_invoices is not None else 0)))
for invoice in all_invoices:
MonthlyHostingBill.create(
invoice, stripe_customer=user.stripecustomer
From dbf3b92c063b5b965e50874522cbd8927e32cf58 Mon Sep 17 00:00:00 2001
From: PCoder
Date: Wed, 3 Apr 2019 07:08:39 +0200
Subject: [PATCH 620/915] Add logging and verbosity
---
.../management/commands/fetch_stripe_bills.py | 23 +++++++++++++++++++
1 file changed, 23 insertions(+)
diff --git a/hosting/management/commands/fetch_stripe_bills.py b/hosting/management/commands/fetch_stripe_bills.py
index 7219341b..cbb09a2e 100644
--- a/hosting/management/commands/fetch_stripe_bills.py
+++ b/hosting/management/commands/fetch_stripe_bills.py
@@ -1,4 +1,5 @@
import logging
+import sys
from django.core.management.base import BaseCommand
@@ -13,10 +14,32 @@ class Command(BaseCommand):
help = '''Fetches invoices from Stripe and creates bills for a given
customer in the MonthlyHostingBill model'''
+ def set_logger(self, verbosity):
+ """
+ Set logger level based on verbosity option
+ """
+ handler = logging.StreamHandler(sys.stdout)
+ formatter = logging.Formatter('%(asctime)s|%(levelname)s|%(module)s| %(message)s')
+ handler.setFormatter(formatter)
+ logger.addHandler(handler)
+
+ if verbosity == 0:
+ self.logger.setLevel(logging.WARN)
+ elif verbosity == 1: # default
+ self.logger.setLevel(logging.INFO)
+ elif verbosity > 1:
+ self.logger.setLevel(logging.DEBUG)
+
+ # verbosity 3: also enable all logging statements that reach the root
+ # logger
+ if verbosity > 2:
+ logging.getLogger().setLevel(logging.DEBUG)
+
def add_arguments(self, parser):
parser.add_argument('customer_email', nargs='+', type=str)
def handle(self, *args, **options):
+ self.set_logger(options.get('verbosity'))
try:
for email in options['customer_email']:
stripe_utils = StripeUtils()
From 66ffbf38aa729ba753878bcccb6b799fb4f58582 Mon Sep 17 00:00:00 2001
From: PCoder
Date: Wed, 3 Apr 2019 07:32:18 +0200
Subject: [PATCH 621/915] Handle if VM_ID metadata is not set
---
utils/stripe_utils.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/utils/stripe_utils.py b/utils/stripe_utils.py
index 834b2201..7211465a 100644
--- a/utils/stripe_utils.py
+++ b/utils/stripe_utils.py
@@ -154,7 +154,7 @@ class StripeUtils(object):
'lines_data_count': len(invoice.lines.data) if invoice.lines.data is not None else 0,
'invoice_id': invoice.id,
'lines_meta_data_csv': ','.join(
- [line.metadata.VM_ID if line.metadata.VM_ID is not None else '' for line in invoice.lines.data]
+ [line.metadata.VM_ID if hasattr(line.metadata, 'VM_ID') else '' for line in invoice.lines.data]
)
}
starting_after = invoice.id
From 444f79eab7f03724be7ec5bfef165229895475e0 Mon Sep 17 00:00:00 2001
From: PCoder
Date: Wed, 3 Apr 2019 07:35:43 +0200
Subject: [PATCH 622/915] Remove unwanted logger code
---
.../management/commands/fetch_stripe_bills.py | 23 -------------------
1 file changed, 23 deletions(-)
diff --git a/hosting/management/commands/fetch_stripe_bills.py b/hosting/management/commands/fetch_stripe_bills.py
index cbb09a2e..7219341b 100644
--- a/hosting/management/commands/fetch_stripe_bills.py
+++ b/hosting/management/commands/fetch_stripe_bills.py
@@ -1,5 +1,4 @@
import logging
-import sys
from django.core.management.base import BaseCommand
@@ -14,32 +13,10 @@ class Command(BaseCommand):
help = '''Fetches invoices from Stripe and creates bills for a given
customer in the MonthlyHostingBill model'''
- def set_logger(self, verbosity):
- """
- Set logger level based on verbosity option
- """
- handler = logging.StreamHandler(sys.stdout)
- formatter = logging.Formatter('%(asctime)s|%(levelname)s|%(module)s| %(message)s')
- handler.setFormatter(formatter)
- logger.addHandler(handler)
-
- if verbosity == 0:
- self.logger.setLevel(logging.WARN)
- elif verbosity == 1: # default
- self.logger.setLevel(logging.INFO)
- elif verbosity > 1:
- self.logger.setLevel(logging.DEBUG)
-
- # verbosity 3: also enable all logging statements that reach the root
- # logger
- if verbosity > 2:
- logging.getLogger().setLevel(logging.DEBUG)
-
def add_arguments(self, parser):
parser.add_argument('customer_email', nargs='+', type=str)
def handle(self, *args, **options):
- self.set_logger(options.get('verbosity'))
try:
for email in options['customer_email']:
stripe_utils = StripeUtils()
From 12b8a778623de9121a2246ac0506264070aabe33 Mon Sep 17 00:00:00 2001
From: PCoder
Date: Wed, 3 Apr 2019 09:03:58 +0200
Subject: [PATCH 623/915] Fix issues and also include subscription_id
---
.../management/commands/fetch_stripe_bills.py | 5 +-
hosting/migrations/0051_auto_20190403_0703.py | 25 +++++++
hosting/models.py | 65 ++++++++++++++++---
utils/stripe_utils.py | 5 +-
4 files changed, 86 insertions(+), 14 deletions(-)
create mode 100644 hosting/migrations/0051_auto_20190403_0703.py
diff --git a/hosting/management/commands/fetch_stripe_bills.py b/hosting/management/commands/fetch_stripe_bills.py
index 7219341b..8f35aa8c 100644
--- a/hosting/management/commands/fetch_stripe_bills.py
+++ b/hosting/management/commands/fetch_stripe_bills.py
@@ -43,9 +43,8 @@ class Command(BaseCommand):
all_invoices = all_invoices_response['response_object']
self.stdout.write(self.style.SUCCESS("Obtained {} invoices".format(len(all_invoices) if all_invoices is not None else 0)))
for invoice in all_invoices:
- MonthlyHostingBill.create(
- invoice, stripe_customer=user.stripecustomer
- )
+ invoice['customer'] = user.stripecustomer
+ MonthlyHostingBill.create(invoice)
else:
self.stdout.write(self.style.SUCCESS(
'Customer email %s does not have a stripe customer.' % email))
diff --git a/hosting/migrations/0051_auto_20190403_0703.py b/hosting/migrations/0051_auto_20190403_0703.py
new file mode 100644
index 00000000..d1f87e53
--- /dev/null
+++ b/hosting/migrations/0051_auto_20190403_0703.py
@@ -0,0 +1,25 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.9.4 on 2019-04-03 07:03
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('hosting', '0050_monthlyhostingbill'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='monthlyhostingbill',
+ name='subscription_ids_csv',
+ field=models.TextField(default=''),
+ ),
+ migrations.AlterField(
+ model_name='monthlyhostingbill',
+ name='lines_meta_data_csv',
+ field=models.TextField(default=''),
+ ),
+ ]
diff --git a/hosting/models.py b/hosting/models.py
index 856e83ea..c976c336 100644
--- a/hosting/models.py
+++ b/hosting/models.py
@@ -1,8 +1,10 @@
import logging
import os
+import pytz
from Crypto.PublicKey import RSA
from dateutil.relativedelta import relativedelta
+from datetime import datetime
from django.db import models
from django.utils import timezone
from django.utils.functional import cached_property
@@ -252,7 +254,8 @@ class MonthlyHostingBill(AssignPermissionsMixin, models.Model):
total = models.IntegerField()
lines_data_count = models.IntegerField()
invoice_id = models.CharField(unique=True, max_length=100)
- lines_meta_data_csv = models.TextField()
+ lines_meta_data_csv = models.TextField(default="")
+ subscription_ids_csv = models.TextField(default="")
permissions = ('view_monthlyhostingbill',)
@@ -262,21 +265,63 @@ class MonthlyHostingBill(AssignPermissionsMixin, models.Model):
)
@classmethod
- def create(cls, stripe_customer, **args):
- instance = cls.objects.create(args)
- instance.customer = stripe_customer
- if len(instance.lines_meta_data_csv) > 0:
- vm_ids = [vm_id.strip() for vm_id in instance.lines_meta_data_csv.split(",")]
+ def create(cls, args):
+ # Try to infer the HostingOrder from subscription id or VM_ID
+ if len(args['subscription_ids_csv']) > 0:
+ sub_ids = [sub_id.strip() for sub_id in args['subscription_ids_csv'].split(",")]
+ if len(sub_ids) == 1:
+ args['order'] = HostingOrder.objects.get(
+ subscription_id=sub_ids[0]
+ )
+ else:
+ logger.debug(
+ "More than one subscriptions"
+ "for MonthlyHostingBill {}".format(args['invoice_id'])
+ )
+ logger.debug("SUB_IDS=".format(','.join(sub_ids)))
+ logger.debug("Not importing invoices")
+ return
+ elif len(args['lines_meta_data_csv']) > 0:
+ vm_ids = [vm_id.strip() for vm_id in args['lines_meta_data_csv'].split(",")]
if len(vm_ids) == 1:
- instance.order = HostingOrder.objects.get(vm_id=vm_ids[0])
+ args['order'] = HostingOrder.objects.get(vm_id=vm_ids[0])
else:
logger.debug(
"More than one VM_ID"
- "for MonthlyHostingBill {}".format(instance.invoice_id)
+ "for MonthlyHostingBill {}".format(args['invoice_id'])
)
logger.debug("VM_IDS=".format(','.join(vm_ids)))
- instance.assign_permissions(stripe_customer.user)
- instance.save()
+ logger.debug("Not importing invoices")
+ return
+ else:
+ logger.debug("Neither subscription id nor vm_id available")
+ logger.debug("Can't import invoice")
+ return
+
+ instance = cls.objects.create(
+ created=datetime.utcfromtimestamp(
+ args['created']).replace(tzinfo=pytz.utc),
+ receipt_number=(
+ args['receipt_number']
+ if args['receipt_number'] is not None else ''
+ ),
+ paid_at=datetime.utcfromtimestamp(
+ args['paid_at']).replace(tzinfo=pytz.utc),
+ period_start=datetime.utcfromtimestamp(
+ args['period_start']).replace(tzinfo=pytz.utc),
+ period_end=datetime.utcfromtimestamp(
+ args['period_end']).replace(tzinfo=pytz.utc),
+ billing_reason=args['billing_reason'],
+ discount=args['discount'],
+ total=args['total'],
+ lines_data_count=args['lines_data_count'],
+ invoice_id=args['invoice_id'],
+ lines_meta_data_csv=args['lines_meta_data_csv'],
+ stripe_customer=args['customer'],
+ subscription_ids_csv=args['subscription_ids_csv'],
+ )
+
+ instance.assign_permissions(instance.stripe_customer.user)
return instance
diff --git a/utils/stripe_utils.py b/utils/stripe_utils.py
index 7211465a..ec430485 100644
--- a/utils/stripe_utils.py
+++ b/utils/stripe_utils.py
@@ -155,7 +155,10 @@ class StripeUtils(object):
'invoice_id': invoice.id,
'lines_meta_data_csv': ','.join(
[line.metadata.VM_ID if hasattr(line.metadata, 'VM_ID') else '' for line in invoice.lines.data]
- )
+ ),
+ 'subscription_ids_csv': ','.join(
+ [line.subscription if hasattr(line, 'subscription') else '' for line in invoice.lines.data]
+ ),
}
starting_after = invoice.id
return_list.append(invoice_details)
From 8e1e3e41576baa4c33bb7a23e733999632bba68c Mon Sep 17 00:00:00 2001
From: PCoder
Date: Wed, 3 Apr 2019 09:12:14 +0200
Subject: [PATCH 624/915] Correct variable names
---
hosting/models.py | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/hosting/models.py b/hosting/models.py
index c976c336..9b81addd 100644
--- a/hosting/models.py
+++ b/hosting/models.py
@@ -317,7 +317,8 @@ class MonthlyHostingBill(AssignPermissionsMixin, models.Model):
lines_data_count=args['lines_data_count'],
invoice_id=args['invoice_id'],
lines_meta_data_csv=args['lines_meta_data_csv'],
- stripe_customer=args['customer'],
+ customer=args['customer'],
+ order=args['order'],
subscription_ids_csv=args['subscription_ids_csv'],
)
From 2c3146111f5113116bf4dfa52772cbf26924b448 Mon Sep 17 00:00:00 2001
From: PCoder
Date: Wed, 3 Apr 2019 09:20:38 +0200
Subject: [PATCH 625/915] Fix getting subscription id
---
utils/stripe_utils.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/utils/stripe_utils.py b/utils/stripe_utils.py
index ec430485..b43470fa 100644
--- a/utils/stripe_utils.py
+++ b/utils/stripe_utils.py
@@ -157,7 +157,7 @@ class StripeUtils(object):
[line.metadata.VM_ID if hasattr(line.metadata, 'VM_ID') else '' for line in invoice.lines.data]
),
'subscription_ids_csv': ','.join(
- [line.subscription if hasattr(line, 'subscription') else '' for line in invoice.lines.data]
+ [line.id if line.type == 'subscription' else '' for line in invoice.lines.data]
),
}
starting_after = invoice.id
From a690ef421f8f55320c7c05121f715e1b67102347 Mon Sep 17 00:00:00 2001
From: PCoder
Date: Wed, 3 Apr 2019 09:24:25 +0200
Subject: [PATCH 626/915] Fix variable name
---
hosting/models.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/hosting/models.py b/hosting/models.py
index 9b81addd..fb2a805b 100644
--- a/hosting/models.py
+++ b/hosting/models.py
@@ -322,7 +322,7 @@ class MonthlyHostingBill(AssignPermissionsMixin, models.Model):
subscription_ids_csv=args['subscription_ids_csv'],
)
- instance.assign_permissions(instance.stripe_customer.user)
+ instance.assign_permissions(instance.customer.user)
return instance
From cc6afa8d2abd1d7a540fd9f471b09228cf4ceaaa Mon Sep 17 00:00:00 2001
From: PCoder
Date: Wed, 3 Apr 2019 19:22:27 +0200
Subject: [PATCH 627/915] Fix datetime issue: pass unix timestamp instead of
datetime
---
hosting/management/commands/fetch_stripe_bills.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/hosting/management/commands/fetch_stripe_bills.py b/hosting/management/commands/fetch_stripe_bills.py
index 8f35aa8c..e6dd9536 100644
--- a/hosting/management/commands/fetch_stripe_bills.py
+++ b/hosting/management/commands/fetch_stripe_bills.py
@@ -31,7 +31,7 @@ class Command(BaseCommand):
# fetch only invoices which is created after
# mhb.created, because we already have invoices till
# this date
- created_gt = {'gt': mhb.created}
+ created_gt = {'gt': mhb.created.timestamp()}
all_invoices_response = stripe_utils.get_all_invoices(
user.stripecustomer.stripe_id,
From 5c31417a371c0376bc747208481da4e6ee9b69a0 Mon Sep 17 00:00:00 2001
From: PCoder
Date: Wed, 3 Apr 2019 19:34:57 +0200
Subject: [PATCH 628/915] Convert timestamp to int
---
hosting/management/commands/fetch_stripe_bills.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/hosting/management/commands/fetch_stripe_bills.py b/hosting/management/commands/fetch_stripe_bills.py
index e6dd9536..2a37ed61 100644
--- a/hosting/management/commands/fetch_stripe_bills.py
+++ b/hosting/management/commands/fetch_stripe_bills.py
@@ -31,7 +31,7 @@ class Command(BaseCommand):
# fetch only invoices which is created after
# mhb.created, because we already have invoices till
# this date
- created_gt = {'gt': mhb.created.timestamp()}
+ created_gt = {'gt': int(mhb.created.timestamp())}
all_invoices_response = stripe_utils.get_all_invoices(
user.stripecustomer.stripe_id,
From 147fd0fe5edbb4566fcb043ef55decbd2792a44e Mon Sep 17 00:00:00 2001
From: PCoder
Date: Wed, 3 Apr 2019 20:29:06 +0200
Subject: [PATCH 629/915] Add invoices.html
---
hosting/templates/hosting/invoices.html | 57 +++++++++++++++++++++++++
1 file changed, 57 insertions(+)
create mode 100644 hosting/templates/hosting/invoices.html
diff --git a/hosting/templates/hosting/invoices.html b/hosting/templates/hosting/invoices.html
new file mode 100644
index 00000000..96d9e9e3
--- /dev/null
+++ b/hosting/templates/hosting/invoices.html
@@ -0,0 +1,57 @@
+{% extends "hosting/base_short.html" %}
+{% load staticfiles bootstrap3 humanize i18n %}
+
+{% block content %}
+
+
+
{% trans "My Bills" %}
+ {% if messages %}
+
+ {% for message in messages %}
+ {{ message }}
+ {% endfor %}
+
+ {% endif %}
+
+
+
+
+
+
+ {% trans "Order Nr." %}
+ {% trans "Date" %}
+ {% trans "Amount" %}
+
+
+
+
+ {% for order in orders %}
+
+ {{ order.id }}
+ {{ order.created_at | date:'Y-m-d h:i a' }}
+ {{ order.price|floatformat:2|intcomma }}
+
+ {% trans 'See Invoice' %}
+
+
+ {% endfor %}
+
+
+
+ {% if is_paginated %}
+
+ {% endif %}
+
+{% endblock %}
From de3734bf2000ba0c2db170342cb055f0a960b48b Mon Sep 17 00:00:00 2001
From: PCoder
Date: Wed, 3 Apr 2019 20:29:33 +0200
Subject: [PATCH 630/915] Add total_in_chf utility method
---
hosting/models.py | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/hosting/models.py b/hosting/models.py
index fb2a805b..b735bb8f 100644
--- a/hosting/models.py
+++ b/hosting/models.py
@@ -325,6 +325,15 @@ class MonthlyHostingBill(AssignPermissionsMixin, models.Model):
instance.assign_permissions(instance.customer.user)
return instance
+ def total_in_chf(self):
+ """
+ Returns amount in chf. The total amount in this model is in cents.
+ Hence we multiply it by 0.01 to obtain the result
+
+ :return:
+ """
+ return self.total * 0.01
+
class VMDetail(models.Model):
user = models.ForeignKey(CustomUser)
From 71832f8afc277cb1ebf1ea4d710d353d3d6651f3 Mon Sep 17 00:00:00 2001
From: PCoder
Date: Wed, 3 Apr 2019 20:31:24 +0200
Subject: [PATCH 631/915] invoices.html: Replace all order instances by invoice
---
hosting/templates/hosting/invoices.html | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/hosting/templates/hosting/invoices.html b/hosting/templates/hosting/invoices.html
index 96d9e9e3..2fa2e3f4 100644
--- a/hosting/templates/hosting/invoices.html
+++ b/hosting/templates/hosting/invoices.html
@@ -18,20 +18,20 @@
- {% trans "Order Nr." %}
+ {% trans "Invoice Nr." %}
{% trans "Date" %}
{% trans "Amount" %}
- {% for order in orders %}
+ {% for invoice in invoices %}
- {{ order.id }}
- {{ order.created_at | date:'Y-m-d h:i a' }}
- {{ order.price|floatformat:2|intcomma }}
+ {{ invoice.invoice_number }}
+ {{ invoice.paid_at | date:'Y-m-d h:i a' }}
+ {{ invoice.total_in_chf|floatformat:2|intcomma }}
- {% trans 'See Invoice' %}
+ {% trans 'See Invoice' %}
{% endfor %}
From dbe3b2558cd132270fabd46ff89aef7d5f32f487 Mon Sep 17 00:00:00 2001
From: PCoder
Date: Wed, 3 Apr 2019 20:31:54 +0200
Subject: [PATCH 632/915] Create an InvoiceListView
---
hosting/views.py | 18 +++++++++++++++++-
1 file changed, 17 insertions(+), 1 deletion(-)
diff --git a/hosting/views.py b/hosting/views.py
index 32de4e54..043bad99 100644
--- a/hosting/views.py
+++ b/hosting/views.py
@@ -61,7 +61,7 @@ from .forms import (
from .mixins import ProcessVMSelectionMixin, HostingContextMixin
from .models import (
HostingOrder, HostingBill, HostingPlan, UserHostingKey, VMDetail,
- GenericProduct
+ GenericProduct, MonthlyHostingBill
)
logger = logging.getLogger(__name__)
@@ -1146,6 +1146,22 @@ class OrdersHostingListView(LoginRequiredMixin, ListView):
return super(OrdersHostingListView, self).get(request, *args, **kwargs)
+class InvoiceListView(OrdersHostingListView):
+ template_name = "hosting/invoices.html"
+ context_object_name = "invoices"
+ model = MonthlyHostingBill
+ ordering = '-created'
+
+ def get_queryset(self):
+ user = self.request.user
+ self.queryset = MonthlyHostingBill.objects.filter(customer__user=user)
+ return super(InvoiceListView, self).get_queryset()
+
+ @method_decorator(decorators)
+ def get(self, request, *args, **kwargs):
+ return super(InvoiceListView, self).get(request, *args, **kwargs)
+
+
class OrdersHostingDeleteView(LoginRequiredMixin, DeleteView):
login_url = reverse_lazy('hosting:login')
success_url = reverse_lazy('hosting:orders')
From def5a3a0115c70bbbdca5daef51a4fbaffe8462b Mon Sep 17 00:00:00 2001
From: PCoder
Date: Wed, 3 Apr 2019 20:34:04 +0200
Subject: [PATCH 633/915] Add invoice urls
---
hosting/urls.py | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/hosting/urls.py b/hosting/urls.py
index 32ef8400..3a0dd72f 100644
--- a/hosting/urls.py
+++ b/hosting/urls.py
@@ -8,7 +8,8 @@ from .views import (
MarkAsReadNotificationView, PasswordResetView, PasswordResetConfirmView,
HostingPricingView, CreateVirtualMachinesView, HostingBillListView,
HostingBillDetailView, SSHKeyDeleteView, SSHKeyCreateView, SSHKeyListView,
- SSHKeyChoiceView, DashboardView, SettingsView, ResendActivationEmailView
+ SSHKeyChoiceView, DashboardView, SettingsView, ResendActivationEmailView,
+ InvoiceListView
)
@@ -22,10 +23,13 @@ urlpatterns = [
url(r'payment/?$', PaymentVMView.as_view(), name='payment'),
url(r'settings/?$', SettingsView.as_view(), name='settings'),
url(r'orders/?$', OrdersHostingListView.as_view(), name='orders'),
+ url(r'invoices/?$', InvoiceListView.as_view(), name='invoices'),
url(r'order-confirmation/?$', OrdersHostingDetailView.as_view(),
name='order-confirmation'),
url(r'orders/(?P\d+)/?$', OrdersHostingDetailView.as_view(),
name='orders'),
+ url(r'invoices/(?P\d+)/?$', OrdersHostingDetailView.as_view(),
+ name='invoices'),
url(r'bills/?$', HostingBillListView.as_view(), name='bills'),
url(r'bills/(?P\d+)/?$', HostingBillDetailView.as_view(),
name='bills'),
From e843a6f85753292e803dc6d373e7ca36490094e5 Mon Sep 17 00:00:00 2001
From: PCoder
Date: Wed, 3 Apr 2019 21:16:19 +0200
Subject: [PATCH 634/915] Make invoicelistview not inherit OrderHostingListView
---
hosting/views.py | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/hosting/views.py b/hosting/views.py
index 043bad99..47456574 100644
--- a/hosting/views.py
+++ b/hosting/views.py
@@ -1146,8 +1146,9 @@ class OrdersHostingListView(LoginRequiredMixin, ListView):
return super(OrdersHostingListView, self).get(request, *args, **kwargs)
-class InvoiceListView(OrdersHostingListView):
+class InvoiceListView(LoginRequiredMixin, ListView):
template_name = "hosting/invoices.html"
+ login_url = reverse_lazy('hosting:login')
context_object_name = "invoices"
model = MonthlyHostingBill
ordering = '-created'
From 247bbe622fb47352e457faa5f6a370199fb941b4 Mon Sep 17 00:00:00 2001
From: PCoder
Date: Wed, 3 Apr 2019 21:29:49 +0200
Subject: [PATCH 635/915] Add missing invoice_number argument to MHB create
---
hosting/models.py | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/hosting/models.py b/hosting/models.py
index b735bb8f..5b48abbf 100644
--- a/hosting/models.py
+++ b/hosting/models.py
@@ -305,6 +305,10 @@ class MonthlyHostingBill(AssignPermissionsMixin, models.Model):
args['receipt_number']
if args['receipt_number'] is not None else ''
),
+ invoice_number=(
+ args['invoice_number']
+ if args['invoice_number'] is not None else ''
+ ),
paid_at=datetime.utcfromtimestamp(
args['paid_at']).replace(tzinfo=pytz.utc),
period_start=datetime.utcfromtimestamp(
From ba9e5548811bb1e4160ac777b294b5268c9e9fd4 Mon Sep 17 00:00:00 2001
From: PCoder
Date: Wed, 3 Apr 2019 21:52:07 +0200
Subject: [PATCH 636/915] Implement get_object for invoice detail + url fix
---
hosting/urls.py | 4 ++--
hosting/views.py | 29 +++++++++++++++++++++++++++++
2 files changed, 31 insertions(+), 2 deletions(-)
diff --git a/hosting/urls.py b/hosting/urls.py
index 3a0dd72f..3f5a6f50 100644
--- a/hosting/urls.py
+++ b/hosting/urls.py
@@ -9,7 +9,7 @@ from .views import (
HostingPricingView, CreateVirtualMachinesView, HostingBillListView,
HostingBillDetailView, SSHKeyDeleteView, SSHKeyCreateView, SSHKeyListView,
SSHKeyChoiceView, DashboardView, SettingsView, ResendActivationEmailView,
- InvoiceListView
+ InvoiceListView, InvoiceDetailView
)
@@ -28,7 +28,7 @@ urlpatterns = [
name='order-confirmation'),
url(r'orders/(?P\d+)/?$', OrdersHostingDetailView.as_view(),
name='orders'),
- url(r'invoices/(?P\d+)/?$', OrdersHostingDetailView.as_view(),
+ url(r'invoices/(?P[-\w]+)/?$', InvoiceDetailView.as_view(),
name='invoices'),
url(r'bills/?$', HostingBillListView.as_view(), name='bills'),
url(r'bills/(?P\d+)/?$', HostingBillDetailView.as_view(),
diff --git a/hosting/views.py b/hosting/views.py
index 47456574..17f63039 100644
--- a/hosting/views.py
+++ b/hosting/views.py
@@ -1163,6 +1163,35 @@ class InvoiceListView(LoginRequiredMixin, ListView):
return super(InvoiceListView, self).get(request, *args, **kwargs)
+class InvoiceDetailView(LoginRequiredMixin, DetailView):
+ template_name = "hosting/invoice-detail.html"
+ context_object_name = "invoice"
+ login_url = reverse_lazy('hosting:login')
+ permission_required = ['view_monthlyhostingbill']
+ model = MonthlyHostingBill
+
+ def get_object(self, queryset=None):
+ invoice_id = self.kwargs.get('invoice_id')
+ try:
+ invoice_obj = MonthlyHostingBill.objects.get(invoice_number=invoice_id)
+ logger.debug("Found MHB for id {invoice_id}".format(
+ invoice_id=invoice_id
+ ))
+ if self.request.user.has_perm(
+ self.permission_required[0], invoice_obj
+ ) or self.request.user.email == settings.ADMIN_EMAIL:
+ logger.debug("User has permission to invoice_obj")
+ else:
+ logger.error("User does not have permission to access")
+ invoice_obj = None
+ except HostingOrder.DoesNotExist:
+ logger.debug("MHB not found for id {invoice_id}".format(
+ invoice_id=invoice_id
+ ))
+ invoice_obj = None
+ return invoice_obj
+
+
class OrdersHostingDeleteView(LoginRequiredMixin, DeleteView):
login_url = reverse_lazy('hosting:login')
success_url = reverse_lazy('hosting:orders')
From 94586c854a47f7569f3ef35371e50fec9d589414 Mon Sep 17 00:00:00 2001
From: PCoder
Date: Wed, 3 Apr 2019 22:48:23 +0200
Subject: [PATCH 637/915] Add invoice detail
---
hosting/templates/hosting/invoice_detail.html | 235 ++++++++++++++++++
1 file changed, 235 insertions(+)
create mode 100644 hosting/templates/hosting/invoice_detail.html
diff --git a/hosting/templates/hosting/invoice_detail.html b/hosting/templates/hosting/invoice_detail.html
new file mode 100644
index 00000000..ff6ec31d
--- /dev/null
+++ b/hosting/templates/hosting/invoice_detail.html
@@ -0,0 +1,235 @@
+{% extends "hosting/base_short.html" %}
+{% load staticfiles bootstrap3 humanize i18n custom_tags %}
+
+
+{% block content %}
+
+ {% if messages %}
+
+ {% for message in messages %}
+ {{ message }}
+ {% endfor %}
+
+ {% endif %}
+ {% if not error %}
+
+
+ {%
+ blocktrans with page_header_text=page_header_text|default:"Invoice"
+ %}{{page_header_text}}{% endblocktrans %}
+
+ {% if invoice %}
+
+
+
+
+ {% endif %}
+
+
+ {% if invoice %}
+
+ {% trans "Invoice #" %} {{invoice.invoice_number}}
+
+ {% endif %}
+
+ {% trans "Date" %}:
+
+ {% if invoice %}
+ {{invoice.paid_at|date:'Y-m-d h:i a'}}
+ {% else %}
+ {% now "Y-m-d h:i a" %}
+ {% endif %}
+
+
+ {% if invoice and vm %}
+
+ {% trans "Status" %}:
+
+ {% if vm.terminated_at %}
+ {% trans "Terminated" %}
+ {% elif invoice.order.status == 'Approved' %}
+ {% trans "Approved" %}
+ {% else %}
+ {% trans "Declined" %}
+ {% endif %}
+
+
+ {% endif %}
+
+
+
+ {% trans "Billed to" %}:
+
+ {% if invoice.order %}
+ {{user.name}}
+ {{invoice.order.billing_address.street_address}},
+ {{invoice.order.billing_address.postal_code}}
+ {{invoice.order.billing_address.city}},
+ {{invoice.order.billing_address.country}}
+ {% endif %}
+
+
+
+
+
+
{% trans "Payment method" %}:
+
+ {% if invoice.order %}
+ {{invoice.order.cc_brand}} {% trans "ending in" %} ****
+ {{invoice.order.last4}}
+ {{user.email}}
+ {% endif %}
+
+
+
+
+
{% trans "Invoice summary" %}
+ {% if vm %}
+
+ {% trans "Product" %}:
+ {% if vm.name %}
+ {{ vm.name }}
+ {% endif %}
+
+
+
+ {% if period_start %}
+
+ {% trans "Period" %}:
+
+ {{ period_start|date:'Y-m-d h:i a' }} - {{ period_end|date:'Y-m-d h:i a' }}
+
+
+ {% endif %}
+
+ {% trans "Cores" %}:
+ {% if vm.cores %}
+ {{vm.cores|floatformat}}
+ {% else %}
+ {{vm.cpu|floatformat}}
+ {% endif %}
+
+
+ {% trans "Memory" %}:
+ {{vm.memory}} GB
+
+
+ {% trans "Disk space" %}:
+ {{vm.disk_size}} GB
+
+
+
+
+
+ {% if vm.vat > 0 or vm.discount.amount > 0 %}
+
+
+ {% if vm.vat > 0 %}
+
+ {% trans "Subtotal" %}
+ {{vm.price|floatformat:2|intcomma}}
+ CHF
+
+
+ {% trans "VAT" %} ({{
+ vm.vat_percent|floatformat:2|intcomma }}%)
+
+ {{vm.vat|floatformat:2|intcomma}}
+ CHF
+
+ {% endif %}
+ {% if vm.discount.amount > 0 %}
+
+ {%trans "Discount" as discount_name %}
+ {{ vm.discount.name|default:discount_name
+ }}
+ - {{ vm.discount.amount
+ }} CHF
+
+ {% endif %}
+
+
+
+
+
+ {% endif %}
+
+
+ {% trans "Total" %}
+ {% if vm.total_price
+ %}{{vm.total_price|floatformat:2|intcomma}}{% else
+ %}{{vm.price|floatformat:2|intcomma}}{% endif %}
+ CHF
+
+
+
+ {% else %}
+
+ {% trans "Product" %}:
+ {{ product_name }}
+
+
+
+
+ {% trans "Amount" %}:
+ {{total_in_chf|floatformat:2|intcomma}}
+ CHF
+
+ {% if invoice.order.generic_payment_description %}
+
+ {% trans "Description" %}:
+ {{invoice.order.generic_payment_description}}
+
+ {% endif %}
+ {% if invoice.order.subscription_id %}
+
+ {% trans "Recurring" %}:
+ {{invoice.order.created_at|date:'d'|ordinal}}
+ {% trans "of every month" %}
+
+ {% endif %}
+
+
+ {% endif %}
+
+
+
+
+ {% endif %}
+
+
+
+
+
+{%endblock%}
+
+{% block js_extra %}
+{% if invoice.order %}
+
+
+
+
+{% endif %}
+{% endblock js_extra %}
From d37a2de6eb5dec8c935b7b4692d87875cf60775a Mon Sep 17 00:00:00 2001
From: PCoder
Date: Wed, 3 Apr 2019 22:48:56 +0200
Subject: [PATCH 638/915] Add utility functions
---
hosting/models.py | 27 +++++++++++++++++++++++++++
1 file changed, 27 insertions(+)
diff --git a/hosting/models.py b/hosting/models.py
index 5b48abbf..d58e2fce 100644
--- a/hosting/models.py
+++ b/hosting/models.py
@@ -338,6 +338,33 @@ class MonthlyHostingBill(AssignPermissionsMixin, models.Model):
"""
return self.total * 0.01
+ def discount_in_chf(self):
+ """
+ Returns discount in chf.
+
+ :return:
+ """
+ return self.discount * 0.01
+
+ def get_vm_id(self):
+ """
+ Returns the VM_ID metadata if set in this MHB else returns None
+ :return:
+ """
+ return_value = None
+ if len(self.lines_meta_data_csv) > 0:
+ vm_ids = [vm_id.strip() for vm_id in
+ self.lines_meta_data_csv.split(",")]
+ if len(vm_ids) == 1:
+ return vm_ids[0]
+ else:
+ logger.debug(
+ "More than one VM_ID"
+ "for MonthlyHostingBill {}".format(self.invoice_id)
+ )
+ logger.debug("VM_IDS=".format(','.join(vm_ids)))
+ return return_value
+
class VMDetail(models.Model):
user = models.ForeignKey(CustomUser)
From ba6fa531db76bb7a8683f45cf9b76fd973f4a393 Mon Sep 17 00:00:00 2001
From: PCoder
Date: Wed, 3 Apr 2019 22:49:25 +0200
Subject: [PATCH 639/915] Correct the name of the layout
---
hosting/views.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/hosting/views.py b/hosting/views.py
index 17f63039..5a8f45c7 100644
--- a/hosting/views.py
+++ b/hosting/views.py
@@ -1164,7 +1164,7 @@ class InvoiceListView(LoginRequiredMixin, ListView):
class InvoiceDetailView(LoginRequiredMixin, DetailView):
- template_name = "hosting/invoice-detail.html"
+ template_name = "hosting/invoice_detail.html"
context_object_name = "invoice"
login_url = reverse_lazy('hosting:login')
permission_required = ['view_monthlyhostingbill']
From 7de2129a0053fd799e568a7508b791a2345d2ee4 Mon Sep 17 00:00:00 2001
From: PCoder
Date: Wed, 3 Apr 2019 22:49:45 +0200
Subject: [PATCH 640/915] Implement get invoice
---
hosting/views.py | 76 ++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 76 insertions(+)
diff --git a/hosting/views.py b/hosting/views.py
index 5a8f45c7..49c78b7e 100644
--- a/hosting/views.py
+++ b/hosting/views.py
@@ -1191,6 +1191,82 @@ class InvoiceDetailView(LoginRequiredMixin, DetailView):
invoice_obj = None
return invoice_obj
+ def get_context_data(self, **kwargs):
+ # Get context
+ context = super(InvoiceDetailView, self).get_context_data(**kwargs)
+ obj = self.get_object()
+
+ if obj is not None:
+ vm_id = obj.get_vm_id()
+ try:
+ # Try to get vm details from database
+ vm_detail = VMDetail.objects.get(vm_id=vm_id)
+ context['vm'] = vm_detail.__dict__
+ context['vm']['name'] = '{}-{}'.format(
+ context['vm']['configuration'], context['vm']['vm_id'])
+ price, vat, vat_percent, discount = get_vm_price_with_vat(
+ cpu=context['vm']['cores'],
+ ssd_size=context['vm']['disk_size'],
+ memory=context['vm']['memory'],
+ pricing_name=(obj.vm_pricing.name
+ if obj.vm_pricing else 'default')
+ )
+ context['vm']['vat'] = vat
+ context['vm']['price'] = price
+ context['vm']['discount'] = discount
+ context['vm']['vat_percent'] = vat_percent
+ context['vm']['total_price'] = price + vat - discount['amount']
+ except VMDetail.DoesNotExist:
+ # fallback to get it from the infrastructure
+ try:
+ manager = OpenNebulaManager(
+ email=self.request.email,
+ password=self.request.password
+ )
+ vm = manager.get_vm(vm_id)
+ context['vm'] = VirtualMachineSerializer(vm).data
+ price, vat, vat_percent, discount = get_vm_price_with_vat(
+ cpu=context['vm']['cores'],
+ ssd_size=context['vm']['disk_size'],
+ memory=context['vm']['memory'],
+ pricing_name=(obj.vm_pricing.name
+ if obj.vm_pricing else 'default')
+ )
+ context['vm']['vat'] = vat
+ context['vm']['price'] = price
+ context['vm']['discount'] = discount
+ context['vm']['vat_percent'] = vat_percent
+ context['vm']['total_price'] = (
+ price + vat - discount['amount']
+ )
+ except WrongIdError:
+ logger.error("WrongIdError while accessing "
+ "invoice {}".format(obj.invoice_id))
+ messages.error(
+ self.request,
+ _('The VM you are looking for is unavailable at the '
+ 'moment. Please contact Data Center Light support.')
+ )
+ self.kwargs['error'] = 'WrongIdError'
+ context['error'] = 'WrongIdError'
+ return context
+
+ # add context params from monthly hosting bill
+ context['period_start'] = obj.period_start
+ context['period_end'] = obj.period_end
+ context['paid_at'] = obj.paid_at
+ context['total_in_chf'] = obj.total_in_chf()
+ context['invoice_number'] = obj.invoice_number
+ context['discount_on_stripe'] = obj.discount_in_chf()
+ return context
+ else:
+ raise Http404
+
+ @method_decorator(decorators)
+ def get(self, request, *args, **kwargs):
+ context = self.get_context_data()
+ return self.render_to_response(context)
+
class OrdersHostingDeleteView(LoginRequiredMixin, DeleteView):
login_url = reverse_lazy('hosting:login')
From d07f3d7eba1d54c552bfaea0d56d94b2220bec62 Mon Sep 17 00:00:00 2001
From: PCoder
Date: Wed, 3 Apr 2019 22:59:01 +0200
Subject: [PATCH 641/915] Add missing object param
---
hosting/views.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/hosting/views.py b/hosting/views.py
index 49c78b7e..39e2a7a9 100644
--- a/hosting/views.py
+++ b/hosting/views.py
@@ -1264,7 +1264,7 @@ class InvoiceDetailView(LoginRequiredMixin, DetailView):
@method_decorator(decorators)
def get(self, request, *args, **kwargs):
- context = self.get_context_data()
+ context = self.get_context_data(object=self.get_object())
return self.render_to_response(context)
From 76e3d951354f4d2278f322792be90d221566e1f3 Mon Sep 17 00:00:00 2001
From: PCoder
Date: Wed, 3 Apr 2019 22:59:39 +0200
Subject: [PATCH 642/915] Use invoice_number of invoice pk
---
hosting/templates/hosting/invoices.html | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/hosting/templates/hosting/invoices.html b/hosting/templates/hosting/invoices.html
index 2fa2e3f4..6a0aeb41 100644
--- a/hosting/templates/hosting/invoices.html
+++ b/hosting/templates/hosting/invoices.html
@@ -31,7 +31,7 @@
{{ invoice.paid_at | date:'Y-m-d h:i a' }}
{{ invoice.total_in_chf|floatformat:2|intcomma }}
- {% trans 'See Invoice' %}
+ {% trans 'See Invoice' %}
{% endfor %}
From 3ed5823c93651e25bf1e0749d5b0045b2b0459fe Mon Sep 17 00:00:00 2001
From: PCoder
Date: Wed, 3 Apr 2019 23:04:35 +0200
Subject: [PATCH 643/915] Add missing self.object initializer
---
hosting/views.py | 1 +
1 file changed, 1 insertion(+)
diff --git a/hosting/views.py b/hosting/views.py
index 39e2a7a9..3a8997a9 100644
--- a/hosting/views.py
+++ b/hosting/views.py
@@ -1264,6 +1264,7 @@ class InvoiceDetailView(LoginRequiredMixin, DetailView):
@method_decorator(decorators)
def get(self, request, *args, **kwargs):
+ self.object = self.get_object()
context = self.get_context_data(object=self.get_object())
return self.render_to_response(context)
From ef09ae4dab1b355630af25edd4aeefa5a0f6062a Mon Sep 17 00:00:00 2001
From: PCoder
Date: Wed, 3 Apr 2019 23:07:37 +0200
Subject: [PATCH 644/915] Obtaing pricing from order
---
hosting/views.py | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/hosting/views.py b/hosting/views.py
index 3a8997a9..12b0027f 100644
--- a/hosting/views.py
+++ b/hosting/views.py
@@ -1208,8 +1208,8 @@ class InvoiceDetailView(LoginRequiredMixin, DetailView):
cpu=context['vm']['cores'],
ssd_size=context['vm']['disk_size'],
memory=context['vm']['memory'],
- pricing_name=(obj.vm_pricing.name
- if obj.vm_pricing else 'default')
+ pricing_name=(obj.order.vm_pricing.name
+ if obj.order.vm_pricing else 'default')
)
context['vm']['vat'] = vat
context['vm']['price'] = price
@@ -1229,8 +1229,8 @@ class InvoiceDetailView(LoginRequiredMixin, DetailView):
cpu=context['vm']['cores'],
ssd_size=context['vm']['disk_size'],
memory=context['vm']['memory'],
- pricing_name=(obj.vm_pricing.name
- if obj.vm_pricing else 'default')
+ pricing_name=(obj.order.vm_pricing.name
+ if obj.order.vm_pricing else 'default')
)
context['vm']['vat'] = vat
context['vm']['price'] = price
From ddd3cebc39f49aca62973921be9f7d716001332b Mon Sep 17 00:00:00 2001
From: PCoder
Date: Wed, 3 Apr 2019 23:09:57 +0200
Subject: [PATCH 645/915] Fix blocktrans reformatted mistakenly
---
hosting/templates/hosting/invoice_detail.html | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/hosting/templates/hosting/invoice_detail.html b/hosting/templates/hosting/invoice_detail.html
index ff6ec31d..8a094519 100644
--- a/hosting/templates/hosting/invoice_detail.html
+++ b/hosting/templates/hosting/invoice_detail.html
@@ -14,9 +14,8 @@
{% if not error %}
- {%
- blocktrans with page_header_text=page_header_text|default:"Invoice"
- %}{{page_header_text}}{% endblocktrans %}
+
+ {% blocktrans with page_header_text=page_header_text|default:"Invoice" %}{{page_header_text}}{% endblocktrans %}
{% if invoice %}
From 47422a99afa1b6cccd0533915d2fefe565c1bbf7 Mon Sep 17 00:00:00 2001
From: PCoder
Date: Wed, 3 Apr 2019 23:11:59 +0200
Subject: [PATCH 646/915] Fix more autoformatting related errors
---
hosting/templates/hosting/invoice_detail.html | 6 +-----
1 file changed, 1 insertion(+), 5 deletions(-)
diff --git a/hosting/templates/hosting/invoice_detail.html b/hosting/templates/hosting/invoice_detail.html
index 8a094519..22d1d87a 100644
--- a/hosting/templates/hosting/invoice_detail.html
+++ b/hosting/templates/hosting/invoice_detail.html
@@ -207,7 +207,6 @@
CHE-156.970.649 MWST
- {% endif %}
@@ -216,10 +215,7 @@
{%endblock%}
From d00e84a4b69508904225ce69934a671c5cf05db5 Mon Sep 17 00:00:00 2001
From: PCoder
Date: Wed, 3 Apr 2019 23:24:56 +0200
Subject: [PATCH 647/915] Fix bug related to proper alignment
---
hosting/views.py | 16 ++++++++--------
1 file changed, 8 insertions(+), 8 deletions(-)
diff --git a/hosting/views.py b/hosting/views.py
index 12b0027f..ce73ad3c 100644
--- a/hosting/views.py
+++ b/hosting/views.py
@@ -1251,14 +1251,14 @@ class InvoiceDetailView(LoginRequiredMixin, DetailView):
context['error'] = 'WrongIdError'
return context
- # add context params from monthly hosting bill
- context['period_start'] = obj.period_start
- context['period_end'] = obj.period_end
- context['paid_at'] = obj.paid_at
- context['total_in_chf'] = obj.total_in_chf()
- context['invoice_number'] = obj.invoice_number
- context['discount_on_stripe'] = obj.discount_in_chf()
- return context
+ # add context params from monthly hosting bill
+ context['period_start'] = obj.period_start
+ context['period_end'] = obj.period_end
+ context['paid_at'] = obj.paid_at
+ context['total_in_chf'] = obj.total_in_chf()
+ context['invoice_number'] = obj.invoice_number
+ context['discount_on_stripe'] = obj.discount_in_chf()
+ return context
else:
raise Http404
From 903fee4db198be5a4e35ba5c068a9ea97cf558f2 Mon Sep 17 00:00:00 2001
From: PCoder
Date: Wed, 3 Apr 2019 23:31:52 +0200
Subject: [PATCH 648/915] Fix more autoformatting issues
---
hosting/templates/hosting/invoice_detail.html | 13 ++++---------
1 file changed, 4 insertions(+), 9 deletions(-)
diff --git a/hosting/templates/hosting/invoice_detail.html b/hosting/templates/hosting/invoice_detail.html
index 22d1d87a..9c300b3f 100644
--- a/hosting/templates/hosting/invoice_detail.html
+++ b/hosting/templates/hosting/invoice_detail.html
@@ -137,8 +137,7 @@
CHF
- {% trans "VAT" %} ({{
- vm.vat_percent|floatformat:2|intcomma }}%)
+ {% trans "VAT" %} ({{ vm.vat_percent|floatformat:2|intcomma }}%)
{{vm.vat|floatformat:2|intcomma}}
CHF
@@ -147,10 +146,8 @@
{% if vm.discount.amount > 0 %}
{%trans "Discount" as discount_name %}
- {{ vm.discount.name|default:discount_name
- }}
- - {{ vm.discount.amount
- }} CHF
+ {{ vm.discount.name|default:discount_name }}
+ - {{ vm.discount.amount }} CHF
{% endif %}
@@ -162,9 +159,7 @@
{% trans "Total" %}
- {% if vm.total_price
- %}{{vm.total_price|floatformat:2|intcomma}}{% else
- %}{{vm.price|floatformat:2|intcomma}}{% endif %}
+ {% if vm.total_price %}{{vm.total_price|floatformat:2|intcomma}}{% else %}{{vm.price|floatformat:2|intcomma}}{% endif %}
CHF
From f1a7958f03e3c61eef6e4b3dd4028066c273c353 Mon Sep 17 00:00:00 2001
From: PCoder
Date: Wed, 3 Apr 2019 23:34:26 +0200
Subject: [PATCH 649/915] Use correct class
---
hosting/views.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/hosting/views.py b/hosting/views.py
index ce73ad3c..34e720f6 100644
--- a/hosting/views.py
+++ b/hosting/views.py
@@ -1184,7 +1184,7 @@ class InvoiceDetailView(LoginRequiredMixin, DetailView):
else:
logger.error("User does not have permission to access")
invoice_obj = None
- except HostingOrder.DoesNotExist:
+ except MonthlyHostingBill.DoesNotExist:
logger.debug("MHB not found for id {invoice_id}".format(
invoice_id=invoice_id
))
From baf62f1924c4079bb01bbb8fb0d629223fdd4661 Mon Sep 17 00:00:00 2001
From: PCoder
Date: Wed, 3 Apr 2019 23:54:52 +0200
Subject: [PATCH 650/915] Simplify showing total price
---
hosting/templates/hosting/invoice_detail.html | 6 ++----
hosting/views.py | 6 ++++--
2 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/hosting/templates/hosting/invoice_detail.html b/hosting/templates/hosting/invoice_detail.html
index 9c300b3f..80226123 100644
--- a/hosting/templates/hosting/invoice_detail.html
+++ b/hosting/templates/hosting/invoice_detail.html
@@ -139,8 +139,7 @@
{% trans "VAT" %} ({{ vm.vat_percent|floatformat:2|intcomma }}%)
- {{vm.vat|floatformat:2|intcomma}}
- CHF
+ {{vm.vat|floatformat:2|intcomma}} CHF
{% endif %}
{% if vm.discount.amount > 0 %}
@@ -159,8 +158,7 @@
{% trans "Total" %}
- {% if vm.total_price %}{{vm.total_price|floatformat:2|intcomma}}{% else %}{{vm.price|floatformat:2|intcomma}}{% endif %}
- CHF
+ {{total_in_chf}} CHF
diff --git a/hosting/views.py b/hosting/views.py
index 34e720f6..af01ae86 100644
--- a/hosting/views.py
+++ b/hosting/views.py
@@ -1173,7 +1173,9 @@ class InvoiceDetailView(LoginRequiredMixin, DetailView):
def get_object(self, queryset=None):
invoice_id = self.kwargs.get('invoice_id')
try:
- invoice_obj = MonthlyHostingBill.objects.get(invoice_number=invoice_id)
+ invoice_obj = MonthlyHostingBill.objects.get(
+ invoice_number=invoice_id
+ )
logger.debug("Found MHB for id {invoice_id}".format(
invoice_id=invoice_id
))
@@ -1184,7 +1186,7 @@ class InvoiceDetailView(LoginRequiredMixin, DetailView):
else:
logger.error("User does not have permission to access")
invoice_obj = None
- except MonthlyHostingBill.DoesNotExist:
+ except MonthlyHostingBill.DoesNotExist as dne:
logger.debug("MHB not found for id {invoice_id}".format(
invoice_id=invoice_id
))
From 13f84a8580cda21cf55675fb1cf1e6d3a41ee248 Mon Sep 17 00:00:00 2001
From: PCoder
Date: Thu, 4 Apr 2019 00:05:20 +0200
Subject: [PATCH 651/915] Add missing endif
---
hosting/templates/hosting/invoice_detail.html | 1 +
1 file changed, 1 insertion(+)
diff --git a/hosting/templates/hosting/invoice_detail.html b/hosting/templates/hosting/invoice_detail.html
index 80226123..0a2473e3 100644
--- a/hosting/templates/hosting/invoice_detail.html
+++ b/hosting/templates/hosting/invoice_detail.html
@@ -200,6 +200,7 @@
CHE-156.970.649 MWST
+ {% endif %}
From ef1bdee9a7da7e341f6e44d7046f7b544cc0f5cd Mon Sep 17 00:00:00 2001
From: PCoder
Date: Thu, 4 Apr 2019 00:05:45 +0200
Subject: [PATCH 652/915] Remove more autoformatting
---
hosting/templates/hosting/invoice_detail.html | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/hosting/templates/hosting/invoice_detail.html b/hosting/templates/hosting/invoice_detail.html
index 0a2473e3..675962fa 100644
--- a/hosting/templates/hosting/invoice_detail.html
+++ b/hosting/templates/hosting/invoice_detail.html
@@ -204,8 +204,7 @@
-
+
+
{% endaddtoblock %}
diff --git a/ungleich/templates/cms/ungleichch/base_ungleich.html b/ungleich/templates/cms/ungleichch/base_ungleich.html
index 513b8d1e..3a203844 100644
--- a/ungleich/templates/cms/ungleichch/base_ungleich.html
+++ b/ungleich/templates/cms/ungleichch/base_ungleich.html
@@ -15,7 +15,7 @@
{% addtoblock "external-css" %}
{% bootstrap_css %}
-
+
@@ -23,8 +23,8 @@
{% endaddtoblock %}
From d91a403680016e18909cd4e8c66ccc12cc555006 Mon Sep 17 00:00:00 2001
From: PCoder
Date: Sun, 5 May 2019 20:24:47 +0200
Subject: [PATCH 742/915] Add bootstrap-3.3.4 local resources
---
.../css/bootstrap-theme.min.css | 5 +
.../bootstrap-3.3.4/css/bootstrap.min.css | 5 +
.../fonts/glyphicons-halflings-regular.eot | Bin 0 -> 20127 bytes
.../fonts/glyphicons-halflings-regular.svg | 288 ++++++++++++++++++
.../fonts/glyphicons-halflings-regular.ttf | Bin 0 -> 45404 bytes
.../fonts/glyphicons-halflings-regular.woff | Bin 0 -> 23424 bytes
.../fonts/glyphicons-halflings-regular.woff2 | Bin 0 -> 18028 bytes
.../bootstrap-3.3.4/js/bootstrap.min.js | 7 +
8 files changed, 305 insertions(+)
create mode 100644 datacenterlight/static/datacenterlight/bootstrap-3.3.4/css/bootstrap-theme.min.css
create mode 100644 datacenterlight/static/datacenterlight/bootstrap-3.3.4/css/bootstrap.min.css
create mode 100644 datacenterlight/static/datacenterlight/bootstrap-3.3.4/fonts/glyphicons-halflings-regular.eot
create mode 100644 datacenterlight/static/datacenterlight/bootstrap-3.3.4/fonts/glyphicons-halflings-regular.svg
create mode 100644 datacenterlight/static/datacenterlight/bootstrap-3.3.4/fonts/glyphicons-halflings-regular.ttf
create mode 100644 datacenterlight/static/datacenterlight/bootstrap-3.3.4/fonts/glyphicons-halflings-regular.woff
create mode 100644 datacenterlight/static/datacenterlight/bootstrap-3.3.4/fonts/glyphicons-halflings-regular.woff2
create mode 100644 datacenterlight/static/datacenterlight/bootstrap-3.3.4/js/bootstrap.min.js
diff --git a/datacenterlight/static/datacenterlight/bootstrap-3.3.4/css/bootstrap-theme.min.css b/datacenterlight/static/datacenterlight/bootstrap-3.3.4/css/bootstrap-theme.min.css
new file mode 100644
index 00000000..cefa3d1a
--- /dev/null
+++ b/datacenterlight/static/datacenterlight/bootstrap-3.3.4/css/bootstrap-theme.min.css
@@ -0,0 +1,5 @@
+/*!
+ * Bootstrap v3.3.4 (http://getbootstrap.com)
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */.btn-danger,.btn-default,.btn-info,.btn-primary,.btn-success,.btn-warning{text-shadow:0 -1px 0 rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-danger.active,.btn-danger:active,.btn-default.active,.btn-default:active,.btn-info.active,.btn-info:active,.btn-primary.active,.btn-primary:active,.btn-success.active,.btn-success:active,.btn-warning.active,.btn-warning:active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-danger .badge,.btn-default .badge,.btn-info .badge,.btn-primary .badge,.btn-success .badge,.btn-warning .badge{text-shadow:none}.btn.active,.btn:active{background-image:none}.btn-default{text-shadow:0 1px 0 #fff;background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-o-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e0e0e0));background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#dbdbdb;border-color:#ccc}.btn-default:focus,.btn-default:hover{background-color:#e0e0e0;background-position:0 -15px}.btn-default.active,.btn-default:active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-default.disabled,.btn-default:disabled,.btn-default[disabled]{background-color:#e0e0e0;background-image:none}.btn-primary{background-image:-webkit-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-o-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#265a88));background-image:linear-gradient(to bottom,#337ab7 0,#265a88 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#245580}.btn-primary:focus,.btn-primary:hover{background-color:#265a88;background-position:0 -15px}.btn-primary.active,.btn-primary:active{background-color:#265a88;border-color:#245580}.btn-primary.disabled,.btn-primary:disabled,.btn-primary[disabled]{background-color:#265a88;background-image:none}.btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#419641));background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#3e8f3e}.btn-success:focus,.btn-success:hover{background-color:#419641;background-position:0 -15px}.btn-success.active,.btn-success:active{background-color:#419641;border-color:#3e8f3e}.btn-success.disabled,.btn-success:disabled,.btn-success[disabled]{background-color:#419641;background-image:none}.btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#2aabd2));background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#28a4c9}.btn-info:focus,.btn-info:hover{background-color:#2aabd2;background-position:0 -15px}.btn-info.active,.btn-info:active{background-color:#2aabd2;border-color:#28a4c9}.btn-info.disabled,.btn-info:disabled,.btn-info[disabled]{background-color:#2aabd2;background-image:none}.btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#eb9316));background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#e38d13}.btn-warning:focus,.btn-warning:hover{background-color:#eb9316;background-position:0 -15px}.btn-warning.active,.btn-warning:active{background-color:#eb9316;border-color:#e38d13}.btn-warning.disabled,.btn-warning:disabled,.btn-warning[disabled]{background-color:#eb9316;background-image:none}.btn-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c12e2a));background-image:linear-gradient(to bottom,#d9534f 0,#c12e2a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#b92c28}.btn-danger:focus,.btn-danger:hover{background-color:#c12e2a;background-position:0 -15px}.btn-danger.active,.btn-danger:active{background-color:#c12e2a;border-color:#b92c28}.btn-danger.disabled,.btn-danger:disabled,.btn-danger[disabled]{background-color:#c12e2a;background-image:none}.img-thumbnail,.thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{background-color:#e8e8e8;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{background-color:#2e6da4;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-o-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#f8f8f8));background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075)}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-o-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dbdbdb),to(#e2e2e2));background-image:linear-gradient(to bottom,#dbdbdb 0,#e2e2e2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075);box-shadow:inset 0 3px 9px rgba(0,0,0,.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-o-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#3c3c3c),to(#222));background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-o-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#080808),to(#0f0f0f));background-image:linear-gradient(to bottom,#080808 0,#0f0f0f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.25);box-shadow:inset 0 3px 9px rgba(0,0,0,.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.navbar-fixed-bottom,.navbar-fixed-top,.navbar-static-top{border-radius:0}@media (max-width:767px){.navbar .navbar-nav .open .dropdown-menu>.active>a,.navbar .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}}.alert{text-shadow:0 1px 0 rgba(255,255,255,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.alert-success{background-image:-webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#c8e5bc));background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);background-repeat:repeat-x;border-color:#b2dba1}.alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#b9def0));background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);background-repeat:repeat-x;border-color:#9acfea}.alert-warning{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#f8efc0));background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);background-repeat:repeat-x;border-color:#f5e79e}.alert-danger{background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-o-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#e7c3c3));background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);background-repeat:repeat-x;border-color:#dca7a7}.progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#f5f5f5));background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x}.progress-bar{background-image:-webkit-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-o-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#286090));background-image:linear-gradient(to bottom,#337ab7 0,#286090 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);background-repeat:repeat-x}.progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#449d44));background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);background-repeat:repeat-x}.progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#31b0d5));background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);background-repeat:repeat-x}.progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#ec971f));background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);background-repeat:repeat-x}.progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c9302c));background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);background-repeat:repeat-x}.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{text-shadow:0 -1px 0 #286090;background-image:-webkit-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2b669a));background-image:linear-gradient(to bottom,#337ab7 0,#2b669a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);background-repeat:repeat-x;border-color:#2b669a}.list-group-item.active .badge,.list-group-item.active:focus .badge,.list-group-item.active:hover .badge{text-shadow:none}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#d0e9c6));background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);background-repeat:repeat-x}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#c4e3f3));background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);background-repeat:repeat-x}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#faf2cc));background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);background-repeat:repeat-x}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-o-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#ebcccc));background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);background-repeat:repeat-x}.well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#e8e8e8),to(#f5f5f5));background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x;border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1)}
\ No newline at end of file
diff --git a/datacenterlight/static/datacenterlight/bootstrap-3.3.4/css/bootstrap.min.css b/datacenterlight/static/datacenterlight/bootstrap-3.3.4/css/bootstrap.min.css
new file mode 100644
index 00000000..cd1c616a
--- /dev/null
+++ b/datacenterlight/static/datacenterlight/bootstrap-3.3.4/css/bootstrap.min.css
@@ -0,0 +1,5 @@
+/*!
+ * Bootstrap v3.3.4 (http://getbootstrap.com)
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ *//*! normalize.css v3.0.2 | MIT License | git.io/normalize */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff!important}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date],input[type=time],input[type=datetime-local],input[type=month]{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px \9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.form-group-sm .form-control{height:30px;line-height:30px}select[multiple].form-group-sm .form-control,textarea.form-group-sm .form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:5px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.form-group-lg .form-control{height:46px;line-height:46px}select[multiple].form-group-lg .form-control,textarea.form-group-lg .form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:10px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:14.33px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{pointer-events:none;cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.active,.btn-default.focus,.btn-default:active,.btn-default:focus,.btn-default:hover,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.active,.btn-primary.focus,.btn-primary:active,.btn-primary:focus,.btn-primary:hover,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.active,.btn-success.focus,.btn-success:active,.btn-success:focus,.btn-success:hover,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.active,.btn-info.focus,.btn-info:active,.btn-info:focus,.btn-info:hover,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.active,.btn-warning.focus,.btn-warning:active,.btn-warning:focus,.btn-warning:hover,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.active,.btn-danger.focus,.btn-danger:active,.btn-danger:focus,.btn-danger:hover,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px solid}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px)and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:2;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px 15px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding:48px 0}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{min-height:16.43px;padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-weight:400;line-height:1.4;filter:alpha(opacity=0);opacity:0}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-weight:400;line-height:1.42857143;text-align:left;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000;perspective:1000}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;margin-top:-10px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px)and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px)and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px)and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px)and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px)and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px)and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px)and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px)and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px)and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px)and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}}
\ No newline at end of file
diff --git a/datacenterlight/static/datacenterlight/bootstrap-3.3.4/fonts/glyphicons-halflings-regular.eot b/datacenterlight/static/datacenterlight/bootstrap-3.3.4/fonts/glyphicons-halflings-regular.eot
new file mode 100644
index 0000000000000000000000000000000000000000..b93a4953fff68df523aa7656497ee339d6026d64
GIT binary patch
literal 20127
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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/datacenterlight/static/datacenterlight/bootstrap-3.3.4/fonts/glyphicons-halflings-regular.ttf b/datacenterlight/static/datacenterlight/bootstrap-3.3.4/fonts/glyphicons-halflings-regular.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..1413fc609ab6f21774de0cb7e01360095584f65b
GIT binary patch
literal 45404
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