update to the sales section

This commit is contained in:
Faheedkhan 2025-06-24 18:26:27 +03:00
parent 5e602f563f
commit 5921faa2e8
3752 changed files with 658581 additions and 3084 deletions

View File

View File

@ -1,4 +1,4 @@
# Generated by Django 5.2.1 on 2025-06-12 14:22
# Generated by Django 5.1.7 on 2025-06-22 17:22
import django.db.models.deletion
import django.utils.timezone
@ -7,90 +7,40 @@ from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
("inventory", "__first__"),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.CreateModel(
name="AnalysisCache",
name='ChatLog',
fields=[
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("prompt_hash", models.CharField(db_index=True, max_length=64)),
(
"dealer_id",
models.IntegerField(blank=True, db_index=True, null=True),
),
("created_at", models.DateTimeField(default=django.utils.timezone.now)),
("updated_at", models.DateTimeField(auto_now=True)),
("expires_at", models.DateTimeField(db_index=True)),
("result", models.JSONField()),
(
"user",
models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.CASCADE,
to=settings.AUTH_USER_MODEL,
),
),
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('user_message', models.TextField()),
('chatbot_response', models.TextField()),
('timestamp', models.DateTimeField(auto_now_add=True, db_index=True)),
],
options={
"verbose_name_plural": "Analysis caches",
"indexes": [
models.Index(
fields=["prompt_hash", "dealer_id"],
name="haikalbot_a_prompt__b98e1e_idx",
),
models.Index(
fields=["expires_at"], name="haikalbot_a_expires_e790cd_idx"
),
],
'ordering': ['-timestamp'],
},
),
migrations.CreateModel(
name="ChatLog",
name='AnalysisCache',
fields=[
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("user_message", models.TextField()),
("chatbot_response", models.TextField()),
("timestamp", models.DateTimeField(auto_now_add=True, db_index=True)),
(
"dealer",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="chatlogs",
to="inventory.dealer",
),
),
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('prompt_hash', models.CharField(db_index=True, max_length=64)),
('dealer_id', models.IntegerField(blank=True, db_index=True, null=True)),
('created_at', models.DateTimeField(default=django.utils.timezone.now)),
('updated_at', models.DateTimeField(auto_now=True)),
('expires_at', models.DateTimeField(db_index=True)),
('result', models.JSONField()),
('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
],
options={
"ordering": ["-timestamp"],
"indexes": [
models.Index(
fields=["dealer", "timestamp"],
name="haikalbot_c_dealer__6f8d63_idx",
)
],
'verbose_name_plural': 'Analysis caches',
},
),
]

View File

@ -0,0 +1,34 @@
# Generated by Django 5.1.7 on 2025-06-22 17:22
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
('haikalbot', '0001_initial'),
('inventory', '0001_initial'),
]
operations = [
migrations.AddField(
model_name='chatlog',
name='dealer',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='chatlogs', to='inventory.dealer'),
),
migrations.AddIndex(
model_name='analysiscache',
index=models.Index(fields=['prompt_hash', 'dealer_id'], name='haikalbot_a_prompt__b98e1e_idx'),
),
migrations.AddIndex(
model_name='analysiscache',
index=models.Index(fields=['expires_at'], name='haikalbot_a_expires_e790cd_idx'),
),
migrations.AddIndex(
model_name='chatlog',
index=models.Index(fields=['dealer', 'timestamp'], name='haikalbot_c_dealer__6f8d63_idx'),
),
]

File diff suppressed because it is too large Load Diff

View File

@ -2475,15 +2475,23 @@ class SaleOrder(models.Model):
@property
def items(self):
if self.invoice.get_itemtxs_data():
return self.invoice.get_itemtxs_data()[0]
return []
# Check if an invoice is associated with this SaleOrder
if self.invoice:
# Check if get_itemtxs_data returns data before proceeding
# You might want to handle what get_itemtxs_data returns if it can be empty
item_data = self.invoice.get_itemtxs_data()
if item_data:
return item_data
return [] # Return an empty list if no invoice or no item data
@property
def cars(self):
if self.items:
return [x.item_model.car for x in self.items]
return []
# Check if self.items is not empty before trying to iterate
if self.items.exists() if hasattr(self.items, 'exists') else self.items: # Handle both QuerySet and list
# Ensure x is an *instance* of ItemTransactionModel
# item_model should be a ForeignKey to your CarModel within ItemTransactionModel
return [x.item_model.car for x in self.items if hasattr(x, 'item_model') and hasattr(x.item_model, 'car')]
return [] # Return an empty list if no items or no associated cars
class CustomGroup(models.Model):

View File

@ -1114,7 +1114,7 @@ urlpatterns = [
views.PurchaseOrderMarkAsVoidView.as_view(),
name="po-action-mark-as-void",
),
path('inv/dashboard',views.inventory_dash,name='inv_dash')
]
handler404 = "inventory.views.custom_page_not_found_view"

View File

@ -1245,6 +1245,124 @@ def inventory_stats_view(request):
return render(request, "inventory/inventory_stats.html", {"inventory": result})
# @login_required
# def inventory_stats_view(request):
# """
# Handle the inventory stats view for a dealer, displaying detailed information
# about the cars, including counts grouped by make, model, and trim.
# The function fetches all cars associated with the authenticated dealer, calculates
# the inventory statistics (e.g., total cars, reserved cars, and cars categorized
# by make, model, and trim levels), and prepares the data to be rendered in a
# template.
# :param request: The HTTP request object from the client.
# :type request: HttpRequest
# :return: An HTTP response containing structured inventory data rendered in the
# "inventory/inventory_stats.html" template.
# :rtype: HttpResponse
# """
# dealer = get_user_type(request)
# # Base queryset for cars belonging to the dealer
# # Ordering here is important for consistent pagination results
# cars = models.Car.objects.filter(dealer=dealer).order_by(
# 'id_car_make__name', 'id_car_model__name', 'id_car_trim__name'
# ) # Added ordering for consistent pagination
# # Count for total, reserved, showroom, and unreserved cars
# total_cars = cars.count()
# reserved_cars = models.CarReservation.objects.filter(car__dealer=dealer).count() # Filter reservations by dealer's cars
# # We need to process the cars into the inventory structure FIRST,
# # then paginate the list of makes.
# inventory_data = {}
# for car in cars:
# make = car.id_car_make
# if make.id_car_make not in inventory_data:
# inventory_data[make.id_car_make] = {
# "make_id": make.id_car_make,
# "slug": make.slug,
# "make_name": make.get_local_name(),
# "total_cars": 0,
# "models": {},
# }
# inventory_data[make.id_car_make]["total_cars"] += 1
# model = car.id_car_model
# # Ensure model exists before trying to access its attributes
# if model:
# if model.id_car_model not in inventory_data[make.id_car_make]["models"]:
# inventory_data[make.id_car_make]["models"][model.id_car_model] = {
# "model_id": model.id_car_model,
# "slug": model.slug,
# "model_name": model.get_local_name(),
# "total_cars": 0,
# "trims": {},
# }
# inventory_data[make.id_car_make]["models"][model.id_car_model]["total_cars"] += 1
# trim = car.id_car_trim
# if trim: # Ensure trim exists
# if trim.id_car_trim not in inventory_data[make.id_car_make]["models"][model.id_car_model]["trims"]:
# inventory_data[make.id_car_make]["models"][model.id_car_model]["trims"][
# trim.id_car_trim
# ] = {
# "trim_id": trim.id_car_trim,
# "slug": trim.slug,
# "trim_name": trim.name,
# "total_cars": 0,
# }
# inventory_data[make.id_car_make]["models"][model.id_car_model]["trims"][
# trim.id_car_trim
# ]["total_cars"] += 1
# # Convert the inventory dictionary into a list of makes for pagination
# # Sort the makes by name for consistent pagination
# all_makes = sorted(inventory_data.values(), key=lambda x: x['make_name'])
# # --- Pagination Logic ---
# items_per_page = 10 # You can adjust this number
# paginator = Paginator(all_makes, items_per_page)
# page_number = request.GET.get('page')
# try:
# page_obj = paginator.get_page(page_number)
# except PageNotAnInteger:
# page_obj = paginator.get_page(1)
# except EmptyPage:
# page_obj = paginator.get_page(paginator.num_pages)
# # The 'makes' list for the current page
# # Ensure models and trims are also converted to lists within each make on the current page
# paginated_makes_list = []
# for make_data in page_obj.object_list:
# make_data_copy = make_data.copy() # Avoid modifying the original dict during iteration
# make_data_copy['models'] = []
# for model_id, model_data in make_data['models'].items():
# model_data_copy = model_data.copy()
# model_data_copy['trims'] = list(model_data['trims'].values())
# make_data_copy['models'].append(model_data_copy)
# paginated_makes_list.append(make_data_copy)
# result = {
# "total_cars": total_cars,
# "reserved_cars": reserved_cars,
# "makes": paginated_makes_list, # This is now the paginated list of makes
# }
# # print(result["makes"]) # For debugging
# context = {
# "inventory": result,
# "page_obj": page_obj, # Pass the page_obj to the template
# "is_paginated": page_obj.has_other_pages(), # To use in template for conditional rendering
# }
# return render(request, "inventory/inventory_stats.html", context)
class CarDetailView(LoginRequiredMixin, PermissionRequiredMixin, DetailView):
"""
Provides a detailed view of a single car instance.
@ -2897,7 +3015,7 @@ class OrganizationListView(LoginRequiredMixin, ListView):
model = models.Organization
template_name = "organizations/organization_list.html"
context_object_name = "organizations"
paginate_by = 30
paginate_by = 1
def get_queryset(self):
query = self.request.GET.get("q")
@ -4270,7 +4388,7 @@ class InvoiceListView(LoginRequiredMixin, PermissionRequiredMixin, ListView):
model = InvoiceModel
template_name = "sales/invoices/invoice_list.html"
context_object_name = "invoices"
paginate_by = 30
paginate_by = 20
permission_required = ["django_ledger.view_invoicemodel"]
def get_queryset(self):
@ -9092,7 +9210,7 @@ class PurchaseOrderDetailView(PurchaseOrderModelDetailViewBase):
class PurchaseOrderListView(LoginRequiredMixin, PermissionRequiredMixin, ListView):
model = PurchaseOrderModel
context_object_name = "purchase_orders"
paginate_by = 30
paginate_by = 20
template_name = "purchase_orders/po_list.html"
permission_required = ["inventory.view_carfinance"]
@ -9370,8 +9488,20 @@ def view_items_inventory(request, entity_slug, po_pk):
dealer = get_user_type(request)
po = PurchaseOrderModel.objects.get(pk=po_pk)
items = po.get_itemtxs_data()[0]
items_per_page = 30
paginator = Paginator(items, items_per_page)
page_number = request.GET.get('page')
try:
page_obj = paginator.get_page(page_number)
except PageNotAnInteger:
# If page is not an integer, deliver first page.
page_obj = paginator.get_page(1)
except EmptyPage:
# If page is out of range (e.g. 9999), deliver last page of results.
page_obj = paginator.get_page(paginator.num_pages)
return render(
request, "purchase_orders/po_upload_cars.html", {"po": po, "items": items}
request, "purchase_orders/po_upload_cars.html", {"po": po, "items": items,"page_obj":page_obj}
)
@ -9535,9 +9665,3 @@ class InventoryListView(InventoryListViewBase):
return super().get_queryset()
def inventory_dash(request):
cars=models.Car.objects.all()
context={
'cars':cars
}
return render(request,'inv_dash.html',context)

View File

@ -0,0 +1,125 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
width="512.000000pt" height="512.000000pt" viewBox="0 0 512.000000 512.000000"
preserveAspectRatio="xMidYMid meet">
<metadata>
Created by potrace 1.16, written by Peter Selinger 2001-2019
</metadata>
<g transform="translate(0.000000,512.000000) scale(0.100000,-0.100000)"
fill="#000000" stroke="none">
<path d="M2655 2513 c-225 -28 -366 -68 -545 -158 -69 -34 -131 -60 -138 -58
-7 3 -30 -11 -51 -30 -86 -77 -166 -107 -346 -127 -290 -31 -427 -92 -557
-247 -98 -118 -99 -118 -92 -194 5 -50 3 -73 -10 -97 -34 -65 -10 -95 92 -113
84 -16 91 -24 30 -38 -67 -15 -83 -24 -74 -46 6 -17 8 -17 26 0 11 10 41 23
67 30 48 12 84 8 208 -27 l40 -11 -70 -13 c-38 -7 -94 -16 -123 -20 -29 -4
-55 -10 -57 -14 -3 -5 26 -17 63 -29 303 -92 725 -112 1187 -56 148 18 204 34
269 78 44 30 88 44 321 100 380 92 698 156 838 167 173 14 257 41 257 80 0 11
-6 20 -13 20 -11 0 -10 10 3 51 14 40 25 55 48 64 69 29 88 184 37 310 -70
178 -83 191 -212 206 -61 7 -111 21 -163 44 -140 62 -316 106 -500 125 -89 9
-469 11 -535 3z m585 -27 c185 -25 335 -68 456 -129 l47 -24 -38 -7 c-22 -4
-51 -14 -65 -21 -14 -7 -117 -38 -230 -70 -502 -140 -543 -152 -537 -168 2 -7
30 -23 63 -36 l59 -23 105 22 c58 12 138 30 178 41 40 11 81 19 90 17 9 -2
-28 -14 -83 -27 -55 -12 -181 -43 -280 -68 -99 -25 -191 -46 -205 -47 -14 -1
-27 -3 -30 -6 -3 -3 -33 -17 -68 -32 l-63 -27 -47 49 c-87 90 -157 88 -288 -6
l-77 -55 35 47 c71 96 193 143 286 111 50 -18 53 -14 10 13 -22 13 -51 20 -84
20 -100 0 -180 -45 -306 -171 -72 -73 -82 -79 -160 -104 -86 -27 -286 -65
-343 -65 -19 0 -36 -4 -39 -9 -10 -16 243 13 383 45 35 8 66 13 68 10 9 -8
-65 -45 -132 -66 -93 -29 -114 -40 -121 -62 -4 -14 -9 -16 -24 -8 -11 6 -114
10 -247 10 -245 0 -394 15 -503 49 -110 34 -131 61 -89 111 19 22 22 23 30 7
13 -22 29 -22 29 1 0 9 20 38 43 63 23 26 59 67 80 93 47 57 112 91 231 121
89 22 226 42 226 32 0 -2 -47 -21 -105 -42 -98 -35 -287 -124 -310 -147 -5 -5
46 18 115 51 120 57 322 138 412 164 33 10 105 11 318 4 151 -4 325 -5 387 -2
l112 7 53 64 c29 35 86 91 127 126 70 59 72 62 50 71 -13 5 -121 10 -241 11
l-216 1 61 17 c97 28 247 40 394 32 73 -4 130 -10 127 -15 -2 -5 12 -1 32 7
85 35 168 40 324 20z m706 -184 c35 -20 -8 -22 -96 -5 -51 9 -84 20 -75 23 22
8 149 -6 171 -18z m-64 -24 c35 -10 143 -93 159 -122 4 -6 1 -32 -6 -58 -6
-26 -8 -53 -4 -60 5 -8 10 -3 14 15 9 36 21 34 29 -4 14 -71 -7 -154 -46 -187
-14 -11 -16 -5 -16 62 -1 82 -15 121 -65 173 -89 94 -184 16 -237 -194 -6 -24
-15 -43 -20 -43 -5 0 -7 -8 -3 -17 6 -17 5 -17 -14 0 -12 10 -48 29 -80 43
-32 13 -49 24 -37 24 11 0 43 -11 70 -25 27 -14 50 -25 51 -25 1 0 6 22 12 49
25 117 99 229 167 251 41 14 69 6 108 -29 l30 -26 -15 25 c-9 14 -31 33 -50
42 -50 25 -94 10 -171 -60 l-64 -58 -104 -18 c-136 -23 -598 -120 -717 -150
-63 -16 -93 -20 -94 -12 0 7 -2 7 -6 -1 -2 -7 -23 -18 -45 -23 -38 -11 -40
-13 -34 -43 4 -18 9 -71 13 -119 3 -49 7 -88 9 -88 2 0 21 6 41 14 21 8 92 29
158 46 112 29 259 75 433 135 83 28 104 30 147 11 l30 -13 -70 -20 c-38 -12
-164 -49 -280 -83 -281 -82 -476 -150 -468 -163 4 -6 0 -8 -10 -4 -9 3 -18 1
-20 -6 -12 -33 -15 7 -6 78 11 82 7 146 -14 222 -6 23 -8 45 -5 48 23 23 359
112 698 185 289 62 363 88 434 151 67 58 20 74 -128 43 -84 -17 -115 -15 -76
6 70 37 224 52 302 28z m-2027 -98 c-3 -5 -14 -10 -23 -10 -15 0 -15 2 -2 10
20 13 33 13 25 0z m393 -17 c-15 -2 -42 -2 -60 0 -18 2 -6 4 27 4 33 0 48 -2
33 -4z m1440 -148 c-6 -14 -19 -25 -30 -25 -25 0 -23 14 5 33 32 23 38 21 25
-8z m228 -7 l19 -21 -28 18 c-15 10 -38 15 -52 13 -13 -3 -22 -1 -19 3 10 17
61 9 80 -13z m-59 -50 c-2 -13 -4 -5 -4 17 -1 22 1 32 4 23 2 -10 2 -28 0 -40z
m-2707 39 c0 -2 -15 -16 -32 -33 l-33 -29 29 33 c28 30 36 37 36 29z m2801
-56 c6 -21 10 -71 8 -112 -4 -62 -9 -81 -34 -119 -44 -65 -96 -68 -134 -6 -24
39 -27 52 -7 34 8 -7 13 -17 13 -21 -1 -5 11 -18 26 -30 26 -20 30 -20 54 -7
15 9 36 30 46 48 l19 32 -43 41 -44 41 41 -31 c23 -17 45 -31 48 -31 8 0 1
164 -8 179 -5 8 -19 -3 -42 -34 -19 -25 -37 -45 -41 -45 -4 0 16 31 60 88 16
20 26 14 38 -27z m-136 -2 c9 -17 14 -33 11 -36 -3 -3 -10 7 -16 22 -6 15 -13
32 -16 36 -3 5 -3 9 0 9 3 0 13 -14 21 -31z m-11 -51 c6 -4 18 -5 26 -2 11 4
12 2 4 -6 -20 -20 -54 6 -53 38 2 27 2 27 6 2 3 -14 10 -28 17 -32z m-1549
-69 c-44 -83 -62 -157 -70 -289 -3 -57 -7 -106 -9 -108 -13 -13 -165 -22 -371
-22 -216 0 -243 2 -270 19 -35 21 -151 149 -143 157 14 13 65 -14 131 -68 l72
-60 115 5 c103 5 171 17 193 36 4 4 -8 27 -25 52 l-33 44 37 -31 c20 -18 50
-40 67 -50 39 -23 39 -29 1 -43 -16 -5 -30 -12 -30 -15 0 -8 94 5 104 15 5 4
-18 45 -54 94 -34 48 -58 90 -54 95 5 4 44 22 87 40 44 18 86 43 97 58 19 23
72 62 85 62 3 0 -2 -14 -10 -31 -21 -39 -55 -173 -55 -213 0 -52 17 -16 44 92
25 101 58 174 98 214 32 32 30 16 -7 -53z m263 47 c15 -8 36 -29 46 -48 l20
-33 -35 37 c-36 38 -70 52 -110 46 -26 -3 -26 -3 -14 -123 9 -98 -6 -74 -20
31 -10 75 -9 86 4 94 24 14 79 12 109 -4z m-288 -9 c0 -2 -10 -12 -22 -23
l-23 -19 19 23 c18 21 26 27 26 19z m1590 -64 c-11 -17 -11 -17 -6 0 3 10 6
24 7 30 0 9 2 9 5 0 3 -7 0 -20 -6 -30z m-1334 -49 c-29 -63 -46 -70 -20 -8 9
21 21 50 26 64 6 14 12 20 15 13 3 -7 -7 -38 -21 -69z m1251 44 c-3 -7 -5 -2
-5 12 0 14 2 19 5 13 2 -7 2 -19 0 -25z m30 -20 c-3 -8 -6 -5 -6 6 -1 11 2 17
5 13 3 -3 4 -12 1 -19z m90 -45 c-3 -10 -5 -2 -5 17 0 19 2 27 5 18 2 -10 2
-26 0 -35z m-1260 15 c-3 -8 -6 -5 -6 6 -1 11 2 17 5 13 3 -3 4 -12 1 -19z
m-228 -42 c42 -44 21 -48 -28 -6 -26 22 -37 26 -43 17 -10 -15 -11 4 -2 27 8
20 27 10 73 -38z m239 -33 c-2 -57 -2 -57 -5 -10 -2 26 -7 47 -11 47 -4 0 -25
-12 -47 -25 -22 -14 -49 -25 -60 -25 -22 1 90 70 113 70 8 0 11 -17 10 -57z
m-321 -20 c-3 -10 -5 -2 -5 17 0 19 2 27 5 18 2 -10 2 -26 0 -35z m1333 27
c-8 -5 -24 -10 -35 -10 -17 0 -17 2 -5 10 8 5 24 10 35 10 17 0 17 -2 5 -10z
m-2646 -79 c5 -7 15 -10 24 -6 10 3 4 -7 -13 -25 l-29 -30 -20 20 c-20 19 -20
21 -3 49 9 16 17 37 18 48 1 10 4 4 8 -13 4 -17 11 -36 15 -43z m1484 35 c-2
-13 -10 -21 -23 -21 -23 0 -33 34 -14 45 20 13 40 -1 37 -24z m-1337 -36 c42
-19 95 -33 154 -41 109 -14 115 -15 115 -30 0 -8 -23 -10 -82 -5 -108 10 -160
21 -231 53 -46 21 -55 28 -46 39 15 19 17 18 90 -16z m1255 22 c-3 -5 -23 -17
-46 -27 -46 -21 -48 -32 -19 -95 l21 -45 33 65 c40 76 44 70 13 -19 l-22 -63
23 -19 c13 -10 18 -19 12 -19 -22 0 -87 76 -99 116 -20 68 -17 78 31 96 51 19
60 21 53 10z m165 -39 c27 -16 49 -31 49 -35 0 -14 -14 -8 -70 27 -65 41 -49
47 21 8z m56 -5 c-3 -8 -6 -5 -6 6 -1 11 2 17 5 13 3 -3 4 -12 1 -19z m-127
-24 c0 -3 -4 -3 -9 1 -5 3 -11 -29 -13 -74 l-3 -79 26 13 c35 18 52 41 43 57
-5 10 -4 10 6 1 11 -10 10 -16 -6 -34 -24 -26 -67 -49 -91 -48 -10 0 -13 3 -5
6 8 3 12 32 12 94 0 87 1 89 20 79 11 -6 20 -13 20 -16z m-1440 -13 c0 -10
-25 -21 -48 -21 -12 1 -10 5 8 15 29 17 40 18 40 6z m1295 -158 c76 -43 162
-24 228 50 20 22 25 25 17 10 -15 -33 -97 -92 -137 -99 -72 -14 -162 47 -198
133 -26 62 -16 57 18 -8 24 -47 43 -69 72 -86z m266 94 c-10 -9 -11 -8 -5 6 3
10 9 15 12 12 3 -3 0 -11 -7 -18z"/>
<path d="M3015 2457 c-114 -30 -189 -89 -276 -218 l-60 -89 61 0 c65 0 80 -13
28 -24 -18 -3 -136 -15 -263 -26 -388 -34 -717 -111 -929 -217 l-68 -34 -127
16 c-69 9 -157 23 -194 31 -72 17 -101 13 -45 -5 29 -9 266 -49 308 -52 28 -1
-124 -69 -156 -69 -42 0 -193 29 -216 41 -14 7 -18 6 -18 -5 0 -20 79 -43 195
-56 50 -5 97 -10 105 -10 9 0 45 21 80 47 117 85 385 180 674 239 190 38 229
43 439 46 178 3 198 5 194 20 -7 24 58 30 80 6 20 -22 36 -13 29 17 -7 27 0
30 79 41 28 3 68 14 90 24 22 10 87 28 145 40 155 32 324 79 359 101 45 27 39
46 -22 75 -134 61 -376 91 -492 61z m-37 -244 c-10 -2 -28 -2 -40 0 -13 2 -5
4 17 4 22 1 32 -1 23 -4z"/>
<path d="M2726 2328 c-45 -46 -100 -104 -122 -130 l-41 -48 46 0 c44 0 47 2
70 45 13 24 54 83 92 130 90 112 63 114 -45 3z"/>
<path d="M2697 2037 c-41 -13 -57 -23 -55 -34 4 -23 32 -37 54 -28 17 7 15 9
-11 15 -30 8 -30 8 7 9 20 0 43 4 51 7 10 3 17 -2 20 -13 3 -10 5 -1 6 19 0
20 -2 38 -6 41 -5 2 -34 -5 -66 -16z"/>
<path d="M2600 1982 c0 -5 11 -19 25 -32 28 -26 33 -16 9 18 -15 22 -34 30
-34 14z"/>
<path d="M1936 1934 c-100 -20 -197 -54 -190 -66 4 -7 2 -8 -5 -4 -11 7 -136
-62 -128 -71 3 -2 22 1 44 7 21 6 85 13 143 17 112 6 133 13 195 68 46 40 40
42 -70 19 -42 -9 -78 -14 -81 -11 -7 7 161 39 189 35 27 -3 25 -5 -40 -60
l-67 -58 -76 0 c-41 -1 -110 -7 -153 -15 -44 -7 -84 -12 -91 -9 -7 3 -23 -7
-36 -22 l-25 -27 110 7 c156 9 232 23 291 51 55 27 159 128 149 145 -8 13 -75
11 -159 -6z m-109 -50 c-3 -3 -12 -4 -19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z
m55 -29 c3 -14 1 -25 -3 -25 -5 0 -9 11 -9 25 0 14 2 25 4 25 2 0 6 -11 8 -25z"/>
<path d="M1215 1829 c-12 -19 5 -23 22 -6 16 16 16 17 1 17 -9 0 -20 -5 -23
-11z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 8.4 KiB

View File

@ -0,0 +1,994 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
width="512.000000pt" height="512.000000pt" viewBox="0 0 512.000000 512.000000"
preserveAspectRatio="xMidYMid meet">
<metadata>
Created by potrace 1.16, written by Peter Selinger 2001-2019
</metadata>
<g transform="translate(0.000000,512.000000) scale(0.100000,-0.100000)"
fill="#000000" stroke="none">
<path d="M53 5046 l-53 -75 0 -296 0 -296 70 103 c102 151 96 145 118 125 25
-22 25 -22 46 18 23 42 29 43 44 10 15 -32 15 -35 0 -35 -23 -1 -53 -34 -97
-110 -25 -41 -71 -115 -103 -165 -49 -75 -58 -95 -54 -122 3 -22 1 -32 -7 -30
-7 1 -13 -10 -15 -24 -2 -19 4 -31 22 -43 33 -21 33 -50 0 -93 -20 -26 -24
-42 -22 -76 l3 -44 130 19 c161 23 230 42 254 71 49 58 298 397 266 362 -19
-22 -59 -70 -88 -107 -33 -44 -59 -68 -72 -68 -14 0 -16 -3 -8 -8 9 -6 -4 -30
-47 -88 -52 -67 -65 -79 -88 -77 -23 2 -24 1 -7 -6 19 -8 18 -10 -9 -20 -34
-14 -306 -55 -313 -47 -10 9 119 196 131 189 6 -3 8 -2 3 2 -13 15 66 117 253
330 130 148 520 555 597 624 l57 51 -100 0 -100 0 -105 -127 c-211 -256 -564
-715 -596 -776 l-15 -30 -21 22 -22 22 69 132 c138 265 217 382 408 601 57 65
109 127 117 137 13 19 6 19 -290 19 l-304 0 -52 -74z m51 -852 c19 -7 21 -30
4 -37 -7 -2 -21 0 -31 5 -15 7 -16 12 -6 24 13 16 12 16 33 8z"/>
<path d="M1680 5088 c-380 -266 -722 -564 -983 -857 l-74 -84 19 -34 c13 -21
19 -45 16 -67 -2 -19 0 -32 4 -30 21 13 3 -19 -42 -78 l-50 -65 -183 -6 c-100
-4 -225 -13 -277 -22 -52 -8 -98 -15 -102 -15 -11 0 -10 -50 1 -50 4 0 66 9
137 21 146 23 440 35 524 22 l55 -9 -33 -21 c-42 -26 -222 -85 -484 -158 -115
-32 -208 -63 -208 -68 0 -5 7 -6 16 -3 9 4 96 29 193 57 97 28 254 76 349 106
181 59 201 61 188 10 -3 -13 -24 -46 -48 -73 l-42 -49 43 40 c67 63 94 130 65
160 -16 15 -12 21 48 83 35 37 89 97 118 134 43 55 60 69 89 74 54 9 60 12 21
13 l-34 1 64 66 c215 219 568 454 1199 796 l244 133 -148 3 -147 3 -117 -62
c-64 -34 -126 -69 -138 -77 -13 -8 -23 -10 -23 -5 0 6 57 40 128 76 l127 66
-235 0 -235 0 -45 -31z m145 -177 c3 -5 2 -12 -3 -15 -5 -3 -9 1 -9 9 0 17 3
19 12 6z m-1114 -925 c-18 -25 -43 -69 -56 -98 -14 -29 -25 -47 -25 -40 0 6
-9 12 -20 12 -11 0 -20 3 -20 7 0 13 34 43 49 43 14 0 14 2 1 10 -13 9 -7 14
13 11 4 0 6 3 5 8 -4 11 72 104 79 97 3 -2 -9 -25 -26 -50z"/>
<path d="M3289 5107 c16 -21 63 -47 83 -47 7 1 -3 8 -22 16 -19 8 -43 23 -55
32 -19 16 -19 16 -6 -1z"/>
<path d="M4134 5103 c-29 -47 -345 -438 -453 -563 -123 -140 -228 -244 -266
-262 -16 -7 -39 3 -120 58 -169 113 -357 192 -552 231 -126 25 -407 25 -523
-1 -197 -42 -384 -118 -530 -213 -148 -97 -366 -286 -353 -306 3 -5 1 -7 -5
-3 -6 3 -13 2 -16 -3 -6 -9 -46 -3 -46 7 0 3 17 24 37 47 23 23 15 18 -17 -12
-61 -58 -103 -74 -54 -20 17 17 36 41 44 52 l15 20 -24 -20 c-13 -11 -44 -47
-69 -80 -25 -33 -35 -50 -21 -38 13 12 41 25 62 28 34 7 45 3 91 -29 65 -44
100 -88 83 -105 -6 -6 -36 -62 -67 -124 l-55 -112 -104 -55 c-135 -71 -200
-131 -247 -223 -19 -40 -32 -61 -28 -47 15 58 70 144 119 185 28 24 96 68 150
97 l100 53 57 115 c37 74 56 123 53 137 -3 12 -26 37 -52 54 l-47 32 -38 -44
c-98 -111 -202 -263 -278 -407 -30 -56 -103 -132 -116 -120 -8 9 25 98 71 190
46 93 134 234 193 308 l36 45 -35 -33 c-20 -18 -39 -29 -43 -25 -4 5 -6 3 -4
-2 3 -11 -210 -214 -355 -338 -111 -95 -235 -179 -249 -170 -7 3 -8 1 -4 -5 4
-7 2 -12 -3 -12 -20 0 -26 -3 -38 -19 -7 -9 -13 -12 -13 -7 0 6 -7 1 -16 -10
-8 -10 -13 -12 -9 -4 4 8 -1 6 -9 -4 -9 -11 -16 -16 -16 -11 0 5 -7 0 -15 -11
-8 -10 -15 -16 -15 -12 0 4 -12 -4 -26 -17 -31 -29 -210 -119 -272 -136 -42
-12 -43 -13 -40 -52 3 -40 3 -41 58 -52 84 -17 123 -41 198 -119 93 -98 193
-251 259 -397 30 -66 53 -123 51 -125 -2 -1 -15 -8 -28 -13 -23 -9 -22 -10 10
-8 l35 2 51 -152 c51 -154 84 -281 105 -408 19 -115 -3 -443 -35 -520 -13 -29
-26 -35 -282 -120 -148 -49 -274 -91 -280 -93 -6 -2 -14 17 -17 43 -6 44 -84
290 -111 350 -12 26 -14 -9 -15 -264 l-2 -294 67 -241 c37 -132 67 -261 67
-286 0 -31 3 -38 8 -25 4 11 8 18 8 15 1 -3 32 -82 70 -175 l69 -170 166 -3
c91 -1 166 -1 166 1 0 2 -21 39 -46 83 -43 74 -45 82 -40 134 4 44 -2 84 -35
206 -23 83 -44 157 -48 163 -5 7 -17 8 -39 2 -17 -5 -34 -6 -36 -2 -9 13 -54
206 -60 251 -4 33 0 26 12 -25 10 -38 20 -64 23 -58 2 7 57 28 121 47 65 19
122 37 127 40 9 6 0 63 -12 83 -4 6 -19 9 -34 7 -28 -4 -28 -4 2 6 24 8 32 7
41 -5 13 -17 69 -223 63 -228 -13 -11 -253 -87 -258 -82 -3 3 -15 32 -28 63
-12 31 -22 52 -22 45 -1 -15 37 -115 48 -126 4 -4 65 13 135 39 70 25 129 44
131 42 8 -9 76 -328 73 -344 -2 -12 -31 -30 -87 -54 -69 -29 -87 -41 -97 -65
-16 -39 -10 -65 39 -153 l41 -72 335 0 335 0 -30 32 c-17 18 -68 76 -113 128
-75 86 -72 83 40 -33 l124 -127 301 -3 302 -2 -171 178 c-93 98 -174 180 -178
183 -12 7 -11 2 6 -39 8 -20 15 -49 15 -64 l0 -27 -41 39 c-93 90 -252 270
-368 420 -79 102 -191 227 -309 346 -101 103 -180 189 -175 192 4 3 71 26 148
52 77 26 141 48 142 49 1 1 -11 22 -27 46 -17 25 -30 48 -30 53 0 11 48 9 55
-3 3 -5 11 -10 18 -10 6 0 -20 33 -59 72 -128 131 -171 212 -209 393 -49 236
-166 549 -375 1004 -64 138 -72 185 -38 221 74 78 417 336 513 385 43 23 46
23 25 5 -14 -12 -75 -57 -137 -100 -185 -129 -380 -296 -388 -330 -8 -38 -9
-34 102 -299 118 -281 109 -265 141 -257 15 3 55 12 89 20 l61 13 12 -78 c33
-228 118 -478 256 -749 77 -152 117 -210 168 -241 19 -12 25 -19 15 -19 -9 0
-19 -8 -22 -19 -2 -10 -22 -26 -43 -35 l-39 -17 80 -87 c152 -166 301 -304
469 -435 175 -136 382 -314 451 -388 l40 -42 -65 45 c-36 25 -130 89 -210 143
-161 108 -223 155 -385 290 -142 118 -235 188 -235 178 0 -4 17 -19 36 -33 61
-43 72 -58 69 -97 -4 -33 -15 -60 -15 -34 0 7 -5 9 -10 6 -5 -3 -10 1 -10 10
0 8 -6 18 -14 21 -8 3 -16 14 -19 24 -4 16 -12 18 -58 14 -63 -6 -122 3 -114
17 4 5 4 9 1 9 -3 0 -14 -18 -25 -40 l-19 -40 36 -44 37 -45 25 24 c14 13 41
28 60 33 19 6 28 11 20 11 -13 1 -13 2 0 11 8 5 17 6 20 1 3 -4 19 -16 35 -28
23 -16 35 -19 50 -11 19 9 19 8 3 -5 -17 -13 -17 -15 0 -31 10 -9 21 -14 24
-11 3 3 13 -5 24 -17 10 -12 13 -18 7 -14 -31 18 -7 -8 65 -71 43 -37 190
-169 327 -293 136 -124 269 -244 296 -268 l48 -43 208 104 c592 293 1081 445
1318 408 70 -10 194 -63 199 -84 2 -7 8 -34 15 -62 6 -27 38 -105 71 -172 53
-109 57 -124 42 -132 -9 -4 -75 -28 -147 -51 -139 -46 -365 -132 -455 -174
l-55 -25 79 0 c74 -1 87 2 205 53 181 77 401 158 415 153 7 -3 41 -51 76 -106
35 -56 67 -101 73 -101 14 0 6 16 -75 140 -139 216 -245 437 -220 462 9 9 17
7 32 -7 11 -10 17 -22 14 -27 -17 -27 19 -96 163 -311 85 -127 160 -238 167
-245 9 -9 65 -12 236 -10 l223 3 -204 191 c-268 252 -297 276 -469 399 -245
176 -273 202 -320 298 -22 46 -40 88 -40 93 1 5 18 -27 40 -71 43 -90 73 -123
180 -204 89 -68 128 -92 217 -135 59 -29 103 -68 342 -305 151 -149 279 -271
284 -271 6 0 -77 89 -184 198 -281 285 -341 361 -440 553 -92 180 -126 232
-74 115 19 -44 34 -81 32 -82 -2 -2 -38 66 -81 151 -42 85 -79 155 -82 155 -3
0 -2 -5 2 -12 4 -7 3 -8 -5 -4 -6 4 -9 11 -6 16 3 5 -6 33 -21 62 -24 49 -25
56 -12 87 l14 34 37 -52 c28 -39 43 -51 55 -46 44 17 164 46 175 42 7 -2 -4
-7 -23 -11 -19 -4 -65 -16 -102 -27 -74 -21 -80 -31 -56 -86 20 -45 69 -114
77 -108 5 2 49 -42 97 -100 49 -58 97 -107 106 -110 9 -3 33 1 53 10 43 18 55
19 55 5 0 -5 -17 -18 -39 -29 -62 -32 -101 -70 -101 -98 0 -54 230 -244 331
-274 35 -11 44 -9 91 15 93 49 198 118 198 131 0 21 -236 232 -247 221 -3 -3
10 -18 28 -33 91 -76 199 -176 199 -184 0 -10 -107 -82 -183 -122 -42 -22 -53
-24 -80 -14 -123 42 -340 230 -322 278 7 18 113 84 122 76 11 -12 -7 -37 -47
-62 -22 -14 -40 -32 -40 -40 0 -37 186 -195 230 -195 35 0 180 71 180 87 0 22
-19 55 -55 93 -25 27 -35 52 -48 114 -9 43 -18 81 -20 83 -2 2 -25 -6 -50 -17
l-47 -21 -45 31 c-36 25 -45 36 -44 58 2 27 2 27 6 2 3 -15 19 -34 39 -47 l34
-22 0 112 c0 171 -19 214 -127 283 -60 38 -72 42 -52 17 7 -10 1 -7 -13 6 -15
13 -25 27 -23 31 3 4 -13 20 -35 35 -45 31 -63 30 -219 -6 -46 -11 -86 -17
-89 -14 -3 3 -23 -30 -44 -72 -68 -139 -166 -219 -438 -358 -84 -43 -154 -84
-157 -91 -13 -34 -160 -94 -230 -94 -17 0 -69 14 -115 31 -46 17 -135 39 -198
50 -476 81 -952 324 -1254 639 -99 105 -111 114 -141 111 -18 -1 -36 3 -41 10
-4 8 -3 10 4 5 6 -4 21 -2 32 4 20 11 19 13 -20 57 -101 115 -204 295 -309
540 -117 274 -147 421 -138 673 7 188 21 250 91 395 63 131 123 212 206 280
34 28 81 71 105 96 30 32 47 44 57 38 10 -7 11 -9 0 -9 -7 0 -25 -14 -40 -31
-14 -17 -53 -54 -86 -81 -89 -73 -147 -147 -209 -267 -89 -173 -92 -186 -92
-416 1 -282 31 -431 140 -682 90 -208 207 -402 317 -528 21 -23 34 -46 30 -50
-4 -4 0 -6 8 -3 8 2 29 23 46 45 l30 40 29 -56 c44 -84 196 -231 340 -327 147
-98 271 -165 435 -237 154 -67 324 -123 247 -81 -16 9 -27 17 -25 19 2 2 32
-3 68 -10 36 -8 79 -15 95 -15 l30 -2 -27 -10 c-16 -5 -28 -13 -28 -17 0 -5
34 -13 76 -19 46 -6 84 -17 97 -29 l21 -18 -21 30 c-28 40 -77 85 -136 125
-86 57 -119 91 -106 107 9 10 9 20 0 39 -16 35 -118 170 -216 284 -238 279
-265 333 -215 429 10 21 16 41 13 45 -4 3 -4 6 0 6 3 0 78 -96 166 -212 88
-117 184 -243 214 -279 35 -43 82 -124 134 -230 67 -136 90 -172 131 -212 49
-45 70 -53 124 -49 11 1 20 -7 23 -21 3 -12 10 -44 16 -72 19 -92 60 -111 179
-83 l52 12 -4 48 -3 48 85 36 c113 49 446 270 499 332 39 44 164 274 181 331
16 53 11 -15 -10 -121 -22 -115 -23 -118 -12 -101 4 6 60 20 125 31 143 24
168 19 226 -43 l42 -45 39 20 c22 11 59 23 82 26 36 5 50 1 88 -24 25 -15 59
-48 75 -72 26 -38 30 -52 29 -107 0 -35 3 -63 8 -63 5 0 55 -40 111 -89 56
-49 167 -141 247 -204 l145 -116 3 257 c2 236 1 258 -15 270 -10 7 -69 40
-132 73 -62 33 -153 85 -202 115 -184 114 -192 129 -195 344 l-2 155 7 -135
c10 -167 22 -213 69 -260 45 -44 186 -132 350 -218 l122 -64 0 114 -1 113
-112 68 c-62 38 -124 78 -137 89 l-25 20 35 -20 c19 -11 81 -47 138 -81 95
-56 102 -59 102 -37 0 17 -19 37 -72 77 -74 56 -122 123 -131 184 -2 17 -2 25
0 19 6 -16 43 -5 43 12 0 20 5 18 70 -26 81 -55 90 -58 90 -27 0 21 -11 32
-61 59 -36 18 -70 45 -80 63 -29 46 -23 50 20 13 22 -18 58 -43 80 -56 l41
-23 0 95 0 94 -47 23 c-123 59 -197 177 -172 271 12 45 66 95 115 104 59 11
23 26 -52 22 l-69 -3 17 51 c41 121 47 269 13 320 -8 13 -14 24 -12 24 3 0 47
-16 98 -35 52 -19 97 -35 102 -35 4 0 7 40 7 89 0 69 -3 90 -15 95 -8 3 -64
13 -125 23 l-110 18 0 43 c0 23 -13 77 -29 120 -16 42 -31 102 -34 132 -8 75
-67 248 -108 311 -23 37 -53 64 -103 96 -39 25 -96 69 -127 98 -67 64 -127 95
-255 133 -99 30 -340 80 -401 84 -18 1 -33 8 -33 14 0 7 -44 58 -97 114 l-97
102 45 -6 c24 -4 179 -22 344 -41 363 -43 290 -31 751 -121 210 -41 384 -74
388 -74 3 0 6 6 6 14 0 10 -42 21 -147 41 -273 50 -283 61 -20 20 87 -14 161
-25 163 -25 2 0 4 9 4 20 0 11 -6 20 -13 20 -7 0 -147 18 -311 40 -163 22
-299 40 -301 40 -1 0 -24 18 -51 40 -47 39 -104 112 -104 134 0 6 10 -7 23
-29 12 -22 33 -45 45 -51 12 -6 98 -16 190 -23 92 -7 237 -19 322 -27 193 -17
200 -17 200 0 0 18 -15 20 -360 46 -151 12 -290 23 -308 26 -38 6 -60 27 -96
95 l-28 50 16 102 c21 129 48 184 133 272 37 39 68 73 68 77 0 3 4 10 9 15 5
5 6 3 2 -4 -8 -15 10 -18 19 -3 10 16 228 143 390 227 119 62 151 83 153 101
l3 22 -413 0 c-452 -1 -438 2 -328 -55 69 -35 147 -55 216 -55 62 0 215 35
288 65 45 19 51 17 30 -13 -36 -51 -139 -81 -295 -85 l-96 -2 -39 -54 c-22
-30 -75 -87 -119 -127 -44 -41 -183 -185 -310 -321 -126 -136 -251 -268 -276
-295 l-46 -48 -76 0 c-71 0 -81 3 -129 35 -66 43 -127 94 -112 95 18 0 135
107 228 208 128 140 516 625 516 645 0 13 -15 7 -26 -10z m366 -371 c-99 -78
-407 -334 -485 -405 -49 -44 -70 -59 -45 -33 44 47 91 87 324 282 127 105 228
184 236 183 3 0 -11 -12 -30 -27z m-1670 -205 c52 -14 111 -33 130 -42 35 -16
35 -16 5 -11 -16 3 -84 17 -150 31 -190 42 -390 45 -600 10 -29 -5 -29 -5 -5
5 58 26 197 39 360 36 137 -3 181 -8 260 -29z m-763 -57 c-65 -22 -156 -57
-202 -79 -47 -22 -85 -37 -85 -35 0 19 347 154 390 153 8 0 -38 -18 -103 -39z
m346 33 c-13 -2 -35 -2 -50 0 -16 2 -5 4 22 4 28 0 40 -2 28 -4z m185 0 c-10
-2 -28 -2 -40 0 -13 2 -5 4 17 4 22 1 32 -1 23 -4z m-301 -9 c-3 -3 -12 -4
-19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z m380 0 c-3 -3 -12 -4 -19 -1 -8 3 -5
6 6 6 11 1 17 -2 13 -5z m1660 -26 c-3 -7 -5 -2 -5 12 0 14 2 19 5 13 2 -7 2
-19 0 -25z m-1600 16 c-3 -3 -12 -4 -19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z
m120 -30 c-3 -3 -12 -4 -19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z m1470 -61 c-3
-10 -5 -2 -5 17 0 19 2 27 5 18 2 -10 2 -26 0 -35z m-1739 16 c53 -6 147 -23
207 -39 105 -27 280 -93 290 -110 3 -4 -36 10 -87 32 -121 52 -291 95 -434
109 -189 20 -421 -14 -603 -85 -36 -14 -66 -24 -68 -22 -7 7 150 63 237 85
161 39 295 48 458 30z m493 -43 c60 -30 147 -81 194 -112 78 -52 277 -222 315
-269 14 -17 14 -18 -7 -7 -12 7 -28 20 -35 31 -28 39 -180 170 -268 230 -50
35 -144 90 -208 122 -65 32 -113 59 -108 59 5 0 58 -24 117 -54z m-356 -37
c122 -25 255 -68 332 -109 l58 -30 -98 3 c-63 2 -91 0 -81 -6 9 -5 56 -9 105
-8 70 1 96 -2 126 -18 44 -22 126 -85 204 -155 l54 -49 -65 7 c-122 13 -204
38 -322 97 -123 62 -189 79 -305 79 -59 0 -78 -10 -51 -26 7 -5 8 -3 3 5 -22
36 112 -58 211 -147 l59 -54 247 -1 c170 -2 251 -6 258 -13 9 -9 -56 -11 -256
-9 -248 2 -266 1 -248 -14 10 -9 29 -37 42 -62 33 -65 107 -156 144 -176 29
-16 58 -17 264 -14 l231 3 47 -77 c27 -42 47 -77 45 -78 -2 -1 -108 0 -236 3
-230 5 -232 5 -258 30 -15 14 -34 37 -43 53 -16 26 -32 36 -32 18 0 -4 19 -30
43 -57 40 -46 40 -47 9 -26 -17 13 -58 51 -90 84 -31 34 -75 79 -98 102 -23
23 -76 83 -118 134 -43 50 -80 92 -84 92 -4 0 -29 20 -55 44 -160 147 -519
245 -847 232 l-135 -5 68 35 c120 62 343 123 497 138 85 7 275 -5 375 -25z
m1589 -70 c-4 -52 -9 -88 -12 -81 -5 17 8 185 14 179 3 -3 2 -47 -2 -98z
m-2544 86 c0 -2 -10 -9 -22 -15 -22 -11 -22 -10 -4 4 21 17 26 19 26 11z m-50
-28 c0 -2 -19 -18 -42 -36 l-43 -32 39 35 c37 34 46 40 46 33z m140 -41 c0 -2
-7 -7 -16 -10 -8 -3 -12 -2 -9 4 6 10 25 14 25 6z m-53 -29 c-11 -7 -48 -31
-84 -54 -36 -23 -59 -36 -52 -27 12 15 139 94 149 93 3 0 -3 -6 -13 -12z
m1353 -33 c0 -2 -9 0 -20 6 -11 6 -20 13 -20 16 0 2 9 0 20 -6 11 -6 20 -13
20 -16z m754 -6 c-9 -17 -22 -50 -29 -72 -7 -23 -13 -32 -14 -21 -1 21 44 125
54 125 3 0 -2 -14 -11 -32z m-671 -47 c7 -8 -7 -2 -30 14 -24 15 -43 30 -43
32 0 7 61 -31 73 -46z m407 -122 c13 -23 13 -59 1 -59 -6 0 -37 25 -70 56 -52
48 -61 61 -61 91 l0 35 60 -52 c34 -29 65 -61 70 -71z m-2000 108 c0 -2 -12
-14 -27 -28 l-28 -24 24 28 c23 25 31 32 31 24z m268 -4 c-16 -2 -40 -2 -55 0
-16 2 -3 4 27 4 30 0 43 -2 28 -4z m225 0 c-18 -2 -48 -2 -65 0 -18 2 -4 4 32
4 36 0 50 -2 33 -4z m-674 -6 c-2 -2 -24 -18 -49 -36 l-45 -33 40 36 c22 20
44 36 49 36 5 0 7 -1 5 -3z m324 -4 c-7 -2 -19 -2 -25 0 -7 3 -2 5 12 5 14 0
19 -2 13 -5z m430 0 c-7 -2 -19 -2 -25 0 -7 3 -2 5 12 5 14 0 19 -2 13 -5z
m-496 -9 c-3 -3 -12 -4 -19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z m556 -1 c-7
-2 -19 -2 -25 0 -7 3 -2 5 12 5 14 0 19 -2 13 -5z m54 -9 c-3 -3 -12 -4 -19
-1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z m988 -14 c10 -11 16 -20 13 -20 -3 0 -13
9 -23 20 -10 11 -16 20 -13 20 3 0 13 -9 23 -20z m-920 0 c25 -11 -1 -11 -35
0 -20 6 -21 8 -5 8 11 0 29 -3 40 -8z m65 -20 c18 -12 2 -12 -25 0 -13 6 -15
9 -5 9 8 0 22 -4 30 -9z m50 -20 c8 -5 11 -10 5 -10 -5 0 -17 5 -25 10 -8 5
-10 10 -5 10 6 0 17 -5 25 -10z m-970 -14 c0 -2 -8 -10 -17 -17 -16 -13 -17
-12 -4 4 13 16 21 21 21 13z m1068 -30 c37 -19 81 -47 97 -61 l30 -27 -35 24
c-19 13 -66 40 -105 60 -38 21 -67 38 -62 38 4 0 38 -15 75 -34z m1949 -2 c-3
-3 -12 -4 -19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z m-750 -191 c26 -46 41 -58
23 -20 -11 21 -11 21 5 2 8 -11 13 -25 10 -33 -2 -7 0 -10 5 -7 10 6 55 -74
46 -83 -3 -3 -6 -1 -6 4 0 6 -7 19 -15 30 -14 16 -14 14 0 -14 13 -26 19 -31
30 -22 8 7 46 10 102 7 l88 -3 -91 -2 c-73 -2 -93 -5 -98 -18 -4 -10 -2 -13 6
-8 8 5 9 2 5 -10 -6 -16 9 -17 226 -13 255 5 302 0 390 -45 77 -38 128 -86
160 -151 35 -69 98 -273 90 -292 -12 -32 -68 -45 -347 -80 -158 -19 -295 -35
-306 -35 -10 0 -21 8 -24 18 -2 9 -3 -10 -1 -43 l4 -60 -10 65 c-6 36 -22 112
-37 170 -14 58 -27 108 -27 112 0 3 -3 9 -7 13 -4 4 -4 13 -1 21 3 8 0 14 -6
14 -6 0 -11 6 -11 12 0 27 -54 152 -86 200 -19 27 -34 52 -34 55 0 6 -48 64
-79 98 -11 11 -34 45 -53 75 -19 30 -49 78 -67 107 l-33 51 -46 -29 c-25 -16
-51 -29 -58 -29 -6 0 22 -35 63 -77 41 -43 79 -77 84 -75 6 1 8 -2 4 -8 -4 -6
11 -32 33 -58 133 -159 259 -455 303 -710 30 -180 25 -544 -12 -755 -20 -110
-21 -70 -4 89 10 85 14 184 11 229 -3 53 -2 70 4 50 9 -31 5 126 -7 305 -5 72
-8 88 -14 65 -5 -21 -7 -13 -3 25 2 33 1 47 -4 36 -6 -13 -8 -4 -9 30 0 54
-47 206 -100 329 -72 164 -148 275 -301 439 -40 43 -71 80 -68 83 3 3 -13 19
-34 34 -51 37 -51 45 0 19 21 -11 47 -20 57 -20 28 0 82 37 101 69 l16 29 54
-72 c29 -39 65 -90 79 -113z m810 181 c-3 -3 -12 -4 -19 -1 -8 3 -5 6 6 6 11
1 17 -2 13 -5z m50 -10 c-3 -3 -12 -4 -19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z
m66 -11 c-7 -2 -21 -2 -30 0 -10 3 -4 5 12 5 17 0 24 -2 18 -5z m-2526 -48
c221 -32 355 -80 437 -155 42 -39 183 -232 158 -216 -7 4 -31 35 -54 69 -54
80 -143 169 -195 196 -64 32 -201 69 -330 87 -128 19 -443 25 -638 12 -146
-10 -100 8 55 21 150 13 431 6 567 -14z m558 -25 c10 -11 16 -20 13 -20 -3 0
-13 9 -23 20 -10 11 -16 20 -13 20 3 0 13 -9 23 -20z m-997 -37 c-16 -2 -40
-2 -55 0 -16 2 -3 4 27 4 30 0 43 -2 28 -4z m110 0 c-16 -2 -40 -2 -55 0 -16
2 -3 4 27 4 30 0 43 -2 28 -4z m299 0 c-20 -2 -52 -2 -70 0 -17 2 0 4 38 4 39
0 53 -2 32 -4z m1010 1 c-3 -3 -12 -4 -19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z
m831 -39 c146 -31 291 -77 347 -110 42 -25 116 -95 99 -95 -33 0 -94 27 -137
62 -93 73 -169 103 -366 143 -145 29 -155 30 -147 10 8 -22 0 -18 -17 8 l-15
23 57 -7 c31 -5 112 -20 179 -34z m-2475 28 c-18 -2 -48 -2 -65 0 -18 2 -4 4
32 4 36 0 50 -2 33 -4z m745 0 c-10 -2 -26 -2 -35 0 -10 3 -2 5 17 5 19 0 27
-2 18 -5z m1140 0 c-21 -2 -57 -2 -80 0 -24 2 -7 4 37 4 44 0 63 -2 43 -4z
m-1075 -10 c-7 -2 -19 -2 -25 0 -7 3 -2 5 12 5 14 0 19 -2 13 -5z m54 -9 c-3
-3 -12 -4 -19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z m40 -10 c-3 -3 -12 -4 -19
-1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z m643 -69 c43 -41 88 -77 101 -80 13 -3
108 -5 211 -3 169 3 187 1 197 -14 10 -17 -1 -18 -176 -20 -287 -2 -293 -1
-355 71 -43 50 -83 121 -68 121 6 0 46 -34 90 -75z m-1407 48 c-40 -2 -107 -2
-150 0 -43 1 -10 3 72 3 83 0 118 -2 78 -3z m-255 -10 c-10 -2 -26 -2 -35 0
-10 3 -2 5 17 5 19 0 27 -2 18 -5z m2530 -20 c-10 -2 -26 -2 -35 0 -10 3 -2 5
17 5 19 0 27 -2 18 -5z m-1820 -85 c3 -37 2 -38 -30 -38 -18 0 -50 3 -70 6
-35 6 -38 9 -38 41 l0 34 68 -3 67 -3 3 -37z m-191 -3 c2 -14 -1 -25 -6 -25
-15 0 -21 14 -14 39 7 26 16 20 20 -14z m458 -2 c63 -22 116 -58 170 -114 l50
-53 -51 45 c-78 68 -165 111 -238 116 -56 5 -65 3 -94 -22 -17 -14 -40 -40
-49 -56 l-17 -29 -131 0 c-225 0 -549 -27 -672 -56 -22 -5 -25 -4 -17 6 26 27
373 61 642 63 l163 1 35 49 c55 76 102 88 209 50z m-675 7 c0 -5 -4 -10 -10
-10 -5 0 -10 5 -10 10 0 6 5 10 10 10 6 0 10 -4 10 -10z m47 4 c-3 -3 -12 -4
-19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z m-329 -29 c1 -14 -3 -25 -9 -25 -5 0
-8 4 -5 9 4 5 -2 7 -12 4 -12 -3 -19 1 -19 10 0 9 6 13 14 10 7 -3 13 0 13 6
0 22 16 10 18 -14z m119 5 c-1 -11 -5 -20 -9 -20 -4 0 -8 9 -8 20 0 11 4 20 9
20 6 0 9 -9 8 -20z m133 16 c0 -3 -4 -8 -10 -11 -5 -3 -10 -1 -10 4 0 6 5 11
10 11 6 0 10 -2 10 -4z m210 -17 c0 -5 -4 -9 -10 -9 -5 0 -10 7 -10 16 0 8 5
12 10 9 6 -3 10 -10 10 -16z m2247 5 c-3 -3 -12 -4 -19 -1 -8 3 -5 6 6 6 11 1
17 -2 13 -5z m-2407 -14 c0 -5 -4 -10 -10 -10 -5 0 -10 5 -10 10 0 6 5 10 10
10 6 0 10 -4 10 -10z m569 -33 c6 -8 8 -17 5 -20 -9 -8 -44 11 -44 23 0 15 26
12 39 -3z m-267 -4 c-40 -2 -103 -2 -140 0 -37 2 -4 3 73 3 77 0 107 -2 67 -3z
m-253 -7 c-2 -2 -76 -6 -164 -8 -88 -3 -131 -2 -95 2 72 7 266 12 259 6z
m-371 -23 c-16 -2 -40 -2 -55 0 -16 2 -3 4 27 4 30 0 43 -2 28 -4z m1006 -24
c125 -79 246 -246 246 -339 0 -47 -18 -58 -85 -53 l-60 5 -2 53 c-1 66 -41
153 -90 196 -58 50 -115 71 -225 79 -55 4 -101 10 -104 12 -2 3 31 12 74 22
42 9 95 25 117 35 56 27 74 25 129 -10z m215 -8 c88 -45 161 -59 336 -66 88
-4 175 -11 192 -17 47 -14 97 -78 128 -164 49 -134 43 -204 -20 -220 -14 -3
-23 -10 -20 -14 6 -10 -227 -20 -238 -10 -4 4 32 10 80 14 116 9 177 37 181
84 4 36 -18 120 -50 195 -31 71 -49 77 -262 87 -188 9 -231 18 -311 64 -39 23
-96 76 -81 76 3 0 33 -13 65 -29z m-582 -68 c-35 -47 -36 -48 -107 -57 -71 -8
-72 -8 -103 22 -42 39 -69 52 -107 52 -49 0 -103 -34 -148 -93 -49 -62 -55
-81 -13 -40 59 59 151 68 236 23 42 -22 61 -27 70 -20 10 9 18 -2 35 -47 26
-67 35 -136 26 -188 -8 -42 -60 -105 -87 -105 -16 0 -15 6 13 45 43 60 51 151
20 212 -42 82 -126 131 -206 119 -92 -14 -140 -71 -140 -166 1 -57 36 -146 54
-135 5 3 12 0 16 -6 5 -8 3 -9 -6 -4 -8 5 -11 3 -9 -4 3 -7 8 -11 11 -9 4 2
23 -12 42 -31 31 -30 44 -35 97 -39 38 -3 56 -8 48 -13 -18 -11 -85 -1 -124
18 -40 20 -103 80 -122 118 -9 17 -19 57 -23 90 l-7 60 -2 -75 c-1 -82 -14
-139 -33 -153 -9 -6 -5 -7 11 -3 18 4 21 2 12 -7 -6 -6 -46 -13 -89 -17 -84
-6 -80 -1 -69 -78 4 -29 2 -25 -10 16 -9 28 -22 52 -29 52 -8 0 -11 6 -8 15 7
18 6 18 -37 3 l-34 -12 30 -6 c26 -6 23 -7 -25 -14 -173 -22 -190 -27 -190
-49 0 -21 3 -22 107 -19 59 2 106 1 103 -1 -7 -7 -300 -19 -300 -13 0 3 25 24
55 46 42 31 57 49 65 81 15 54 -1 100 -47 138 l-35 29 28 52 c16 29 44 70 64
92 32 36 45 42 143 67 l107 28 64 -58 c35 -33 68 -59 73 -59 4 1 -23 29 -61
64 l-69 63 64 12 c61 11 282 37 379 44 25 2 103 4 173 5 l129 2 -35 -47z
m-739 1 c-3 -3 -28 -11 -54 -18 -27 -7 -60 -16 -74 -20 -23 -6 -24 -6 -5 5 27
17 146 47 133 33z m881 -37 c-44 -29 -97 -129 -108 -204 -7 -50 -9 -53 -9 -18
-1 22 7 65 18 95 21 61 20 72 -2 38 -50 -77 -59 -168 -25 -237 8 -17 12 -31 7
-31 -16 0 -40 70 -40 119 0 89 53 184 129 233 53 33 79 38 30 5z m1171 -15
c-32 -10 -50 -36 -50 -71 l-1 -36 -24 47 c-14 26 -30 50 -37 54 -9 6 -6 10 10
14 28 6 123 -1 102 -8z m-2555 -13 c-2 -12 -18 -80 -34 -153 -17 -72 -36 -176
-42 -231 -7 -55 -15 -104 -19 -108 -13 -14 -230 45 -230 63 0 12 -2 12 -9 2
-19 -31 -91 16 -91 61 0 20 73 102 132 149 l38 29 -16 -36 c-8 -21 -13 -39
-11 -42 3 -2 9 10 15 26 19 54 69 116 139 173 54 44 114 84 130 88 1 0 0 -10
-2 -21z m2898 14 c-7 -2 -21 -2 -30 0 -10 3 -4 5 12 5 17 0 24 -2 18 -5z
m-894 -47 c146 -30 190 -64 199 -157 4 -46 2 -53 -29 -85 -38 -40 -41 -40
-145 -15 -44 10 -95 22 -115 25 l-35 6 10 50 c8 42 7 61 -11 118 -11 37 -24
75 -28 84 -7 17 -4 17 31 4 22 -7 77 -21 123 -30z m-1909 19 c0 -2 -20 -53
-44 -113 -96 -239 -139 -504 -118 -728 15 -150 34 -225 73 -279 19 -26 51
-103 80 -191 27 -81 83 -217 125 -302 67 -138 83 -163 145 -225 38 -38 68 -71
67 -72 -2 -1 -31 10 -65 26 -79 35 -110 78 -199 269 -126 272 -209 524 -233
703 -22 163 -10 336 45 622 47 249 71 313 109 299 8 -4 15 -7 15 -9z m2275
-15 c24 -23 85 -186 85 -229 0 -39 -72 -71 -159 -71 l-44 0 47 38 c25 20 46
45 46 55 0 9 -2 17 -4 17 -2 0 -11 3 -20 6 -10 4 -22 -8 -40 -43 -13 -26 -34
-54 -46 -61 l-21 -13 21 29 c32 43 36 100 12 154 -25 56 -75 96 -161 125 l-66
22 162 -2 c156 -3 164 -4 188 -27z m549 14 c9 -8 16 -18 16 -21 0 -3 -78 -2
-173 2 -140 6 -175 4 -184 -7 -8 -10 1 -43 38 -137 28 -68 48 -125 46 -128 -2
-2 -22 -1 -44 3 -39 6 -41 7 -53 62 -7 30 -21 80 -31 110 -23 68 -24 90 -2
114 14 16 34 18 194 18 148 0 180 -3 193 -16z m-1384 -16 c59 -31 101 -106 99
-182 l-2 -51 -7 60 c-10 91 -49 150 -113 174 -41 16 -68 14 -112 -9 -49 -25
-54 -25 -24 -1 49 38 96 40 159 9z m-402 -25 c-4 -22 -22 -20 -26 1 -2 10 3
16 13 16 10 0 15 -7 13 -17z m-318 -6 c0 -2 -10 -12 -22 -23 l-23 -19 19 23
c18 21 26 27 26 19z m525 -22 c-1 -14 -5 -28 -8 -31 -3 -4 -4 7 -2 22 4 35 4
34 9 34 2 0 3 -11 1 -25z m-451 -15 c-39 -17 -53 -37 -68 -95 -3 -11 -3 -3 -1
19 4 41 27 73 60 87 40 16 49 7 9 -11z m1804 13 c-15 -2 -42 -2 -60 0 -18 2
-6 4 27 4 33 0 48 -2 33 -4z m-1726 -15 c22 -19 48 -60 48 -78 -1 -8 -7 -1
-14 16 -8 17 -26 40 -41 52 -15 12 -23 22 -18 22 5 0 16 -6 25 -12z m1920 5
l-73 -4 20 -33 c12 -18 18 -36 15 -39 -3 -3 4 -10 15 -16 25 -14 85 -100 76
-109 -4 -4 -19 8 -34 27 -14 18 -45 56 -68 84 -41 48 -51 75 -36 90 3 4 40 6
82 5 l76 -2 -73 -3z m-1420 -40 c-12 -2 -20 -9 -16 -14 3 -5 10 -7 15 -4 5 4
9 2 9 -2 0 -16 -24 -33 -44 -33 -21 1 -21 1 -2 15 29 22 13 29 -23 10 -19 -9
-31 -23 -31 -36 0 -11 -4 -18 -10 -14 -27 17 54 84 100 83 23 -1 24 -1 2 -5z
m1519 -28 c10 -16 20 -43 24 -60 5 -29 5 -29 -5 -5 -6 14 -28 42 -48 63 -35
37 -36 39 -13 35 15 -2 32 -15 42 -33z m-2914 3 c-3 -8 -6 -5 -6 6 -1 11 2 17
5 13 3 -3 4 -12 1 -19z m2671 15 c-21 -2 -55 -2 -75 0 -21 2 -4 4 37 4 41 0
58 -2 38 -4z m-1811 -9 c-3 -3 -12 -4 -19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z
m-45 -17 c-6 -6 -12 -28 -15 -47 l-4 -35 -1 36 c-1 19 3 40 10 47 16 16 23 15
10 -1z m98 -47 c0 -19 -36 -70 -50 -70 -5 0 2 11 15 25 29 28 31 51 9 85 l-16
25 21 -24 c12 -13 21 -31 21 -41z m-923 18 c-3 -8 -6 -5 -6 6 -1 11 2 17 5 13
3 -3 4 -12 1 -19z m700 -10 c-3 -7 -5 -2 -5 12 0 14 2 19 5 13 2 -7 2 -19 0
-25z m833 2 c0 -5 -4 -10 -10 -10 -5 0 -10 5 -10 10 0 6 5 10 10 10 6 0 10 -4
10 -10z m1167 3 c-20 -2 -52 -2 -70 0 -17 2 0 4 38 4 39 0 53 -2 32 -4z m191
0 c-10 -2 -26 -2 -35 0 -10 3 -2 5 17 5 19 0 27 -2 18 -5z m-2901 -55 c-3 -7
-5 -2 -5 12 0 14 2 19 5 13 2 -7 2 -19 0 -25z m993 16 c0 -2 -7 -4 -15 -4 -8
0 -15 4 -15 10 0 5 7 7 15 4 8 -4 15 -8 15 -10z m269 -32 c1 -7 -3 -10 -9 -7
-5 3 -10 18 -9 33 0 24 1 25 9 7 5 -11 9 -26 9 -33z m-420 -4 c8 2 11 0 7 -6
-3 -6 9 -15 29 -22 26 -9 35 -17 34 -33 l0 -22 -9 23 c-12 28 -40 30 -33 2 3
-11 0 -20 -6 -20 -6 0 -11 11 -11 23 0 15 -9 28 -24 35 -14 6 -30 21 -37 34
l-12 23 24 -21 c13 -12 30 -19 38 -16z m388 10 c-3 -8 -6 -5 -6 6 -1 11 2 17
5 13 3 -3 4 -12 1 -19z m1531 15 c-10 -2 -28 -2 -40 0 -13 2 -5 4 17 4 22 1
32 -1 23 -4z m-908 -28 c125 -19 201 -46 266 -95 210 -159 256 -546 100 -845
-41 -80 -42 -82 -21 -65 34 26 -21 -45 -58 -76 -41 -35 -137 -78 -205 -93 -86
-18 -211 -14 -288 10 -60 19 -77 30 -135 88 -77 79 -193 248 -248 364 -41 84
-81 222 -81 276 0 36 -29 56 -66 47 -25 -7 -25 -7 -23 67 2 40 -1 78 -5 85
-16 27 73 131 144 167 40 20 221 66 305 78 71 10 227 6 315 -8z m1163 -57
c-42 -72 -127 -97 -201 -59 -23 12 -42 23 -42 25 0 2 20 -1 44 -6 34 -7 51 -6
73 6 33 17 67 48 89 81 15 24 15 24 35 4 20 -20 20 -21 2 -51z m-3026 15 c-3
-10 -5 -4 -5 12 0 17 2 24 5 18 2 -7 2 -21 0 -30z m2867 0 c34 -37 26 -40 -21
-9 -30 21 -49 26 -93 25 -51 -1 -53 -1 -25 -11 32 -11 58 -28 52 -34 -2 -2
-21 5 -42 16 -22 11 -46 20 -55 21 -10 0 -9 3 5 9 11 5 50 9 87 9 61 1 70 -2
92 -26z m-2197 -5 c-3 -8 -6 -5 -6 6 -1 11 2 17 5 13 3 -3 4 -12 1 -19z m1835
-3 c5 -24 3 -25 -46 -24 -47 1 -49 1 -20 10 17 5 37 16 44 24 16 20 17 19 22
-10z m83 -2 c11 -7 36 -13 57 -13 20 0 40 -5 44 -12 5 -8 2 -9 -10 -5 -10 4
-48 8 -84 8 -37 1 -59 3 -49 6 18 5 18 6 1 24 -17 19 -17 20 2 13 10 -4 28
-13 39 -21z m1354 -50 c15 -30 26 -74 29 -115 l5 -67 -44 -11 c-147 -37 -321
-113 -408 -178 -48 -36 -68 -90 -86 -237 -26 -216 -59 -336 -103 -378 -15 -14
-47 -33 -71 -42 -65 -23 -73 -17 -14 10 64 29 93 85 117 225 25 152 19 170
-60 170 -47 0 -55 3 -50 16 3 9 6 19 6 24 0 5 29 12 65 15 l65 7 0 36 0 35
-60 -6 -60 -7 0 30 c0 28 3 30 38 30 56 0 87 20 87 55 0 30 -1 30 -62 33 -58
3 -63 5 -63 26 0 21 6 24 59 30 74 8 91 21 102 77 18 97 3 144 -44 135 -12 -3
-48 -8 -79 -11 -54 -6 -58 -5 -58 14 0 12 4 21 9 21 47 0 576 82 602 94 50 21
53 20 78 -31z m-1151 -29 c101 -50 170 -104 224 -176 40 -53 66 -105 56 -113
-2 -1 -19 -5 -38 -8 -36 -5 -36 -5 -54 46 -24 69 -70 140 -109 170 -76 58 -89
60 -287 62 -178 2 -180 2 -55 -5 116 -6 107 -7 -80 -6 -115 1 -187 -1 -160 -4
l50 -6 -45 -5 c-41 -4 -47 -1 -77 31 l-32 35 37 6 c20 3 141 7 268 8 l231 1
71 -36z m-1657 12 c-6 -7 -30 -16 -54 -20 -23 -3 -150 -28 -282 -55 -132 -27
-280 -57 -330 -66 -49 -9 -109 -25 -132 -36 -31 -15 -58 -19 -109 -17 -60 3
-69 6 -87 30 -11 15 -18 30 -15 33 13 14 136 25 273 25 162 0 199 5 191 26 -3
7 -7 30 -10 51 -4 32 -3 30 12 -15 l17 -54 40 7 c22 3 112 22 200 42 88 20
189 42 225 48 36 7 67 13 69 14 2 0 -2 -5 -8 -13z m1876 -1 c0 -8 -2 -13 -5
-10 -2 2 -11 -2 -19 -10 -8 -8 -22 -15 -31 -15 -13 1 -9 7 13 25 35 29 42 30
42 10z m-2640 -31 c-3 -3 -12 -4 -19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z m-74
-11 c-7 -2 -19 -2 -25 0 -7 3 -2 5 12 5 14 0 19 -2 13 -5z m746 -43 c-25 -29
-51 -50 -63 -51 -21 0 -21 -1 -1 -9 11 -5 17 -9 12 -9 -4 -1 -77 -15 -162 -31
-84 -17 -157 -29 -162 -28 -18 5 -90 -26 -124 -53 l-37 -28 -6 25 c-8 30 4 54
43 87 37 31 89 48 246 82 106 23 285 62 293 64 2 1 -16 -21 -39 -49z m-812 34
c-3 -3 -12 -4 -19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z m2569 -13 c46 -21 100
-82 138 -158 33 -67 33 -91 0 -103 -32 -12 -57 -12 -26 0 12 5 22 15 22 21 0
23 -63 139 -96 178 -46 54 -83 64 -207 57 -87 -4 -93 -4 -42 4 33 6 64 12 70
14 26 11 104 4 141 -13z m-450 -24 c38 3 67 3 64 1 -3 -3 -37 -8 -76 -12 -62
-6 -72 -5 -78 10 -5 13 -4 14 7 6 9 -8 38 -9 83 -5z m157 6 c-13 -2 -35 -2
-50 0 -16 2 -5 4 22 4 28 0 40 -2 28 -4z m251 -29 c8 -21 8 -24 -3 -24 -5 0
-11 9 -14 20 -6 24 8 27 17 4z m495 -73 c1 -74 -5 -61 -11 24 -3 40 -2 61 3
50 4 -11 8 -44 8 -74z m-607 64 c4 -5 8 -14 8 -20 0 -5 -5 -3 -10 5 -8 12 -10
12 -10 -5 0 -17 -2 -17 -10 -5 -20 32 0 55 22 25z m768 -21 c0 -35 -17 -64
-38 -64 -16 1 -16 1 1 11 10 6 17 22 17 40 0 28 -2 30 -27 25 -79 -14 -103
-16 -103 -8 0 10 128 31 143 24 4 -2 7 -14 7 -28z m-3550 15 c11 -8 8 -9 -15
-5 -37 7 -76 -11 -92 -44 -10 -19 -13 -21 -13 -7 0 46 80 84 120 56z m2553 4
c3 -5 8 -22 11 -39 6 -24 4 -31 -9 -31 -13 0 -16 7 -11 27 2 15 0 32 -7 39 -8
8 -8 11 0 11 7 0 14 -3 16 -7z m191 -9 c8 -22 8 -24 -8 -24 -9 0 -14 9 -13 20
2 24 13 26 21 4z m-2540 -11 c4 -5 13 -8 19 -8 5 0 12 -6 15 -14 3 -9 0 -11
-9 -6 -8 5 -11 4 -6 -1 5 -5 12 -9 16 -9 5 0 28 -21 52 -47 24 -26 55 -50 69
-54 23 -6 22 -5 -8 21 -40 33 -36 43 9 20 52 -27 135 -16 206 29 38 24 51 36
38 37 -12 0 -4 6 19 15 22 8 41 12 44 10 2 -3 -14 -24 -37 -48 -22 -24 -45
-57 -51 -72 l-10 -28 -91 4 c-65 3 -84 1 -68 -5 13 -6 32 -9 42 -8 9 1 17 -3
17 -8 0 -14 -26 -14 -49 1 -13 8 -29 8 -60 1 -29 -8 -39 -8 -34 0 4 7 0 8 -12
4 -9 -4 -23 -3 -30 3 -8 7 -12 5 -12 -5 0 -8 4 -15 9 -15 4 0 8 -5 8 -11 0 -5
-4 -7 -10 -4 -5 3 -10 2 -10 -2 0 -5 12 -15 26 -24 22 -14 24 -17 10 -22 -12
-5 -15 -3 -10 5 5 8 1 9 -12 4 -10 -4 -15 -4 -11 0 4 4 2 13 -5 21 -6 7 -8 16
-5 20 4 3 -1 12 -11 20 -16 12 -15 13 3 6 18 -5 17 -3 -5 23 -15 17 -17 23 -6
14 11 -8 17 -10 15 -5 -18 40 -33 65 -41 65 -12 0 -10 -14 4 -28 9 -9 9 -12 0
-12 -7 0 -9 -7 -5 -17 6 -15 5 -16 -9 -3 -9 8 -12 16 -8 18 5 2 6 10 3 18 -3
8 0 21 7 29 9 11 8 19 -4 37 -9 12 -16 17 -16 11 0 -7 5 -15 10 -18 14 -9 12
-22 -3 -22 -7 0 -13 14 -13 34 0 33 5 40 20 26z m496 3 c0 -3 -4 -8 -10 -11
-5 -3 -10 -1 -10 4 0 6 5 11 10 11 6 0 10 -2 10 -4z m540 -16 c0 -5 -2 -10 -4
-10 -3 0 -8 5 -11 10 -3 6 -1 10 4 10 6 0 11 -4 11 -10z m1587 -22 c6 -7 13
-25 17 -40 10 -41 -15 -58 -84 -58 -65 0 -80 12 -80 64 0 22 4 26 28 25 23 -2
24 -2 5 -6 -23 -4 -29 -25 -17 -57 4 -12 20 -16 54 -16 27 0 55 3 64 6 21 8
21 58 0 78 -8 9 -11 16 -6 16 5 0 14 -6 19 -12z m-2827 -17 c0 -40 -13 -80
-27 -86 -23 -8 -43 14 -44 49 -1 18 -3 23 -6 13 -8 -33 7 -66 37 -82 32 -16
40 -35 16 -35 -25 0 -66 43 -72 76 -4 23 0 37 18 57 28 32 78 38 78 8z m500 9
c0 -5 -5 -10 -11 -10 -5 0 -7 5 -4 10 3 6 8 10 11 10 2 0 4 -4 4 -10z m2283 3
c-7 -2 -21 -2 -30 0 -10 3 -4 5 12 5 17 0 24 -2 18 -5z m-130 -20 c-7 -2 -19
-2 -25 0 -7 3 -2 5 12 5 14 0 19 -2 13 -5z m312 -13 c-3 -5 -13 -6 -21 -3 -12
4 -13 8 -3 14 15 9 32 2 24 -11z m332 -17 c-3 -10 -5 -4 -5 12 0 17 2 24 5 18
2 -7 2 -21 0 -30z m-714 20 c-7 -2 -19 -2 -25 0 -7 3 -2 5 12 5 14 0 19 -2 13
-5z m172 -10 c-2 -10 -4 -22 -5 -28 -1 -5 -5 -1 -9 10 -9 21 -5 35 9 35 4 0 7
-8 5 -17z m710 7 c-16 -4 -39 -8 -50 -8 -16 0 -15 2 5 8 14 4 36 8 50 8 22 0
22 -1 -5 -8z m-2368 -8 c15 -10 43 -75 43 -99 -1 -10 -9 5 -18 32 l-17 50 -62
3 c-55 3 -61 1 -58 -15 24 -116 45 -256 40 -261 -3 -3 -14 -1 -23 4 -30 20
-68 264 -40 264 6 0 9 2 6 5 -7 7 -228 -24 -249 -36 -29 -15 -39 -72 -29 -160
11 -99 22 -119 60 -119 17 0 112 9 211 20 100 12 183 19 185 17 4 -4 -345 -53
-452 -63 -41 -4 -64 -3 -68 5 -5 7 -1 9 10 4 14 -5 15 -3 4 17 -9 16 -11 51
-8 109 6 93 29 156 67 178 24 15 121 31 256 42 55 5 107 9 115 9 8 1 20 -2 27
-6z m1420 2 c-3 -3 -12 -4 -19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z m463 -24
c0 -5 -9 -10 -20 -10 -11 0 -20 5 -20 10 0 6 9 10 20 10 11 0 20 -4 20 -10z
m-412 -33 c4 -29 -12 -37 -22 -11 -10 26 -7 46 7 42 6 -3 13 -17 15 -31z m895
16 c-7 -2 -19 -2 -25 0 -7 3 -2 5 12 5 14 0 19 -2 13 -5z m-2441 -35 c-9 -9
-12 -7 -12 12 0 19 3 21 12 12 9 -9 9 -15 0 -24z m1445 10 c-3 -8 -6 -5 -6 6
-1 11 2 17 5 13 3 -3 4 -12 1 -19z m530 6 c-3 -3 -12 -4 -19 -1 -8 3 -5 6 6 6
11 1 17 -2 13 -5z m-54 -11 c-7 -2 -21 -2 -30 0 -10 3 -4 5 12 5 17 0 24 -2
18 -5z m-118 -19 c-38 -7 -81 -13 -95 -12 -37 0 89 25 130 26 22 0 9 -5 -35
-14z m1303 -9 c17 -36 15 -70 -8 -151 -29 -106 -82 -215 -149 -307 -56 -78
-151 -180 -151 -163 0 4 -7 1 -15 -7 -21 -22 -168 -69 -191 -61 -13 4 -15 3
-6 -4 9 -6 -16 -17 -85 -37 -54 -16 -107 -29 -118 -31 -11 -1 -20 -3 -20 -4 0
-1 -15 -4 -32 -6 -24 -4 -33 -1 -33 9 0 25 25 43 80 60 31 9 65 25 76 34 11
10 26 19 34 21 44 9 349 172 383 205 22 20 38 39 36 42 -3 2 -84 -22 -179 -55
-96 -33 -181 -60 -189 -60 -10 0 -12 8 -6 33 4 17 17 99 29 181 19 124 26 152
44 166 50 41 385 159 453 160 29 0 38 -5 47 -25z m-875 -66 c-15 -10 -50 -23
-78 -28 -313 -60 -428 -83 -440 -87 -11 -5 -15 1 -15 25 0 26 -4 31 -25 31
-51 0 -133 -40 -171 -83 -20 -23 -33 -34 -30 -24 3 10 6 30 6 43 0 42 30 60
131 78 262 48 566 109 579 117 10 5 23 -1 43 -23 l28 -31 -28 -18z m-2433 60
c0 -5 -4 -7 -10 -4 -5 3 -10 -2 -10 -12 0 -15 -2 -16 -10 -3 -15 23 -12 30 10
30 11 0 20 -5 20 -11z m17 -14 c-4 -8 -11 -15 -17 -15 -6 0 -6 7 2 20 14 22
24 19 15 -5z m1640 -7 c-3 -7 -5 -2 -5 12 0 14 2 19 5 13 2 -7 2 -19 0 -25z
m-2170 0 c-3 -8 -6 -5 -6 6 -1 11 2 17 5 13 3 -3 4 -12 1 -19z m133 12 c13 -8
13 -10 -2 -10 -9 0 -20 5 -23 10 -8 13 5 13 25 0z m150 -57 c-10 -16 -11 -15
-6 7 3 14 6 34 7 45 1 13 3 11 6 -7 2 -15 -1 -35 -7 -45z m2093 60 c-7 -2 -19
-2 -25 0 -7 3 -2 5 12 5 14 0 19 -2 13 -5z m177 -14 c0 -6 -4 -7 -10 -4 -5 3
-10 11 -10 16 0 6 5 7 10 4 6 -3 10 -11 10 -16z m-232 4 c-10 -2 -26 -2 -35 0
-10 3 -2 5 17 5 19 0 27 -2 18 -5z m389 1 c-3 -3 -12 -4 -19 -1 -8 3 -5 6 6 6
11 1 17 -2 13 -5z m-2653 -16 c-2 -3 2 -8 8 -10 7 -3 1 -7 -14 -10 -15 -3 -25
-1 -22 3 3 5 0 9 -5 9 -6 0 -11 3 -11 8 0 4 11 7 24 7 13 0 22 -3 20 -7z m696
-4 c0 -2 -9 -4 -21 -4 -11 0 -18 4 -14 10 5 8 35 3 35 -6z m43 9 c-7 -2 -19
-2 -25 0 -7 3 -2 5 12 5 14 0 19 -2 13 -5z m44 -15 c-3 -8 -6 -5 -6 6 -1 11 2
17 5 13 3 -3 4 -12 1 -19z m1411 15 c-10 -2 -28 -2 -40 0 -13 2 -5 4 17 4 22
1 32 -1 23 -4z m409 1 c-3 -3 -12 -4 -19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z
m506 -8 c6 -15 -12 -26 -44 -26 -12 0 -19 7 -19 20 0 15 7 20 29 20 16 0 31
-6 34 -14z m45 2 c-6 -18 -25 -20 -31 -3 -5 10 0 15 14 15 12 0 19 -5 17 -12z
m-3095 -15 c-7 -2 -19 -2 -25 0 -7 3 -2 5 12 5 14 0 19 -2 13 -5z m2064 -115
c-2 -24 -4 -7 -4 37 0 44 2 63 4 43 2 -21 2 -57 0 -80z m-1674 95 c-7 -2 -21
-2 -30 0 -10 3 -4 5 12 5 17 0 24 -2 18 -5z m344 -15 c-3 -8 -6 -5 -6 6 -1 11
2 17 5 13 3 -3 4 -12 1 -19z m1610 16 c-3 -3 -12 -4 -19 -1 -8 3 -5 6 6 6 11
1 17 -2 13 -5z m-2943 -20 c3 -8 2 -12 -4 -9 -6 3 -10 10 -10 16 0 14 7 11 14
-7z m1263 -6 c-3 -8 -6 -5 -6 6 -1 11 2 17 5 13 3 -3 4 -12 1 -19z m-284 5
c-7 -2 -19 -2 -25 0 -7 3 -2 5 12 5 14 0 19 -2 13 -5z m1844 1 c-3 -3 -12 -4
-19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z m-2697 -29 c-65 -17 -107 -19 -115 -6
-3 6 8 8 27 5 18 -3 47 0 63 5 17 5 41 9 55 9 14 0 0 -6 -30 -13z m640 -15 c0
-16 -4 -30 -10 -30 -5 0 -10 14 -10 30 0 17 5 30 10 30 6 0 10 -13 10 -30z
m577 8 c-3 -8 -6 -5 -6 6 -1 11 2 17 5 13 3 -3 4 -12 1 -19z m1370 16 c-3 -3
-12 -4 -19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z m-1670 -38 c-1 -29 -4 -33 -24
-32 -18 1 -23 7 -23 28 0 24 8 31 42 37 3 0 6 -14 5 -33z m1839 -52 c-3 -8
-11 -14 -18 -13 -10 0 -10 2 0 6 6 2 13 21 13 41 2 32 3 33 6 9 3 -16 2 -35
-1 -43z m-1529 24 c-3 -7 -5 -2 -5 12 0 14 2 19 5 13 2 -7 2 -19 0 -25z m2070
-20 c-3 -8 -6 -5 -6 6 -1 11 2 17 5 13 3 -3 4 -12 1 -19z m-2682 3 c3 -5 1
-12 -5 -16 -5 -3 -10 1 -10 9 0 18 6 21 15 7z m2288 2 c-7 -2 -19 -2 -25 0 -7
3 -2 5 12 5 14 0 19 -2 13 -5z m-1643 -72 c-1 -13 -29 45 -29 59 0 8 6 0 14
-19 8 -18 15 -36 15 -40z m-593 37 c-3 -8 -6 -5 -6 6 -1 11 2 17 5 13 3 -3 4
-12 1 -19z m2467 0 c9 -12 16 -30 16 -40 0 -15 -6 -14 -50 9 -28 14 -53 23
-56 20 -3 -3 11 -13 31 -22 20 -10 42 -30 51 -46 l14 -28 -35 1 c-21 1 -35 6
-35 14 0 34 -30 44 -128 44 -146 0 -234 -10 -222 -25 8 -9 4 -11 -16 -7 -19 3
-22 7 -12 13 7 5 9 9 3 9 -5 0 14 14 44 31 60 34 125 45 288 48 84 1 93 -1
107 -21z m160 -248 c-36 -164 -112 -359 -134 -345 -6 4 1 21 16 40 29 38 84
200 108 317 9 42 17 117 18 165 l2 88 4 -95 c2 -63 -3 -120 -14 -170z m-631
240 c-25 -10 -29 -20 -13 -36 6 -6 -11 -24 -53 -51 -69 -46 -82 -40 -50 25 14
28 29 41 63 54 46 17 94 24 53 8z m-1490 -15 l32 5 -29 -10 c-32 -10 -46 -6
-45 13 0 9 2 9 5 0 3 -8 18 -10 37 -8z m-565 -92 c14 -12 14 -13 -5 -13 -28 0
-32 8 -25 50 l7 35 3 -30 c2 -16 11 -36 20 -42z m212 47 c0 -5 -4 -10 -10 -10
-5 0 -10 5 -10 10 0 6 5 10 10 10 6 0 10 -4 10 -10z m110 -2 c0 -5 -9 -8 -19
-8 -11 0 -22 3 -24 8 -3 4 6 7 19 7 13 0 24 -3 24 -7z m2608 -10 c19 -19 14
-73 -9 -102 -16 -20 -28 -26 -57 -25 l-37 2 40 6 c31 5 43 12 54 35 19 41 5
79 -34 87 l-30 7 31 1 c16 0 35 -4 42 -11z m-2262 -20 c19 -23 19 -23 -1 -6
-13 10 -43 18 -80 21 l-60 3 61 2 c52 2 64 -1 80 -20z m1748 4 c2 -4 0 -14 -5
-22 -8 -13 -10 -13 -18 0 -10 15 -6 30 9 30 5 0 11 -4 14 -8z m453 2 c-3 -3
-12 -4 -19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z m-2322 -16 c14 -6 25 -14 25
-17 0 -4 13 -21 28 -38 l29 -31 -96 -6 c-165 -11 -623 -26 -632 -20 -16 10 -9
53 10 64 11 5 43 10 71 10 28 0 133 9 233 20 173 18 234 25 284 28 12 1 34 -3
48 -10z m1545 -33 c18 0 24 5 22 17 -1 9 2 20 9 23 7 5 10 -1 7 -15 -7 -52
-71 -51 -75 1 -2 24 -2 24 5 -1 6 -18 15 -25 32 -25z m-1952 28 c-10 -2 -26
-2 -35 0 -10 3 -2 5 17 5 19 0 27 -2 18 -5z m2374 -20 c26 -30 30 -60 14 -120
-21 -85 -76 -223 -96 -243 -11 -11 -63 -24 -156 -39 -76 -12 -149 -25 -161
-28 -20 -4 -21 -3 -12 34 5 21 8 98 7 171 -1 74 2 136 8 142 5 5 80 18 165 28
86 11 162 22 168 26 6 4 11 16 11 27 0 24 31 25 52 2z m298 -19 c0 -14 -4 -23
-9 -20 -5 3 -7 15 -4 26 7 28 13 25 13 -6z m80 11 c0 -8 -5 -17 -12 -21 -7 -4
-8 -3 -4 4 4 7 1 12 -8 12 -23 0 -19 15 4 17 11 1 20 -4 20 -12z m-477 -2 c-7
-2 -19 -2 -25 0 -7 3 -2 5 12 5 14 0 19 -2 13 -5z m-1713 -28 c0 -8 -4 -15
-10 -15 -5 0 -7 7 -4 15 4 8 8 15 10 15 2 0 4 -7 4 -15z m1275 5 c3 -5 -1 -10
-9 -10 -9 0 -16 5 -16 10 0 6 4 10 9 10 6 0 13 -4 16 -10z m801 -173 c-25
-122 -65 -259 -85 -295 -17 -28 -13 -7 23 111 31 102 52 191 72 302 4 22 9 33
11 24 2 -9 -7 -73 -21 -142z m-2170 97 c46 -22 98 -83 158 -185 57 -96 124
-193 159 -229 37 -38 60 -78 51 -91 -4 -8 -3 -9 4 -5 7 4 18 -7 28 -26 9 -18
44 -73 77 -121 87 -128 157 -180 265 -197 l57 -9 -66 2 c-112 4 -135 25 -338
294 -139 185 -178 230 -190 223 -12 -7 -30 13 -83 95 -76 116 -111 149 -171
166 -74 20 -433 -9 -532 -44 -21 -7 -47 -25 -57 -38 -16 -21 -17 -29 -7 -59
12 -36 116 -188 187 -274 23 -27 38 -54 35 -60 -3 -6 -2 -8 2 -3 5 4 60 -44
124 -106 253 -246 556 -429 823 -496 62 -15 87 -28 156 -82 44 -35 77 -66 71
-67 -5 -2 -55 6 -111 18 -326 70 -745 297 -979 530 -72 72 -125 166 -107 188
8 9 7 11 -3 7 -26 -10 -180 190 -242 313 -45 92 -59 178 -37 232 l12 29 122 4
c390 10 558 7 592 -9z m1224 -33 c-28 -56 -35 -52 -8 4 12 24 23 43 26 41 2
-2 -6 -22 -18 -45z m1051 29 c24 0 29 -4 29 -23 0 -23 -2 -23 -45 -13 -34 8
-45 15 -45 29 0 13 5 17 16 13 9 -3 29 -6 45 -6z m-851 -31 c-14 -5 -33 -20
-42 -32 -10 -12 -18 -17 -18 -10 0 16 49 53 69 52 9 0 6 -4 -9 -10z m-2223
-61 c-3 -7 -5 -2 -5 12 0 14 2 19 5 13 2 -7 2 -19 0 -25z m25 -18 c0 -16 3
-32 8 -35 5 -3 7 -12 3 -20 -3 -8 0 -15 7 -15 6 0 8 -5 4 -11 -3 -6 -1 -15 6
-19 8 -5 9 -10 1 -14 -6 -4 -16 12 -25 41 -8 26 -15 39 -16 28 l-1 -20 -9 20
c-12 27 -12 43 0 25 7 -11 10 -5 10 24 0 22 3 36 7 33 3 -4 6 -20 5 -37z
m2224 -14 c17 5 18 5 2 -6 -20 -12 -58 2 -58 22 0 6 8 4 19 -6 10 -9 26 -14
37 -10z m-1647 11 c-2 -1 -15 -11 -29 -22 l-25 -20 19 23 c11 12 24 22 29 22
6 0 8 -1 6 -3z m63 -14 c8 -10 47 -73 86 -140 40 -67 84 -136 99 -155 15 -18
21 -28 12 -21 -11 9 -31 10 -68 4 -58 -9 -112 -1 -138 21 -25 19 -87 88 -97
107 -5 9 10 -5 32 -30 23 -26 57 -54 76 -63 37 -18 141 -22 151 -6 3 5 -5 25
-18 42 -14 18 -50 78 -82 133 -31 55 -64 106 -73 113 -9 6 -11 12 -5 12 5 0
16 -8 25 -17z m1391 -338 c8 -44 18 -109 22 -145 6 -62 5 -67 -20 -93 -41 -40
-117 -73 -250 -107 -65 -17 -121 -33 -123 -35 -3 -2 9 -26 26 -52 17 -26 47
-84 67 -128 25 -56 53 -97 92 -136 l55 -56 -29 -6 c-15 -3 -28 -5 -28 -4 0 1
-11 22 -24 47 -13 25 -50 97 -82 160 -32 63 -66 127 -76 142 -11 18 -14 31 -7
38 5 5 54 21 109 35 208 52 221 71 194 287 -9 75 -8 91 5 110 19 26 24 214 6
203 -6 -4 0 15 12 40 l23 47 6 -133 c4 -74 14 -170 22 -214z m-1686 273 c-3
-8 -6 -5 -6 6 -1 11 2 17 5 13 3 -3 4 -12 1 -19z m-359 -18 c-7 -10 -14 -17
-17 -15 -4 4 18 35 25 35 2 0 -1 -9 -8 -20z m460 -149 c19 -17 49 -33 65 -37
15 -3 26 -8 23 -11 -2 -3 -20 0 -40 7 -41 13 -109 84 -131 136 -26 63 -17 60
16 -4 17 -34 47 -75 67 -91z m-457 112 c-12 -20 -14 -14 -5 12 4 9 9 14 11 11
3 -2 0 -13 -6 -23z m579 7 c0 -4 7 -11 16 -14 12 -4 15 -2 10 9 -8 21 1 19 13
-3 15 -28 -22 -25 -50 4 -18 19 -19 23 -6 18 9 -3 17 -10 17 -14z m585 0 c10
-11 16 -20 13 -20 -3 0 -13 9 -23 20 -10 11 -16 20 -13 20 3 0 13 -9 23 -20z
m-1112 -7 c-4 -10 -2 -14 4 -10 12 7 39 -50 35 -72 -2 -7 1 -10 7 -6 7 4 8 0
5 -10 -4 -10 -2 -15 6 -13 7 2 15 -3 17 -10 8 -20 -21 -9 -34 13 -10 18 -11
18 -10 -7 1 -14 6 -24 11 -20 5 3 6 -3 3 -14 -6 -16 -5 -17 6 -4 20 25 35 21
59 -13 13 -17 24 -35 24 -39 1 -5 2 -13 3 -19 0 -5 5 -8 10 -5 10 6 111 -109
111 -126 0 -5 -9 -12 -21 -15 -11 -3 -18 -11 -15 -19 3 -7 0 -16 -7 -20 -7 -4
-9 -3 -4 1 4 5 -1 18 -12 29 -33 37 -55 77 -39 71 8 -3 22 -19 31 -35 12 -19
23 -27 33 -23 11 4 12 9 4 17 -6 6 -15 11 -21 11 -5 0 -23 20 -39 45 -16 25
-30 40 -30 35 0 -6 5 -16 11 -22 7 -7 6 -12 -5 -16 -10 -4 -13 -1 -9 9 3 10 0
12 -10 8 -8 -3 -18 -1 -22 5 -3 6 0 9 8 5 8 -3 17 2 21 11 7 19 -10 55 -25 55
-6 0 -7 5 -4 10 3 6 1 10 -5 10 -6 0 -9 4 -5 9 9 16 -13 23 -34 11 -17 -9 -22
-6 -34 17 -8 16 -12 34 -9 42 3 9 0 11 -8 6 -9 -5 -11 -4 -6 4 4 6 12 8 18 5
8 -5 9 -1 3 12 -4 10 -7 28 -7 39 1 18 -1 18 -19 -5 -17 -21 -19 -22 -10 -3
16 31 13 41 -4 19 -20 -27 -19 -11 1 19 19 29 26 32 17 8z m1897 -53 c-7 -52
-7 -53 -9 -13 -1 36 7 80 14 71 1 -2 -1 -28 -5 -58z m-80 45 c0 -2 -10 -10
-22 -16 -21 -11 -22 -11 -9 4 13 16 31 23 31 12z m-50 -30 c0 -6 -56 -35 -67
-35 -4 1 8 9 27 20 39 22 40 22 40 15z m-514 -43 c-5 -4 -66 26 -66 33 0 3 16
-3 35 -12 19 -9 33 -18 31 -21z m1107 -153 l-177 -191 -12 65 c-15 81 -25 100
-80 158 l-44 45 160 33 c88 18 195 43 237 56 43 12 82 23 86 24 4 1 -72 -85
-170 -190z m-1205 103 c48 -81 157 -186 221 -215 39 -17 59 -19 145 -14 126 7
194 27 242 72 20 19 38 35 39 35 1 0 20 -39 41 -86 42 -96 41 -107 -17 -136
-60 -30 -191 -59 -290 -65 l-95 -6 -37 44 c-142 168 -322 439 -293 439 2 0 22
-31 44 -68z m502 43 c-19 -7 -46 -13 -60 -13 -16 0 -10 4 20 12 60 18 84 18
40 1z m-345 -5 c13 -5 14 -9 5 -9 -8 0 -24 4 -35 9 -13 5 -14 9 -5 9 8 0 24
-4 35 -9z m492 -12 c-3 -8 -6 -5 -6 6 -1 11 2 17 5 13 3 -3 4 -12 1 -19z
m1610 -25 c-3 -10 -5 -4 -5 12 0 17 2 24 5 18 2 -7 2 -21 0 -30z m-2009 20
c-10 -2 -28 -2 -40 0 -13 2 -5 4 17 4 22 1 32 -1 23 -4z m145 0 c-13 -2 -35
-2 -50 0 -16 2 -5 4 22 4 28 0 40 -2 28 -4z m174 -86 c24 -61 25 -69 11 -83
-13 -14 -18 -6 -47 72 -24 67 -29 89 -19 95 15 10 21 1 55 -84z m1066 52 c26
-32 18 -62 -47 -194 -58 -117 -174 -298 -260 -405 -51 -63 -52 -66 -40 -96
l13 -31 -77 -49 c-42 -28 -93 -60 -113 -72 l-37 -22 10 42 c5 24 8 84 6 135
-3 82 -2 89 11 70 27 -42 65 -77 82 -77 27 0 188 176 265 290 87 129 135 216
164 297 21 59 22 64 6 88 -20 31 -37 31 -138 3 -82 -22 -97 -34 -152 -121 -17
-27 -17 -28 1 -18 10 6 28 18 41 27 12 9 22 12 22 6 0 -6 -35 -39 -77 -75
-142 -118 -226 -195 -246 -227 -19 -31 -19 -33 -2 -153 18 -124 13 -218 -15
-291 -10 -27 -61 -57 -149 -87 -73 -26 -79 -25 -90 19 -16 55 -15 58 30 71 71
21 79 37 79 150 0 89 -44 488 -71 649 -6 35 -9 66 -6 69 9 8 117 -97 133 -130
8 -15 24 -83 35 -150 11 -67 23 -125 27 -128 4 -4 58 39 121 94 89 80 125 120
163 182 58 95 74 110 126 119 22 3 50 15 63 26 32 27 96 21 122 -11z m516 -85
c-11 -117 -6 -187 18 -274 29 -107 82 -165 231 -254 34 -21 62 -40 62 -43 0
-6 -80 40 -150 88 -76 51 -114 94 -147 164 -24 52 -28 75 -31 177 -4 100 12
267 24 255 2 -2 -1 -53 -7 -113z m-1482 54 c-3 -8 -6 -5 -6 6 -1 11 2 17 5 13
3 -3 4 -12 1 -19z m-1741 4 c-3 -5 4 -23 15 -41 11 -18 18 -36 15 -39 -4 -3
-6 0 -6 7 0 7 -5 9 -12 5 -7 -5 -8 -3 -3 6 6 10 4 12 -8 7 -19 -7 -29 16 -14
33 10 10 8 12 -7 6 -16 -5 -17 -4 -6 9 13 15 35 21 26 7z m451 2 c-3 -3 -12
-4 -19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z m3228 -54 c3 -6 -1 -7 -9 -4 -18 7
-21 14 -7 14 6 0 13 -4 16 -10z m-2565 -40 c6 -11 8 -20 6 -20 -3 0 -10 9 -16
20 -6 11 -8 20 -6 20 3 0 10 -9 16 -20z m678 -90 c0 -8 -6 1 -13 20 -7 19 -13
42 -13 50 0 8 6 -1 13 -20 7 -19 13 -42 13 -50z m-1121 -6 c-3 -3 -12 -4 -19
-1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z m-82 -19 c-27 -7 -59 -13 -70 -13 -11 0 3
6 30 13 28 7 59 13 70 13 11 0 -2 -6 -30 -13z m-98 -21 c-3 -3 -12 -4 -19 -1
-8 3 -5 6 6 6 11 1 17 -2 13 -5z m754 -61 c13 -16 12 -17 -3 -4 -10 7 -18 15
-18 17 0 8 8 3 21 -13z m681 -30 c-17 -30 -60 -66 -72 -58 -7 4 1 16 22 31 18
13 36 31 41 40 5 9 11 13 14 11 2 -3 0 -14 -5 -24z m-30 -76 c-6 -6 -12 -28
-15 -47 l-4 -35 -1 36 c-1 19 3 40 10 47 16 16 23 15 10 -1z m-218 -24 c2 -10
10 -44 16 -77 7 -32 21 -83 31 -114 32 -91 21 -117 -26 -66 -24 26 -29 49 -39
202 -4 66 6 97 18 55z m-2870 -113 c23 -69 36 -127 35 -157 l-1 -48 -8 45 c-7
44 -54 223 -66 255 -4 8 -4 15 -1 15 3 0 22 -49 41 -110z m2681 -50 c25 -49
43 -90 40 -90 -3 0 -25 41 -50 90 -25 50 -43 90 -40 90 3 0 25 -40 50 -90z
m402 58 c-3 -7 -5 -2 -5 12 0 14 2 19 5 13 2 -7 2 -19 0 -25z m10 -50 c-3 -7
-5 -2 -5 12 0 14 2 19 5 13 2 -7 2 -19 0 -25z m10 -60 c-3 -7 -5 -2 -5 12 0
14 2 19 5 13 2 -7 2 -19 0 -25z m1798 -91 c6 -6 -26 9 -70 32 -44 23 -84 47
-90 53 -12 13 146 -71 160 -85z m-1788 31 c-3 -7 -5 -2 -5 12 0 14 2 19 5 13
2 -7 2 -19 0 -25z m694 15 c13 -16 12 -17 -3 -4 -10 7 -18 15 -18 17 0 8 8 3
21 -13z m408 -9 c15 -15 14 -16 -6 -9 -26 7 -181 -20 -231 -41 l-34 -14 22
-35 c12 -20 20 -38 17 -41 -3 -3 -17 15 -32 41 -27 44 -27 46 -9 60 11 8 21
15 24 15 3 0 41 12 85 25 86 27 138 26 164 -1z m-1455 -43 c14 -26 39 -60 56
-75 17 -14 26 -26 20 -26 -19 0 -57 45 -84 99 -15 28 -24 51 -21 51 2 0 16
-22 29 -49z m-292 -13 c-17 -17 -25 -3 -17 29 l7 28 11 -23 c7 -16 7 -26 -1
-34z m614 -3 c28 -13 54 -27 57 -32 5 -8 -36 9 -133 55 l-25 12 25 -6 c14 -4
48 -17 76 -29z m41 3 c-3 -8 -6 -5 -6 6 -1 11 2 17 5 13 3 -3 4 -12 1 -19z
m1038 -2 c-49 -12 -101 -26 -115 -30 -14 -5 -22 -5 -18 -1 11 11 167 53 198
54 14 0 -15 -10 -65 -23z m861 -44 c-5 -4 -66 26 -66 33 0 3 16 -3 35 -12 19
-9 33 -18 31 -21z m-1999 -52 c7 -8 13 -19 13 -24 0 -4 -9 2 -19 15 -15 18
-28 23 -57 22 l-39 -2 30 13 c31 15 44 10 72 -24z m-2582 -10 c-11 -5 -27 -9
-35 -9 -9 0 -8 4 5 9 11 5 27 9 35 9 9 0 8 -4 -5 -9z m2619 -100 c5 -24 4 -30
-3 -20 -5 8 -12 33 -15 55 -8 48 8 19 18 -35z m-31 7 c5 -16 7 -31 4 -33 -7
-8 -136 -29 -140 -23 -2 2 -7 18 -10 36 -6 31 -5 32 36 42 70 16 99 10 110
-22z m-2116 -19 c-3 -7 -5 -2 -5 12 0 14 2 19 5 13 2 -7 2 -19 0 -25z m10 -70
c-3 -7 -5 -2 -5 12 0 14 2 19 5 13 2 -7 2 -19 0 -25z m10 -60 c-3 -7 -5 -2 -5
12 0 14 2 19 5 13 2 -7 2 -19 0 -25z m10 -60 c-3 -7 -5 -2 -5 12 0 14 2 19 5
13 2 -7 2 -19 0 -25z m3438 -74 c17 -16 21 -20 8 -10 -27 23 -30 15 -7 -19 10
-15 21 -22 31 -18 11 4 14 2 9 -5 -13 -22 -36 -12 -57 23 -23 38 -45 49 -83
39 -31 -7 -34 6 -6 31 11 10 20 25 20 34 0 11 9 6 28 -15 15 -18 41 -45 57
-60z m92 39 c-3 -10 -5 -2 -5 17 0 19 2 27 5 18 2 -10 2 -26 0 -35z m-3520
-15 c-3 -7 -5 -2 -5 12 0 14 2 19 5 13 2 -7 2 -19 0 -25z m10 -55 c-3 -10 -5
-4 -5 12 0 17 2 24 5 18 2 -7 2 -21 0 -30z m3613 17 c0 -5 -2 -10 -4 -10 -3 0
-8 5 -11 10 -3 6 -1 10 4 10 6 0 11 -4 11 -10z m-104 -42 l29 -33 -32 29 c-31
28 -38 36 -30 36 2 0 16 -15 33 -32z m101 16 c-3 -3 -12 -4 -19 -1 -8 3 -5 6
6 6 11 1 17 -2 13 -5z m-3600 -46 c-3 -7 -5 -2 -5 12 0 14 2 19 5 13 2 -7 2
-19 0 -25z m3118 -91 c110 -82 107 -93 -7 -32 -59 31 -119 58 -133 59 -26 3
-75 57 -75 83 0 18 139 -53 215 -110z m-3108 41 c-3 -7 -5 -2 -5 12 0 14 2 19
5 13 2 -7 2 -19 0 -25z m3123 -14 c0 -7 -58 25 -65 36 -3 5 10 1 29 -11 20
-12 36 -23 36 -25z m-2019 19 c13 -16 12 -17 -3 -4 -10 7 -18 15 -18 17 0 8 8
3 21 -13z m-1094 -45 c-3 -8 -6 -5 -6 6 -1 11 2 17 5 13 3 -3 4 -12 1 -19z
m-32 -238 c10 -11 16 -20 13 -20 -3 0 -13 9 -23 20 -10 11 -16 20 -13 20 3 0
13 -9 23 -20z"/>
<path d="M2205 4269 c395 -19 544 -32 650 -53 29 -6 29 -6 5 4 -60 27 -492 62
-715 59 -88 -2 -81 -3 60 -10z"/>
<path d="M3019 4147 c5 -5 24 -7 42 -5 33 3 33 4 -8 8 -23 3 -39 2 -34 -3z"/>
<path d="M2700 4106 c0 -3 21 -19 48 -37 26 -17 77 -61 114 -97 37 -36 70 -63
73 -60 8 8 -107 112 -176 158 -32 23 -59 39 -59 36z"/>
<path d="M3960 3599 c0 -12 224 -18 308 -8 132 15 239 -21 289 -97 9 -14 40
-89 70 -167 30 -78 61 -152 69 -164 17 -26 42 -29 70 -9 18 14 18 15 1 22 -13
5 -15 9 -7 14 15 9 -41 187 -70 222 -16 20 -22 22 -48 12 -29 -11 -30 -11 -52
42 -23 57 -62 97 -120 123 -29 13 -76 16 -272 16 -131 0 -238 -3 -238 -6z"/>
<path d="M4041 3370 c15 -47 36 -126 46 -177 10 -50 21 -89 24 -87 4 2 5 -4 2
-15 -4 -15 0 -18 19 -15 12 2 90 13 173 24 93 12 155 25 164 34 12 13 11 24
-9 88 -31 99 -67 181 -86 194 -10 8 -67 11 -177 9 -130 -2 -142 -1 -62 4 84 6
91 8 40 10 -33 1 -83 6 -111 10 l-51 7 28 -86z m375 -102 c19 -59 33 -112 29
-118 -3 -5 -21 -9 -38 -9 -32 2 -32 2 -4 6 27 4 28 7 23 38 -4 19 -20 74 -36
122 -16 48 -30 90 -30 93 0 18 25 -41 56 -132z m-178 95 c-15 -2 -42 -2 -60 0
-18 2 -6 4 27 4 33 0 48 -2 33 -4z m70 -50 c-16 -2 -40 -2 -55 0 -16 2 -3 4
27 4 30 0 43 -2 28 -4z m-120 -10 c-15 -2 -42 -2 -60 0 -18 2 -6 4 27 4 33 0
48 -2 33 -4z m155 -40 c-7 -2 -19 -2 -25 0 -7 3 -2 5 12 5 14 0 19 -2 13 -5z
m-153 -13 c11 -7 2 -10 -32 -10 -27 0 -48 5 -48 10 0 13 60 13 80 0z m83 3
c-7 -2 -19 -2 -25 0 -7 3 -2 5 12 5 14 0 19 -2 13 -5z m15 -60 c-10 -2 -28 -2
-40 0 -13 2 -5 4 17 4 22 1 32 -1 23 -4z m-90 -10 c-10 -2 -28 -2 -40 0 -13 2
-5 4 17 4 22 1 32 -1 23 -4z m155 -50 c-13 -2 -33 -2 -45 0 -13 2 -3 4 22 4
25 0 35 -2 23 -4z m-85 -10 c-10 -2 -26 -2 -35 0 -10 3 -2 5 17 5 19 0 27 -2
18 -5z m-75 -10 c-13 -2 -33 -2 -45 0 -13 2 -3 4 22 4 25 0 35 -2 23 -4z"/>
<path d="M4542 3340 c10 -30 28 -50 28 -31 0 20 -20 61 -29 61 -6 0 -6 -11 1
-30z"/>
<path d="M4582 3210 c0 -14 2 -19 5 -12 2 6 2 18 0 25 -3 6 -5 1 -5 -13z"/>
<path d="M1950 3510 c0 -5 18 -10 40 -10 22 0 40 5 40 10 0 6 -18 10 -40 10
-22 0 -40 -4 -40 -10z"/>
<path d="M1530 3470 c0 -5 16 -10 35 -10 19 0 35 5 35 10 0 6 -16 10 -35 10
-19 0 -35 -4 -35 -10z"/>
<path d="M1451 3451 c-10 -6 -9 -10 3 -14 8 -3 18 -2 21 3 8 13 -9 20 -24 11z"/>
<path d="M1216 3405 c-22 -22 -20 -42 5 -55 27 -15 51 5 47 39 -4 31 -29 38
-52 16z"/>
<path d="M1556 3335 c-9 -26 -7 -32 5 -12 6 10 9 21 6 23 -2 3 -7 -2 -11 -11z"/>
<path d="M1423 3263 c9 -2 23 -2 30 0 6 3 -1 5 -18 5 -16 0 -22 -2 -12 -5z"/>
<path d="M1353 3253 c9 -2 25 -2 35 0 9 3 1 5 -18 5 -19 0 -27 -2 -17 -5z"/>
<path d="M1278 3243 c12 -2 30 -2 40 0 9 3 -1 5 -23 4 -22 0 -30 -2 -17 -4z"/>
<path d="M1210 3231 c0 -5 9 -7 20 -4 11 3 20 7 20 9 0 2 -9 4 -20 4 -11 0
-20 -4 -20 -9z"/>
<path d="M1233 3203 c9 -2 23 -2 30 0 6 3 -1 5 -18 5 -16 0 -22 -2 -12 -5z"/>
<path d="M1300 3200 c0 -13 30 -13 50 0 11 7 7 10 -17 10 -18 0 -33 -4 -33
-10z"/>
<path d="M1180 3134 c-6 -14 -10 -30 -10 -35 0 -15 47 -59 62 -59 21 1 50 48
43 70 -17 53 -78 69 -95 24z"/>
<path d="M1297 3114 c-8 -8 1 -24 14 -24 5 0 9 7 9 15 0 15 -12 20 -23 9z"/>
<path d="M531 3114 c0 -11 3 -14 6 -6 3 7 2 16 -1 19 -3 4 -6 -2 -5 -13z"/>
<path d="M511 3044 c0 -11 3 -14 6 -6 3 7 2 16 -1 19 -3 4 -6 -2 -5 -13z"/>
<path d="M2780 3370 c0 -6 7 -10 15 -10 8 0 15 2 15 4 0 2 -7 6 -15 10 -8 3
-15 1 -15 -4z"/>
<path d="M2835 3290 l-30 -8 35 0 c19 0 49 4 65 8 l30 8 -35 0 c-19 0 -48 -4
-65 -8z"/>
<path d="M2778 3283 c7 -3 16 -2 19 1 4 3 -2 6 -13 5 -11 0 -14 -3 -6 -6z"/>
<path d="M2776 3253 c-12 -12 -5 -23 14 -23 11 0 20 4 20 9 0 11 -26 22 -34
14z"/>
<path d="M2972 3229 c2 -7 10 -15 17 -17 8 -3 12 1 9 9 -2 7 -10 15 -17 17 -8
3 -12 -1 -9 -9z"/>
<path d="M2915 3220 c-3 -6 1 -7 9 -4 18 7 21 14 7 14 -6 0 -13 -4 -16 -10z"/>
<path d="M2600 3069 c-110 -22 -231 -114 -280 -214 -22 -43 -25 -64 -24 -145
0 -90 9 -129 49 -225 8 -18 7 -18 -8 -7 -24 20 -57 117 -64 189 -3 36 -9 59
-13 53 -5 -8 -18 -1 -41 19 -18 17 -39 31 -46 31 -6 0 -16 6 -20 13 -4 8 -18
16 -30 19 -21 6 -23 2 -25 -35 -1 -37 -2 -35 -9 18 -5 48 -6 43 -3 -30 4 -111
31 -210 88 -324 106 -210 256 -392 351 -425 106 -37 268 -31 391 15 55 21 154
91 154 110 0 6 -19 -6 -43 -25 -46 -37 -131 -80 -182 -91 -22 -5 -26 -4 -16 3
12 9 9 16 -17 40 -18 17 -32 34 -32 39 0 4 5 1 10 -7 8 -12 10 -11 10 8 0 14
-6 22 -17 22 -13 0 -15 2 -5 8 21 14 -16 82 -44 82 -6 0 -37 24 -69 54 l-58
54 54 -19 c30 -10 71 -18 91 -19 87 0 206 71 258 155 35 57 80 195 80 247 0
56 -30 153 -65 208 -90 143 -255 212 -425 179z m164 -14 c37 -8 88 -26 112
-40 54 -32 117 -93 108 -106 -3 -5 0 -8 7 -7 18 4 68 -98 80 -166 11 -59 5
-131 -12 -142 -5 -3 -9 -14 -9 -25 0 -35 -56 -143 -95 -183 -21 -21 -63 -50
-93 -64 -73 -33 -177 -29 -245 11 -63 37 -142 127 -166 190 -11 28 -20 43 -20
32 -1 -29 34 -101 70 -146 27 -34 29 -53 4 -31 -11 10 -105 46 -120 47 -5 0
-10 7 -11 15 0 8 -10 36 -22 61 -34 73 -55 176 -48 242 15 149 137 278 296
313 73 16 83 16 164 -1z m-203 -702 c13 -16 12 -17 -3 -4 -10 7 -18 15 -18 17
0 8 8 3 21 -13z"/>
<path d="M2693 2919 c157 -23 267 -152 267 -312 0 -67 -31 -149 -66 -177 -18
-14 -18 -14 -4 5 14 19 14 19 -2 6 -10 -7 -16 -17 -13 -21 10 -16 -79 -52
-125 -52 -49 1 -130 28 -130 43 0 5 -7 9 -16 9 -8 0 -13 4 -10 8 5 9 -23 37
-39 38 -5 0 -23 22 -40 49 -23 38 -30 62 -33 115 -5 86 10 132 60 186 58 63
120 77 215 49 68 -20 133 -84 161 -156 12 -30 21 -46 21 -36 2 35 -42 108 -89
150 -54 49 -103 67 -179 67 -121 0 -211 -101 -211 -238 0 -81 24 -143 77 -202
104 -116 249 -139 358 -56 87 66 117 234 63 349 -15 32 -32 56 -38 52 -5 -3
-7 0 -4 9 8 21 -87 93 -148 111 -29 8 -70 14 -92 14 -37 -1 -35 -2 17 -10z"/>
<path d="M2549 2889 l-24 -20 30 17 c39 24 40 24 28 24 -6 0 -21 -9 -34 -21z"/>
<path d="M2990 2881 c0 -6 4 -13 10 -16 6 -3 7 1 4 9 -7 18 -14 21 -14 7z"/>
<path d="M3011 2847 c-1 -5 4 -17 9 -27 6 -10 17 -43 25 -72 12 -41 14 -44 11
-16 -4 33 -43 133 -45 115z"/>
<path d="M2668 2803 c-44 -7 -78 -56 -78 -113 0 -41 5 -55 31 -85 56 -63 111
-80 169 -50 39 20 60 53 60 93 0 98 -84 169 -182 155z m99 -33 c37 -22 49 -41
61 -98 8 -33 6 -46 -9 -71 -20 -33 -69 -48 -111 -36 -30 9 -108 85 -108 105 0
29 21 89 36 105 22 21 92 19 131 -5z"/>
<path d="M2642 2758 c-7 -7 -12 -27 -12 -45 0 -28 3 -33 23 -32 16 1 18 2 5 6
-10 2 -18 13 -18 23 0 35 12 50 41 50 l28 0 -14 -40 c-8 -22 -10 -40 -6 -40 5
0 12 16 15 35 4 19 9 35 12 35 29 0 82 -68 66 -85 -4 -4 0 -6 8 -3 17 6 16 44
-3 66 -29 36 -121 54 -145 30z"/>
<path d="M2643 2658 c2 -7 9 -12 15 -11 6 2 9 -3 6 -11 -6 -15 32 -46 56 -46
9 0 26 7 39 16 18 13 20 18 10 25 -9 6 -1 7 21 3 26 -4 31 -3 19 5 -14 9 -124
31 -157 31 -8 0 -12 -6 -9 -12z"/>
<path d="M2777 2595 c-15 -14 -24 -25 -19 -25 5 0 19 11 32 25 30 32 23 32
-13 0z"/>
<path d="M2423 2640 c0 -30 2 -43 4 -27 2 15 2 39 0 55 -2 15 -4 2 -4 -28z"/>
<path d="M2943 2610 c0 -25 2 -35 4 -22 2 12 2 32 0 45 -2 12 -4 2 -4 -23z"/>
<path d="M2928 2540 c-3 -14 -9 -34 -12 -45 -4 -11 0 -7 9 8 9 16 15 36 13 45
-3 12 -6 10 -10 -8z"/>
<path d="M2092 2885 c0 -16 2 -22 5 -12 2 9 2 23 0 30 -3 6 -5 -1 -5 -18z"/>
<path d="M2810 2112 c0 -26 6 -30 35 -24 18 3 25 11 25 26 -1 19 -2 19 -11 4
-12 -22 -29 -23 -29 -3 0 8 -4 15 -10 15 -5 0 -10 -8 -10 -18z"/>
<path d="M1788 2883 c6 -2 18 -2 25 0 6 3 1 5 -13 5 -14 0 -19 -2 -12 -5z"/>
<path d="M1738 2873 c6 -2 18 -2 25 0 6 3 1 5 -13 5 -14 0 -19 -2 -12 -5z"/>
<path d="M1688 2863 c7 -3 16 -2 19 1 4 3 -2 6 -13 5 -11 0 -14 -3 -6 -6z"/>
<path d="M1638 2853 c7 -3 16 -2 19 1 4 3 -2 6 -13 5 -11 0 -14 -3 -6 -6z"/>
<path d="M1598 2843 c7 -3 16 -2 19 1 4 3 -2 6 -13 5 -11 0 -14 -3 -6 -6z"/>
<path d="M1005 2793 c14 -29 30 -55 35 -58 12 -7 -36 85 -51 100 -6 6 1 -13
16 -42z"/>
<path d="M1059 2751 c13 -12 28 -21 34 -21 12 0 11 0 -28 24 l-30 17 24 -20z"/>
<path d="M4615 2575 c-202 -63 -195 -60 -195 -94 0 -15 -7 -61 -16 -100 -9
-40 -14 -74 -11 -77 3 -3 83 23 177 58 196 72 196 71 206 187 6 57 4 71 -7 71
-8 -1 -77 -21 -154 -45z m142 -7 c-3 -8 -6 -5 -6 6 -1 11 2 17 5 13 3 -3 4
-12 1 -19z m3 -27 c0 -5 -8 -17 -17 -27 -17 -17 -18 -17 -21 1 -2 9 2 21 10
26 17 11 28 11 28 0z m-80 -40 c0 -20 -103 -76 -121 -66 -19 13 -7 27 44 50
56 26 77 31 77 16z m45 -31 c3 -5 1 -10 -4 -10 -6 0 -11 5 -11 10 0 6 2 10 4
10 3 0 8 -4 11 -10z m-221 -37 c4 -9 2 -21 -4 -27 -7 -7 -10 -3 -10 11 0 12
-6 24 -12 26 -8 4 -7 6 3 6 9 1 20 -7 23 -16z"/>
<path d="M3768 2283 c-27 -4 -28 -7 -28 -64 l0 -59 -32 1 c-24 1 -27 3 -10 6
20 4 22 10 22 59 0 36 -4 54 -12 54 -7 0 -74 -9 -148 -20 -74 -11 -136 -20
-137 -20 -8 0 -1 -230 6 -235 9 -5 266 38 299 50 7 2 12 22 12 47 1 24 7 70
13 103 12 55 15 60 39 60 17 -1 24 4 21 12 -3 7 -8 12 -12 12 -3 -1 -18 -4
-33 -6z m-78 -58 c0 -21 -5 -25 -29 -25 -17 0 -33 5 -36 10 -13 21 4 40 35 40
25 0 30 -4 30 -25z m-32 -72 c-10 -2 -26 -2 -35 0 -10 3 -2 5 17 5 19 0 27 -2
18 -5z m42 -52 c0 -19 -35 -39 -47 -27 -4 3 1 6 10 6 22 0 30 17 11 24 -8 3
-12 2 -9 -4 3 -6 -1 -10 -9 -10 -9 0 -16 7 -16 15 0 10 10 15 30 15 23 0 30
-5 30 -19z"/>
<path d="M1335 1733 c34 -53 45 -67 45 -60 0 10 -51 87 -57 87 -3 0 3 -12 12
-27z"/>
<path d="M3303 1580 c0 -25 2 -35 4 -22 2 12 2 32 0 45 -2 12 -4 2 -4 -23z"/>
<path d="M3313 1465 c-1 -27 2 -88 6 -135 8 -83 8 -83 8 -20 0 36 -3 97 -7
135 -6 61 -7 64 -7 20z"/>
<path d="M3332 1215 c0 -16 2 -22 5 -12 2 9 2 23 0 30 -3 6 -5 -1 -5 -18z"/>
<path d="M4226 5085 c-9 -26 -7 -32 5 -12 6 10 9 21 6 23 -2 3 -7 -2 -11 -11z"/>
<path d="M3395 5055 c6 -2 78 -15 161 -29 83 -14 166 -29 185 -32 19 -4 32 -4
29 -1 -3 3 -68 17 -145 31 -139 25 -249 40 -230 31z"/>
<path d="M4185 5000 c-9 -16 -13 -30 -11 -30 3 0 12 14 21 30 9 17 13 30 11
30 -3 0 -12 -13 -21 -30z"/>
<path d="M3788 4983 c6 -2 18 -2 25 0 6 3 1 5 -13 5 -14 0 -19 -2 -12 -5z"/>
<path d="M3838 4973 c6 -2 18 -2 25 0 6 3 1 5 -13 5 -14 0 -19 -2 -12 -5z"/>
<path d="M3898 4963 c7 -3 16 -2 19 1 4 3 -2 6 -13 5 -11 0 -14 -3 -6 -6z"/>
<path d="M4140 4920 c-6 -11 -8 -20 -6 -20 3 0 10 9 16 20 6 11 8 20 6 20 -3
0 -10 -9 -16 -20z"/>
<path d="M4069 4813 c-13 -16 -12 -17 4 -4 9 7 17 15 17 17 0 8 -8 3 -21 -13z"/>
<path d="M3979 4693 c-13 -16 -12 -17 4 -4 16 13 21 21 13 21 -2 0 -10 -8 -17
-17z"/>
<path d="M4523 4623 c9 -2 25 -2 35 0 9 3 1 5 -18 5 -19 0 -27 -2 -17 -5z"/>
<path d="M4603 4613 c9 -2 25 -2 35 0 9 3 1 5 -18 5 -19 0 -27 -2 -17 -5z"/>
<path d="M4673 4603 c9 -2 25 -2 35 0 9 3 1 5 -18 5 -19 0 -27 -2 -17 -5z"/>
<path d="M4753 4593 c9 -2 25 -2 35 0 9 3 1 5 -18 5 -19 0 -27 -2 -17 -5z"/>
<path d="M4833 4583 c9 -2 23 -2 30 0 6 3 -1 5 -18 5 -16 0 -22 -2 -12 -5z"/>
<path d="M4898 4573 c6 -2 18 -2 25 0 6 3 1 5 -13 5 -14 0 -19 -2 -12 -5z"/>
<path d="M5055 4500 c-3 -5 -11 -7 -18 -4 -12 4 -527 -103 -536 -112 -6 -6
-12 -6 200 20 107 14 245 28 307 32 l112 7 0 27 c0 20 -6 29 -22 34 -31 8 -36
8 -43 -4z"/>
<path d="M4468 4373 c7 -3 16 -2 19 1 4 3 -2 6 -13 5 -11 0 -14 -3 -6 -6z"/>
<path d="M4418 4363 c7 -3 16 -2 19 1 4 3 -2 6 -13 5 -11 0 -14 -3 -6 -6z"/>
<path d="M4813 4323 c32 -2 81 -2 110 0 29 2 3 3 -58 3 -60 0 -84 -1 -52 -3z"/>
<path d="M4523 4313 c9 -2 25 -2 35 0 9 3 1 5 -18 5 -19 0 -27 -2 -17 -5z"/>
<path d="M120 4230 c0 -5 5 -10 10 -10 6 0 10 5 10 10 0 6 -4 10 -10 10 -5 0
-10 -4 -10 -10z"/>
<path d="M4655 4224 c-88 -8 -177 -12 -197 -9 -42 6 -48 1 -18 -15 13 -7 87
-4 257 10 131 11 270 21 308 23 39 2 12 3 -60 4 -71 0 -202 -6 -290 -13z"/>
<path d="M4947 4203 c18 -2 50 -2 70 0 21 2 7 4 -32 4 -38 0 -55 -2 -38 -4z"/>
<path d="M4720 4190 c-25 -4 1 -5 60 -2 58 2 107 6 109 8 7 7 -121 1 -169 -6z"/>
<path d="M4613 4173 c9 -2 25 -2 35 0 9 3 1 5 -18 5 -19 0 -27 -2 -17 -5z"/>
<path d="M398 4153 c6 -2 18 -2 25 0 6 3 1 5 -13 5 -14 0 -19 -2 -12 -5z"/>
<path d="M363 4093 c9 -2 23 -2 30 0 6 3 -1 5 -18 5 -16 0 -22 -2 -12 -5z"/>
<path d="M268 4083 c6 -2 18 -2 25 0 6 3 1 5 -13 5 -14 0 -19 -2 -12 -5z"/>
<path d="M248 3983 c7 -3 16 -2 19 1 4 3 -2 6 -13 5 -11 0 -14 -3 -6 -6z"/>
<path d="M158 3973 c7 -3 16 -2 19 1 4 3 -2 6 -13 5 -11 0 -14 -3 -6 -6z"/>
<path d="M934 3808 l-19 -23 23 19 c21 18 27 26 19 26 -2 0 -12 -10 -23 -22z"/>
<path d="M849 3733 l-24 -28 28 24 c25 23 32 31 24 31 -2 0 -14 -12 -28 -27z"/>
<path d="M318 3603 l-318 -105 0 -75 0 -75 43 6 42 5 -42 -11 c-35 -9 -43 -15
-43 -34 0 -13 2 -24 4 -24 17 0 194 69 247 96 37 19 91 43 120 54 l54 19 -70
2 -70 2 75 9 c41 5 84 11 96 13 40 8 214 184 214 217 0 16 -36 5 -352 -99z
m161 -67 c-5 -5 -176 -46 -191 -46 -49 0 114 47 171 49 13 1 22 -1 20 -3z
m-292 -68 c-3 -8 -6 -5 -6 6 -1 11 2 17 5 13 3 -3 4 -12 1 -19z m-13 -71 c-6
-16 -71 -43 -80 -34 -3 3 9 8 26 12 17 4 36 15 43 25 13 22 20 20 11 -3z"/>
<path d="M799 3693 c-13 -16 -12 -17 4 -4 9 7 17 15 17 17 0 8 -8 3 -21 -13z"/>
<path d="M735 3649 c-59 -45 -67 -57 -12 -18 42 29 65 50 55 49 -2 0 -21 -14
-43 -31z"/>
<path d="M635 3574 l-30 -26 33 22 c17 12 32 23 32 26 0 7 -4 5 -35 -22z"/>
<path d="M4722 3544 c-24 -16 -28 -40 -11 -64 8 -12 9 -10 4 7 -7 24 26 53 60
53 15 -1 11 -4 -12 -15 -22 -9 -33 -21 -33 -34 0 -12 22 -81 50 -153 62 -166
71 -176 205 -207 55 -12 108 -25 118 -28 15 -4 17 3 17 50 0 35 -5 57 -12 60
-10 4 -10 6 0 6 6 1 12 12 12 26 0 19 -7 26 -32 33 -18 4 -34 15 -36 24 -3 14
3 15 32 8 35 -8 36 -7 36 20 0 16 -7 30 -16 34 -24 9 -62 7 -69 -4 -13 -21
-43 -10 -48 18 -3 15 -4 29 -2 30 4 4 91 -13 118 -23 13 -5 17 -2 17 13 0 11
-6 23 -12 25 -10 4 -10 6 0 6 10 1 19 51 9 51 -2 0 -74 18 -162 40 -177 44
-201 47 -233 24z m175 -70 c-3 -3 -12 -4 -19 -1 -8 3 -5 6 6 6 11 1 17 -2 13
-5z m49 -110 c5 -26 9 -32 16 -22 6 9 7 5 3 -11 -5 -17 -4 -21 5 -16 7 4 10 2
9 -6 -1 -8 3 -27 9 -42 14 -34 15 -47 3 -47 -9 0 -71 159 -71 181 0 24 20 -5
26 -37z m104 -174 c0 -13 -30 -13 -50 0 -11 7 -7 10 18 10 17 0 32 -4 32 -10z
m-33 -36 c-3 -3 -12 -4 -19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z m46 -11 c-7
-2 -19 -2 -25 0 -7 3 -2 5 12 5 14 0 19 -2 13 -5z m44 -9 c-3 -3 -12 -4 -19
-1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z"/>
<path d="M545 3519 c-27 -17 -54 -36 -60 -42 -11 -11 58 28 96 55 40 28 17 20
-36 -13z"/>
<path d="M436 3458 c3 -4 -10 -15 -28 -24 -42 -21 -190 -114 -203 -127 -11
-11 16 4 155 88 111 67 116 71 91 71 -11 0 -17 -4 -15 -8z"/>
<path d="M140 3275 c-25 -13 -41 -24 -37 -25 11 0 87 39 87 45 0 7 0 7 -50
-20z"/>
<path d="M40 3230 c-8 -5 -10 -10 -5 -10 6 0 17 5 25 10 8 5 11 10 5 10 -5 0
-17 -5 -25 -10z"/>
<path d="M4859 3072 c13 -10 77 -33 142 -49 96 -25 119 -28 119 -17 0 17 7 14
-140 49 -63 15 -122 29 -130 32 -8 2 -4 -4 9 -15z"/>
<path d="M0 2940 c0 -17 8 -20 68 -23 l67 -3 -67 -2 -68 -2 1 -85 c0 -47 2
-85 4 -85 1 0 40 7 85 16 45 8 86 14 92 12 6 -2 -33 -12 -86 -22 -94 -18 -96
-19 -96 -46 0 -19 6 -30 18 -33 16 -4 16 -5 0 -6 -12 -1 -18 -9 -18 -26 0 -30
15 -31 88 -10 41 12 52 20 52 36 0 24 23 21 28 -4 6 -28 -33 -54 -102 -67
l-66 -14 0 -59 c0 -51 2 -58 18 -53 59 17 295 66 299 63 4 -5 -59 -21 -245
-62 l-72 -17 0 -38 0 -39 32 10 c18 5 40 9 48 8 8 -1 -5 -6 -29 -13 -25 -6
-46 -17 -49 -24 -5 -17 -3 -17 220 38 214 52 234 62 223 110 -21 87 -162 324
-237 398 -48 46 -88 62 -160 62 -41 0 -48 -3 -48 -20z m188 -55 c43 -36 208
-285 189 -285 -2 0 -25 35 -49 78 -61 104 -134 199 -167 217 -14 8 -21 14 -14
15 6 0 25 -11 41 -25z m-63 -54 c-11 -5 -40 -11 -65 -14 l-45 -6 50 14 c56 15
91 18 60 6z m108 -148 c-7 -2 -21 -2 -30 0 -10 3 -4 5 12 5 17 0 24 -2 18 -5z
m-166 -9 c-3 -3 -12 -4 -19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z m223 -63 c-8
-5 -37 -12 -65 -15 l-50 -6 50 14 c28 8 57 14 65 15 13 0 13 -1 0 -8z m120
-76 c0 -5 -5 -3 -10 5 -5 8 -10 20 -10 25 0 6 5 3 10 -5 5 -8 10 -19 10 -25z
m2 -67 c-6 -6 -7 0 -4 19 5 21 7 23 10 9 2 -10 0 -22 -6 -28z m-152 -44 c-74
-18 -142 -33 -150 -33 -20 2 240 67 265 67 11 0 -41 -15 -115 -34z"/>
<path d="M4987 2593 c3 -10 12 -27 20 -38 7 -11 13 -27 13 -36 0 -10 18 -26
43 -38 54 -26 57 -26 57 2 0 17 -12 28 -52 47 -89 43 -95 88 -7 56 28 -9 53
-15 55 -13 8 8 -75 37 -106 37 -24 0 -28 -3 -23 -17z m98 -88 c39 -17 21 -18
-25 0 -19 7 -28 14 -20 14 8 0 29 -6 45 -14z"/>
<path d="M478 2383 c7 -3 16 -2 19 1 4 3 -2 6 -13 5 -11 0 -14 -3 -6 -6z"/>
<path d="M388 2363 c7 -3 16 -2 19 1 4 3 -2 6 -13 5 -11 0 -14 -3 -6 -6z"/>
<path d="M208 2323 c7 -3 16 -2 19 1 4 3 -2 6 -13 5 -11 0 -14 -3 -6 -6z"/>
<path d="M158 2313 c7 -3 16 -2 19 1 4 3 -2 6 -13 5 -11 0 -14 -3 -6 -6z"/>
<path d="M425 2313 c-44 -10 -333 -74 -377 -84 -46 -10 -48 -12 -48 -45 0 -19
3 -34 8 -34 4 0 88 18 187 39 190 41 273 56 265 48 -3 -2 -107 -26 -232 -53
-151 -32 -228 -53 -228 -61 0 -7 4 -13 8 -13 5 0 9 -7 9 -15 0 -8 -4 -12 -9
-9 -4 3 -8 -34 -8 -81 0 -78 2 -86 18 -81 9 3 156 37 327 76 171 40 313 75
318 79 8 8 -30 126 -57 178 -24 47 -53 63 -111 62 -27 -1 -59 -3 -70 -6z m117
-120 c10 -9 18 -25 18 -35 0 -26 -18 -58 -33 -58 -8 0 -9 3 -1 8 6 4 14 21 17
39 7 33 -3 47 -38 56 -19 4 -19 5 -1 6 11 0 28 -6 38 -16z m-74 -13 c-7 -10
-14 -17 -17 -15 -4 4 18 35 25 35 2 0 -1 -9 -8 -20z m49 -7 c-13 -3 -17 -11
-14 -24 3 -10 1 -17 -4 -13 -5 3 -9 14 -9 25 0 13 6 19 23 18 18 -1 19 -2 4
-6z m-124 -26 c3 -8 -1 -14 -9 -14 -7 0 -11 4 -8 9 3 4 0 8 -7 8 -6 0 -9 -8
-6 -20 5 -21 -7 -28 -18 -10 -8 13 13 40 30 40 7 0 15 -6 18 -13z m-218 -64
c8 -24 10 -43 6 -43 -9 0 -32 78 -30 102 1 14 1 13 24 -59z m315 23 c0 -6 -7
-1 -15 10 -8 10 -15 23 -15 28 0 6 7 1 15 -10 8 -10 15 -23 15 -28z m-207 -16
c3 -11 1 -18 -4 -14 -5 3 -9 12 -9 20 0 20 7 17 13 -6z m-40 -37 c-7 -2 -19
-2 -25 0 -7 3 -2 5 12 5 14 0 19 -2 13 -5z m-113 -22 c-18 -10 -97 -25 -89
-17 5 5 73 23 94 25 6 0 3 -3 -5 -8z"/>
<path d="M68 2293 c7 -3 16 -2 19 1 4 3 -2 6 -13 5 -11 0 -14 -3 -6 -6z"/>
<path d="M5025 2293 c-124 -30 -152 -134 -68 -255 14 -21 30 -38 35 -38 5 0 6
5 3 10 -3 6 21 -4 54 -22 33 -18 56 -34 51 -36 -5 -2 -27 9 -50 23 -23 15 -44
24 -47 21 -6 -6 63 -50 93 -60 20 -6 21 -3 23 62 2 58 -1 71 -20 88 -28 25
-49 67 -49 99 0 29 0 29 35 13 28 -13 32 -25 10 -30 -13 -2 -12 -6 5 -16 19
-12 20 -10 20 62 0 68 -2 74 -22 80 -25 6 -43 6 -73 -1z"/>
<path d="M18 2283 c7 -3 16 -2 19 1 4 3 -2 6 -13 5 -11 0 -14 -3 -6 -6z"/>
<path d="M340 1984 c-173 -41 -321 -76 -327 -79 -8 -2 -13 -22 -13 -46 0 -40
1 -41 28 -34 210 55 441 107 494 112 81 7 154 -10 170 -41 20 -37 22 -212 4
-306 -31 -155 -43 -186 -79 -208 -26 -16 -209 -87 -362 -140 -26 -9 -27 -11
-7 -11 25 -1 344 113 379 135 40 25 53 58 79 205 19 109 24 163 20 224 -6 100
-44 265 -59 264 -7 -1 -154 -34 -327 -75z"/>
<path d="M305 1800 c-250 -65 -240 -61 -243 -97 -4 -42 13 -73 41 -73 37 0
379 97 393 112 11 11 11 18 0 40 -8 15 -12 28 -10 31 2 2 -11 2 -29 1 -17 -2
-23 -1 -12 2 26 8 44 24 25 24 -8 -1 -82 -18 -165 -40z m112 4 c-3 -3 -12 -4
-19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z m-40 -10 c-3 -3 -12 -4 -19 -1 -8 3
-5 6 6 6 11 1 17 -2 13 -5z m-52 -14 c-11 -5 -27 -9 -35 -9 -9 0 -8 4 5 9 11
5 27 9 35 9 9 0 8 -4 -5 -9z m135 -21 c0 -4 -16 -10 -36 -13 -19 -4 -42 -10
-50 -13 -8 -3 -14 0 -14 7 0 6 5 8 10 5 6 -3 10 -1 10 5 0 6 5 8 10 5 17 -10
50 5 50 23 0 15 2 15 10 2 5 -8 10 -18 10 -21z m-193 5 c-3 -3 -12 -4 -19 -1
-8 3 -5 6 6 6 11 1 17 -2 13 -5z m-37 -14 c0 -5 -2 -10 -4 -10 -3 0 -8 5 -11
10 -3 6 -1 10 4 10 6 0 11 -4 11 -10z m-42 -7 c-1 -5 2 -20 6 -34 6 -21 12
-25 34 -22 23 3 24 2 7 -5 -11 -5 -33 -12 -50 -16 -28 -7 -28 -6 -11 7 18 13
18 16 3 45 -13 27 -13 32 -1 32 8 0 13 -3 12 -7z m120 -27 c36 4 36 4 7 -6
-34 -11 -55 -7 -54 12 0 9 2 10 5 1 3 -7 19 -10 42 -7z m-162 -14 c2 -8 0 -8
-3 -1 -4 8 -7 8 -13 -1 -5 -8 -9 -7 -14 5 -4 12 -1 16 11 13 9 -2 18 -9 19
-16z m-16 -45 c17 -4 14 -5 -9 -4 -26 2 -36 7 -43 27 l-8 25 17 -22 c10 -12
29 -24 43 -26z"/>
<path d="M455 1684 c-44 -14 -142 -42 -218 -63 -76 -22 -141 -42 -145 -45 -6
-7 42 -164 64 -208 8 -15 27 -34 43 -43 26 -13 35 -13 83 1 97 29 304 114 325
133 21 20 19 44 -12 219 -7 40 -27 41 -140 6z m126 -74 c9 -30 19 -73 22 -95
l6 -40 -14 33 c-8 17 -19 32 -23 32 -5 0 -21 23 -36 51 -16 28 -34 53 -41 55
-12 5 -252 -60 -263 -71 -3 -3 2 -32 11 -65 23 -81 20 -99 -3 -25 -23 69 -24
91 -9 101 27 16 277 83 304 81 26 -2 31 -7 46 -57z m-446 -40 c-3 -5 -12 -10
-18 -10 -7 0 -6 4 3 10 19 12 23 12 15 0z m299 -8 c2 -4 -5 -9 -17 -9 -17 -2
-19 0 -7 7 18 12 18 12 24 2z m-279 -32 c3 -5 1 -10 -4 -10 -6 0 -11 5 -11 10
0 6 2 10 4 10 3 0 8 -4 11 -10z m265 -2 c-14 -6 -37 -17 -52 -24 -15 -7 -30
-9 -33 -4 -3 5 16 15 42 23 57 18 78 20 43 5z m165 -47 c-2 -5 -30 -16 -62
-26 -32 -10 -98 -33 -146 -52 -49 -18 -93 -31 -97 -28 -5 3 -11 1 -15 -5 -3
-5 -14 -10 -23 -9 -12 0 -10 3 7 10 14 6 21 15 18 23 -8 20 165 77 211 69 34
-6 92 13 92 29 0 5 5 6 10 3 6 -4 8 -10 5 -14z m-380 -119 c-3 -3 -11 0 -18 7
-9 10 -8 11 6 5 10 -3 15 -9 12 -12z"/>
<path d="M5040 1602 c0 -4 18 -26 40 -47 35 -34 40 -36 40 -18 0 13 -15 30
-40 47 -22 14 -40 23 -40 18z"/>
<path d="M1100 1245 c19 -19 36 -35 39 -35 3 0 -10 16 -29 35 -19 19 -36 35
-39 35 -3 0 10 -16 29 -35z"/>
<path d="M4373 1268 c-13 -6 -23 -14 -23 -17 0 -4 19 -25 43 -46 l42 -40 -39
42 -40 42 35 15 c19 9 27 15 19 15 -8 0 -25 -5 -37 -11z"/>
<path d="M4470 1276 c0 -2 8 -10 18 -17 15 -13 16 -12 3 4 -13 16 -21 21 -21
13z"/>
<path d="M4537 1213 c48 -62 48 -60 -14 -91 l-57 -29 3 -89 c1 -49 5 -91 7
-93 2 -2 24 4 48 13 42 16 45 20 55 67 6 28 11 68 11 89 l0 39 -55 -25 c-62
-27 -65 -28 -65 -16 0 5 27 21 60 37 33 16 60 32 60 35 0 9 -69 100 -76 100
-3 0 7 -17 23 -37z"/>
<path d="M880 1186 c0 -2 8 -10 18 -17 15 -13 16 -12 3 4 -13 16 -21 21 -21
13z"/>
<path d="M940 1116 c0 -2 8 -10 18 -17 15 -13 16 -12 3 4 -13 16 -21 21 -21
13z"/>
<path d="M1000 1046 c0 -2 8 -10 18 -17 15 -13 16 -12 3 4 -13 16 -21 21 -21
13z"/>
<path d="M4581 926 c-13 -74 -8 -163 9 -137 11 19 32 5 168 -104 64 -52 120
-91 124 -89 4 3 8 1 8 -5 0 -5 28 -29 63 -53 34 -24 86 -61 115 -82 l53 -39
-2 72 c-1 39 -4 69 -7 67 -2 -3 -15 8 -29 25 -24 28 -51 41 -37 17 5 -9 2 -9
-9 1 -20 16 -23 25 -4 15 6 -4 3 2 -7 14 -23 26 -45 30 -25 5 13 -16 12 -17
-3 -4 -10 7 -16 17 -13 21 3 5 -32 39 -77 76 -71 58 -191 163 -289 251 l-25
23 -13 -74z m149 -73 c0 -8 -9 0 -50 45 l-45 47 48 -45 c26 -24 47 -45 47 -47z
m56 -45 l29 -33 -32 29 c-31 28 -38 36 -30 36 2 0 16 -15 33 -32z m64 -53 c13
-14 21 -25 18 -25 -2 0 -15 11 -28 25 -13 14 -21 25 -18 25 2 0 15 -11 28 -25z
m55 -45 c10 -11 16 -20 13 -20 -3 0 -13 9 -23 20 -10 11 -16 20 -13 20 3 0 13
-9 23 -20z m176 -137 c13 -16 12 -17 -3 -4 -17 13 -22 21 -14 21 2 0 10 -8 17
-17z"/>
<path d="M4050 966 c0 -2 8 -10 18 -17 15 -13 16 -12 3 4 -13 16 -21 21 -21
13z"/>
<path d="M4530 903 c-14 -7 -32 -11 -42 -9 -12 3 -17 -5 -20 -31 -4 -32 -3
-34 21 -28 34 9 51 23 62 53 12 31 10 32 -21 15z"/>
<path d="M4107 890 c30 -47 106 -140 114 -140 6 0 -8 21 -30 48 -57 68 -95
109 -84 92z"/>
<path d="M478 844 c-113 -36 -125 -47 -95 -88 12 -17 18 -16 118 14 57 18 107
35 112 39 11 10 -3 71 -17 70 -6 0 -59 -16 -118 -35z"/>
<path d="M555 690 c-65 -22 -79 -31 -77 -46 6 -40 84 -274 93 -280 11 -6 107
23 128 39 9 8 11 24 7 57 -9 62 -54 242 -63 251 -5 3 -44 -6 -88 -21z"/>
<path d="M1 313 l-1 -263 46 0 c33 0 45 4 41 13 -61 137 -61 136 -63 297 -2
85 -8 169 -13 185 -6 21 -10 -51 -10 -232z"/>
<path d="M1531 566 c2 -2 76 -61 164 -131 88 -71 205 -166 260 -213 68 -58 85
-70 55 -38 -71 75 -453 386 -475 386 -4 0 -6 -2 -4 -4z"/>
<path d="M4820 459 c-117 -70 -119 -73 -90 -104 29 -31 32 -31 83 4 23 15 60
37 82 48 38 20 41 20 71 4 l32 -17 -80 -48 c-77 -46 -80 -47 -105 -31 -42 28
-36 10 9 -27 55 -44 74 -54 123 -61 24 -4 32 -3 20 2 -18 7 -17 8 6 14 37 9
149 84 149 100 0 12 -112 101 -185 147 l-31 19 -84 -50z m121 4 c21 -16 39
-32 39 -37 0 -5 -10 0 -22 11 -13 11 -34 27 -48 36 -13 10 -21 17 -16 17 4 0
25 -12 47 -27z"/>
<path d="M4623 383 c-30 -12 -6 -43 95 -122 131 -102 189 -133 256 -139 40 -3
61 2 95 20 25 13 47 30 49 38 4 12 1 11 -19 -1 -77 -50 -131 -44 -220 26 -60
47 -81 57 -58 28 13 -16 12 -17 -3 -4 -10 7 -16 17 -13 21 4 7 -159 142 -168
139 -1 0 -8 -3 -14 -6z"/>
<path d="M141 349 c-2 -32 38 -166 69 -237 37 -82 61 -99 28 -19 -12 28 -38
102 -59 162 -21 61 -38 103 -38 94z"/>
<path d="M5089 294 c-7 -8 -33 -26 -58 -39 -25 -13 -41 -24 -36 -24 13 -1 112
56 120 69 10 16 -11 12 -26 -6z"/>
<path d="M5082 108 c-35 -22 -39 -28 -19 -28 16 1 63 37 57 44 -3 3 -20 -4
-38 -16z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 69 KiB

View File

@ -0,0 +1,20 @@
(function () {
const allauth = window.allauth = window.allauth || {}
function manageEmailForm (o) {
const actions = document.getElementsByName('action_remove')
if (actions.length) {
actions[0].addEventListener('click', function (e) {
if (!window.confirm(o.i18n.confirmDelete)) {
e.preventDefault()
}
})
}
}
allauth.account = {
forms: {
manageEmailForm
}
}
})()

View File

@ -0,0 +1,12 @@
(function () {
document.addEventListener('DOMContentLoaded', function () {
Array.from(document.querySelectorAll('script[data-allauth-onload]')).forEach(scriptElt => {
const funcRef = scriptElt.dataset.allauthOnload
if (typeof funcRef === 'string' && funcRef.startsWith('allauth.')) {
const funcArg = JSON.parse(scriptElt.textContent)
const func = funcRef.split('.').reduce((acc, part) => acc && acc[part], window)
func(funcArg)
}
})
})
})()

View File

@ -0,0 +1,279 @@
select.admin-autocomplete {
width: 20em;
}
.select2-container--admin-autocomplete.select2-container {
min-height: 30px;
}
.select2-container--admin-autocomplete .select2-selection--single,
.select2-container--admin-autocomplete .select2-selection--multiple {
min-height: 30px;
padding: 0;
}
.select2-container--admin-autocomplete.select2-container--focus .select2-selection,
.select2-container--admin-autocomplete.select2-container--open .select2-selection {
border-color: var(--body-quiet-color);
min-height: 30px;
}
.select2-container--admin-autocomplete.select2-container--focus .select2-selection.select2-selection--single,
.select2-container--admin-autocomplete.select2-container--open .select2-selection.select2-selection--single {
padding: 0;
}
.select2-container--admin-autocomplete.select2-container--focus .select2-selection.select2-selection--multiple,
.select2-container--admin-autocomplete.select2-container--open .select2-selection.select2-selection--multiple {
padding: 0;
}
.select2-container--admin-autocomplete .select2-selection--single {
background-color: var(--body-bg);
border: 1px solid var(--border-color);
border-radius: 4px;
}
.select2-container--admin-autocomplete .select2-selection--single .select2-selection__rendered {
color: var(--body-fg);
line-height: 30px;
}
.select2-container--admin-autocomplete .select2-selection--single .select2-selection__clear {
cursor: pointer;
float: right;
font-weight: bold;
}
.select2-container--admin-autocomplete .select2-selection--single .select2-selection__placeholder {
color: var(--body-quiet-color);
}
.select2-container--admin-autocomplete .select2-selection--single .select2-selection__arrow {
height: 26px;
position: absolute;
top: 1px;
right: 1px;
width: 20px;
}
.select2-container--admin-autocomplete .select2-selection--single .select2-selection__arrow b {
border-color: #888 transparent transparent transparent;
border-style: solid;
border-width: 5px 4px 0 4px;
height: 0;
left: 50%;
margin-left: -4px;
margin-top: -2px;
position: absolute;
top: 50%;
width: 0;
}
.select2-container--admin-autocomplete[dir="rtl"] .select2-selection--single .select2-selection__clear {
float: left;
}
.select2-container--admin-autocomplete[dir="rtl"] .select2-selection--single .select2-selection__arrow {
left: 1px;
right: auto;
}
.select2-container--admin-autocomplete.select2-container--disabled .select2-selection--single {
background-color: var(--darkened-bg);
cursor: default;
}
.select2-container--admin-autocomplete.select2-container--disabled .select2-selection--single .select2-selection__clear {
display: none;
}
.select2-container--admin-autocomplete.select2-container--open .select2-selection--single .select2-selection__arrow b {
border-color: transparent transparent #888 transparent;
border-width: 0 4px 5px 4px;
}
.select2-container--admin-autocomplete .select2-selection--multiple {
background-color: var(--body-bg);
border: 1px solid var(--border-color);
border-radius: 4px;
cursor: text;
}
.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__rendered {
box-sizing: border-box;
list-style: none;
margin: 0;
padding: 0 10px 5px 5px;
width: 100%;
display: flex;
flex-wrap: wrap;
}
.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__rendered li {
list-style: none;
}
.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__placeholder {
color: var(--body-quiet-color);
margin-top: 5px;
float: left;
}
.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__clear {
cursor: pointer;
float: right;
font-weight: bold;
margin: 5px;
position: absolute;
right: 0;
}
.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__choice {
background-color: var(--darkened-bg);
border: 1px solid var(--border-color);
border-radius: 4px;
cursor: default;
float: left;
margin-right: 5px;
margin-top: 5px;
padding: 0 5px;
}
.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__choice__remove {
color: var(--body-quiet-color);
cursor: pointer;
display: inline-block;
font-weight: bold;
margin-right: 2px;
}
.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__choice__remove:hover {
color: var(--body-fg);
}
.select2-container--admin-autocomplete[dir="rtl"] .select2-selection--multiple .select2-selection__choice, .select2-container--admin-autocomplete[dir="rtl"] .select2-selection--multiple .select2-selection__placeholder, .select2-container--admin-autocomplete[dir="rtl"] .select2-selection--multiple .select2-search--inline {
float: right;
}
.select2-container--admin-autocomplete[dir="rtl"] .select2-selection--multiple .select2-selection__choice {
margin-left: 5px;
margin-right: auto;
}
.select2-container--admin-autocomplete[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove {
margin-left: 2px;
margin-right: auto;
}
.select2-container--admin-autocomplete.select2-container--focus .select2-selection--multiple {
border: solid var(--body-quiet-color) 1px;
outline: 0;
}
.select2-container--admin-autocomplete.select2-container--disabled .select2-selection--multiple {
background-color: var(--darkened-bg);
cursor: default;
}
.select2-container--admin-autocomplete.select2-container--disabled .select2-selection__choice__remove {
display: none;
}
.select2-container--admin-autocomplete.select2-container--open.select2-container--above .select2-selection--single, .select2-container--admin-autocomplete.select2-container--open.select2-container--above .select2-selection--multiple {
border-top-left-radius: 0;
border-top-right-radius: 0;
}
.select2-container--admin-autocomplete.select2-container--open.select2-container--below .select2-selection--single, .select2-container--admin-autocomplete.select2-container--open.select2-container--below .select2-selection--multiple {
border-bottom-left-radius: 0;
border-bottom-right-radius: 0;
}
.select2-container--admin-autocomplete .select2-search--dropdown {
background: var(--darkened-bg);
}
.select2-container--admin-autocomplete .select2-search--dropdown .select2-search__field {
background: var(--body-bg);
color: var(--body-fg);
border: 1px solid var(--border-color);
border-radius: 4px;
}
.select2-container--admin-autocomplete .select2-search--inline .select2-search__field {
background: transparent;
color: var(--body-fg);
border: none;
outline: 0;
box-shadow: none;
-webkit-appearance: textfield;
}
.select2-container--admin-autocomplete .select2-results > .select2-results__options {
max-height: 200px;
overflow-y: auto;
color: var(--body-fg);
background: var(--body-bg);
}
.select2-container--admin-autocomplete .select2-results__option[role=group] {
padding: 0;
}
.select2-container--admin-autocomplete .select2-results__option[aria-disabled=true] {
color: var(--body-quiet-color);
}
.select2-container--admin-autocomplete .select2-results__option[aria-selected=true] {
background-color: var(--selected-bg);
color: var(--body-fg);
}
.select2-container--admin-autocomplete .select2-results__option .select2-results__option {
padding-left: 1em;
}
.select2-container--admin-autocomplete .select2-results__option .select2-results__option .select2-results__group {
padding-left: 0;
}
.select2-container--admin-autocomplete .select2-results__option .select2-results__option .select2-results__option {
margin-left: -1em;
padding-left: 2em;
}
.select2-container--admin-autocomplete .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
margin-left: -2em;
padding-left: 3em;
}
.select2-container--admin-autocomplete .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
margin-left: -3em;
padding-left: 4em;
}
.select2-container--admin-autocomplete .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
margin-left: -4em;
padding-left: 5em;
}
.select2-container--admin-autocomplete .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
margin-left: -5em;
padding-left: 6em;
}
.select2-container--admin-autocomplete .select2-results__option--highlighted[aria-selected] {
background-color: var(--primary);
color: var(--primary-fg);
}
.select2-container--admin-autocomplete .select2-results__group {
cursor: default;
display: block;
padding: 6px;
}
.errors .select2-selection {
border: 1px solid var(--error-fg);
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,343 @@
/* CHANGELISTS */
#changelist {
display: flex;
align-items: flex-start;
justify-content: space-between;
}
#changelist .changelist-form-container {
flex: 1 1 auto;
min-width: 0;
}
#changelist table {
width: 100%;
}
.change-list .hiddenfields { display:none; }
.change-list .filtered table {
border-right: none;
}
.change-list .filtered {
min-height: 400px;
}
.change-list .filtered .results, .change-list .filtered .paginator,
.filtered #toolbar, .filtered div.xfull {
width: auto;
}
.change-list .filtered table tbody th {
padding-right: 1em;
}
#changelist-form .results {
overflow-x: auto;
width: 100%;
}
#changelist .toplinks {
border-bottom: 1px solid var(--hairline-color);
}
#changelist .paginator {
color: var(--body-quiet-color);
border-bottom: 1px solid var(--hairline-color);
background: var(--body-bg);
overflow: hidden;
}
/* CHANGELIST TABLES */
#changelist table thead th {
padding: 0;
white-space: nowrap;
vertical-align: middle;
}
#changelist table thead th.action-checkbox-column {
width: 1.5em;
text-align: center;
}
#changelist table tbody td.action-checkbox {
text-align: center;
}
#changelist table tfoot {
color: var(--body-quiet-color);
}
/* TOOLBAR */
#toolbar {
padding: 8px 10px;
margin-bottom: 15px;
border-top: 1px solid var(--hairline-color);
border-bottom: 1px solid var(--hairline-color);
background: var(--darkened-bg);
color: var(--body-quiet-color);
}
#toolbar form input {
border-radius: 4px;
font-size: 0.875rem;
padding: 5px;
color: var(--body-fg);
}
#toolbar #searchbar {
height: 1.1875rem;
border: 1px solid var(--border-color);
padding: 2px 5px;
margin: 0;
vertical-align: top;
font-size: 0.8125rem;
max-width: 100%;
}
#toolbar #searchbar:focus {
border-color: var(--body-quiet-color);
}
#toolbar form input[type="submit"] {
border: 1px solid var(--border-color);
font-size: 0.8125rem;
padding: 4px 8px;
margin: 0;
vertical-align: middle;
background: var(--body-bg);
box-shadow: 0 -15px 20px -10px rgba(0, 0, 0, 0.15) inset;
cursor: pointer;
color: var(--body-fg);
}
#toolbar form input[type="submit"]:focus,
#toolbar form input[type="submit"]:hover {
border-color: var(--body-quiet-color);
}
#changelist-search img {
vertical-align: middle;
margin-right: 4px;
}
#changelist-search .help {
word-break: break-word;
}
/* FILTER COLUMN */
#changelist-filter {
flex: 0 0 240px;
order: 1;
background: var(--darkened-bg);
border-left: none;
margin: 0 0 0 30px;
}
@media (forced-colors: active) {
#changelist-filter {
border: 1px solid;
}
}
#changelist-filter h2 {
font-size: 0.875rem;
text-transform: uppercase;
letter-spacing: 0.5px;
padding: 5px 15px;
margin-bottom: 12px;
border-bottom: none;
}
#changelist-filter h3,
#changelist-filter details summary {
font-weight: 400;
padding: 0 15px;
margin-bottom: 10px;
}
#changelist-filter details summary > * {
display: inline;
}
#changelist-filter details > summary {
list-style-type: none;
}
#changelist-filter details > summary::-webkit-details-marker {
display: none;
}
#changelist-filter details > summary::before {
content: '→';
font-weight: bold;
color: var(--link-hover-color);
}
#changelist-filter details[open] > summary::before {
content: '↓';
}
#changelist-filter ul {
margin: 5px 0;
padding: 0 15px 15px;
border-bottom: 1px solid var(--hairline-color);
}
#changelist-filter ul:last-child {
border-bottom: none;
}
#changelist-filter li {
list-style-type: none;
margin-left: 0;
padding-left: 0;
}
#changelist-filter a {
display: block;
color: var(--body-quiet-color);
word-break: break-word;
}
#changelist-filter li.selected {
border-left: 5px solid var(--hairline-color);
padding-left: 10px;
margin-left: -15px;
}
#changelist-filter li.selected a {
color: var(--link-selected-fg);
}
#changelist-filter a:focus, #changelist-filter a:hover,
#changelist-filter li.selected a:focus,
#changelist-filter li.selected a:hover {
color: var(--link-hover-color);
}
#changelist-filter #changelist-filter-extra-actions {
font-size: 0.8125rem;
margin-bottom: 10px;
border-bottom: 1px solid var(--hairline-color);
}
/* DATE DRILLDOWN */
.change-list .toplinks {
display: flex;
padding-bottom: 5px;
flex-wrap: wrap;
gap: 3px 17px;
font-weight: bold;
}
.change-list .toplinks a {
font-size: 0.8125rem;
}
.change-list .toplinks .date-back {
color: var(--body-quiet-color);
}
.change-list .toplinks .date-back:focus,
.change-list .toplinks .date-back:hover {
color: var(--link-hover-color);
}
/* ACTIONS */
.filtered .actions {
border-right: none;
}
#changelist table input {
margin: 0;
vertical-align: baseline;
}
/* Once the :has() pseudo-class is supported by all browsers, the tr.selected
selector and the JS adding the class can be removed. */
#changelist tbody tr.selected {
background-color: var(--selected-row);
}
#changelist tbody tr:has(.action-select:checked) {
background-color: var(--selected-row);
}
@media (forced-colors: active) {
#changelist tbody tr.selected {
background-color: SelectedItem;
}
#changelist tbody tr:has(.action-select:checked) {
background-color: SelectedItem;
}
}
#changelist .actions {
padding: 10px;
background: var(--body-bg);
border-top: none;
border-bottom: none;
line-height: 1.5rem;
color: var(--body-quiet-color);
width: 100%;
}
#changelist .actions span.all,
#changelist .actions span.action-counter,
#changelist .actions span.clear,
#changelist .actions span.question {
font-size: 0.8125rem;
margin: 0 0.5em;
}
#changelist .actions:last-child {
border-bottom: none;
}
#changelist .actions select {
vertical-align: top;
height: 1.5rem;
color: var(--body-fg);
border: 1px solid var(--border-color);
border-radius: 4px;
font-size: 0.875rem;
padding: 0 0 0 4px;
margin: 0;
margin-left: 10px;
}
#changelist .actions select:focus {
border-color: var(--body-quiet-color);
}
#changelist .actions label {
display: inline-block;
vertical-align: middle;
font-size: 0.8125rem;
}
#changelist .actions .button {
font-size: 0.8125rem;
border: 1px solid var(--border-color);
border-radius: 4px;
background: var(--body-bg);
box-shadow: 0 -15px 20px -10px rgba(0, 0, 0, 0.15) inset;
cursor: pointer;
height: 1.5rem;
line-height: 1;
padding: 4px 8px;
margin: 0;
color: var(--body-fg);
}
#changelist .actions .button:focus, #changelist .actions .button:hover {
border-color: var(--body-quiet-color);
}

View File

@ -0,0 +1,130 @@
@media (prefers-color-scheme: dark) {
:root {
--primary: #264b5d;
--primary-fg: #f7f7f7;
--body-fg: #eeeeee;
--body-bg: #121212;
--body-quiet-color: #d0d0d0;
--body-medium-color: #e0e0e0;
--body-loud-color: #ffffff;
--breadcrumbs-link-fg: #e0e0e0;
--breadcrumbs-bg: var(--primary);
--link-fg: #81d4fa;
--link-hover-color: #4ac1f7;
--link-selected-fg: #6f94c6;
--hairline-color: #272727;
--border-color: #353535;
--error-fg: #e35f5f;
--message-success-bg: #006b1b;
--message-warning-bg: #583305;
--message-error-bg: #570808;
--darkened-bg: #212121;
--selected-bg: #1b1b1b;
--selected-row: #00363a;
--close-button-bg: #333333;
--close-button-hover-bg: #666666;
color-scheme: dark;
}
}
html[data-theme="dark"] {
--primary: #264b5d;
--primary-fg: #f7f7f7;
--body-fg: #eeeeee;
--body-bg: #121212;
--body-quiet-color: #d0d0d0;
--body-medium-color: #e0e0e0;
--body-loud-color: #ffffff;
--breadcrumbs-link-fg: #e0e0e0;
--breadcrumbs-bg: var(--primary);
--link-fg: #81d4fa;
--link-hover-color: #4ac1f7;
--link-selected-fg: #6f94c6;
--hairline-color: #272727;
--border-color: #353535;
--error-fg: #e35f5f;
--message-success-bg: #006b1b;
--message-warning-bg: #583305;
--message-error-bg: #570808;
--darkened-bg: #212121;
--selected-bg: #1b1b1b;
--selected-row: #00363a;
--close-button-bg: #333333;
--close-button-hover-bg: #666666;
color-scheme: dark;
}
/* THEME SWITCH */
.theme-toggle {
cursor: pointer;
border: none;
padding: 0;
background: transparent;
vertical-align: middle;
margin-inline-start: 5px;
margin-top: -1px;
}
.theme-toggle svg {
vertical-align: middle;
height: 1rem;
width: 1rem;
display: none;
}
/*
Fully hide screen reader text so we only show the one matching the current
theme.
*/
.theme-toggle .visually-hidden {
display: none;
}
html[data-theme="auto"] .theme-toggle .theme-label-when-auto {
display: block;
}
html[data-theme="dark"] .theme-toggle .theme-label-when-dark {
display: block;
}
html[data-theme="light"] .theme-toggle .theme-label-when-light {
display: block;
}
/* ICONS */
.theme-toggle svg.theme-icon-when-auto,
.theme-toggle svg.theme-icon-when-dark,
.theme-toggle svg.theme-icon-when-light {
fill: var(--header-link-color);
color: var(--header-bg);
}
html[data-theme="auto"] .theme-toggle svg.theme-icon-when-auto {
display: block;
}
html[data-theme="dark"] .theme-toggle svg.theme-icon-when-dark {
display: block;
}
html[data-theme="light"] .theme-toggle svg.theme-icon-when-light {
display: block;
}

View File

@ -0,0 +1,29 @@
/* DASHBOARD */
.dashboard td, .dashboard th {
word-break: break-word;
}
.dashboard .module table th {
width: 100%;
}
.dashboard .module table td {
white-space: nowrap;
}
.dashboard .module table td a {
display: block;
padding-right: .6em;
}
/* RECENT ACTIONS MODULE */
.module ul.actionlist {
margin-left: 0;
}
ul.actionlist li {
list-style-type: none;
overflow: hidden;
text-overflow: ellipsis;
}

View File

@ -0,0 +1,512 @@
@import url('widgets.css');
/* FORM ROWS */
.form-row {
overflow: hidden;
padding: 10px;
font-size: 0.8125rem;
border-bottom: 1px solid var(--hairline-color);
}
.form-row img, .form-row input {
vertical-align: middle;
}
.form-row label input[type="checkbox"] {
margin-top: 0;
vertical-align: 0;
}
form .form-row p {
padding-left: 0;
}
.flex-container {
display: flex;
}
.form-multiline {
flex-wrap: wrap;
}
.form-multiline > div {
padding-bottom: 10px;
}
/* FORM LABELS */
label {
font-weight: normal;
color: var(--body-quiet-color);
font-size: 0.8125rem;
}
.required label, label.required {
font-weight: bold;
}
/* RADIO BUTTONS */
form div.radiolist div {
padding-right: 7px;
}
form div.radiolist.inline div {
display: inline-block;
}
form div.radiolist label {
width: auto;
}
form div.radiolist input[type="radio"] {
margin: -2px 4px 0 0;
padding: 0;
}
form ul.inline {
margin-left: 0;
padding: 0;
}
form ul.inline li {
float: left;
padding-right: 7px;
}
/* FIELDSETS */
fieldset .fieldset-heading,
fieldset .inline-heading,
:not(.inline-related) .collapse summary {
border: 1px solid var(--header-bg);
margin: 0;
padding: 8px;
font-weight: 400;
font-size: 0.8125rem;
background: var(--header-bg);
color: var(--header-link-color);
}
/* ALIGNED FIELDSETS */
.aligned label {
display: block;
padding: 4px 10px 0 0;
min-width: 160px;
width: 160px;
word-wrap: break-word;
}
.aligned label:not(.vCheckboxLabel):after {
content: '';
display: inline-block;
vertical-align: middle;
}
.aligned label + p, .aligned .checkbox-row + div.help, .aligned label + div.readonly {
padding: 6px 0;
margin-top: 0;
margin-bottom: 0;
margin-left: 0;
overflow-wrap: break-word;
}
.aligned ul label {
display: inline;
float: none;
width: auto;
}
.aligned .form-row input {
margin-bottom: 0;
}
.colMS .aligned .vLargeTextField, .colMS .aligned .vXMLLargeTextField {
width: 350px;
}
form .aligned ul {
margin-left: 160px;
padding-left: 10px;
}
form .aligned div.radiolist {
display: inline-block;
margin: 0;
padding: 0;
}
form .aligned p.help,
form .aligned div.help {
margin-top: 0;
margin-left: 160px;
padding-left: 10px;
}
form .aligned p.date div.help.timezonewarning,
form .aligned p.datetime div.help.timezonewarning,
form .aligned p.time div.help.timezonewarning {
margin-left: 0;
padding-left: 0;
font-weight: normal;
}
form .aligned p.help:last-child,
form .aligned div.help:last-child {
margin-bottom: 0;
padding-bottom: 0;
}
form .aligned input + p.help,
form .aligned textarea + p.help,
form .aligned select + p.help,
form .aligned input + div.help,
form .aligned textarea + div.help,
form .aligned select + div.help {
margin-left: 160px;
padding-left: 10px;
}
form .aligned select option:checked {
background-color: var(--selected-row);
}
form .aligned ul li {
list-style: none;
}
form .aligned table p {
margin-left: 0;
padding-left: 0;
}
.aligned .vCheckboxLabel {
padding: 1px 0 0 5px;
}
.aligned .vCheckboxLabel + p.help,
.aligned .vCheckboxLabel + div.help {
margin-top: -4px;
}
.colM .aligned .vLargeTextField, .colM .aligned .vXMLLargeTextField {
width: 610px;
}
fieldset .fieldBox {
margin-right: 20px;
}
/* WIDE FIELDSETS */
.wide label {
width: 200px;
}
form .wide p.help,
form .wide ul.errorlist,
form .wide div.help {
padding-left: 50px;
}
form div.help ul {
padding-left: 0;
margin-left: 0;
}
.colM fieldset.wide .vLargeTextField, .colM fieldset.wide .vXMLLargeTextField {
width: 450px;
}
/* COLLAPSIBLE FIELDSETS */
.collapse summary .fieldset-heading,
.collapse summary .inline-heading {
background: transparent;
border: none;
color: currentColor;
display: inline;
margin: 0;
padding: 0;
}
/* MONOSPACE TEXTAREAS */
fieldset.monospace textarea {
font-family: var(--font-family-monospace);
}
/* SUBMIT ROW */
.submit-row {
padding: 12px 14px 12px;
margin: 0 0 20px;
background: var(--darkened-bg);
border: 1px solid var(--hairline-color);
border-radius: 4px;
overflow: hidden;
display: flex;
gap: 10px;
flex-wrap: wrap;
}
body.popup .submit-row {
overflow: auto;
}
.submit-row input {
height: 2.1875rem;
line-height: 0.9375rem;
}
.submit-row input, .submit-row a {
margin: 0;
}
.submit-row input.default {
text-transform: uppercase;
}
.submit-row a.deletelink {
margin-left: auto;
}
.submit-row a.deletelink {
display: block;
background: var(--delete-button-bg);
border-radius: 4px;
padding: 0.625rem 0.9375rem;
height: 0.9375rem;
line-height: 0.9375rem;
color: var(--button-fg);
}
.submit-row a.closelink {
display: inline-block;
background: var(--close-button-bg);
border-radius: 4px;
padding: 10px 15px;
height: 0.9375rem;
line-height: 0.9375rem;
color: var(--button-fg);
}
.submit-row a.deletelink:focus,
.submit-row a.deletelink:hover,
.submit-row a.deletelink:active {
background: var(--delete-button-hover-bg);
text-decoration: none;
}
.submit-row a.closelink:focus,
.submit-row a.closelink:hover,
.submit-row a.closelink:active {
background: var(--close-button-hover-bg);
text-decoration: none;
}
/* CUSTOM FORM FIELDS */
.vSelectMultipleField {
vertical-align: top;
}
.vCheckboxField {
border: none;
}
.vDateField, .vTimeField {
margin-right: 2px;
margin-bottom: 4px;
}
.vDateField {
min-width: 6.85em;
}
.vTimeField {
min-width: 4.7em;
}
.vURLField {
width: 30em;
}
.vLargeTextField, .vXMLLargeTextField {
width: 48em;
}
.flatpages-flatpage #id_content {
height: 40.2em;
}
.module table .vPositiveSmallIntegerField {
width: 2.2em;
}
.vIntegerField {
width: 5em;
}
.vBigIntegerField {
width: 10em;
}
.vForeignKeyRawIdAdminField {
width: 5em;
}
.vTextField, .vUUIDField {
width: 20em;
}
/* INLINES */
.inline-group {
padding: 0;
margin: 0 0 30px;
}
.inline-group thead th {
padding: 8px 10px;
}
.inline-group .aligned label {
width: 160px;
}
.inline-related {
position: relative;
}
.inline-related h4,
.inline-related:not(.tabular) .collapse summary {
margin: 0;
color: var(--body-medium-color);
padding: 5px;
font-size: 0.8125rem;
background: var(--darkened-bg);
border: 1px solid var(--hairline-color);
border-left-color: var(--darkened-bg);
border-right-color: var(--darkened-bg);
}
.inline-related h3 span.delete {
float: right;
}
.inline-related h3 span.delete label {
margin-left: 2px;
font-size: 0.6875rem;
}
.inline-related fieldset {
margin: 0;
background: var(--body-bg);
border: none;
width: 100%;
}
.inline-group .tabular fieldset.module {
border: none;
}
.inline-related.tabular fieldset.module table {
width: 100%;
overflow-x: scroll;
}
.last-related fieldset {
border: none;
}
.inline-group .tabular tr.has_original td {
padding-top: 2em;
}
.inline-group .tabular tr td.original {
padding: 2px 0 0 0;
width: 0;
_position: relative;
}
.inline-group .tabular th.original {
width: 0px;
padding: 0;
}
.inline-group .tabular td.original p {
position: absolute;
left: 0;
height: 1.1em;
padding: 2px 9px;
overflow: hidden;
font-size: 0.5625rem;
font-weight: bold;
color: var(--body-quiet-color);
_width: 700px;
}
.inline-group ul.tools {
padding: 0;
margin: 0;
list-style: none;
}
.inline-group ul.tools li {
display: inline;
padding: 0 5px;
}
.inline-group div.add-row,
.inline-group .tabular tr.add-row td {
color: var(--body-quiet-color);
background: var(--darkened-bg);
padding: 8px 10px;
border-bottom: 1px solid var(--hairline-color);
}
.inline-group .tabular tr.add-row td {
padding: 8px 10px;
border-bottom: 1px solid var(--hairline-color);
}
.inline-group ul.tools a.add,
.inline-group div.add-row a,
.inline-group .tabular tr.add-row td a {
background: url(../img/icon-addlink.svg) 0 1px no-repeat;
padding-left: 16px;
font-size: 0.75rem;
}
.empty-form {
display: none;
}
/* RELATED FIELD ADD ONE / LOOKUP */
.related-lookup {
margin-left: 5px;
display: inline-block;
vertical-align: middle;
background-repeat: no-repeat;
background-size: 14px;
}
.related-lookup {
width: 1rem;
height: 1rem;
background-image: url(../img/search.svg);
}
form .related-widget-wrapper ul {
display: inline-block;
margin-left: 0;
padding-left: 0;
}
.clearable-file-input input {
margin-top: 0;
}

View File

@ -0,0 +1,61 @@
/* LOGIN FORM */
.login {
background: var(--darkened-bg);
height: auto;
}
.login #header {
height: auto;
padding: 15px 16px;
justify-content: center;
}
.login #header h1 {
font-size: 1.125rem;
margin: 0;
}
.login #header h1 a {
color: var(--header-link-color);
}
.login #content {
padding: 20px;
}
.login #container {
background: var(--body-bg);
border: 1px solid var(--hairline-color);
border-radius: 4px;
overflow: hidden;
width: 28em;
min-width: 300px;
margin: 100px auto;
height: auto;
}
.login .form-row {
padding: 4px 0;
}
.login .form-row label {
display: block;
line-height: 2em;
}
.login .form-row #id_username, .login .form-row #id_password {
padding: 8px;
width: 100%;
box-sizing: border-box;
}
.login .submit-row {
padding: 1em 0 0 0;
margin: 0;
text-align: center;
}
.login .password-reset-link {
text-align: center;
}

View File

@ -0,0 +1,150 @@
.sticky {
position: sticky;
top: 0;
max-height: 100vh;
}
.toggle-nav-sidebar {
z-index: 20;
left: 0;
display: flex;
align-items: center;
justify-content: center;
flex: 0 0 23px;
width: 23px;
border: 0;
border-right: 1px solid var(--hairline-color);
background-color: var(--body-bg);
cursor: pointer;
font-size: 1.25rem;
color: var(--link-fg);
padding: 0;
}
[dir="rtl"] .toggle-nav-sidebar {
border-left: 1px solid var(--hairline-color);
border-right: 0;
}
.toggle-nav-sidebar:hover,
.toggle-nav-sidebar:focus {
background-color: var(--darkened-bg);
}
#nav-sidebar {
z-index: 15;
flex: 0 0 275px;
left: -276px;
margin-left: -276px;
border-top: 1px solid transparent;
border-right: 1px solid var(--hairline-color);
background-color: var(--body-bg);
overflow: auto;
}
[dir="rtl"] #nav-sidebar {
border-left: 1px solid var(--hairline-color);
border-right: 0;
left: 0;
margin-left: 0;
right: -276px;
margin-right: -276px;
}
.toggle-nav-sidebar::before {
content: '\00BB';
}
.main.shifted .toggle-nav-sidebar::before {
content: '\00AB';
}
.main > #nav-sidebar {
visibility: hidden;
}
.main.shifted > #nav-sidebar {
margin-left: 0;
visibility: visible;
}
[dir="rtl"] .main.shifted > #nav-sidebar {
margin-right: 0;
}
#nav-sidebar .module th {
width: 100%;
overflow-wrap: anywhere;
}
#nav-sidebar .module th,
#nav-sidebar .module caption {
padding-left: 16px;
}
#nav-sidebar .module td {
white-space: nowrap;
}
[dir="rtl"] #nav-sidebar .module th,
[dir="rtl"] #nav-sidebar .module caption {
padding-left: 8px;
padding-right: 16px;
}
#nav-sidebar .current-app .section:link,
#nav-sidebar .current-app .section:visited {
color: var(--header-color);
font-weight: bold;
}
#nav-sidebar .current-model {
background: var(--selected-row);
}
@media (forced-colors: active) {
#nav-sidebar .current-model {
background-color: SelectedItem;
}
}
.main > #nav-sidebar + .content {
max-width: calc(100% - 23px);
}
.main.shifted > #nav-sidebar + .content {
max-width: calc(100% - 299px);
}
@media (max-width: 767px) {
#nav-sidebar, #toggle-nav-sidebar {
display: none;
}
.main > #nav-sidebar + .content,
.main.shifted > #nav-sidebar + .content {
max-width: 100%;
}
}
#nav-filter {
width: 100%;
box-sizing: border-box;
padding: 2px 5px;
margin: 5px 0;
border: 1px solid var(--border-color);
background-color: var(--darkened-bg);
color: var(--body-fg);
}
#nav-filter:focus {
border-color: var(--body-quiet-color);
}
#nav-filter.no-results {
background: var(--message-error-bg);
}
#nav-sidebar table {
width: 100%;
}

View File

@ -0,0 +1,967 @@
/* Tablets */
input[type="submit"], button {
-webkit-appearance: none;
appearance: none;
}
@media (max-width: 1024px) {
/* Basic */
html {
-webkit-text-size-adjust: 100%;
}
td, th {
padding: 10px;
font-size: 0.875rem;
}
.small {
font-size: 0.75rem;
}
/* Layout */
#container {
min-width: 0;
}
#content {
padding: 15px 20px 20px;
}
div.breadcrumbs {
padding: 10px 30px;
}
/* Header */
#header {
flex-direction: column;
padding: 15px 30px;
justify-content: flex-start;
}
#site-name {
margin: 0 0 8px;
line-height: 1.2;
}
#user-tools {
margin: 0;
font-weight: 400;
line-height: 1.85;
text-align: left;
}
#user-tools a {
display: inline-block;
line-height: 1.4;
}
/* Dashboard */
.dashboard #content {
width: auto;
}
#content-related {
margin-right: -290px;
}
.colSM #content-related {
margin-left: -290px;
}
.colMS {
margin-right: 290px;
}
.colSM {
margin-left: 290px;
}
.dashboard .module table td a {
padding-right: 0;
}
td .changelink, td .addlink {
font-size: 0.8125rem;
}
/* Changelist */
#toolbar {
border: none;
padding: 15px;
}
#changelist-search > div {
display: flex;
flex-wrap: nowrap;
max-width: 480px;
}
#changelist-search label {
line-height: 1.375rem;
}
#toolbar form #searchbar {
flex: 1 0 auto;
width: 0;
height: 1.375rem;
margin: 0 10px 0 6px;
}
#toolbar form input[type=submit] {
flex: 0 1 auto;
}
#changelist-search .quiet {
width: 0;
flex: 1 0 auto;
margin: 5px 0 0 25px;
}
#changelist .actions {
display: flex;
flex-wrap: wrap;
padding: 15px 0;
}
#changelist .actions label {
display: flex;
}
#changelist .actions select {
background: var(--body-bg);
}
#changelist .actions .button {
min-width: 48px;
margin: 0 10px;
}
#changelist .actions span.all,
#changelist .actions span.clear,
#changelist .actions span.question,
#changelist .actions span.action-counter {
font-size: 0.6875rem;
margin: 0 10px 0 0;
}
#changelist-filter {
flex-basis: 200px;
}
.change-list .filtered .results,
.change-list .filtered .paginator,
.filtered #toolbar,
.filtered .actions,
#changelist .paginator {
border-top-color: var(--hairline-color); /* XXX Is this used at all? */
}
#changelist .results + .paginator {
border-top: none;
}
/* Forms */
label {
font-size: 1rem;
}
/*
Minifiers remove the default (text) "type" attribute from "input" HTML
tags. Add input:not([type]) to make the CSS stylesheet work the same.
*/
.form-row input:not([type]),
.form-row input[type=text],
.form-row input[type=password],
.form-row input[type=email],
.form-row input[type=url],
.form-row input[type=tel],
.form-row input[type=number],
.form-row textarea,
.form-row select,
.form-row .vTextField {
box-sizing: border-box;
margin: 0;
padding: 6px 8px;
min-height: 2.25rem;
font-size: 1rem;
}
.form-row select {
height: 2.25rem;
}
.form-row select[multiple] {
height: auto;
min-height: 0;
}
fieldset .fieldBox + .fieldBox {
margin-top: 10px;
padding-top: 10px;
border-top: 1px solid var(--hairline-color);
}
textarea {
max-width: 100%;
max-height: 120px;
}
.aligned label {
padding-top: 6px;
}
.aligned .related-lookup,
.aligned .datetimeshortcuts,
.aligned .related-lookup + strong {
align-self: center;
margin-left: 15px;
}
form .aligned div.radiolist {
margin-left: 2px;
}
.submit-row {
padding: 8px;
}
.submit-row a.deletelink {
padding: 10px 7px;
}
.button, input[type=submit], input[type=button], .submit-row input, a.button {
padding: 7px;
}
/* Selector */
.selector {
display: flex;
width: 100%;
}
.selector .selector-filter {
display: flex;
align-items: center;
}
.selector .selector-filter label {
margin: 0 8px 0 0;
}
.selector .selector-filter input {
width: 100%;
min-height: 0;
flex: 1 1;
}
.selector-available, .selector-chosen {
width: auto;
flex: 1 1;
display: flex;
flex-direction: column;
}
.selector select {
width: 100%;
flex: 1 0 auto;
margin-bottom: 5px;
}
.selector ul.selector-chooser {
width: 26px;
height: 52px;
padding: 2px 0;
border-radius: 20px;
transform: translateY(-10px);
}
.selector-add, .selector-remove {
width: 20px;
height: 20px;
background-size: 20px auto;
}
.selector-add {
background-position: 0 -120px;
}
.selector-remove {
background-position: 0 -80px;
}
a.selector-chooseall, a.selector-clearall {
align-self: center;
}
.stacked {
flex-direction: column;
max-width: 480px;
}
.stacked > * {
flex: 0 1 auto;
}
.stacked select {
margin-bottom: 0;
}
.stacked .selector-available, .stacked .selector-chosen {
width: auto;
}
.stacked ul.selector-chooser {
width: 52px;
height: 26px;
padding: 0 2px;
transform: none;
}
.stacked .selector-chooser li {
padding: 3px;
}
.stacked .selector-add, .stacked .selector-remove {
background-size: 20px auto;
}
.stacked .selector-add {
background-position: 0 -40px;
}
.stacked .active.selector-add {
background-position: 0 -40px;
}
.active.selector-add:focus, .active.selector-add:hover {
background-position: 0 -140px;
}
.stacked .active.selector-add:focus, .stacked .active.selector-add:hover {
background-position: 0 -60px;
}
.stacked .selector-remove {
background-position: 0 0;
}
.stacked .active.selector-remove {
background-position: 0 0;
}
.active.selector-remove:focus, .active.selector-remove:hover {
background-position: 0 -100px;
}
.stacked .active.selector-remove:focus, .stacked .active.selector-remove:hover {
background-position: 0 -20px;
}
.help-tooltip, .selector .help-icon {
display: none;
}
.datetime input {
width: 50%;
max-width: 120px;
}
.datetime span {
font-size: 0.8125rem;
}
.datetime .timezonewarning {
display: block;
font-size: 0.6875rem;
color: var(--body-quiet-color);
}
.datetimeshortcuts {
color: var(--border-color); /* XXX Redundant, .datetime span also sets #ccc */
}
.form-row .datetime input.vDateField, .form-row .datetime input.vTimeField {
width: 75%;
}
.inline-group {
overflow: auto;
}
/* Messages */
ul.messagelist li {
padding-left: 55px;
background-position: 30px 12px;
}
ul.messagelist li.error {
background-position: 30px 12px;
}
ul.messagelist li.warning {
background-position: 30px 14px;
}
/* Login */
.login #header {
padding: 15px 20px;
}
.login #site-name {
margin: 0;
}
/* GIS */
div.olMap {
max-width: calc(100vw - 30px);
max-height: 300px;
}
.olMap + .clear_features {
display: block;
margin-top: 10px;
}
/* Docs */
.module table.xfull {
width: 100%;
}
pre.literal-block {
overflow: auto;
}
}
/* Mobile */
@media (max-width: 767px) {
/* Layout */
#header, #content {
padding: 15px;
}
div.breadcrumbs {
padding: 10px 15px;
}
/* Dashboard */
.colMS, .colSM {
margin: 0;
}
#content-related, .colSM #content-related {
width: 100%;
margin: 0;
}
#content-related .module {
margin-bottom: 0;
}
#content-related .module h2 {
padding: 10px 15px;
font-size: 1rem;
}
/* Changelist */
#changelist {
align-items: stretch;
flex-direction: column;
}
#toolbar {
padding: 10px;
}
#changelist-filter {
margin-left: 0;
}
#changelist .actions label {
flex: 1 1;
}
#changelist .actions select {
flex: 1 0;
width: 100%;
}
#changelist .actions span {
flex: 1 0 100%;
}
#changelist-filter {
position: static;
width: auto;
margin-top: 30px;
}
.object-tools {
float: none;
margin: 0 0 15px;
padding: 0;
overflow: hidden;
}
.object-tools li {
height: auto;
margin-left: 0;
}
.object-tools li + li {
margin-left: 15px;
}
/* Forms */
.form-row {
padding: 15px 0;
}
.aligned .form-row,
.aligned .form-row > div {
max-width: 100vw;
}
.aligned .form-row > div {
width: calc(100vw - 30px);
}
.flex-container {
flex-flow: column;
}
.flex-container.checkbox-row {
flex-flow: row;
}
textarea {
max-width: none;
}
.vURLField {
width: auto;
}
fieldset .fieldBox + .fieldBox {
margin-top: 15px;
padding-top: 15px;
}
.aligned label {
width: 100%;
min-width: auto;
padding: 0 0 10px;
}
.aligned label:after {
max-height: 0;
}
.aligned .form-row input,
.aligned .form-row select,
.aligned .form-row textarea {
flex: 1 1 auto;
max-width: 100%;
}
.aligned .checkbox-row input {
flex: 0 1 auto;
margin: 0;
}
.aligned .vCheckboxLabel {
flex: 1 0;
padding: 1px 0 0 5px;
}
.aligned label + p,
.aligned label + div.help,
.aligned label + div.readonly {
padding: 0;
margin-left: 0;
}
.aligned p.file-upload {
font-size: 0.8125rem;
}
span.clearable-file-input {
margin-left: 15px;
}
span.clearable-file-input label {
font-size: 0.8125rem;
padding-bottom: 0;
}
.aligned .timezonewarning {
flex: 1 0 100%;
margin-top: 5px;
}
form .aligned .form-row div.help {
width: 100%;
margin: 5px 0 0;
padding: 0;
}
form .aligned ul,
form .aligned ul.errorlist {
margin-left: 0;
padding-left: 0;
}
form .aligned div.radiolist {
margin-top: 5px;
margin-right: 15px;
margin-bottom: -3px;
}
form .aligned div.radiolist:not(.inline) div + div {
margin-top: 5px;
}
/* Related widget */
.related-widget-wrapper {
width: 100%;
display: flex;
align-items: flex-start;
}
.related-widget-wrapper .selector {
order: 1;
}
.related-widget-wrapper > a {
order: 2;
}
.related-widget-wrapper .radiolist ~ a {
align-self: flex-end;
}
.related-widget-wrapper > select ~ a {
align-self: center;
}
/* Selector */
.selector {
flex-direction: column;
gap: 10px 0;
}
.selector-available, .selector-chosen {
flex: 1 1 auto;
}
.selector select {
max-height: 96px;
}
.selector ul.selector-chooser {
display: block;
width: 52px;
height: 26px;
padding: 0 2px;
transform: none;
}
.selector ul.selector-chooser li {
float: left;
}
.selector-remove {
background-position: 0 0;
}
.active.selector-remove:focus, .active.selector-remove:hover {
background-position: 0 -20px;
}
.selector-add {
background-position: 0 -40px;
}
.active.selector-add:focus, .active.selector-add:hover {
background-position: 0 -60px;
}
/* Inlines */
.inline-group[data-inline-type="stacked"] .inline-related {
border: 1px solid var(--hairline-color);
border-radius: 4px;
margin-top: 15px;
overflow: auto;
}
.inline-group[data-inline-type="stacked"] .inline-related > * {
box-sizing: border-box;
}
.inline-group[data-inline-type="stacked"] .inline-related .module {
padding: 0 10px;
}
.inline-group[data-inline-type="stacked"] .inline-related .module .form-row {
border-top: 1px solid var(--hairline-color);
border-bottom: none;
}
.inline-group[data-inline-type="stacked"] .inline-related .module .form-row:first-child {
border-top: none;
}
.inline-group[data-inline-type="stacked"] .inline-related h3 {
padding: 10px;
border-top-width: 0;
border-bottom-width: 2px;
display: flex;
flex-wrap: wrap;
align-items: center;
}
.inline-group[data-inline-type="stacked"] .inline-related h3 .inline_label {
margin-right: auto;
}
.inline-group[data-inline-type="stacked"] .inline-related h3 span.delete {
float: none;
flex: 1 1 100%;
margin-top: 5px;
}
.inline-group[data-inline-type="stacked"] .aligned .form-row > div:not([class]) {
width: 100%;
}
.inline-group[data-inline-type="stacked"] .aligned label {
width: 100%;
}
.inline-group[data-inline-type="stacked"] div.add-row {
margin-top: 15px;
border: 1px solid var(--hairline-color);
border-radius: 4px;
}
.inline-group div.add-row,
.inline-group .tabular tr.add-row td {
padding: 0;
}
.inline-group div.add-row a,
.inline-group .tabular tr.add-row td a {
display: block;
padding: 8px 10px 8px 26px;
background-position: 8px 9px;
}
/* Submit row */
.submit-row {
padding: 10px;
margin: 0 0 15px;
flex-direction: column;
gap: 8px;
}
.submit-row input, .submit-row input.default, .submit-row a {
text-align: center;
}
.submit-row a.closelink {
padding: 10px 0;
text-align: center;
}
.submit-row a.deletelink {
margin: 0;
}
/* Messages */
ul.messagelist li {
padding-left: 40px;
background-position: 15px 12px;
}
ul.messagelist li.error {
background-position: 15px 12px;
}
ul.messagelist li.warning {
background-position: 15px 14px;
}
/* Paginator */
.paginator .this-page, .paginator a:link, .paginator a:visited {
padding: 4px 10px;
}
/* Login */
body.login {
padding: 0 15px;
}
.login #container {
width: auto;
max-width: 480px;
margin: 50px auto;
}
.login #header,
.login #content {
padding: 15px;
}
.login #content-main {
float: none;
}
.login .form-row {
padding: 0;
}
.login .form-row + .form-row {
margin-top: 15px;
}
.login .form-row label {
margin: 0 0 5px;
line-height: 1.2;
}
.login .submit-row {
padding: 15px 0 0;
}
.login br {
display: none;
}
.login .submit-row input {
margin: 0;
text-transform: uppercase;
}
.errornote {
margin: 0 0 20px;
padding: 8px 12px;
font-size: 0.8125rem;
}
/* Calendar and clock */
.calendarbox, .clockbox {
position: fixed !important;
top: 50% !important;
left: 50% !important;
transform: translate(-50%, -50%);
margin: 0;
border: none;
overflow: visible;
}
.calendarbox:before, .clockbox:before {
content: '';
position: fixed;
top: 50%;
left: 50%;
width: 100vw;
height: 100vh;
background: rgba(0, 0, 0, 0.75);
transform: translate(-50%, -50%);
}
.calendarbox > *, .clockbox > * {
position: relative;
z-index: 1;
}
.calendarbox > div:first-child {
z-index: 2;
}
.calendarbox .calendar, .clockbox h2 {
border-radius: 4px 4px 0 0;
overflow: hidden;
}
.calendarbox .calendar-cancel, .clockbox .calendar-cancel {
border-radius: 0 0 4px 4px;
overflow: hidden;
}
.calendar-shortcuts {
padding: 10px 0;
font-size: 0.75rem;
line-height: 0.75rem;
}
.calendar-shortcuts a {
margin: 0 4px;
}
.timelist a {
background: var(--body-bg);
padding: 4px;
}
.calendar-cancel {
padding: 8px 10px;
}
.clockbox h2 {
padding: 8px 15px;
}
.calendar caption {
padding: 10px;
}
.calendarbox .calendarnav-previous, .calendarbox .calendarnav-next {
z-index: 1;
top: 10px;
}
/* History */
table#change-history tbody th, table#change-history tbody td {
font-size: 0.8125rem;
word-break: break-word;
}
table#change-history tbody th {
width: auto;
}
/* Docs */
table.model tbody th, table.model tbody td {
font-size: 0.8125rem;
word-break: break-word;
}
}

View File

@ -0,0 +1,111 @@
/* TABLETS */
@media (max-width: 1024px) {
[dir="rtl"] .colMS {
margin-right: 0;
}
[dir="rtl"] #user-tools {
text-align: right;
}
[dir="rtl"] #changelist .actions label {
padding-left: 10px;
padding-right: 0;
}
[dir="rtl"] #changelist .actions select {
margin-left: 0;
margin-right: 15px;
}
[dir="rtl"] .change-list .filtered .results,
[dir="rtl"] .change-list .filtered .paginator,
[dir="rtl"] .filtered #toolbar,
[dir="rtl"] .filtered div.xfull,
[dir="rtl"] .filtered .actions,
[dir="rtl"] #changelist-filter {
margin-left: 0;
}
[dir="rtl"] .inline-group ul.tools a.add,
[dir="rtl"] .inline-group div.add-row a,
[dir="rtl"] .inline-group .tabular tr.add-row td a {
padding: 8px 26px 8px 10px;
background-position: calc(100% - 8px) 9px;
}
[dir="rtl"] .selector .selector-filter label {
margin-right: 0;
margin-left: 8px;
}
[dir="rtl"] .object-tools li {
float: right;
}
[dir="rtl"] .object-tools li + li {
margin-left: 0;
margin-right: 15px;
}
[dir="rtl"] .dashboard .module table td a {
padding-left: 0;
padding-right: 16px;
}
[dir="rtl"] .selector-add {
background-position: 0 -80px;
}
[dir="rtl"] .selector-remove {
background-position: 0 -120px;
}
[dir="rtl"] .active.selector-add:focus, .active.selector-add:hover {
background-position: 0 -100px;
}
[dir="rtl"] .active.selector-remove:focus, .active.selector-remove:hover {
background-position: 0 -140px;
}
}
/* MOBILE */
@media (max-width: 767px) {
[dir="rtl"] .aligned .related-lookup,
[dir="rtl"] .aligned .datetimeshortcuts {
margin-left: 0;
margin-right: 15px;
}
[dir="rtl"] .aligned ul,
[dir="rtl"] form .aligned ul.errorlist {
margin-right: 0;
}
[dir="rtl"] #changelist-filter {
margin-left: 0;
margin-right: 0;
}
[dir="rtl"] .aligned .vCheckboxLabel {
padding: 1px 5px 0 0;
}
[dir="rtl"] .selector-remove {
background-position: 0 0;
}
[dir="rtl"] .active.selector-remove:focus, .active.selector-remove:hover {
background-position: 0 -20px;
}
[dir="rtl"] .selector-add {
background-position: 0 -40px;
}
[dir="rtl"] .active.selector-add:focus, .active.selector-add:hover {
background-position: 0 -60px;
}
}

View File

@ -0,0 +1,291 @@
/* GLOBAL */
th {
text-align: right;
}
.module h2, .module caption {
text-align: right;
}
.module ul, .module ol {
margin-left: 0;
margin-right: 1.5em;
}
.viewlink, .addlink, .changelink, .hidelink {
padding-left: 0;
padding-right: 16px;
background-position: 100% 1px;
}
.deletelink {
padding-left: 0;
padding-right: 16px;
background-position: 100% 1px;
}
.object-tools {
float: left;
}
thead th:first-child,
tfoot td:first-child {
border-left: none;
}
/* LAYOUT */
#user-tools {
right: auto;
left: 0;
text-align: left;
}
div.breadcrumbs {
text-align: right;
}
#content-main {
float: right;
}
#content-related {
float: left;
margin-left: -300px;
margin-right: auto;
}
.colMS {
margin-left: 300px;
margin-right: 0;
}
/* SORTABLE TABLES */
table thead th.sorted .sortoptions {
float: left;
}
thead th.sorted .text {
padding-right: 0;
padding-left: 42px;
}
/* dashboard styles */
.dashboard .module table td a {
padding-left: .6em;
padding-right: 16px;
}
/* changelists styles */
.change-list .filtered table {
border-left: none;
border-right: 0px none;
}
#changelist-filter {
border-left: none;
border-right: none;
margin-left: 0;
margin-right: 30px;
}
#changelist-filter li.selected {
border-left: none;
padding-left: 10px;
margin-left: 0;
border-right: 5px solid var(--hairline-color);
padding-right: 10px;
margin-right: -15px;
}
#changelist table tbody td:first-child, #changelist table tbody th:first-child {
border-right: none;
border-left: none;
}
.paginator .end {
margin-left: 6px;
margin-right: 0;
}
.paginator input {
margin-left: 0;
margin-right: auto;
}
/* FORMS */
.aligned label {
padding: 0 0 3px 1em;
}
.submit-row a.deletelink {
margin-left: 0;
margin-right: auto;
}
.vDateField, .vTimeField {
margin-left: 2px;
}
.aligned .form-row input {
margin-left: 5px;
}
form .aligned ul {
margin-right: 163px;
padding-right: 10px;
margin-left: 0;
padding-left: 0;
}
form ul.inline li {
float: right;
padding-right: 0;
padding-left: 7px;
}
form .aligned p.help,
form .aligned div.help {
margin-left: 0;
margin-right: 160px;
padding-right: 10px;
}
form div.help ul,
form .aligned .checkbox-row + .help,
form .aligned p.date div.help.timezonewarning,
form .aligned p.datetime div.help.timezonewarning,
form .aligned p.time div.help.timezonewarning {
margin-right: 0;
padding-right: 0;
}
form .wide p.help,
form .wide ul.errorlist,
form .wide div.help {
padding-left: 0;
padding-right: 50px;
}
.submit-row {
text-align: right;
}
fieldset .fieldBox {
margin-left: 20px;
margin-right: 0;
}
.errorlist li {
background-position: 100% 12px;
padding: 0;
}
.errornote {
background-position: 100% 12px;
padding: 10px 12px;
}
/* WIDGETS */
.calendarnav-previous {
top: 0;
left: auto;
right: 10px;
background: url(../img/calendar-icons.svg) 0 -15px no-repeat;
}
.calendarnav-next {
top: 0;
right: auto;
left: 10px;
background: url(../img/calendar-icons.svg) 0 0 no-repeat;
}
.calendar caption, .calendarbox h2 {
text-align: center;
}
.selector {
float: right;
}
.selector .selector-filter {
text-align: right;
}
.selector-add {
background: url(../img/selector-icons.svg) 0 -64px no-repeat;
}
.active.selector-add:focus, .active.selector-add:hover {
background-position: 0 -80px;
}
.selector-remove {
background: url(../img/selector-icons.svg) 0 -96px no-repeat;
}
.active.selector-remove:focus, .active.selector-remove:hover {
background-position: 0 -112px;
}
a.selector-chooseall {
background: url(../img/selector-icons.svg) right -128px no-repeat;
}
a.active.selector-chooseall:focus, a.active.selector-chooseall:hover {
background-position: 100% -144px;
}
a.selector-clearall {
background: url(../img/selector-icons.svg) 0 -160px no-repeat;
}
a.active.selector-clearall:focus, a.active.selector-clearall:hover {
background-position: 0 -176px;
}
.inline-deletelink {
float: left;
}
form .form-row p.datetime {
overflow: hidden;
}
.related-widget-wrapper {
float: right;
}
/* MISC */
.inline-related h2, .inline-group h2 {
text-align: right
}
.inline-related h3 span.delete {
padding-right: 20px;
padding-left: inherit;
left: 10px;
right: inherit;
float:left;
}
.inline-related h3 span.delete label {
margin-left: inherit;
margin-right: 2px;
}
.inline-group .tabular td.original p {
right: 0;
}
.selector .selector-chooser {
margin: 0;
}

View File

@ -0,0 +1,19 @@
/* Hide warnings fields if usable password is selected */
form:has(#id_usable_password input[value="true"]:checked) .messagelist {
display: none;
}
/* Hide password fields if unusable password is selected */
form:has(#id_usable_password input[value="false"]:checked) .field-password1,
form:has(#id_usable_password input[value="false"]:checked) .field-password2 {
display: none;
}
/* Select appropriate submit button */
form:has(#id_usable_password input[value="true"]:checked) input[type="submit"].unset-password {
display: none;
}
form:has(#id_usable_password input[value="false"]:checked) input[type="submit"].set-password {
display: none;
}

View File

@ -0,0 +1,21 @@
The MIT License (MIT)
Copyright (c) 2012-2017 Kevin Brown, Igor Vaynberg, and Select2 contributors
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

View File

@ -0,0 +1,481 @@
.select2-container {
box-sizing: border-box;
display: inline-block;
margin: 0;
position: relative;
vertical-align: middle; }
.select2-container .select2-selection--single {
box-sizing: border-box;
cursor: pointer;
display: block;
height: 28px;
user-select: none;
-webkit-user-select: none; }
.select2-container .select2-selection--single .select2-selection__rendered {
display: block;
padding-left: 8px;
padding-right: 20px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap; }
.select2-container .select2-selection--single .select2-selection__clear {
position: relative; }
.select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered {
padding-right: 8px;
padding-left: 20px; }
.select2-container .select2-selection--multiple {
box-sizing: border-box;
cursor: pointer;
display: block;
min-height: 32px;
user-select: none;
-webkit-user-select: none; }
.select2-container .select2-selection--multiple .select2-selection__rendered {
display: inline-block;
overflow: hidden;
padding-left: 8px;
text-overflow: ellipsis;
white-space: nowrap; }
.select2-container .select2-search--inline {
float: left; }
.select2-container .select2-search--inline .select2-search__field {
box-sizing: border-box;
border: none;
font-size: 100%;
margin-top: 5px;
padding: 0; }
.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button {
-webkit-appearance: none; }
.select2-dropdown {
background-color: white;
border: 1px solid #aaa;
border-radius: 4px;
box-sizing: border-box;
display: block;
position: absolute;
left: -100000px;
width: 100%;
z-index: 1051; }
.select2-results {
display: block; }
.select2-results__options {
list-style: none;
margin: 0;
padding: 0; }
.select2-results__option {
padding: 6px;
user-select: none;
-webkit-user-select: none; }
.select2-results__option[aria-selected] {
cursor: pointer; }
.select2-container--open .select2-dropdown {
left: 0; }
.select2-container--open .select2-dropdown--above {
border-bottom: none;
border-bottom-left-radius: 0;
border-bottom-right-radius: 0; }
.select2-container--open .select2-dropdown--below {
border-top: none;
border-top-left-radius: 0;
border-top-right-radius: 0; }
.select2-search--dropdown {
display: block;
padding: 4px; }
.select2-search--dropdown .select2-search__field {
padding: 4px;
width: 100%;
box-sizing: border-box; }
.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button {
-webkit-appearance: none; }
.select2-search--dropdown.select2-search--hide {
display: none; }
.select2-close-mask {
border: 0;
margin: 0;
padding: 0;
display: block;
position: fixed;
left: 0;
top: 0;
min-height: 100%;
min-width: 100%;
height: auto;
width: auto;
opacity: 0;
z-index: 99;
background-color: #fff;
filter: alpha(opacity=0); }
.select2-hidden-accessible {
border: 0 !important;
clip: rect(0 0 0 0) !important;
-webkit-clip-path: inset(50%) !important;
clip-path: inset(50%) !important;
height: 1px !important;
overflow: hidden !important;
padding: 0 !important;
position: absolute !important;
width: 1px !important;
white-space: nowrap !important; }
.select2-container--default .select2-selection--single {
background-color: #fff;
border: 1px solid #aaa;
border-radius: 4px; }
.select2-container--default .select2-selection--single .select2-selection__rendered {
color: #444;
line-height: 28px; }
.select2-container--default .select2-selection--single .select2-selection__clear {
cursor: pointer;
float: right;
font-weight: bold; }
.select2-container--default .select2-selection--single .select2-selection__placeholder {
color: #999; }
.select2-container--default .select2-selection--single .select2-selection__arrow {
height: 26px;
position: absolute;
top: 1px;
right: 1px;
width: 20px; }
.select2-container--default .select2-selection--single .select2-selection__arrow b {
border-color: #888 transparent transparent transparent;
border-style: solid;
border-width: 5px 4px 0 4px;
height: 0;
left: 50%;
margin-left: -4px;
margin-top: -2px;
position: absolute;
top: 50%;
width: 0; }
.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__clear {
float: left; }
.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__arrow {
left: 1px;
right: auto; }
.select2-container--default.select2-container--disabled .select2-selection--single {
background-color: #eee;
cursor: default; }
.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear {
display: none; }
.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b {
border-color: transparent transparent #888 transparent;
border-width: 0 4px 5px 4px; }
.select2-container--default .select2-selection--multiple {
background-color: white;
border: 1px solid #aaa;
border-radius: 4px;
cursor: text; }
.select2-container--default .select2-selection--multiple .select2-selection__rendered {
box-sizing: border-box;
list-style: none;
margin: 0;
padding: 0 5px;
width: 100%; }
.select2-container--default .select2-selection--multiple .select2-selection__rendered li {
list-style: none; }
.select2-container--default .select2-selection--multiple .select2-selection__clear {
cursor: pointer;
float: right;
font-weight: bold;
margin-top: 5px;
margin-right: 10px;
padding: 1px; }
.select2-container--default .select2-selection--multiple .select2-selection__choice {
background-color: #e4e4e4;
border: 1px solid #aaa;
border-radius: 4px;
cursor: default;
float: left;
margin-right: 5px;
margin-top: 5px;
padding: 0 5px; }
.select2-container--default .select2-selection--multiple .select2-selection__choice__remove {
color: #999;
cursor: pointer;
display: inline-block;
font-weight: bold;
margin-right: 2px; }
.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover {
color: #333; }
.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice, .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-search--inline {
float: right; }
.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice {
margin-left: 5px;
margin-right: auto; }
.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove {
margin-left: 2px;
margin-right: auto; }
.select2-container--default.select2-container--focus .select2-selection--multiple {
border: solid black 1px;
outline: 0; }
.select2-container--default.select2-container--disabled .select2-selection--multiple {
background-color: #eee;
cursor: default; }
.select2-container--default.select2-container--disabled .select2-selection__choice__remove {
display: none; }
.select2-container--default.select2-container--open.select2-container--above .select2-selection--single, .select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple {
border-top-left-radius: 0;
border-top-right-radius: 0; }
.select2-container--default.select2-container--open.select2-container--below .select2-selection--single, .select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple {
border-bottom-left-radius: 0;
border-bottom-right-radius: 0; }
.select2-container--default .select2-search--dropdown .select2-search__field {
border: 1px solid #aaa; }
.select2-container--default .select2-search--inline .select2-search__field {
background: transparent;
border: none;
outline: 0;
box-shadow: none;
-webkit-appearance: textfield; }
.select2-container--default .select2-results > .select2-results__options {
max-height: 200px;
overflow-y: auto; }
.select2-container--default .select2-results__option[role=group] {
padding: 0; }
.select2-container--default .select2-results__option[aria-disabled=true] {
color: #999; }
.select2-container--default .select2-results__option[aria-selected=true] {
background-color: #ddd; }
.select2-container--default .select2-results__option .select2-results__option {
padding-left: 1em; }
.select2-container--default .select2-results__option .select2-results__option .select2-results__group {
padding-left: 0; }
.select2-container--default .select2-results__option .select2-results__option .select2-results__option {
margin-left: -1em;
padding-left: 2em; }
.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
margin-left: -2em;
padding-left: 3em; }
.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
margin-left: -3em;
padding-left: 4em; }
.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
margin-left: -4em;
padding-left: 5em; }
.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
margin-left: -5em;
padding-left: 6em; }
.select2-container--default .select2-results__option--highlighted[aria-selected] {
background-color: #5897fb;
color: white; }
.select2-container--default .select2-results__group {
cursor: default;
display: block;
padding: 6px; }
.select2-container--classic .select2-selection--single {
background-color: #f7f7f7;
border: 1px solid #aaa;
border-radius: 4px;
outline: 0;
background-image: -webkit-linear-gradient(top, white 50%, #eeeeee 100%);
background-image: -o-linear-gradient(top, white 50%, #eeeeee 100%);
background-image: linear-gradient(to bottom, white 50%, #eeeeee 100%);
background-repeat: repeat-x;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0); }
.select2-container--classic .select2-selection--single:focus {
border: 1px solid #5897fb; }
.select2-container--classic .select2-selection--single .select2-selection__rendered {
color: #444;
line-height: 28px; }
.select2-container--classic .select2-selection--single .select2-selection__clear {
cursor: pointer;
float: right;
font-weight: bold;
margin-right: 10px; }
.select2-container--classic .select2-selection--single .select2-selection__placeholder {
color: #999; }
.select2-container--classic .select2-selection--single .select2-selection__arrow {
background-color: #ddd;
border: none;
border-left: 1px solid #aaa;
border-top-right-radius: 4px;
border-bottom-right-radius: 4px;
height: 26px;
position: absolute;
top: 1px;
right: 1px;
width: 20px;
background-image: -webkit-linear-gradient(top, #eeeeee 50%, #cccccc 100%);
background-image: -o-linear-gradient(top, #eeeeee 50%, #cccccc 100%);
background-image: linear-gradient(to bottom, #eeeeee 50%, #cccccc 100%);
background-repeat: repeat-x;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0); }
.select2-container--classic .select2-selection--single .select2-selection__arrow b {
border-color: #888 transparent transparent transparent;
border-style: solid;
border-width: 5px 4px 0 4px;
height: 0;
left: 50%;
margin-left: -4px;
margin-top: -2px;
position: absolute;
top: 50%;
width: 0; }
.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear {
float: left; }
.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow {
border: none;
border-right: 1px solid #aaa;
border-radius: 0;
border-top-left-radius: 4px;
border-bottom-left-radius: 4px;
left: 1px;
right: auto; }
.select2-container--classic.select2-container--open .select2-selection--single {
border: 1px solid #5897fb; }
.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow {
background: transparent;
border: none; }
.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b {
border-color: transparent transparent #888 transparent;
border-width: 0 4px 5px 4px; }
.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single {
border-top: none;
border-top-left-radius: 0;
border-top-right-radius: 0;
background-image: -webkit-linear-gradient(top, white 0%, #eeeeee 50%);
background-image: -o-linear-gradient(top, white 0%, #eeeeee 50%);
background-image: linear-gradient(to bottom, white 0%, #eeeeee 50%);
background-repeat: repeat-x;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0); }
.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single {
border-bottom: none;
border-bottom-left-radius: 0;
border-bottom-right-radius: 0;
background-image: -webkit-linear-gradient(top, #eeeeee 50%, white 100%);
background-image: -o-linear-gradient(top, #eeeeee 50%, white 100%);
background-image: linear-gradient(to bottom, #eeeeee 50%, white 100%);
background-repeat: repeat-x;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0); }
.select2-container--classic .select2-selection--multiple {
background-color: white;
border: 1px solid #aaa;
border-radius: 4px;
cursor: text;
outline: 0; }
.select2-container--classic .select2-selection--multiple:focus {
border: 1px solid #5897fb; }
.select2-container--classic .select2-selection--multiple .select2-selection__rendered {
list-style: none;
margin: 0;
padding: 0 5px; }
.select2-container--classic .select2-selection--multiple .select2-selection__clear {
display: none; }
.select2-container--classic .select2-selection--multiple .select2-selection__choice {
background-color: #e4e4e4;
border: 1px solid #aaa;
border-radius: 4px;
cursor: default;
float: left;
margin-right: 5px;
margin-top: 5px;
padding: 0 5px; }
.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove {
color: #888;
cursor: pointer;
display: inline-block;
font-weight: bold;
margin-right: 2px; }
.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover {
color: #555; }
.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice {
float: right;
margin-left: 5px;
margin-right: auto; }
.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove {
margin-left: 2px;
margin-right: auto; }
.select2-container--classic.select2-container--open .select2-selection--multiple {
border: 1px solid #5897fb; }
.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple {
border-top: none;
border-top-left-radius: 0;
border-top-right-radius: 0; }
.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple {
border-bottom: none;
border-bottom-left-radius: 0;
border-bottom-right-radius: 0; }
.select2-container--classic .select2-search--dropdown .select2-search__field {
border: 1px solid #aaa;
outline: 0; }
.select2-container--classic .select2-search--inline .select2-search__field {
outline: 0;
box-shadow: none; }
.select2-container--classic .select2-dropdown {
background-color: white;
border: 1px solid transparent; }
.select2-container--classic .select2-dropdown--above {
border-bottom: none; }
.select2-container--classic .select2-dropdown--below {
border-top: none; }
.select2-container--classic .select2-results > .select2-results__options {
max-height: 200px;
overflow-y: auto; }
.select2-container--classic .select2-results__option[role=group] {
padding: 0; }
.select2-container--classic .select2-results__option[aria-disabled=true] {
color: grey; }
.select2-container--classic .select2-results__option--highlighted[aria-selected] {
background-color: #3875d7;
color: white; }
.select2-container--classic .select2-results__group {
cursor: default;
display: block;
padding: 6px; }
.select2-container--classic.select2-container--open .select2-dropdown {
border-color: #5897fb; }

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,593 @@
/* SELECTOR (FILTER INTERFACE) */
.selector {
display: flex;
flex-grow: 1;
gap: 0 10px;
}
.selector select {
height: 17.2em;
flex: 1 0 auto;
overflow: scroll;
width: 100%;
}
.selector-available, .selector-chosen {
text-align: center;
display: flex;
flex-direction: column;
flex: 1 1;
}
.selector-available h2, .selector-chosen h2 {
border: 1px solid var(--border-color);
border-radius: 4px 4px 0 0;
}
.selector-chosen .list-footer-display {
border: 1px solid var(--border-color);
border-top: none;
border-radius: 0 0 4px 4px;
margin: 0 0 10px;
padding: 8px;
text-align: center;
background: var(--primary);
color: var(--header-link-color);
cursor: pointer;
}
.selector-chosen .list-footer-display__clear {
color: var(--breadcrumbs-fg);
}
.selector-chosen h2 {
background: var(--secondary);
color: var(--header-link-color);
}
.selector .selector-available h2 {
background: var(--darkened-bg);
color: var(--body-quiet-color);
}
.selector .selector-filter {
border: 1px solid var(--border-color);
border-width: 0 1px;
padding: 8px;
color: var(--body-quiet-color);
font-size: 0.625rem;
margin: 0;
text-align: left;
display: flex;
}
.selector .selector-filter label,
.inline-group .aligned .selector .selector-filter label {
float: left;
margin: 7px 0 0;
width: 18px;
height: 18px;
padding: 0;
overflow: hidden;
line-height: 1;
min-width: auto;
}
.selector-filter input {
flex-grow: 1;
}
.selector .selector-available input,
.selector .selector-chosen input {
margin-left: 8px;
}
.selector ul.selector-chooser {
align-self: center;
width: 22px;
background-color: var(--selected-bg);
border-radius: 10px;
margin: 0;
padding: 0;
transform: translateY(-17px);
}
.selector-chooser li {
margin: 0;
padding: 3px;
list-style-type: none;
}
.selector select {
padding: 0 10px;
margin: 0 0 10px;
border-radius: 0 0 4px 4px;
}
.selector .selector-chosen--with-filtered select {
margin: 0;
border-radius: 0;
height: 14em;
}
.selector .selector-chosen:not(.selector-chosen--with-filtered) .list-footer-display {
display: none;
}
.selector-add, .selector-remove {
width: 16px;
height: 16px;
display: block;
text-indent: -3000px;
overflow: hidden;
cursor: default;
opacity: 0.55;
}
.active.selector-add, .active.selector-remove {
opacity: 1;
}
.active.selector-add:hover, .active.selector-remove:hover {
cursor: pointer;
}
.selector-add {
background: url(../img/selector-icons.svg) 0 -96px no-repeat;
}
.active.selector-add:focus, .active.selector-add:hover {
background-position: 0 -112px;
}
.selector-remove {
background: url(../img/selector-icons.svg) 0 -64px no-repeat;
}
.active.selector-remove:focus, .active.selector-remove:hover {
background-position: 0 -80px;
}
a.selector-chooseall, a.selector-clearall {
display: inline-block;
height: 16px;
text-align: left;
margin: 0 auto;
overflow: hidden;
font-weight: bold;
line-height: 16px;
color: var(--body-quiet-color);
text-decoration: none;
opacity: 0.55;
}
a.active.selector-chooseall:focus, a.active.selector-clearall:focus,
a.active.selector-chooseall:hover, a.active.selector-clearall:hover {
color: var(--link-fg);
}
a.active.selector-chooseall, a.active.selector-clearall {
opacity: 1;
}
a.active.selector-chooseall:hover, a.active.selector-clearall:hover {
cursor: pointer;
}
a.selector-chooseall {
padding: 0 18px 0 0;
background: url(../img/selector-icons.svg) right -160px no-repeat;
cursor: default;
}
a.active.selector-chooseall:focus, a.active.selector-chooseall:hover {
background-position: 100% -176px;
}
a.selector-clearall {
padding: 0 0 0 18px;
background: url(../img/selector-icons.svg) 0 -128px no-repeat;
cursor: default;
}
a.active.selector-clearall:focus, a.active.selector-clearall:hover {
background-position: 0 -144px;
}
/* STACKED SELECTORS */
.stacked {
float: left;
width: 490px;
display: block;
}
.stacked select {
width: 480px;
height: 10.1em;
}
.stacked .selector-available, .stacked .selector-chosen {
width: 480px;
}
.stacked .selector-available {
margin-bottom: 0;
}
.stacked .selector-available input {
width: 422px;
}
.stacked ul.selector-chooser {
height: 22px;
width: 50px;
margin: 0 0 10px 40%;
background-color: #eee;
border-radius: 10px;
transform: none;
}
.stacked .selector-chooser li {
float: left;
padding: 3px 3px 3px 5px;
}
.stacked .selector-chooseall, .stacked .selector-clearall {
display: none;
}
.stacked .selector-add {
background: url(../img/selector-icons.svg) 0 -32px no-repeat;
cursor: default;
}
.stacked .active.selector-add {
background-position: 0 -32px;
cursor: pointer;
}
.stacked .active.selector-add:focus, .stacked .active.selector-add:hover {
background-position: 0 -48px;
cursor: pointer;
}
.stacked .selector-remove {
background: url(../img/selector-icons.svg) 0 0 no-repeat;
cursor: default;
}
.stacked .active.selector-remove {
background-position: 0 0px;
cursor: pointer;
}
.stacked .active.selector-remove:focus, .stacked .active.selector-remove:hover {
background-position: 0 -16px;
cursor: pointer;
}
.selector .help-icon {
background: url(../img/icon-unknown.svg) 0 0 no-repeat;
display: inline-block;
vertical-align: middle;
margin: -2px 0 0 2px;
width: 13px;
height: 13px;
}
.selector .selector-chosen .help-icon {
background: url(../img/icon-unknown-alt.svg) 0 0 no-repeat;
}
.selector .search-label-icon {
background: url(../img/search.svg) 0 0 no-repeat;
display: inline-block;
height: 1.125rem;
width: 1.125rem;
}
/* DATE AND TIME */
p.datetime {
line-height: 20px;
margin: 0;
padding: 0;
color: var(--body-quiet-color);
font-weight: bold;
}
.datetime span {
white-space: nowrap;
font-weight: normal;
font-size: 0.6875rem;
color: var(--body-quiet-color);
}
.datetime input, .form-row .datetime input.vDateField, .form-row .datetime input.vTimeField {
margin-left: 5px;
margin-bottom: 4px;
}
table p.datetime {
font-size: 0.6875rem;
margin-left: 0;
padding-left: 0;
}
.datetimeshortcuts .clock-icon, .datetimeshortcuts .date-icon {
position: relative;
display: inline-block;
vertical-align: middle;
height: 16px;
width: 16px;
overflow: hidden;
}
.datetimeshortcuts .clock-icon {
background: url(../img/icon-clock.svg) 0 0 no-repeat;
}
.datetimeshortcuts a:focus .clock-icon,
.datetimeshortcuts a:hover .clock-icon {
background-position: 0 -16px;
}
.datetimeshortcuts .date-icon {
background: url(../img/icon-calendar.svg) 0 0 no-repeat;
top: -1px;
}
.datetimeshortcuts a:focus .date-icon,
.datetimeshortcuts a:hover .date-icon {
background-position: 0 -16px;
}
.timezonewarning {
font-size: 0.6875rem;
color: var(--body-quiet-color);
}
/* URL */
p.url {
line-height: 20px;
margin: 0;
padding: 0;
color: var(--body-quiet-color);
font-size: 0.6875rem;
font-weight: bold;
}
.url a {
font-weight: normal;
}
/* FILE UPLOADS */
p.file-upload {
line-height: 20px;
margin: 0;
padding: 0;
color: var(--body-quiet-color);
font-size: 0.6875rem;
font-weight: bold;
}
.file-upload a {
font-weight: normal;
}
.file-upload .deletelink {
margin-left: 5px;
}
span.clearable-file-input label {
color: var(--body-fg);
font-size: 0.6875rem;
display: inline;
float: none;
}
/* CALENDARS & CLOCKS */
.calendarbox, .clockbox {
margin: 5px auto;
font-size: 0.75rem;
width: 19em;
text-align: center;
background: var(--body-bg);
color: var(--body-fg);
border: 1px solid var(--hairline-color);
border-radius: 4px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.15);
overflow: hidden;
position: relative;
}
.clockbox {
width: auto;
}
.calendar {
margin: 0;
padding: 0;
}
.calendar table {
margin: 0;
padding: 0;
border-collapse: collapse;
background: white;
width: 100%;
}
.calendar caption, .calendarbox h2 {
margin: 0;
text-align: center;
border-top: none;
font-weight: 700;
font-size: 0.75rem;
color: #333;
background: var(--accent);
}
.calendar th {
padding: 8px 5px;
background: var(--darkened-bg);
border-bottom: 1px solid var(--border-color);
font-weight: 400;
font-size: 0.75rem;
text-align: center;
color: var(--body-quiet-color);
}
.calendar td {
font-weight: 400;
font-size: 0.75rem;
text-align: center;
padding: 0;
border-top: 1px solid var(--hairline-color);
border-bottom: none;
}
.calendar td.selected a {
background: var(--secondary);
color: var(--button-fg);
}
.calendar td.nonday {
background: var(--darkened-bg);
}
.calendar td.today a {
font-weight: 700;
}
.calendar td a, .timelist a {
display: block;
font-weight: 400;
padding: 6px;
text-decoration: none;
color: var(--body-quiet-color);
}
.calendar td a:focus, .timelist a:focus,
.calendar td a:hover, .timelist a:hover {
background: var(--primary);
color: white;
}
.calendar td a:active, .timelist a:active {
background: var(--header-bg);
color: white;
}
.calendarnav {
font-size: 0.625rem;
text-align: center;
color: #ccc;
margin: 0;
padding: 1px 3px;
}
.calendarnav a:link, #calendarnav a:visited,
#calendarnav a:focus, #calendarnav a:hover {
color: var(--body-quiet-color);
}
.calendar-shortcuts {
background: var(--body-bg);
color: var(--body-quiet-color);
font-size: 0.6875rem;
line-height: 0.6875rem;
border-top: 1px solid var(--hairline-color);
padding: 8px 0;
}
.calendarbox .calendarnav-previous, .calendarbox .calendarnav-next {
display: block;
position: absolute;
top: 8px;
width: 15px;
height: 15px;
text-indent: -9999px;
padding: 0;
}
.calendarnav-previous {
left: 10px;
background: url(../img/calendar-icons.svg) 0 0 no-repeat;
}
.calendarnav-next {
right: 10px;
background: url(../img/calendar-icons.svg) 0 -15px no-repeat;
}
.calendar-cancel {
margin: 0;
padding: 4px 0;
font-size: 0.75rem;
background: var(--close-button-bg);
border-top: 1px solid var(--border-color);
color: var(--button-fg);
}
.calendar-cancel:focus, .calendar-cancel:hover {
background: var(--close-button-hover-bg);
}
.calendar-cancel a {
color: var(--button-fg);
display: block;
}
ul.timelist, .timelist li {
list-style-type: none;
margin: 0;
padding: 0;
}
.timelist a {
padding: 2px;
}
/* EDIT INLINE */
.inline-deletelink {
float: right;
text-indent: -9999px;
background: url(../img/inline-delete.svg) 0 0 no-repeat;
width: 16px;
height: 16px;
border: 0px none;
}
.inline-deletelink:focus, .inline-deletelink:hover {
cursor: pointer;
}
/* RELATED WIDGET WRAPPER */
.related-widget-wrapper {
display: flex;
gap: 0 10px;
flex-grow: 1;
flex-wrap: wrap;
margin-bottom: 5px;
}
.related-widget-wrapper-link {
opacity: .6;
filter: grayscale(1);
}
.related-widget-wrapper-link:link {
opacity: 1;
filter: grayscale(0);
}
/* GIS MAPS */
.dj_map {
width: 600px;
height: 400px;
}

View File

@ -0,0 +1,20 @@
The MIT License (MIT)
Copyright (c) 2014 Code Charm Ltd
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

View File

@ -0,0 +1,7 @@
All icons are taken from Font Awesome (https://fontawesome.com/) project.
The Font Awesome font is licensed under the SIL OFL 1.1:
- https://scripts.sil.org/OFL
SVG icons source: https://github.com/encharm/Font-Awesome-SVG-PNG
Font-Awesome-SVG-PNG is licensed under the MIT license (see file license
in current folder).

View File

@ -0,0 +1,63 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="15"
height="30"
viewBox="0 0 1792 3584"
version="1.1"
id="svg5"
sodipodi:docname="calendar-icons.svg"
inkscape:version="1.3.2 (091e20ef0f, 2023-11-25, custom)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview5"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
showgrid="false"
inkscape:zoom="13.3"
inkscape:cx="15.526316"
inkscape:cy="20.977444"
inkscape:window-width="1920"
inkscape:window-height="1011"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg5" />
<defs
id="defs2">
<g
id="previous">
<path
d="m 1037,1395 102,-102 q 19,-19 19,-45 0,-26 -19,-45 L 832,896 1139,589 q 19,-19 19,-45 0,-26 -19,-45 L 1037,397 q -19,-19 -45,-19 -26,0 -45,19 L 493,851 q -19,19 -19,45 0,26 19,45 l 454,454 q 19,19 45,19 26,0 45,-19 z m 627,-499 q 0,209 -103,385.5 Q 1458,1458 1281.5,1561 1105,1664 896,1664 687,1664 510.5,1561 334,1458 231,1281.5 128,1105 128,896 128,687 231,510.5 334,334 510.5,231 687,128 896,128 1105,128 1281.5,231 1458,334 1561,510.5 1664,687 1664,896 Z"
id="path1" />
</g>
<g
id="next">
<path
d="m 845,1395 454,-454 q 19,-19 19,-45 0,-26 -19,-45 L 845,397 q -19,-19 -45,-19 -26,0 -45,19 L 653,499 q -19,19 -19,45 0,26 19,45 l 307,307 -307,307 q -19,19 -19,45 0,26 19,45 l 102,102 q 19,19 45,19 26,0 45,-19 z m 819,-499 q 0,209 -103,385.5 Q 1458,1458 1281.5,1561 1105,1664 896,1664 687,1664 510.5,1561 334,1458 231,1281.5 128,1105 128,896 128,687 231,510.5 334,334 510.5,231 687,128 896,128 1105,128 1281.5,231 1458,334 1561,510.5 1664,687 1664,896 Z"
id="path2" />
</g>
</defs>
<use
xlink:href="#next"
x="0"
y="5376"
fill="#000000"
id="use5"
transform="translate(0,-3584)" />
<use
xlink:href="#previous"
x="0"
y="0"
fill="#333333"
id="use2"
style="fill:#000000;fill-opacity:1" />
</svg>

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

@ -0,0 +1 @@
<svg width="24" height="22" viewBox="0 0 847 779" xmlns="http://www.w3.org/2000/svg"><g><path fill="#EBECE6" d="M120 1h607c66 0 120 54 120 120v536c0 66-54 120-120 120h-607c-66 0-120-54-120-120v-536c0-66 54-120 120-120z"/><path fill="#9E9E93" d="M120 1h607c66 0 120 54 120 120v536c0 66-54 120-120 120h-607c-66 0-120-54-120-120v-536c0-66 54-120 120-120zm607 25h-607c-26 0-50 11-67 28-17 18-28 41-28 67v536c0 27 11 50 28 68 17 17 41 27 67 27h607c26 0 49-10 67-27 17-18 28-41 28-68v-536c0-26-11-49-28-67-18-17-41-28-67-28z"/><path stroke="#A9A8A4" stroke-width="20" d="M706 295l-68 281"/><path stroke="#E47474" stroke-width="20" d="M316 648l390-353M141 435l175 213"/><path stroke="#C9C9C9" stroke-width="20" d="M319 151l-178 284M706 295l-387-144"/><g fill="#040405"><path d="M319 111c22 0 40 18 40 40s-18 40-40 40-40-18-40-40 18-40 40-40zM141 395c22 0 40 18 40 40s-18 40-40 40c-23 0-41-18-41-40s18-40 41-40zM316 608c22 0 40 18 40 40 0 23-18 41-40 41s-40-18-40-41c0-22 18-40 40-40zM706 254c22 0 40 18 40 41 0 22-18 40-40 40s-40-18-40-40c0-23 18-41 40-41zM638 536c22 0 40 18 40 40s-18 40-40 40-40-18-40-40 18-40 40-40z"/></g></g></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -0,0 +1 @@
<svg width="24" height="22" viewBox="0 0 847 779" xmlns="http://www.w3.org/2000/svg"><g><path fill="#F1C02A" d="M120 1h607c66 0 120 54 120 120v536c0 66-54 120-120 120h-607c-66 0-120-54-120-120v-536c0-66 54-120 120-120z"/><path fill="#9E9E93" d="M120 1h607c66 0 120 54 120 120v536c0 66-54 120-120 120h-607c-66 0-120-54-120-120v-536c0-66 54-120 120-120zm607 25h-607c-26 0-50 11-67 28-17 18-28 41-28 67v536c0 27 11 50 28 68 17 17 41 27 67 27h607c26 0 49-10 67-27 17-18 28-41 28-68v-536c0-26-11-49-28-67-18-17-41-28-67-28z"/><path stroke="#A9A8A4" stroke-width="20" d="M706 295l-68 281"/><path stroke="#E47474" stroke-width="20" d="M316 648l390-353M141 435l175 213"/><path stroke="#C9A741" stroke-width="20" d="M319 151l-178 284M706 295l-387-144"/><g fill="#040405"><path d="M319 111c22 0 40 18 40 40s-18 40-40 40-40-18-40-40 18-40 40-40zM141 395c22 0 40 18 40 40s-18 40-40 40c-23 0-41-18-41-40s18-40 41-40zM316 608c22 0 40 18 40 40 0 23-18 41-40 41s-40-18-40-41c0-22 18-40 40-40zM706 254c22 0 40 18 40 41 0 22-18 40-40 40s-40-18-40-40c0-23 18-41 40-41zM638 536c22 0 40 18 40 40s-18 40-40 40-40-18-40-40 18-40 40-40z"/></g></g></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -0,0 +1,3 @@
<svg width="13" height="13" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg">
<path fill="#5fa225" d="M1600 796v192q0 40-28 68t-68 28h-416v416q0 40-28 68t-68 28h-192q-40 0-68-28t-28-68v-416h-416q-40 0-68-28t-28-68v-192q0-40 28-68t68-28h416v-416q0-40 28-68t68-28h192q40 0 68 28t28 68v416h416q40 0 68 28t28 68z"/>
</svg>

After

Width:  |  Height:  |  Size: 331 B

View File

@ -0,0 +1,3 @@
<svg width="14" height="14" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg">
<path fill="#efb80b" d="M1024 1375v-190q0-14-9.5-23.5t-22.5-9.5h-192q-13 0-22.5 9.5t-9.5 23.5v190q0 14 9.5 23.5t22.5 9.5h192q13 0 22.5-9.5t9.5-23.5zm-2-374l18-459q0-12-10-19-13-11-24-11h-220q-11 0-24 11-10 7-10 21l17 457q0 10 10 16.5t24 6.5h185q14 0 23.5-6.5t10.5-16.5zm-14-934l768 1408q35 63-2 126-17 29-46.5 46t-63.5 17h-1536q-34 0-63.5-17t-46.5-46q-37-63-2-126l768-1408q17-31 47-49t65-18 65 18 47 49z"/>
</svg>

After

Width:  |  Height:  |  Size: 504 B

View File

@ -0,0 +1,9 @@
<svg width="16" height="32" viewBox="0 0 1792 3584" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<defs>
<g id="icon">
<path d="M192 1664h288v-288h-288v288zm352 0h320v-288h-320v288zm-352-352h288v-320h-288v320zm352 0h320v-320h-320v320zm-352-384h288v-288h-288v288zm736 736h320v-288h-320v288zm-384-736h320v-288h-320v288zm768 736h288v-288h-288v288zm-384-352h320v-320h-320v320zm-352-864v-288q0-13-9.5-22.5t-22.5-9.5h-64q-13 0-22.5 9.5t-9.5 22.5v288q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5-9.5t9.5-22.5zm736 864h288v-320h-288v320zm-384-384h320v-288h-320v288zm384 0h288v-288h-288v288zm32-480v-288q0-13-9.5-22.5t-22.5-9.5h-64q-13 0-22.5 9.5t-9.5 22.5v288q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5-9.5t9.5-22.5zm384-64v1280q0 52-38 90t-90 38h-1408q-52 0-90-38t-38-90v-1280q0-52 38-90t90-38h128v-96q0-66 47-113t113-47h64q66 0 113 47t47 113v96h384v-96q0-66 47-113t113-47h64q66 0 113 47t47 113v96h128q52 0 90 38t38 90z"/>
</g>
</defs>
<use xlink:href="#icon" x="0" y="0" fill="#447e9b" />
<use xlink:href="#icon" x="0" y="1792" fill="#003366" />
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -0,0 +1,3 @@
<svg width="13" height="13" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg">
<path fill="#b48c08" d="M491 1536l91-91-235-235-91 91v107h128v128h107zm523-928q0-22-22-22-10 0-17 7l-542 542q-7 7-7 17 0 22 22 22 10 0 17-7l542-542q7-7 7-17zm-54-192l416 416-832 832h-416v-416zm683 96q0 53-37 90l-166 166-416-416 166-165q36-38 90-38 53 0 91 38l235 234q37 39 37 91z"/>
</svg>

After

Width:  |  Height:  |  Size: 380 B

View File

@ -0,0 +1,9 @@
<svg width="16" height="32" viewBox="0 0 1792 3584" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<defs>
<g id="icon">
<path d="M1024 544v448q0 14-9 23t-23 9h-320q-14 0-23-9t-9-23v-64q0-14 9-23t23-9h224v-352q0-14 9-23t23-9h64q14 0 23 9t9 23zm416 352q0-148-73-273t-198-198-273-73-273 73-198 198-73 273 73 273 198 198 273 73 273-73 198-198 73-273zm224 0q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z"/>
</g>
</defs>
<use xlink:href="#icon" x="0" y="0" fill="#447e9b" />
<use xlink:href="#icon" x="0" y="1792" fill="#003366" />
</svg>

After

Width:  |  Height:  |  Size: 677 B

View File

@ -0,0 +1,3 @@
<svg width="14" height="14" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg">
<path fill="#dd4646" d="M1490 1322q0 40-28 68l-136 136q-28 28-68 28t-68-28l-294-294-294 294q-28 28-68 28t-68-28l-136-136q-28-28-28-68t28-68l294-294-294-294q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 294 294-294q28-28 68-28t68 28l136 136q28 28 28 68t-28 68l-294 294 294 294q28 28 28 68z"/>
</svg>

After

Width:  |  Height:  |  Size: 392 B

View File

@ -0,0 +1,3 @@
<svg width="13" height="13" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg">
<path fill="#2b70bf" d="m555 1335 78-141q-87-63-136-159t-49-203q0-121 61-225-229 117-381 353 167 258 427 375zm389-759q0-20-14-34t-34-14q-125 0-214.5 89.5T592 832q0 20 14 34t34 14 34-14 14-34q0-86 61-147t147-61q20 0 34-14t14-34zm363-191q0 7-1 9-105 188-315 566t-316 567l-49 89q-10 16-28 16-12 0-134-70-16-10-16-28 0-12 44-87-143-65-263.5-173T20 1029Q0 998 0 960t20-69q153-235 380-371t496-136q89 0 180 17l54-97q10-16 28-16 5 0 18 6t31 15.5 33 18.5 31.5 18.5T1291 358q16 10 16 27zm37 447q0 139-79 253.5T1056 1250l280-502q8 45 8 84zm448 128q0 35-20 69-39 64-109 145-150 172-347.5 267T896 1536l74-132q212-18 392.5-137T1664 960q-115-179-282-294l63-112q95 64 182.5 153T1772 891q20 34 20 69z"/>
</svg>

After

Width:  |  Height:  |  Size: 784 B

View File

@ -0,0 +1,3 @@
<svg width="13" height="13" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg">
<path fill="#dd4646" d="M1277 1122q0-26-19-45l-181-181 181-181q19-19 19-45 0-27-19-46l-90-90q-19-19-46-19-26 0-45 19l-181 181-181-181q-19-19-45-19-27 0-46 19l-90 90q-19 19-19 46 0 26 19 45l181 181-181 181q-19 19-19 45 0 27 19 46l90 90q19 19 46 19 26 0 45-19l181-181 181 181q19 19 45 19 27 0 46-19l90-90q19-19 19-46zm387-226q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z"/>
</svg>

After

Width:  |  Height:  |  Size: 560 B

View File

@ -0,0 +1,3 @@
<svg width="13" height="13" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg">
<path fill="#ffffff" d="M1024 1376v-192q0-14-9-23t-23-9h-192q-14 0-23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23-9t9-23zm256-672q0-88-55.5-163t-138.5-116-170-41q-243 0-371 213-15 24 8 42l132 100q7 6 19 6 16 0 25-12 53-68 86-92 34-24 86-24 48 0 85.5 26t37.5 59q0 38-20 61t-68 45q-63 28-115.5 86.5t-52.5 125.5v36q0 14 9 23t23 9h192q14 0 23-9t9-23q0-19 21.5-49.5t54.5-49.5q32-18 49-28.5t46-35 44.5-48 28-60.5 12.5-81zm384 192q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z"/>
</svg>

After

Width:  |  Height:  |  Size: 655 B

View File

@ -0,0 +1,3 @@
<svg width="13" height="13" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg">
<path fill="#666666" d="M1024 1376v-192q0-14-9-23t-23-9h-192q-14 0-23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23-9t9-23zm256-672q0-88-55.5-163t-138.5-116-170-41q-243 0-371 213-15 24 8 42l132 100q7 6 19 6 16 0 25-12 53-68 86-92 34-24 86-24 48 0 85.5 26t37.5 59q0 38-20 61t-68 45q-63 28-115.5 86.5t-52.5 125.5v36q0 14 9 23t23 9h192q14 0 23-9t9-23q0-19 21.5-49.5t54.5-49.5q32-18 49-28.5t46-35 44.5-48 28-60.5 12.5-81zm384 192q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z"/>
</svg>

After

Width:  |  Height:  |  Size: 655 B

View File

@ -0,0 +1,3 @@
<svg width="13" height="13" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg">
<path fill="#2b70bf" d="M1664 960q-152-236-381-353 61 104 61 225 0 185-131.5 316.5t-316.5 131.5-316.5-131.5-131.5-316.5q0-121 61-225-229 117-381 353 133 205 333.5 326.5t434.5 121.5 434.5-121.5 333.5-326.5zm-720-384q0-20-14-34t-34-14q-125 0-214.5 89.5t-89.5 214.5q0 20 14 34t34 14 34-14 14-34q0-86 61-147t147-61q20 0 34-14t14-34zm848 384q0 34-20 69-140 230-376.5 368.5t-499.5 138.5-499.5-139-376.5-368q-20-35-20-69t20-69q140-229 376.5-368t499.5-139 499.5 139 376.5 368q20 35 20 69z"/>
</svg>

After

Width:  |  Height:  |  Size: 581 B

View File

@ -0,0 +1,3 @@
<svg width="13" height="13" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg">
<path fill="#70bf2b" d="M1412 734q0-28-18-46l-91-90q-19-19-45-19t-45 19l-408 407-226-226q-19-19-45-19t-45 19l-91 90q-18 18-18 46 0 27 18 45l362 362q19 19 45 19 27 0 46-19l543-543q18-18 18-45zm252 162q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z"/>
</svg>

After

Width:  |  Height:  |  Size: 436 B

View File

@ -0,0 +1,3 @@
<svg width="16" height="16" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg">
<path fill="#999999" d="M1277 1122q0-26-19-45l-181-181 181-181q19-19 19-45 0-27-19-46l-90-90q-19-19-46-19-26 0-45 19l-181 181-181-181q-19-19-45-19-27 0-46 19l-90 90q-19 19-19 46 0 26 19 45l181 181-181 181q-19 19-19 45 0 27 19 46l90 90q19 19 46 19 26 0 45-19l181-181 181 181q19 19 45 19 27 0 46-19l90-90q19-19 19-46zm387-226q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z"/>
</svg>

After

Width:  |  Height:  |  Size: 560 B

View File

@ -0,0 +1,3 @@
<svg width="15" height="15" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg">
<path fill="#555555" d="M1216 832q0-185-131.5-316.5t-316.5-131.5-316.5 131.5-131.5 316.5 131.5 316.5 316.5 131.5 316.5-131.5 131.5-316.5zm512 832q0 52-38 90t-90 38q-54 0-90-38l-343-342q-179 124-399 124-143 0-273.5-55.5t-225-150-150-225-55.5-273.5 55.5-273.5 150-225 225-150 273.5-55.5 273.5 55.5 225 150 150 225 55.5 273.5q0 220-124 399l343 343q37 37 37 90z"/>
</svg>

After

Width:  |  Height:  |  Size: 458 B

View File

@ -0,0 +1,34 @@
<svg width="16" height="192" viewBox="0 0 1792 21504" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<defs>
<g id="up">
<path d="M1412 895q0-27-18-45l-362-362-91-91q-18-18-45-18t-45 18l-91 91-362 362q-18 18-18 45t18 45l91 91q18 18 45 18t45-18l189-189v502q0 26 19 45t45 19h128q26 0 45-19t19-45v-502l189 189q19 19 45 19t45-19l91-91q18-18 18-45zm252 1q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z"/>
</g>
<g id="down">
<path d="M1412 897q0-27-18-45l-91-91q-18-18-45-18t-45 18l-189 189v-502q0-26-19-45t-45-19h-128q-26 0-45 19t-19 45v502l-189-189q-19-19-45-19t-45 19l-91 91q-18 18-18 45t18 45l362 362 91 91q18 18 45 18t45-18l91-91 362-362q18-18 18-45zm252-1q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z"/>
</g>
<g id="left">
<path d="M1408 960v-128q0-26-19-45t-45-19h-502l189-189q19-19 19-45t-19-45l-91-91q-18-18-45-18t-45 18l-362 362-91 91q-18 18-18 45t18 45l91 91 362 362q18 18 45 18t45-18l91-91q18-18 18-45t-18-45l-189-189h502q26 0 45-19t19-45zm256-64q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z"/>
</g>
<g id="right">
<path d="M1413 896q0-27-18-45l-91-91-362-362q-18-18-45-18t-45 18l-91 91q-18 18-18 45t18 45l189 189h-502q-26 0-45 19t-19 45v128q0 26 19 45t45 19h502l-189 189q-19 19-19 45t19 45l91 91q18 18 45 18t45-18l362-362 91-91q18-18 18-45zm251 0q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z"/>
</g>
<g id="clearall">
<path transform="translate(336, 336) scale(0.75)" d="M1037 1395l102-102q19-19 19-45t-19-45l-307-307 307-307q19-19 19-45t-19-45l-102-102q-19-19-45-19t-45 19l-454 454q-19 19-19 45t19 45l454 454q19 19 45 19t45-19zm627-499q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z"/>
</g>
<g id="chooseall">
<path transform="translate(336, 336) scale(0.75)" d="M845 1395l454-454q19-19 19-45t-19-45l-454-454q-19-19-45-19t-45 19l-102 102q-19 19-19 45t19 45l307 307-307 307q-19 19-19 45t19 45l102 102q19 19 45 19t45-19zm819-499q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z"/>
</g>
</defs>
<use xlink:href="#up" x="0" y="0" fill="#666666" />
<use xlink:href="#up" x="0" y="1792" fill="#447e9b" />
<use xlink:href="#down" x="0" y="3584" fill="#666666" />
<use xlink:href="#down" x="0" y="5376" fill="#447e9b" />
<use xlink:href="#left" x="0" y="7168" fill="#666666" />
<use xlink:href="#left" x="0" y="8960" fill="#447e9b" />
<use xlink:href="#right" x="0" y="10752" fill="#666666" />
<use xlink:href="#right" x="0" y="12544" fill="#447e9b" />
<use xlink:href="#clearall" x="0" y="14336" fill="#666666" />
<use xlink:href="#clearall" x="0" y="16128" fill="#447e9b" />
<use xlink:href="#chooseall" x="0" y="17920" fill="#666666" />
<use xlink:href="#chooseall" x="0" y="19712" fill="#447e9b" />
</svg>

After

Width:  |  Height:  |  Size: 3.2 KiB

View File

@ -0,0 +1,19 @@
<svg width="14" height="84" viewBox="0 0 1792 10752" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<defs>
<g id="sort">
<path d="M1408 1088q0 26-19 45l-448 448q-19 19-45 19t-45-19l-448-448q-19-19-19-45t19-45 45-19h896q26 0 45 19t19 45zm0-384q0 26-19 45t-45 19h-896q-26 0-45-19t-19-45 19-45l448-448q19-19 45-19t45 19l448 448q19 19 19 45z"/>
</g>
<g id="ascending">
<path d="M1408 1216q0 26-19 45t-45 19h-896q-26 0-45-19t-19-45 19-45l448-448q19-19 45-19t45 19l448 448q19 19 19 45z"/>
</g>
<g id="descending">
<path d="M1408 704q0 26-19 45l-448 448q-19 19-45 19t-45-19l-448-448q-19-19-19-45t19-45 45-19h896q26 0 45 19t19 45z"/>
</g>
</defs>
<use xlink:href="#sort" x="0" y="0" fill="#999999" />
<use xlink:href="#sort" x="0" y="1792" fill="#447e9b" />
<use xlink:href="#ascending" x="0" y="3584" fill="#999999" />
<use xlink:href="#ascending" x="0" y="5376" fill="#447e9b" />
<use xlink:href="#descending" x="0" y="7168" fill="#999999" />
<use xlink:href="#descending" x="0" y="8960" fill="#447e9b" />
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -0,0 +1,3 @@
<svg width="13" height="13" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg">
<path fill="#ffffff" d="M1600 736v192q0 40-28 68t-68 28h-416v416q0 40-28 68t-68 28h-192q-40 0-68-28t-28-68v-416h-416q-40 0-68-28t-28-68v-192q0-40 28-68t68-28h416v-416q0-40 28-68t68-28h192q40 0 68 28t28 68v416h416q40 0 68 28t28 68z"/>
</svg>

After

Width:  |  Height:  |  Size: 331 B

View File

@ -0,0 +1,3 @@
<svg width="13" height="13" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg">
<path fill="#ffffff" d="M1363 877l-742 742q-19 19-45 19t-45-19l-166-166q-19-19-19-45t19-45l531-531-531-531q-19-19-19-45t19-45l166-166q19-19 45-19t45 19l742 742q19 19 19 45t-19 45z"/>
</svg>

After

Width:  |  Height:  |  Size: 280 B

View File

@ -0,0 +1,116 @@
'use strict';
{
const SelectBox = {
cache: {},
init: function(id) {
const box = document.getElementById(id);
SelectBox.cache[id] = [];
const cache = SelectBox.cache[id];
for (const node of box.options) {
cache.push({value: node.value, text: node.text, displayed: 1});
}
},
redisplay: function(id) {
// Repopulate HTML select box from cache
const box = document.getElementById(id);
const scroll_value_from_top = box.scrollTop;
box.innerHTML = '';
for (const node of SelectBox.cache[id]) {
if (node.displayed) {
const new_option = new Option(node.text, node.value, false, false);
// Shows a tooltip when hovering over the option
new_option.title = node.text;
box.appendChild(new_option);
}
}
box.scrollTop = scroll_value_from_top;
},
filter: function(id, text) {
// Redisplay the HTML select box, displaying only the choices containing ALL
// the words in text. (It's an AND search.)
const tokens = text.toLowerCase().split(/\s+/);
for (const node of SelectBox.cache[id]) {
node.displayed = 1;
const node_text = node.text.toLowerCase();
for (const token of tokens) {
if (!node_text.includes(token)) {
node.displayed = 0;
break; // Once the first token isn't found we're done
}
}
}
SelectBox.redisplay(id);
},
get_hidden_node_count(id) {
const cache = SelectBox.cache[id] || [];
return cache.filter(node => node.displayed === 0).length;
},
delete_from_cache: function(id, value) {
let delete_index = null;
const cache = SelectBox.cache[id];
for (const [i, node] of cache.entries()) {
if (node.value === value) {
delete_index = i;
break;
}
}
cache.splice(delete_index, 1);
},
add_to_cache: function(id, option) {
SelectBox.cache[id].push({value: option.value, text: option.text, displayed: 1});
},
cache_contains: function(id, value) {
// Check if an item is contained in the cache
for (const node of SelectBox.cache[id]) {
if (node.value === value) {
return true;
}
}
return false;
},
move: function(from, to) {
const from_box = document.getElementById(from);
for (const option of from_box.options) {
const option_value = option.value;
if (option.selected && SelectBox.cache_contains(from, option_value)) {
SelectBox.add_to_cache(to, {value: option_value, text: option.text, displayed: 1});
SelectBox.delete_from_cache(from, option_value);
}
}
SelectBox.redisplay(from);
SelectBox.redisplay(to);
},
move_all: function(from, to) {
const from_box = document.getElementById(from);
for (const option of from_box.options) {
const option_value = option.value;
if (SelectBox.cache_contains(from, option_value)) {
SelectBox.add_to_cache(to, {value: option_value, text: option.text, displayed: 1});
SelectBox.delete_from_cache(from, option_value);
}
}
SelectBox.redisplay(from);
SelectBox.redisplay(to);
},
sort: function(id) {
SelectBox.cache[id].sort(function(a, b) {
a = a.text.toLowerCase();
b = b.text.toLowerCase();
if (a > b) {
return 1;
}
if (a < b) {
return -1;
}
return 0;
} );
},
select_all: function(id) {
const box = document.getElementById(id);
for (const option of box.options) {
option.selected = true;
}
}
};
window.SelectBox = SelectBox;
}

View File

@ -0,0 +1,286 @@
/*global SelectBox, gettext, ngettext, interpolate, quickElement, SelectFilter*/
/*
SelectFilter2 - Turns a multiple-select box into a filter interface.
Requires core.js and SelectBox.js.
*/
'use strict';
{
window.SelectFilter = {
init: function(field_id, field_name, is_stacked) {
if (field_id.match(/__prefix__/)) {
// Don't initialize on empty forms.
return;
}
const from_box = document.getElementById(field_id);
from_box.id += '_from'; // change its ID
from_box.className = 'filtered';
for (const p of from_box.parentNode.getElementsByTagName('p')) {
if (p.classList.contains("info")) {
// Remove <p class="info">, because it just gets in the way.
from_box.parentNode.removeChild(p);
} else if (p.classList.contains("help")) {
// Move help text up to the top so it isn't below the select
// boxes or wrapped off on the side to the right of the add
// button:
from_box.parentNode.insertBefore(p, from_box.parentNode.firstChild);
}
}
// <div class="selector"> or <div class="selector stacked">
const selector_div = quickElement('div', from_box.parentNode);
// Make sure the selector div is at the beginning so that the
// add link would be displayed to the right of the widget.
from_box.parentNode.prepend(selector_div);
selector_div.className = is_stacked ? 'selector stacked' : 'selector';
// <div class="selector-available">
const selector_available = quickElement('div', selector_div);
selector_available.className = 'selector-available';
const title_available = quickElement('h2', selector_available, interpolate(gettext('Available %s') + ' ', [field_name]));
quickElement(
'span', title_available, '',
'class', 'help help-tooltip help-icon',
'title', interpolate(
gettext(
'This is the list of available %s. You may choose some by ' +
'selecting them in the box below and then clicking the ' +
'"Choose" arrow between the two boxes.'
),
[field_name]
)
);
const filter_p = quickElement('p', selector_available, '', 'id', field_id + '_filter');
filter_p.className = 'selector-filter';
const search_filter_label = quickElement('label', filter_p, '', 'for', field_id + '_input');
quickElement(
'span', search_filter_label, '',
'class', 'help-tooltip search-label-icon',
'title', interpolate(gettext("Type into this box to filter down the list of available %s."), [field_name])
);
filter_p.appendChild(document.createTextNode(' '));
const filter_input = quickElement('input', filter_p, '', 'type', 'text', 'placeholder', gettext("Filter"));
filter_input.id = field_id + '_input';
selector_available.appendChild(from_box);
const choose_all = quickElement('a', selector_available, gettext('Choose all'), 'title', interpolate(gettext('Click to choose all %s at once.'), [field_name]), 'href', '#', 'id', field_id + '_add_all_link');
choose_all.className = 'selector-chooseall';
// <ul class="selector-chooser">
const selector_chooser = quickElement('ul', selector_div);
selector_chooser.className = 'selector-chooser';
const add_link = quickElement('a', quickElement('li', selector_chooser), gettext('Choose'), 'title', gettext('Choose'), 'href', '#', 'id', field_id + '_add_link');
add_link.className = 'selector-add';
const remove_link = quickElement('a', quickElement('li', selector_chooser), gettext('Remove'), 'title', gettext('Remove'), 'href', '#', 'id', field_id + '_remove_link');
remove_link.className = 'selector-remove';
// <div class="selector-chosen">
const selector_chosen = quickElement('div', selector_div, '', 'id', field_id + '_selector_chosen');
selector_chosen.className = 'selector-chosen';
const title_chosen = quickElement('h2', selector_chosen, interpolate(gettext('Chosen %s') + ' ', [field_name]));
quickElement(
'span', title_chosen, '',
'class', 'help help-tooltip help-icon',
'title', interpolate(
gettext(
'This is the list of chosen %s. You may remove some by ' +
'selecting them in the box below and then clicking the ' +
'"Remove" arrow between the two boxes.'
),
[field_name]
)
);
const filter_selected_p = quickElement('p', selector_chosen, '', 'id', field_id + '_filter_selected');
filter_selected_p.className = 'selector-filter';
const search_filter_selected_label = quickElement('label', filter_selected_p, '', 'for', field_id + '_selected_input');
quickElement(
'span', search_filter_selected_label, '',
'class', 'help-tooltip search-label-icon',
'title', interpolate(gettext("Type into this box to filter down the list of selected %s."), [field_name])
);
filter_selected_p.appendChild(document.createTextNode(' '));
const filter_selected_input = quickElement('input', filter_selected_p, '', 'type', 'text', 'placeholder', gettext("Filter"));
filter_selected_input.id = field_id + '_selected_input';
const to_box = quickElement('select', selector_chosen, '', 'id', field_id + '_to', 'multiple', '', 'size', from_box.size, 'name', from_box.name);
to_box.className = 'filtered';
const warning_footer = quickElement('div', selector_chosen, '', 'class', 'list-footer-display');
quickElement('span', warning_footer, '', 'id', field_id + '_list-footer-display-text');
quickElement('span', warning_footer, ' (click to clear)', 'class', 'list-footer-display__clear');
const clear_all = quickElement('a', selector_chosen, gettext('Remove all'), 'title', interpolate(gettext('Click to remove all chosen %s at once.'), [field_name]), 'href', '#', 'id', field_id + '_remove_all_link');
clear_all.className = 'selector-clearall';
from_box.name = from_box.name + '_old';
// Set up the JavaScript event handlers for the select box filter interface
const move_selection = function(e, elem, move_func, from, to) {
if (elem.classList.contains('active')) {
move_func(from, to);
SelectFilter.refresh_icons(field_id);
SelectFilter.refresh_filtered_selects(field_id);
SelectFilter.refresh_filtered_warning(field_id);
}
e.preventDefault();
};
choose_all.addEventListener('click', function(e) {
move_selection(e, this, SelectBox.move_all, field_id + '_from', field_id + '_to');
});
add_link.addEventListener('click', function(e) {
move_selection(e, this, SelectBox.move, field_id + '_from', field_id + '_to');
});
remove_link.addEventListener('click', function(e) {
move_selection(e, this, SelectBox.move, field_id + '_to', field_id + '_from');
});
clear_all.addEventListener('click', function(e) {
move_selection(e, this, SelectBox.move_all, field_id + '_to', field_id + '_from');
});
warning_footer.addEventListener('click', function(e) {
filter_selected_input.value = '';
SelectBox.filter(field_id + '_to', '');
SelectFilter.refresh_filtered_warning(field_id);
SelectFilter.refresh_icons(field_id);
});
filter_input.addEventListener('keypress', function(e) {
SelectFilter.filter_key_press(e, field_id, '_from', '_to');
});
filter_input.addEventListener('keyup', function(e) {
SelectFilter.filter_key_up(e, field_id, '_from');
});
filter_input.addEventListener('keydown', function(e) {
SelectFilter.filter_key_down(e, field_id, '_from', '_to');
});
filter_selected_input.addEventListener('keypress', function(e) {
SelectFilter.filter_key_press(e, field_id, '_to', '_from');
});
filter_selected_input.addEventListener('keyup', function(e) {
SelectFilter.filter_key_up(e, field_id, '_to', '_selected_input');
});
filter_selected_input.addEventListener('keydown', function(e) {
SelectFilter.filter_key_down(e, field_id, '_to', '_from');
});
selector_div.addEventListener('change', function(e) {
if (e.target.tagName === 'SELECT') {
SelectFilter.refresh_icons(field_id);
}
});
selector_div.addEventListener('dblclick', function(e) {
if (e.target.tagName === 'OPTION') {
if (e.target.closest('select').id === field_id + '_to') {
SelectBox.move(field_id + '_to', field_id + '_from');
} else {
SelectBox.move(field_id + '_from', field_id + '_to');
}
SelectFilter.refresh_icons(field_id);
}
});
from_box.closest('form').addEventListener('submit', function() {
SelectBox.filter(field_id + '_to', '');
SelectBox.select_all(field_id + '_to');
});
SelectBox.init(field_id + '_from');
SelectBox.init(field_id + '_to');
// Move selected from_box options to to_box
SelectBox.move(field_id + '_from', field_id + '_to');
// Initial icon refresh
SelectFilter.refresh_icons(field_id);
},
any_selected: function(field) {
// Temporarily add the required attribute and check validity.
field.required = true;
const any_selected = field.checkValidity();
field.required = false;
return any_selected;
},
refresh_filtered_warning: function(field_id) {
const count = SelectBox.get_hidden_node_count(field_id + '_to');
const selector = document.getElementById(field_id + '_selector_chosen');
const warning = document.getElementById(field_id + '_list-footer-display-text');
selector.className = selector.className.replace('selector-chosen--with-filtered', '');
warning.textContent = interpolate(ngettext(
'%s selected option not visible',
'%s selected options not visible',
count
), [count]);
if(count > 0) {
selector.className += ' selector-chosen--with-filtered';
}
},
refresh_filtered_selects: function(field_id) {
SelectBox.filter(field_id + '_from', document.getElementById(field_id + "_input").value);
SelectBox.filter(field_id + '_to', document.getElementById(field_id + "_selected_input").value);
},
refresh_icons: function(field_id) {
const from = document.getElementById(field_id + '_from');
const to = document.getElementById(field_id + '_to');
// Active if at least one item is selected
document.getElementById(field_id + '_add_link').classList.toggle('active', SelectFilter.any_selected(from));
document.getElementById(field_id + '_remove_link').classList.toggle('active', SelectFilter.any_selected(to));
// Active if the corresponding box isn't empty
document.getElementById(field_id + '_add_all_link').classList.toggle('active', from.querySelector('option'));
document.getElementById(field_id + '_remove_all_link').classList.toggle('active', to.querySelector('option'));
SelectFilter.refresh_filtered_warning(field_id);
},
filter_key_press: function(event, field_id, source, target) {
const source_box = document.getElementById(field_id + source);
// don't submit form if user pressed Enter
if ((event.which && event.which === 13) || (event.keyCode && event.keyCode === 13)) {
source_box.selectedIndex = 0;
SelectBox.move(field_id + source, field_id + target);
source_box.selectedIndex = 0;
event.preventDefault();
}
},
filter_key_up: function(event, field_id, source, filter_input) {
const input = filter_input || '_input';
const source_box = document.getElementById(field_id + source);
const temp = source_box.selectedIndex;
SelectBox.filter(field_id + source, document.getElementById(field_id + input).value);
source_box.selectedIndex = temp;
SelectFilter.refresh_filtered_warning(field_id);
SelectFilter.refresh_icons(field_id);
},
filter_key_down: function(event, field_id, source, target) {
const source_box = document.getElementById(field_id + source);
// right key (39) or left key (37)
const direction = source === '_from' ? 39 : 37;
// right arrow -- move across
if ((event.which && event.which === direction) || (event.keyCode && event.keyCode === direction)) {
const old_index = source_box.selectedIndex;
SelectBox.move(field_id + source, field_id + target);
SelectFilter.refresh_filtered_selects(field_id);
SelectFilter.refresh_filtered_warning(field_id);
source_box.selectedIndex = (old_index === source_box.length) ? source_box.length - 1 : old_index;
return;
}
// down arrow -- wrap around
if ((event.which && event.which === 40) || (event.keyCode && event.keyCode === 40)) {
source_box.selectedIndex = (source_box.length === source_box.selectedIndex + 1) ? 0 : source_box.selectedIndex + 1;
}
// up arrow -- wrap around
if ((event.which && event.which === 38) || (event.keyCode && event.keyCode === 38)) {
source_box.selectedIndex = (source_box.selectedIndex === 0) ? source_box.length - 1 : source_box.selectedIndex - 1;
}
}
};
window.addEventListener('load', function(e) {
document.querySelectorAll('select.selectfilter, select.selectfilterstacked').forEach(function(el) {
const data = el.dataset;
SelectFilter.init(el.id, data.fieldName, parseInt(data.isStacked, 10));
});
});
}

View File

@ -0,0 +1,204 @@
/*global gettext, interpolate, ngettext, Actions*/
'use strict';
{
function show(selector) {
document.querySelectorAll(selector).forEach(function(el) {
el.classList.remove('hidden');
});
}
function hide(selector) {
document.querySelectorAll(selector).forEach(function(el) {
el.classList.add('hidden');
});
}
function showQuestion(options) {
hide(options.acrossClears);
show(options.acrossQuestions);
hide(options.allContainer);
}
function showClear(options) {
show(options.acrossClears);
hide(options.acrossQuestions);
document.querySelector(options.actionContainer).classList.remove(options.selectedClass);
show(options.allContainer);
hide(options.counterContainer);
}
function reset(options) {
hide(options.acrossClears);
hide(options.acrossQuestions);
hide(options.allContainer);
show(options.counterContainer);
}
function clearAcross(options) {
reset(options);
const acrossInputs = document.querySelectorAll(options.acrossInput);
acrossInputs.forEach(function(acrossInput) {
acrossInput.value = 0;
});
document.querySelector(options.actionContainer).classList.remove(options.selectedClass);
}
function checker(actionCheckboxes, options, checked) {
if (checked) {
showQuestion(options);
} else {
reset(options);
}
actionCheckboxes.forEach(function(el) {
el.checked = checked;
el.closest('tr').classList.toggle(options.selectedClass, checked);
});
}
function updateCounter(actionCheckboxes, options) {
const sel = Array.from(actionCheckboxes).filter(function(el) {
return el.checked;
}).length;
const counter = document.querySelector(options.counterContainer);
// data-actions-icnt is defined in the generated HTML
// and contains the total amount of objects in the queryset
const actions_icnt = Number(counter.dataset.actionsIcnt);
counter.textContent = interpolate(
ngettext('%(sel)s of %(cnt)s selected', '%(sel)s of %(cnt)s selected', sel), {
sel: sel,
cnt: actions_icnt
}, true);
const allToggle = document.getElementById(options.allToggleId);
allToggle.checked = sel === actionCheckboxes.length;
if (allToggle.checked) {
showQuestion(options);
} else {
clearAcross(options);
}
}
const defaults = {
actionContainer: "div.actions",
counterContainer: "span.action-counter",
allContainer: "div.actions span.all",
acrossInput: "div.actions input.select-across",
acrossQuestions: "div.actions span.question",
acrossClears: "div.actions span.clear",
allToggleId: "action-toggle",
selectedClass: "selected"
};
window.Actions = function(actionCheckboxes, options) {
options = Object.assign({}, defaults, options);
let list_editable_changed = false;
let lastChecked = null;
let shiftPressed = false;
document.addEventListener('keydown', (event) => {
shiftPressed = event.shiftKey;
});
document.addEventListener('keyup', (event) => {
shiftPressed = event.shiftKey;
});
document.getElementById(options.allToggleId).addEventListener('click', function(event) {
checker(actionCheckboxes, options, this.checked);
updateCounter(actionCheckboxes, options);
});
document.querySelectorAll(options.acrossQuestions + " a").forEach(function(el) {
el.addEventListener('click', function(event) {
event.preventDefault();
const acrossInputs = document.querySelectorAll(options.acrossInput);
acrossInputs.forEach(function(acrossInput) {
acrossInput.value = 1;
});
showClear(options);
});
});
document.querySelectorAll(options.acrossClears + " a").forEach(function(el) {
el.addEventListener('click', function(event) {
event.preventDefault();
document.getElementById(options.allToggleId).checked = false;
clearAcross(options);
checker(actionCheckboxes, options, false);
updateCounter(actionCheckboxes, options);
});
});
function affectedCheckboxes(target, withModifier) {
const multiSelect = (lastChecked && withModifier && lastChecked !== target);
if (!multiSelect) {
return [target];
}
const checkboxes = Array.from(actionCheckboxes);
const targetIndex = checkboxes.findIndex(el => el === target);
const lastCheckedIndex = checkboxes.findIndex(el => el === lastChecked);
const startIndex = Math.min(targetIndex, lastCheckedIndex);
const endIndex = Math.max(targetIndex, lastCheckedIndex);
const filtered = checkboxes.filter((el, index) => (startIndex <= index) && (index <= endIndex));
return filtered;
};
Array.from(document.getElementById('result_list').tBodies).forEach(function(el) {
el.addEventListener('change', function(event) {
const target = event.target;
if (target.classList.contains('action-select')) {
const checkboxes = affectedCheckboxes(target, shiftPressed);
checker(checkboxes, options, target.checked);
updateCounter(actionCheckboxes, options);
lastChecked = target;
} else {
list_editable_changed = true;
}
});
});
document.querySelector('#changelist-form button[name=index]').addEventListener('click', function(event) {
if (list_editable_changed) {
const confirmed = confirm(gettext("You have unsaved changes on individual editable fields. If you run an action, your unsaved changes will be lost."));
if (!confirmed) {
event.preventDefault();
}
}
});
const el = document.querySelector('#changelist-form input[name=_save]');
// The button does not exist if no fields are editable.
if (el) {
el.addEventListener('click', function(event) {
if (document.querySelector('[name=action]').value) {
const text = list_editable_changed
? gettext("You have selected an action, but you havent saved your changes to individual fields yet. Please click OK to save. Youll need to re-run the action.")
: gettext("You have selected an action, and you havent made any changes on individual fields. Youre probably looking for the Go button rather than the Save button.");
if (!confirm(text)) {
event.preventDefault();
}
}
});
}
// Sync counter when navigating to the page, such as through the back
// button.
window.addEventListener('pageshow', (event) => updateCounter(actionCheckboxes, options));
};
// Call function fn when the DOM is loaded and ready. If it is already
// loaded, call the function now.
// http://youmightnotneedjquery.com/#ready
function ready(fn) {
if (document.readyState !== 'loading') {
fn();
} else {
document.addEventListener('DOMContentLoaded', fn);
}
}
ready(function() {
const actionsEls = document.querySelectorAll('tr input.action-select');
if (actionsEls.length > 0) {
Actions(actionsEls);
}
});
}

View File

@ -0,0 +1,408 @@
/*global Calendar, findPosX, findPosY, get_format, gettext, gettext_noop, interpolate, ngettext, quickElement*/
// Inserts shortcut buttons after all of the following:
// <input type="text" class="vDateField">
// <input type="text" class="vTimeField">
'use strict';
{
const DateTimeShortcuts = {
calendars: [],
calendarInputs: [],
clockInputs: [],
clockHours: {
default_: [
[gettext_noop('Now'), -1],
[gettext_noop('Midnight'), 0],
[gettext_noop('6 a.m.'), 6],
[gettext_noop('Noon'), 12],
[gettext_noop('6 p.m.'), 18]
]
},
dismissClockFunc: [],
dismissCalendarFunc: [],
calendarDivName1: 'calendarbox', // name of calendar <div> that gets toggled
calendarDivName2: 'calendarin', // name of <div> that contains calendar
calendarLinkName: 'calendarlink', // name of the link that is used to toggle
clockDivName: 'clockbox', // name of clock <div> that gets toggled
clockLinkName: 'clocklink', // name of the link that is used to toggle
shortCutsClass: 'datetimeshortcuts', // class of the clock and cal shortcuts
timezoneWarningClass: 'timezonewarning', // class of the warning for timezone mismatch
timezoneOffset: 0,
init: function() {
const serverOffset = document.body.dataset.adminUtcOffset;
if (serverOffset) {
const localOffset = new Date().getTimezoneOffset() * -60;
DateTimeShortcuts.timezoneOffset = localOffset - serverOffset;
}
for (const inp of document.getElementsByTagName('input')) {
if (inp.type === 'text' && inp.classList.contains('vTimeField')) {
DateTimeShortcuts.addClock(inp);
DateTimeShortcuts.addTimezoneWarning(inp);
}
else if (inp.type === 'text' && inp.classList.contains('vDateField')) {
DateTimeShortcuts.addCalendar(inp);
DateTimeShortcuts.addTimezoneWarning(inp);
}
}
},
// Return the current time while accounting for the server timezone.
now: function() {
const serverOffset = document.body.dataset.adminUtcOffset;
if (serverOffset) {
const localNow = new Date();
const localOffset = localNow.getTimezoneOffset() * -60;
localNow.setTime(localNow.getTime() + 1000 * (serverOffset - localOffset));
return localNow;
} else {
return new Date();
}
},
// Add a warning when the time zone in the browser and backend do not match.
addTimezoneWarning: function(inp) {
const warningClass = DateTimeShortcuts.timezoneWarningClass;
let timezoneOffset = DateTimeShortcuts.timezoneOffset / 3600;
// Only warn if there is a time zone mismatch.
if (!timezoneOffset) {
return;
}
// Check if warning is already there.
if (inp.parentNode.querySelectorAll('.' + warningClass).length) {
return;
}
let message;
if (timezoneOffset > 0) {
message = ngettext(
'Note: You are %s hour ahead of server time.',
'Note: You are %s hours ahead of server time.',
timezoneOffset
);
}
else {
timezoneOffset *= -1;
message = ngettext(
'Note: You are %s hour behind server time.',
'Note: You are %s hours behind server time.',
timezoneOffset
);
}
message = interpolate(message, [timezoneOffset]);
const warning = document.createElement('div');
warning.classList.add('help', warningClass);
warning.textContent = message;
inp.parentNode.appendChild(warning);
},
// Add clock widget to a given field
addClock: function(inp) {
const num = DateTimeShortcuts.clockInputs.length;
DateTimeShortcuts.clockInputs[num] = inp;
DateTimeShortcuts.dismissClockFunc[num] = function() { DateTimeShortcuts.dismissClock(num); return true; };
// Shortcut links (clock icon and "Now" link)
const shortcuts_span = document.createElement('span');
shortcuts_span.className = DateTimeShortcuts.shortCutsClass;
inp.parentNode.insertBefore(shortcuts_span, inp.nextSibling);
const now_link = document.createElement('a');
now_link.href = "#";
now_link.textContent = gettext('Now');
now_link.addEventListener('click', function(e) {
e.preventDefault();
DateTimeShortcuts.handleClockQuicklink(num, -1);
});
const clock_link = document.createElement('a');
clock_link.href = '#';
clock_link.id = DateTimeShortcuts.clockLinkName + num;
clock_link.addEventListener('click', function(e) {
e.preventDefault();
// avoid triggering the document click handler to dismiss the clock
e.stopPropagation();
DateTimeShortcuts.openClock(num);
});
quickElement(
'span', clock_link, '',
'class', 'clock-icon',
'title', gettext('Choose a Time')
);
shortcuts_span.appendChild(document.createTextNode('\u00A0'));
shortcuts_span.appendChild(now_link);
shortcuts_span.appendChild(document.createTextNode('\u00A0|\u00A0'));
shortcuts_span.appendChild(clock_link);
// Create clock link div
//
// Markup looks like:
// <div id="clockbox1" class="clockbox module">
// <h2>Choose a time</h2>
// <ul class="timelist">
// <li><a href="#">Now</a></li>
// <li><a href="#">Midnight</a></li>
// <li><a href="#">6 a.m.</a></li>
// <li><a href="#">Noon</a></li>
// <li><a href="#">6 p.m.</a></li>
// </ul>
// <p class="calendar-cancel"><a href="#">Cancel</a></p>
// </div>
const clock_box = document.createElement('div');
clock_box.style.display = 'none';
clock_box.style.position = 'absolute';
clock_box.className = 'clockbox module';
clock_box.id = DateTimeShortcuts.clockDivName + num;
document.body.appendChild(clock_box);
clock_box.addEventListener('click', function(e) { e.stopPropagation(); });
quickElement('h2', clock_box, gettext('Choose a time'));
const time_list = quickElement('ul', clock_box);
time_list.className = 'timelist';
// The list of choices can be overridden in JavaScript like this:
// DateTimeShortcuts.clockHours.name = [['3 a.m.', 3]];
// where name is the name attribute of the <input>.
const name = typeof DateTimeShortcuts.clockHours[inp.name] === 'undefined' ? 'default_' : inp.name;
DateTimeShortcuts.clockHours[name].forEach(function(element) {
const time_link = quickElement('a', quickElement('li', time_list), gettext(element[0]), 'href', '#');
time_link.addEventListener('click', function(e) {
e.preventDefault();
DateTimeShortcuts.handleClockQuicklink(num, element[1]);
});
});
const cancel_p = quickElement('p', clock_box);
cancel_p.className = 'calendar-cancel';
const cancel_link = quickElement('a', cancel_p, gettext('Cancel'), 'href', '#');
cancel_link.addEventListener('click', function(e) {
e.preventDefault();
DateTimeShortcuts.dismissClock(num);
});
document.addEventListener('keyup', function(event) {
if (event.which === 27) {
// ESC key closes popup
DateTimeShortcuts.dismissClock(num);
event.preventDefault();
}
});
},
openClock: function(num) {
const clock_box = document.getElementById(DateTimeShortcuts.clockDivName + num);
const clock_link = document.getElementById(DateTimeShortcuts.clockLinkName + num);
// Recalculate the clockbox position
// is it left-to-right or right-to-left layout ?
if (window.getComputedStyle(document.body).direction !== 'rtl') {
clock_box.style.left = findPosX(clock_link) + 17 + 'px';
}
else {
// since style's width is in em, it'd be tough to calculate
// px value of it. let's use an estimated px for now
clock_box.style.left = findPosX(clock_link) - 110 + 'px';
}
clock_box.style.top = Math.max(0, findPosY(clock_link) - 30) + 'px';
// Show the clock box
clock_box.style.display = 'block';
document.addEventListener('click', DateTimeShortcuts.dismissClockFunc[num]);
},
dismissClock: function(num) {
document.getElementById(DateTimeShortcuts.clockDivName + num).style.display = 'none';
document.removeEventListener('click', DateTimeShortcuts.dismissClockFunc[num]);
},
handleClockQuicklink: function(num, val) {
let d;
if (val === -1) {
d = DateTimeShortcuts.now();
}
else {
d = new Date(1970, 1, 1, val, 0, 0, 0);
}
DateTimeShortcuts.clockInputs[num].value = d.strftime(get_format('TIME_INPUT_FORMATS')[0]);
DateTimeShortcuts.clockInputs[num].focus();
DateTimeShortcuts.dismissClock(num);
},
// Add calendar widget to a given field.
addCalendar: function(inp) {
const num = DateTimeShortcuts.calendars.length;
DateTimeShortcuts.calendarInputs[num] = inp;
DateTimeShortcuts.dismissCalendarFunc[num] = function() { DateTimeShortcuts.dismissCalendar(num); return true; };
// Shortcut links (calendar icon and "Today" link)
const shortcuts_span = document.createElement('span');
shortcuts_span.className = DateTimeShortcuts.shortCutsClass;
inp.parentNode.insertBefore(shortcuts_span, inp.nextSibling);
const today_link = document.createElement('a');
today_link.href = '#';
today_link.appendChild(document.createTextNode(gettext('Today')));
today_link.addEventListener('click', function(e) {
e.preventDefault();
DateTimeShortcuts.handleCalendarQuickLink(num, 0);
});
const cal_link = document.createElement('a');
cal_link.href = '#';
cal_link.id = DateTimeShortcuts.calendarLinkName + num;
cal_link.addEventListener('click', function(e) {
e.preventDefault();
// avoid triggering the document click handler to dismiss the calendar
e.stopPropagation();
DateTimeShortcuts.openCalendar(num);
});
quickElement(
'span', cal_link, '',
'class', 'date-icon',
'title', gettext('Choose a Date')
);
shortcuts_span.appendChild(document.createTextNode('\u00A0'));
shortcuts_span.appendChild(today_link);
shortcuts_span.appendChild(document.createTextNode('\u00A0|\u00A0'));
shortcuts_span.appendChild(cal_link);
// Create calendarbox div.
//
// Markup looks like:
//
// <div id="calendarbox3" class="calendarbox module">
// <h2>
// <a href="#" class="link-previous">&lsaquo;</a>
// <a href="#" class="link-next">&rsaquo;</a> February 2003
// </h2>
// <div class="calendar" id="calendarin3">
// <!-- (cal) -->
// </div>
// <div class="calendar-shortcuts">
// <a href="#">Yesterday</a> | <a href="#">Today</a> | <a href="#">Tomorrow</a>
// </div>
// <p class="calendar-cancel"><a href="#">Cancel</a></p>
// </div>
const cal_box = document.createElement('div');
cal_box.style.display = 'none';
cal_box.style.position = 'absolute';
cal_box.className = 'calendarbox module';
cal_box.id = DateTimeShortcuts.calendarDivName1 + num;
document.body.appendChild(cal_box);
cal_box.addEventListener('click', function(e) { e.stopPropagation(); });
// next-prev links
const cal_nav = quickElement('div', cal_box);
const cal_nav_prev = quickElement('a', cal_nav, '<', 'href', '#');
cal_nav_prev.className = 'calendarnav-previous';
cal_nav_prev.addEventListener('click', function(e) {
e.preventDefault();
DateTimeShortcuts.drawPrev(num);
});
const cal_nav_next = quickElement('a', cal_nav, '>', 'href', '#');
cal_nav_next.className = 'calendarnav-next';
cal_nav_next.addEventListener('click', function(e) {
e.preventDefault();
DateTimeShortcuts.drawNext(num);
});
// main box
const cal_main = quickElement('div', cal_box, '', 'id', DateTimeShortcuts.calendarDivName2 + num);
cal_main.className = 'calendar';
DateTimeShortcuts.calendars[num] = new Calendar(DateTimeShortcuts.calendarDivName2 + num, DateTimeShortcuts.handleCalendarCallback(num));
DateTimeShortcuts.calendars[num].drawCurrent();
// calendar shortcuts
const shortcuts = quickElement('div', cal_box);
shortcuts.className = 'calendar-shortcuts';
let day_link = quickElement('a', shortcuts, gettext('Yesterday'), 'href', '#');
day_link.addEventListener('click', function(e) {
e.preventDefault();
DateTimeShortcuts.handleCalendarQuickLink(num, -1);
});
shortcuts.appendChild(document.createTextNode('\u00A0|\u00A0'));
day_link = quickElement('a', shortcuts, gettext('Today'), 'href', '#');
day_link.addEventListener('click', function(e) {
e.preventDefault();
DateTimeShortcuts.handleCalendarQuickLink(num, 0);
});
shortcuts.appendChild(document.createTextNode('\u00A0|\u00A0'));
day_link = quickElement('a', shortcuts, gettext('Tomorrow'), 'href', '#');
day_link.addEventListener('click', function(e) {
e.preventDefault();
DateTimeShortcuts.handleCalendarQuickLink(num, +1);
});
// cancel bar
const cancel_p = quickElement('p', cal_box);
cancel_p.className = 'calendar-cancel';
const cancel_link = quickElement('a', cancel_p, gettext('Cancel'), 'href', '#');
cancel_link.addEventListener('click', function(e) {
e.preventDefault();
DateTimeShortcuts.dismissCalendar(num);
});
document.addEventListener('keyup', function(event) {
if (event.which === 27) {
// ESC key closes popup
DateTimeShortcuts.dismissCalendar(num);
event.preventDefault();
}
});
},
openCalendar: function(num) {
const cal_box = document.getElementById(DateTimeShortcuts.calendarDivName1 + num);
const cal_link = document.getElementById(DateTimeShortcuts.calendarLinkName + num);
const inp = DateTimeShortcuts.calendarInputs[num];
// Determine if the current value in the input has a valid date.
// If so, draw the calendar with that date's year and month.
if (inp.value) {
const format = get_format('DATE_INPUT_FORMATS')[0];
const selected = inp.value.strptime(format);
const year = selected.getUTCFullYear();
const month = selected.getUTCMonth() + 1;
const re = /\d{4}/;
if (re.test(year.toString()) && month >= 1 && month <= 12) {
DateTimeShortcuts.calendars[num].drawDate(month, year, selected);
}
}
// Recalculate the clockbox position
// is it left-to-right or right-to-left layout ?
if (window.getComputedStyle(document.body).direction !== 'rtl') {
cal_box.style.left = findPosX(cal_link) + 17 + 'px';
}
else {
// since style's width is in em, it'd be tough to calculate
// px value of it. let's use an estimated px for now
cal_box.style.left = findPosX(cal_link) - 180 + 'px';
}
cal_box.style.top = Math.max(0, findPosY(cal_link) - 75) + 'px';
cal_box.style.display = 'block';
document.addEventListener('click', DateTimeShortcuts.dismissCalendarFunc[num]);
},
dismissCalendar: function(num) {
document.getElementById(DateTimeShortcuts.calendarDivName1 + num).style.display = 'none';
document.removeEventListener('click', DateTimeShortcuts.dismissCalendarFunc[num]);
},
drawPrev: function(num) {
DateTimeShortcuts.calendars[num].drawPreviousMonth();
},
drawNext: function(num) {
DateTimeShortcuts.calendars[num].drawNextMonth();
},
handleCalendarCallback: function(num) {
const format = get_format('DATE_INPUT_FORMATS')[0];
return function(y, m, d) {
DateTimeShortcuts.calendarInputs[num].value = new Date(y, m - 1, d).strftime(format);
DateTimeShortcuts.calendarInputs[num].focus();
document.getElementById(DateTimeShortcuts.calendarDivName1 + num).style.display = 'none';
};
},
handleCalendarQuickLink: function(num, offset) {
const d = DateTimeShortcuts.now();
d.setDate(d.getDate() + offset);
DateTimeShortcuts.calendarInputs[num].value = d.strftime(get_format('DATE_INPUT_FORMATS')[0]);
DateTimeShortcuts.calendarInputs[num].focus();
DateTimeShortcuts.dismissCalendar(num);
}
};
window.addEventListener('load', DateTimeShortcuts.init);
window.DateTimeShortcuts = DateTimeShortcuts;
}

View File

@ -0,0 +1,240 @@
/*global SelectBox, interpolate*/
// Handles related-objects functionality: lookup link for raw_id_fields
// and Add Another links.
'use strict';
{
const $ = django.jQuery;
let popupIndex = 0;
const relatedWindows = [];
function dismissChildPopups() {
relatedWindows.forEach(function(win) {
if(!win.closed) {
win.dismissChildPopups();
win.close();
}
});
}
function setPopupIndex() {
if(document.getElementsByName("_popup").length > 0) {
const index = window.name.lastIndexOf("__") + 2;
popupIndex = parseInt(window.name.substring(index));
} else {
popupIndex = 0;
}
}
function addPopupIndex(name) {
return name + "__" + (popupIndex + 1);
}
function removePopupIndex(name) {
return name.replace(new RegExp("__" + (popupIndex + 1) + "$"), '');
}
function showAdminPopup(triggeringLink, name_regexp, add_popup) {
const name = addPopupIndex(triggeringLink.id.replace(name_regexp, ''));
const href = new URL(triggeringLink.href);
if (add_popup) {
href.searchParams.set('_popup', 1);
}
const win = window.open(href, name, 'height=500,width=800,resizable=yes,scrollbars=yes');
relatedWindows.push(win);
win.focus();
return false;
}
function showRelatedObjectLookupPopup(triggeringLink) {
return showAdminPopup(triggeringLink, /^lookup_/, true);
}
function dismissRelatedLookupPopup(win, chosenId) {
const name = removePopupIndex(win.name);
const elem = document.getElementById(name);
if (elem.classList.contains('vManyToManyRawIdAdminField') && elem.value) {
elem.value += ',' + chosenId;
} else {
document.getElementById(name).value = chosenId;
}
const index = relatedWindows.indexOf(win);
if (index > -1) {
relatedWindows.splice(index, 1);
}
win.close();
}
function showRelatedObjectPopup(triggeringLink) {
return showAdminPopup(triggeringLink, /^(change|add|delete)_/, false);
}
function updateRelatedObjectLinks(triggeringLink) {
const $this = $(triggeringLink);
const siblings = $this.nextAll('.view-related, .change-related, .delete-related');
if (!siblings.length) {
return;
}
const value = $this.val();
if (value) {
siblings.each(function() {
const elm = $(this);
elm.attr('href', elm.attr('data-href-template').replace('__fk__', value));
elm.removeAttr('aria-disabled');
});
} else {
siblings.removeAttr('href');
siblings.attr('aria-disabled', true);
}
}
function updateRelatedSelectsOptions(currentSelect, win, objId, newRepr, newId) {
// After create/edit a model from the options next to the current
// select (+ or :pencil:) update ForeignKey PK of the rest of selects
// in the page.
const path = win.location.pathname;
// Extract the model from the popup url '.../<model>/add/' or
// '.../<model>/<id>/change/' depending the action (add or change).
const modelName = path.split('/')[path.split('/').length - (objId ? 4 : 3)];
// Select elements with a specific model reference and context of "available-source".
const selectsRelated = document.querySelectorAll(`[data-model-ref="${modelName}"] [data-context="available-source"]`);
selectsRelated.forEach(function(select) {
if (currentSelect === select) {
return;
}
let option = select.querySelector(`option[value="${objId}"]`);
if (!option) {
option = new Option(newRepr, newId);
select.options.add(option);
return;
}
option.textContent = newRepr;
option.value = newId;
});
}
function dismissAddRelatedObjectPopup(win, newId, newRepr) {
const name = removePopupIndex(win.name);
const elem = document.getElementById(name);
if (elem) {
const elemName = elem.nodeName.toUpperCase();
if (elemName === 'SELECT') {
elem.options[elem.options.length] = new Option(newRepr, newId, true, true);
updateRelatedSelectsOptions(elem, win, null, newRepr, newId);
} else if (elemName === 'INPUT') {
if (elem.classList.contains('vManyToManyRawIdAdminField') && elem.value) {
elem.value += ',' + newId;
} else {
elem.value = newId;
}
}
// Trigger a change event to update related links if required.
$(elem).trigger('change');
} else {
const toId = name + "_to";
const o = new Option(newRepr, newId);
SelectBox.add_to_cache(toId, o);
SelectBox.redisplay(toId);
}
const index = relatedWindows.indexOf(win);
if (index > -1) {
relatedWindows.splice(index, 1);
}
win.close();
}
function dismissChangeRelatedObjectPopup(win, objId, newRepr, newId) {
const id = removePopupIndex(win.name.replace(/^edit_/, ''));
const selectsSelector = interpolate('#%s, #%s_from, #%s_to', [id, id, id]);
const selects = $(selectsSelector);
selects.find('option').each(function() {
if (this.value === objId) {
this.textContent = newRepr;
this.value = newId;
}
}).trigger('change');
updateRelatedSelectsOptions(selects[0], win, objId, newRepr, newId);
selects.next().find('.select2-selection__rendered').each(function() {
// The element can have a clear button as a child.
// Use the lastChild to modify only the displayed value.
this.lastChild.textContent = newRepr;
this.title = newRepr;
});
const index = relatedWindows.indexOf(win);
if (index > -1) {
relatedWindows.splice(index, 1);
}
win.close();
}
function dismissDeleteRelatedObjectPopup(win, objId) {
const id = removePopupIndex(win.name.replace(/^delete_/, ''));
const selectsSelector = interpolate('#%s, #%s_from, #%s_to', [id, id, id]);
const selects = $(selectsSelector);
selects.find('option').each(function() {
if (this.value === objId) {
$(this).remove();
}
}).trigger('change');
const index = relatedWindows.indexOf(win);
if (index > -1) {
relatedWindows.splice(index, 1);
}
win.close();
}
window.showRelatedObjectLookupPopup = showRelatedObjectLookupPopup;
window.dismissRelatedLookupPopup = dismissRelatedLookupPopup;
window.showRelatedObjectPopup = showRelatedObjectPopup;
window.updateRelatedObjectLinks = updateRelatedObjectLinks;
window.dismissAddRelatedObjectPopup = dismissAddRelatedObjectPopup;
window.dismissChangeRelatedObjectPopup = dismissChangeRelatedObjectPopup;
window.dismissDeleteRelatedObjectPopup = dismissDeleteRelatedObjectPopup;
window.dismissChildPopups = dismissChildPopups;
// Kept for backward compatibility
window.showAddAnotherPopup = showRelatedObjectPopup;
window.dismissAddAnotherPopup = dismissAddRelatedObjectPopup;
window.addEventListener('unload', function(evt) {
window.dismissChildPopups();
});
$(document).ready(function() {
setPopupIndex();
$("a[data-popup-opener]").on('click', function(event) {
event.preventDefault();
opener.dismissRelatedLookupPopup(window, $(this).data("popup-opener"));
});
$('body').on('click', '.related-widget-wrapper-link[data-popup="yes"]', function(e) {
e.preventDefault();
if (this.href) {
const event = $.Event('django:show-related', {href: this.href});
$(this).trigger(event);
if (!event.isDefaultPrevented()) {
showRelatedObjectPopup(this);
}
}
});
$('body').on('change', '.related-widget-wrapper select', function(e) {
const event = $.Event('django:update-related');
$(this).trigger(event);
if (!event.isDefaultPrevented()) {
updateRelatedObjectLinks(this);
}
});
$('.related-widget-wrapper select').trigger('change');
$('body').on('click', '.related-lookup', function(e) {
e.preventDefault();
const event = $.Event('django:lookup-related');
$(this).trigger(event);
if (!event.isDefaultPrevented()) {
showRelatedObjectLookupPopup(this);
}
});
});
}

View File

@ -0,0 +1,33 @@
'use strict';
{
const $ = django.jQuery;
$.fn.djangoAdminSelect2 = function() {
$.each(this, function(i, element) {
$(element).select2({
ajax: {
data: (params) => {
return {
term: params.term,
page: params.page,
app_label: element.dataset.appLabel,
model_name: element.dataset.modelName,
field_name: element.dataset.fieldName
};
}
}
});
});
return this;
};
$(function() {
// Initialize all autocomplete widgets except the one in the template
// form used when a new formset is added.
$('.admin-autocomplete').not('[name*=__prefix__]').djangoAdminSelect2();
});
document.addEventListener('formset:added', (event) => {
$(event.target).find('.admin-autocomplete').djangoAdminSelect2();
});
}

View File

@ -0,0 +1,239 @@
/*global gettext, pgettext, get_format, quickElement, removeChildren*/
/*
calendar.js - Calendar functions by Adrian Holovaty
depends on core.js for utility functions like removeChildren or quickElement
*/
'use strict';
{
// CalendarNamespace -- Provides a collection of HTML calendar-related helper functions
const CalendarNamespace = {
monthsOfYear: [
gettext('January'),
gettext('February'),
gettext('March'),
gettext('April'),
gettext('May'),
gettext('June'),
gettext('July'),
gettext('August'),
gettext('September'),
gettext('October'),
gettext('November'),
gettext('December')
],
monthsOfYearAbbrev: [
pgettext('abbrev. month January', 'Jan'),
pgettext('abbrev. month February', 'Feb'),
pgettext('abbrev. month March', 'Mar'),
pgettext('abbrev. month April', 'Apr'),
pgettext('abbrev. month May', 'May'),
pgettext('abbrev. month June', 'Jun'),
pgettext('abbrev. month July', 'Jul'),
pgettext('abbrev. month August', 'Aug'),
pgettext('abbrev. month September', 'Sep'),
pgettext('abbrev. month October', 'Oct'),
pgettext('abbrev. month November', 'Nov'),
pgettext('abbrev. month December', 'Dec')
],
daysOfWeek: [
gettext('Sunday'),
gettext('Monday'),
gettext('Tuesday'),
gettext('Wednesday'),
gettext('Thursday'),
gettext('Friday'),
gettext('Saturday')
],
daysOfWeekAbbrev: [
pgettext('abbrev. day Sunday', 'Sun'),
pgettext('abbrev. day Monday', 'Mon'),
pgettext('abbrev. day Tuesday', 'Tue'),
pgettext('abbrev. day Wednesday', 'Wed'),
pgettext('abbrev. day Thursday', 'Thur'),
pgettext('abbrev. day Friday', 'Fri'),
pgettext('abbrev. day Saturday', 'Sat')
],
daysOfWeekInitial: [
pgettext('one letter Sunday', 'S'),
pgettext('one letter Monday', 'M'),
pgettext('one letter Tuesday', 'T'),
pgettext('one letter Wednesday', 'W'),
pgettext('one letter Thursday', 'T'),
pgettext('one letter Friday', 'F'),
pgettext('one letter Saturday', 'S')
],
firstDayOfWeek: parseInt(get_format('FIRST_DAY_OF_WEEK')),
isLeapYear: function(year) {
return (((year % 4) === 0) && ((year % 100) !== 0 ) || ((year % 400) === 0));
},
getDaysInMonth: function(month, year) {
let days;
if (month === 1 || month === 3 || month === 5 || month === 7 || month === 8 || month === 10 || month === 12) {
days = 31;
}
else if (month === 4 || month === 6 || month === 9 || month === 11) {
days = 30;
}
else if (month === 2 && CalendarNamespace.isLeapYear(year)) {
days = 29;
}
else {
days = 28;
}
return days;
},
draw: function(month, year, div_id, callback, selected) { // month = 1-12, year = 1-9999
const today = new Date();
const todayDay = today.getDate();
const todayMonth = today.getMonth() + 1;
const todayYear = today.getFullYear();
let todayClass = '';
// Use UTC functions here because the date field does not contain time
// and using the UTC function variants prevent the local time offset
// from altering the date, specifically the day field. For example:
//
// ```
// var x = new Date('2013-10-02');
// var day = x.getDate();
// ```
//
// The day variable above will be 1 instead of 2 in, say, US Pacific time
// zone.
let isSelectedMonth = false;
if (typeof selected !== 'undefined') {
isSelectedMonth = (selected.getUTCFullYear() === year && (selected.getUTCMonth() + 1) === month);
}
month = parseInt(month);
year = parseInt(year);
const calDiv = document.getElementById(div_id);
removeChildren(calDiv);
const calTable = document.createElement('table');
quickElement('caption', calTable, CalendarNamespace.monthsOfYear[month - 1] + ' ' + year);
const tableBody = quickElement('tbody', calTable);
// Draw days-of-week header
let tableRow = quickElement('tr', tableBody);
for (let i = 0; i < 7; i++) {
quickElement('th', tableRow, CalendarNamespace.daysOfWeekInitial[(i + CalendarNamespace.firstDayOfWeek) % 7]);
}
const startingPos = new Date(year, month - 1, 1 - CalendarNamespace.firstDayOfWeek).getDay();
const days = CalendarNamespace.getDaysInMonth(month, year);
let nonDayCell;
// Draw blanks before first of month
tableRow = quickElement('tr', tableBody);
for (let i = 0; i < startingPos; i++) {
nonDayCell = quickElement('td', tableRow, ' ');
nonDayCell.className = "nonday";
}
function calendarMonth(y, m) {
function onClick(e) {
e.preventDefault();
callback(y, m, this.textContent);
}
return onClick;
}
// Draw days of month
let currentDay = 1;
for (let i = startingPos; currentDay <= days; i++) {
if (i % 7 === 0 && currentDay !== 1) {
tableRow = quickElement('tr', tableBody);
}
if ((currentDay === todayDay) && (month === todayMonth) && (year === todayYear)) {
todayClass = 'today';
} else {
todayClass = '';
}
// use UTC function; see above for explanation.
if (isSelectedMonth && currentDay === selected.getUTCDate()) {
if (todayClass !== '') {
todayClass += " ";
}
todayClass += "selected";
}
const cell = quickElement('td', tableRow, '', 'class', todayClass);
const link = quickElement('a', cell, currentDay, 'href', '#');
link.addEventListener('click', calendarMonth(year, month));
currentDay++;
}
// Draw blanks after end of month (optional, but makes for valid code)
while (tableRow.childNodes.length < 7) {
nonDayCell = quickElement('td', tableRow, ' ');
nonDayCell.className = "nonday";
}
calDiv.appendChild(calTable);
}
};
// Calendar -- A calendar instance
function Calendar(div_id, callback, selected) {
// div_id (string) is the ID of the element in which the calendar will
// be displayed
// callback (string) is the name of a JavaScript function that will be
// called with the parameters (year, month, day) when a day in the
// calendar is clicked
this.div_id = div_id;
this.callback = callback;
this.today = new Date();
this.currentMonth = this.today.getMonth() + 1;
this.currentYear = this.today.getFullYear();
if (typeof selected !== 'undefined') {
this.selected = selected;
}
}
Calendar.prototype = {
drawCurrent: function() {
CalendarNamespace.draw(this.currentMonth, this.currentYear, this.div_id, this.callback, this.selected);
},
drawDate: function(month, year, selected) {
this.currentMonth = month;
this.currentYear = year;
if(selected) {
this.selected = selected;
}
this.drawCurrent();
},
drawPreviousMonth: function() {
if (this.currentMonth === 1) {
this.currentMonth = 12;
this.currentYear--;
}
else {
this.currentMonth--;
}
this.drawCurrent();
},
drawNextMonth: function() {
if (this.currentMonth === 12) {
this.currentMonth = 1;
this.currentYear++;
}
else {
this.currentMonth++;
}
this.drawCurrent();
},
drawPreviousYear: function() {
this.currentYear--;
this.drawCurrent();
},
drawNextYear: function() {
this.currentYear++;
this.drawCurrent();
}
};
window.Calendar = Calendar;
window.CalendarNamespace = CalendarNamespace;
}

View File

@ -0,0 +1,29 @@
'use strict';
{
// Call function fn when the DOM is loaded and ready. If it is already
// loaded, call the function now.
// http://youmightnotneedjquery.com/#ready
function ready(fn) {
if (document.readyState !== 'loading') {
fn();
} else {
document.addEventListener('DOMContentLoaded', fn);
}
}
ready(function() {
function handleClick(event) {
event.preventDefault();
const params = new URLSearchParams(window.location.search);
if (params.has('_popup')) {
window.close(); // Close the popup.
} else {
window.history.back(); // Otherwise, go back.
}
}
document.querySelectorAll('.cancel-link').forEach(function(el) {
el.addEventListener('click', handleClick);
});
});
}

View File

@ -0,0 +1,16 @@
'use strict';
{
const inputTags = ['BUTTON', 'INPUT', 'SELECT', 'TEXTAREA'];
const modelName = document.getElementById('django-admin-form-add-constants').dataset.modelName;
if (modelName) {
const form = document.getElementById(modelName + '_form');
for (const element of form.elements) {
// HTMLElement.offsetParent returns null when the element is not
// rendered.
if (inputTags.includes(element.tagName) && !element.disabled && element.offsetParent) {
element.focus();
break;
}
}
}
}

View File

@ -0,0 +1,184 @@
// Core JavaScript helper functions
'use strict';
// quickElement(tagType, parentReference [, textInChildNode, attribute, attributeValue ...]);
function quickElement() {
const obj = document.createElement(arguments[0]);
if (arguments[2]) {
const textNode = document.createTextNode(arguments[2]);
obj.appendChild(textNode);
}
const len = arguments.length;
for (let i = 3; i < len; i += 2) {
obj.setAttribute(arguments[i], arguments[i + 1]);
}
arguments[1].appendChild(obj);
return obj;
}
// "a" is reference to an object
function removeChildren(a) {
while (a.hasChildNodes()) {
a.removeChild(a.lastChild);
}
}
// ----------------------------------------------------------------------------
// Find-position functions by PPK
// See https://www.quirksmode.org/js/findpos.html
// ----------------------------------------------------------------------------
function findPosX(obj) {
let curleft = 0;
if (obj.offsetParent) {
while (obj.offsetParent) {
curleft += obj.offsetLeft - obj.scrollLeft;
obj = obj.offsetParent;
}
} else if (obj.x) {
curleft += obj.x;
}
return curleft;
}
function findPosY(obj) {
let curtop = 0;
if (obj.offsetParent) {
while (obj.offsetParent) {
curtop += obj.offsetTop - obj.scrollTop;
obj = obj.offsetParent;
}
} else if (obj.y) {
curtop += obj.y;
}
return curtop;
}
//-----------------------------------------------------------------------------
// Date object extensions
// ----------------------------------------------------------------------------
{
Date.prototype.getTwelveHours = function() {
return this.getHours() % 12 || 12;
};
Date.prototype.getTwoDigitMonth = function() {
return (this.getMonth() < 9) ? '0' + (this.getMonth() + 1) : (this.getMonth() + 1);
};
Date.prototype.getTwoDigitDate = function() {
return (this.getDate() < 10) ? '0' + this.getDate() : this.getDate();
};
Date.prototype.getTwoDigitTwelveHour = function() {
return (this.getTwelveHours() < 10) ? '0' + this.getTwelveHours() : this.getTwelveHours();
};
Date.prototype.getTwoDigitHour = function() {
return (this.getHours() < 10) ? '0' + this.getHours() : this.getHours();
};
Date.prototype.getTwoDigitMinute = function() {
return (this.getMinutes() < 10) ? '0' + this.getMinutes() : this.getMinutes();
};
Date.prototype.getTwoDigitSecond = function() {
return (this.getSeconds() < 10) ? '0' + this.getSeconds() : this.getSeconds();
};
Date.prototype.getAbbrevDayName = function() {
return typeof window.CalendarNamespace === "undefined"
? '0' + this.getDay()
: window.CalendarNamespace.daysOfWeekAbbrev[this.getDay()];
};
Date.prototype.getFullDayName = function() {
return typeof window.CalendarNamespace === "undefined"
? '0' + this.getDay()
: window.CalendarNamespace.daysOfWeek[this.getDay()];
};
Date.prototype.getAbbrevMonthName = function() {
return typeof window.CalendarNamespace === "undefined"
? this.getTwoDigitMonth()
: window.CalendarNamespace.monthsOfYearAbbrev[this.getMonth()];
};
Date.prototype.getFullMonthName = function() {
return typeof window.CalendarNamespace === "undefined"
? this.getTwoDigitMonth()
: window.CalendarNamespace.monthsOfYear[this.getMonth()];
};
Date.prototype.strftime = function(format) {
const fields = {
a: this.getAbbrevDayName(),
A: this.getFullDayName(),
b: this.getAbbrevMonthName(),
B: this.getFullMonthName(),
c: this.toString(),
d: this.getTwoDigitDate(),
H: this.getTwoDigitHour(),
I: this.getTwoDigitTwelveHour(),
m: this.getTwoDigitMonth(),
M: this.getTwoDigitMinute(),
p: (this.getHours() >= 12) ? 'PM' : 'AM',
S: this.getTwoDigitSecond(),
w: '0' + this.getDay(),
x: this.toLocaleDateString(),
X: this.toLocaleTimeString(),
y: ('' + this.getFullYear()).substr(2, 4),
Y: '' + this.getFullYear(),
'%': '%'
};
let result = '', i = 0;
while (i < format.length) {
if (format.charAt(i) === '%') {
result += fields[format.charAt(i + 1)];
++i;
}
else {
result += format.charAt(i);
}
++i;
}
return result;
};
// ----------------------------------------------------------------------------
// String object extensions
// ----------------------------------------------------------------------------
String.prototype.strptime = function(format) {
const split_format = format.split(/[.\-/]/);
const date = this.split(/[.\-/]/);
let i = 0;
let day, month, year;
while (i < split_format.length) {
switch (split_format[i]) {
case "%d":
day = date[i];
break;
case "%m":
month = date[i] - 1;
break;
case "%Y":
year = date[i];
break;
case "%y":
// A %y value in the range of [00, 68] is in the current
// century, while [69, 99] is in the previous century,
// according to the Open Group Specification.
if (parseInt(date[i], 10) >= 69) {
year = date[i];
} else {
year = (new Date(Date.UTC(date[i], 0))).getUTCFullYear() + 100;
}
break;
}
++i;
}
// Create Date object from UTC since the parsed value is supposed to be
// in UTC, not local time. Also, the calendar uses UTC functions for
// date extraction.
return new Date(Date.UTC(year, month, day));
};
}

View File

@ -0,0 +1,30 @@
/**
* Persist changelist filters state (collapsed/expanded).
*/
'use strict';
{
// Init filters.
let filters = JSON.parse(sessionStorage.getItem('django.admin.filtersState'));
if (!filters) {
filters = {};
}
Object.entries(filters).forEach(([key, value]) => {
const detailElement = document.querySelector(`[data-filter-title='${CSS.escape(key)}']`);
// Check if the filter is present, it could be from other view.
if (detailElement) {
value ? detailElement.setAttribute('open', '') : detailElement.removeAttribute('open');
}
});
// Save filter state when clicks.
const details = document.querySelectorAll('details');
details.forEach(detail => {
detail.addEventListener('toggle', event => {
filters[`${event.target.dataset.filterTitle}`] = detail.open;
sessionStorage.setItem('django.admin.filtersState', JSON.stringify(filters));
});
});
}

View File

@ -0,0 +1,359 @@
/*global DateTimeShortcuts, SelectFilter*/
/**
* Django admin inlines
*
* Based on jQuery Formset 1.1
* @author Stanislaus Madueke (stan DOT madueke AT gmail DOT com)
* @requires jQuery 1.2.6 or later
*
* Copyright (c) 2009, Stanislaus Madueke
* All rights reserved.
*
* Spiced up with Code from Zain Memon's GSoC project 2009
* and modified for Django by Jannis Leidel, Travis Swicegood and Julien Phalip.
*
* Licensed under the New BSD License
* See: https://opensource.org/licenses/bsd-license.php
*/
'use strict';
{
const $ = django.jQuery;
$.fn.formset = function(opts) {
const options = $.extend({}, $.fn.formset.defaults, opts);
const $this = $(this);
const $parent = $this.parent();
const updateElementIndex = function(el, prefix, ndx) {
const id_regex = new RegExp("(" + prefix + "-(\\d+|__prefix__))");
const replacement = prefix + "-" + ndx;
if ($(el).prop("for")) {
$(el).prop("for", $(el).prop("for").replace(id_regex, replacement));
}
if (el.id) {
el.id = el.id.replace(id_regex, replacement);
}
if (el.name) {
el.name = el.name.replace(id_regex, replacement);
}
};
const totalForms = $("#id_" + options.prefix + "-TOTAL_FORMS").prop("autocomplete", "off");
let nextIndex = parseInt(totalForms.val(), 10);
const maxForms = $("#id_" + options.prefix + "-MAX_NUM_FORMS").prop("autocomplete", "off");
const minForms = $("#id_" + options.prefix + "-MIN_NUM_FORMS").prop("autocomplete", "off");
let addButton;
/**
* The "Add another MyModel" button below the inline forms.
*/
const addInlineAddButton = function() {
if (addButton === null) {
if ($this.prop("tagName") === "TR") {
// If forms are laid out as table rows, insert the
// "add" button in a new table row:
const numCols = $this.eq(-1).children().length;
$parent.append('<tr class="' + options.addCssClass + '"><td colspan="' + numCols + '"><a href="#">' + options.addText + "</a></tr>");
addButton = $parent.find("tr:last a");
} else {
// Otherwise, insert it immediately after the last form:
$this.filter(":last").after('<div class="' + options.addCssClass + '"><a href="#">' + options.addText + "</a></div>");
addButton = $this.filter(":last").next().find("a");
}
}
addButton.on('click', addInlineClickHandler);
};
const addInlineClickHandler = function(e) {
e.preventDefault();
const template = $("#" + options.prefix + "-empty");
const row = template.clone(true);
row.removeClass(options.emptyCssClass)
.addClass(options.formCssClass)
.attr("id", options.prefix + "-" + nextIndex);
addInlineDeleteButton(row);
row.find("*").each(function() {
updateElementIndex(this, options.prefix, totalForms.val());
});
// Insert the new form when it has been fully edited.
row.insertBefore($(template));
// Update number of total forms.
$(totalForms).val(parseInt(totalForms.val(), 10) + 1);
nextIndex += 1;
// Hide the add button if there's a limit and it's been reached.
if ((maxForms.val() !== '') && (maxForms.val() - totalForms.val()) <= 0) {
addButton.parent().hide();
}
// Show the remove buttons if there are more than min_num.
toggleDeleteButtonVisibility(row.closest('.inline-group'));
// Pass the new form to the post-add callback, if provided.
if (options.added) {
options.added(row);
}
row.get(0).dispatchEvent(new CustomEvent("formset:added", {
bubbles: true,
detail: {
formsetName: options.prefix
}
}));
};
/**
* The "X" button that is part of every unsaved inline.
* (When saved, it is replaced with a "Delete" checkbox.)
*/
const addInlineDeleteButton = function(row) {
if (row.is("tr")) {
// If the forms are laid out in table rows, insert
// the remove button into the last table cell:
row.children(":last").append('<div><a class="' + options.deleteCssClass + '" href="#">' + options.deleteText + "</a></div>");
} else if (row.is("ul") || row.is("ol")) {
// If they're laid out as an ordered/unordered list,
// insert an <li> after the last list item:
row.append('<li><a class="' + options.deleteCssClass + '" href="#">' + options.deleteText + "</a></li>");
} else {
// Otherwise, just insert the remove button as the
// last child element of the form's container:
row.children(":first").append('<span><a class="' + options.deleteCssClass + '" href="#">' + options.deleteText + "</a></span>");
}
// Add delete handler for each row.
row.find("a." + options.deleteCssClass).on('click', inlineDeleteHandler.bind(this));
};
const inlineDeleteHandler = function(e1) {
e1.preventDefault();
const deleteButton = $(e1.target);
const row = deleteButton.closest('.' + options.formCssClass);
const inlineGroup = row.closest('.inline-group');
// Remove the parent form containing this button,
// and also remove the relevant row with non-field errors:
const prevRow = row.prev();
if (prevRow.length && prevRow.hasClass('row-form-errors')) {
prevRow.remove();
}
row.remove();
nextIndex -= 1;
// Pass the deleted form to the post-delete callback, if provided.
if (options.removed) {
options.removed(row);
}
document.dispatchEvent(new CustomEvent("formset:removed", {
detail: {
formsetName: options.prefix
}
}));
// Update the TOTAL_FORMS form count.
const forms = $("." + options.formCssClass);
$("#id_" + options.prefix + "-TOTAL_FORMS").val(forms.length);
// Show add button again once below maximum number.
if ((maxForms.val() === '') || (maxForms.val() - forms.length) > 0) {
addButton.parent().show();
}
// Hide the remove buttons if at min_num.
toggleDeleteButtonVisibility(inlineGroup);
// Also, update names and ids for all remaining form controls so
// they remain in sequence:
let i, formCount;
const updateElementCallback = function() {
updateElementIndex(this, options.prefix, i);
};
for (i = 0, formCount = forms.length; i < formCount; i++) {
updateElementIndex($(forms).get(i), options.prefix, i);
$(forms.get(i)).find("*").each(updateElementCallback);
}
};
const toggleDeleteButtonVisibility = function(inlineGroup) {
if ((minForms.val() !== '') && (minForms.val() - totalForms.val()) >= 0) {
inlineGroup.find('.inline-deletelink').hide();
} else {
inlineGroup.find('.inline-deletelink').show();
}
};
$this.each(function(i) {
$(this).not("." + options.emptyCssClass).addClass(options.formCssClass);
});
// Create the delete buttons for all unsaved inlines:
$this.filter('.' + options.formCssClass + ':not(.has_original):not(.' + options.emptyCssClass + ')').each(function() {
addInlineDeleteButton($(this));
});
toggleDeleteButtonVisibility($this);
// Create the add button, initially hidden.
addButton = options.addButton;
addInlineAddButton();
// Show the add button if allowed to add more items.
// Note that max_num = None translates to a blank string.
const showAddButton = maxForms.val() === '' || (maxForms.val() - totalForms.val()) > 0;
if ($this.length && showAddButton) {
addButton.parent().show();
} else {
addButton.parent().hide();
}
return this;
};
/* Setup plugin defaults */
$.fn.formset.defaults = {
prefix: "form", // The form prefix for your django formset
addText: "add another", // Text for the add link
deleteText: "remove", // Text for the delete link
addCssClass: "add-row", // CSS class applied to the add link
deleteCssClass: "delete-row", // CSS class applied to the delete link
emptyCssClass: "empty-row", // CSS class applied to the empty row
formCssClass: "dynamic-form", // CSS class applied to each form in a formset
added: null, // Function called each time a new form is added
removed: null, // Function called each time a form is deleted
addButton: null // Existing add button to use
};
// Tabular inlines ---------------------------------------------------------
$.fn.tabularFormset = function(selector, options) {
const $rows = $(this);
const reinitDateTimeShortCuts = function() {
// Reinitialize the calendar and clock widgets by force
if (typeof DateTimeShortcuts !== "undefined") {
$(".datetimeshortcuts").remove();
DateTimeShortcuts.init();
}
};
const updateSelectFilter = function() {
// If any SelectFilter widgets are a part of the new form,
// instantiate a new SelectFilter instance for it.
if (typeof SelectFilter !== 'undefined') {
$('.selectfilter').each(function(index, value) {
SelectFilter.init(value.id, this.dataset.fieldName, false);
});
$('.selectfilterstacked').each(function(index, value) {
SelectFilter.init(value.id, this.dataset.fieldName, true);
});
}
};
const initPrepopulatedFields = function(row) {
row.find('.prepopulated_field').each(function() {
const field = $(this),
input = field.find('input, select, textarea'),
dependency_list = input.data('dependency_list') || [],
dependencies = [];
$.each(dependency_list, function(i, field_name) {
dependencies.push('#' + row.find('.field-' + field_name).find('input, select, textarea').attr('id'));
});
if (dependencies.length) {
input.prepopulate(dependencies, input.attr('maxlength'));
}
});
};
$rows.formset({
prefix: options.prefix,
addText: options.addText,
formCssClass: "dynamic-" + options.prefix,
deleteCssClass: "inline-deletelink",
deleteText: options.deleteText,
emptyCssClass: "empty-form",
added: function(row) {
initPrepopulatedFields(row);
reinitDateTimeShortCuts();
updateSelectFilter();
},
addButton: options.addButton
});
return $rows;
};
// Stacked inlines ---------------------------------------------------------
$.fn.stackedFormset = function(selector, options) {
const $rows = $(this);
const updateInlineLabel = function(row) {
$(selector).find(".inline_label").each(function(i) {
const count = i + 1;
$(this).html($(this).html().replace(/(#\d+)/g, "#" + count));
});
};
const reinitDateTimeShortCuts = function() {
// Reinitialize the calendar and clock widgets by force, yuck.
if (typeof DateTimeShortcuts !== "undefined") {
$(".datetimeshortcuts").remove();
DateTimeShortcuts.init();
}
};
const updateSelectFilter = function() {
// If any SelectFilter widgets were added, instantiate a new instance.
if (typeof SelectFilter !== "undefined") {
$(".selectfilter").each(function(index, value) {
SelectFilter.init(value.id, this.dataset.fieldName, false);
});
$(".selectfilterstacked").each(function(index, value) {
SelectFilter.init(value.id, this.dataset.fieldName, true);
});
}
};
const initPrepopulatedFields = function(row) {
row.find('.prepopulated_field').each(function() {
const field = $(this),
input = field.find('input, select, textarea'),
dependency_list = input.data('dependency_list') || [],
dependencies = [];
$.each(dependency_list, function(i, field_name) {
// Dependency in a fieldset.
let field_element = row.find('.form-row .field-' + field_name);
// Dependency without a fieldset.
if (!field_element.length) {
field_element = row.find('.form-row.field-' + field_name);
}
dependencies.push('#' + field_element.find('input, select, textarea').attr('id'));
});
if (dependencies.length) {
input.prepopulate(dependencies, input.attr('maxlength'));
}
});
};
$rows.formset({
prefix: options.prefix,
addText: options.addText,
formCssClass: "dynamic-" + options.prefix,
deleteCssClass: "inline-deletelink",
deleteText: options.deleteText,
emptyCssClass: "empty-form",
removed: updateInlineLabel,
added: function(row) {
initPrepopulatedFields(row);
reinitDateTimeShortCuts();
updateSelectFilter();
updateInlineLabel(row);
},
addButton: options.addButton
});
return $rows;
};
$(document).ready(function() {
$(".js-inline-admin-formset").each(function() {
const data = $(this).data(),
inlineOptions = data.inlineFormset;
let selector;
switch(data.inlineType) {
case "stacked":
selector = inlineOptions.name + "-group .inline-related";
$(selector).stackedFormset(selector, inlineOptions.options);
break;
case "tabular":
selector = inlineOptions.name + "-group .tabular.inline-related tbody:first > tr.form-row";
$(selector).tabularFormset(selector, inlineOptions.options);
break;
}
});
});
}

View File

@ -0,0 +1,8 @@
/*global jQuery:false*/
'use strict';
/* Puts the included jQuery into our own namespace using noConflict and passing
* it 'true'. This ensures that the included jQuery doesn't pollute the global
* namespace (i.e. this preserves pre-existing values for both window.$ and
* window.jQuery).
*/
window.django = {jQuery: jQuery.noConflict(true)};

View File

@ -0,0 +1,79 @@
'use strict';
{
const toggleNavSidebar = document.getElementById('toggle-nav-sidebar');
if (toggleNavSidebar !== null) {
const navSidebar = document.getElementById('nav-sidebar');
const main = document.getElementById('main');
let navSidebarIsOpen = localStorage.getItem('django.admin.navSidebarIsOpen');
if (navSidebarIsOpen === null) {
navSidebarIsOpen = 'true';
}
main.classList.toggle('shifted', navSidebarIsOpen === 'true');
navSidebar.setAttribute('aria-expanded', navSidebarIsOpen);
toggleNavSidebar.addEventListener('click', function() {
if (navSidebarIsOpen === 'true') {
navSidebarIsOpen = 'false';
} else {
navSidebarIsOpen = 'true';
}
localStorage.setItem('django.admin.navSidebarIsOpen', navSidebarIsOpen);
main.classList.toggle('shifted');
navSidebar.setAttribute('aria-expanded', navSidebarIsOpen);
});
}
function initSidebarQuickFilter() {
const options = [];
const navSidebar = document.getElementById('nav-sidebar');
if (!navSidebar) {
return;
}
navSidebar.querySelectorAll('th[scope=row] a').forEach((container) => {
options.push({title: container.innerHTML, node: container});
});
function checkValue(event) {
let filterValue = event.target.value;
if (filterValue) {
filterValue = filterValue.toLowerCase();
}
if (event.key === 'Escape') {
filterValue = '';
event.target.value = ''; // clear input
}
let matches = false;
for (const o of options) {
let displayValue = '';
if (filterValue) {
if (o.title.toLowerCase().indexOf(filterValue) === -1) {
displayValue = 'none';
} else {
matches = true;
}
}
// show/hide parent <TR>
o.node.parentNode.parentNode.style.display = displayValue;
}
if (!filterValue || matches) {
event.target.classList.remove('no-results');
} else {
event.target.classList.add('no-results');
}
sessionStorage.setItem('django.admin.navSidebarFilterValue', filterValue);
}
const nav = document.getElementById('nav-filter');
nav.addEventListener('change', checkValue, false);
nav.addEventListener('input', checkValue, false);
nav.addEventListener('keyup', checkValue, false);
const storedValue = sessionStorage.getItem('django.admin.navSidebarFilterValue');
if (storedValue) {
nav.value = storedValue;
checkValue({target: nav, key: ''});
}
}
window.initSidebarQuickFilter = initSidebarQuickFilter;
initSidebarQuickFilter();
}

View File

@ -0,0 +1,15 @@
'use strict';
{
const initData = JSON.parse(document.getElementById('django-admin-popup-response-constants').dataset.popupResponse);
switch(initData.action) {
case 'change':
opener.dismissChangeRelatedObjectPopup(window, initData.value, initData.obj, initData.new_value);
break;
case 'delete':
opener.dismissDeleteRelatedObjectPopup(window, initData.value);
break;
default:
opener.dismissAddRelatedObjectPopup(window, initData.value, initData.obj);
break;
}
}

View File

@ -0,0 +1,43 @@
/*global URLify*/
'use strict';
{
const $ = django.jQuery;
$.fn.prepopulate = function(dependencies, maxLength, allowUnicode) {
/*
Depends on urlify.js
Populates a selected field with the values of the dependent fields,
URLifies and shortens the string.
dependencies - array of dependent fields ids
maxLength - maximum length of the URLify'd string
allowUnicode - Unicode support of the URLify'd string
*/
return this.each(function() {
const prepopulatedField = $(this);
const populate = function() {
// Bail if the field's value has been changed by the user
if (prepopulatedField.data('_changed')) {
return;
}
const values = [];
$.each(dependencies, function(i, field) {
field = $(field);
if (field.val().length > 0) {
values.push(field.val());
}
});
prepopulatedField.val(URLify(values.join(' '), maxLength, allowUnicode));
};
prepopulatedField.data('_changed', false);
prepopulatedField.on('change', function() {
prepopulatedField.data('_changed', true);
});
if (!prepopulatedField.val()) {
$(dependencies.join(',')).on('keyup change focus', populate);
}
});
};
}

View File

@ -0,0 +1,15 @@
'use strict';
{
const $ = django.jQuery;
const fields = $('#django-admin-prepopulated-fields-constants').data('prepopulatedFields');
$.each(fields, function(index, field) {
$(
'.empty-form .form-row .field-' + field.name +
', .empty-form.form-row .field-' + field.name +
', .empty-form .form-row.field-' + field.name
).addClass('prepopulated_field');
$(field.id).data('dependency_list', field.dependency_list).prepopulate(
field.dependency_ids, field.maxLength, field.allowUnicode
);
});
}

View File

@ -0,0 +1,51 @@
'use strict';
{
function setTheme(mode) {
if (mode !== "light" && mode !== "dark" && mode !== "auto") {
console.error(`Got invalid theme mode: ${mode}. Resetting to auto.`);
mode = "auto";
}
document.documentElement.dataset.theme = mode;
localStorage.setItem("theme", mode);
}
function cycleTheme() {
const currentTheme = localStorage.getItem("theme") || "auto";
const prefersDark = window.matchMedia("(prefers-color-scheme: dark)").matches;
if (prefersDark) {
// Auto (dark) -> Light -> Dark
if (currentTheme === "auto") {
setTheme("light");
} else if (currentTheme === "light") {
setTheme("dark");
} else {
setTheme("auto");
}
} else {
// Auto (light) -> Dark -> Light
if (currentTheme === "auto") {
setTheme("dark");
} else if (currentTheme === "dark") {
setTheme("light");
} else {
setTheme("auto");
}
}
}
function initTheme() {
// set theme defined in localStorage if there is one, or fallback to auto mode
const currentTheme = localStorage.getItem("theme");
currentTheme ? setTheme(currentTheme) : setTheme("auto");
}
window.addEventListener('load', function(_) {
const buttons = document.getElementsByClassName("theme-toggle");
Array.from(buttons).forEach((btn) => {
btn.addEventListener("click", cycleTheme);
});
});
initTheme();
}

View File

@ -0,0 +1,29 @@
"use strict";
// Fallback JS for browsers which do not support :has selector used in
// admin/css/unusable_password_fields.css
// Remove file once all supported browsers support :has selector
try {
// If browser does not support :has selector this will raise an error
document.querySelector("form:has(input)");
} catch (error) {
console.log("Defaulting to javascript for usable password form management: " + error);
// JS replacement for unsupported :has selector
document.querySelectorAll('input[name="usable_password"]').forEach(option => {
option.addEventListener('change', function() {
const usablePassword = (this.value === "true" ? this.checked : !this.checked);
const submit1 = document.querySelector('input[type="submit"].set-password');
const submit2 = document.querySelector('input[type="submit"].unset-password');
const messages = document.querySelector('#id_unusable_warning');
document.getElementById('id_password1').closest('.form-row').hidden = !usablePassword;
document.getElementById('id_password2').closest('.form-row').hidden = !usablePassword;
if (messages) {
messages.hidden = usablePassword;
}
if (submit1 && submit2) {
submit1.hidden = !usablePassword;
submit2.hidden = usablePassword;
}
});
option.dispatchEvent(new Event('change'));
});
}

View File

@ -0,0 +1,169 @@
/*global XRegExp*/
'use strict';
{
const LATIN_MAP = {
'À': 'A', 'Á': 'A', 'Â': 'A', 'Ã': 'A', 'Ä': 'A', 'Å': 'A', 'Æ': 'AE',
'Ç': 'C', 'È': 'E', 'É': 'E', 'Ê': 'E', 'Ë': 'E', 'Ì': 'I', 'Í': 'I',
'Î': 'I', 'Ï': 'I', 'Ð': 'D', 'Ñ': 'N', 'Ò': 'O', 'Ó': 'O', 'Ô': 'O',
'Õ': 'O', 'Ö': 'O', 'Ő': 'O', 'Ø': 'O', 'Ù': 'U', 'Ú': 'U', 'Û': 'U',
'Ü': 'U', 'Ű': 'U', 'Ý': 'Y', 'Þ': 'TH', 'Ÿ': 'Y', 'ß': 'ss', 'à': 'a',
'á': 'a', 'â': 'a', 'ã': 'a', 'ä': 'a', 'å': 'a', 'æ': 'ae', 'ç': 'c',
'è': 'e', 'é': 'e', 'ê': 'e', 'ë': 'e', 'ì': 'i', 'í': 'i', 'î': 'i',
'ï': 'i', 'ð': 'd', 'ñ': 'n', 'ò': 'o', 'ó': 'o', 'ô': 'o', 'õ': 'o',
'ö': 'o', 'ő': 'o', 'ø': 'o', 'ù': 'u', 'ú': 'u', 'û': 'u', 'ü': 'u',
'ű': 'u', 'ý': 'y', 'þ': 'th', 'ÿ': 'y'
};
const LATIN_SYMBOLS_MAP = {
'©': '(c)'
};
const GREEK_MAP = {
'α': 'a', 'β': 'b', 'γ': 'g', 'δ': 'd', 'ε': 'e', 'ζ': 'z', 'η': 'h',
'θ': '8', 'ι': 'i', 'κ': 'k', 'λ': 'l', 'μ': 'm', 'ν': 'n', 'ξ': '3',
'ο': 'o', 'π': 'p', 'ρ': 'r', 'σ': 's', 'τ': 't', 'υ': 'y', 'φ': 'f',
'χ': 'x', 'ψ': 'ps', 'ω': 'w', 'ά': 'a', 'έ': 'e', 'ί': 'i', 'ό': 'o',
'ύ': 'y', 'ή': 'h', 'ώ': 'w', 'ς': 's', 'ϊ': 'i', 'ΰ': 'y', 'ϋ': 'y',
'ΐ': 'i', 'Α': 'A', 'Β': 'B', 'Γ': 'G', 'Δ': 'D', 'Ε': 'E', 'Ζ': 'Z',
'Η': 'H', 'Θ': '8', 'Ι': 'I', 'Κ': 'K', 'Λ': 'L', 'Μ': 'M', 'Ν': 'N',
'Ξ': '3', 'Ο': 'O', 'Π': 'P', 'Ρ': 'R', 'Σ': 'S', 'Τ': 'T', 'Υ': 'Y',
'Φ': 'F', 'Χ': 'X', 'Ψ': 'PS', 'Ω': 'W', 'Ά': 'A', 'Έ': 'E', 'Ί': 'I',
'Ό': 'O', 'Ύ': 'Y', 'Ή': 'H', 'Ώ': 'W', 'Ϊ': 'I', 'Ϋ': 'Y'
};
const TURKISH_MAP = {
'ş': 's', 'Ş': 'S', 'ı': 'i', 'İ': 'I', 'ç': 'c', 'Ç': 'C', 'ü': 'u',
'Ü': 'U', 'ö': 'o', 'Ö': 'O', 'ğ': 'g', 'Ğ': 'G'
};
const ROMANIAN_MAP = {
'ă': 'a', 'î': 'i', 'ș': 's', 'ț': 't', 'â': 'a',
'Ă': 'A', 'Î': 'I', 'Ș': 'S', 'Ț': 'T', 'Â': 'A'
};
const RUSSIAN_MAP = {
'а': 'a', 'б': 'b', 'в': 'v', 'г': 'g', 'д': 'd', 'е': 'e', 'ё': 'yo',
'ж': 'zh', 'з': 'z', 'и': 'i', 'й': 'j', 'к': 'k', 'л': 'l', 'м': 'm',
'н': 'n', 'о': 'o', 'п': 'p', 'р': 'r', 'с': 's', 'т': 't', 'у': 'u',
'ф': 'f', 'х': 'h', 'ц': 'c', 'ч': 'ch', 'ш': 'sh', 'щ': 'sh', 'ъ': '',
'ы': 'y', 'ь': '', 'э': 'e', 'ю': 'yu', 'я': 'ya',
'А': 'A', 'Б': 'B', 'В': 'V', 'Г': 'G', 'Д': 'D', 'Е': 'E', 'Ё': 'Yo',
'Ж': 'Zh', 'З': 'Z', 'И': 'I', 'Й': 'J', 'К': 'K', 'Л': 'L', 'М': 'M',
'Н': 'N', 'О': 'O', 'П': 'P', 'Р': 'R', 'С': 'S', 'Т': 'T', 'У': 'U',
'Ф': 'F', 'Х': 'H', 'Ц': 'C', 'Ч': 'Ch', 'Ш': 'Sh', 'Щ': 'Sh', 'Ъ': '',
'Ы': 'Y', 'Ь': '', 'Э': 'E', 'Ю': 'Yu', 'Я': 'Ya'
};
const UKRAINIAN_MAP = {
'Є': 'Ye', 'І': 'I', 'Ї': 'Yi', 'Ґ': 'G', 'є': 'ye', 'і': 'i',
'ї': 'yi', 'ґ': 'g'
};
const CZECH_MAP = {
'č': 'c', 'ď': 'd', 'ě': 'e', 'ň': 'n', 'ř': 'r', 'š': 's', 'ť': 't',
'ů': 'u', 'ž': 'z', 'Č': 'C', 'Ď': 'D', 'Ě': 'E', 'Ň': 'N', 'Ř': 'R',
'Š': 'S', 'Ť': 'T', 'Ů': 'U', 'Ž': 'Z'
};
const SLOVAK_MAP = {
'á': 'a', 'ä': 'a', 'č': 'c', 'ď': 'd', 'é': 'e', 'í': 'i', 'ľ': 'l',
'ĺ': 'l', 'ň': 'n', 'ó': 'o', 'ô': 'o', 'ŕ': 'r', 'š': 's', 'ť': 't',
'ú': 'u', 'ý': 'y', 'ž': 'z',
'Á': 'a', 'Ä': 'A', 'Č': 'C', 'Ď': 'D', 'É': 'E', 'Í': 'I', 'Ľ': 'L',
'Ĺ': 'L', 'Ň': 'N', 'Ó': 'O', 'Ô': 'O', 'Ŕ': 'R', 'Š': 'S', 'Ť': 'T',
'Ú': 'U', 'Ý': 'Y', 'Ž': 'Z'
};
const POLISH_MAP = {
'ą': 'a', 'ć': 'c', 'ę': 'e', 'ł': 'l', 'ń': 'n', 'ó': 'o', 'ś': 's',
'ź': 'z', 'ż': 'z',
'Ą': 'A', 'Ć': 'C', 'Ę': 'E', 'Ł': 'L', 'Ń': 'N', 'Ó': 'O', 'Ś': 'S',
'Ź': 'Z', 'Ż': 'Z'
};
const LATVIAN_MAP = {
'ā': 'a', 'č': 'c', 'ē': 'e', 'ģ': 'g', 'ī': 'i', 'ķ': 'k', 'ļ': 'l',
'ņ': 'n', 'š': 's', 'ū': 'u', 'ž': 'z',
'Ā': 'A', 'Č': 'C', 'Ē': 'E', 'Ģ': 'G', 'Ī': 'I', 'Ķ': 'K', 'Ļ': 'L',
'Ņ': 'N', 'Š': 'S', 'Ū': 'U', 'Ž': 'Z'
};
const ARABIC_MAP = {
'أ': 'a', 'ب': 'b', 'ت': 't', 'ث': 'th', 'ج': 'g', 'ح': 'h', 'خ': 'kh', 'د': 'd',
'ذ': 'th', 'ر': 'r', 'ز': 'z', 'س': 's', 'ش': 'sh', 'ص': 's', 'ض': 'd', 'ط': 't',
'ظ': 'th', 'ع': 'aa', 'غ': 'gh', 'ف': 'f', 'ق': 'k', 'ك': 'k', 'ل': 'l', 'م': 'm',
'ن': 'n', 'ه': 'h', 'و': 'o', 'ي': 'y'
};
const LITHUANIAN_MAP = {
'ą': 'a', 'č': 'c', 'ę': 'e', 'ė': 'e', 'į': 'i', 'š': 's', 'ų': 'u',
'ū': 'u', 'ž': 'z',
'Ą': 'A', 'Č': 'C', 'Ę': 'E', 'Ė': 'E', 'Į': 'I', 'Š': 'S', 'Ų': 'U',
'Ū': 'U', 'Ž': 'Z'
};
const SERBIAN_MAP = {
'ђ': 'dj', 'ј': 'j', 'љ': 'lj', 'њ': 'nj', 'ћ': 'c', 'џ': 'dz',
'đ': 'dj', 'Ђ': 'Dj', 'Ј': 'j', 'Љ': 'Lj', 'Њ': 'Nj', 'Ћ': 'C',
'Џ': 'Dz', 'Đ': 'Dj'
};
const AZERBAIJANI_MAP = {
'ç': 'c', 'ə': 'e', 'ğ': 'g', 'ı': 'i', 'ö': 'o', 'ş': 's', 'ü': 'u',
'Ç': 'C', 'Ə': 'E', 'Ğ': 'G', 'İ': 'I', 'Ö': 'O', 'Ş': 'S', 'Ü': 'U'
};
const GEORGIAN_MAP = {
'ა': 'a', 'ბ': 'b', 'გ': 'g', 'დ': 'd', 'ე': 'e', 'ვ': 'v', 'ზ': 'z',
'თ': 't', 'ი': 'i', 'კ': 'k', 'ლ': 'l', 'მ': 'm', 'ნ': 'n', 'ო': 'o',
'პ': 'p', 'ჟ': 'j', 'რ': 'r', 'ს': 's', 'ტ': 't', 'უ': 'u', 'ფ': 'f',
'ქ': 'q', 'ღ': 'g', '': 'y', 'შ': 'sh', 'ჩ': 'ch', 'ც': 'c', 'ძ': 'dz',
'წ': 'w', 'ჭ': 'ch', 'ხ': 'x', 'ჯ': 'j', 'ჰ': 'h'
};
const ALL_DOWNCODE_MAPS = [
LATIN_MAP,
LATIN_SYMBOLS_MAP,
GREEK_MAP,
TURKISH_MAP,
ROMANIAN_MAP,
RUSSIAN_MAP,
UKRAINIAN_MAP,
CZECH_MAP,
SLOVAK_MAP,
POLISH_MAP,
LATVIAN_MAP,
ARABIC_MAP,
LITHUANIAN_MAP,
SERBIAN_MAP,
AZERBAIJANI_MAP,
GEORGIAN_MAP
];
const Downcoder = {
'Initialize': function() {
if (Downcoder.map) { // already made
return;
}
Downcoder.map = {};
for (const lookup of ALL_DOWNCODE_MAPS) {
Object.assign(Downcoder.map, lookup);
}
Downcoder.regex = new RegExp(Object.keys(Downcoder.map).join('|'), 'g');
}
};
function downcode(slug) {
Downcoder.Initialize();
return slug.replace(Downcoder.regex, function(m) {
return Downcoder.map[m];
});
}
function URLify(s, num_chars, allowUnicode) {
// changes, e.g., "Petty theft" to "petty-theft"
if (!allowUnicode) {
s = downcode(s);
}
s = s.toLowerCase(); // convert to lowercase
// if downcode doesn't hit, the char will be stripped here
if (allowUnicode) {
// Keep Unicode letters including both lowercase and uppercase
// characters, whitespace, and dash; remove other characters.
s = XRegExp.replace(s, XRegExp('[^-_\\p{L}\\p{N}\\s]', 'g'), '');
} else {
s = s.replace(/[^-\w\s]/g, ''); // remove unneeded chars
}
s = s.replace(/^\s+|\s+$/g, ''); // trim leading/trailing spaces
s = s.replace(/[-\s]+/g, '-'); // convert spaces to hyphens
s = s.substring(0, num_chars); // trim to first num_chars chars
return s.replace(/-+$/g, ''); // trim any trailing hyphens
}
window.URLify = URLify;
}

View File

@ -0,0 +1,20 @@
Copyright OpenJS Foundation and other contributors, https://openjsf.org/
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,21 @@
The MIT License (MIT)
Copyright (c) 2012-2017 Kevin Brown, Igor Vaynberg, and Select2 contributors
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

View File

@ -0,0 +1,3 @@
/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/af",[],function(){return{errorLoading:function(){return"Die resultate kon nie gelaai word nie."},inputTooLong:function(e){var n=e.input.length-e.maximum,r="Verwyders asseblief "+n+" character";return 1!=n&&(r+="s"),r},inputTooShort:function(e){return"Voer asseblief "+(e.minimum-e.input.length)+" of meer karakters"},loadingMore:function(){return"Meer resultate word gelaai…"},maximumSelected:function(e){var n="Kies asseblief net "+e.maximum+" item";return 1!=e.maximum&&(n+="s"),n},noResults:function(){return"Geen resultate gevind"},searching:function(){return"Besig…"},removeAllItems:function(){return"Verwyder alle items"}}}),e.define,e.require}();

View File

@ -0,0 +1,3 @@
/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ar",[],function(){return{errorLoading:function(){return"لا يمكن تحميل النتائج"},inputTooLong:function(n){return"الرجاء حذف "+(n.input.length-n.maximum)+" عناصر"},inputTooShort:function(n){return"الرجاء إضافة "+(n.minimum-n.input.length)+" عناصر"},loadingMore:function(){return"جاري تحميل نتائج إضافية..."},maximumSelected:function(n){return"تستطيع إختيار "+n.maximum+" بنود فقط"},noResults:function(){return"لم يتم العثور على أي نتائج"},searching:function(){return"جاري البحث…"},removeAllItems:function(){return"قم بإزالة كل العناصر"}}}),n.define,n.require}();

View File

@ -0,0 +1,3 @@
/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/az",[],function(){return{inputTooLong:function(n){return n.input.length-n.maximum+" simvol silin"},inputTooShort:function(n){return n.minimum-n.input.length+" simvol daxil edin"},loadingMore:function(){return"Daha çox nəticə yüklənir…"},maximumSelected:function(n){return"Sadəcə "+n.maximum+" element seçə bilərsiniz"},noResults:function(){return"Nəticə tapılmadı"},searching:function(){return"Axtarılır…"},removeAllItems:function(){return"Bütün elementləri sil"}}}),n.define,n.require}();

View File

@ -0,0 +1,3 @@
/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/bg",[],function(){return{inputTooLong:function(n){var e=n.input.length-n.maximum,u="Моля въведете с "+e+" по-малко символ";return e>1&&(u+="a"),u},inputTooShort:function(n){var e=n.minimum-n.input.length,u="Моля въведете още "+e+" символ";return e>1&&(u+="a"),u},loadingMore:function(){return"Зареждат се още…"},maximumSelected:function(n){var e="Можете да направите до "+n.maximum+" ";return n.maximum>1?e+="избора":e+="избор",e},noResults:function(){return"Няма намерени съвпадения"},searching:function(){return"Търсене…"},removeAllItems:function(){return"Премахнете всички елементи"}}}),n.define,n.require}();

View File

@ -0,0 +1,3 @@
/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/bn",[],function(){return{errorLoading:function(){return"ফলাফলগুলি লোড করা যায়নি।"},inputTooLong:function(n){var e=n.input.length-n.maximum,u="অনুগ্রহ করে "+e+" টি অক্ষর মুছে দিন।";return 1!=e&&(u="অনুগ্রহ করে "+e+" টি অক্ষর মুছে দিন।"),u},inputTooShort:function(n){return n.minimum-n.input.length+" টি অক্ষর অথবা অধিক অক্ষর লিখুন।"},loadingMore:function(){return"আরো ফলাফল লোড হচ্ছে ..."},maximumSelected:function(n){var e=n.maximum+" টি আইটেম নির্বাচন করতে পারবেন।";return 1!=n.maximum&&(e=n.maximum+" টি আইটেম নির্বাচন করতে পারবেন।"),e},noResults:function(){return"কোন ফলাফল পাওয়া যায়নি।"},searching:function(){return"অনুসন্ধান করা হচ্ছে ..."}}}),n.define,n.require}();

View File

@ -0,0 +1,3 @@
/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/bs",[],function(){function e(e,n,r,t){return e%10==1&&e%100!=11?n:e%10>=2&&e%10<=4&&(e%100<12||e%100>14)?r:t}return{errorLoading:function(){return"Preuzimanje nije uspijelo."},inputTooLong:function(n){var r=n.input.length-n.maximum,t="Obrišite "+r+" simbol";return t+=e(r,"","a","a")},inputTooShort:function(n){var r=n.minimum-n.input.length,t="Ukucajte bar još "+r+" simbol";return t+=e(r,"","a","a")},loadingMore:function(){return"Preuzimanje još rezultata…"},maximumSelected:function(n){var r="Možete izabrati samo "+n.maximum+" stavk";return r+=e(n.maximum,"u","e","i")},noResults:function(){return"Ništa nije pronađeno"},searching:function(){return"Pretraga…"},removeAllItems:function(){return"Uklonite sve stavke"}}}),e.define,e.require}();

View File

@ -0,0 +1,3 @@
/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/ca",[],function(){return{errorLoading:function(){return"La càrrega ha fallat"},inputTooLong:function(e){var n=e.input.length-e.maximum,r="Si us plau, elimina "+n+" car";return r+=1==n?"àcter":"àcters"},inputTooShort:function(e){var n=e.minimum-e.input.length,r="Si us plau, introdueix "+n+" car";return r+=1==n?"àcter":"àcters"},loadingMore:function(){return"Carregant més resultats…"},maximumSelected:function(e){var n="Només es pot seleccionar "+e.maximum+" element";return 1!=e.maximum&&(n+="s"),n},noResults:function(){return"No s'han trobat resultats"},searching:function(){return"Cercant…"},removeAllItems:function(){return"Treu tots els elements"}}}),e.define,e.require}();

View File

@ -0,0 +1,3 @@
/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/cs",[],function(){function e(e,n){switch(e){case 2:return n?"dva":"dvě";case 3:return"tři";case 4:return"čtyři"}return""}return{errorLoading:function(){return"Výsledky nemohly být načteny."},inputTooLong:function(n){var t=n.input.length-n.maximum;return 1==t?"Prosím, zadejte o jeden znak méně.":t<=4?"Prosím, zadejte o "+e(t,!0)+" znaky méně.":"Prosím, zadejte o "+t+" znaků méně."},inputTooShort:function(n){var t=n.minimum-n.input.length;return 1==t?"Prosím, zadejte ještě jeden znak.":t<=4?"Prosím, zadejte ještě další "+e(t,!0)+" znaky.":"Prosím, zadejte ještě dalších "+t+" znaků."},loadingMore:function(){return"Načítají se další výsledky…"},maximumSelected:function(n){var t=n.maximum;return 1==t?"Můžete zvolit jen jednu položku.":t<=4?"Můžete zvolit maximálně "+e(t,!1)+" položky.":"Můžete zvolit maximálně "+t+" položek."},noResults:function(){return"Nenalezeny žádné položky."},searching:function(){return"Vyhledávání…"},removeAllItems:function(){return"Odstraňte všechny položky"}}}),e.define,e.require}();

View File

@ -0,0 +1,3 @@
/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/da",[],function(){return{errorLoading:function(){return"Resultaterne kunne ikke indlæses."},inputTooLong:function(e){return"Angiv venligst "+(e.input.length-e.maximum)+" tegn mindre"},inputTooShort:function(e){return"Angiv venligst "+(e.minimum-e.input.length)+" tegn mere"},loadingMore:function(){return"Indlæser flere resultater…"},maximumSelected:function(e){var n="Du kan kun vælge "+e.maximum+" emne";return 1!=e.maximum&&(n+="r"),n},noResults:function(){return"Ingen resultater fundet"},searching:function(){return"Søger…"},removeAllItems:function(){return"Fjern alle elementer"}}}),e.define,e.require}();

View File

@ -0,0 +1,3 @@
/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/de",[],function(){return{errorLoading:function(){return"Die Ergebnisse konnten nicht geladen werden."},inputTooLong:function(e){return"Bitte "+(e.input.length-e.maximum)+" Zeichen weniger eingeben"},inputTooShort:function(e){return"Bitte "+(e.minimum-e.input.length)+" Zeichen mehr eingeben"},loadingMore:function(){return"Lade mehr Ergebnisse…"},maximumSelected:function(e){var n="Sie können nur "+e.maximum+" Element";return 1!=e.maximum&&(n+="e"),n+=" auswählen"},noResults:function(){return"Keine Übereinstimmungen gefunden"},searching:function(){return"Suche…"},removeAllItems:function(){return"Entferne alle Elemente"}}}),e.define,e.require}();

View File

@ -0,0 +1,3 @@
/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/dsb",[],function(){var n=["znamuško","znamušce","znamuška","znamuškow"],e=["zapisk","zapiska","zapiski","zapiskow"],u=function(n,e){return 1===n?e[0]:2===n?e[1]:n>2&&n<=4?e[2]:n>=5?e[3]:void 0};return{errorLoading:function(){return"Wuslědki njejsu se dali zacytaś."},inputTooLong:function(e){var a=e.input.length-e.maximum;return"Pšosym lašuj "+a+" "+u(a,n)},inputTooShort:function(e){var a=e.minimum-e.input.length;return"Pšosym zapódaj nanejmjenjej "+a+" "+u(a,n)},loadingMore:function(){return"Dalšne wuslědki se zacytaju…"},maximumSelected:function(n){return"Móžoš jano "+n.maximum+" "+u(n.maximum,e)+"wubraś."},noResults:function(){return"Žedne wuslědki namakane"},searching:function(){return"Pyta se…"},removeAllItems:function(){return"Remove all items"}}}),n.define,n.require}();

View File

@ -0,0 +1,3 @@
/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/el",[],function(){return{errorLoading:function(){return"Τα αποτελέσματα δεν μπόρεσαν να φορτώσουν."},inputTooLong:function(n){var e=n.input.length-n.maximum,u="Παρακαλώ διαγράψτε "+e+" χαρακτήρ";return 1==e&&(u+="α"),1!=e&&(u+="ες"),u},inputTooShort:function(n){return"Παρακαλώ συμπληρώστε "+(n.minimum-n.input.length)+" ή περισσότερους χαρακτήρες"},loadingMore:function(){return"Φόρτωση περισσότερων αποτελεσμάτων…"},maximumSelected:function(n){var e="Μπορείτε να επιλέξετε μόνο "+n.maximum+" επιλογ";return 1==n.maximum&&(e+="ή"),1!=n.maximum&&(e+="ές"),e},noResults:function(){return"Δεν βρέθηκαν αποτελέσματα"},searching:function(){return"Αναζήτηση…"},removeAllItems:function(){return"Καταργήστε όλα τα στοιχεία"}}}),n.define,n.require}();

View File

@ -0,0 +1,3 @@
/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/en",[],function(){return{errorLoading:function(){return"The results could not be loaded."},inputTooLong:function(e){var n=e.input.length-e.maximum,r="Please delete "+n+" character";return 1!=n&&(r+="s"),r},inputTooShort:function(e){return"Please enter "+(e.minimum-e.input.length)+" or more characters"},loadingMore:function(){return"Loading more results…"},maximumSelected:function(e){var n="You can only select "+e.maximum+" item";return 1!=e.maximum&&(n+="s"),n},noResults:function(){return"No results found"},searching:function(){return"Searching…"},removeAllItems:function(){return"Remove all items"}}}),e.define,e.require}();

View File

@ -0,0 +1,3 @@
/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/es",[],function(){return{errorLoading:function(){return"No se pudieron cargar los resultados"},inputTooLong:function(e){var n=e.input.length-e.maximum,r="Por favor, elimine "+n+" car";return r+=1==n?"ácter":"acteres"},inputTooShort:function(e){var n=e.minimum-e.input.length,r="Por favor, introduzca "+n+" car";return r+=1==n?"ácter":"acteres"},loadingMore:function(){return"Cargando más resultados…"},maximumSelected:function(e){var n="Sólo puede seleccionar "+e.maximum+" elemento";return 1!=e.maximum&&(n+="s"),n},noResults:function(){return"No se encontraron resultados"},searching:function(){return"Buscando…"},removeAllItems:function(){return"Eliminar todos los elementos"}}}),e.define,e.require}();

View File

@ -0,0 +1,3 @@
/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/et",[],function(){return{inputTooLong:function(e){var n=e.input.length-e.maximum,t="Sisesta "+n+" täht";return 1!=n&&(t+="e"),t+=" vähem"},inputTooShort:function(e){var n=e.minimum-e.input.length,t="Sisesta "+n+" täht";return 1!=n&&(t+="e"),t+=" rohkem"},loadingMore:function(){return"Laen tulemusi…"},maximumSelected:function(e){var n="Saad vaid "+e.maximum+" tulemus";return 1==e.maximum?n+="e":n+="t",n+=" valida"},noResults:function(){return"Tulemused puuduvad"},searching:function(){return"Otsin…"},removeAllItems:function(){return"Eemalda kõik esemed"}}}),e.define,e.require}();

View File

@ -0,0 +1,3 @@
/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/eu",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Idatzi ";return n+=1==t?"karaktere bat":t+" karaktere",n+=" gutxiago"},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Idatzi ";return n+=1==t?"karaktere bat":t+" karaktere",n+=" gehiago"},loadingMore:function(){return"Emaitza gehiago kargatzen…"},maximumSelected:function(e){return 1===e.maximum?"Elementu bakarra hauta dezakezu":e.maximum+" elementu hauta ditzakezu soilik"},noResults:function(){return"Ez da bat datorrenik aurkitu"},searching:function(){return"Bilatzen…"},removeAllItems:function(){return"Kendu elementu guztiak"}}}),e.define,e.require}();

View File

@ -0,0 +1,3 @@
/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/fa",[],function(){return{errorLoading:function(){return"امکان بارگذاری نتایج وجود ندارد."},inputTooLong:function(n){return"لطفاً "+(n.input.length-n.maximum)+" کاراکتر را حذف نمایید"},inputTooShort:function(n){return"لطفاً تعداد "+(n.minimum-n.input.length)+" کاراکتر یا بیشتر وارد نمایید"},loadingMore:function(){return"در حال بارگذاری نتایج بیشتر..."},maximumSelected:function(n){return"شما تنها می‌توانید "+n.maximum+" آیتم را انتخاب نمایید"},noResults:function(){return"هیچ نتیجه‌ای یافت نشد"},searching:function(){return"در حال جستجو..."},removeAllItems:function(){return"همه موارد را حذف کنید"}}}),n.define,n.require}();

View File

@ -0,0 +1,3 @@
/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/fi",[],function(){return{errorLoading:function(){return"Tuloksia ei saatu ladattua."},inputTooLong:function(n){return"Ole hyvä ja anna "+(n.input.length-n.maximum)+" merkkiä vähemmän"},inputTooShort:function(n){return"Ole hyvä ja anna "+(n.minimum-n.input.length)+" merkkiä lisää"},loadingMore:function(){return"Ladataan lisää tuloksia…"},maximumSelected:function(n){return"Voit valita ainoastaan "+n.maximum+" kpl"},noResults:function(){return"Ei tuloksia"},searching:function(){return"Haetaan…"},removeAllItems:function(){return"Poista kaikki kohteet"}}}),n.define,n.require}();

View File

@ -0,0 +1,3 @@
/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/fr",[],function(){return{errorLoading:function(){return"Les résultats ne peuvent pas être chargés."},inputTooLong:function(e){var n=e.input.length-e.maximum;return"Supprimez "+n+" caractère"+(n>1?"s":"")},inputTooShort:function(e){var n=e.minimum-e.input.length;return"Saisissez au moins "+n+" caractère"+(n>1?"s":"")},loadingMore:function(){return"Chargement de résultats supplémentaires…"},maximumSelected:function(e){return"Vous pouvez seulement sélectionner "+e.maximum+" élément"+(e.maximum>1?"s":"")},noResults:function(){return"Aucun résultat trouvé"},searching:function(){return"Recherche en cours…"},removeAllItems:function(){return"Supprimer tous les éléments"}}}),e.define,e.require}();

View File

@ -0,0 +1,3 @@
/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/gl",[],function(){return{errorLoading:function(){return"Non foi posíbel cargar os resultados."},inputTooLong:function(e){var n=e.input.length-e.maximum;return 1===n?"Elimine un carácter":"Elimine "+n+" caracteres"},inputTooShort:function(e){var n=e.minimum-e.input.length;return 1===n?"Engada un carácter":"Engada "+n+" caracteres"},loadingMore:function(){return"Cargando máis resultados…"},maximumSelected:function(e){return 1===e.maximum?"Só pode seleccionar un elemento":"Só pode seleccionar "+e.maximum+" elementos"},noResults:function(){return"Non se atoparon resultados"},searching:function(){return"Buscando…"},removeAllItems:function(){return"Elimina todos os elementos"}}}),e.define,e.require}();

View File

@ -0,0 +1,3 @@
/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/he",[],function(){return{errorLoading:function(){return"שגיאה בטעינת התוצאות"},inputTooLong:function(n){var e=n.input.length-n.maximum,r="נא למחוק ";return r+=1===e?"תו אחד":e+" תווים"},inputTooShort:function(n){var e=n.minimum-n.input.length,r="נא להכניס ";return r+=1===e?"תו אחד":e+" תווים",r+=" או יותר"},loadingMore:function(){return"טוען תוצאות נוספות…"},maximumSelected:function(n){var e="באפשרותך לבחור עד ";return 1===n.maximum?e+="פריט אחד":e+=n.maximum+" פריטים",e},noResults:function(){return"לא נמצאו תוצאות"},searching:function(){return"מחפש…"},removeAllItems:function(){return"הסר את כל הפריטים"}}}),n.define,n.require}();

View File

@ -0,0 +1,3 @@
/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/hi",[],function(){return{errorLoading:function(){return"परिणामों को लोड नहीं किया जा सका।"},inputTooLong:function(n){var e=n.input.length-n.maximum,r=e+" अक्षर को हटा दें";return e>1&&(r=e+" अक्षरों को हटा दें "),r},inputTooShort:function(n){return"कृपया "+(n.minimum-n.input.length)+" या अधिक अक्षर दर्ज करें"},loadingMore:function(){return"अधिक परिणाम लोड हो रहे है..."},maximumSelected:function(n){return"आप केवल "+n.maximum+" आइटम का चयन कर सकते हैं"},noResults:function(){return"कोई परिणाम नहीं मिला"},searching:function(){return"खोज रहा है..."},removeAllItems:function(){return"सभी वस्तुओं को हटा दें"}}}),n.define,n.require}();

View File

@ -0,0 +1,3 @@
/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/hr",[],function(){function n(n){var e=" "+n+" znak";return n%10<5&&n%10>0&&(n%100<5||n%100>19)?n%10>1&&(e+="a"):e+="ova",e}return{errorLoading:function(){return"Preuzimanje nije uspjelo."},inputTooLong:function(e){return"Unesite "+n(e.input.length-e.maximum)},inputTooShort:function(e){return"Unesite još "+n(e.minimum-e.input.length)},loadingMore:function(){return"Učitavanje rezultata…"},maximumSelected:function(n){return"Maksimalan broj odabranih stavki je "+n.maximum},noResults:function(){return"Nema rezultata"},searching:function(){return"Pretraga…"},removeAllItems:function(){return"Ukloni sve stavke"}}}),n.define,n.require}();

View File

@ -0,0 +1,3 @@
/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/hsb",[],function(){var n=["znamješko","znamješce","znamješka","znamješkow"],e=["zapisk","zapiskaj","zapiski","zapiskow"],u=function(n,e){return 1===n?e[0]:2===n?e[1]:n>2&&n<=4?e[2]:n>=5?e[3]:void 0};return{errorLoading:function(){return"Wuslědki njedachu so začitać."},inputTooLong:function(e){var a=e.input.length-e.maximum;return"Prošu zhašej "+a+" "+u(a,n)},inputTooShort:function(e){var a=e.minimum-e.input.length;return"Prošu zapodaj znajmjeńša "+a+" "+u(a,n)},loadingMore:function(){return"Dalše wuslědki so začitaja…"},maximumSelected:function(n){return"Móžeš jenož "+n.maximum+" "+u(n.maximum,e)+"wubrać"},noResults:function(){return"Žane wuslědki namakane"},searching:function(){return"Pyta so…"},removeAllItems:function(){return"Remove all items"}}}),n.define,n.require}();

View File

@ -0,0 +1,3 @@
/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/hu",[],function(){return{errorLoading:function(){return"Az eredmények betöltése nem sikerült."},inputTooLong:function(e){return"Túl hosszú. "+(e.input.length-e.maximum)+" karakterrel több, mint kellene."},inputTooShort:function(e){return"Túl rövid. Még "+(e.minimum-e.input.length)+" karakter hiányzik."},loadingMore:function(){return"Töltés…"},maximumSelected:function(e){return"Csak "+e.maximum+" elemet lehet kiválasztani."},noResults:function(){return"Nincs találat."},searching:function(){return"Keresés…"},removeAllItems:function(){return"Távolítson el minden elemet"}}}),e.define,e.require}();

View File

@ -0,0 +1,3 @@
/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/hy",[],function(){return{errorLoading:function(){return"Արդյունքները հնարավոր չէ բեռնել։"},inputTooLong:function(n){return"Խնդրում ենք հեռացնել "+(n.input.length-n.maximum)+" նշան"},inputTooShort:function(n){return"Խնդրում ենք մուտքագրել "+(n.minimum-n.input.length)+" կամ ավել նշաններ"},loadingMore:function(){return"Բեռնվում են նոր արդյունքներ․․․"},maximumSelected:function(n){return"Դուք կարող եք ընտրել առավելագույնը "+n.maximum+" կետ"},noResults:function(){return"Արդյունքներ չեն գտնվել"},searching:function(){return"Որոնում․․․"},removeAllItems:function(){return"Հեռացնել բոլոր տարրերը"}}}),n.define,n.require}();

Some files were not shown because too many files have changed in this diff Show More