diff --git a/apps/abs/forms.py b/apps/abs/forms.py index 7fc594b..6753c1f 100644 --- a/apps/abs/forms.py +++ b/apps/abs/forms.py @@ -10,7 +10,7 @@ class ABSConfigurationForm(forms.ModelForm): class Meta: model = ABSConfiguration - exclude = ('type', 'status', 'parameters', 'active_beam', + exclude = ('type', 'status', 'parameters', 'active_beam', 'module_status', 'module_messages', 'module_mode', 'author', 'hash') diff --git a/apps/abs/models.py b/apps/abs/models.py index 2ea53c9..4cc9966 100644 --- a/apps/abs/models.py +++ b/apps/abs/models.py @@ -1,6 +1,6 @@ from django.db import models -from apps.main.models import Configuration, User -from django.core.urlresolvers import reverse +from apps.main.models import Configuration , User +from django.urls import reverse from celery.execute import send_task from datetime import datetime import ast @@ -203,7 +203,6 @@ OPERATION_MODES = ( (1, 'Automatic'), ) - class ABSConfiguration(Configuration): active_beam = models.PositiveSmallIntegerField(verbose_name='Active Beam', default=0) module_status = models.CharField(verbose_name='Module Status', max_length=10000, default=status_default) @@ -365,13 +364,45 @@ class ABSConfiguration(Configuration): This function sends the beams list to every abs module. It needs 'module_conf' function """ - + print("Write") beams = ABSBeam.objects.filter(abs_conf=self) nbeams = len(beams) + + # Se manda a cero RC para poder realizar cambio de beam + if self.experiment is None: + confs = [] + else: + confs = Configuration.objects.filter(experiment = self.experiment).filter(type=0) + confdds = '' + confjars = '' + confrc = '' + #TO STOP DEVICES: DDS-JARS-RC + for i in range(0,len(confs)): + if i==0: + for conf in confs: + if conf.device.device_type.name == 'dds': + confdds = conf + confdds.stop_device() + break + if i==1: + for conf in confs: + if conf.device.device_type.name == 'jars': + confjars = conf + confjars.stop_device() + break + if i==2: + for conf in confs: + if conf.device.device_type.name == 'rc': + confrc = conf + confrc.stop_device() + break + + ''' if self.connected_modules() == 0 : + print("No encuentra modulos") self.message = "No ABS Module detected." return False - + ''' #-------------Write each abs module----------- if beams: @@ -381,23 +412,36 @@ class ABSConfiguration(Configuration): message += ''.join([fromBinary2Char(beam.module_6bits(i)) for beam in beams]) status = ['0'] * 64 n = 0 - + print("Llega una antes entrar a multicast") sock = self.send_multicast(message) - for i in range(32): + while True: + #for i in range(32): try: data, address = sock.recvfrom(1024) - print address, data + print (address, data) + if data == '1': status[int(address[0][10:])-1] = '3' elif data == '0': status[int(address[0][10:])-1] = '1' + except socket.timeout: + print('Timeout') + break except Exception as e: - print 'Error {}'.format(e) + print ('Error {}'.format(e)) n += 1 sock.close() else: self.message = "ABS Configuration does not have beams" + #Start DDS-RC-JARS + if confdds: + confdds.start_device() + if confrc: + #print confrc + confrc.start_device() + if confjars: + confjars.start_device() return False if n == 64: @@ -405,15 +449,34 @@ class ABSConfiguration(Configuration): self.device.status = 0 self.module_status = ''.join(status) self.save() + #Start DDS-RC-JARS + if confdds: + confdds.start_device() + if confrc: + #print confrc + confrc.start_device() + if confjars: + confjars.start_device() return False else: self.message = "ABS Beams List have been sent to ABS Modules" self.active_beam = beams[0].pk + #Start DDS-RC-JARS + if confdds: + confdds.start_device() + if confrc: + #print confrc + confrc.start_device() + if confjars: + confjars.start_device() + self.device.status = 3 self.module_status = ''.join(status) self.save() - + conf_active = ABSActive.objects.get(pk=1) + conf_active.conf = self + conf_active.save() return True @@ -486,14 +549,14 @@ class ABSConfiguration(Configuration): return num def send_multicast(self, message): - + #print("Send multicast") multicast_group = ('224.3.29.71', 10000) # Create the datagram socket sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.settimeout(1) - local_ip = os.environ.get('LOCAL_IP', '192.168.1.128') + local_ip = os.environ.get('LOCAL_IP', '192.168.2.128') sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, socket.inet_aton(local_ip)) - sock.sendto(message, multicast_group) + sock.sendto(message.encode(), multicast_group) print('Sending ' + message) return sock @@ -502,34 +565,72 @@ class ABSConfiguration(Configuration): This function returns the status of all abs-modules as one. If at least one module is connected, its answer is "1" """ - + print ('Status device') + print (self.active_beam) + beams = ABSBeam.objects.filter(abs_conf=self) + #print beams[self.active_beam-1].module_6bits(0) + active = ABSActive.objects.get(pk=1) + if active.conf != self: + self.message = 'La configuracion actual es la del siguiente enlace %s.' % active.conf.get_absolute_url() + self.message += "\n" + self.message += 'Se debe realizar un write en esta configuracion para luego obtener un status valido.' + + return False + sock = self.send_multicast('MNTR') - + n = 0 status = ['0'] * 64 - for i in range(32): + + while True: + #for i in range(32): #if True: try: + print("Recibiendo") address = None - data, address = sock.recvfrom(1024) - x = int(address[0][10:])-1 + data, address = sock.recvfrom(2) + print (address, data) + print("!!!!") + data = data.decode() + aux_mon = "1" + aux_expected = aux_mon + if(len(data)==2): + print ("data[1]: ") + print (data[1]) + aux_mon = fromChar2Binary(data[1]) + print (aux_mon) + aux_i = (str(address[0]).split('.'))[3] + print (aux_i) + print ('Active beam') + beam_active = ABSBeam.objects.get(pk=self.active_beam) + print (beam_active) + aux_expected = beam_active.module_6bits(int(aux_i)-1) + print (aux_expected) + + print ("data[0]: ") + print (data[0]) + if data[0] == '1': - remote = fromChar2Binary(data[1]) - local = ABSBeam.objects.get(pk=self.active_beam).module_6bits(x) - if local == remote: - status[x] = '3' - print('Module: {} connected...igual'.format(address)) + status[int(address[0][10:])-1] = '3' + if aux_mon == aux_expected: + print ('Es igual') else: - status[x] = '2' - print('Module: {} connected...diferente'.format(address)) + print ('Es diferente') + status[int(address[0][10:])-1] = '2' + elif data[0] == '0': - status[x] = '1' + status[int(address[0][10:])-1] = '1' n += 1 + print('Module: {} connected'.format(address)) + except socket.timeout: + print('Timeout') + break except: print('Module: {} error'.format(address)) pass + sock.close() - + if n > 0: self.message = 'ABS modules Status have been updated.' self.device.status = 1 @@ -547,6 +648,17 @@ class ABSConfiguration(Configuration): This function connects to a multicast group and sends the beam number to all abs modules. """ + print ('Send beam') + print (self.active_beam) + beams = ABSBeam.objects.filter(abs_conf=self) + #print beams[self.active_beam-1].module_6bits(0) + active = ABSActive.objects.get(pk=1) + if active.conf != self: + self.message = 'La configuracion actual es la del siguiente enlace %s.' % active.conf.get_absolute_url() + self.message += "\n" + self.message += 'Se debe realizar un write en esta configuracion para luego obtener un status valido.' + + return False # Se manda a cero RC para poder realizar cambio de beam if self.experiment is None: @@ -584,18 +696,23 @@ class ABSConfiguration(Configuration): #El indice del apunte debe ser menor que el numero total de apuntes #El servidor tcp en el embebido comienza a contar desde 0 status = ['0'] * 64 - message = 'CHGB{}'.format(beam_pos) + message = 'CHGB{}'.format(beam_pos) sock = self.send_multicast(message) - for i in range(32): + while True: + #for i in range(32): try: data, address = sock.recvfrom(1024) - print address, data + print (address, data) + data = data.decode() if data == '1': status[int(address[0][10:])-1] = '3' elif data == '0': status[int(address[0][10:])-1] = '1' + except socket.timeout: + print('Timeout') + break except Exception as e: - print 'Error {}'.format(e) + print ('Error {}'.format(e)) pass sock.close() @@ -617,13 +734,15 @@ class ABSConfiguration(Configuration): def get_absolute_url_import(self): return reverse('url_import_abs_conf', args=[str(self.id)]) - +class ABSActive(models.Model): + conf = models.ForeignKey(ABSConfiguration, null=True, verbose_name='ABS Configuration', on_delete=models.CASCADE) class ABSBeam(models.Model): name = models.CharField(max_length=60, default='Beam') antenna = models.CharField(verbose_name='Antenna', max_length=1000, default=antenna_default) - abs_conf = models.ForeignKey(ABSConfiguration, null=True, verbose_name='ABS Configuration') + abs_conf = models.ForeignKey('ABSConfiguration', null=True, + verbose_name='ABS Configuration', on_delete=models.CASCADE) tx = models.CharField(verbose_name='Tx', max_length=1000, default=tx_default) rx = models.CharField(verbose_name='Rx', max_length=1000, default=rx_default) s_time = models.TimeField(verbose_name='Star Time', default='00:00:00') diff --git a/apps/abs/templates/abs_add_beam.html b/apps/abs/templates/abs_add_beam.html index 3794553..d5104c5 100644 --- a/apps/abs/templates/abs_add_beam.html +++ b/apps/abs/templates/abs_add_beam.html @@ -1,9 +1,11 @@ {% extends "dev_conf_edit.html" %} -{% load bootstrap3 %} +{% load bootstrap4 %} {% load static %} {% load main_tags %} + + {% block content %}
{% csrf_token %} diff --git a/apps/abs/templates/abs_beam_values.html b/apps/abs/templates/abs_beam_values.html index d33b401..027ef08 100644 --- a/apps/abs/templates/abs_beam_values.html +++ b/apps/abs/templates/abs_beam_values.html @@ -1,5 +1,5 @@ {% load static %} -{% load bootstrap3 %} +{% load bootstrap4 %} {% load main_tags %} {% block content %} @@ -104,7 +104,7 @@ } -} + .abs_tx tr:nth-last-child(1){ border-bottom: 0px solid #00334d; } @@ -123,7 +123,7 @@ } -} + .abs_rx tr:nth-last-child(1){ border-bottom: 0px solid #00334d; } diff --git a/apps/abs/templates/abs_beams_list.html b/apps/abs/templates/abs_beams_list.html index 2aa8e2e..7ec2da8 100644 --- a/apps/abs/templates/abs_beams_list.html +++ b/apps/abs/templates/abs_beams_list.html @@ -1,4 +1,4 @@ -{% load bootstrap3 %} +{% load bootstrap4 %} {% if abs_beams %} @@ -17,8 +17,8 @@ #{{forloop.counter}}: {{beam.name}} {% if edit %} - - + + {% endif %} diff --git a/apps/abs/templates/abs_conf.html b/apps/abs/templates/abs_conf.html index 2362fce..50756fb 100644 --- a/apps/abs/templates/abs_conf.html +++ b/apps/abs/templates/abs_conf.html @@ -1,4 +1,4 @@ -{% extends "dev_conf.html" %} {% load static %} {% load bootstrap3 %} {% load main_tags %} +{% extends "dev_conf.html" %} {% load static %} {% load bootstrap4 %} {% load main_tags %} {% block extra-head %} - + {% endblock %} diff --git a/apps/abs/templates/abs_downpattern_img.html b/apps/abs/templates/abs_downpattern_img.html index d54973e..1ea4e11 100644 --- a/apps/abs/templates/abs_downpattern_img.html +++ b/apps/abs/templates/abs_downpattern_img.html @@ -1,5 +1,5 @@ {% load static %} -{% load bootstrap3 %} +{% load bootstrap4 %} {% load main_tags %} {% block content %} diff --git a/apps/abs/templates/abs_edit_beam.html b/apps/abs/templates/abs_edit_beam.html index 3794553..40a4f64 100644 --- a/apps/abs/templates/abs_edit_beam.html +++ b/apps/abs/templates/abs_edit_beam.html @@ -1,6 +1,6 @@ {% extends "dev_conf_edit.html" %} -{% load bootstrap3 %} +{% load bootstrap4 %} {% load static %} {% load main_tags %} diff --git a/apps/abs/templates/abs_pattern.html b/apps/abs/templates/abs_pattern.html index e9e2c21..0ec16c5 100644 --- a/apps/abs/templates/abs_pattern.html +++ b/apps/abs/templates/abs_pattern.html @@ -1,5 +1,5 @@ {% load static %} -{% load bootstrap3 %} +{% load bootstrap4 %} {% load main_tags %} {% block content %} @@ -104,7 +104,7 @@ } -} + .abs_tx tr:nth-last-child(1){ border-bottom: 0px solid #00334d; } @@ -123,7 +123,7 @@ } -} + .abs_rx tr:nth-last-child(1){ border-bottom: 0px solid #00334d; } diff --git a/apps/abs/templates/abs_patterns.html b/apps/abs/templates/abs_patterns.html index ead7529..3ba0a59 100644 --- a/apps/abs/templates/abs_patterns.html +++ b/apps/abs/templates/abs_patterns.html @@ -1,6 +1,6 @@ {% extends "dev_conf.html" %} {% load static %} -{% load bootstrap3 %} +{% load bootstrap4 %} {% load main_tags %} {% block content %} diff --git a/apps/abs/templates/abs_uppattern_img.html b/apps/abs/templates/abs_uppattern_img.html index 83ce387..43d045a 100644 --- a/apps/abs/templates/abs_uppattern_img.html +++ b/apps/abs/templates/abs_uppattern_img.html @@ -1,5 +1,5 @@ {% load static %} -{% load bootstrap3 %} +{% load bootstrap4 %} {% load main_tags %} {% block content %} diff --git a/apps/abs/urls.py b/apps/abs/urls.py index 918ac5b..a45ebe4 100644 --- a/apps/abs/urls.py +++ b/apps/abs/urls.py @@ -1,18 +1,18 @@ -from django.conf.urls import url +from django.urls import path from apps.abs import views urlpatterns = ( - url(r'^(?P-?\d+)/$', views.abs_conf, name='url_abs_conf'), - url(r'^(?P-?\d+)/edit/$', views.abs_conf_edit, name='url_edit_abs_conf'), - url(r'^alert/$', views.abs_conf_alert, name='url_alert_abs_conf'), - url(r'^(?P-?\d+)/import/$', views.import_file, name='url_import_abs_conf'), + path('/', views.abs_conf, name='url_abs_conf'), + path('/edit/', views.abs_conf_edit, name='url_edit_abs_conf'), + path('alert/', views.abs_conf_alert, name='url_alert_abs_conf'), + path('/import/', views.import_file, name='url_import_abs_conf'), #url(r'^(?P-?\d+)/status/', views.abs_conf, {'status_request':True},name='url_status_abs_conf'), - url(r'^(?P-?\d+)/change_beam/(?P-?\d+)/$', views.send_beam, name='url_send_beam'), - url(r'^(?P-?\d+)/plot/$', views.plot_patterns, name='url_plot_abs_patterns'), - url(r'^(?P-?\d+)/plot/(?P-?\d+)/$', views.plot_patterns, name='url_plot_abs_patterns'), - url(r'^(?P-?\d+)/plot/(?P-?\d+)/(?P[\w\-]+)/pattern.png$', views.plot_pattern, name='url_plot_beam'), - url(r'^(?P-?\d+)/add_beam/$', views.add_beam, name='url_add_abs_beam'), - url(r'^(?P-?\d+)/beam/(?P-?\d+)/delete/$', views.remove_beam, name='url_remove_abs_beam'), - url(r'^(?P-?\d+)/beam/(?P-?\d+)/edit/$', views.edit_beam, name='url_edit_abs_beam'), + path('/change_beam//', views.send_beam, name='url_send_beam'), + path('/plot/', views.plot_patterns, name='url_plot_abs_patterns'), + path('/plot//', views.plot_patterns, name='url_plot_abs_patterns'), + path('/plot///pattern.png', views.plot_pattern, name='url_plot_beam'), + path('/add_beam/', views.add_beam, name='url_add_abs_beam'), + path('/beam//delete/', views.remove_beam, name='url_remove_abs_beam'), + path('/beam//edit/', views.edit_beam, name='url_edit_abs_beam'), ) diff --git a/apps/abs/utils/Astro_Coords.py b/apps/abs/utils/Astro_Coords.py index 73ca019..6392594 100644 --- a/apps/abs/utils/Astro_Coords.py +++ b/apps/abs/utils/Astro_Coords.py @@ -16,8 +16,8 @@ import numpy import scipy.interpolate import os import sys -import TimeTools -import Misc_Routines +from .TimeTools import Julian , Time +from .Misc_Routines import CoFactors class EquatorialCorrections(): def __init__(self): @@ -81,21 +81,21 @@ class EquatorialCorrections(): eps0 = (23.4392911*3600.) - (46.8150*T) - (0.00059*T**2) + (0.001813*T**3) # True obliquity of the ecliptic in radians - eps = (eps0 + d_eps)/3600.*Misc_Routines.CoFactors.d2r + eps = (eps0 + d_eps)/3600.*CoFactors.d2r # Useful numbers ce = numpy.cos(eps) se = numpy.sin(eps) # Convert Ra-Dec to equatorial rectangular coordinates - x = numpy.cos(ra*Misc_Routines.CoFactors.d2r)*numpy.cos(dec*Misc_Routines.CoFactors.d2r) - y = numpy.sin(ra*Misc_Routines.CoFactors.d2r)*numpy.cos(dec*Misc_Routines.CoFactors.d2r) - z = numpy.sin(dec*Misc_Routines.CoFactors.d2r) + x = numpy.cos(ra*CoFactors.d2r)*numpy.cos(dec*CoFactors.d2r) + y = numpy.sin(ra*CoFactors.d2r)*numpy.cos(dec*CoFactors.d2r) + z = numpy.sin(dec*CoFactors.d2r) # Apply corrections to each rectangular coordinate - x2 = x - (y*ce + z*se)*d_psi*Misc_Routines.CoFactors.s2r - y2 = y + (x*ce*d_psi - z*d_eps)*Misc_Routines.CoFactors.s2r - z2 = z + (x*se*d_psi + y*d_eps)*Misc_Routines.CoFactors.s2r + x2 = x - (y*ce + z*se)*d_psi*CoFactors.s2r + y2 = y + (x*ce*d_psi - z*d_eps)*CoFactors.s2r + z2 = z + (x*se*d_psi + y*d_eps)*CoFactors.s2r # Convert bask to equatorial spherical coordinates r = numpy.sqrt(x2**2. + y2**2. + z2**2.) @@ -128,8 +128,8 @@ class EquatorialCorrections(): dec2[w2] = numpy.arcsin(z2[w2]/r[w2]) # Converting to degree - ra2 = ra2/Misc_Routines.CoFactors.d2r - dec2 = dec2/Misc_Routines.CoFactors.d2r + ra2 = ra2/CoFactors.d2r + dec2 = dec2/CoFactors.d2r w = numpy.where(ra2<0.) if w[0].size>0: @@ -178,32 +178,32 @@ class EquatorialCorrections(): # Mean elongation of the moon coeff1 = numpy.array([1/189474.0,-0.0019142,445267.111480,297.85036]) d = numpy.poly1d(coeff1) - d = d(t)*Misc_Routines.CoFactors.d2r + d = d(t)*CoFactors.d2r d = self.cirrange(d,rad=1) # Sun's mean elongation coeff2 = numpy.array([-1./3e5,-0.0001603,35999.050340,357.52772]) m = numpy.poly1d(coeff2) - m = m(t)*Misc_Routines.CoFactors.d2r + m = m(t)*CoFactors.d2r m = self.cirrange(m,rad=1) # Moon's mean elongation coeff3 = numpy.array([1.0/5.625e4,0.0086972,477198.867398,134.96298]) mprime = numpy.poly1d(coeff3) - mprime = mprime(t)*Misc_Routines.CoFactors.d2r + mprime = mprime(t)*CoFactors.d2r mprime = self.cirrange(mprime,rad=1) # Moon's argument of latitude coeff4 = numpy.array([-1.0/3.27270e5,-0.0036825,483202.017538,93.27191]) f = numpy.poly1d(coeff4) - f = f(t)*Misc_Routines.CoFactors.d2r + f = f(t)*CoFactors.d2r f = self.cirrange(f,rad=1) # Longitude fo the ascending node of the Moon's mean orbit on the ecliptic, measu- # red from the mean equinox of the date. coeff5 = numpy.array([1.0/4.5e5,0.0020708,-1934.136261,125.04452]) omega = numpy.poly1d(coeff5) - omega = omega(t)*Misc_Routines.CoFactors.d2r + omega = omega(t)*CoFactors.d2r omega = self.cirrange(omega,rad=1) d_lng = numpy.array([0,-2,0,0,0,0,-2,0,0,-2,-2,-2,0,2,0,2,0,0,-2,0,2,0,0,-2,0,-2,0,0,\ @@ -335,7 +335,7 @@ class EquatorialCorrections(): coeff = 23 + 26/60. + 21.488/3600. eps0 = coeff*3600. - 46.8150*T - 0.00059*T**2. + 0.001813*T**3. # True obliquity of the ecliptic in radians - eps = (eps0 + d_epsilon)/3600*Misc_Routines.CoFactors.d2r + eps = (eps0 + d_epsilon)/3600*CoFactors.d2r celestialbodies = CelestialBodies() [sunra,sundec,sunlon,sunobliq] = celestialbodies.sunpos(jd) @@ -349,11 +349,11 @@ class EquatorialCorrections(): # Constant of aberration, in arcseconds k = 20.49552 - cd = numpy.cos(dec*Misc_Routines.CoFactors.d2r) ; sd = numpy.sin(dec*Misc_Routines.CoFactors.d2r) + cd = numpy.cos(dec*CoFactors.d2r) ; sd = numpy.sin(dec*CoFactors.d2r) ce = numpy.cos(eps) ; te = numpy.tan(eps) - cp = numpy.cos(pi*Misc_Routines.CoFactors.d2r) ; sp = numpy.sin(pi*Misc_Routines.CoFactors.d2r) - cs = numpy.cos(sunlon*Misc_Routines.CoFactors.d2r) ; ss = numpy.sin(sunlon*Misc_Routines.CoFactors.d2r) - ca = numpy.cos(ra*Misc_Routines.CoFactors.d2r) ; sa = numpy.sin(ra*Misc_Routines.CoFactors.d2r) + cp = numpy.cos(pi*CoFactors.d2r) ; sp = numpy.sin(pi*CoFactors.d2r) + cs = numpy.cos(sunlon*CoFactors.d2r) ; ss = numpy.sin(sunlon*CoFactors.d2r) + ca = numpy.cos(ra*CoFactors.d2r) ; sa = numpy.sin(ra*CoFactors.d2r) term1 = (ca*cs*ce + sa*ss)/cd term2 = (ca*cp*ce + sa*sp)/cd @@ -407,8 +407,8 @@ class EquatorialCorrections(): dec = numpy.atleast_1d(dec) if rad==0: - ra_rad = ra*Misc_Routines.CoFactors.d2r - dec_rad = dec*Misc_Routines.CoFactors.d2r + ra_rad = ra*CoFactors.d2r + dec_rad = dec*CoFactors.d2r else: ra_rad = ra dec_rad = dec @@ -427,9 +427,9 @@ class EquatorialCorrections(): dec_rad = numpy.arcsin(x2[2,:]) if rad==0: - ra = ra_rad/Misc_Routines.CoFactors.d2r + ra = ra_rad/CoFactors.d2r ra = ra + (ra<0)*360. - dec = dec_rad/Misc_Routines.CoFactors.d2r + dec = dec_rad/CoFactors.d2r else: ra = ra_rad ra = ra + (ra<0)*numpy.pi*2. @@ -472,15 +472,15 @@ class EquatorialCorrections(): if FK4==0: st=0.001*(equinox1 - 2000.) # Computing 3 rotation angles. - A=Misc_Routines.CoFactors.s2r*t*(23062.181+st*(139.656+0.0139*st)+t*(30.188-0.344*st+17.998*t)) - B=Misc_Routines.CoFactors.s2r*t*t*(79.280+0.410*st+0.205*t)+A - C=Misc_Routines.CoFactors.s2r*t*(20043.109-st*(85.33+0.217*st)+ t*(-42.665-0.217*st-41.833*t)) + A=CoFactors.s2r*t*(23062.181+st*(139.656+0.0139*st)+t*(30.188-0.344*st+17.998*t)) + B=CoFactors.s2r*t*t*(79.280+0.410*st+0.205*t)+A + C=CoFactors.s2r*t*(20043.109-st*(85.33+0.217*st)+ t*(-42.665-0.217*st-41.833*t)) else: st=0.001*(equinox1 - 1900) # Computing 3 rotation angles - A=Misc_Routines.CoFactors.s2r*t*(23042.53+st*(139.75+0.06*st)+t*(30.23-0.27*st+18.0*t)) - B=Misc_Routines.CoFactors.s2r*t*t*(79.27+0.66*st+0.32*t)+A - C=Misc_Routines.CoFactors.s2r*t*(20046.85-st*(85.33+0.37*st)+t*(-42.67-0.37*st-41.8*t)) + A=CoFactors.s2r*t*(23042.53+st*(139.75+0.06*st)+t*(30.23-0.27*st+18.0*t)) + B=CoFactors.s2r*t*t*(79.27+0.66*st+0.32*t)+A + C=CoFactors.s2r*t*(20046.85-st*(85.33+0.37*st)+t*(-42.67-0.37*st-41.8*t)) sina = numpy.sin(A); sinb = numpy.sin(B); sinc = numpy.sin(C) cosa = numpy.cos(A); cosb = numpy.cos(B); cosc = numpy.cos(C) @@ -595,39 +595,39 @@ class CelestialBodies(EquatorialCorrections): # Allow for ellipticity of the orbit (equation of centre) using the Earth's mean # anomoly ME me = 358.475844 + ((35999.049750*t) % 360.0) - ellcor = (6910.1 - 17.2*t)*numpy.sin(me*Misc_Routines.CoFactors.d2r) + 72.3*numpy.sin(2.0*me*Misc_Routines.CoFactors.d2r) + ellcor = (6910.1 - 17.2*t)*numpy.sin(me*CoFactors.d2r) + 72.3*numpy.sin(2.0*me*CoFactors.d2r) l = l + ellcor # Allow for the Venus perturbations using the mean anomaly of Venus MV mv = 212.603219 + ((58517.803875*t) % 360.0) - vencorr = 4.8*numpy.cos((299.1017 + mv - me)*Misc_Routines.CoFactors.d2r) + \ - 5.5*numpy.cos((148.3133 + 2.0*mv - 2.0*me )*Misc_Routines.CoFactors.d2r) + \ - 2.5*numpy.cos((315.9433 + 2.0*mv - 3.0*me )*Misc_Routines.CoFactors.d2r) + \ - 1.6*numpy.cos((345.2533 + 3.0*mv - 4.0*me )*Misc_Routines.CoFactors.d2r) + \ - 1.0*numpy.cos((318.15 + 3.0*mv - 5.0*me )*Misc_Routines.CoFactors.d2r) + vencorr = 4.8*numpy.cos((299.1017 + mv - me)*CoFactors.d2r) + \ + 5.5*numpy.cos((148.3133 + 2.0*mv - 2.0*me )*CoFactors.d2r) + \ + 2.5*numpy.cos((315.9433 + 2.0*mv - 3.0*me )*CoFactors.d2r) + \ + 1.6*numpy.cos((345.2533 + 3.0*mv - 4.0*me )*CoFactors.d2r) + \ + 1.0*numpy.cos((318.15 + 3.0*mv - 5.0*me )*CoFactors.d2r) l = l + vencorr # Allow for the Mars perturbations using the mean anomaly of Mars MM mm = 319.529425 + ((19139.858500*t) % 360.0) - marscorr = 2.0*numpy.cos((343.8883 - 2.0*mm + 2.0*me)*Misc_Routines.CoFactors.d2r ) + \ - 1.8*numpy.cos((200.4017 - 2.0*mm + me)*Misc_Routines.CoFactors.d2r) + marscorr = 2.0*numpy.cos((343.8883 - 2.0*mm + 2.0*me)*CoFactors.d2r ) + \ + 1.8*numpy.cos((200.4017 - 2.0*mm + me)*CoFactors.d2r) l = l + marscorr # Allow for the Jupiter perturbations using the mean anomaly of Jupiter MJ mj = 225.328328 + ((3034.6920239*t) % 360.0) - jupcorr = 7.2*numpy.cos((179.5317 - mj + me )*Misc_Routines.CoFactors.d2r) + \ - 2.6*numpy.cos((263.2167 - mj)*Misc_Routines.CoFactors.d2r) + \ - 2.7*numpy.cos((87.1450 - 2.0*mj + 2.0*me)*Misc_Routines.CoFactors.d2r) + \ - 1.6*numpy.cos((109.4933 - 2.0*mj + me)*Misc_Routines.CoFactors.d2r) + jupcorr = 7.2*numpy.cos((179.5317 - mj + me )*CoFactors.d2r) + \ + 2.6*numpy.cos((263.2167 - mj)*CoFactors.d2r) + \ + 2.7*numpy.cos((87.1450 - 2.0*mj + 2.0*me)*CoFactors.d2r) + \ + 1.6*numpy.cos((109.4933 - 2.0*mj + me)*CoFactors.d2r) l = l + jupcorr # Allow for Moons perturbations using mean elongation of the Moon from the Sun D d = 350.7376814 + ((445267.11422*t) % 360.0) - mooncorr = 6.5*numpy.sin(d*Misc_Routines.CoFactors.d2r) + mooncorr = 6.5*numpy.sin(d*CoFactors.d2r) l = l + mooncorr # Allow for long period terms - longterm = + 6.4*numpy.sin((231.19 + 20.20*t)*Misc_Routines.CoFactors.d2r) + longterm = + 6.4*numpy.sin((231.19 + 20.20*t)*CoFactors.d2r) l = l + longterm l = (l + 2592000.0) % 1296000.0 longmed = l/3600.0 @@ -637,26 +637,26 @@ class CelestialBodies(EquatorialCorrections): # Allow for Nutation using the longitude of the Moons mean node OMEGA omega = 259.183275 - ((1934.142008*t) % 360.0) - l = l - 17.2*numpy.sin(omega*Misc_Routines.CoFactors.d2r) + l = l - 17.2*numpy.sin(omega*CoFactors.d2r) # Form the True Obliquity - oblt = 23.452294 - 0.0130125*t + (9.2*numpy.cos(omega*Misc_Routines.CoFactors.d2r))/3600.0 + oblt = 23.452294 - 0.0130125*t + (9.2*numpy.cos(omega*CoFactors.d2r))/3600.0 # Form Right Ascension and Declination l = l/3600.0 - ra = numpy.arctan2((numpy.sin(l*Misc_Routines.CoFactors.d2r)*numpy.cos(oblt*Misc_Routines.CoFactors.d2r)),numpy.cos(l*Misc_Routines.CoFactors.d2r)) + ra = numpy.arctan2((numpy.sin(l*CoFactors.d2r)*numpy.cos(oblt*CoFactors.d2r)),numpy.cos(l*CoFactors.d2r)) neg = numpy.where(ra < 0.0) if neg[0].size > 0: ra[neg] = ra[neg] + 2.0*numpy.pi - dec = numpy.arcsin(numpy.sin(l*Misc_Routines.CoFactors.d2r)*numpy.sin(oblt*Misc_Routines.CoFactors.d2r)) + dec = numpy.arcsin(numpy.sin(l*CoFactors.d2r)*numpy.sin(oblt*CoFactors.d2r)) if rad==1: - oblt = oblt*Misc_Routines.CoFactors.d2r - longmed = longmed*Misc_Routines.CoFactors.d2r + oblt = oblt*CoFactors.d2r + longmed = longmed*CoFactors.d2r else: - ra = ra/Misc_Routines.CoFactors.d2r - dec = dec/Misc_Routines.CoFactors.d2r + ra = ra/CoFactors.d2r + dec = dec/CoFactors.d2r return ra, dec, longmed, oblt @@ -754,30 +754,30 @@ class CelestialBodies(EquatorialCorrections): lprimed = numpy.poly1d(coeff0) lprimed = lprimed(t) lprimed = self.cirrange(lprimed,rad=0) - lprime = lprimed*Misc_Routines.CoFactors.d2r + lprime = lprimed*CoFactors.d2r # Mean elongation of the moon coeff1 = numpy.array([-1./1.13065e8,1./545868.,-0.0018819,445267.1114034,297.8501921]) d = numpy.poly1d(coeff1) - d = d(t)*Misc_Routines.CoFactors.d2r + d = d(t)*CoFactors.d2r d = self.cirrange(d,rad=1) # Sun's mean anomaly coeff2 = numpy.array([1.0/2.449e7,-0.0001536,35999.0502909,357.5291092]) M = numpy.poly1d(coeff2) - M = M(t)*Misc_Routines.CoFactors.d2r + M = M(t)*CoFactors.d2r M = self.cirrange(M,rad=1) # Moon's mean anomaly coeff3 = numpy.array([-1.0/1.4712e7,1.0/6.9699e4,0.0087414,477198.8675055,134.9633964]) Mprime = numpy.poly1d(coeff3) - Mprime = Mprime(t)*Misc_Routines.CoFactors.d2r + Mprime = Mprime(t)*CoFactors.d2r Mprime = self.cirrange(Mprime,rad=1) # Moon's argument of latitude coeff4 = numpy.array([1.0/8.6331e8,-1.0/3.526e7,-0.0036539,483202.0175233,93.2720950]) F = numpy.poly1d(coeff4) - F = F(t)*Misc_Routines.CoFactors.d2r + F = F(t)*CoFactors.d2r F = self.cirrange(F,rad=1) # Eccentricity of Earth's orbit around the sun @@ -790,9 +790,9 @@ class CelestialBodies(EquatorialCorrections): ecorr4 = numpy.where((numpy.abs(m_lat))==2) # Additional arguments. - A1 = (119.75 + 131.849*t)*Misc_Routines.CoFactors.d2r - A2 = (53.09 + 479264.290*t)*Misc_Routines.CoFactors.d2r - A3 = (313.45 + 481266.484*t)*Misc_Routines.CoFactors.d2r + A1 = (119.75 + 131.849*t)*CoFactors.d2r + A2 = (53.09 + 479264.290*t)*CoFactors.d2r + A3 = (313.45 + 481266.484*t)*CoFactors.d2r suml_add = 3958.*numpy.sin(A1) + 1962.*numpy.sin(lprime - F) + 318*numpy.sin(A2) sumb_add = -2235.*numpy.sin(lprime) + 382.*numpy.sin(A3) + 175.*numpy.sin(A1-F) + \ 175.*numpy.sin(A1 + F) + 127.*numpy.sin(lprime - Mprime) - 115.*numpy.sin(lprime + Mprime) @@ -823,8 +823,8 @@ class CelestialBodies(EquatorialCorrections): [nlon, elon] = self.nutate(jd) geolon = geolon + nlon/3.6e3 geolon = self.cirrange(geolon,rad=0) - lamb = geolon*Misc_Routines.CoFactors.d2r - beta = geolat*Misc_Routines.CoFactors.d2r + lamb = geolon*CoFactors.d2r + beta = geolat*CoFactors.d2r # Find mean obliquity and convert lamb, beta to RA, Dec c = numpy.array([2.45,5.79,27.87,7.12,-39.05,-249.67,-51.38,1999.25,-1.55,-4680.93, \ @@ -832,7 +832,7 @@ class CelestialBodies(EquatorialCorrections): junk = numpy.poly1d(c); epsilon = 23. + (26./60.) + (junk(t/1.e2)/3600.) # True obliquity in radians - eps = (epsilon + elon/3600. )*Misc_Routines.CoFactors.d2r + eps = (epsilon + elon/3600. )*CoFactors.d2r ra = numpy.arctan2(numpy.sin(lamb)*numpy.cos(eps)-numpy.tan(beta)*numpy.sin(eps),numpy.cos(lamb)) ra = self.cirrange(ra,rad=1) @@ -843,8 +843,8 @@ class CelestialBodies(EquatorialCorrections): geolon = lamb geolat = beta else: - ra = ra/Misc_Routines.CoFactors.d2r - dec = dec/Misc_Routines.CoFactors.d2r + ra = ra/CoFactors.d2r + dec = dec/CoFactors.d2r return ra, dec, dist, geolon, geolat @@ -962,11 +962,11 @@ class CelestialBodies(EquatorialCorrections): """ # Defining date to compute SkyNoise. - [year, month, dom, hour, mis, secs] = TimeTools.Julian(jd).change2time() + [year, month, dom, hour, mis, secs] = Julian(jd).change2time() is_dom = (month==9) & (dom==21) if is_dom: tmp = jd - jd = TimeTools.Time(year,9,22).change2julian() + jd = Time(year,9,22).change2julian() dom = 22 # Reading SkyNoise @@ -990,9 +990,9 @@ class CelestialBodies(EquatorialCorrections): hour = numpy.array([0,23]); mins = numpy.array([0,59]); secs = numpy.array([0,59]); - LTrange = TimeTools.Time(year,month,dom,hour,mins,secs).change2julday() + LTrange = Time(year,month,dom,hour,mins,secs).change2julday() LTtime = LTrange[0] + numpy.arange(1440)*((LTrange[1] - LTrange[0])/(1440.-1)) - lst = TimeTools.Julian(LTtime + (-3600.*ut/86400.)).change2lst() + lst = Julian(LTtime + (-3600.*ut/86400.)).change2lst() ipowr = lst*0.0 # Interpolating using scipy (inside max and min "x") @@ -1098,8 +1098,8 @@ class AltAz(EquatorialCorrections): [dra1,ddec1,eps,d_psi,d_eps] = self.co_nutate(self.jd,ra_tmp, dec_tmp) # Getting local mean sidereal time (lmst) - lmst = TimeTools.Julian(self.jd[0]).change2lst() - lmst = lmst*Misc_Routines.CoFactors.h2d + lmst = Julian(self.jd[0]).change2lst() + lmst = lmst*CoFactors.h2d # Getting local apparent sidereal time (last) last = lmst + d_psi*numpy.cos(eps)/3600. @@ -1165,16 +1165,16 @@ class AltAz(EquatorialCorrections): Converted to Python by Freddy R. Galindo, ROJ, 26 September 2009. """ - alt_r = numpy.atleast_1d(self.alt*Misc_Routines.CoFactors.d2r) - az_r = numpy.atleast_1d(self.az*Misc_Routines.CoFactors.d2r) - lat_r = numpy.atleast_1d(self.lat*Misc_Routines.CoFactors.d2r) + alt_r = numpy.atleast_1d(self.alt*CoFactors.d2r) + az_r = numpy.atleast_1d(self.az*CoFactors.d2r) + lat_r = numpy.atleast_1d(self.lat*CoFactors.d2r) # Find local hour angle (in degrees, from 0 to 360.) y_ha = -1*numpy.sin(az_r)*numpy.cos(alt_r) x_ha = -1*numpy.cos(az_r)*numpy.sin(lat_r)*numpy.cos(alt_r) + numpy.sin(alt_r)*numpy.cos(lat_r) ha = numpy.arctan2(y_ha,x_ha) - ha = ha/Misc_Routines.CoFactors.d2r + ha = ha/CoFactors.d2r w = numpy.where(ha<0.) if w[0].size>0:ha[w] = ha[w] + 360. @@ -1182,7 +1182,7 @@ class AltAz(EquatorialCorrections): # Find declination (positive if north of celestial equatorial, negative if south) sindec = numpy.sin(lat_r)*numpy.sin(alt_r) + numpy.cos(lat_r)*numpy.cos(alt_r)*numpy.cos(az_r) - dec = numpy.arcsin(sindec)/Misc_Routines.CoFactors.d2r + dec = numpy.arcsin(sindec)/CoFactors.d2r return ha, dec @@ -1289,9 +1289,9 @@ class Equatorial(EquatorialCorrections): dec = dec + (ddec1*self.nutate_ + ddec2*self.aberration_)/3600. # Getting local mean sidereal time (lmst) - lmst = TimeTools.Julian(self.jd).change2lst() + lmst = Julian(self.jd).change2lst() - lmst = lmst*Misc_Routines.CoFactors.h2d + lmst = lmst*CoFactors.h2d # Getting local apparent sidereal time (last) last = lmst + d_psi*numpy.cos(eps)/3600. @@ -1327,17 +1327,17 @@ class Equatorial(EquatorialCorrections): Converted to Python by Freddy R. Galindo, ROJ, 26 September 2009. """ - sh = numpy.sin(ha*Misc_Routines.CoFactors.d2r) ; ch = numpy.cos(ha*Misc_Routines.CoFactors.d2r) - sd = numpy.sin(dec*Misc_Routines.CoFactors.d2r) ; cd = numpy.cos(dec*Misc_Routines.CoFactors.d2r) - sl = numpy.sin(self.lat*Misc_Routines.CoFactors.d2r) ; cl = numpy.cos(self.lat*Misc_Routines.CoFactors.d2r) + sh = numpy.sin(ha*CoFactors.d2r) ; ch = numpy.cos(ha*CoFactors.d2r) + sd = numpy.sin(dec*CoFactors.d2r) ; cd = numpy.cos(dec*CoFactors.d2r) + sl = numpy.sin(self.lat*CoFactors.d2r) ; cl = numpy.cos(self.lat*CoFactors.d2r) x = -1*ch*cd*sl + sd*cl y = -1*sh*cd z = ch*cd*cl + sd*sl r = numpy.sqrt(x**2. + y**2.) - az = numpy.arctan2(y,x)/Misc_Routines.CoFactors.d2r - alt = numpy.arctan2(z,r)/Misc_Routines.CoFactors.d2r + az = numpy.arctan2(y,x)/CoFactors.d2r + alt = numpy.arctan2(z,r)/CoFactors.d2r # correct for negative az. w = numpy.where(az<0.) @@ -1396,7 +1396,7 @@ class Geodetic(): Converted to Python by Freddy R. Galindo, ROJ, 02 October 2009. """ - gdl = self.lat*Misc_Routines.CoFactors.d2r + gdl = self.lat*CoFactors.d2r slat = numpy.sin(gdl) clat = numpy.cos(gdl) slat2 = slat**2. @@ -1414,6 +1414,6 @@ class Geodetic(): y = rgeoid*sbet + self.alt*slat gcalt = numpy.sqrt(x**2. + y**2.) - gclat = numpy.arctan2(y,x)/Misc_Routines.CoFactors.d2r + gclat = numpy.arctan2(y,x)/CoFactors.d2r return gclat, gcalt diff --git a/apps/abs/utils/Graphics_OverJro.py b/apps/abs/utils/Graphics_OverJro.py index 146f265..f68ebf5 100644 --- a/apps/abs/utils/Graphics_OverJro.py +++ b/apps/abs/utils/Graphics_OverJro.py @@ -32,11 +32,10 @@ import matplotlib.pyplot #import scipy import scipy.interpolate -import Astro_Coords -import TimeTools -import Graphics_Miscens - -import Misc_Routines +from .Astro_Coords import Equatorial , CelestialBodies +from .TimeTools import Time , Julian +from .Graphics_Miscens import ColorTable +from .Misc_Routines import CoFactors,Vector class AntPatternPlot: def __init__(self): @@ -79,8 +78,8 @@ class AntPatternPlot: levels = numpy.array([1e-3,1e-2,1e-1,0.5,1.0]) tmp = numpy.round(10*numpy.log10(levels),decimals=1) - labels = range(5) - for i in numpy.arange(5):labels[i] = str(numpy.int(tmp[i])) + labels = [] + for i in numpy.arange(5):labels.append(str(numpy.int(tmp[i]))) colors = ((0,0,1.),(0,170/255.,0),(127/255.,1.,0),(1.,109/255.,0),(128/255.,0,0)) @@ -156,11 +155,11 @@ class AntPatternPlot: dec_axes = numpy.dot(ones_ra,dec_axes.transpose()) dec_axes2 = numpy.array(dec_axes) - ObjHor = Astro_Coords.Equatorial(ha_axes2,dec_axes2,jd) + ObjHor = Equatorial(ha_axes2,dec_axes2,jd) [alt,az,ha] = ObjHor.change2AltAz() - z = numpy.transpose(alt)*Misc_Routines.CoFactors.d2r ; z = z.flatten() - az = numpy.transpose(az)*Misc_Routines.CoFactors.d2r ; az = az.flatten() + z = numpy.transpose(alt)*CoFactors.d2r ; z = z.flatten() + az = numpy.transpose(az)*CoFactors.d2r ; az = az.flatten() vect = numpy.array([numpy.cos(z)*numpy.sin(az),numpy.cos(z)*numpy.cos(az),numpy.sin(z)]) @@ -400,11 +399,11 @@ class CelestialObjectsPlot: marker = ['--^','--s','--*','--o'] # Getting RGB table to plot celestial object over Jicamarca - colortable = Graphics_Miscens.ColorTable(table=1).readTable() + colortable = ColorTable(table=1).readTable() for io in (numpy.arange(4)+1): if self.show_object[io]!=0: - ObjBodies = Astro_Coords.CelestialBodies() + ObjBodies = CelestialBodies() if io==1: [ra,dec,sunlon,sunobliq] = ObjBodies.sunpos(jd) elif io==2: @@ -416,10 +415,10 @@ class CelestialObjectsPlot: ra = maxra*15. dec = main_dec - ObjEq = Astro_Coords.Equatorial(ra,dec,jd,lat=glat,lon=glon) + ObjEq = Equatorial(ra,dec,jd,lat=glat,lon=glon) [alt, az, ha] = ObjEq.change2AltAz() vect = numpy.array([az,alt]).transpose() - vect = Misc_Routines.Vector(vect,direction=0).Polar2Rect() + vect = Vector(vect,direction=0).Polar2Rect() dcosx = numpy.array(numpy.dot(vect,xg)) dcosy = numpy.array(numpy.dot(vect,yg)) diff --git a/apps/abs/utils/Misc_Routines.py b/apps/abs/utils/Misc_Routines.py index 886cbb1..85c46f0 100644 --- a/apps/abs/utils/Misc_Routines.py +++ b/apps/abs/utils/Misc_Routines.py @@ -12,7 +12,7 @@ Created by Ing. Freddy Galindo (frederickgalindo@gmail.com). ROJ, 21 October 200 import numpy import sys -class CoFactors(): +class CoFactors(object): """ CoFactor class used to call pre-defined conversion factor (e.g. degree to radian). The cu- The current available factor are: @@ -28,14 +28,14 @@ class CoFactors(): h2r = numpy.pi/12. h2d = 15. -class Redirect: - def __init__(self,stdout): +class Redirect(object): + def __init__(self,stdout=None): self.stdout = stdout def write(self,message): self.stdout.insertPlainText(message) -class WidgetPrint: +class WidgetPrint(object): """ WidgetPrint class allows to define the standard output. """ @@ -49,11 +49,11 @@ class WidgetPrint: if self.textid != None: sys.stdout = Redirect(self.textid) print ("") -class Vector: +class Vector(object): """ direction = 0 Polar to rectangular; direction=1 rectangular to polar """ - def __init__(self,vect,direction=0): + def __init__(self,vect=numpy.array([]),direction=0): nsize = numpy.size(vect) if nsize <= 3: vect = vect.reshape(1,nsize) @@ -77,5 +77,10 @@ class Vector: return mm - - +if __name__ == "__main__": + + a=CoFactors() + a=Redirect() + a=WidgetPrint() + a=WidgetPrint() + a=Vector() diff --git a/apps/abs/utils/OverJRO.py b/apps/abs/utils/OverJRO.py index 77c3506..08f302e 100644 --- a/apps/abs/utils/OverJRO.py +++ b/apps/abs/utils/OverJRO.py @@ -27,7 +27,7 @@ class OverJRO(Files): def saveFile(self, contentFile): filename = self.setFilename() finalpath = os.path.join(self.path, self.setFileExtension(filename)) - print "HAHAH" + print ("HAHAH") finalpath = "apps/abs/static/data/"+finalpath self.save(finalpath, contentFile) return finalpath diff --git a/apps/abs/utils/overJroShow.py b/apps/abs/utils/overJroShow.py index c2c5440..7fcaa7a 100644 --- a/apps/abs/utils/overJroShow.py +++ b/apps/abs/utils/overJroShow.py @@ -1,23 +1,28 @@ #!/usr/bin/python - - import sys, os, os.path import traceback -import cgi, Cookie +import cgi +from http import cookies + import time, datetime import types import numpy import numpy.fft import scipy.linalg import scipy.special -from StringIO import StringIO -#import Numeric +from io import StringIO -import Misc_Routines -import TimeTools -import JroAntSetup -import Graphics_OverJro -import Astro_Coords + +#import Misc_Routines +from .Misc_Routines import CoFactors +#import TimeTools +from .TimeTools import Time , Julian ,Doy2Date +#import JroAntSetup +from .JroAntSetup import ReturnSetup +#import Graphics_OverJro +from .Graphics_OverJro import AntPatternPlot ,BFieldPlot,CelestialObjectsPlot,PatternCutPlot,SkyNoisePlot +#import Astro_Coords +from .Astro_Coords import Geodetic ,AltAz ,CelestialBodies class JroPattern(): def __init__(self,pattern=0,path=None,filename=None,nptsx=101,nptsy=101,maxphi=5,fftopt=0, \ @@ -62,7 +67,7 @@ class JroPattern(): # Getting antenna configuration. if filename: - setup = JroAntSetup.ReturnSetup(path=path,filename=filename,pattern=pattern) + setup = ReturnSetup(path=path,filename=filename,pattern=pattern) ues = setup["ues"] phase = setup["phase"] @@ -98,7 +103,7 @@ class JroPattern(): # To get a cut of the pattern. self.getcut = getcut - maxdcos = numpy.sin(maxphi*Misc_Routines.CoFactors.d2r) + maxdcos = numpy.sin(maxphi*CoFactors.d2r) if dcosx==None:dcosx = ((numpy.arange(nptsx,dtype=float)/(nptsx-1))-0.5)*2*maxdcos if dcosy==None:dcosy = ((numpy.arange(nptsy,dtype=float)/(nptsy-1))-0.5)*2*maxdcos self.dcosx = dcosx @@ -283,7 +288,7 @@ class JroPattern(): fft_phase[ix1:ix1+ndx-1,iy1:iy1+ndy-1] = phase[ix,ny-1-iy] - fft_phase = fft_phase*Misc_Routines.CoFactors.d2r + fft_phase = fft_phase*CoFactors.d2r pattern = numpy.abs(numpy.fft.fft2(fft_gain*numpy.exp(numpy.complex(0,1)*fft_phase)))**2 pattern = numpy.fft.fftshift(pattern) @@ -310,16 +315,33 @@ class JroPattern(): Converted to Python by Freddy R. Galindo, ROJ, 20 September 2009. """ - attenuation = None -# foldr = sys.path[-1] + os.sep + "resource" + os.sep - base_path = os.path.dirname(os.path.abspath(__file__)) - #foldr = './resource' - #filen = "attenuation.txt" - attenuationFile = os.path.join(base_path,"resource","attenuation.txt") - #ff = open(os.path.join(foldr,filen),'r') - ff = open(attenuationFile,'r') - exec(ff.read()) - ff.close() +# attenuation = None +# # foldr = sys.path[-1] + os.sep + "resource" + os.sep +# base_path = os.path.dirname(os.path.abspath(__file__)) +# #foldr = './resource' +# #filen = "attenuation.txt" +# attenuationFile = os.path.join(base_path,"resource","attenuation.txt") +# #ff = open(os.path.join(foldr,filen),'r') +# ff = open(attenuationFile,'r') +# print(ff.read()) +# exec(ff.read()) +# ff.close() + attenuation = numpy.array([[[-21.25,-15.25,-9.25,-3.25,03.25,09.25,15.25,21.25], + [-21.25,-15.25,-9.25,-3.25,03.25,09.25,15.25,21.25], + [-21.25,-15.25,-9.25,-3.25,03.25,09.25,15.25,21.25], + [-21.25,-15.25,-9.25,-3.25,03.25,09.25,15.25,21.25], + [-21.25,-15.25,-9.25,-3.25,03.25,09.25,15.25,21.25], + [-21.25,-15.25,-9.25,-3.25,03.25,09.25,15.25,21.25], + [-21.25,-15.25,-9.25,-3.25,03.25,09.25,15.25,21.25], + [-21.25,-15.25,-9.25,-3.25,03.25,09.25,15.25,21.25]], + [[21.25,21.25,21.25,21.25,21.25,21.25,21.25,21.25], + [15.25,15.25,15.25,15.25,15.25,15.25,15.25,15.25], + [09.25,09.25,09.25,09.25,09.25,09.25,09.25,09.25], + [03.25,03.25,03.25,03.25,03.25,03.25,03.25,03.25], + [-03.25,-03.25,-03.25,-03.25,-03.25,-03.25,-03.25,-03.25], + [-09.25,-09.25,-09.25,-09.25,-09.25,-09.25,-09.25,-09.25], + [-15.25,-15.25,-15.25,-15.25,-15.25,-15.25,-15.25,-15.25], + [-21.25,-21.25,-21.25,-21.25,-21.25,-21.25,-21.25,-21.25]]]) return attenuation @@ -396,11 +418,11 @@ class JroPattern(): Converted to Python by Freddy R. Galindo, ROJ, 20 September 2009. """ - pos = self.eomwl*self.__readAttenuation() + pos = self.eomwl*self.__readAttenuation() posx = pos[0,:,:] posy = pos[1,:,:] - phase = phase*Misc_Routines.CoFactors.d2r + phase = phase*CoFactors.d2r module = numpy.zeros((self.nx,self.ny),dtype=complex) for iy in range(self.ny): for ix in range(self.nx): @@ -452,8 +474,8 @@ class JroPattern(): # Tranforming from indexes to axis' values xcenter = xx1[0] + (((xx1[xx1.size-1] - xx1[0])/(xx1.size -1))*(params[1])) ycenter = yy1[0] + (((yy1[yy1.size-1] - yy1[0])/(yy1.size -1))*(params[2])) - xwidth = ((xx1[xx1.size-1] - xx1[0])/(xx1.size-1))*(params[3])*(1/Misc_Routines.CoFactors.d2r) - ywidth = ((yy1[yy1.size-1] - yy1[0])/(yy1.size-1))*(params[4])*(1/Misc_Routines.CoFactors.d2r) + xwidth = ((xx1[xx1.size-1] - xx1[0])/(xx1.size-1))*(params[3])*(1/CoFactors.d2r) + ywidth = ((yy1[yy1.size-1] - yy1[0])/(yy1.size-1))*(params[4])*(1/CoFactors.d2r) meanwx = (xwidth*ywidth) meanpos = numpy.array([xcenter,ycenter]) @@ -1057,14 +1079,14 @@ class overJroShow: self.path = self.madForm.getvalue('path') #path donde se encuentra el archivo: patron de radiacion del usuario else: - print "Content-Type: text/html\n" - print '

This cgi plot script was called without the proper arguments.

' - print '

This is a script used to plot Antenna Cuts over Jicamarca Antenna

' - print '

Required arguments:

' - print '

pattern - chekbox indicating objects over jicamarca antenna

' - print '

or' - print '

filename - The pattern defined by users is a file text' - print '

path - folder with pattern files' + print ("Content-Type: text/html\n") + print ('

This cgi plot script was called without the proper arguments.

') + print ('

This is a script used to plot Antenna Cuts over Jicamarca Antenna

') + print ('

Required arguments:

') + print ('

pattern - chekbox indicating objects over jicamarca antenna

') + print ('

or') + print ('

filename - The pattern defined by users is a file text') + print ('

path - folder with pattern files') sys.exit(0) @@ -1094,12 +1116,12 @@ class overJroShow: if self.showType == 1: if numpy.sum(self.objects) == 0: if self.scriptHeaders == 0: - print "Content-Type: text/html\n" - print '

This cgi plot script was called without the proper arguments.

' - print '

This is a script used to plot Antenna Cuts over Jicamarca Antenna

' - print '

Required arguments:

' - print '

objects - chekbox indicating objects over jicamarca antenna

' - print '

Please, options in "Select Object" must be checked' + print ("Content-Type: text/html\n") + print ('

This cgi plot script was called without the proper arguments.

') + print ('

This is a script used to plot Antenna Cuts over Jicamarca Antenna

') + print ('

Required arguments:

') + print ('

objects - chekbox indicating objects over jicamarca antenna

') + print ('

Please, options in "Select Object" must be checked') sys.exit(0) #considerar para futura implementacion @@ -1112,19 +1134,19 @@ class overJroShow: else: if self.scriptHeaders == 0: - print "Content-Type: text/html\n" - - print '

This cgi plot script was called without the proper arguments.

' - print '

This is a script used to plot Pattern Field and Celestial Objects over Jicamarca Antenna

' - print '

Required arguments:

' - print '

year - year of event

' - print '

month - month of event

' - print '

dom - day of month

' - print '

pattern - pattern is defined by "Select an Experiment" list box

' - print '

maxphi - maxphi is defined by "Max Angle" text box

' - print '

objects - objects is a list defined by checkbox in "Select Object"

' - print '

heights - heights is defined by "Heights" text box, for default heights=[100,500,1000]

' - print '

showType - showType is a hidden element for show plot of Pattern&Object or Antenna Cuts or Sky Noise

' + print ("Content-Type: text/html\n") + + print ('

This cgi plot script was called without the proper arguments.

') + print ('

This is a script used to plot Pattern Field and Celestial Objects over Jicamarca Antenna

') + print ('

Required arguments:

') + print ('

year - year of event

') + print ('

month - month of event

') + print ('

dom - day of month

') + print ('

pattern - pattern is defined by "Select an Experiment" list box

') + print ('

maxphi - maxphi is defined by "Max Angle" text box

') + print ('

objects - objects is a list defined by checkbox in "Select Object"

') + print ('

heights - heights is defined by "Heights" text box, for default heights=[100,500,1000]

') + print ('

showType - showType is a hidden element for show plot of Pattern&Object or Antenna Cuts or Sky Noise

') sys.exit(0) @@ -1139,13 +1161,13 @@ class overJroShow: else: if self.scriptHeaders == 0: - print "Content-Type: text/html\n" - print '

This cgi plot script was called without the proper arguments.

' - print '

This is a script used to plot Sky Noise over Jicamarca Antenna

' - print '

Required arguments:

' - print '

year - year of event

' - print '

month - month of event

' - print '

dom - day of month

' + print ("Content-Type: text/html\n") + print ('

This cgi plot script was called without the proper arguments.

') + print ('

This is a script used to plot Sky Noise over Jicamarca Antenna

') + print ('

Required arguments:

') + print ('

year - year of event

') + print ('

month - month of event

') + print ('

dom - day of month

') sys.exit(0) @@ -1193,11 +1215,11 @@ class overJroShow: self.glon = -76.874383 - self.junkjd = TimeTools.Time(self.year,self.month,self.dom).change2julday() - self.junklst = TimeTools.Julian(self.junkjd).change2lst(longitude=self.glon) + self.junkjd = Time(self.year,self.month,self.dom).change2julday() + self.junklst = Julian(self.junkjd).change2lst(longitude=self.glon) # Finding RA of observatory for a specific date - self.ra_obs = self.junklst*Misc_Routines.CoFactors.h2d + self.ra_obs = self.junklst*CoFactors.h2d def initParameters(self): @@ -1211,9 +1233,9 @@ class overJroShow: # alfa = 1.46*Misc_Routines.CoFactors.d2r # theta = 51.01*Misc_Routines.CoFactors.d2r - alfa = 1.488312*Misc_Routines.CoFactors.d2r + alfa = 1.488312*CoFactors.d2r th = 6.166710 + 45.0 - theta = th*Misc_Routines.CoFactors.d2r + theta = th*CoFactors.d2r sina = numpy.sin(alfa) cosa = numpy.cos(alfa) @@ -1232,11 +1254,11 @@ class overJroShow: self.initParameters() self.doy = datetime.datetime(date.year,date.month,date.day).timetuple().tm_yday - self.junkjd = TimeTools.Time(self.year,self.month,self.dom).change2julday() - self.junklst = TimeTools.Julian(self.junkjd).change2lst(longitude=self.glon) - self.ra_obs = self.junklst*Misc_Routines.CoFactors.h2d + self.junkjd = Time(self.year,self.month,self.dom).change2julday() + self.junklst = Julian(self.junkjd).change2lst(longitude=self.glon) + self.ra_obs = self.junklst*CoFactors.h2d - date = TimeTools.Time(date.year,date.month,date.day).change2strdate(mode=2) + date = Time(date.year,date.month,date.day).change2strdate(mode=2) mesg = 'Over Jicamarca: ' + date[0] @@ -1254,7 +1276,7 @@ class overJroShow: just_rx=just_rx ) - dum = Graphics_OverJro.AntPatternPlot() + dum = AntPatternPlot() dum.contPattern(iplot=0, gpath=self.path4plotname, @@ -1317,7 +1339,7 @@ class overJroShow: # Plotting Contour Map self.path4plotname = '/home/jespinoza/workspace/radarsys/trunk/webapp/apps/abs/static/images' - dum = Graphics_OverJro.AntPatternPlot() + dum = AntPatternPlot() dum.contPattern(iplot=ii, gpath=self.path4plotname, filename=self.plotname0, @@ -1342,13 +1364,13 @@ class overJroShow: [ra,dec,ha] = Astro_Coords.AltAz(vect_polar[1],vect_polar[0],self.junkjd).change2equatorial() - print'Main beam position (HA(min), DEC(degrees)): %f %f'%(ha*4.,dec) + print('Main beam position (HA(min), DEC(degrees)): %f %f')%(ha*4.,dec) self.main_dec = dec self.ptitle = title - Graphics_OverJro.AntPatternPlot().plotRaDec(gpath=self.path4plotname, + AntPatternPlot().plotRaDec(gpath=self.path4plotname, filename=self.plotname0, jd=self.junkjd, ra_obs=self.ra_obs, @@ -1377,7 +1399,7 @@ class overJroShow: # Plotting B field. # print "Drawing magnetic field over Observatory" - Obj = Graphics_OverJro.BFieldPlot() + Obj = BFieldPlot() Obj.plotBField(self.path4plotname,self.plotname0,dcos,alpha,nlon,nlat,self.dcosxrange,self.dcosyrange,ObjB.heights,ObjB.alpha_i) @@ -1423,13 +1445,13 @@ class overJroShow: tod = numpy.arange(ntod)/ntod*24. - [month,dom] = TimeTools.Doy2Date(self.year,self.doy).change2date() + [month,dom] = Doy2Date(self.year,self.doy).change2date() - jd = TimeTools.Time(self.year,month,dom,tod+self.UT).change2julday() + jd = Time(self.year,month,dom,tod+self.UT).change2julday() if numpy.sum(self.show_object[1:]>0)!=0: - self.ObjC = Graphics_OverJro.CelestialObjectsPlot(jd,self.main_dec,tod,self.maxha_min,self.show_object) + self.ObjC = CelestialObjectsPlot(jd,self.main_dec,tod,self.maxha_min,self.show_object) self.ObjC.drawObject(self.glat, self.glon, @@ -1452,7 +1474,7 @@ class overJroShow: #Init ObjCut for PatternCutPlot() view_objects = numpy.where(self.show_object>0) subplots = len(view_objects[0]) - ObjCut = Graphics_OverJro.PatternCutPlot(subplots) + ObjCut = PatternCutPlot(subplots) for io in (numpy.arange(5)): if self.show_object[io]==2: @@ -1512,7 +1534,7 @@ class overJroShow: m_distance = 404114.6 # distance to the Earth in km m_diameter = 1734.4 # diameter in km. width_star = numpy.arctan(m_distance/m_diameter) - width_star = width_star/2./Misc_Routines.CoFactors.d2r*4. + width_star = width_star/2./CoFactors.d2r*4. otitle = 'Moon cut' # else: # print "Moon is not passing over Observatory" @@ -1544,7 +1566,7 @@ class overJroShow: mins = numpy.int32((time - hour)*60.) secs = numpy.int32(((time - hour)*60. - mins)*60.) - ObjT = TimeTools.Time(self.year,self.month,self.dom,hour,mins,secs) + ObjT = Time(self.year,self.month,self.dom,hour,mins,secs) subtitle = ObjT.change2strdate() star_cut = numpy.exp(-(star_ha/width_star)**2./2.) @@ -1585,46 +1607,45 @@ class overJroShow: month = self.month year = self.year - julian = TimeTools.Time(year,month,dom).change2julday() + julian = Time(year,month,dom).change2julday() [powr,time, lst] = Astro_Coords.CelestialBodies().skyNoise(julian) - Graphics_OverJro.SkyNoisePlot([year,month,dom],powr,time,lst).getPlot(self.path4plotname,self.plotname2) + SkyNoisePlot([year,month,dom],powr,time,lst).getPlot(self.path4plotname,self.plotname2) def outputHead(self,title): - print "Content-Type: text/html" - print - self.scriptHeaders = 1 - print '' - print '' - print '\t' + title + '' - print '' + print ("Content-Type: text/html") + print (self).scriptHeaders = 1 + print ('') + print ('') + print ('\t' + title + '') + print ('') # self.printJavaScript() - print '' + print ('') def printJavaScript(self): print def printBody(self): - print '' + print ('') # print '

Test Input Parms

' # for key in self.madForm.keys(): # #print '

name=' + str(key) @@ -1636,25 +1657,25 @@ class overJroShow: # print '

name=' + str(key) + \ # ' value=' + str(cgi.escape(self.madForm.getvalue(key))) + '' - print '' - print '

' - print ' ' - print ' ' - print ' ') + print (' ') + print ('
' + print ('') + print ('
') + print (' ') + print (' ') + print (' ' - print ' ' - print '
') if self.showType == 0: - print ' '%(os.path.join(os.sep + self.__tmpDir,self.plotname0)) + print (' ')%(os.path.join(os.sep + self.__tmpDir,self.plotname0)) if self.showType == 1: - print ' '%(os.path.join(os.sep + self.__tmpDir,self.plotname1)) + print (' ')%(os.path.join(os.sep + self.__tmpDir,self.plotname1)) if self.showType == 2: - print ' '%(os.path.join(os.sep + self.__tmpDir,self.plotname2)) - print '
' - print '
' - print '' - - print '' - print '' + print (' ')%(os.path.join(os.sep + self.__tmpDir,self.plotname2)) + print ('
') + print ('
') + print ('') + + print ('') + print ('') #def execute(self, serverdocspath, tmpdir, currentdate, finalpath, showType=0, maxphi=5.0, objects="[1,1]", heights="[150,500,1000]"): def setInputParameters(self, serverpath, currentdate, finalpath, showType=0, maxphi=5.0, objects="[1,1]", heights="[150,500,1000]"): diff --git a/apps/abs/utils/pat.png b/apps/abs/utils/pat.png new file mode 100644 index 0000000000000000000000000000000000000000..19e21fbc9f479c2c7104e0e3681e606768978d84 GIT binary patch literal 201548 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

%PPOrPsUnxO9cq9fAwH$pBW3J`q*{Jcg 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 literal 0 Hc$@conf: + if abs!=conf: url = '#' if abs is None else abs.get_absolute_url() label = 'None' if abs is None else abs.label messages.warning( @@ -277,7 +277,7 @@ def send_beam(request, id_conf, id_beam): else: i += 1 beam_pos = i + 1 #Estandarizar - print '%s Position: %s' % (beam.name, str(beam_pos)) + print ('%s Position: %s') % (beam.name, str(beam_pos)) conf.send_beam(beam_pos) return redirect('url_abs_conf', conf.id) diff --git a/apps/abs/widgets.py b/apps/abs/widgets.py index d7c0900..c175fc6 100644 --- a/apps/abs/widgets.py +++ b/apps/abs/widgets.py @@ -322,7 +322,7 @@ style = """ + + {% block extra-head %} + {% endblock %} + + + + + + {% include "header_igp.html" %} + + +

+
+ + +
+
+ + {% if no_sidebar %} + + + {% else %} + + {% endif %} + + + {% if no_sidebar %} +
+ {% else %} +
+ {% endif %} + + {% block messages %} + {% if messages %} + {% for message in messages %} + + {% endfor %} + {% endif %} + {% endblock %} + + {% block content %} + {% endblock %} + +
+ + +
+
+ +{% include "footer_igp.html" %} + + + {% block modal %}{% endblock modal %} + {% block debug %}
{{debug}}
{% endblock debug %} + + + {# % bootstrap_javascript jquery='slim' % #} + + + + + + + + + {% block script %}{% endblock script %} + {% block extra-js %} + {% endblock%} + + + + diff --git a/apps/main/templates/base.html b/apps/main/templates/base.html index 38c4e1a..dce9c7c 100644 --- a/apps/main/templates/base.html +++ b/apps/main/templates/base.html @@ -1,19 +1,27 @@ -{% load static %} +{% load static %}{% load bootstrap4 %} {% block title %}Jicamarca Integrated Radar System:::::{% endblock %} - + {# bootstrap_css #} - - - - + + + + + + + + + + + + - + - - - - - - {% block extra-head %} - {% endblock %} + + {% block extra-head %}{% endblock %} - -{% block main_menu %} - -
-{% endblock %} - -
-
- - {% if no_sidebar %} - - - {% else %} - - {% endif %} - - - {% if no_sidebar %} -
- {% else %} -
- {% endif %} - - {% block messages %} - {% if messages %} - {% for message in messages %} - - {% endfor %} - {% endif %} + + + {% include "header_igp.html" %} + +
+ + +
+
+ + {% if no_sidebar %} + + + {% else %} + + {% endif %} + + + {% if no_sidebar %} +
+ {% else %} +
+ {% endif %} + + {% block messages %} + {% if messages %} + {% for message in messages %} + + {% endfor %} + {% endif %} + {% endblock %} + + {% block content %} {% endblock %} - {% block content %} - {% endblock %} +
-
+
+
+ +{% include "footer_igp.html" %} + + + + + {% block modal %}{% endblock modal %} + {% block debug %}
{{debug}}
{% endblock debug %} + + + {# % bootstrap_javascript jquery='slim' % #} + + + + + + + + + {% block extra-js %} + {% endblock%} -
-
-
{{debug}}
-{% block footer %} - -{% endblock %} - -{# bootstrap_javascript jquery=True #} - - - - -{% block extra-js %} -{% endblock%} diff --git a/apps/main/templates/base_edit.html b/apps/main/templates/base_edit.html index e4996b4..f5ffc17 100644 --- a/apps/main/templates/base_edit.html +++ b/apps/main/templates/base_edit.html @@ -1,5 +1,5 @@ {% extends "base.html" %} -{% load bootstrap3 %} +{% load bootstrap4 %} {% load static %} {% load main_tags %} @@ -18,7 +18,7 @@
{% if extra_button %}
- +
{% endif %} {% if button %} diff --git a/apps/main/templates/base_list.html b/apps/main/templates/base_list.html index c97f44b..f7a1f99 100644 --- a/apps/main/templates/base_list.html +++ b/apps/main/templates/base_list.html @@ -1,5 +1,5 @@ {% extends "base.html" %} -{% load bootstrap3 %} +{% load bootstrap4 %} {% load static %} {% load main_tags %} @@ -17,10 +17,10 @@ {% bootstrap_form form layout='horizontal' size='medium' %}

- - + + {% if add_url %} - + {% endif %}
@@ -45,8 +45,8 @@ {% for key in keys %} {% if key == 'actions' %} - - + + {% else %} {{ object|attr:key }} @@ -59,13 +59,13 @@ @@ -73,15 +73,27 @@ {% endblock %} {% block extra-js%} - {% endblock %} diff --git a/apps/main/templates/campaign.html b/apps/main/templates/campaign.html index 24c9c96..3e58a75 100644 --- a/apps/main/templates/campaign.html +++ b/apps/main/templates/campaign.html @@ -1,5 +1,5 @@ {% extends "base.html" %} -{% load bootstrap3 %} +{% load bootstrap4 %} {% load static %} {% load main_tags %} {% block extra-head %} @@ -12,15 +12,15 @@ {% block menu-actions %} - + + {% endblock %} @@ -37,15 +37,15 @@ {{key|title}}{{campaign|attr:key}} {% endfor %} - + - +



- +
- +
@@ -72,9 +72,9 @@ {% endfor %} {% endfor %} -
+
-
+

@@ -91,14 +91,14 @@ $(".clickable-row").click(function() { document.location = $(this).data("href"); }); - + // $("#bt_edit").click(function() { // document.location = "{% url 'url_edit_campaign' campaign.id %}"; // }); - + $("#bt_mix").click(function() { - + }); - + -{% endblock %} \ No newline at end of file +{% endblock %} diff --git a/apps/main/templates/campaign_edit.html b/apps/main/templates/campaign_edit.html index 168de14..ee0ca23 100644 --- a/apps/main/templates/campaign_edit.html +++ b/apps/main/templates/campaign_edit.html @@ -1,5 +1,5 @@ {% extends "base_edit.html" %} -{% load bootstrap3 %} +{% load bootstrap4 %} {% load static %} {% load main_tags %} @@ -8,15 +8,30 @@ {% endblock %} {% block extra-js%} - -{% endblock %} \ No newline at end of file +{% endblock %} diff --git a/apps/main/templates/confirm.html b/apps/main/templates/confirm.html index 1f54529..7a05cb6 100644 --- a/apps/main/templates/confirm.html +++ b/apps/main/templates/confirm.html @@ -1,5 +1,5 @@ {% extends 'base.html' %} -{% load bootstrap3 %} +{% load bootstrap4 %} {% block content-title %}{{title}}{% endblock %} {% block content-suptitle %}{{suptitle}}{% endblock %} @@ -23,10 +23,10 @@
diff --git a/apps/main/templates/dev_conf.html b/apps/main/templates/dev_conf.html index d8ce97d..3ed0ec6 100644 --- a/apps/main/templates/dev_conf.html +++ b/apps/main/templates/dev_conf.html @@ -1,5 +1,5 @@ {% extends "base.html" %} -{% load bootstrap3 %} +{% load bootstrap4 %} {% load static %} {% load main_tags %} {% block content-title %}{{title}}{% endblock %} @@ -9,25 +9,25 @@ {% block menu-actions %} - + @@ -41,7 +41,7 @@ {% if dev_conf.device.device_type.name == 'abs' %} {{connected_modules}} {% else %} {{dev_conf.device.get_status_display}}{% endif %} {% else %} Connected - {% endif %} + {% endif %} {% for key in dev_conf_keys %} diff --git a/apps/main/templates/dev_conf_edit.html b/apps/main/templates/dev_conf_edit.html index 6a50e7a..826c79f 100644 --- a/apps/main/templates/dev_conf_edit.html +++ b/apps/main/templates/dev_conf_edit.html @@ -1,12 +1,12 @@ {% extends "base_edit.html" %} -{% load bootstrap3 %} +{% load bootstrap4 %} {% load static %} {% load main_tags %} {% block extra-js%} -{% if id_exp %} +{% if id_exp != null %} {% endif %} +{% if device == 'dds_rest' %} + + +{% endif %} + {% if device == 'rc' %} {% endif %} diff --git a/apps/main/templates/device.html b/apps/main/templates/device.html index 427f995..13f1a9f 100644 --- a/apps/main/templates/device.html +++ b/apps/main/templates/device.html @@ -1,5 +1,5 @@ {% extends "base.html" %} -{% load bootstrap3 %} +{% load bootstrap4 %} {% load static %} {% load main_tags %} {% block content-title %}{{title}}{% endblock %} diff --git a/apps/main/templates/experiment.html b/apps/main/templates/experiment.html index 2d513cb..1ae6ae2 100644 --- a/apps/main/templates/experiment.html +++ b/apps/main/templates/experiment.html @@ -1,5 +1,5 @@ {% extends "base.html" %} -{% load bootstrap3 %} +{% load bootstrap4 %} {% load static %} {% load main_tags %} {% block extra-head %} @@ -12,18 +12,18 @@ {% block menu-actions %} - + diff --git a/apps/main/templates/experiment_edit.html b/apps/main/templates/experiment_edit.html index 7fe417b..9d7ec2f 100644 --- a/apps/main/templates/experiment_edit.html +++ b/apps/main/templates/experiment_edit.html @@ -1,5 +1,5 @@ {% extends "base_edit.html" %} -{% load bootstrap3 %} +{% load bootstrap4 %} {% load static %} {% load main_tags %} {% block extra-head %} @@ -7,16 +7,24 @@ {% endblock %} {% block extra-js%} - -{% endblock %} \ No newline at end of file +{% endblock %} diff --git a/apps/main/templates/experiment_mix.html b/apps/main/templates/experiment_mix.html index 39318af..97c3612 100644 --- a/apps/main/templates/experiment_mix.html +++ b/apps/main/templates/experiment_mix.html @@ -1,5 +1,5 @@ {% extends "base_edit.html" %} -{% load bootstrap3 %} +{% load bootstrap4 %} {% load static %} {% load main_tags %} {% block extra-head %} diff --git a/apps/main/templates/experiment_summary.html b/apps/main/templates/experiment_summary.html index 682bb67..cbc0c8f 100644 --- a/apps/main/templates/experiment_summary.html +++ b/apps/main/templates/experiment_summary.html @@ -1,5 +1,5 @@ {% extends "base.html" %} -{% load bootstrap3 %} +{% load bootstrap4 %} {% load static %} {% load main_tags %} {% block extra-head %} diff --git a/apps/main/templates/experiment_verify.html b/apps/main/templates/experiment_verify.html index 5030663..1d1b884 100644 --- a/apps/main/templates/experiment_verify.html +++ b/apps/main/templates/experiment_verify.html @@ -1,5 +1,5 @@ {% extends "base.html" %} -{% load bootstrap3 %} +{% load bootstrap4 %} {% load static %} {% load main_tags %} {% block extra-head %} diff --git a/apps/main/templates/footer_igp.html b/apps/main/templates/footer_igp.html new file mode 100644 index 0000000..891e33b --- /dev/null +++ b/apps/main/templates/footer_igp.html @@ -0,0 +1,45 @@ +{% load static %} {% load bootstrap4 %} +
+
+ + +
+ +
\ No newline at end of file diff --git a/apps/main/templates/header_igp.html b/apps/main/templates/header_igp.html new file mode 100644 index 0000000..6ab7925 --- /dev/null +++ b/apps/main/templates/header_igp.html @@ -0,0 +1,119 @@ +{% load static %} {% load bootstrap4 %} + +
+
+ +
+
+ +
+ +
+ +
+
+ +
+
+
+ + diff --git a/apps/main/templates/index.html b/apps/main/templates/index.html index 46695ad..532daae 100644 --- a/apps/main/templates/index.html +++ b/apps/main/templates/index.html @@ -1,5 +1,5 @@ {% extends "base.html" %} -{% load bootstrap3 %} +{% load bootstrap4 %} {% block content-title %}Integrated Radar System{% endblock %} {% block content-suptitle %}at JRO{% endblock %} diff --git a/apps/main/templates/location.html b/apps/main/templates/location.html index a1650a1..66f224e 100644 --- a/apps/main/templates/location.html +++ b/apps/main/templates/location.html @@ -1,5 +1,5 @@ {% extends "base.html" %} -{% load bootstrap3 %} +{% load bootstrap4 %} {% load static %} {% load main_tags %} diff --git a/apps/main/templates/operation.html b/apps/main/templates/operation.html index 599605a..421fa34 100644 --- a/apps/main/templates/operation.html +++ b/apps/main/templates/operation.html @@ -1,5 +1,5 @@ {% extends "base.html" %} -{% load bootstrap3 %} +{% load bootstrap4 %} {% load static %} {% load main_tags %} {% block extra-head %} @@ -54,13 +54,13 @@

{{location.name}} [{{campaign.start_date|date:"Y/m/d"}} - {{campaign.end_date|date:"Y/m/d"}}]

diff --git a/apps/main/urls.py b/apps/main/urls.py index c893cdc..844b0f8 100644 --- a/apps/main/urls.py +++ b/apps/main/urls.py @@ -1,69 +1,69 @@ -from django.conf.urls import url +from django.urls import path -from apps.main import views +from . import views urlpatterns = ( - url(r'^$', views.index, name='index'), + path('', views.index, name='index'), - url(r'^realtime/$', views.real_time, name='url_real_time'), + path('realtime/', views.real_time, name='url_real_time'), - url(r'^theme/(?P[a-z]+)/$', views.theme, name='url_theme'), + path('theme/(/', views.theme, name='url_theme'), - url(r'^location/new/$', views.location_new, name='url_add_location'), - url(r'^location/$', views.locations, name='url_locations'), - url(r'^location/(?P-?\d+)/$', views.location, name='url_location'), - url(r'^location/(?P-?\d+)/edit/$', views.location_edit, name='url_edit_location'), - url(r'^location/(?P-?\d+)/delete/$', views.location_delete, name='url_delete_location'), + path('location/new/', views.location_new, name='url_add_location'), + path('location/', views.locations, name='url_locations'), + path('location//', views.location, name='url_location'), + path('location//edit/', views.location_edit, name='url_edit_location'), + path('location//delete/', views.location_delete, name='url_delete_location'), - url(r'^device/new/$', views.device_new, name='url_add_device'), - url(r'^device/$', views.devices, name='url_devices'), - url(r'^device/(?P-?\d+)/$', views.device, name='url_device'), - url(r'^device/(?P-?\d+)/edit/$', views.device_edit, name='url_edit_device'), - url(r'^device/(?P-?\d+)/delete/$', views.device_delete, name='url_delete_device'), - url(r'^device/(?P-?\d+)/change_ip/$', views.device_change_ip, name='url_change_ip_device'), + path('device/new/', views.device_new, name='url_add_device'), + path('device/', views.devices, name='url_devices'), + path('device//', views.device, name='url_device'), + path('device//edit/', views.device_edit, name='url_edit_device'), + path('device//delete/', views.device_delete, name='url_delete_device'), + path('device//change_ip/', views.device_change_ip, name='url_change_ip_device'), - url(r'^campaign/new/$', views.campaign_new, name='url_add_campaign'), - url(r'^campaign/$', views.campaigns, name='url_campaigns'), - url(r'^campaign/(?P-?\d+)/$', views.campaign, name='url_campaign'), - url(r'^campaign/(?P-?\d+)/edit/$', views.campaign_edit, name='url_edit_campaign'), - url(r'^campaign/(?P-?\d+)/delete/$', views.campaign_delete, name='url_delete_campaign'), - url(r'^campaign/(?P-?\d+)/export/$', views.campaign_export, name='url_export_campaign'), - url(r'^campaign/(?P-?\d+)/import/$', views.campaign_import, name='url_import_campaign'), + path('campaign/new/', views.campaign_new, name='url_add_campaign'), + path('campaign/', views.campaigns, name='url_campaigns'), + path('campaign//', views.campaign, name='url_campaign'), + path('campaign//edit/', views.campaign_edit, name='url_edit_campaign'), + path('campaign//delete/', views.campaign_delete, name='url_delete_campaign'), + path('campaign//export/', views.campaign_export, name='url_export_campaign'), + path('campaign//import/', views.campaign_import, name='url_import_campaign'), - url(r'^experiment/new/$', views.experiment_new, name='url_add_experiment'), - url(r'^experiment/$', views.experiments, name='url_experiments'), - url(r'^experiment/(?P-?\d+)/$', views.experiment, name='url_experiment'), - url(r'^experiment/(?P-?\d+)/edit/$', views.experiment_edit, name='url_edit_experiment'), - url(r'^experiment/(?P-?\d+)/delete/$', views.experiment_delete, name='url_delete_experiment'), - url(r'^experiment/(?P-?\d+)/export/$', views.experiment_export, name='url_export_experiment'), - url(r'^experiment/(?P-?\d+)/import/$', views.experiment_import, name='url_import_experiment'), - url(r'^experiment/(?P-?\d+)/start/$', views.experiment_start, name='url_start_experiment'), - url(r'^experiment/(?P-?\d+)/stop/$', views.experiment_stop, name='url_stop_experiment'), - url(r'^experiment/(?P-?\d+)/mix/$', views.experiment_mix, name='url_mix_experiment'), - url(r'^experiment/(?P-?\d+)/mix/delete/$', views.experiment_mix_delete, name='url_delete_mix_experiment'), - url(r'^experiment/(?P-?\d+)/summary/$', views.experiment_summary, name='url_sum_experiment'), - url(r'^experiment/(?P-?\d+)/verify/$', views.experiment_verify, name='url_verify_experiment'), + path('experiment/new/', views.experiment_new, name='url_add_experiment'), + path('experiment/', views.experiments, name='url_experiments'), + path('experiment//', views.experiment, name='url_experiment'), + path('experiment//edit/', views.experiment_edit, name='url_edit_experiment'), + path('experiment//delete/', views.experiment_delete, name='url_delete_experiment'), + path('experiment//export/', views.experiment_export, name='url_export_experiment'), + path('experiment//import/', views.experiment_import, name='url_import_experiment'), + path('experiment//start/', views.experiment_start, name='url_start_experiment'), + path('experiment//stop/', views.experiment_stop, name='url_stop_experiment'), + path('experiment//mix/', views.experiment_mix, name='url_mix_experiment'), + path('experiment//mix/delete/', views.experiment_mix_delete, name='url_delete_mix_experiment'), + path('experiment//summary/', views.experiment_summary, name='url_sum_experiment'), + path('experiment//verify/', views.experiment_verify, name='url_verify_experiment'), - url(r'^experiment/(?P-?\d+)/new_dev_conf/$', views.dev_conf_new, name='url_add_dev_conf'), - url(r'^experiment/(?P-?\d+)/new_dev_conf/(?P-?\d+)/$', views.dev_conf_new, name='url_add_dev_conf'), - url(r'^dev_conf/$', views.dev_confs, name='url_dev_confs'), - url(r'^dev_conf/(?P-?\d+)/$', views.dev_conf, name='url_dev_conf'), - url(r'^dev_conf/(?P-?\d+)/edit/$', views.dev_conf_edit, name='url_edit_dev_conf'), - url(r'^dev_conf/(?P-?\d+)/delete/$', views.dev_conf_delete, name='url_delete_dev_conf'), + path('experiment//new_dev_conf/', views.dev_conf_new, name='url_add_dev_conf'), + path('experiment//new_dev_conf//', views.dev_conf_new, name='url_add_dev_conf'), + path('dev_conf/', views.dev_confs, name='url_dev_confs'), + path('dev_conf//', views.dev_conf, name='url_dev_conf'), + path('dev_conf//edit/', views.dev_conf_edit, name='url_edit_dev_conf'), + path('dev_conf//delete/', views.dev_conf_delete, name='url_delete_dev_conf'), - url(r'^dev_conf/(?P-?\d+)/write/$', views.dev_conf_write, name='url_write_dev_conf'), - url(r'^dev_conf/(?P-?\d+)/read/$', views.dev_conf_read, name='url_read_dev_conf'), - url(r'^dev_conf/(?P-?\d+)/import/$', views.dev_conf_import, name='url_import_dev_conf'), - url(r'^dev_conf/(?P-?\d+)/export/$', views.dev_conf_export, name='url_export_dev_conf'), - url(r'^dev_conf/(?P-?\d+)/start/$', views.dev_conf_start, name='url_start_dev_conf'), - url(r'^dev_conf/(?P-?\d+)/stop/$', views.dev_conf_stop, name='url_stop_dev_conf'), - url(r'^dev_conf/(?P-?\d+)/status/$', views.dev_conf_status, name='url_status_dev_conf'), + path('dev_conf//write/', views.dev_conf_write, name='url_write_dev_conf'), + path('dev_conf//read/', views.dev_conf_read, name='url_read_dev_conf'), + path('dev_conf//import/', views.dev_conf_import, name='url_import_dev_conf'), + path('dev_conf//export/', views.dev_conf_export, name='url_export_dev_conf'), + path('dev_conf//start/', views.dev_conf_start, name='url_start_dev_conf'), + path('dev_conf//stop/', views.dev_conf_stop, name='url_stop_dev_conf'), + path('dev_conf//status/', views.dev_conf_status, name='url_status_dev_conf'), - url(r'^operation/$', views.operation, name='url_operation'), - url(r'^operation/(?P-?\d+)/$', views.operation, name='url_operation'), - url(r'^operation/(?P-?\d+)/revoke$', views.revoke_tasks, name='url_operation_revoke'), - url(r'^operation/(?P-?\d+)/show$', views.show_tasks, name='url_operation_show'), - url(r'^operation/(?P-?\d+)/radar/(?P-?\d+)/start/$', views.radar_start, name='url_radar_start'), - url(r'^operation/(?P-?\d+)/radar/(?P-?\d+)/stop/$', views.radar_stop, name='url_radar_stop'), - url(r'^operation/(?P-?\d+)/radar/(?P-?\d+)/refresh/$', views.radar_refresh, name='url_radar_refresh'), + path('operation/', views.operation, name='url_operation'), + path('operation//', views.operation, name='url_operation'), + path('operation//revoke', views.revoke_tasks, name='url_operation_revoke'), + path('operation//show', views.show_tasks, name='url_operation_show'), + path('operation//radar//start/', views.radar_start, name='url_radar_start'), + path('operation//radar//stop/', views.radar_stop, name='url_radar_stop'), + path('operation//radar//refresh/', views.radar_refresh, name='url_radar_refresh'), ) diff --git a/apps/main/views.py b/apps/main/views.py index 1cb07b9..022558e 100644 --- a/apps/main/views.py +++ b/apps/main/views.py @@ -6,7 +6,7 @@ from datetime import datetime, timedelta from django.shortcuts import render, redirect, get_object_or_404, HttpResponse from django.utils.safestring import mark_safe from django.http import HttpResponseRedirect -from django.core.urlresolvers import reverse +from django.urls import reverse from django.db.models import Q from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger from django.contrib import messages @@ -29,6 +29,7 @@ from apps.jars.forms import JARSConfigurationForm from apps.cgs.forms import CGSConfigurationForm from apps.abs.forms import ABSConfigurationForm from apps.usrp.forms import USRPConfigurationForm +from apps.dds_rest.forms import DDSRestConfigurationForm from .utils import Params from .models import Campaign, Experiment, Device, Configuration, Location, RunningExperiment, DEV_STATES @@ -38,6 +39,7 @@ from apps.usrp.models import USRPConfiguration from apps.abs.models import ABSConfiguration from apps.rc.models import RCConfiguration, RCLine, RCLineType, RCClock from apps.dds.models import DDSConfiguration +from apps.dds_rest.models import DDSRestConfiguration from radarsys.celery import app @@ -45,6 +47,7 @@ from radarsys.celery import app CONF_FORMS = { 'rc': RCConfigurationForm, 'dds': DDSConfigurationForm, + 'dds_rest': DDSRestConfigurationForm, 'jars': JARSConfigurationForm, 'cgs': CGSConfigurationForm, 'abs': ABSConfigurationForm, @@ -54,6 +57,7 @@ CONF_FORMS = { CONF_MODELS = { 'rc': RCConfiguration, 'dds': DDSConfiguration, + 'dds_rest': DDSRestConfiguration, 'jars': JARSConfiguration, 'cgs': CGSConfiguration, 'abs': ABSConfiguration, @@ -88,7 +92,7 @@ def is_operator(user): def has_been_modified(model): prev_hash = model.hash - new_hash = hashlib.sha256(str(model.parms_to_dict)).hexdigest() + new_hash = hashlib.sha256(str(model.parms_to_dict).encode()).hexdigest() if prev_hash != new_hash: model.hash = new_hash model.save() @@ -255,7 +259,7 @@ def device_new(request): kwargs = {} kwargs['form'] = form kwargs['title'] = 'Device' - kwargs['suptitle'] = 'New' + kwargs['suptitle'] = 'New_2' kwargs['button'] = 'Create' kwargs['menu_devices'] = 'active' @@ -1054,7 +1058,7 @@ def experiment_summary(request, id_exp): rate_bh = ((nsa-codes_num)*channels_number*2 * bytes_/IPP_us)*(36*(10**8)/cohe_integr) rate_gh = rate_bh/(1024*1024*1024) - + conf['Time per Block'] = IPP_s * profiles_block * cohe_integr conf['keys'].append('Time per Block') conf['Acq time'] = IPP_s * acq_profiles @@ -1065,7 +1069,7 @@ def experiment_summary(request, id_exp): conf['keys'].append('Va (m/s)') conf['Vrange (m/s)'] = 3/(2*IPP_s*cohe_integr) conf['keys'].append('Vrange (m/s)') - + kwargs['configurations'].append(conf) kwargs['menu_experiments'] = 'active' @@ -1383,7 +1387,7 @@ def dev_conf_new(request, id_exp=0, id_dev=0): if id_dev != 0: device = Device.objects.get(pk=id_dev) kwargs['device'] = device.device_type.name - + print(id_exp) return render(request, 'dev_conf_edit.html', kwargs) @@ -1453,17 +1457,17 @@ def dev_conf_status(request, id_conf): conf = get_object_or_404(Configuration, pk=id_conf) conf_active = Configuration.objects.filter(pk=conf.device.conf_active).first() - if conf_active<>conf: + if conf_active!=conf: url = '#' if conf_active is None else conf_active.get_absolute_url() label = 'None' if conf_active is None else conf_active.label messages.warning( - request, + request, mark_safe('The current configuration has not been written to device, the active configuration is {}'.format( url, label )) ) - + return redirect(conf.get_absolute_url()) if conf.status_device(): @@ -1503,7 +1507,7 @@ def dev_conf_write(request, id_conf): messages.error(request, conf.message) return redirect(get_object_or_404(Configuration, pk=id_conf).get_absolute_url()) - + kwargs = { 'title': 'Write Configuration', 'suptitle': conf.label, @@ -1806,9 +1810,9 @@ def radar_start(request, id_camp, id_radar): if start > campaign.end_date or start < campaign.start_date: messages.warning(request, 'Experiment {} out of date'.format(exp)) continue - + app.control.revoke(exp.task) - + if now > start and now <= end: task = task_start.delay(exp.id) exp.status = task.wait() @@ -1919,8 +1923,8 @@ def real_time(request): return render(request, 'real_time.html', kwargs) def theme(request, theme): - + user = request.user user.profile.theme = theme user.save() - return redirect('index') \ No newline at end of file + return redirect('index') diff --git a/apps/misc/urls.py b/apps/misc/urls.py index 959712f..154b852 100644 --- a/apps/misc/urls.py +++ b/apps/misc/urls.py @@ -1,4 +1,4 @@ -from django.conf.urls import url +from django.urls import path urlpatterns = ( diff --git a/apps/rc/models.py b/apps/rc/models.py index 405c906..c96fc71 100644 --- a/apps/rc/models.py +++ b/apps/rc/models.py @@ -8,7 +8,7 @@ from base64 import b64encode from struct import pack from django.db import models -from django.core.urlresolvers import reverse +from django.urls import reverse from django.core.validators import MinValueValidator, MaxValueValidator from apps.main.models import Configuration @@ -554,7 +554,7 @@ class RCConfiguration(Configuration): else: data = {'manual': [clock.multiplier, clock.divisor, clock.reference]} payload = self.request('setfreq', 'post', data=json.dumps(data)) - if payload['command'] <> 'ok': + if payload['command'] != 'ok': self.message = 'RC write: {}'.format(payload['command']) else: self.message = payload['programming'] @@ -663,8 +663,8 @@ class RCLineType(models.Model): class RCLine(models.Model): - rc_configuration = models.ForeignKey(RCConfiguration, on_delete=models.CASCADE) - line_type = models.ForeignKey(RCLineType) + rc_configuration = models.ForeignKey('RCConfiguration', on_delete=models.CASCADE) + line_type = models.ForeignKey('RCLineType',on_delete=models.CASCADE) channel = models.PositiveIntegerField(default=0) position = models.PositiveIntegerField(default=0) params = models.TextField(default='{}') @@ -1019,7 +1019,7 @@ class RCLine(models.Model): class RCClock(models.Model): - rc_configuration = models.ForeignKey(RCConfiguration, on_delete=models.CASCADE) + rc_configuration = models.ForeignKey('RCConfiguration', on_delete=models.CASCADE) mode = models.BooleanField(default=True, choices=((True, 'Auto'), (False, 'Manual'))) multiplier = models.PositiveIntegerField(default=60) divisor = models.PositiveIntegerField(default=10) diff --git a/apps/rc/templates/rc_conf.html b/apps/rc/templates/rc_conf.html index 3e20179..1bd80a0 100644 --- a/apps/rc/templates/rc_conf.html +++ b/apps/rc/templates/rc_conf.html @@ -1,10 +1,10 @@ {% extends "dev_conf.html" %} {% load static %} -{% load bootstrap3 %} +{% load bootstrap4 %} {% load main_tags %} {% block extra-menu-actions %} -
  • View Pulses
  • +
  • View Pulses
  • {% endblock %} {% block content-detail %} diff --git a/apps/rc/templates/rc_conf_edit.html b/apps/rc/templates/rc_conf_edit.html index 0895330..1273dc5 100644 --- a/apps/rc/templates/rc_conf_edit.html +++ b/apps/rc/templates/rc_conf_edit.html @@ -1,5 +1,5 @@ {% extends "dev_conf_edit.html" %} -{% load bootstrap3 %} +{% load bootstrap4 %} {% load static %} {% block extra-head %} diff --git a/apps/rc/templates/rc_lines.html b/apps/rc/templates/rc_lines.html index db80513..ec23f4d 100644 --- a/apps/rc/templates/rc_lines.html +++ b/apps/rc/templates/rc_lines.html @@ -1,4 +1,4 @@ -{% load bootstrap3 %} +{% load bootstrap4 %}


    @@ -10,7 +10,7 @@ Expand/Collapse CH{{line.channel}} - {{line.get_name}} {% if edit %} - + {% endif %}
    @@ -21,7 +21,7 @@ Expand/Collapse {% for f in line.subforms %}
    -
    {% if edit %}{% endif %}
    +
    {% if edit %}{% endif %}
    {% bootstrap_form f layout='horizontal' size='small' %}
    diff --git a/apps/rc/templates/rc_pulses.html b/apps/rc/templates/rc_pulses.html index 485e1d2..9e0b671 100644 --- a/apps/rc/templates/rc_pulses.html +++ b/apps/rc/templates/rc_pulses.html @@ -1,6 +1,6 @@ {% extends "dev_conf.html" %} {% load static %} -{% load bootstrap3 %} +{% load bootstrap4 %} {% load main_tags %} {% block extra-head %} diff --git a/apps/rc/urls.py b/apps/rc/urls.py index 6885c0b..2c91fc2 100644 --- a/apps/rc/urls.py +++ b/apps/rc/urls.py @@ -1,23 +1,23 @@ -from django.conf.urls import url +from django.urls import path -from apps.rc import views +from . import views urlpatterns = ( - url(r'^(?P-?\d+)/$', views.conf, name='url_rc_conf'), - url(r'^(?P-?\d+)/import/$', views.import_file, name='url_import_rc_conf'), - url(r'^(?P-?\d+)/edit/$', views.conf_edit, name='url_edit_rc_conf'), - url(r'^(?P-?\d+)/plot/$', views.plot_pulses, name='url_plot_rc_pulses'), - url(r'^(?P-?\d+)/plot2/$', views.plot_pulses2, name='url_plot_rc_pulses2'), + path('/', views.conf, name='url_rc_conf'), + path('/import/', views.import_file, name='url_import_rc_conf'), + path('/edit/', views.conf_edit, name='url_edit_rc_conf'), + path('/plot/', views.plot_pulses, name='url_plot_rc_pulses'), + path('/plot2/', views.plot_pulses2, name='url_plot_rc_pulses2'), #url(r'^(?P-?\d+)/write/$', 'apps.main.views.dev_conf_write', name='url_write_rc_conf'), #url(r'^(?P-?\d+)/read/$', 'apps.main.views.dev_conf_read', name='url_read_rc_conf'), - url(r'^(?P-?\d+)/raw/$', views.conf_raw, name='url_raw_rc_conf'), - url(r'^(?P-?\d+)/add_line/$', views.add_line, name='url_add_rc_line'), - url(r'^(?P-?\d+)/add_line/(?P-?\d+)/$', views.add_line, name='url_add_rc_line'), - url(r'^(?P-?\d+)/add_line/(?P-?\d+)/code/(?P-?\d+)/$', views.add_line, name='url_add_rc_line_code'), - url(r'^(?P-?\d+)/update_position/$', views.update_lines_position, name='url_update_rc_lines_position'), - url(r'^(?P-?\d+)/line/(?P-?\d+)/delete/$', views.remove_line, name='url_remove_rc_line'), - url(r'^(?P-?\d+)/line/(?P-?\d+)/add_subline/$', views.add_subline, name='url_add_rc_subline'), - url(r'^(?P-?\d+)/line/(?P-?\d+)/codes/$', views.edit_codes, name='url_edit_rc_codes'), - url(r'^(?P-?\d+)/line/(?P-?\d+)/codes/(?P-?\d+)/$', views.edit_codes, name='url_edit_rc_codes'), - url(r'^(?P-?\d+)/line/(?P-?\d+)/subline/(?P-?\d+)/delete/$', views.remove_subline, name='url_remove_rc_subline'), + path('/raw/', views.conf_raw, name='url_raw_rc_conf'), + path('/add_line/', views.add_line, name='url_add_rc_line'), + path('/add_line//', views.add_line, name='url_add_rc_line'), + path('/add_line//code//', views.add_line, name='url_add_rc_line_code'), + path('/update_position/', views.update_lines_position, name='url_update_rc_lines_position'), + path('/line//delete/', views.remove_line, name='url_remove_rc_line'), + path('/line//add_subline/', views.add_subline, name='url_add_rc_subline'), + path('/line//codes/', views.edit_codes, name='url_edit_rc_codes'), + path('/line//codes//', views.edit_codes, name='url_edit_rc_codes'), + path('/line//subline//delete/', views.remove_subline, name='url_remove_rc_subline'), ) diff --git a/apps/usrp/urls.py b/apps/usrp/urls.py index 7b22bb4..79c19b9 100644 --- a/apps/usrp/urls.py +++ b/apps/usrp/urls.py @@ -1,12 +1,12 @@ -from django.conf.urls import url +from django.urls import path from apps.main import views urlpatterns = ( - url(r'^(?P-?\d+)/$', views.dev_conf, name='url_usrp_conf'), - url(r'^(?P-?\d+)/edit/$', views.dev_conf_edit, name='url_edit_usrp_conf'), - url(r'^(?P-?\d+)/write/$', views.dev_conf_write, name='url_write_usrp_conf'), - url(r'^(?P-?\d+)/read/$', views.dev_conf_read, name='url_read_usrp_conf'), - url(r'^(?P-?\d+)/import/$', views.dev_conf_import, name='url_import_usrp_conf'), - url(r'^(?P-?\d+)/export/$', views.dev_conf_export, name='url_export_usrp_conf'), + path('/', views.dev_conf, name='url_usrp_conf'), + path('/edit/', views.dev_conf_edit, name='url_edit_usrp_conf'), + path('/write/', views.dev_conf_write, name='url_write_usrp_conf'), + path('/read/', views.dev_conf_read, name='url_read_usrp_conf'), + path('/import/', views.dev_conf_import, name='url_import_usrp_conf'), + path('/export/', views.dev_conf_export, name='url_export_usrp_conf'), ) diff --git a/devices/dds_rest/__init__.py b/devices/dds_rest/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/devices/dds_rest/__init__.py diff --git a/devices/dds_rest/api.py b/devices/dds_rest/api.py new file mode 100644 index 0000000..173e410 --- /dev/null +++ b/devices/dds_rest/api.py @@ -0,0 +1,153 @@ +''' +Created on Dec 2, 2014 + +@author: Miguel Urco + +eth_device decorator is used to implement an api to ethernet devices. +When eth_device decorator is used it adds two parameters to any function (ip and port) + +#Definition + +@eth_device +def enable_rf() + cmd = "xxxxx" + payload = "xxxxxx" + + return cmd, payload + +#How to call this function: +answer = enable_rf(ip, port) + +''' +from devices.dds import data + +from devices.jro_device import eth_device, IdClass + +ID_CLASS = IdClass["dds"] + +CMD_RESET =0X01 +CMD_ENABLE =0X02 +CMD_CHANGEIP =0X03 +CMD_STATUS =0X04 +CMD_ECHO =0XFE + +DDS_CMD_RESET =0X10 +DDS_CMD_ENABLE_RF =0x11 +# DDS_CMD_MULTIPLIER =0X12 +# DDS_CMD_MODE =0x13 +# DDS_CMD_FREQUENCY_A =0X14 +# DDS_CMD_FREQUENCY_B =0x15 +# DDS_CMD_PHASE_A =0X16 +# DDS_CMD_PHASE_B =0x17 +# DDS_CMD_AMPLITUDE_1 =0X19 #Se han invertido la posicion de los canales +# DDS_CMD_AMPLITUDE_2 =0x18 #en el PCB + +DDS_CMD_WRITE =0x50 +DDS_CMD_READ =0x8000 + +@eth_device(ID_CLASS) +def reset(): + + cmd = CMD_RESET + payload = "" + + return cmd, payload + +@eth_device(ID_CLASS) +def change_ip(new_ip, mask="255.255.255.0", gateway="0.0.0.0"): + + cmd = CMD_CHANGEIP + payload = new_ip + '/' + mask + '/' + gateway + + return cmd, payload + +@eth_device(ID_CLASS) +def status(): + + cmd = CMD_STATUS + payload = "" + + return cmd, payload + +@eth_device(ID_CLASS) +def echo(): + + cmd = CMD_ECHO + payload = "" + + return cmd, payload + +@eth_device(ID_CLASS) +def enable_rf(): + + cmd = DDS_CMD_ENABLE_RF + payload = chr(0x01) + + return cmd, payload + +@eth_device(ID_CLASS) +def disable_rf(): + + cmd = DDS_CMD_ENABLE_RF + payload = chr(0x00) + + return cmd, payload + +@eth_device(ID_CLASS) +def read_all_device(): + + payload = "" + + return DDS_CMD_READ, payload + +@eth_device(ID_CLASS) +def write_all_device(payload): + + return DDS_CMD_WRITE, payload + +def read_config(ip, port): + """ + Output: + parms : Dictionary with keys + multiplier : + frequencyA : + frequencyB : + frequencyA_Mhz : + frequencyB_Mhz : + modulation : + phaseA_degrees : + phaseB_degrees : + amplitudeI : + amplitudeQ : + + """ + payload = read_all_device(ip, port) + + return data.dds_str_to_dict(payload) + +def write_config(ip, port, parms): + """ + Input: + ip : + port : + parms : Dictionary with keys + multiplier : 4 to 20 + frequencyA : 0 to (2**48-1) equivalent to: 0 - "Master clock" + frequencyB : 0 to (2**48-1) equivalent to: 0 - "Master clock" + modulation : 0 to 3 + phaseA_degrees : 0 - 360 degrees + phaseB_degrees : 0 - 360 degrees + amplitudeI : 0 to (2**12-1) equivalent to: 0 - 100% + amplitudeQ : 0 to (2**12-1) equivalent to: 0 - 100% + + """ + + payload = data.dict_to_dds_str(parms) + + answer = write_all_device(ip, port, payload) + + return answer + +if __name__ == '__main__': + + print(read_config("127.0.0.1", 2000)) diff --git a/devices/dds_rest/data.py b/devices/dds_rest/data.py new file mode 100644 index 0000000..7bc5dab --- /dev/null +++ b/devices/dds_rest/data.py @@ -0,0 +1,410 @@ +''' +Created on Feb 15, 2016 + +@author: Miguel Urco +''' +import struct +import string + +DDS_NBITS = 48 + +FILE_STRUCTURE = """Phase Adjust Register 1 +----------------------- +00000000 +00000000 +----------------------- +Phase Adjust Register 2 +----------------------- +00000000 +00000000 +----------------------- +Frequency Tuning Word 1 +----------------------- +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +----------------------- +Frequency Tuning Word 2 +----------------------- +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +----------------------- +Delta Frequency Word +----------------------- +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +----------------------- +Update Clock +----------------------- +00000000 +00000000 +00000000 +00000000 +----------------------- +Ramp Rate Clock +----------------------- +00000000 +00000000 +00000000 +----------------------- +Control Register +----------------------- +00000000 +00000000 +00000000 +00000000 +----------------------- +Output Shaped Keying I +Multiplier +----------------------- +00000000 +00000000 +----------------------- +Output Shaped Keying Q +Multiplier +----------------------- +00000000 +00000000 +----------------------- +Output Shaped Keying +Ramp Rate +----------------------- +00000000 +----------------------- +QDAC +----------------------- +00000000 +00000000 +----------------------- +CLOCK INPUT +----------------------- +10.00000000""" + +def freq_to_binary(freq, mclock): + + if not mclock: + return None + + try: + binary = int((float(freq)/mclock)*(2**DDS_NBITS)) + except: + return 0 + + return binary + +def binary_to_freq(binary, mclock): + + if not mclock: + return None + + try: + freq = (float(binary)/(2**DDS_NBITS))*mclock + except: + return 0 + + return freq + +def phase_to_binary(phase): + + try: + binary = int(float(phase)*8192/180.0) + except: + return 0 + + return binary + +def binary_to_phase(binary): + + try: + phase = float(binary)*180.0/8192 + except: + return 0 + + return phase + +def __fill_dds_dict(parms): + + my_dict = {'clock' : None, + 'multiplier' : 1, + 'frequencyA' : 0, + 'frequencyB' : 0, + 'frequencyA_Mhz' : 0, + 'frequencyB_Mhz' : 0, + 'phaseA_degress' : 0, + 'phaseB_degress' : 0, + 'modulation' : 0, + 'amplitudeI' : 0, + 'amplitudeQ' : 0, + 'amplitude_enabled' : 0, + 'delta_frequency' : 0, + 'update_clock' : 0, + 'ramp_rate_clock' : 0, + 'amplitude_ramp_rate' : 0, + 'qdac' : 0 + } + + my_dict.update(parms) + my_dict['phaseA'] = phase_to_binary(my_dict['phaseA_degrees']) + my_dict['phaseB'] = phase_to_binary(my_dict['phaseB_degrees']) + + pll_range = 0 + if my_dict['clock'] >= 200: + pll_range = 1 + + pll_bypass = 0 + if my_dict['multiplier'] < 4: + pll_bypass = 1 + + control_register = (1 << 28) + \ + (pll_range << 22) + (pll_bypass << 21) + \ + (my_dict['multiplier'] << 16) + \ + (my_dict['modulation'] << 9) + \ + (my_dict['amplitude_enabled'] << 5) + + my_dict['control_register'] = control_register + + return my_dict + +def dds_str_to_dict(registers, clock=None): + + """ + Output: + parms : Dictionary with keys + multiplier : + frequencyA : + frequencyB : + frequencyA_Mhz : + frequencyB_Mhz : + modulation : + phaseA_degrees : + phaseB_degrees : + amplitudeI : + amplitudeQ : + + """ + + if not registers: + return {} + + if len(registers) != 0x28: + return {} + + phaseA = struct.unpack('>H', registers[0x0:0x2])[0] + phaseB = struct.unpack('>H', registers[0x2:0x4])[0] + + frequencyA = struct.unpack('>Q', '\x00\x00' + registers[0x04:0x0A])[0] + frequencyB = struct.unpack('>Q', '\x00\x00' + registers[0x0A:0x10])[0] + + delta_frequency = struct.unpack('>Q', '\x00\x00' + registers[0x10:0x16])[0] + + update_clock = struct.unpack('>I', registers[0x16:0x1A])[0] + + ramp_rate_clock = struct.unpack('>I', '\x00' + registers[0x1A:0x1D])[0] + + control_register = struct.unpack('>I', registers[0x1D:0x21])[0] + + amplitudeI = struct.unpack('>H', registers[0x21:0x23])[0] + amplitudeQ = struct.unpack('>H', registers[0x23:0x25])[0] + + amp_ramp_rate = ord(registers[0x25]) + + qdac = struct.unpack('>H', registers[0x26:0x28])[0] + + multiplier = (control_register & 0x001F0000) >> 16 + modulation = (control_register & 0x00000E00) >> 9 + amplitude_enabled = (control_register & 0x00000020) >> 5 + + frequencyA_Mhz = None + frequencyB_Mhz = None + + if clock: + mclock = clock*multiplier + frequencyA_Mhz = binary_to_freq(frequencyA, mclock) + frequencyB_Mhz = binary_to_freq(frequencyB, mclock) + + parms = {'clock' : clock, + 'multiplier' : multiplier, + 'frequencyA' : frequencyA, + 'frequencyB' : frequencyB, + 'frequencyA_Mhz' : frequencyA_Mhz, + 'frequencyB_Mhz' : frequencyB_Mhz, + 'phaseA' : phaseA, + 'phaseB' : phaseB, + 'phaseA_degrees' : binary_to_phase(phaseA), + 'phaseB_degrees' : binary_to_phase(phaseB), + 'modulation' : modulation, + 'amplitudeI' : amplitudeI, + 'amplitudeQ' : amplitudeQ, + 'amplitude_enabled' : amplitude_enabled, + 'delta_frequency' : delta_frequency, + 'update_clock' : update_clock, + 'ramp_rate_clock' : ramp_rate_clock, + 'amp_ramp_rate' : amp_ramp_rate, + 'qdac' : qdac + } + + return parms + +def dict_to_dds_str(parms): + """ + Input: + parms : Dictionary with keys + multiplier : 4 to 20 + frequencyA : 0 to (2**48-1) equivalent to: 0 - "Master clock" + frequencyB : 0 to (2**48-1) equivalent to: 0 - "Master clock" + modulation : 0 to 3 + phaseA_degrees : 0 - 360 degrees + phaseB_degrees : 0 - 360 degrees + amplitudeI : 0 to (2**12-1) equivalent to: 0 - 100% + amplitudeQ : 0 to (2**12-1) equivalent to: 0 - 100% + """ + + my_dict = __fill_dds_dict(parms) + + registers = "" + + registers += struct.pack(">H", my_dict['phaseA']) + registers += struct.pack(">H", my_dict['phaseB']) + + registers += struct.pack(">Q", my_dict['frequencyA'])[2:] + registers += struct.pack(">Q", my_dict['frequencyB'])[2:] + + registers += struct.pack(">Q", my_dict['delta_frequency'])[2:] + + registers += struct.pack(">I", my_dict['update_clock']) + + registers += struct.pack(">I", my_dict['ramp_rate_clock'])[1:] + + registers += struct.pack(">I", my_dict['control_register']) + + registers += struct.pack(">H", my_dict['amplitudeI']) + + registers += struct.pack(">H", my_dict['amplitudeQ']) + + registers += chr(my_dict['amplitude_ramp_rate']) + + registers += struct.pack(">H", my_dict['qdac']) + + return registers + +def text_to_dict(lines): + + registers = "" + registers_v2 = [] + + for this_line in lines: + this_line = str.strip(this_line) + + if str.isalpha(this_line): + continue + + if not str.isdigit(this_line): + try: + value = float(this_line) + except: + continue + + registers_v2.append(value) + continue + + if len(this_line) != 8: + continue + + registers += chr(string.atoi(this_line,2)) + + mclock = None + if len(registers_v2) > 0: + mclock = registers_v2[0] + + my_dict = dds_str_to_dict(registers, mclock) + + return my_dict + +def dict_to_text(parms): + """ + It creates formatted DDS text using dictionary values. + """ + my_dict = __fill_dds_dict(parms) + + lines = FILE_STRUCTURE.split('\n') + + cad = '{0:016b}'.format(my_dict['phaseA']) + lines[2] = cad[0:8] + lines[3] = cad[8:16] + + cad = '{0:016b}'.format(my_dict['phaseB']) + lines[7] = cad[0:8] + lines[8] = cad[8:16] + + cad = '{0:048b}'.format(my_dict['frequencyA']) + lines[12] = cad[0:8] + lines[13] = cad[8:16] + lines[14] = cad[16:24] + lines[15] = cad[24:32] + lines[16] = cad[32:40] + lines[17] = cad[40:48] + + cad = '{0:048b}'.format(my_dict['frequencyB']) + lines[21] = cad[0:8] + lines[22] = cad[8:16] + lines[23] = cad[16:24] + lines[24] = cad[24:32] + lines[25] = cad[32:40] + lines[26] = cad[40:48] + + cad = '{0:048b}'.format(my_dict['delta_frequency']) + lines[30] = cad[0:8] + lines[31] = cad[8:16] + lines[32] = cad[16:24] + lines[33] = cad[24:32] + lines[34] = cad[32:40] + lines[35] = cad[40:48] + + cad = '{0:032b}'.format(my_dict['update_clock']) + lines[39] = cad[0:8] + lines[40] = cad[8:16] + lines[41] = cad[16:24] + lines[42] = cad[24:32] + + cad = '{0:024b}'.format(my_dict['ramp_rate_clock']) + lines[46] = cad[0:8] + lines[47] = cad[8:16] + lines[48] = cad[16:24] + + cad = '{0:032b}'.format(my_dict['control_register']) + lines[52] = cad[0:8] + lines[53] = cad[8:16] + lines[54] = cad[16:24] + lines[55] = cad[24:32] + + cad = '{0:016b}'.format(my_dict['amplitudeI']) + lines[60] = cad[0:8] + lines[61] = cad[8:16] + + cad = '{0:016b}'.format(my_dict['amplitudeQ']) + lines[66] = cad[0:8] + lines[67] = cad[8:16] + + cad = '{0:08b}'.format(my_dict['amplitude_ramp_rate']) + lines[72] = cad[0:8] + + cad = '{0:016b}'.format(my_dict['qdac']) + lines[76] = cad[0:8] + lines[77] = cad[8:16] + + lines[81] = '%10.8f' %my_dict['clock'] + + text = '\n'.join(lines) + + return text \ No newline at end of file diff --git a/devices/rc/api.py b/devices/rc/api.py index b7380b2..2670b36 100644 --- a/devices/rc/api.py +++ b/devices/rc/api.py @@ -22,7 +22,7 @@ class RCApi(object): self.params = json.load(open(filename)) self.pk = self.params['configurations']['allIds'][0] - print 'RC Configuration: {}'.format(self.params['configurations']['byId'][self.pk]['name']) + print ('RC Configuration: {}').format(self.params['configurations']['byId'][self.pk]['name']) def status(self): @@ -71,7 +71,7 @@ class RCApi(object): data={'divider':int(self.params['configurations']['byId'][self.pk]['clock_divider'])-1}) if 'ok' not in req.text: - print 'Error sending divider' + print ('Error sending divider') return False req = requests.post(url_write, @@ -93,7 +93,7 @@ if __name__ == '__main__': # time.sleep(1) # print rc.stop() # time.sleep(1) - print rc.write() + print (rc.write()) # time.sleep(1) # print rc.start() diff --git a/radarsys/settings - mod.py b/radarsys/settings - mod.py new file mode 100644 index 0000000..19b1bf3 --- /dev/null +++ b/radarsys/settings - mod.py @@ -0,0 +1,143 @@ +""" +Django settings for radarsys project. + +Generated by 'django-admin startproject' using Django 1.8.6. + +For more information on this file, see +https://docs.djangoproject.com/en/1.8/topics/settings/ + +For the full list of settings and their values, see +https://docs.djangoproject.com/en/1.8/ref/settings/ +""" + +# Build paths inside the project like this: os.path.join(BASE_DIR, ...) +import os + +BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + +# Quick-start development settings - unsuitable for production +# See https://docs.djangoproject.com/en/1.8/howto/deployment/checklist/ + +# SECURITY WARNING: keep the secret key used in production secret! +SECRET_KEY = 'xshb$k5fc-+j16)cvyffj&9u__0q3$l!hieh#+tbzqg)*f^km0' + +# SECURITY WARNING: don't run with debug turned on in production! +DEBUG = True + +ALLOWED_HOSTS = ['*'] + +# Application definition + +INSTALLED_APPS = [ + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', + 'django.forms', + 'bootstrap4', + 'polymorphic', + 'apps.accounts', + 'apps.main', + 'apps.misc', + 'apps.rc', + 'apps.dds', + 'apps.jars', + 'apps.usrp', + 'apps.abs', + 'apps.cgs', +] + +MIDDLEWARE = [ + 'django.middleware.security.SecurityMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', + +] + +ROOT_URLCONF = 'radarsys.urls' + +TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': [os.path.join(BASE_DIR, "templates")], + 'APP_DIRS': True, + 'OPTIONS': { + 'context_processors': [ + 'django.template.context_processors.debug', + 'django.template.context_processors.request', + 'django.contrib.auth.context_processors.auth', + 'django.contrib.messages.context_processors.messages', + 'apps.main.processors.radarsys_globals', + ], + }, + }, +] + +WSGI_APPLICATION = 'radarsys.wsgi.application' + + +# Database +# https://docs.djangoproject.com/en/1.8/ref/settings/#databases + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': 'radarsys.sqlite', + } + # 'default': { + # 'ENGINE': 'django.db.backends.postgresql_psycopg2', + # 'NAME': os.environ.get('DB_NAME', 'radarsys'), + # 'USER': os.environ.get('DB_USER', 'docker'), + # 'PASSWORD': os.environ.get('DB_PASSWORD', 'docker'), + # 'HOST': os.environ.get('POSTGRES_PORT_5432_TCP_ADDR', 'localhost'), + # 'PORT': os.environ.get('POSTGRES_PORT_5432_TCP_PORT', '5400'), + #} +} + +# Internationalization +# https://docs.djangoproject.com/en/1.8/topics/i18n/ + +LANGUAGE_CODE = 'en-us' + +TIME_ZONE = os.environ.get('TZ', 'America/Lima') + +USE_I18N = True + +USE_L10N = True + +USE_TZ = False + +# Static files (CSS, JavaScript, Images) +# https://docs.djangoproject.com/en/1.8/howto/static-files/ + +MEDIA_URL = '/media/' +MEDIA_ROOT = os.path.join(BASE_DIR, 'media') + +STATIC_URL = '/static/' +STATIC_ROOT = os.path.join(BASE_DIR, 'static') + +STATICFILES_FINDERS = ( + 'django.contrib.staticfiles.finders.FileSystemFinder', + 'django.contrib.staticfiles.finders.AppDirectoriesFinder', +) + +# Celery stuff +REDIS_HOST = os.environ.get('REDIS_HOST', '127.0.0.1') +REDIS_PORT = os.environ.get('REDIS_PORT', 6300) + +BROKER_TRANSPORT = 'redis' +BROKER_URL = 'redis://{}:{}/0'.format(REDIS_HOST, REDIS_PORT) + +CELERY_RESULT_BACKEND = 'redis://{}:{}/0'.format(REDIS_HOST, REDIS_PORT) +CELERY_BROKER_TRANSPORT = BROKER_URL +CELERY_ACCEPT_CONTENT = ['application/json'] +CELERY_TASK_SERIALIZER = 'json' +CELERY_RESULT_SERIALIZER = 'json' +CELERY_ENABLE_UTC = False +FORM_RENDERER = 'django.forms.renderers.DjangoTemplates' diff --git a/radarsys/settings.py b/radarsys/settings.py index dc301f3..780b086 100644 --- a/radarsys/settings.py +++ b/radarsys/settings.py @@ -28,14 +28,14 @@ ALLOWED_HOSTS = ['*'] # Application definition -INSTALLED_APPS = ( +INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', - 'bootstrap3', + 'bootstrap4', 'polymorphic', 'apps.accounts', 'apps.main', @@ -46,25 +46,26 @@ INSTALLED_APPS = ( 'apps.usrp', 'apps.abs', 'apps.cgs', -) + 'apps.dds_rest', +] -MIDDLEWARE_CLASSES = ( +MIDDLEWARE = [ + 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', - 'django.middleware.security.SecurityMiddleware', -) + +] ROOT_URLCONF = 'radarsys.urls' TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [os.path.join(BASE_DIR, "templates").replace('\\', '/'),], + 'DIRS': [os.path.join(BASE_DIR, "templates")], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ @@ -85,18 +86,18 @@ WSGI_APPLICATION = 'radarsys.wsgi.application' # https://docs.djangoproject.com/en/1.8/ref/settings/#databases DATABASES = { - # 'default': { - # 'ENGINE': 'django.db.backends.sqlite3', - # 'NAME': 'radarsys.sqlite', - # } 'default': { - 'ENGINE': 'django.db.backends.postgresql_psycopg2', - 'NAME': os.environ.get('DB_NAME', 'radarsys'), - 'USER': os.environ.get('DB_USER', 'docker'), - 'PASSWORD': os.environ.get('DB_PASSWORD', 'docker'), - 'HOST': os.environ.get('POSTGRES_PORT_5432_TCP_ADDR', 'localhost'), - 'PORT': os.environ.get('POSTGRES_PORT_5432_TCP_PORT', '5400'), + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': 'radarsys.sqlite', } + # 'default': { + # 'ENGINE': 'django.db.backends.postgresql_psycopg2', + # 'NAME': os.environ.get('DB_NAME', 'radarsys'), + # 'USER': os.environ.get('DB_USER', 'docker'), + # 'PASSWORD': os.environ.get('DB_PASSWORD', 'docker'), + # 'HOST': os.environ.get('POSTGRES_PORT_5432_TCP_ADDR', 'localhost'), + # 'PORT': os.environ.get('POSTGRES_PORT_5432_TCP_PORT', '5400'), + #} } # Internationalization @@ -138,4 +139,4 @@ CELERY_BROKER_TRANSPORT = BROKER_URL CELERY_ACCEPT_CONTENT = ['application/json'] CELERY_TASK_SERIALIZER = 'json' CELERY_RESULT_SERIALIZER = 'json' -CELERY_ENABLE_UTC = False \ No newline at end of file +CELERY_ENABLE_UTC = False diff --git a/radarsys/urls.py b/radarsys/urls.py index 51e2131..c200933 100644 --- a/radarsys/urls.py +++ b/radarsys/urls.py @@ -1,33 +1,20 @@ -"""radarsys URL Configuration - -The `urlpatterns` list routes URLs to views. For more information please see: - https://docs.djangoproject.com/en/1.8/topics/http/urls/ -Examples: -Function views - 1. Add an import: from my_app import views - 2. Add a URL to urlpatterns: url(r'^$', views.home, name='home') -Class-based views - 1. Add an import: from other_app.views import Home - 2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home') -Including another URLconf - 1. Add an import: from blog import urls as blog_urls - 2. Add a URL to urlpatterns: url(r'^blog/', include(blog_urls)) -""" -from django.conf.urls import include, url +from django.urls import include, path from django.contrib import admin #from django.contrib.staticfiles.urls import staticfiles_urlpatterns urlpatterns = [ - url(r'^admin/', include(admin.site.urls)), - url(r'^accounts/', include('apps.accounts.urls')), - url(r'^', include('apps.main.urls')), - url(r'^rc/', include('apps.rc.urls')), - url(r'^dds/', include('apps.dds.urls')), - url(r'^cgs/', include('apps.cgs.urls')), - url(r'^jars/', include('apps.jars.urls')), - url(r'^usrp/', include('apps.usrp.urls')), - url(r'^abs/', include('apps.abs.urls')), - url(r'^misc/', include('apps.misc.urls')), + path('admin/',admin.site.urls), + path('accounts/', include('apps.accounts.urls')), + path('', include('apps.main.urls')), + path('rc/', include('apps.rc.urls')), + path('dds/', include('apps.dds.urls')), + path('cgs/', include('apps.cgs.urls')), + path('jars/',include('apps.jars.urls')), + path('usrp/', include('apps.usrp.urls')), + path('abs/', include('apps.abs.urls')), + path('misc/',include('apps.misc.urls')), + path('dds_rest/', include('apps.dds_rest.urls')), + ] #urlpatterns += staticfiles_urlpatterns() diff --git a/requirements.txt b/requirements.txt index 04a46f8..0b73137 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,12 +1,12 @@ -Django==1.10.1 -django-bootstrap3 +Django==2.2.1 +django-bootstrap4 psycopg2-binary -django-polymorphic==1.3 +django-polymorphic==2.1.2 bokeh==0.12.1 -numpy==1.13.3 -matplotlib -scipy -celery -gunicorn +numpy==1.19.1 +matplotlib==2.2.4 +scipy==1.5.2 +celery==4.4.6 +gunicorn==20.0.4 requests -redis \ No newline at end of file +redis==3.5.3 \ No newline at end of file diff --git a/static/admin/css/autocomplete.css b/static/admin/css/autocomplete.css new file mode 100644 index 0000000..3ef95d1 --- /dev/null +++ b/static/admin/css/autocomplete.css @@ -0,0 +1,260 @@ +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: #999; + 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: #fff; + border: 1px solid #ccc; + border-radius: 4px; +} + +.select2-container--admin-autocomplete .select2-selection--single .select2-selection__rendered { + color: #444; + 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: #999; +} + +.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: #eee; + 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: white; + border: 1px solid #ccc; + 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 5px; + width: 100%; +} + +.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: #999; + margin-top: 5px; + float: left; +} + +.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__clear { + cursor: pointer; + float: right; + font-weight: bold; + margin: 5px; +} + +.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__choice { + background-color: #e4e4e4; + border: 1px solid #ccc; + 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: #999; + cursor: pointer; + display: inline-block; + font-weight: bold; + margin-right: 2px; +} + +.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__choice__remove:hover { + color: #333; +} + +.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 #999 1px; + outline: 0; +} + +.select2-container--admin-autocomplete.select2-container--disabled .select2-selection--multiple { + background-color: #eee; + 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 .select2-search__field { + border: 1px solid #ccc; +} + +.select2-container--admin-autocomplete .select2-search--inline .select2-search__field { + background: transparent; + 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; +} + +.select2-container--admin-autocomplete .select2-results__option[role=group] { + padding: 0; +} + +.select2-container--admin-autocomplete .select2-results__option[aria-disabled=true] { + color: #999; +} + +.select2-container--admin-autocomplete .select2-results__option[aria-selected=true] { + background-color: #ddd; +} + +.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: #79aec8; + color: white; +} + +.select2-container--admin-autocomplete .select2-results__group { + cursor: default; + display: block; + padding: 6px; +} diff --git a/static/admin/css/base.css b/static/admin/css/base.css new file mode 100644 index 0000000..fd011a3 --- /dev/null +++ b/static/admin/css/base.css @@ -0,0 +1,987 @@ +/* + DJANGO Admin styles +*/ + +@import url(fonts.css); + +body { + margin: 0; + padding: 0; + font-size: 14px; + font-family: "Roboto","Lucida Grande","DejaVu Sans","Bitstream Vera Sans",Verdana,Arial,sans-serif; + color: #333; + background: #fff; +} + +/* LINKS */ + +a:link, a:visited { + color: #447e9b; + text-decoration: none; +} + +a:focus, a:hover { + color: #036; +} + +a:focus { + text-decoration: underline; +} + +a img { + border: none; +} + +a.section:link, a.section:visited { + color: #fff; + text-decoration: none; +} + +a.section:focus, a.section:hover { + text-decoration: underline; +} + +/* GLOBAL DEFAULTS */ + +p, ol, ul, dl { + margin: .2em 0 .8em 0; +} + +p { + padding: 0; + line-height: 140%; +} + +h1,h2,h3,h4,h5 { + font-weight: bold; +} + +h1 { + margin: 0 0 20px; + font-weight: 300; + font-size: 20px; + color: #666; +} + +h2 { + font-size: 16px; + margin: 1em 0 .5em 0; +} + +h2.subhead { + font-weight: normal; + margin-top: 0; +} + +h3 { + font-size: 14px; + margin: .8em 0 .3em 0; + color: #666; + font-weight: bold; +} + +h4 { + font-size: 12px; + margin: 1em 0 .8em 0; + padding-bottom: 3px; +} + +h5 { + font-size: 10px; + margin: 1.5em 0 .5em 0; + color: #666; + text-transform: uppercase; + letter-spacing: 1px; +} + +ul li { + list-style-type: square; + padding: 1px 0; +} + +li ul { + margin-bottom: 0; +} + +li, dt, dd { + font-size: 13px; + line-height: 20px; +} + +dt { + font-weight: bold; + margin-top: 4px; +} + +dd { + margin-left: 0; +} + +form { + margin: 0; + padding: 0; +} + +fieldset { + margin: 0; + padding: 0; + border: none; + border-top: 1px solid #eee; +} + +blockquote { + font-size: 11px; + color: #777; + margin-left: 2px; + padding-left: 10px; + border-left: 5px solid #ddd; +} + +code, pre { + font-family: "Bitstream Vera Sans Mono", Monaco, "Courier New", Courier, monospace; + color: #666; + font-size: 12px; +} + +pre.literal-block { + margin: 10px; + background: #eee; + padding: 6px 8px; +} + +code strong { + color: #930; +} + +hr { + clear: both; + color: #eee; + background-color: #eee; + height: 1px; + border: none; + margin: 0; + padding: 0; + font-size: 1px; + line-height: 1px; +} + +/* TEXT STYLES & MODIFIERS */ + +.small { + font-size: 11px; +} + +.tiny { + font-size: 10px; +} + +p.tiny { + margin-top: -2px; +} + +.mini { + font-size: 10px; +} + +p.mini { + margin-top: -3px; +} + +.help, p.help, form p.help, div.help, form div.help, div.help li { + font-size: 11px; + color: #999; +} + +div.help ul { + margin-bottom: 0; +} + +.help-tooltip { + cursor: help; +} + +p img, h1 img, h2 img, h3 img, h4 img, td img { + vertical-align: middle; +} + +.quiet, a.quiet:link, a.quiet:visited { + color: #999; + font-weight: normal; +} + +.float-right { + float: right; +} + +.float-left { + float: left; +} + +.clear { + clear: both; +} + +.align-left { + text-align: left; +} + +.align-right { + text-align: right; +} + +.example { + margin: 10px 0; + padding: 5px 10px; + background: #efefef; +} + +.nowrap { + white-space: nowrap; +} + +/* TABLES */ + +table { + border-collapse: collapse; + border-color: #ccc; +} + +td, th { + font-size: 13px; + line-height: 16px; + border-bottom: 1px solid #eee; + vertical-align: top; + padding: 8px; + font-family: "Roboto", "Lucida Grande", Verdana, Arial, sans-serif; +} + +th { + font-weight: 600; + text-align: left; +} + +thead th, +tfoot td { + color: #666; + padding: 5px 10px; + font-size: 11px; + background: #fff; + border: none; + border-top: 1px solid #eee; + border-bottom: 1px solid #eee; +} + +tfoot td { + border-bottom: none; + border-top: 1px solid #eee; +} + +thead th.required { + color: #000; +} + +tr.alt { + background: #f6f6f6; +} + +.row1 { + background: #fff; +} + +.row2 { + background: #f9f9f9; +} + +/* SORTABLE TABLES */ + +thead th { + padding: 5px 10px; + line-height: normal; + text-transform: uppercase; + background: #f6f6f6; +} + +thead th a:link, thead th a:visited { + color: #666; +} + +thead th.sorted { + background: #eee; +} + +thead th.sorted .text { + padding-right: 42px; +} + +table thead th .text span { + padding: 8px 10px; + display: block; +} + +table thead th .text a { + display: block; + cursor: pointer; + padding: 8px 10px; +} + +table thead th .text a:focus, table thead th .text a:hover { + background: #eee; +} + +thead th.sorted a.sortremove { + visibility: hidden; +} + +table thead th.sorted:hover a.sortremove { + visibility: visible; +} + +table thead th.sorted .sortoptions { + display: block; + padding: 9px 5px 0 5px; + float: right; + text-align: right; +} + +table thead th.sorted .sortpriority { + font-size: .8em; + min-width: 12px; + text-align: center; + vertical-align: 3px; + margin-left: 2px; + margin-right: 2px; +} + +table thead th.sorted .sortoptions a { + position: relative; + width: 14px; + height: 14px; + display: inline-block; + background: url(../img/sorting-icons.svg) 0 0 no-repeat; + background-size: 14px auto; +} + +table thead th.sorted .sortoptions a.sortremove { + background-position: 0 0; +} + +table thead th.sorted .sortoptions a.sortremove:after { + content: '\\'; + position: absolute; + top: -6px; + left: 3px; + font-weight: 200; + font-size: 18px; + color: #999; +} + +table thead th.sorted .sortoptions a.sortremove:focus:after, +table thead th.sorted .sortoptions a.sortremove:hover:after { + color: #447e9b; +} + +table thead th.sorted .sortoptions a.sortremove:focus, +table thead th.sorted .sortoptions a.sortremove:hover { + background-position: 0 -14px; +} + +table thead th.sorted .sortoptions a.ascending { + background-position: 0 -28px; +} + +table thead th.sorted .sortoptions a.ascending:focus, +table thead th.sorted .sortoptions a.ascending:hover { + background-position: 0 -42px; +} + +table thead th.sorted .sortoptions a.descending { + top: 1px; + background-position: 0 -56px; +} + +table thead th.sorted .sortoptions a.descending:focus, +table thead th.sorted .sortoptions a.descending:hover { + background-position: 0 -70px; +} + +/* FORM DEFAULTS */ + +input, textarea, select, .form-row p, form .button { + margin: 2px 0; + padding: 2px 3px; + vertical-align: middle; + font-family: "Roboto", "Lucida Grande", Verdana, Arial, sans-serif; + font-weight: normal; + font-size: 13px; +} +.form-row div.help { + padding: 2px 3px; +} + +textarea { + vertical-align: top; +} + +input[type=text], input[type=password], input[type=email], input[type=url], +input[type=number], input[type=tel], textarea, select, .vTextField { + border: 1px solid #ccc; + border-radius: 4px; + padding: 5px 6px; + margin-top: 0; +} + +input[type=text]:focus, input[type=password]:focus, input[type=email]:focus, +input[type=url]:focus, input[type=number]:focus, input[type=tel]:focus, +textarea:focus, select:focus, .vTextField:focus { + border-color: #999; +} + +select { + height: 30px; +} + +select[multiple] { + /* Allow HTML size attribute to override the height in the rule above. */ + height: auto; + min-height: 150px; +} + +/* FORM BUTTONS */ + +.button, input[type=submit], input[type=button], .submit-row input, a.button { + background: #79aec8; + padding: 10px 15px; + border: none; + border-radius: 4px; + color: #fff; + cursor: pointer; +} + +a.button { + padding: 4px 5px; +} + +.button:active, input[type=submit]:active, input[type=button]:active, +.button:focus, input[type=submit]:focus, input[type=button]:focus, +.button:hover, input[type=submit]:hover, input[type=button]:hover { + background: #609ab6; +} + +.button[disabled], input[type=submit][disabled], input[type=button][disabled] { + opacity: 0.4; +} + +.button.default, input[type=submit].default, .submit-row input.default { + float: right; + border: none; + font-weight: 400; + background: #417690; +} + +.button.default:active, input[type=submit].default:active, +.button.default:focus, input[type=submit].default:focus, +.button.default:hover, input[type=submit].default:hover { + background: #205067; +} + +.button[disabled].default, +input[type=submit][disabled].default, +input[type=button][disabled].default { + opacity: 0.4; +} + + +/* MODULES */ + +.module { + border: none; + margin-bottom: 30px; + background: #fff; +} + +.module p, .module ul, .module h3, .module h4, .module dl, .module pre { + padding-left: 10px; + padding-right: 10px; +} + +.module blockquote { + margin-left: 12px; +} + +.module ul, .module ol { + margin-left: 1.5em; +} + +.module h3 { + margin-top: .6em; +} + +.module h2, .module caption, .inline-group h2 { + margin: 0; + padding: 8px; + font-weight: 400; + font-size: 13px; + text-align: left; + background: #79aec8; + color: #fff; +} + +.module caption, +.inline-group h2 { + font-size: 12px; + letter-spacing: 0.5px; + text-transform: uppercase; +} + +.module table { + border-collapse: collapse; +} + +/* MESSAGES & ERRORS */ + +ul.messagelist { + padding: 0; + margin: 0; +} + +ul.messagelist li { + display: block; + font-weight: 400; + font-size: 13px; + padding: 10px 10px 10px 65px; + margin: 0 0 10px 0; + background: #dfd url(../img/icon-yes.svg) 40px 12px no-repeat; + background-size: 16px auto; + color: #333; +} + +ul.messagelist li.warning { + background: #ffc url(../img/icon-alert.svg) 40px 14px no-repeat; + background-size: 14px auto; +} + +ul.messagelist li.error { + background: #ffefef url(../img/icon-no.svg) 40px 12px no-repeat; + background-size: 16px auto; +} + +.errornote { + font-size: 14px; + font-weight: 700; + display: block; + padding: 10px 12px; + margin: 0 0 10px 0; + color: #ba2121; + border: 1px solid #ba2121; + border-radius: 4px; + background-color: #fff; + background-position: 5px 12px; +} + +ul.errorlist { + margin: 0 0 4px; + padding: 0; + color: #ba2121; + background: #fff; +} + +ul.errorlist li { + font-size: 13px; + display: block; + margin-bottom: 4px; +} + +ul.errorlist li:first-child { + margin-top: 0; +} + +ul.errorlist li a { + color: inherit; + text-decoration: underline; +} + +td ul.errorlist { + margin: 0; + padding: 0; +} + +td ul.errorlist li { + margin: 0; +} + +.form-row.errors { + margin: 0; + border: none; + border-bottom: 1px solid #eee; + background: none; +} + +.form-row.errors ul.errorlist li { + padding-left: 0; +} + +.errors input, .errors select, .errors textarea { + border: 1px solid #ba2121; +} + +div.system-message { + background: #ffc; + margin: 10px; + padding: 6px 8px; + font-size: .8em; +} + +div.system-message p.system-message-title { + padding: 4px 5px 4px 25px; + margin: 0; + color: #c11; + background: #ffefef url(../img/icon-no.svg) 5px 5px no-repeat; +} + +.description { + font-size: 12px; + padding: 5px 0 0 12px; +} + +/* BREADCRUMBS */ + +div.breadcrumbs { + background: #79aec8; + padding: 10px 40px; + border: none; + font-size: 14px; + color: #c4dce8; + text-align: left; +} + +div.breadcrumbs a { + color: #fff; +} + +div.breadcrumbs a:focus, div.breadcrumbs a:hover { + color: #c4dce8; +} + +/* ACTION ICONS */ + +.viewlink, .inlineviewlink { + padding-left: 16px; + background: url(../img/icon-viewlink.svg) 0 1px no-repeat; +} + +.addlink { + padding-left: 16px; + background: url(../img/icon-addlink.svg) 0 1px no-repeat; +} + +.changelink, .inlinechangelink { + padding-left: 16px; + background: url(../img/icon-changelink.svg) 0 1px no-repeat; +} + +.deletelink { + padding-left: 16px; + background: url(../img/icon-deletelink.svg) 0 1px no-repeat; +} + +a.deletelink:link, a.deletelink:visited { + color: #CC3434; +} + +a.deletelink:focus, a.deletelink:hover { + color: #993333; + text-decoration: none; +} + +/* OBJECT TOOLS */ + +.object-tools { + font-size: 10px; + font-weight: bold; + padding-left: 0; + float: right; + position: relative; + margin-top: -48px; +} + +.form-row .object-tools { + margin-top: 5px; + margin-bottom: 5px; + float: none; + height: 2em; + padding-left: 3.5em; +} + +.object-tools li { + display: block; + float: left; + margin-left: 5px; + height: 16px; +} + +.object-tools a { + border-radius: 15px; +} + +.object-tools a:link, .object-tools a:visited { + display: block; + float: left; + padding: 3px 12px; + background: #999; + font-weight: 400; + font-size: 11px; + text-transform: uppercase; + letter-spacing: 0.5px; + color: #fff; +} + +.object-tools a:focus, .object-tools a:hover { + background-color: #417690; +} + +.object-tools a:focus{ + text-decoration: none; +} + +.object-tools a.viewsitelink, .object-tools a.golink,.object-tools a.addlink { + background-repeat: no-repeat; + background-position: right 7px center; + padding-right: 26px; +} + +.object-tools a.viewsitelink, .object-tools a.golink { + background-image: url(../img/tooltag-arrowright.svg); +} + +.object-tools a.addlink { + background-image: url(../img/tooltag-add.svg); +} + +/* OBJECT HISTORY */ + +table#change-history { + width: 100%; +} + +table#change-history tbody th { + width: 16em; +} + +/* PAGE STRUCTURE */ + +#container { + position: relative; + width: 100%; + min-width: 980px; + padding: 0; +} + +#content { + padding: 20px 40px; +} + +.dashboard #content { + width: 600px; +} + +#content-main { + float: left; + width: 100%; +} + +#content-related { + float: right; + width: 260px; + position: relative; + margin-right: -300px; +} + +#footer { + clear: both; + padding: 10px; +} + +/* COLUMN TYPES */ + +.colMS { + margin-right: 300px; +} + +.colSM { + margin-left: 300px; +} + +.colSM #content-related { + float: left; + margin-right: 0; + margin-left: -300px; +} + +.colSM #content-main { + float: right; +} + +.popup .colM { + width: auto; +} + +/* HEADER */ + +#header { + width: auto; + height: auto; + display: flex; + justify-content: space-between; + align-items: center; + padding: 10px 40px; + background: #417690; + color: #ffc; + overflow: hidden; +} + +#header a:link, #header a:visited { + color: #fff; +} + +#header a:focus , #header a:hover { + text-decoration: underline; +} + +#branding { + float: left; +} + +#branding h1 { + padding: 0; + margin: 0 20px 0 0; + font-weight: 300; + font-size: 24px; + color: #f5dd5d; +} + +#branding h1, #branding h1 a:link, #branding h1 a:visited { + color: #f5dd5d; +} + +#branding h2 { + padding: 0 10px; + font-size: 14px; + margin: -8px 0 8px 0; + font-weight: normal; + color: #ffc; +} + +#branding a:hover { + text-decoration: none; +} + +#user-tools { + float: right; + padding: 0; + margin: 0 0 0 20px; + font-weight: 300; + font-size: 11px; + letter-spacing: 0.5px; + text-transform: uppercase; + text-align: right; +} + +#user-tools a { + border-bottom: 1px solid rgba(255, 255, 255, 0.25); +} + +#user-tools a:focus, #user-tools a:hover { + text-decoration: none; + border-bottom-color: #79aec8; + color: #79aec8; +} + +/* SIDEBAR */ + +#content-related { + background: #f8f8f8; +} + +#content-related .module { + background: none; +} + +#content-related h3 { + font-size: 14px; + color: #666; + padding: 0 16px; + margin: 0 0 16px; +} + +#content-related h4 { + font-size: 13px; +} + +#content-related p { + padding-left: 16px; + padding-right: 16px; +} + +#content-related .actionlist { + padding: 0; + margin: 16px; +} + +#content-related .actionlist li { + line-height: 1.2; + margin-bottom: 10px; + padding-left: 18px; +} + +#content-related .module h2 { + background: none; + padding: 16px; + margin-bottom: 16px; + border-bottom: 1px solid #eaeaea; + font-size: 18px; + color: #333; +} + +.delete-confirmation form input[type="submit"] { + background: #ba2121; + border-radius: 4px; + padding: 10px 15px; + color: #fff; +} + +.delete-confirmation form input[type="submit"]:active, +.delete-confirmation form input[type="submit"]:focus, +.delete-confirmation form input[type="submit"]:hover { + background: #a41515; +} + +.delete-confirmation form .cancel-link { + display: inline-block; + vertical-align: middle; + height: 15px; + line-height: 15px; + background: #ddd; + border-radius: 4px; + padding: 10px 15px; + color: #333; + margin: 0 0 0 10px; +} + +.delete-confirmation form .cancel-link:active, +.delete-confirmation form .cancel-link:focus, +.delete-confirmation form .cancel-link:hover { + background: #ccc; +} + +/* POPUP */ +.popup #content { + padding: 20px; +} + +.popup #container { + min-width: 0; +} + +.popup #header { + padding: 10px 20px; +} diff --git a/static/admin/css/changelists.css b/static/admin/css/changelists.css new file mode 100644 index 0000000..17690a3 --- /dev/null +++ b/static/admin/css/changelists.css @@ -0,0 +1,344 @@ +/* CHANGELISTS */ + +#changelist { + position: relative; + width: 100%; +} + +#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 { + margin-right: 280px; + width: auto; +} + +.change-list .filtered table tbody th { + padding-right: 1em; +} + +#changelist-form .results { + overflow-x: auto; +} + +#changelist .toplinks { + border-bottom: 1px solid #ddd; +} + +#changelist .paginator { + color: #666; + border-bottom: 1px solid #eee; + background: #fff; + 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: #666; +} + +/* TOOLBAR */ + +#changelist #toolbar { + padding: 8px 10px; + margin-bottom: 15px; + border-top: 1px solid #eee; + border-bottom: 1px solid #eee; + background: #f8f8f8; + color: #666; +} + +#changelist #toolbar form input { + border-radius: 4px; + font-size: 14px; + padding: 5px; + color: #333; +} + +#changelist #toolbar form #searchbar { + height: 19px; + border: 1px solid #ccc; + padding: 2px 5px; + margin: 0; + vertical-align: top; + font-size: 13px; +} + +#changelist #toolbar form #searchbar:focus { + border-color: #999; +} + +#changelist #toolbar form input[type="submit"] { + border: 1px solid #ccc; + padding: 2px 10px; + margin: 0; + vertical-align: middle; + background: #fff; + box-shadow: 0 -15px 20px -10px rgba(0, 0, 0, 0.15) inset; + cursor: pointer; + color: #333; +} + +#changelist #toolbar form input[type="submit"]:focus, +#changelist #toolbar form input[type="submit"]:hover { + border-color: #999; +} + +#changelist #changelist-search img { + vertical-align: middle; + margin-right: 4px; +} + +/* FILTER COLUMN */ + +#changelist-filter { + position: absolute; + top: 0; + right: 0; + z-index: 1000; + width: 240px; + background: #f8f8f8; + border-left: none; + margin: 0; +} + +#changelist-filter h2 { + font-size: 14px; + text-transform: uppercase; + letter-spacing: 0.5px; + padding: 5px 15px; + margin-bottom: 12px; + border-bottom: none; +} + +#changelist-filter h3 { + font-weight: 400; + font-size: 14px; + padding: 0 15px; + margin-bottom: 10px; +} + +#changelist-filter ul { + margin: 5px 0; + padding: 0 15px 15px; + border-bottom: 1px solid #eaeaea; +} + +#changelist-filter ul:last-child { + border-bottom: none; + padding-bottom: none; +} + +#changelist-filter li { + list-style-type: none; + margin-left: 0; + padding-left: 0; +} + +#changelist-filter a { + display: block; + color: #999; + text-overflow: ellipsis; + overflow-x: hidden; +} + +#changelist-filter li.selected { + border-left: 5px solid #eaeaea; + padding-left: 10px; + margin-left: -15px; +} + +#changelist-filter li.selected a { + color: #5b80b2; +} + +#changelist-filter a:focus, #changelist-filter a:hover, +#changelist-filter li.selected a:focus, +#changelist-filter li.selected a:hover { + color: #036; +} + +/* DATE DRILLDOWN */ + +.change-list ul.toplinks { + display: block; + float: left; + padding: 0; + margin: 0; + width: 100%; +} + +.change-list ul.toplinks li { + padding: 3px 6px; + font-weight: bold; + list-style-type: none; + display: inline-block; +} + +.change-list ul.toplinks .date-back a { + color: #999; +} + +.change-list ul.toplinks .date-back a:focus, +.change-list ul.toplinks .date-back a:hover { + color: #036; +} + +/* PAGINATOR */ + +.paginator { + font-size: 13px; + padding-top: 10px; + padding-bottom: 10px; + line-height: 22px; + margin: 0; + border-top: 1px solid #ddd; +} + +.paginator a:link, .paginator a:visited { + padding: 2px 6px; + background: #79aec8; + text-decoration: none; + color: #fff; +} + +.paginator a.showall { + padding: 0; + border: none; + background: none; + color: #5b80b2; +} + +.paginator a.showall:focus, .paginator a.showall:hover { + background: none; + color: #036; +} + +.paginator .end { + margin-right: 6px; +} + +.paginator .this-page { + padding: 2px 6px; + font-weight: bold; + font-size: 13px; + vertical-align: top; +} + +.paginator a:focus, .paginator a:hover { + color: white; + background: #036; +} + +/* ACTIONS */ + +.filtered .actions { + margin-right: 280px; + border-right: none; +} + +#changelist table input { + margin: 0; + vertical-align: baseline; +} + +#changelist table tbody tr.selected { + background-color: #FFFFCC; +} + +#changelist .actions { + padding: 10px; + background: #fff; + border-top: none; + border-bottom: none; + line-height: 24px; + color: #999; +} + +#changelist .actions.selected { + background: #fffccf; + border-top: 1px solid #fffee8; + border-bottom: 1px solid #edecd6; +} + +#changelist .actions span.all, +#changelist .actions span.action-counter, +#changelist .actions span.clear, +#changelist .actions span.question { + font-size: 13px; + margin: 0 0.5em; + display: none; +} + +#changelist .actions:last-child { + border-bottom: none; +} + +#changelist .actions select { + vertical-align: top; + height: 24px; + background: none; + color: #000; + border: 1px solid #ccc; + border-radius: 4px; + font-size: 14px; + padding: 0 0 0 4px; + margin: 0; + margin-left: 10px; +} + +#changelist .actions select:focus { + border-color: #999; +} + +#changelist .actions label { + display: inline-block; + vertical-align: middle; + font-size: 13px; +} + +#changelist .actions .button { + font-size: 13px; + border: 1px solid #ccc; + border-radius: 4px; + background: #fff; + box-shadow: 0 -15px 20px -10px rgba(0, 0, 0, 0.15) inset; + cursor: pointer; + height: 24px; + line-height: 1; + padding: 4px 8px; + margin: 0; + color: #333; +} + +#changelist .actions .button:focus, #changelist .actions .button:hover { + border-color: #999; +} diff --git a/static/admin/css/dashboard.css b/static/admin/css/dashboard.css new file mode 100644 index 0000000..1560c7b --- /dev/null +++ b/static/admin/css/dashboard.css @@ -0,0 +1,27 @@ +/* DASHBOARD */ + +.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; + -o-text-overflow: ellipsis; +} diff --git a/static/admin/css/fonts.css b/static/admin/css/fonts.css new file mode 100644 index 0000000..c837e01 --- /dev/null +++ b/static/admin/css/fonts.css @@ -0,0 +1,20 @@ +@font-face { + font-family: 'Roboto'; + src: url('../fonts/Roboto-Bold-webfont.woff'); + font-weight: 700; + font-style: normal; +} + +@font-face { + font-family: 'Roboto'; + src: url('../fonts/Roboto-Regular-webfont.woff'); + font-weight: 400; + font-style: normal; +} + +@font-face { + font-family: 'Roboto'; + src: url('../fonts/Roboto-Light-webfont.woff'); + font-weight: 300; + font-style: normal; +} diff --git a/static/admin/css/forms.css b/static/admin/css/forms.css new file mode 100644 index 0000000..62a093f --- /dev/null +++ b/static/admin/css/forms.css @@ -0,0 +1,532 @@ +@import url('widgets.css'); + +/* FORM ROWS */ + +.form-row { + overflow: hidden; + padding: 10px; + font-size: 13px; + border-bottom: 1px solid #eee; +} + +.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; +} + +.hidden { + display: none; +} + +/* FORM LABELS */ + +label { + font-weight: normal; + color: #666; + font-size: 13px; +} + +.required label, label.required { + font-weight: bold; + color: #333; +} + +/* RADIO BUTTONS */ + +form ul.radiolist li { + list-style-type: none; +} + +form ul.radiolist label { + float: none; + display: inline; +} + +form ul.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; +} + +/* ALIGNED FIELDSETS */ + +.aligned label { + display: block; + padding: 4px 10px 0 0; + float: left; + width: 160px; + word-wrap: break-word; + line-height: 1; +} + +.aligned label:not(.vCheckboxLabel):after { + content: ''; + display: inline-block; + vertical-align: middle; + height: 26px; +} + +.aligned label + p, .aligned label + div.help, .aligned label + div.readonly { + padding: 6px 0; + margin-top: 0; + margin-bottom: 0; + margin-left: 170px; +} + +.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 ul.radiolist { + display: inline-block; + margin: 0; + padding: 0; +} + +form .aligned p.help, +form .aligned div.help { + clear: left; + margin-top: 0; + margin-left: 160px; + padding-left: 10px; +} + +form .aligned label + p.help, +form .aligned label + div.help { + margin-left: 0; + padding-left: 0; +} + +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 ul li { + list-style: none; +} + +form .aligned table p { + margin-left: 0; + padding-left: 0; +} + +.aligned .vCheckboxLabel { + float: none; + width: auto; + display: inline-block; + vertical-align: -3px; + padding: 0 0 5px 5px; +} + +.aligned .vCheckboxLabel + p.help, +.aligned .vCheckboxLabel + div.help { + margin-top: -4px; +} + +.colM .aligned .vLargeTextField, .colM .aligned .vXMLLargeTextField { + width: 610px; +} + +.checkbox-row p.help, +.checkbox-row div.help { + margin-left: 0; + padding-left: 0; +} + +fieldset .fieldBox { + float: left; + margin-right: 20px; +} + +/* WIDE FIELDSETS */ + +.wide label { + width: 200px; +} + +form .wide p, +form .wide input + p.help, +form .wide input + div.help { + margin-left: 200px; +} + +form .wide p.help, +form .wide div.help { + padding-left: 38px; +} + +form div.help ul { + padding-left: 0; + margin-left: 0; +} + +.colM fieldset.wide .vLargeTextField, .colM fieldset.wide .vXMLLargeTextField { + width: 450px; +} + +/* COLLAPSED FIELDSETS */ + +fieldset.collapsed * { + display: none; +} + +fieldset.collapsed h2, fieldset.collapsed { + display: block; +} + +fieldset.collapsed { + border: 1px solid #eee; + border-radius: 4px; + overflow: hidden; +} + +fieldset.collapsed h2 { + background: #f8f8f8; + color: #666; +} + +fieldset .collapse-toggle { + color: #fff; +} + +fieldset.collapsed .collapse-toggle { + background: transparent; + display: inline; + color: #447e9b; +} + +/* MONOSPACE TEXTAREAS */ + +fieldset.monospace textarea { + font-family: "Bitstream Vera Sans Mono", Monaco, "Courier New", Courier, monospace; +} + +/* SUBMIT ROW */ + +.submit-row { + padding: 12px 14px; + margin: 0 0 20px; + background: #f8f8f8; + border: 1px solid #eee; + border-radius: 4px; + text-align: right; + overflow: hidden; +} + +body.popup .submit-row { + overflow: auto; +} + +.submit-row input { + height: 35px; + line-height: 15px; + margin: 0 0 0 5px; +} + +.submit-row input.default { + margin: 0 0 0 8px; + text-transform: uppercase; +} + +.submit-row p { + margin: 0.3em; +} + +.submit-row p.deletelink-box { + float: left; + margin: 0; +} + +.submit-row a.deletelink { + display: block; + background: #ba2121; + border-radius: 4px; + padding: 10px 15px; + height: 15px; + line-height: 15px; + color: #fff; +} + +.submit-row a.closelink { + display: inline-block; + background: #bbbbbb; + border-radius: 4px; + padding: 10px 15px; + height: 15px; + line-height: 15px; + margin: 0 0 0 5px; + color: #fff; +} + +.submit-row a.deletelink:focus, +.submit-row a.deletelink:hover, +.submit-row a.deletelink:active { + background: #a41515; +} + +.submit-row a.closelink:focus, +.submit-row a.closelink:hover, +.submit-row a.closelink:active { + background: #aaaaaa; +} + +/* 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; +} + +.vTextField, .vUUIDField { + width: 20em; +} + +.vIntegerField { + width: 5em; +} + +.vBigIntegerField { + width: 10em; +} + +.vForeignKeyRawIdAdminField { + width: 5em; +} + +/* 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 h3 { + margin: 0; + color: #666; + padding: 5px; + font-size: 13px; + background: #f8f8f8; + border-top: 1px solid #eee; + border-bottom: 1px solid #eee; +} + +.inline-related h3 span.delete { + float: right; +} + +.inline-related h3 span.delete label { + margin-left: 2px; + font-size: 11px; +} + +.inline-related fieldset { + margin: 0; + background: #fff; + border: none; + width: 100%; +} + +.inline-related fieldset.module h3 { + margin: 0; + padding: 2px 5px 3px 5px; + font-size: 11px; + text-align: left; + font-weight: bold; + background: #bcd; + color: #fff; +} + +.inline-group .tabular fieldset.module { + border: none; +} + +.inline-related.tabular fieldset.module table { + width: 100%; +} + +.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: 9px; + font-weight: bold; + color: #666; + _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: #666; + background: #f8f8f8; + padding: 8px 10px; + border-bottom: 1px solid #eee; +} + +.inline-group .tabular tr.add-row td { + padding: 8px 10px; + border-bottom: 1px solid #eee; +} + +.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: 12px; +} + +.empty-form { + display: none; +} + +/* RELATED FIELD ADD ONE / LOOKUP */ + +.add-another, .related-lookup { + margin-left: 5px; + display: inline-block; + vertical-align: middle; + background-repeat: no-repeat; + background-size: 14px; +} + +.add-another { + width: 16px; + height: 16px; + background-image: url(../img/icon-addlink.svg); +} + +.related-lookup { + width: 16px; + height: 16px; + 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; +} diff --git a/static/admin/css/login.css b/static/admin/css/login.css new file mode 100644 index 0000000..2ec241c --- /dev/null +++ b/static/admin/css/login.css @@ -0,0 +1,79 @@ +/* LOGIN FORM */ + +body.login { + background: #f8f8f8; +} + +.login #header { + height: auto; + padding: 15px 16px; + justify-content: center; +} + +.login #header h1 { + font-size: 18px; +} + +.login #header h1 a { + color: #fff; +} + +.login #content { + padding: 20px 20px 0; +} + +.login #container { + background: #fff; + border: 1px solid #eaeaea; + border-radius: 4px; + overflow: hidden; + width: 28em; + min-width: 300px; + margin: 100px auto; +} + +.login #content-main { + width: 100%; +} + +.login .form-row { + padding: 4px 0; + float: left; + width: 100%; + border-bottom: none; +} + +.login .form-row label { + padding-right: 0.5em; + line-height: 2em; + font-size: 1em; + clear: both; + color: #333; +} + +.login .form-row #id_username, .login .form-row #id_password { + clear: both; + padding: 8px; + width: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.login span.help { + font-size: 10px; + display: block; +} + +.login .submit-row { + clear: both; + padding: 1em 0 0 9.4em; + margin: 0; + border: none; + background: none; + text-align: left; +} + +.login .password-reset-link { + text-align: center; +} diff --git a/static/admin/css/responsive.css b/static/admin/css/responsive.css new file mode 100644 index 0000000..5b0d1ec --- /dev/null +++ b/static/admin/css/responsive.css @@ -0,0 +1,992 @@ +/* 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: 14px; + } + + .small { + font-size: 12px; + } + + /* Layout */ + + #container { + min-width: 0; + } + + #content { + padding: 20px 30px 30px; + } + + div.breadcrumbs { + padding: 10px 30px; + } + + /* Header */ + + #header { + flex-direction: column; + padding: 15px 30px; + justify-content: flex-start; + } + + #branding h1 { + margin: 0 0 8px; + font-size: 20px; + 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: 13px; + } + + /* Changelist */ + + #changelist #toolbar { + border: none; + padding: 15px; + } + + #changelist-search > div { + display: -webkit-flex; + display: flex; + -webkit-flex-wrap: wrap; + flex-wrap: wrap; + max-width: 480px; + } + + #changelist-search label { + line-height: 22px; + } + + #changelist #toolbar form #searchbar { + -webkit-flex: 1 0 auto; + flex: 1 0 auto; + width: 0; + height: 22px; + margin: 0 10px 0 6px; + } + + #changelist-search .quiet { + width: 100%; + margin: 5px 0 0 25px; + } + + #changelist .actions { + display: flex; + flex-wrap: wrap; + padding: 15px 0; + } + + #changelist .actions.selected { + border: none; + } + + #changelist .actions label { + display: flex; + } + + #changelist .actions select { + background: #fff; + } + + #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: 11px; + margin: 0 10px 0 0; + } + + #changelist-filter { + width: 200px; + } + + .change-list .filtered .results, + .change-list .filtered .paginator, + .filtered #toolbar, + .filtered .actions, + .filtered div.xfull { + margin-right: 230px; + } + + #changelist .paginator { + border-top-color: #eee; + } + + #changelist .results + .paginator { + border-top: none; + } + + /* Forms */ + + label { + font-size: 14px; + } + + .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: 36px; + font-size: 14px; + } + + .form-row select { + height: 36px; + } + + .form-row select[multiple] { + height: auto; + min-height: 0; + } + + fieldset .fieldBox { + float: none; + margin: 0 -10px; + padding: 0 10px; + } + + fieldset .fieldBox + .fieldBox { + margin-top: 10px; + padding-top: 10px; + border-top: 1px solid #eee; + } + + textarea { + max-width: 518px; + max-height: 120px; + } + + .aligned label { + padding-top: 6px; + } + + .aligned .add-another, + .aligned .related-lookup, + .aligned .datetimeshortcuts, + .aligned .related-lookup + strong { + align-self: center; + margin-left: 15px; + } + + form .aligned ul.radiolist { + margin-left: 2px; + } + + /* Related widget */ + + .related-widget-wrapper { + float: none; + } + + .related-widget-wrapper-link + .selector { + max-width: calc(100% - 30px); + margin-right: 15px; + } + + select + .related-widget-wrapper-link, + .related-widget-wrapper-link + .related-widget-wrapper-link { + margin-left: 10px; + } + + /* 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: auto; + 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; + margin: auto 15px; + 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; + margin: 15px auto; + 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 -60px; + } + + .stacked .selector-remove { + background-position: 0 0; + } + + .stacked .active.selector-remove { + background-position: 0 -20px; + } + + .help-tooltip, .selector .help-icon { + display: none; + } + + form .form-row p.datetime { + width: 100%; + } + + .datetime input { + width: 50%; + max-width: 120px; + } + + .datetime span { + font-size: 13px; + } + + .datetime .timezonewarning { + display: block; + font-size: 11px; + color: #999; + } + + .datetimeshortcuts { + color: #ccc; + } + + .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 #branding h1 { + 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, #footer { + padding: 15px; + } + + #footer:empty { + padding: 0; + } + + 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: 16px; + } + + /* Changelist */ + + #changelist { + display: flex; + flex-direction: column; + } + + #changelist #toolbar { + order: 1; + padding: 10px; + } + + #changelist .xfull { + order: 2; + } + + #changelist-form { + order: 3; + } + + #changelist-filter { + order: 4; + } + + #changelist .actions label { + flex: 1 1; + } + + #changelist .actions select { + flex: 1 0; + width: 100%; + } + + #changelist .actions span { + flex: 1 0 100%; + } + + .change-list .filtered .results, .change-list .filtered .paginator, + .filtered #toolbar, .filtered .actions, .filtered div.xfull { + margin-right: 0; + } + + #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 { + display: flex; + flex-wrap: wrap; + max-width: 100vw; + } + + .aligned .form-row > div { + width: calc(100vw - 30px); + } + + textarea { + max-width: none; + } + + .vURLField { + width: auto; + } + + fieldset .fieldBox + .fieldBox { + margin-top: 15px; + padding-top: 15px; + } + + fieldset.collapsed .form-row { + display: none; + } + + .aligned label { + width: 100%; + 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 { + align-items: center; + } + + .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 { + margin-left: 0; + font-size: 13px; + } + + span.clearable-file-input { + margin-left: 15px; + } + + span.clearable-file-input label { + font-size: 13px; + 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 { + margin-left: 0; + padding-left: 0; + } + + form .aligned ul.radiolist { + margin-right: 15px; + margin-bottom: -3px; + } + + form .aligned ul.radiolist li + li { + 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; + } + + select + .related-widget-wrapper-link, + .related-widget-wrapper-link + .related-widget-wrapper-link { + margin-left: 15px; + } + + /* Selector */ + + .selector { + flex-direction: column; + } + + .selector > * { + float: none; + } + + .selector-available, .selector-chosen { + margin-bottom: 0; + flex: 1 1 auto; + } + + .selector select { + max-height: 96px; + } + + .selector ul.selector-chooser { + display: block; + float: none; + width: 52px; + height: 26px; + padding: 0 2px; + margin: 15px auto 20px; + transform: none; + } + + .selector ul.selector-chooser li { + float: left; + } + + .selector-remove { + background-position: 0 0; + } + + .selector-add { + background-position: 0 -40px; + } + + /* Inlines */ + + .inline-group[data-inline-type="stacked"] .inline-related { + border: 2px solid #eee; + 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 + .inline-related { + margin-top: 30px; + } + + .inline-group[data-inline-type="stacked"] .inline-related .module { + padding: 0 10px; + } + + .inline-group[data-inline-type="stacked"] .inline-related .module .form-row:last-child { + border-bottom: 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 #eee; + 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 10px 0; + margin: 0 0 15px; + display: flex; + flex-direction: column; + } + + .submit-row > * { + width: 100%; + } + + .submit-row input, .submit-row input.default, .submit-row a, .submit-row a.closelink { + float: none; + margin: 0 0 10px; + text-align: center; + } + + .submit-row a.closelink { + padding: 10px 0; + } + + .submit-row p.deletelink-box { + order: 4; + } + + /* 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 { + display: block; + margin: 0 0 5px; + padding: 0; + line-height: 1.2; + } + + .login .submit-row { + padding: 15px 0 0; + } + + .login br, .login .submit-row label { + display: none; + } + + .login .submit-row input { + margin: 0; + text-transform: uppercase; + } + + .errornote { + margin: 0 0 20px; + padding: 8px 12px; + font-size: 13px; + } + + /* 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: 12px; + line-height: 12px; + } + + .calendar-shortcuts a { + margin: 0 4px; + } + + .timelist a { + background: #fff; + 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: 13px; + word-break: break-word; + } + + table#change-history tbody th { + width: auto; + } + + /* Docs */ + + table.model tbody th, table.model tbody td { + font-size: 13px; + word-break: break-word; + } +} diff --git a/static/admin/css/responsive_rtl.css b/static/admin/css/responsive_rtl.css new file mode 100644 index 0000000..f999cb1 --- /dev/null +++ b/static/admin/css/responsive_rtl.css @@ -0,0 +1,84 @@ +/* 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 { + margin-right: 0; + margin-left: 230px; + } + + [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"] .related-widget-wrapper-link + .selector { + margin-right: 0; + margin-left: 15px; + } + + [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; + } +} + +/* MOBILE */ + +@media (max-width: 767px) { + [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 { + margin-left: 0; + } + + [dir="rtl"] .aligned .add-another, + [dir="rtl"] .aligned .related-lookup, + [dir="rtl"] .aligned .datetimeshortcuts { + margin-left: 0; + margin-right: 15px; + } + + [dir="rtl"] .aligned ul { + margin-right: 0; + } +} diff --git a/static/admin/css/rtl.css b/static/admin/css/rtl.css new file mode 100644 index 0000000..b9e26bf --- /dev/null +++ b/static/admin/css/rtl.css @@ -0,0 +1,269 @@ +body { + direction: rtl; +} + +/* LOGIN */ + +.login .form-row { + float: right; +} + +.login .form-row label { + float: right; + padding-left: 0.5em; + padding-right: 0; + text-align: left; +} + +.login .submit-row { + clear: both; + padding: 1em 9.4em 0 0; +} + +/* 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 { + 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 { + right: auto; + left: 0; + border-left: none; + border-right: none; +} + +.change-list .filtered .results, .change-list .filtered .paginator, .filtered #toolbar, .filtered div.xfull { + margin-right: 0; + margin-left: 280px; +} + +#changelist-filter li.selected { + border-left: none; + padding-left: 10px; + margin-left: 0; + border-right: 5px solid #eaeaea; + padding-right: 10px; + margin-right: -15px; +} + +.filtered .actions { + margin-left: 280px; + margin-right: 0; +} + +#changelist table tbody td:first-child, #changelist table tbody th:first-child { + border-right: none; + border-left: none; +} + +/* FORMS */ + +.aligned label { + padding: 0 0 3px 1em; + float: right; +} + +.submit-row { + text-align: left +} + +.submit-row p.deletelink-box { + float: right; +} + +.submit-row input.default { + margin-left: 0; +} + +.vDateField, .vTimeField { + margin-left: 2px; +} + +.aligned .form-row input { + margin-left: 5px; +} + +form .aligned p.help, form .aligned div.help { + clear: right; +} + +form .aligned ul { + margin-right: 163px; + margin-left: 0; +} + +form ul.inline li { + float: right; + padding-right: 0; + padding-left: 7px; +} + +input[type=submit].default, .submit-row input.default { + float: left; +} + +fieldset .fieldBox { + float: right; + 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; +} + +.calendarnav-next { + top: 0; + right: auto; + left: 10px; +} + +.calendar caption, .calendarbox h2 { + text-align: center; +} + +.selector { + float: right; +} + +.selector .selector-filter { + text-align: right; +} + +.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; +} + +/* IE7 specific bug fixes */ + +div.colM { + position: relative; +} + +.submit-row input { + float: left; +} diff --git a/static/admin/css/vendor/select2/LICENSE-SELECT2.md b/static/admin/css/vendor/select2/LICENSE-SELECT2.md new file mode 100644 index 0000000..86c7c29 --- /dev/null +++ b/static/admin/css/vendor/select2/LICENSE-SELECT2.md @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2012-2015 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. diff --git a/static/admin/css/vendor/select2/select2.css b/static/admin/css/vendor/select2/select2.css new file mode 100644 index 0000000..447b2b8 --- /dev/null +++ b/static/admin/css/vendor/select2/select2.css @@ -0,0 +1,484 @@ +.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; + height: 1px !important; + margin: -1px !important; + overflow: hidden !important; + padding: 0 !important; + position: absolute !important; + width: 1px !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__placeholder { + color: #999; + margin-top: 5px; + float: left; } + .select2-container--default .select2-selection--multiple .select2-selection__clear { + cursor: pointer; + float: right; + font-weight: bold; + margin-top: 5px; + margin-right: 10px; } + .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-selection__placeholder, .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; } + +.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice { + 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; } diff --git a/static/admin/css/vendor/select2/select2.min.css b/static/admin/css/vendor/select2/select2.min.css new file mode 100644 index 0000000..76de04d --- /dev/null +++ b/static/admin/css/vendor/select2/select2.min.css @@ -0,0 +1 @@ +.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;height:1px !important;margin:-1px !important;overflow:hidden !important;padding:0 !important;position:absolute !important;width:1px !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__placeholder{color:#999;margin-top:5px;float:left}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-top:5px;margin-right:10px}.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-selection__placeholder,.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, #fff 50%, #eee 100%);background-image:-o-linear-gradient(top, #fff 50%, #eee 100%);background-image:linear-gradient(to bottom, #fff 50%, #eee 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, #eee 50%, #ccc 100%);background-image:-o-linear-gradient(top, #eee 50%, #ccc 100%);background-image:linear-gradient(to bottom, #eee 50%, #ccc 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, #fff 0%, #eee 50%);background-image:-o-linear-gradient(top, #fff 0%, #eee 50%);background-image:linear-gradient(to bottom, #fff 0%, #eee 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, #eee 50%, #fff 100%);background-image:-o-linear-gradient(top, #eee 50%, #fff 100%);background-image:linear-gradient(to bottom, #eee 50%, #fff 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}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice{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:#fff;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:#fff}.select2-container--classic .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic.select2-container--open .select2-dropdown{border-color:#5897fb} diff --git a/static/admin/css/widgets.css b/static/admin/css/widgets.css new file mode 100644 index 0000000..d3bd67a --- /dev/null +++ b/static/admin/css/widgets.css @@ -0,0 +1,565 @@ +/* SELECTOR (FILTER INTERFACE) */ + +.selector { + width: 800px; + float: left; +} + +.selector select { + width: 380px; + height: 17.2em; +} + +.selector-available, .selector-chosen { + float: left; + width: 380px; + text-align: center; + margin-bottom: 5px; +} + +.selector-chosen select { + border-top: none; +} + +.selector-available h2, .selector-chosen h2 { + border: 1px solid #ccc; + border-radius: 4px 4px 0 0; +} + +.selector-chosen h2 { + background: #79aec8; + color: #fff; +} + +.selector .selector-available h2 { + background: #f8f8f8; + color: #666; +} + +.selector .selector-filter { + background: white; + border: 1px solid #ccc; + border-width: 0 1px; + padding: 8px; + color: #999; + font-size: 10px; + margin: 0; + text-align: left; +} + +.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; +} + +.selector .selector-available input { + width: 320px; + margin-left: 8px; +} + +.selector ul.selector-chooser { + float: left; + width: 22px; + background-color: #eee; + border-radius: 10px; + margin: 10em 5px 0 5px; + padding: 0; +} + +.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-add, .selector-remove { + width: 16px; + height: 16px; + display: block; + text-indent: -3000px; + overflow: hidden; + cursor: default; + opacity: 0.3; +} + +.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: 1px auto 3px; + overflow: hidden; + font-weight: bold; + line-height: 16px; + color: #666; + text-decoration: none; + opacity: 0.3; +} + +a.active.selector-chooseall:focus, a.active.selector-clearall:focus, +a.active.selector-chooseall:hover, a.active.selector-clearall:hover { + color: #447e9b; +} + +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; +} + +.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; +} + +.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 -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 -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: 18px; + width: 18px; +} + +/* DATE AND TIME */ + +p.datetime { + line-height: 20px; + margin: 0; + padding: 0; + color: #666; + font-weight: bold; +} + +.datetime span { + white-space: nowrap; + font-weight: normal; + font-size: 11px; + color: #ccc; +} + +.datetime input, .form-row .datetime input.vDateField, .form-row .datetime input.vTimeField { + min-width: 0; + margin-left: 5px; + margin-bottom: 4px; +} + +table p.datetime { + font-size: 11px; + 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: 11px; + color: #999; +} + +/* URL */ + +p.url { + line-height: 20px; + margin: 0; + padding: 0; + color: #666; + font-size: 11px; + font-weight: bold; +} + +.url a { + font-weight: normal; +} + +/* FILE UPLOADS */ + +p.file-upload { + line-height: 20px; + margin: 0; + padding: 0; + color: #666; + font-size: 11px; + font-weight: bold; +} + +.aligned p.file-upload { + margin-left: 170px; +} + +.file-upload a { + font-weight: normal; +} + +.file-upload .deletelink { + margin-left: 5px; +} + +span.clearable-file-input label { + color: #333; + font-size: 11px; + display: inline; + float: none; +} + +/* CALENDARS & CLOCKS */ + +.calendarbox, .clockbox { + margin: 5px auto; + font-size: 12px; + width: 19em; + text-align: center; + background: white; + border: 1px solid #ddd; + 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; + background: #f5dd5d; + font-weight: 700; + font-size: 12px; + color: #333; +} + +.calendar th { + padding: 8px 5px; + background: #f8f8f8; + border-bottom: 1px solid #ddd; + font-weight: 400; + font-size: 12px; + text-align: center; + color: #666; +} + +.calendar td { + font-weight: 400; + font-size: 12px; + text-align: center; + padding: 0; + border-top: 1px solid #eee; + border-bottom: none; +} + +.calendar td.selected a { + background: #79aec8; + color: #fff; +} + +.calendar td.nonday { + background: #f8f8f8; +} + +.calendar td.today a { + font-weight: 700; +} + +.calendar td a, .timelist a { + display: block; + font-weight: 400; + padding: 6px; + text-decoration: none; + color: #444; +} + +.calendar td a:focus, .timelist a:focus, +.calendar td a:hover, .timelist a:hover { + background: #79aec8; + color: white; +} + +.calendar td a:active, .timelist a:active { + background: #417690; + color: white; +} + +.calendarnav { + font-size: 10px; + text-align: center; + color: #ccc; + margin: 0; + padding: 1px 3px; +} + +.calendarnav a:link, #calendarnav a:visited, +#calendarnav a:focus, #calendarnav a:hover { + color: #999; +} + +.calendar-shortcuts { + background: white; + font-size: 11px; + line-height: 11px; + border-top: 1px solid #eee; + padding: 8px 0; + color: #ccc; +} + +.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; +} + +.calendarbox .calendarnav-previous:focus, +.calendarbox .calendarnav-previous:hover { + background-position: 0 -15px; +} + +.calendarnav-next { + right: 10px; + background: url(../img/calendar-icons.svg) 0 -30px no-repeat; +} + +.calendarbox .calendarnav-next:focus, +.calendarbox .calendarnav-next:hover { + background-position: 0 -45px; +} + +.calendar-cancel { + margin: 0; + padding: 4px 0; + font-size: 12px; + background: #eee; + border-top: 1px solid #ddd; + color: #333; +} + +.calendar-cancel:focus, .calendar-cancel:hover { + background: #ddd; +} + +.calendar-cancel a { + color: black; + 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 { + float: left; /* display properly in form rows with multiple fields */ + overflow: hidden; /* clear floated contents */ +} + +.related-widget-wrapper-link { + opacity: 0.3; +} + +.related-widget-wrapper-link:link { + opacity: .8; +} + +.related-widget-wrapper-link:link:focus, +.related-widget-wrapper-link:link:hover { + opacity: 1; +} + +select + .related-widget-wrapper-link, +.related-widget-wrapper-link + .related-widget-wrapper-link { + margin-left: 7px; +} diff --git a/static/admin/fonts/LICENSE.txt b/static/admin/fonts/LICENSE.txt new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/static/admin/fonts/LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/static/admin/fonts/README.txt b/static/admin/fonts/README.txt new file mode 100644 index 0000000..b247bef --- /dev/null +++ b/static/admin/fonts/README.txt @@ -0,0 +1,3 @@ +Roboto webfont source: https://www.google.com/fonts/specimen/Roboto +WOFF files extracted using https://github.com/majodev/google-webfonts-helper +Weights used in this project: Light (300), Regular (400), Bold (700) diff --git a/static/admin/fonts/Roboto-Bold-webfont.woff b/static/admin/fonts/Roboto-Bold-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..6e0f56267035c2321ca6b590adcfc0fc93b7dc51 GIT binary patch literal 86184 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 A@Bjb+ literal 0 Hc$@^4uK<8(^oNe-Kg8Guoo()50sN5d zeB{gaLGAueB;^)H&L3&TaXxgA{v~(-hJ~%C`G<@Q061p_KPUd33T~L%P9!} zAbgYulS^%?L(taVzr=A+ClA95nByHppTk%t2SLMHyd(td>#fYP-y0-AluYCh~l z002N6T4)(bIM_S803hT>K6Eht(R&91OdXueKGMo;Zeqp*aIvKQ7O7uHq8`s zj{LSe;tMnMwOPw17ViC3XOaA?7~XA+ckccK2La8qI#?Z}-k3gf?xunlP(Fug4@=dT zNnL|N-8dqB#674FDi1L42>zSz-^hzlN|`MNBRqwPMzF7px)q^$gBiHUR(>x#mJt*W z{Ap&h>l<~1JB!4=kZup0-_mO*Cf-VVfHWZQ-7z&~K_4J9ar9w zFvFniL?JN6#-AH2g*2DJSaU|eHY2P#eTf*e8ICl?@tor*z?`UZw3VBkBlXYLgf%xd zxejEY<&w=4@1!BZ#d{niytJOX0p}eMxg)C?60%>l)Ub++ zh7qnD3#L&(w*|8}UlgvLa1(j1-Dqcq=AB3zyXM_kZz7MK2n&6W-57TPGTA&b@hvi; zL^6>&G6{qN$;d+GGE+Gu=vf}F5u)JoO!W#R;&LZfk5jfSJS5mPHP>y7@#^25buayg$( zHR{|G@q6E%O~(leDTQtxeg#kgejSu20he`uE!F`|f^AKLS3X|~>b<~|h((}L3MFD% zv6v1e6n{@ZH=|K4RWH}iH-Cji!eg=RD{;i2kOOg;%w>8aexcU_8_)i9#peJnf=%YL zec@0Dx!tyAK+f0BI3x@dDq?sF71ts89w|) zlKVPPppe3`-mA{84)FH5t_C`xMt=&bDG?G;r~ggSTqUx#6i`>;Xxppv_>_Vr<#0Pr z)z|6nMip~hAQx_Ni?&`cg}SS7JPzL`CaQll>fFieLY*V%uKUklcTB=HZnkdy8i`4z z`-9LNoNSxHtO216-mx83%(~LOA7vh3)+Ofz7`+6D?I@t5IiF);^=*%bSNA=+aS`^! zkZ^vDu2_xVm*v{ZGx+DS`bb&2iSb+$Lg#TpY?7wmxS$t8-E{}RJ_u%?0qLFBMQC3} z{JX-!C{8ToHgl(bg)v{4w*^cUT^FmL=8_dNF~H>2H_y6W2)A+PFh9X9CD)G_0zNvDHTMVSZwAs7H%30R|sSYwGNM4 zfV~|?$$eLi%0=coJiBNbgJp0f8L5i8;TS>-NE7)u?Po3Qi6G0waa@}WkhD4CFpb%W z(z&U&ziHX##eiTIs)k(pGxTHyXuJ{lFSh>Y6VnDhJ#EVBMkz;$g?TaS7EFbghbP#q z?2?pZc|%$9dM={C_%>uLMuy)KAu5D`7LzE%P~?OfCY(gJ*?#qSQgD7_T=2wJlg09c0G#%yCaHxtO>&Y z1CTzGeAi7>1Vb`nFIifDp;4L4`4sCYmJ1B%455u=1l}o9i$YCdFI^oY-R5n?s6J!= zOWiWPbNS*qM>8P-dyJdonCMckr-~IZwrmlUu1na8)mymeZ`syve)qqtTb+o_0MwD< zHa@l-A~e$(45AE`aSvnlj*U{!+ei!ZIn?YngEMS{_V$OP(+6|?kgYbEW7o4E0FMA~S^LmAq<>J3_|Nc)2fnlk%C9op3Mtv0GE z;+-(sY~o!Dnj!nhVIirHNF?v{1b-Kg{fLtV)-fK)Il>|MZQ0G@qm4}*I(1&Ud#Ycg zuV2T`8-5eN2qC`yF=(*dns4y zFt&AAlwMI*l}pxLYd12_$(N?1@V1pgle5cTvEF_8JTc!bKs~B@rWCBMpv93%ti3wr zCaqCxUo-mUn;72{6?jVSVnqfAp-J7%GUMiMfTt zSJI&N&6v8!-;}!-A&kTO_=2jx8U0Gr1z(gty~8U}8wHn!N|LC_Ablz$jUZ!B5-!so zBvS$I#OJ$3QYpjjCYL8s{G1U(q(3sxJj%`SyNzvfd$XJ@$aKVx{$kaQQ-4R8t(J0t z=;3chLytiUjcE$Wvw%ny$U@K;{Wb5aah!2RDAKE@UA^M2z;qNF9GWLl&9^yH%22j% zqOkCv!zPwtm49G99kiY!qq<+TbmR!Gz07I1`FL0Bb#}~SJM|ibaP|QNc{7 zTz1Xcjr{A<(J0ptSC`0|503RPr;%_ogRM{h>vf9%7$|o%tE67`%{qgqmy3caB#(+# zug798BYf;rR=%&2xFx=slTkBo>sI;paiQG4lb?BT!y4=D7 zJ(5Mi;E1#b@~%7zI)#~#-J!FWHV5}B?(BUSeN*%#5Ehu+f;FtAy(b4WP@YS{oinfb z`?$S3qy5ivdvBs*mQPw?`@pl2{}q%#!&_X%zR9D)6-JBfo=(vZ;YeyT7_;R1pX?PT z{2#UKFd$UOjxT;-nQ30DSH?AUvMZ5q%;(>qOh7z9zbmf#^jBr|u)9%LLZQlnsmU2m zrDwI&;40E}yy*n8W#TF-8Jo82TbiFMpIMi3h(JA;txSsLdvr=Ns7Y6Skj4#U-{ffw zWIt-G%NF0=F3Ms$E#M;;DUqU-oJyQCjmNqxUQU#gxRu{LyMZy%X{~?h97)hK)$q)1 zmwfx~mW2IRW~cCq#j~YdSf9E&QRA;-{&&w;h)7?v-xEQ07eU z<~X>)Z6l)1TE#5Cz?=(KahAx*=thNY(4b0H3kYnK3QRX?@uXuKCwYX0DZ!E1@T$bMHSnm!b!Kvnu9nmF&a{$W%UB_GA*ofA5rm(*@YD$Q zlcEWdb((2o3DO!VRD7n;B0RGFvvh;g&m2(PlX!!v^)*U3tFk1j6I%}rMZBY@dx!Xe z)PKwDE;Oi=ZYfa?ZmbwXrnmbhpHDt_7fxb5nkDZ`Lu6f^pHk8D_M0UD3b)UJ=(6C> zn>)#@q9EGj%#oTWp;s>Umf|nzd?}3cqQ_^2wzVAeFOkrZ} zMqTgUTK{QiYTWLeWBKH zXngD|;!ig)IuUfY1e~S&HS%~L-xD*hxR?Pu{{!`WX;Vrb6ynvMkqV~IQ2ZK zY7|k8$9E;y@0=(m{G=6BWmH}(XqRabB2p5p@|oh)rBN;59U9x2NQpY=C)e%A(*47J zV<@YcLo@(g#5CRM;*9Jb$x`Lmh2H>a8*7rL{ud&FmT=eJ4)7= zh4_j&CwR7$`Xv!{@sFc?=8uaXy%)Nw_7AH`|I*hyw>`KXBrW^~9V1dax zztxKrw#|)+Qr;3U%(@YBUWwREamb?V6A_sPgC%fq!DI$z0@bxY=Cug$R+nj$?61Dq zU!%zM%+;k;jnW?*EkI7|AG7cpp?*>ejH&$KwQ{*CW5~ zrlWkl61P{*$aF3Y{14>I$TG6Ovfg4j6?%a@hj;gnj!P7)jf%-heLZ z97x3AEHo)W{|$JmYD0 zax1*c_{nECWH@REKiN`83Iul2`c}R`Q1%ZLRCI{zR95_Bl->`cXeaGbHIQe-9{nF? zxWD|UdXLGb;?pO;o^hNZDsk31o&nYb?mfL_V=Zg{C+?txjY*gg?Iq2`{9{ z|9=DcJSV~5qmr>&e!Mlwo4XZ(;Y+y^;Ej7qQO2t_VF^pZBbabo*b%OqVEL$*pYx*EU~E z#IB&;($>VejR-%&C7kX^ZJcfzN!Mbyc_%{tmTdjCt7m7{mX~myW_s%sJlm(!mF~|# zk(MN*m2oIONuvA*n0#E~*a8Zs1pgf?6QXgQbwm#pdHNbXMBu!!R^A&(m-=r*%3lPn zKYJx+)`-gyjq{eg*A%NIK6lG5e-&3>#IwHD=Y2T@n_dfEh4K%w1hoX^BAIaAe;DMx z_b6_#c8)hYVnivYxZ^P<^TS<|!vb&cNXcyS)ejMNflidO!?#NrT*fPV!F;%l)}08M z771_BL|b1adbdPT_h&~fW%NEE&In6_KBH))y^?Oxa0ph0gUri;^{Dh8NUhkiw3IBS zX0?yywO6@L^qk62N@lF=UIibXG&YxWw3KrcwmKvfC)w%t2;Z_)aI1YQFUd_{%}K`k zIRzXtr`ra7L=PVRF>f8`(C&b$d!i{`+Y5oInHK>Twu-2;9ftPqg(VTC?2%$cosdV` zQkHiP{@Q6)G22J&X_TM$H5LEDAzQN8zj&yonHK&4yZ*^L1_Ydda?EpH$ZA&Ax!+sk zN^X{K(I{~^r;%DIc@cTaaI3d!S+c)8;f*(13Ufw9O|-}k8@VpI71)!%YUX`R+9Spq z_9?EE{!gb-XYZ1rM>)Rn%6$0&yGs%4L|4HYs*y1K72{kpRyy;D#$w{duke0<*mF~uJ#`)Bcxru@z``_@^RKg+&Z4~e-@DQA!sDOo7+)4twdgr*;FE-b* zlXrD5KjNsEDyeKGKf+egRGz!lOzIpS(oEzXm0W$PlLI2;Wx^pIiOcwW&FvE3p9hun z8f#xr*oZ@vjKYWn3c^qiClyq1O{c_szl98&)dkX6TQ(GHePB>+v;~Pmh{7}sCT-eM zb|;w0jp5vxfm76XCn#5-Y(iZs1q|H$b?xepSx(G$YN>g=vb^u(j2z~rL%4j@#WkQC zany3uiHiX>G<_EjmKc3+=J%ayP%^4?w#ey-_{cIbe=P-f#28HLTJ`dq$~N~+qa-&CcRPifg*jDUZ%x+d+1tsyXuj^J zdMdwSdwDfH;pF#sGA0Td1E3z=m$J7#^*6*Qm_gJU+LAYQ_LAF;Dfz6yo z-(janO&J*ck{vF}N1cW9!81v-cq#dX?4#k`rD7Z_KdCXr_rj~3WDDx?U6EU#+g(g; zyCksQQd!Dz17VTSvLlc(KiUORq8LRqHQpukii~b1ROV;Vk8J=uTwR z=09|l-6*YDCOWOTATl}lCn|mOCwk6~qBditGG=1>v$!OOL&uR-^ zLXMX~!6~wuPe;@z=scKW9QQUtCdC^^rB(iJPuy>CbSZRbbEP+kuVA!U%8417%`w>| zn{`iV7(u-y$%kRSHp!R3bzbrsIF7fz>+{CWcnv|k*vVk=TIWJGOq!FQJ2dy?8nG6= z)%8L%c$pe+EE|C&MdjO z4~5TWN$|~rG+^`{pL9GLz+ggdmWjLh*DW@4+#i^1UvH(eh>t>My^FR#eSh$K_61w~ zAvxu|4_`|jv|fN5m5wZI16dpk7z^a3g-_a&M56zB#aZYIIO}uaRl8z zam^UftIgZ`=fkH*V%*2)^OvsvbqSb^cLR|zqwFgXS{M89Et}DM{%XIwwitbln}nwn z+mC>iGGII#wS9rdwnKyJ*Zb#e{+0f zTkXA&`QKHdmo&duE>`iI1hcmYvz?5l|7$_0-v96+jZ?p&;87!G?~>#&(izNX^~P>i zXiLPJ_--{a$fC0_cD6@rG<4`ls-=*B_35-2{w<1JC~?m~*);TJ=^+7(m^rjwjEH>& z#jvN$urFOz#5+GV&C<~vAaGMi{5rJT^;jNth#D_(UCnTHa#^I+tyTogw)%*hU#erd z8|^wty^|tiTk&qCNzfW?{qm10`2by1oL#sv%6E53XB*Qw?B^Q?UrfsXCm4-RNmjzX zz5BE%VC3#1`zp$nD#`9I?Ut7`lG|i+L&5#KL5Cj;nH?DXL>g_Xx^OyOpHwYQpLFdR z1Jf=q0E4M4OHE6apE+A$M0mV7h~1Cz@3IDliVXiZYtX;3YEP|;#A4F_EIK(6qs9-A z^4YX-JE7Sx+_UBb!}9q+3VK{KFAbYoVT%GEW5uOQ{bB;%7W}9jpLtt0JaX&^ zaP*kRSTCF8Uu}L5WkbZ}(dpBh_fghhqs^9s?2F?A2>11q3*9`Xm!+(;mYx4B1%8sh zH1lA%jk!3UX?j4RxBLTn8ub`GyE$LAvpU+G3X?6=BXMs~>1pywTFg3(2M09Qc2q z1jH2OIgaQH3#Qbov}?4AnF&oLU`!vIRSA$EBNCXV)#}{ggPla1QntP52bHK; zMn)y{#2SlSGNEr82S4C}wk$BiyU-9~sW+%lh}{fv=|Q0osb!`HFxd!su4+sv&?+!z zp~ExtalBi&3uQr-#0xZvyLcBdum;>TgeCp>Up!n?5o2u6(#KYq5xaF@+y9idV`Taz z!77UnfGmh;4*=II+c;UUc{wam>zVG!w@mFa&qIE`h^q3xoS@ZyEwI?}uWvHMR%}Gm zFw~sO?~jQ1Lm1ImKmT&WvGy*RF2S$zRh)o>dA*QOITcQ|ZH`K%t+@GQ;1jA;uE7`b z28qzz9l*I@m-pMW<`g=E^GPg_9-EybKa|s27J8am_fR6#hgwP%MOMp@I?fUiX{Y-; zO}%gd6;=IUM*jShHH-4k< zH0aA>dp&L%)J6VzPu@qD@wfeynD&3lwv}FxBG+M05m`KP?}$|OBZei08ZsO0e_i3J zu7wXH4*D1*YJyn%9v;4Ua&B(>?)U}8xo>a#K6vm7tRb6t8=as>hiq=YK0KfctjWdL zUos;d>3!`AoI5sT`NU>pbPZ`MFfhP-=_po{$>?MIfaIUEdCt0|Gk&2CtCYE6BrbxB zY{r&6$sFCA+M;m`!Fe*RTuj-hIkFJhmrBZ!wSZ8h-$m>y{ab-Vcf%TU)0K<#FxnKo zi5Po23_~9+incuTN^sTqCKBz>iVJn<6wynHj4Fdti|)Ia4gc?9Cm08uck8A$olsGVe4e?wQ<6{3X)*sS9-9i$imYp;kY@c z8+o5Z01pO9lkNd6u#UU{oqo93hbK&mkkxPx6CoMLq26Z8pijqc`{LT%{ zPh>SSMsL=Ra)?U|Ig_HNRD0Zo`^@FASGWH48fyE4evjmNS&2>NdM`{)aiPek(i zB2Z*d+~9`w-KlS%TKS6Jzwz%UFv;duF$cUAY=UCwH@TkutRe;!Zt)(pFBiDpK2$r1 zejC1ioBQ7b0?$301ow~rO4vflKc%&K=I3L6pziPE?!ctR7odcb!IpQPt)$KOpEmtQ z&xr(Pv<_r8E#N%)yG2wK-ptfMd79y+k;?8r8zeL}_(%JaKW#=PS8nlspfkg;tSQ&R zhTTY83>}qqCDve^kZu$2Rs&6mP)oaJ%SO)Ob%((l$@7mEo-@XpGK!t4y)A{Ui|PHX9hx7(CM9s_R$*&&HMQai00%LwameAHg&x) zlpK3`oAMie7WwAD=l!t)+bY!@EgM_%9-B<^VR0I&@u#sDqLuSk6F=NrcgW{sU)1qm zGzu5^_o$wE5-q46)HPD+4(|4@Xw>6oq>#jP2FDyj%*o@>O$7|MP5H4JCujn9w0XL) ze%rqko{%3RQJIP{DRgB;OV+W|^~ZUgOeStUoyg(t0cP`GV3ZohI>)Pl%e5c=m1U1~ z{NZI8|J;x14@ULcHk>UfG zCLD22xR4S8m{ehVnDF2gj0(KR_~SmYe5Q~ROs9J_jJyf5nnE>~7EC99-LN}^yO$Jf z)_CgnokAsw_q+If8>Dbq(-(A4O+@#*I1$+|$(Bi?uG?n_7Lg2}F4?vw{BBH$F4ew9 zw6k0J5%%v6K3$r9jc{kT^ds!@4!-RNBhuL|{|MW*gMU&qniR-?<2hB6CawT`H+eYJ zVo2}o8N`@s8yp+P0nr9{1uDsVV~8Jqh(COoKRm%Zp6vdY zx9;vkh>O~uNmP@ zzN^D3a=a6h_;5EDHC$2wfoy^kliF~%o-)c>ywgQda?rT%w(s^Tc4tIq#FelCU(h-k(F?=n25JP{yENZ}!d5py1e`ND5na4Tjp9}}dIX%z2b1Jc zqrTP6v#uKncl=>5cO5grlVsN#nYnH|EjVve!jlx&8il!TKP@;o!!tkVW?9h|Su%$Z z$t?t>Vcg+nf@J5Rk_`eHZb55jw3*GklD}rZAoeHXWkggMP)3{Ke>%5VcAMpsOHcp}0_?T7GHAmwgFlPL%1UVu+s9h0NXxJPPcM z(?#>!LK1XF>2fGi4rWffF2xi|$@?B7*~3tU3CHyow~L?}NtY5x0g0_jedQSScL2yx zqQ6s){dg2oi;a7sTl817>aQ_xkF5mIZ=9zJB~n+Id2U1iL5#uu435Q~kD$}-U0Au(F|2;64=nezZ>+p1O+-^;DU&uY zNyIHP6?Y|nJmk)QF~dHA6znifdpyKygS5~%rQ!23pZ73mI&QaLKwjh2Qd3ZqQ&Uq> zn^jd~msg8XQQKCX4KKq}QX?(17FCNWDMM3Z&rqWmj@CHAB9+Ci40bQoh!m|Jp%oEs z-DJ#=s1O2?P7^7LF48xGJjxWeTik+nx;kdmcLau z=e5O)z9@9DCb4SSPBao0nNpkF`^N1X!b?@n=zE0jseSzSOSe5yn4MQNcbsd%cVlh+ zf{)2djGYBLVZ@s+SG1XeZ!>TE20&CIBd<&C_?+JHQglJOmGSWbLp@q{0F2^i-`|i> z1%_WGL*U%Es^nI#@h9IcGI)zSR)xczf=|VQB^Nf+P40t}YR0LHzlkSXa&1Jj`i`}9 zZU`GVl~y++EbBTG-ZgKEuRE2WH&5TM9K#X0M5p`hC<$H`rzS{kPX$yL?#nY7r2H-k0s7>JMk#!V^bZFi0S1O z{7rTZiL6qdWw&mX*WS?tkO~H2n|*i(5H#t8lr%w ziDnHl91{%S#;EP3KkQ57_|y-*UGGarkOQt?!}AUf&-$1gSulx0U+phNW@v`4Ho~4= zVs=@U=K#!qCWA+vwt9HFA`>K8!X#9YAQGdH79#u(=l95$!zZ?% zKc7)zD$u^>!eK&8HFSlX{D9d&C*TW`P@!7*MP-+)A{klCBUhRz&mIrKR%FWR?uDxr zd5IIroW?+DaWIq~grEHR*G#q)dZXyT!jc7_$M2=3$=29_{QURv;r){p zuRkdr-Y&C-eD7wR9uP~+jR7lx6|OJw24y_u8jS)Vn&e70Wz@xBhx-=1ng^6=6L zKG4>%8Y`~{jIC8JT~jiChkx)`N}hlag;K(SyLi``2hS~acrRPyvp@^amBAR6MS%Nd zaV%Gt3YIyRg}=i?F~$G>ZivqE8J;ZugFYdVK_6d#3hK{%?(klJJ#QNi0&JkefjJsR zMOmWaJ++%Y)6AmAq19cDB7k!tej5T{zW)yWRK~U0kHk0e&FFhKBJoT5AA;14@O^NP z$NHe@kSGO_I75nj=;U(DdC25&fyzzh=*fi6*)ieK@k1A@g|CPfuUT=wv_f2pTZ}BK z0zbF$(GOf;x@CrWOK4P}tEzCZVriNV398CgdB6=TwKhQ9FMio^(fEe0M-G;W+< zwY%m83zDT;7&Gd~8FwpRIDEt>4`|}*WY+x>IA!mX*|90XkEuvxZS zU!^FL&0w|}Yln$SrPHak9&JU=0NXCt+KhKXg~bx^Iv$O*Af{F6wmBY;b-=}C^Lbw$ zjkclYboxAB9@{(Z7${0=imJ-$3M)%%i>u4)3o$e07F3kw6;DBFrZOkk)R;} zzaw?;*UQ1cBWy`Er0#rr9W%=a$4LJCtFV=A*c zg7TBG#`A|H07(Drit$FyZ`EXu&*k1XlPkF>o zCIDFD&#)%&p~g7b1Bf1IT^pPuzv)K$jp=$3DtbO;_EBf{<7WQh&K!Wz4QAEdK;Ufd zh04ANiimsoICl z-u2YqG1K35UE2Y!?fME7(4QVkTC`4OW#1GrzTyrVhB8H?MH?e+r~f7^Vu}Hcm@{0% zD5YALq#l)IAbmOo0CKaL(d${afmWH?G>IF773`dM`xYBwxq zcNL$ul~Q6_UZl2eZ7o-8uI&u8UYe;QS;uB3xb%;{wun_eH{L!n6P8ZFPSc_5Xwb*7 z@l1|v@{!AvqGM>5^>cHq-rbUeP?`ePrQGdbm1l1$Fis>^a^Ly4w$f~>Fe_Y^%6~> zpYj1SXVcjyfbkNmv!C;5#G21hHPC-+(aRk_r8&ZAI3mwGLUB4G zHaWt%JEGoS0#GmE!8Jkrd1yhJecy;aNs6K;CIqS$d?Umi6#Y_{5Tv{FjTi>D9|sTj z??O6WQPCmrDI>tV2G=^9v-;=!XvUu2b--h45_bxIOGHLXh)zq)a!b&^JAGl^EpgAD zKj1vW!#sl}JfjCZ11UWti#wKk2$u?1m-0K7ieGtt1@RR0wiYh8=C`#LKYRTO^CHt(9MVT|N>0k$rE&Kh*7+o@ z9BEdetqxTVQd|4#sB^%yTQgXg3sOG^z_q~Rh(N@GmG8w zvBlEGORvD}Jd0+dsyJs6c;&pW)_Lr(CL9FsNVzqiBQYXans8_ZrXmNlFJmtqA5H%p z4-8~ItG72}`CI;(9vE)BnD!{s6Xjy$YmpU zvGi3EOBvma8Aqp7{AsrOOo*~Lsx<9;UTR@ryeXU@-+wM}gG%1(}R33w*&;@+mP>MwGIPbkGL zWhSAInHur=WJ>GX0wqR!`Q+la1=6H%3zZr|HP{H+_V=IHq{qB?zlKr@pNE!Adr>-f zx3doEq_(pT>a1+C2?KRujEstv`&8+``*Q092v_sJQ~dcG_Z0dQMMF6 z|4~xU2@YC??FzR|m}!mI&M$TS)My9qa)bF?vdPM4m7w)@yT)tS$XWp&>ST~$JvVvF zEEJ$7#m0HmohI)p+MSsJ{Y+I-(NIWA`uP*AS?rjS!svbZeb-{ecl9rq!huJdOnExt z;0di0>YfxTd6=RJk+B_xQ=LuvkhocS3ol$-W9+axTx%ogMwfHy``yKoJ9$rANc-+! z8>k(tqzv729@b+Kx9ZMQvkGsaY7*`suv+UdJ}bc<^q37Ior~}>J~jFDazlIBh2bCQ zt1l&ZYF-?8drmHad3&DwhI3~ocx#VzAovQ3ddru=w8=D!85Lr10=)-5UZ?JvM(fHJ zB!!g}Af^x$B--7`wUT!b3W@7a_5uV$jTobr zRbk~f4yhO(OT+fhAvmVO1V8ca_AG-|GCdKD6I-zQF`a1x5BJnD>qjba_CPw06@7Tg zzeSvBF&;Qn-~+x3jkFUJy%1UyoiK5(+&ZGOa&gmJ>{P9=s+j-%^*Y>E$~+OE=_(lI zn8AYzmk_R$ZDK+vYmVp~kREzO0F69^ZS@WDr)_Y{(TU>35fXHQu3q3Tat-WmEG=zA zP^EkarGcuVEx^Pg(Ab|zeeOueJRCEXM7<9#Ax{|zA<#Iyo<$4on`=S#Ov=;LcP~kW zL-LNoxSJF|#qf>l31O-bmNzX9giKxfP1K2@;z66x0ls&BuW@%w#Lt5&TthS`H z6=`KbRznI`L^4%GDo%u$xM?cI6f$JY%pjzs`yomWQgXn9@c6V08rn!n+VFRboNDZY z5U&K6`KVj;UMyPXP}VUfvt)`;R&--KQ?}XVUhEO$hKBm&MwT*d(xg|L%&tEwBH!5A zVKHSgi#1x8Y50)Et!m^kVg_)sWFET8Zi<8{oXnZArVa{SRK%U3STZtLQntPpiDLvS zc{Z2MA(sY@`J!VcM}$0>#QNi%Abw6Gf|Q_FlYwxRTm6w}n+Uh0tcfe&Dx#+`FH6z3 z6Q7wV<0M0bn1Ciw8aas*n5!&TCWBl`-B`c@jc{`O&g*u6=dr{d(gg8c5dd?(&-?=6 z!jmE|RXzVxLcg1agDE^yzggr^Iv9s3CgMAE^{gy4#83{5=gtG<1;8q`kj%k0l~8(K zlFt}=q84}<^}5K(;Zus=Xhd#HkzMn@ zv4y2h@+`?0A0j+X%b;$eDM8Vv%}HeB^Ur2Gvr`#h35lssrYL`E;mI0)YVqpSE=YC0 zRd3wRI65LOC-qZX{ZXFq@fK;pgUC#i|ElkJxB1C}5pZU{yg&gCs5JSzfI#_kd)K4c zpzVB9WW$lu1^f5I9oBQ5@64JZV=eab^$F;X2{3TF@Z041>atSN{ebt!1kjdHXJoIg z)Rt~tp$GlSk^aZm_g|huyFp$sq0qPRM^=sXOFESh6<^ey%S+Wb4NKM74Xf1powOz) zMv6}YaBX2h^&_==md-zzyHBiB*-}@vjYe3^@sgr1`wjD3l)9T7@a|@W)$#E$MzT-yX$Ql7_o!#9ASfRYueGwp=Kb@sNl7~P zdUMo?`eq?&f0_N&V^|mf_(kPSn^do1hc;ap0r;!oyDYz>c3Bbb{I!G zZwyATVppvsD<<-yX19A>D@h*;3OQ8DLjVAZ4?g#{JVYYx-!hh5+~uFZdv||+Ee8rU z&A#iH)|#d27@7TIP$ag5kJdJ8WS`SE%q34{8EB88TQIGsr>iq92ZHNu!?K`H>oVf` zgHOqgb6!OWzlyI2g%P;*DGd;~2L`LiC%OFBaZ-zU+`EPQF)ftL?Fmn8U6%;bSZ?Nn zj&JhF&gOko`~A%uiL~1c&Zm*(RV`cx2lUw(yy9l+#*|7eT3>2-+l*)2uebO&EG1QD zS;Wdn+EQp>!}Mmnvh=hR_Ua8)e#O-=^Y5=BNY4pq;QhoNlXH_+V%+xi_V*WYt`&XmWJcH0J1`0(Rtg|vq^xSz_ z>AgAt5k}y6;_mOT<>&7-jQg$U?G9T|V4risww36|jb#rNg1dr$?Y}4_PW^FNjQRJz zKf8=q5PUS`>1@NHE6&y~x?py5_4IR1_L>D!O5mtGTw6~c%WU#cnff;ueY ze7Q!}a)>UG`;;=xh{eYv<}9NYjJ*3uv6*5COW346C{pRjU7W_&K47^dLm(I&1_n5w2 z_a@9k!(#2G7nJ zZaU65^@;~Jl{i(2(i{ev(wsbo#2icRn>jmSVD5^|LCrfZgE=8#fYKXBKPSRA)2Do9 zTon&L{;bHu^dGp!98;k5kfC&XbBwH@mh?zZV~**^&O>bHm*9N*A;*CKRdR zi{fcd<|eqQ_4dWIH7L$CM7HLXtD8FES;i=ndJ8ds7D)G)R*!XpeYtv2+-I6F2OKhA z+4uukHAAnPfBU8CqxF7a+9Fb-wPU~S)BPpCf`|9nIU!V7^RAJNfTYGC5A6>yFQJdW zDB%yVNU2Y^Q0Wgacd}16e-bUomo|oak0*xQjyEQz`GnJw&ym;C#}VHOlDWxBn9O2b zO64p0GvQC^6^NgBS_|is6ewx-p1NH!IDDFIMB@R2!aj$7laj$4E4CDC(bOc6or=??j127g7*)!5fn2bS~g6Ztp=nU}w>fX>^u<2# zw&p(3gE+x6mFY>GLQkB=8TQ)rEUxnWS9(osU3%STal>bD6L;a^9`5seJ^BEj5e8rI z6}|Bd-;n@6@SEow&_DRAfBR5IY!hlFkcfJS%HEVllfWn%9WmH>J4kH6^X>sHj3V6k z=l~4mzDR@cp4UxGKj0(#b@~b4^>&n`lJM_kk{a-F$9AIO5rMlejf!a8{b>xuE6qpQTurR&Acqua5Adp_NT-THbWStzj!X$-N8Xl${IX>zek zXlgM#XlAiXX#+IY_lC(mv8!lkF&k(Uv8!n`MCV>ZGl<BW@A#F5WAHRtri~lHevXWH$$t0F** zn6a+dn{faH7Q06dw)QYzsL~x>pg#}`u?GE?cY!_Ne$M@g)Z8Acf_dkCJ{~Wao??*O zn)6R;`1c3W^Lh|G+#7H$WwuPg9}V_2c&rQpEhh+ulUo~+bkbeVot(&*r#Zr5oBptH zG?rk6UHW%s6%rENcR_Sz5Ne=ye-?zAw*qYY#Mfu|a=lC@c~IM$YY8q)<91Ttr=8|LqND|3UH_AQ)y1FZ1?N zMoMf!q$1@PQfe^J)52zcq9TJsjW{zn(ir(T*7YT?q$}(yVIg~N`mCDS6^nz-8wo^S zF01C0b&R~?L?fvh$?j}DVyRfMQLstL`~X{&h~)qQ00ICA00RI201tTDtXl_M6vy|U zH@kbsQLg}p2nZY{3VP~M?51dpT~pO)?1%3g|?Hr{}S3>?yd|W$KhxJJ0OhSqCa<2 zx+|k9Xf`URu8dS89T@4LoQYuXAd(IunXsb+F=aO26>X1jBdMGrxyTjG7L6SPid+G9 zx1Z0q0aWTm>}W1>`59fI{I>8S7c#mc_>~w+Kg3bmZRv5AIQr+1*qE1ElojOiw{sQ^ltqKEXk~*~I*1MR4&vz`o=F178`!cN zjBX2*bBc}bN1F_UoO!Ph55GSvzAV^yxpnakDR$ zuKg=ZGH7yA2)I z^L|ZvP)#JEoYG(9)5;MPgQ}u*su9&QGTD+=H@d7v>=^5{XC0M?u1q)(FtiKTW% zCM4^bib$c>%!~|8JTUK_wtE&&+qz*D%zC%~nB%iXwLLw!=<&$qo8R5ig!B!rab#Dm zN#kC8J*QKTAyQ=D_3am{tMg|~%O^GF9{6X={W)zqTu}QR9_D$ebu+jaVq3Lf+)6q1 z!wtP^e9)pz-%$tw8ZN(#Zt0l*1R|I0^*P+tnA07%Or4Z0WiUAnFDyWS3P?4atLui$ z$f){RLMfa4Cn4(*pD>BXKMjYmo?s8*%b?|mFMSw&Hgg?1A73GH9~c&AvYDs{ zG&%4vI7pg~AZq@DoMq2yKpsK}I)wC8)-FH0TULDSESbBN&~eS)m4=ds zX&;VTIs1!90L7G!!$0vTX`xRL+zkDp)dr4fxwu=-NF9%F z&eC6`zo{(-QTe>4`bS0c@NIONyf)}hf9YRlgAyG`loon}+vF=kqdP+2%7|_8STY&S zj@o96K8=oadQ&JHWlDeFx_a@hbo&U%E*WUyV@0?i)yEbU2UN& z;DIiq(e39$Xn-+_-$_G>FZtDg`OY})F;PZ$g0RSr+W*BhuK&RN1V^%aEVmQ=6(Q7~$O1nf}mJ~-P3S!3Ic%jsnp2^dCF{d55wnDV#lU~aH;RmPZ4ZLQY=K~y>4i|cpSumi9R8o>Cz1W%Q;6@s~!YLimsIM9s zQ{~?^06IUE5felQLCjLXDCnRbf*5UjyJ`vo_9@8d4)vi@Z*)ic+#bzur_RMf9h5{x zY}SOE>`&K7ha94xC|@bYj3O=$@;V3r8}rMuzh}-!+^^(_bXa-+>3pR{7LrguDm4SO zz;G0cQqedyp?VD_fCQE^v15!^dZBcVP`o-);}W(Z|>SECkLjag(hW|7spR>K2@ zWtXZ&G8GMptj3|PAVybcMLYB{ItE%eq=^le(vo6zMh<1mU@rUo!}y$0i^!RCo;jm) z#{39let!LPa`w{$E0-Qh+BR|WrcF~OZISB^+*vK<(@_VnTt1Zlc}lgN19yLWv1I<_ z9b3sy>(@z5M;5LgH)h##rbE3;|CD~A(y*cg)LpHTn8fIe%ESEBi+Aqctnz*>D2%IvV;p{OLGKCpYoGsIlfD$Q8OD|(m8uH@D{qsN0?tlEF zE02kb6ox}JP{2qwIX`(}|MD4ocHlMd^%-+(;;diBQBAs=Lxzzd*)qg_F>_GU>wn(a zUU&nQmZH%#4yVeQC<&Q=LoDK#K9rWy>kI?L(d)_d${lGb(jg;4T;uLYljZt!+(1Qo zKgyqv;zhE&MbDH=1OQwEb-pZGAPmwWtO)NbIV#o1Gs*c;kk=hP9L1zPAJ$0UNrgzF z^duwdL@0KlQgkEHfyfmB2E#SdcO@T7FS9?XVLwlCKSpytx+k5G8&aBU`y|kmSi!^< zJ!XU}c9BwGbV9oHil?sBx@0Gw3-&xRu{)WNk1%?(^dG4u)r$zK7cEtTrWXd5v54_X zNbTHFDOt2LFz_0T`Lh&y zY%V?+(5c1#4%J_IxBuE!80HpF%If_2A78I6otg5I=h%=jzkdVsVevVdH29IR-=x~w zB{{x_LZ}Sku$5`x3lpL~ zAN|=Se8{tP^~_1j`$*F!6ih&X#?ct{3AMf`^s*{N$53L#qLYZ_1C4I8=z}YXPFJSt zhm+IO%+$(ctBuMDn`lDGR8Rh-68Z7|nkSQCa_NSjAS67$23dOS=R03~cEk$D?mk`v zRX;iWIi#-j+(5S znaXBb(ZDhnC^Ds|q2ztAa3@5qTtU7+Kz@bLyAV!(yQ#R=lA_NienHNzQ<@dWK`oHS z6hjR_2smvobK2e(3lSpD4A5~q51=X#09^zxEE`4aDWGkpr>3|t@1Jzl^Nti!GEACK z@)zEO4|ujyE$!>M;-!PtI}NDGa|}c^aP7}$sd7akbQNZ`dFQ6j-?Ecp``;*FjT zY`&8$_oRArj_OT3>Z%6V66iyPC@$)a8X^U7_A9E7fMntWBz9B0T~z)=rc?=3sb~mi zI+c`U<4VO{7p(>{^mXn<@?g^z^4A=I+JL_Yb7WrS(}kyg8+dNY%0Vp>$Ow$Ly_>ZT zQa|4ZcIbNN#H#h=I{9bohSGxCajD?U_Db*pU&+_Sl@xMYQOATeHs}x!U385N(8YIA zc^=6m>Yzu5{2;&N)4V+C#eBMguPQFjAUp#BI)@On;kkJ9b4uy_Q4VO6mq%|!fSS=P zZ!i5Af@-P?ug{B!yc}4ts2M0GWhNE|%aX55seb;06X$Q|ZCE&M2Uc7qaQd(7$5*V} zx1vnX?{Vq0QVoGD(-76Hy#65SoUizpkPufuRafSP^;|080I*^7bzUC+X{l!gp1lB{ zJL&nG67fJXd7LE|y%b240tHolj)uFDpgT;39gv1km+a2ZrpBT@N9W+ayrU>8LFmth zZa+Hk3$CzZpaSA?T(6z{k(MYLu!Hht0UKE88Q#T}aOHJ*{+?T1J-7Yo$~`Ss6dGMV z#8aP^$fcgqo{tn)nUo(hE2dHg{{Rsg#`qFaQ7=S$!wTY5@e@-SU}6TUdyn%<4(8`e zuYM?BFOFAS#c}ctgwaT9%?z7|plIr0WuB>0pWw2H*t~*N0>rwyESNK|`ccbee$|{1 zE7O{y5p&Dsl^&D)%QQkZm6BuA0Yf{00x9pe(_j7m@S8I~;VCCb(K^V5j0MNRv3?D? z_=OSlP>oz5j~5XSIRhyW;EfA&c$RNLZB_r!FfT?3EJEetsF=v90TO7g*o{PAWEO}w z*;s&J;Wkl=w#jke$b*MJfZp?v%z&Xg4;|b}#^Ls!9g6GzS6|=A-n?kxPRy{&2#RCw zQ)z}F8Sb=tpKd+p!(6ZOuXyJH(!D%-f9rQ_}ES5 zd(ew|daB_Ol^7r4MwjwD3?`H`RHKH$j3NdL;AX-UCj8l;!-cM=`9FA3P8_~SI_ATr zA3?WnD&&kSc>*Jr9y;PC>+yS@HHz!jR|Vfz^~?{#$6WkW6z;x+c$T6|vy;??%zX z&7?v0Jg|H_`_8ERQ(Fsi zzu^7Bt8%v%eQ<2d5|!2P(-4y9ab#>4e6H8ULIO}UHZ8sdEZy3_DGizpemFn`W5m+wM5eu!iq4h3f>A#qBWD_cn9w9XMmHF zJhz5o^O4H44OSc1%`qxf{eoeHKY1TCSeMd$VB5llM;@e}2nQ{g2g zS+uOg5+dD=-rI(A~vgj2}_E&uPpgJH>B5(B@_BOS=wbKnmW zJy&`SXM1XUVsO4^Jidj$VH8DBineQOBTyu)jYttEqHI1E03Em|9G>C%BhT|_4qhNd zmJIP+#R*aYdwwVS{6ReCy^8)fiV*yVjF?wp^$W%4szK57Ni%8CPiM7^um{q(;`>s! zk^|E9?CdV`PklQeKx@gD@T+bN(xU`KDW=m^M8cAw&@^x|91OpnJxlgL3ti-s&@BBv zMtRNBagtKDdxGtPz0mRu)r6Wuakrt0>&ZC;2+?_4@_Cc_-C%cNfdLm(0O2N9jiEpS zT9V!8&gsVd^IDef7gj&Qmv9NMSf+UEN1|G*pqISGe53_Cg;~Eh-(7!u2&8m^YC{yW z=Q#e(QxyS%(xuWM#4_C|pGQ3drxaEk8dNe<8rZux0@O#o4|{a%S5=S;ycMQhAyO3y zcTo{A8u;d%)^`fZtxZH;C>P}Xz)lwLd*768xrPEs@MTk?u{IQio zoIrk}cx;zFuyG*n;<5^y-1k-O|O(EogC=9H1^oDX;GJ|o2uKj-0;Z+D)Ybp@T}nN!M5PykD$_V+(RR};8hY`wm!r(c3Uv(; z=_!Fa4m|mZv1EB(ejZAFbF!WxZeA5l*6L#>7Mo=0=HXjIlmWvB-Td^1bHl>HtEzUo zJ+Ba(J>f7#K>E`UzJQW*zcSi8QQ9w18C$81^;QkBao*}^M3E1ssc0!` zl!04Cl-;-H;X(q&Rl~HK3>BzXSlL{YJ1vjIQITtfL!g=xN1I-7NO2w8Q~v0 zcWzqPq`skc{hl8HCPcc}W84PS)GIJ=;KUv!FL0e9?WOZn?yM7MqMDHWg15FC;G0_r zrb!3oxss6$${d-dJyyO=6JYfgLQK9Z!M|j#D@IhSglE+%)0?#?XYzGP*D*6G(=e}! zT^p<$@Y9zAzpnqv=p73-N`tQ+y3LfWbF~%ynYIzA>RMKO^~~emZ@#w7y?pX2NG(-P zKR5<|XXpNk04+mEI;BI%f?BA7JgY)3vtTD8<|sFM9{VM|wmVp%+MpS-$)-`s^M0_@ z-5QU?bYLJx| zX@hw8px~IxQ4d{kw?POlOa(2}0DWf%zIJ@+(oGgh1Y60p42Ygpkm10oHPi;lsj10H zDJgQj;-(8$Sb7G1E$@e^jI1Vh@5-=VpFq^!Ck2c3^;?kwaPrkjwmAOS&zmHpB30*y z|CQvwrI<_&A}*iebPj|S3rRXWnu+7alb$+MQuRYvNa}c4wQ4g$)FGe>)vDP4u2xYo zvy}w203qFYYE`kwsVZ^tVik!|{@*SwQuM{zAdC*e$_6oX5TkAA2XgpJPtRs^k&I0% zRm50+uxQGt)9HP+5)5*KT^|5yTJQ6r&{^+l!iInS=Sr6sWg5FevLc>HJMYe=^eSHmyQpRJ697`z+K{2SQDp!dWt2|{Cin6X);;AgUBt{Gh^KQ}m zbOv%~+iAqLf{PG1;_CG8$Rp>8wQEjv-thjaleqe_r_;!pr2g_}4=TIRW^Twc75Tqecx>4*J#d!BUZ@w*mDx=H6a zKb29gT1mrsl{or%ek9TK!uTu>3FQ3n)AQh7dBCul{v%3!ab=KhfOFV)AKxCaX~B2h zs;}(3a5Ik$g>#=K;iM%jD4cz85SzRAeSkE*#&anj!Kj%U5MmT}iUg7?B334JtpArV zFIc6*=CUmlwiVAxN*S;;Zun5#^=$2E>AZgAa8D(<-qufp5TM=^2Q8zsCsG+2l9I)m zPGrSyCLCqZ`gR!9+m#YjKZs@q262-O3)Lqzmi>fxF4-!UcFGz*#mbJicFr|JN|;G* zu5A5n;qEKWl_Q4D91iuDx4Nbt{@JNtJ8|R^uyo96*mh9+F@-y4bsg3B&GsEzygBU6 zDeLwY^d0&EldZM%7u;NFi^5QMH8|WV_6bG$cC|)6+cf0e{}#K4ShJ9ypc`zf(##y7 ziFGk?Rj_gv7(_C`+c$5%)GFo`#oj(|!13csTk>-ckG)d|{~o59)9~3I5XR_SL|5S? z^(98sUZr&pMyH^*<)lScD4U4eP$-Bu0Qn23pAp0AMn*?$CIipXn>oL3+l7Ze1-Yqn z$du(Lj^a-}ZOK>PNg>6@7&S=-p7l2~Ls>oQy4uqFB;Wa&b**qEbI^-s$lk9O@r5VM+b&dx2)V zw(>GM-a$y(Oz9A-OOgK{)uo^DCnekPEYEn!(z|yDDX&jQ1gHtg!Ao=vQ3R^422_gV zd~Z9l z!h82NZzPA>L&8l@lP1L%ph2s)jynf#km79e{;9UBpuB?bMZP2tM#@lzS z5c6Zgb+B2lUNN3s_HQi(P#1*cSCu1_?ty9)r(5h{6pM6Klu+K~Cze>zBT@GJnFxw+h$8*7cj;-ty6hYu_&ZXY8#pV{eWbcfAzd95>;$ z_KQ}$y?W!7AGU0HXLG@fZ5?)OzWLpzb?@N3sSl?WJeWG|!Q{ygyfu58_M&jQN{DB# zV(DH?3Q+*?-C_u!r}9=o1q-c$2A?5aDLq>$m%?F%#FJfMMyo{&x=LYXuSxKK;J_h} zJCzKCx?~AtktKO#1@s^*=y1?9d<9?dm^z;7Kn_8Z4yQWe2W&M~{_Dx~D1!MiVY5qB zKuV$JMu7qYkSm=|C;3B?N<7k+_%DP}7BR_Psh(z_rf9sH_-Zr8TB6a_h_0nUdsHHQ zR3dv+<3tYq8ViLmRf=fLQ%KIIK`fnRYQM-dx@-Gft&&;WJ4@9fdUU7$uhv_-SD0DW z#O#Hane3P#fXr}f3{KQ(pR8P0lI5;>x$kx_xs>}^lZnpL?p24Ht|BY8cO2U9?aqKN z+~p__nIDOFUVQ_#jUUB?42^W?R%}NJNnFc5HzIY8{Jyfi3%G0c8_6o5Jpp!1bkaL ziVVntV)*+k*vIt+QUm7i4Vsw){P$hS#D70|eIV@7&dLzpL|LOotoMv0^gey}?JwR1 z`U1*Ci`D2lb@@&!dn=J0)4VpAN*67)OoP+tAdTbwG;XVy?mplu7+*G7z+tNSou(m&`Kj|wChqXzbTb&^~&Nh#`5xLEL$n=PPLUx3}qdb3G5Z8 z1Y5j}^;*{h>n~$l_Hy@i zI)0pNIC+$8JaZa4Fw0qvcjA9|PhTSXNDblHk}IUV-#na(Eu1O7oD{CT`=UiJ6^C>9 z7a+6C3Dw!at@XpSy*~J`;al%D zdrg-$ZstUCwDUXd8>DWWGm3R!=b?Ghi_&tG1am@uMS7S6O-flMGao*ZHcEa-p+23l z$=~S}JMI{P+)YUvot{=wDtrV{{ScB-7S+f<_}flVs5YvPR;cwFG-PtA$GTA2u@XPV ziQOimZ*`kwF+VRKsxex>TZ~#;JGWNzgEZ3kQLmr)1lq%`@Yj}JHAw=e#gni(^UPA?<6(4F3@8*eQl&7isS@)(;^r}PN`VwViZRTLMN_tE zI86x+FMB}-51Y}e_pCX`W|F}j$G`pd%P)13PiD`U`OVz9eO~F%;gzPHIw97xj*xU; zeuM&02zrSH6fq|^82|I#L6(yT{~vGP0T9LU_B}JZdq?MJM^&0|_ES+&qhjxhHCDt% zu_B6c2#UQU_O94_fwgyI?3Jj|m|~2YSQCvJ>)r6p%r1CyDsTR8`AlxFAJd=qdw!3# zHtj+U9X_Lw^|v>ig42?4AGk6J_Awt38VYsdaSOON9`60%Oe3$Y&=RyvIso*bvutN2 z-(5%xTsUZ$J6VHz#O0p}fGM~xM4h%;T#hb)h2+?qY}}z$#ui;Wt|%BSvz&tU2DFRr z+_V2m^Q@7Pci~>Nq$R91q-C8Akq25Dh9NR@*Or9a<7U-HD4 zv`~h=E-Xq5jXrV`gvqpVTC2u6Ko>RVEX?Xv&oHL9lnC=xTxxki-1J6Rr<|z?07Y&a zRs524Gsmyn#eUtcRj>XlQpe71)nv`e@#EGG=-;t(%;n}{2h^-~-4-os^~x~C*XZd} zc3yl&W|oH@Iv9#ZlsvJ{R2Vv`CFfG7l&89W!m> z(h{b@+CJa!?@V0AmWjI$3{Mfzhto@Uj3(gAA8AWF03ZZ2JW4rPaB}ATZl56CA+T2f zhi+t$l|Z^1+B|6C?UB&o{vBkO^8JkO3*NV-C=8SiTMI$J4ur~rJ#D2`7{Q11M$0A4 z7DjB=mZvGK<0mPDFM>&@XL;UXC(Q~W9b0<{SEXxC`hOZ z0Mw#DU_?s_zY|Qp6U@E?5a@!(2_41Oz!!v)^;pk7BZo$TjdJ_ zvO8(fRMlg!GkxUYlKm%)n>lmDhEr#^C!L?tbZ}!BU8pl7;6?^LkYT^wL6+?9!Hi~i zO7UT}1B%D2yJ>*p<|!rzL3YppWl70K2N=U=RqztcT~nCEEYS2CBG)|F4F(I^K=Tzh z%eFt}3duq*OABw*+Op3N9euwYIfueYn1G_=Ex*QF*1$PJ9p-1~C!7{814mGUGN};E zxuAmUMS=PD9qa{q2So=}1Ca7%t%Imerz0^$BOxUJdsA#HjDhiZb2R)Kc8V;BAw(%M?)3|vx(qwc-x)_&M=9)+?*JhbRJHm1b-gh4WVl%RyoPif0&|ST^vb=KKvOc+z8$AjiF>B0@r2peZ#Pkwa`?=YEQqZP;ZEs}C^e*BU21HXy*FnK)C zGHWaJ*(%aAe-VjfHq+RVlf11Q%Cc$!IZn8B&c%pjSBVPQyZ~z~uNOOjB`%Mh1*}zV z!3BAFmLxY7ZJ{U(6%pCGOsx>0tLfO5CCB`m`gSMwdrOCeEp0ezewTec#*FFy zMidjy-r799Rv_1a2SPl;EuMm_@)eWXVT<}5!ohRx7LEDlA@K(}BL z4b*z-A-SU;7yq7drgrW7Gd3UmZ84*^Geq~l5+AlWN|#c?Z6D-cYC1p)t-ZU_ZhT#_KICXmx=So_jjJXd*Fb6$$#G(P~zOZk)0>@ z>roGuAJyNp_fTQ+$xVSvcTtQ9Sy6$SvY-SgPh)UOrnZYNHzXf?R8@m)!zM1iTJ||( zt}o|2BH!djQESUCr1xMUbEYJ@)1e5bogj;qbt=`owCoXHJ>=Z7`VHRw$6D349x}**4F4sU^AGsp$t|dOD(#&;U))vs9 zp1e#u(x^u=vlzS~o0c%5|3Nl0T?xKnSid$s`}Is5_4CX@J)(Q|?KdQ~X=6C4W%t$R z(ai=?cyyz$SD#~mhf1q1HhVlTc)59MnbjAX{(K>=(xepf{6ZS@#ABViV$b6o? zM6Cue>_a?Ot6~IH;l|w%Q9<-}0>$WgdC__BF z>DKpe6>lkyBfanjAs|~0V%dSYL5i;GY2;$W#iZ{VJzb|JY=0Gd!!?#qb^WK zOh>>}25*7$9oSI~hlWJ7R=x9PQ6L=)ow(BOf8;13HyYPx8HbFa;^v$==_K!P+BA}R zm~L(?)H5F!`}F#NX%eD{dcihWhHWgv?l9gGatRV^*`T}pK9BASGMSVp^cny}`Yk8W zhufV08l9#=B9ku0-AS5EVx8?Suc=M$IEn!Ws5(t(FG>HD*z~$-X=#(;p}9B+xi5y# zu}-XogWw&@-Rn>Z-;#{j zIwV!%{np(c@w%}izZUO)C`l3&1I6EHdspC=3(lZ5le%{9df3oQF@e_Kf)?6fBdWVskyCSNwVI z#5{9{F&s$>;JRkZnc~FRCDdxuu=IU5mcH*@ly)vD2P2}iTv~hc?jxg?znY3Bzg|9R zx6qVkqSLJO52GigjGT1r4!r9%A3AS=wYEX`g`OliJ<+nm$3=YMg5UmzFWkc~0T5{B zfHsiKW-zD-s)KE^CbEVab2sGEYZXqq^Dq{k)sIJiY8{wH8$s`w``pEWCxVT9V>-QN)u}W1_-S$F`28Me>?TxUg?Z|XNn_@|`>9un120qC zPoJGJemVt9o_hWIiubo~-(H5N&*zk!OBplCVS?f`Ucebd5I3$Xk2tl3t#wWqP8xue+=wuco`8$t(I&eUTvUWmWRIE7E-_J_uI)gI!10DuLja7(m> zj9L&#kv*-j$SgXhjvAlJ5=fo|a=0?8dIjoi!3_@F4x|B05<%A6f*C@&1BRt3L|Wx3 zM4&FOR%h3UbP227rPuD=UE9y7*UYs-y*`PrgdaX!A?HkAa!87m`%Ku@tv$hslgtHx zz(g`jn=~bWFED_fvdD5@b4BWJ03XlrPka_SXHm7=y%DE5mEfVjrEL8bR=LP@LsW~P z9(LP2@0ZkDu@RfI;7llNnsT${zyV2_Gdl>Q{>rE6-uX`zH^q8b;pE!Wu*$}SSZTtd zwa2_x+;IAAR&rOOU9J*$0B;aR`sk@dH$ADNg+DVs!cv%OA$lsRMV>R___6%?K8Ad{ z*FW~`Qoz$&$LjM8L0DY)Oofxe!{$^?vwH=5al0M zdZz%MkAL`ZLCw6Co@(sKoP8}j`}zL|l30e$KxMD9<0sCGr&3cp@M&tUDPh2xjW+qY z*X*Y(JAFuNX=9tFtKdJyTjDa()&a7Pw3WjE^ElPwC=_Hb54PgGIOn&lQC_uU;*Cd6 z5T%`mhk6lTYBllJgqbPG3MD!^P$w>1H(N5V*^Ew}fShP<95D=t;?s zb#eI|HVTXzEW2t}%}D2RHM+!-RE@!#cPZO(9zdW6!N}&T8C!{b#uoRtcs?i>V6S=- zY_qhK!_xi}{{nxSR4KAo2|7V_wvb~J62A%+QSj}=Tj^<6N1y%!SxzkCB(|CQ&-@w--^_e>t9Ob0|1^l~FvBdIT~&gJ768F2@iDp}y#{um3XPy!S^j|8 z;fP+T0;)Ccb=3xHjanf_7PM;muU9Cso~uPhpbJTxHV*!)mH5hG-#+I80716+D>@=Q zr(S#dyRxeYV_0~e{0t0)Mo4}Jh>)#^e6nz;UK`;hgbLLn;D&7jpML#xpj7dM6aD}- zjwI$#6ie2Cp)Av6y7(QsC|w0kpaNs!=37WLA$yTS)3JClTWo54kW4eWxMJe?ocO-E zeWk0zXJw^y=+Yw^KrmnOhBc*qz>%`F+LJZRg{rIw#^#p~XZbwkrTC9t`w`-P_(oG1 zH~>AUOuw(@%|;2)f`U?a(Qqo8r{;4%PiVe8Kk_<`NNyWFY{-Tots7LS+^C7Mazkl& z+aW{RMh_YkU8O<&h-wWQF;3dPa0CbgI#5NHR7|eU$mz#<(nqVap1qSUKv!N@TPMa4 z<&Ywgn5Lt8^kDb?Ejm??aIN2_ZMTfXw*4!24DMLIYugqJm@PO!d@eXj*MJwO%f??r z^g1%j8c4^Unkx1z;^r*y6dYDhomDs)8_6QqVM)YXVvfn}Tg|CyjOsS{>q?Dk*C|u6 zzI3VAh#_@r2t7<8WkVX&V0^V=zF;pEFa%jW>d=y15sdj#m^K$M3tOUT*-CS1OSR-p ztrEj!Oz@#7Z8m3yFwUKM3D^HZY{z{DOuUrIQZ@ymX!@HOUSn$soz#dOWl*Z>7M*d zP#brd^DvPHwF?T&Tg2xDEy;{)!FqE&x(6+T#jAL!rYmp-Q4GJwHgY{jSGzzvqg|9; zw4D?~&OJNj+{=R+j{HPxJsz-{63dTNqWD@%cIUQ(duXSv=-vs6S4V3Nl`2$e-7~sD z2W?$|%trA(J}3Rf=Dh(MhbVp=)Cr-P>P9*tWadTkrpVq@7lEKI0y<2}+*@v>;j2p! z9Q-~@ybm4lYv@3G*$bb?Qo#V_G!V$VTAv1z)oEbqRd^gcC_D`yI3tO0il*wn#1OcR z9Na-u73b4AS|XJaYG}riN3OsZRAn%8)-V1yoOzhCJ6U^-(cg#mEJ7P<)j})89=tWV zS#Nx=u)*-X5|h-7HS27!d*tj@WBEt}Ozi9>f^>(hz5&ux-f)M zljPD}Tpj=^R;@%)=}U}Fw)h7PDokAnrvD4}=ACjF)D=N>FAQ@dLTcV>Y(b1J+>ErU`b-4$)RWh96EYl_XM)N(3_C#xNJu+*6b zx3mNEN4k?MXNu(N>F>*d?5i{gChBz>k)B8~jG;8$j6d;XA-%6WG6Ozy{qqR2vshl>Tdp`APIiSMkC4vtHsi!l zN8uX)=~*i7mrgP(S8J8=$o!hNT-$t25LZ6!*(IMIWqy3UT>b3;k9!>W@65z4!d zhy~&9P1aMek~TsG17pafSr_QfCEL*5!$*GIz6w`{K@%5E`Dew-*OQlwg~7O5Dgg^V z9{&uM#J~PM^eH}GJvFg6Y<70|K^VLu2jAJBat`n9$#N``3Z95G)=hn(nR2jl)&|ow z7OOmx;K8Mt7RSj&8Mk6ny+_W`F!PF57Ohm|iKu$;Ph z?{Bzj%(S-vfjpcnHekN9vS5%5l)MsO(qSFX8N}!LmH{kwmnW9AposLmwD(RRCT@*`*6q;t>WD_2m0l(7w5F7h<+yEXG{mpy2 zcBSj6JCWKx8d@c(0`W(BDbZoCqPVc~(?PaW0Rj(fa`qAwWCT~rAfT+X@?*Bnpd#-a zIi1+XVBR2>U_~PK0&}X+j1B`C-5<}dT{G5UX4c>-Q)cD=mip6-@9{qu=fgoMnp3dR zw>?(HtiLSTr!Q)dP`~@q#IV}<_tOE3pHGCLfBWo)&i-~~XIPpZe)9B`zTciS-P2=q zTn7@r!b7n&2nTayPX$rS#nreYfP@!IDdEN4 zec(;%o{2Np!ic=%i*t6)%RXeXoI3LgmN{E1bWEE$YjUS_PaV|jL_gSPQ121r`!3wQ zo%X&t9xbdOXLv~vC8NL~C0CH&KC-7PP}9cj`4~t5?+$~kS>E0X3dunCK&f!b-{(P8 zEnx*7I;LOpOgXk`T>VC=(fHoX(luYfeijm(YJ-Ipznfx*mWn9Zp;6QIhMK(x8ml&I zQKebxI~YOW*#Lr-xHpSaxq*(dle zO_?)aH8at4`LkC)Y!_SSEVEd=X#7b4)5%_OVAxSFGJbPqfsLPnnx|L);_A1^E`oz% zp~RKs;S=0cWJv`efDO5Xje%QNy!&UT^7Eqy!FC7ZlXqb44_yULr7L-~KE223@j z28=}9S11U1Nx@!985q&w;mzxhg~#9Dc!bPv(d_N`>{gO@J9OKM#oGj;)L+JXVG~&9 zZ&(R7!-w(r(VgByd;Hq6ukkb{p`UB^452Km+f(q5SV#Jc)q`;@^otrfUK}pcZ7qpqR~^G&xdR;^6;Y3! zD&F3drd^d&kfwUWDqGIZr+l0E^7swjFbS@XaV_7;C8t}WuM{+!ZNZV%7b`WQ1ElCePv1e%Bm|s34~DeYgtaO zmF+5&RdTDipiY3Ey&AyBCQI3?x?a(lz*SK*L{dndsOG=116G)vnZ7m`4$sKEaep%$ z-=$3V=1t1AYK6C?HQKg(HiFUkUrSPu|+6a>IzaSygKp8b_C@9Mw2+ z;h=?A%ZDxMle3G}H;O2DEz%TuFQP*^GmI0jWpFdZDSPx30el!x`dnCt>>v-S`dKq7 z7*zB{usHZYz1D2aqzy$l%(PdmC0w)A?bd}Xo#~U&C36MgS^|}3D{(JTVB8vhfPiut zx|?cffcF{mv1}fSW)CP7jnn&p4X+xcg)j=?KGod?tFkbt?WI3{I(|FFg#I#h|9R2I zb&ImLLa`0LgkR}i;olZpeik*qLVNSkL%-d<_2Kpr06`L-%6LtJN!$X2gz~<0E*7A- ztxzcXDFHxUBlWXoy7?$fymXS)f+1(M!VHJ%?D=h2&ZHIl;hcG~eQPx+5nVs-*{k8C zRo}_um%X?YjQ8{@)w5%rrQtRGT6C;hOELB6@t05tRs8l+n9JL-WBW2-1Vc7Uum0slUIz)0)IxSxV!3C&+KC=qI zEL?!E{BRYmQ>t);NG_x$eypyHPN^TFQ>2=&Rnl;=oN_!*9&?a6GwimTjm;p10|Jkr zbu_fpMrA6G-iw)h9>hnf05?$v#xJL(NA(6`27(0+ub$8(pn%_ro&90>NVW7KQBHU2S z3BhA_ti$c(2~Wcj2$(jKFPHG}Q$!0AijtcYlLjfBL4|f5RnX!5IYQQ$^eHF}O&*<* zEzF(Jy7u{9shdi-dAs{;R12{dzK>sCesS^$tc1Tia_V_Lw1dG*3&>)_w=%|AVCjPS zP?|;8+az*sjF9p{5GV_V$fXr)t~B))^Y%FpEi2`xVGM#sz7%P`?5Ocm5!Jk&om-Nb z>;}HRhSp1?Y|==juaVWl=?SA`(^ijUeiK$fPaM&-C;I;Uw+~Ek)tm)$gh%-A%@Y@I z?a<6J`21e!bo)LKtu3MX<=Xvc*I-kG^Va6A+3<%Kbo}0F!T$VXc$3B(Ca$~a4&$JH zWPbn)z5_sJ-j2y zZW7(=R4w6CzIwAz{2(3wUaD!e@;)W1)a^Rd_>` zt~~>KCSvy%t>NRrEKjorS%G1U!6zIHlkJ$*q|~wn+*!cQ72kR{?huvj+}J$2=97L< zmzkab|2S<{CY7|+VG6GvoBV#_sUqHyifON?)t&9Dsq`$~f4=I#4`{CxSv=|j*LKRj~k1wAXO7yKjT zu*$*7vS&aE-e1J&bhgx{WS#NuRzJN8+;QT0H6>oFSI$XaMS@VIgvex`LDed>D%<#C z%lUS@n*0eh!+)3$Hyt^#Z{7L~+*a%(HMKkr410Qa%$dP`_b%DGuc4(DB_oGyhkZk| z(;zTG7J@^HuSp~8RG2d#HuqLu^)|}c-o!SEr57W)?2h)1^+v=5_Rc1ETufcCv27W_ z+82u2Xc@tUTG-~BqQW+KBQ0!`UJ)-n`A9^umepK!o5Q5K%{o@y=JxA~iItV|HUNPL z0PGN%IbRS0Qe_7PFYQ3_fnVZa|CB6Hfe%0iA8_Q{eB6{l4*i|$!DL(jlLEms*F_Aa zC0`KI(6D{=>h2yMg~f&p;y#!>`-frJd>02<@sV?5_5L{7HVE9Go@5tTPYBcF!Ef=`~j=gi9{78Rl9DT&%(rFKivNWf}B zjdVC*-j695-^PB#x1TQTf{B}t9a<;2p&ZMMeg{V%{S8uFBpH%W%aTpArfx)Rj{+cl zOZx2vVr3UwdxZD4^If#HM`Tg)aEi7JzluS^I#5ItX|)#@S-v~G|NUbj18zOG??^gs zF7_sKbuZ%9&$tU*vtwOVOFd-|9>6)`Lzeg3oMIHXb;vo-zkGDs0F{X;%fRSLOyocY z8ADt?0|(PcoYd@nTbu)X1L`dWKr}I|ww_pR4&FZMZqRXPS=(dUi60*1cq+*+=|TPB8tHM zV*hpNo3ZTfzB^zEEI`UBjjia8W53##k1L=l=cEdo$hauL0lC7bTvRf$w0}|^USwzgXkg0Xm zTUOdcbn_JXqPNroU%k3;?exBtm($1GoBR|y%`(9NeDCkM&qt;Ixbeu1qo)t<-g{K6 zI&I~qaVh%}u6~oWqiieu=aIWfM>1ya*_gFp9vT3%00f5t5TCPZ3XM78QCxv0E|9CR z-^um>sUCT%n$b)PaYTB$`P+;P8p~CS2ZhpgR2l&B9;+M@EsLM49Kr>Sc@aj2oj0bP zY-{lF!brTAZdqb2dT3)lCv0dX4H9X(#M;$}YZq$@AN8|U)&XP;gpOQeR0cwZ0E|K~ z0LHtmO%Hd0j3f^ zLh;3g?|#DO7Z+t&emPtkOT%g*i^n}fzC-4DD zvWKsqnum$<=~d6iOL)ituflOj=)gfmPjFqbvvqqG^?(d>VGkH_XSI)=NLP9wG$yKN z4O^YWQdvPx$%-b$`VlSLdFfT_*M)08*W~|UD=U23Lfh6cJvfU<=d(mQ2ZBkm5ET5W z9?Y>hg8&+lp)_eu?|$_rx&9G4MRC((^q#oz+}$H?8)<0=-AJY z-Y8B;%2Y^^5J5s{b%L^D87CSFnTK}1r;nVvZ&`(UJwAh%R!rAJ_Xi(fAXcqy7JQ#ntT#w6rHP-uFjX<;&Ikda#P6%E{1I_Eb&=Pn&w+#g{pBcLYl28()MP z78V=zu63h6p|?e?v?Aq2ZNJ zXJ3BwzOC?nb}q`=4iM-~)^16S8wdbpK!R+iu!GnsJa9!581%`mvU69FQ?Bj|qTL(z2@W@eDtL70>8ZNH}A;=SmLi*GEg*o+0Emvnf9Arn8M0**6wK8I)9<=@$Mv_Odkr1^vU)iD>cUl4wIvO z2oS;O6GdK^uaFo1U0LLk|E?@@DS8*Y8D?Gnxlhjldd8%0lQA1ddtyHd;A$@qmtM_c<)N%M7L*mA$uM-H@8;o}|mvkp*GYMUgu>S_hN=2L_^WbG9iP4_yq8<6(1P-#Mna zu<_t2idOxwpyTQ+O%`UCHTfIb6KyHCkoHLuN>(3rks$hgw_fQ0QwiS@x$A8acvDpJtvyf<%+mog{iO zPJki*JDdP=w1yrWnkWrDP&C;Zl>9IF0Zwd4OIruC7U4$l&y`mE052`q7-kIs;b+EH zA1#wVXB(;dAKS1b@s63WksiX&CfwM=sloU`6~hv`x#-z=UBd%^`*Y|3gie}~69AB& zyHYhaYF)Vl)@p1x3?0AiY;(&1qZgGW<<8DgEq$O)9?Qi?FX4{)CfutN?vlDlq@zfi}soJbmr`{?TILewx^S6A4Oi0bL`=; zFIUYLell4Om`tdtNu54__`6lhc$~K1e+#Fr{0SjaIk{EehOnOfdKH^rFTU1lu4Gki zRalQln(!oHv~b;AUbr3)1dxP#NiiA#{6RRV493aYDiJFGPB1&&%iC0@<3^f`^Xj-r zfNgTT17GpbjmzQ9Ez9`Ujnu|wz*m(5#@o9PBf>zjVM;8Ao&!9G`trNChb`VFd$cnEK)qCc0GhCR}GpbhanM;r-w1ZWQ@HgxqfgiuE{|4VP z;wJDwMJW7U|Ht>`&4&!XUA}m)jL@XaJ9b9lV`6i*)@t)^11>+)?>})HtfR|ji2V@r zRdOtq6TT;6uN$lnAUTtOu#({^nsYuP^<3g}zbU`9u0Y^%(@f-%Riq)B7Kl z0id_SDkm%PF-;Tl&=s_z>d3$T^TqfK>_6u!(8IeX__Jxe{gC%pidvygg`y{g0wC@o z4;5blR4f9>>{YH+|2w_{k3wI8hVvDK!hBf6v?u1~KHLd!Bu}c3o0pwI&YRTEOXF7@ z5w7D@>^DAn&?Kbj$5K17R*|Pbt9S~ulnQs0*n| z`_T(>bmp-hkgm9?J+RQxMzj~gUGk_{KY`!>$WOqx@zeHw+BS+XD|pHfW`SV3tP2V* zW_K!?0ROtgs9b`*Nos)0$4U?ZlvEpnB{xtdbl=Wj4?$cs#_{e^b@Gv{M&$?dt(cRX|-%Yu> zb=>kh$Kv+=Oy_|32>ir0EC+3+?4smFxF}iUMH(2VmHJsb3_dBm4&9k%3W>mlnUJbY zkgB9G8r%Ekf)0e~!iZ?|mpCg6~~S%6wU_TCpM^5Tn+1V%`C(3XGooSx{U` znmd4scYxE}wL&5G(8ESgEAkIir@ir3yaRbAoQvO1gu0~kYrFB^X@g)_e0g*>Romch z+zNhMVng!0Tzn{Y6oLm$lw;rz+>%w#323>lm zO{S#;_wG%F)x>K!msaL9|E3a;2!0D@v$}%U;?JBZ%ucw)_UbgcSO1r40n7f%tNzB_ znf}@Sh-_8=Onbayo+te+oBGZsXK zQ>z0lqsQ*t(P$d%*=6S3U67a{_3=+n1=R+zJjV4#C-gNzfT(VwS&7CI--x@3}@aw=>fTd5}u!eGniPh#b$)U0BRvL-hSnJE^f&T zhGVdL=KKX2XeQi&qs49W=I0`0u-p=B(N3oKj~_|)>~po^tv?tk0~I^v!|z#6-{KBl z+2}*}EWP-<`>^F|yJs0VN8pNnG zY4Wh7$%w4tItQ-B^y(Fpe+ZqlG+5lO;o6z#kfm|fnibR0x3re=JphE?G>#N&MbTvn z*2+Q0lXnGJujv5W=!3frxW=VO<7T`m&eRvo^~=E)PGzlYGg?Y3jT^<`Lom{`yXOyk zaK}@p$nGW2tBs#KE1jr=)4JsJUrQjzag?3gaunN588LL4Kqb!Af;&ekVpj)>;DT-+(Si{gt4IrM4MkY_!vpBfK!c~BAP>u*_fHYbV7fPc{P-P-nV3n0 zuRM%^@$c`#;rIvqHm=26oPXfJ{nu~+tk}R(Q;Ga;AS_Z7#5QC!HpnHcMuQ~;+FH*1 zXmGJMmjKoe7os=1WV%oh>q0#=E>YyMn%t!fQ2-kv9&G5s3$Fm1AyR(YjSdkj&*5$> zkt2!(wt;!?V99rmZ_cTLdC@Kh_yaabdzO#htYu<5|F!llIpDiKgw9kx=O2qdcPncs z71}<}u(M)Qh5;a+WHC?|(D{pe1I5AEWM@01ED&24wTm6H@=6Pg_y7hA!qR7Hcejp3 z`c&jT)=~vx41dJo^u_=KjnPSffUg=^aRfT9U4H*TyO5pQF37jb_4DmAXpwoVNuHYl zPxgnWGA!T1F^dhQVRyWq-k3)F4NM$A9w2ZZ0L}LdpQ#68Lcs7&R6KzHeJN z;?(6Y<(e0;F+ZnzS!l({v7GW^)hoaMX0L!w4e*ie!O3|?7Px^-+Ix}OhVI37%%Fw! zVS8v#XJ{Uqt=agN$prJ2$@&JRk!ez=40gjChya+vCXKQXk^WK4W(g1sOmfMPP_=H5<0g6;UZS*vn#sGmale>n+{C{RXGO@r$NHSIc0u*kSxU zJX~-@wOPg->8l-?OPT?0vdZ4_t`Ui*Ylm_{nc-d!H3xA z*vTtb7EOXWTngTGn7sHhY7fUz)Bpf>c4Rh7fzn{E>|KVXS9(*{a-O|{6MA3jAusfJ z0U$$B)yQ+h7~Ti+USsck8toNrb5Vl5zBtRFBo#$j(DWm%gx-~`rW?)LuuYxr4AdWo zrKgKJHtT{DESmJm3nrnDlMW}Hh_!Shh=T59@)2dH)?8rPSr}L>hbat@VMUlCMVJ-N zeGqvP#BXYTAM-IvK2Z?_iJxKoaLre&J=M+zj7cNNmLJo0Q78pj*}yRMCz!4fDa2}J zbXz`NOhbKfHzL$tuys?KE)&$ATOs0v>>HPk$6`;S9r@7p!&XZQP7p3@Q$ZO}1uT(` z5v=^7kuiVLJb9yH1%#81g@1zh2@JPWs1o>RYaIV9$s}aV~ zKUgI{w+f-wsuEbmSVf4D%Nkit%yRj;|$6##<6NlRANkm;7LaCJ=8i{F=x2}KgOITDqc%bM~@704Jwv()P^&qRxgYpV^ z9P^;O0v@p*lvlvxnFk#-54s-d+nFBO%`%ekC-BOpXYA4Uj%OH|E%Vwk8rw4a z?mt93f0uXP1CaC;i22gDKnI%21o6vPVfz$q&AF;IjBkZ6I;B*`C(f)0ZHQLG>f)o| zz(81~{M3O#uu4E%BQ}k|-jfRk4;Bt&jfR69O3eJwL&{a7`63is12@tZu!IyjCi5bv!+B7t5U~he_Q?faW z#a2cZ3={8bY635EGIzGBCFPsX7l+`I`Ey03oCCd*lb9K{0P04a+ilu?Nw~7dwEG;Ib_n0v z;xc-)Crp6h3l785Tb)g5K6okq+5RtR@EI{uk8eNT@&e!V95F%hEcNI^RAT1(^)pkaZP++96;=2JmenUG>+#Ls{eHzaJcp;~q2YJj z(EH_Xzs;|`)6(>>^Zat3>qh_}5HHpf%^+I`N=oz(o@?va>UWmYiZ~xS$6dKcK65D7I@P^oOmgNIU+z zYB~P>UkL*SB>Z&~eRb`5;=WauV`~n`^Qkd5Up}-7)me22w&=KGeQ@H4RR~|J+jL<6 zh(tdifGpy3yC(ff#ytu&1G{90<}K85k6`28lw$}hX57g(`fm??_59rGMMKX^WHu|- zHFtBX>v9|B=QcFvHp|a#_L-qK@IzmXE@5R3)S)+oD}%2P+bV-kHKaisj>F>{2d=MB ze*FOUaPW9Ie#nR!sc7c#f#ZbngBO;Zn%T6yVPW?P1B@}*BXC4RVL)^xvB@u|@YB=3 z#`NwT^UEpddHUD5&2#bN1zXq7eEDJ8%Jtc>#DcAGK&R;PA?pGLjST5(z-Q_-9TZ<} zfGaQb%d z@jrk6rWKwCySc+*Fl5;=SZR~_PTmQ8&b;CSJ^>gn&0LBa_q{(G(U6>M6|B8t{@ zXH)=1pedl%fTmJhya4A0ElT) zUEo3fBP)noF62*0+A!i23X7E3EkYpAQGFO(9shE0%5V7BYB20)d^-|`UYPhd46B9j zz}#)ITW}tnwYBF~IDKoctuPUH+uCyrfabO0@d8)rHP8ZgKrLB8!;ztdviesRkD(9` zk-kblKj;woPNw8t@U_MZxPb}`6T~Qym7_HeAWqqIMmCf^tSr6@VkwQ0xc`6&Jr)?+ zPS1=lJK$Awjn~LQ0qcT089E7zH2_*tq>8w$FSwp0OwEs@cx^RY6v0~cHNx<%X5IzYHNju3W{eS^f0}Vhl z=m7?ROh9C0ZUEBj?xT_~08;fHk@1wGuf$NC#>jl51X9tJlfi?4`>sN3VGa zR<9FTT|<`_C2|Pg>K~U3`}!E5tit}4_aEMsE_dN!Vgv(LBC5sC%){MnAovmWVK58 zNyo&5PL->YNA{f(5<6C|8d=fuj=oDD;rq(xA}dOM$|L@Bof4Gq0y0mfabK7qodzPX z2QJJnTLKV72?%4g21*!-UyHb@Xg;L7k+`+EtTn>L<4yL6U?AHAMoL~`WRFynU}TuL z1htYOOfU$M9?;uEE8udDqk1)|n_1Ee+J~1whqIg0#otENaT(F^y8B4_(%LfWThS7#q_B%wc*&*s{la8&=9P32lgOB791QuvGt2bTf3HuHUACLDT07=-TlaCbV3*hF8A46@Ox+M~}em(>5Qlyc28DbITjA&<2xshl3vh z09w>e;}7WTK6r)3pL`@7{H44ud9l}z;2Dx5{X8nKye>)wf6)p8c!gM%eg1Fdb%BU{ znn@0Tc%8A84*_4GO6CK(wz{^fgOgRNq-^|{FUb)BL!}s}R8&RN9)&8=Q@Wj$|Dd=C zN5j9C3DNS@p0HY{qBGtAXRgG%TEG z#oF;{J2tg7WhZE-hOm_!io#5_69jbax}6v_^L8;mpOjA^eM_A`uQymW%Yta+U6p z{dk4cjqRzzJ<<^HLE3ELyD)ICxUuu7if$uX8k+nbBjb9>$jziNGv7^zm>s`bK+l@LJBJ{yJv&6tO7omfp01WiH>l>E=lgk!0mJ%Vy4ZP{;m z_c2d4z2Jegg!mcCfJhRduKvw+AK?l(86SiIqhIF@Lk;UEIcmc^>o zRIS;N4?f*@CCHN!e*eW7mQcsg$rht)TWL0&AH%YctL0TGUmZG?OOHB6>B!N63s)#C z8KpiOH&RW~t&l5s?5debS<`Q)!DEYJ#+_N)JZi9M!_-MzJGJhXWO*?(VR1scPJNsr z>&=HkPWvm+ssDHDn_t0Z@751z4><9%09@@g_J>vh@Vg0TYLA1k=fbmlmeSKSlANZe z*(qCFJx!0ZQ??Rb!LYO8poj80`ktM#p?EdJwt9eWfNY>*4q8q-BjW(MVPRMxmc;GB z!wX#)W{^2!=xJ4yI0f_YFgPm%ZoywO?wjNfho$E65XOH9wC2AFz{kYDSQb}nkn7B+ z4)T>k1pc%HEXbs>t!qtTSPn{)_~tan*U(9P2Q^a?>PS9gym?MhN*x)&ZA5+{HnP8| zBWq?OJA{n5Jsa6~>gxiqX72F@?Pbx&*A_L*D;j*bRAf~!GFag*ZN4pRT$iuV3$wh& zNR||@gvp3$21^T@cgJV1%E(whJ^uM4LCVFwwyZ?36W(E80p(F%pNe*G|3No@f;j+! zMF0qA#9FM48l{a~CN2m2=ko-0dcfMKBYA>aK1o!kV^n>?MeQPfT&wm9XH4<&2^SBT zVEUYdq!^Mn80Nfrz2?Lv=!qXJ&Jtl5zT*;%Tqybz0CBFA%OalAr(9QjllbId3940k z^IUisSA-3L;D+=|N8daZ(g}0maYB7$=}(A{a38p6$GV!9wlph(_{?XM2yh89!$V|O zg=^K7AyD|>FE>1aI-p=rxYI;rnW>KXe1Q|14gyqTIP{ZJ!3v?8x8g+xZVYhCNUdS8 zTHQw2iJ#)5i&iG~>!0;*0fr^bjo;qAw=R5{#Z#zv=bMASd%=dV^Swn zY`(Ut*Sy*-C*o&Q4tSzz(k9QTFBg^bUYfDdaNz@f`KY1y{(qXZu6ax_pWf)a{3PS> zIwNjnyRx5br>=Nc{@D96rcfo3qjf!vw63QeJ7aXb^zi1BX4PDMk<)~Np)n(4CkmNw z`334=+2qSvaOu9scQDb>EXgR_G8EyP`1$hpQ{$doy7P=#UHGN&2ivKmWT3WNYvkdb z+-BuKoSu4}QZh-x>v_Xk?H#Ig?OxyYLxQI)6wuZ4 z2h-9f!>x`J(-&5{z=jZmvct7LRd|ROkX{_W=$7bJJ)w6&=0KYC&5r`iv!;y>jf zne=II_)L~!dxHe#5kX{5Q6{4Eh_VqiBM_Zh6oqICB!Zvx2dNH|;`>9*3DfHAnxsy5 zoi4qIO`$Lod>E`I%Aw|TLYZAhX0xwq*D15vk``wpzY2KlpEFQF6KYl0i*!Zm78?*AZ!8kyBf=4jKzdz_()DtHoXBmIK@lI;v z-JFn``sw+fG+v{zZoMvyG`_E;q7a90^Pm43etpW=>!!3L3s>#KD>H~EBF6H}?*7Hm zN8%EWkDIY?<1EZYlg>rE7OYhsZqwEddbS$mbn^JJkt2JXIUUIiJ^Rcy}3q zf(pPFc+V%WrDUP-+mKR(2P_iO9ABN@TUd~R18!q81i!+8c=3jB2$ORw)bD*;!ry%t zS^`kUW_)`m0tmDMK;y*ZVi4$|X1V2RDH@nhF5%^&)=ov2+a`26BpSeI|WvU?}4U`#s`!HWx-_GSFK5>%PnJ_D-dKo#vFaYCs|aI z;LYM4+|bKz>{Z!Uc~js?&ipw?U zV0@=(TScMqDDO&w`10t2Wts(((V78p{(R`(ADuXmxxZ{f{CE4lCiLp;wg+7fjeU!+ zitE?4oVA3WLKO>s7b(+GX>tk~7{&*1FnP{a%o8|Hwjer}K4pRwQnx%W-bqqY`1sjy zFCW%PN*H6kcv+7^Lk;9b7I8DMzH7;1KHISQ_-TUJBHh0%60h$VpP|8*&`%>LFPMN| zXrRZ@>qqm@_buw8Jvlk6+T}!FcqR_ZY<;kw5Z9&WNYodto4u)7<-L^E3ttj$k;s23 z(5EOX(9g(EWs&QHO=Z}>pUM&>=E>E1r*o(a5B)fYdUBXVC{^VmL&F&z!nxgf2lEc$ zKVaY=Zzrc^W(s0TvqsIji8UMTScc}t3k#v&%6NF;^oTv>f;QqCWj$wh-dwM$X-cEK zv}wx#1Viz4A&1OZAn8${npv+mews1nOP=_$9@+VRrbl+1kAjeKv za3lklYYCd8s5f-#g3q8=w6q%Dk6^^f@4h*f(4s-pu2R!rh%NA1yyn}Bn)sZB`x{ig zFl1(r&9$qJ8WTFE-(|Y)8WcRyMw9&&0^(%ADjaYzYTggbm46`?5btT{y_12QESG&< zRQfNTIGR>Cimbv86|xc$D-9!dw44t1Y`1WHEkj&lEnT=!wttVg8%5MG&9591pPgE< z29Y4$di)K(Jw;4}(lF=RL!j|M+}=(z~J~Q^SfV3C(eWm)rD3)x+YtyLh7sah=C4 z5XHtL=&5mY-=gI#(8KE+o)*rZ9UKW8 zSmKBw(h+T=Yjq)!jecY<1Hd8~FjU3Armo{QqE<;9)e_4?o2jMNq?V%jwG_>-&DK&h zzjmjVqWQH^^zNCqfV{{p24Bu5kv$4CJJo(Ne~~%{MKVKZZ#hgt8;w$7LPs*^LL+s~ z=PuL0Czz1&VK4Z^;x&3aneLq1>U4|y4^mVb(YEIj4}1`4uC8KU3i5s=d)}+g7kifd z)DW0N3CP`80*1G?5ZPxX6-2ambpgoAf?)NPaiu4(`R2uoZ`SP>g=(XMJfVo+d98x} zJE3ML^k3DgcO(4UV|)+)hU7I%uPn%JeB~K{U_`+a;Uwc8X(GETCnRt1e~DC679HG` z^c&tA5mr62Druayuz;Ha{V&4#=~0_^l21wi6i;ryir*z)o^;^rkl0y^cUP|5yRGo! zs9_7gUb2}aNR(XkenwPmjW-uccHUTracc$>Eu$ohFGUlscfU`q8Ey-qPif^SRGEwS zx+1!piu|-18`X(GZ$c~u;#i9X4(u_1y@=?BAllODMQiPdsnXx61s<4Q8t%;u!*JrJ3a14g z!s&q%9ve%}v7S93KOKZBAu+}lNg(mz-)ihXVWl}+ zNTxTuF@9DY)fL6wu)4+_*Z~jO&fY<-+Nz8OQH8uUT87R4t64W8wWY>AV&v4ZLwjtY z`?#*y61r)~7?W=bcJ}O>Vi6?O!=NDfCpGORj1*f|O`9|!?mGZMnF3#62A9aUd}UGn zmL2_jR^Rm|-;E^S9on>m9ZY>tH7RvzTt0xHEBT8R)V~Pmcloxm`KeYdU+C6srUp!y zlvZ`zl{h-OeZ}6W3h84woCwLc;Y6TBV;YGqk)sBX*C%P{>yyBHx>iUVb?^`H6lj4f zC`T}8ZYsBt#LAVcZFR~gdJXmJ+HviseP;Kp{auCBo=v+5rsq}Dr>`A(cFd^=U^|!G?mj=m}U3!hyRNpa^le69DCPad^?|2KG98Ux;KeyY46g z6rgKl27QYvd3zP{MxDM^ImS!o(`y-at;Vj+*tG*$i|rVUyC~cHlZrk{N&pBoNHQ)>{K^g0(r)Ww{DtlJ{6Oe)~9)|5vhGz#H6M6ZP7brL|^nM#+25pc}&`B=)5=JzVKYS!AQ%d(!H9>@vp>EC4gFC$oB%68)V~4KJzzThUT?4l zz9{@2Fv@}!Fn199o)`HhyZ{aO)&S^n~k<39nC<0N(WhOcC~tL@kMDAM~J&M zGS{8)CAb!n-w4(Vo=$v_8`;!_1YX~HhL3IsJxQU;j)~qwrR~$2w8iJK7Fw=$Z(+G1 zga8P70U$PEb*fg&!B&1JwyHVP{*x+2Wdhjnm*G<~cp#cuO-!lvTZV1`di5ge8A&ep z3iL912{C!@R$uq!QmAQSTq%YD4`&Cgx1JL9REwah8!cMJZd}@dH+kPX82y9SiKqd3 zWcKe9;pd6OqlcuuyR^R?*n2H~;keQBH824$*TA0em%%%_B_=xeY|(y5*UjB-oc;4! z-jw-y%Wibr3?#}2s}Y#>8Au+7lQB9jmr!!CN>Gn0y@s-D7`v9?E3op`DTf^3L*P0m zZ-thgrk|47pQ~peiTBZtQ;rAn5+5!I%%^`)6G$E z(8O%btO*9=Ix6_DQ+l?15hR2_CUMXU%qcitH(Ps(s3|>gr6^br##w zd%6mx=WOIcfdP~Ql|VI63t+kCSG8$xYEn5xuOaMeVApc&T7g|7xSE#5atPV6SWl5w zMb{PJu{n0OprKp`rcc;0egO@Q_NirA5vwl73X(Hf%03gsJ`=(omtv2@+2hjeaasCn zq}6gIt*JMxVQ9!b8$U4@N8?g_9$xS^Dga{Av9*l?#mgtSVCPapM zdxy~rj4&9q!gg4x-rG61A842$XyhRb$JE{UB@6)GMYz?+XeO#tVSliYw>Ef?6Byb2WC zRmluiS#s#EX8|ZBg_URrC@Xh^kSYwDgjb}(#i_98wBbT3+?XrYI(Z&%gPj*-Lvwk` z&V_!nOq@L*@9;h0 zIQd5y-}+8+7&`d$O}G}vz_lpC?UxrJ153hisPXT*t{ZfLv)KrQ!_W)o`ZVXJOYfo)N(LZC$lj(#STy2UE4?f>{zsm8ocAC{k`r-v}go7m<{cJ}UB(alAq$d|wN}BXn8%j0?^a_Or>Lw!52uh;il`%kmzsow?iHaxj?ihRMrsh6wGXrhRk!?>uGM>x>e*!0e3v>GP!ij1#2b zwLq)#l?01rQK?_fmp0|7qdnXtg`0*ZeR>=B0&ksnkT+44e0VYrMZ5B5bLz;dBNEpnj_7Zh0LwtT;Q)dG0Ejo3 zH!ns8zJ9!)jL%iKonEfUwBC{FNqQ!p^gLRIVMPhlk$OxF;jDNB@*+=kfVczDk58am zYXA7Xsk<+kpvNDnLXsXY!M|L&_I7@@-fR{GJ^tb4)ypsxCh9M!l>pANjIBVBDFf!y zr6Kk&r~Sx!C-j-bKan;xS3|FKf*k2_<{0Q`bc}KoV>kodgS^X#i=1py>o`S?B@HsR z$}lyxF&N##vqxPd|KRgKpkRKCr@*0jHXOO*_@Q+;9d^LmVTb+;649GSXD|K+7g#ng zTbL^Xks`IFiOl*9BYQ5AtV=%y@$N^dEa)|yU90Bs3k@knmadT z#Oj>K^Llq%8lTXnc@OBj`t@4!f3Jkj)M6#Y#?8NHfz zOYc(lnWrQBK4bdtdS=Q$Lpv{2cUQXVhK|WcMrMv5j;5x>j}y*q z9Fz7Yc}i5oWUoJeGL%iOj2i7cxnYL!6rLB?cUvxM(gg-B4;q|+9|4i(QEJyo$AJKJ zpad|0b#fSE(4n#yG6^iQtE!{(>}_oBIh)Xy=9Z75YAAk&4iEF5=0Sl2b$JS$F!L9z zSW-gi?vuj;!;2jFWZr`mZw5E?H3?@fmIfRO2nU@2y9piy=L?!S29L)#98hfBx)_~ zjt40wqvit=Kl0y;t1fQdebuUN%`nVqo&%>yk+>J!h`S46d3e1sKwtsU z(Pp!%4gnxeMoNY@`m`^~Kg zW>RfuM}f0AkL(#OC`|(s{H77v>0+CfEfwaR%`;gXO~UUlHFe&7t658bEegLBm$4lf zN!`4>%Ug+zhHxg1!>Y1-t=7w1A^*}oOZ#Ec@^|e!yjgk?|C4re((*SQI=o*#@rDV#E$FYG*LfJT7E(^t?P>TDL>ZH+SR@}b=kMbe!h9u_ZKc*gORU%7no;VzjW#Ptk-jm zX%|x-d{@@v^e>h(j%inte?9J9*8j+z59a|an1)-Tp&Bos2T?Nc_TiB~9Kw(US2&f- z#U|5GDgs|qQnMmk5|&vtt41x?N@b6)nP0D&u1aK|LA^I`_3Wd2BYCgc?a|A5G~;xN zgKb0?;SbV|3S{P_ibiI&E17YE8qJ~xm;-sh0~-Y1|L3BZaLm8rXQXy!pphzS!Q=tY zX6MIe!G%%h3h@(@NviJct=Px3M}}}MnH%BrFAu1c*`R%kRrOj-NDwNGYS5;^+D6e0 zGAh|u8be;*P`g>t%S~F7mxX?{8==tlC1#AN-6*hQAZl3;Kd#*vg?93v$zBOUEot4e z1z?GAQ``qUXw^IqTa}p_D_VAS&8J42j`t_KQo+d(NQOuv4?Tj(&6^mf!9uWb)ADR_ z({b0JZYQn}%`2KtdVqh7{gBYQ~-r@Vh!@C5Rh2(sjKRzH1tydfk*&^%j5)*fIX-o+c`L@ z{vBwGediFv8lV(J1WG|fmZ5Dg!mGXDava|a_l4*2e%KNc*t5l8DT8hjb!IEcI{%tV z#EoDh>?Hm{V`D%Mb~1J)U$F&1U<6tLABeSBH4P@2%QrXs@Vaq{UGH zh?g{!nWhEvYqmfEEaF=U0AUq*omMcLD%<(`ad`uu<8b_PA+sPpJZggz(b*(J=6{lM zQ4|}EU=~-=CU;{#bDAV{fA{XgTPM%*95v>R#ey1{Ou`R+lC~fFDxn%K7~IEPn$@(U zeHC_)K6%sX?LNLdLkSn%<#I=Yc(0jFNYR6rbUa@vGxO=LP*6fF;hgn>VTas^6Lfx` zgrN{&Y}&O8Zd;o1E>)UUGCg@RX*21<^mW_oye|z9ZMpQ4%~DyAC%Y?}iMz`B&Cdp3 zZHM>MmmyEea1Kp=YIs1i^29)%80ZtXPv%L_QbP4S+b%2nL48-j`BeOc*-o1>5Vn&@ zrjbqLi(R`mFKYCaeU-2J4uO~0oQ}?TgK;X35T~(eov=Z6>*qv>++f3>csn5 z+m%7KL&5C|!@mmmP`82?SJ{eixe||qO<>2s>cJ>#O5v7?R5DK^#2$r#owQ-_^yv^& z<-P;y_UY1oX4Ac2-zkdf%$SCL=mVR(`;AHdP>&4J)JGG=BhQzpmtEOZ4vXbZ{)J)VDm5tV`2}`BI!54r<3r1ansU-cW~aihRKJvt*T|0U7(rkPur}d4EBYT(K zK6OJL9rC6Z9Q(K}UWAVHX%5A{9UArTJEU3cnEoBxb#2jcWXEai_RZ`+Vo1lXgX%;N zYd3adxwwv|rTY&y06-7A;9=S)(hlGZ{K)EzBpP%>&>TdAuR%A^6Z8S`U;r2bMuJgb z3>Xh4gXv%v{2=SHXRC$4K|a0uvuh=GtR%YsTqq}}k0O`U@#KPqs#Gn|!Lgx8vHAH`3wb(^NLXqjb5G@^jPKIFHfgPRq~Dq@$fXUYDDdU+8!= zC~MZ+!!1I|Ng$U{S}NVj4;kTBSSX!6bt5E46sAB97U&jCBJN?;C?_5CB9=o{g9o)j z)f=>W>_Oip;bd6o>?OA_tH(n1asA@QqA`haV^PDyeTH?cQZ*lEx2RvQMT-XYnhOVe z^l#r~a7<#E>hDe_pOi|UNqRdNRy!#@h1HYHJ;o&Txd8Q+?$FE919~EdkB<+>jI32V z#{73O`=<>_V*lXvK53?&BVsd5J@GCS*1UDcAm=6(mceF?+q7vslwM#op4=v;U5D<~ z%bU-^ug)hYpU0;(fv`l%=FKVi-e&XO%^li{LW>mk?_CY$_l1*f%ap{|%wyi0z21#c z?f{TL56k!3nMRDQF2f5COG%M9DyBR&mBC z2bA<=2rHtE+6xka#L|2pW`UA;jxvoJf)xq%VnJkj6MckZ=KAJFqHD=gEqZKRFnblc zfNGViStF*q@%;JoEkzNDqNcsMvbnNw+S+A6W zu(VUIC>SlXoPzZRw2SWCv;Ru-tdWs-;og?8){y2=t-CfKG%F)MZd4@2f{p{ptAj{q3QD{PFRTMO`bBZf7dR#-MZ|A zO*U=bw0icM+}w3eDe1504%ddr@Q-`-R4x)n*<09#OmptDyQ z?R0zzB7sj$wznZlfYgXC5_mcwg+`La7e>7zg`!e$G_D%3@y2hvPTs&*@$E2J>dxQz zPTcB{CDTT)T#Q`mxBqEd?vuB7yWorXgb*+Mw61^GTB{GqnWMK*WO9#!=fXPDA8!x} zj38UKuT+@@Uzm)tS3CZpPj>sJNi?tlvAE6~yx6=Ex(WI471jFBJF%K>t+ z*0^QCzXDx>t`+>%AWtywe>B)Qh_pqjfPzYAV!Sc*2n0$(auhANyl$QqQ5+ zckKMW^Ogw{H?Em6b#3tCl#%o1nMN!SNVU+g@Ws6s=H@Q!wY*Ek2Us%XiQ=BX)t4XlQcMsr^8{`S6x5;)cKxL&YksdahO7S$PqXVtyDZQsRRa}&~*OwCwOB@h5av%Q7eq&E)01@x3% zTy<(qYkS-M&M{6wdr_r*s|lM!6k}7_Uy0kuc8(g_MQ3}pnwn}_8X$$zX$Ae+vnERp zL|w;O^5D(NaAG{Z3rjW^!p(0`N(TTzCoe+aIkK1`D$JG|WrtJ0mq~sp-M~9T(U2#yMzxH@I`qvL^jgr;l85 zUY<8&R|1v+1UUd8lQaVBEgTn(R478>XGN$)L?|+ua1K1_oP!wL(poj86IUi}CbR<(cmW_fk-ujLD)WaD|Hrw#44}F_ zVFZl}!w958dW6K*gKxuFb;AMOgbq2K7)SC+Cqkl%L%9r)kp#+&@}dM1u&HTAA$Vg*Rye7xIG&$#mi^Gt+;nK+5+!czOl%Z3KF$JQM5%>0Fd63 z7P*72R<5N0YX?$*wV#P=>!)?E1qaqV<<6PivC2X)f?PakjZTA7T4+{a7<5g7j-`U{ zn()aKeBa9p-yV*?O@l#;X9=n1DYKRdgFXxwHg@V{?n>GR$*u)rIc0A6mhyAMhr`qz zpa#Ckun^xbOd5wPkHD43f8V9EaNxsm_Uls%o{NAyaszc_(H1vvI~;sQj5D9Gt4NlQ z)ha~r{NjbbgpoTJE!+XcEc0J`zrV6u@H784efg5&yFm214v0*Oku)WLQ-%R`=-E?Hl ztgSG(>!9vE(mPJsa%ySv)S=xv^#8i&gf25Tbjlf$Iwct(K#nd^Pe#iHc!L45#5~`* zl1KX%m^##oY@(>WB4|`HUYQD4oVz!3IIKF> zk_Ky!U%q-azDWTRV%Fhx!?y-ue+N`+@_-SOA&b!!M2L0BytsoPa_ZVC>?(HDLg1w{ zUzF9AHw5f#)izHJBS%-_q=1Cty|vuYE7lo3^me;~M$Lc0e?ymFeuU1N)N|XnoIAU1 z=V|1$=~ew*%`dw_!@Hz^U>W@TGxv)R9$Zbj_~_wx0D+|d2(Orq<3U;KJ-w9iA>jai zBl2dQqry_}Xv

    %b-;>s$s!}glKN5aOau(x6k2|u*STcHQD$Kyn-u>S;yC|+Y93} zQ$|izq?Z^)#?b`?Q0Y~oq$<7Kt#PoQNH51v>?>b>96?d2`O`6s!mscAieH+3n{$hd z-^g>@x1Kw{Z3h{@*Z4>wRGu?dr4jX43%A1ItO=L2|%6>Vj; zTbV2`0w0M@QY{TqQ_;~>n*1kb(F8!C{6(o7+aJA%PN(BfGHzc4{OdBnG6W)Pg>vV> z?kMjzC7h&rQ6A(TM#2;DL{6$BuF(zGa!e&n@)aI@7!H3yfo4(o$MO(|(zBMWrxE0l z1j-b%WqIoRFe12Vw^2V!SZZ8c;qQob$Rj7vp_sAdew6POVAZ8%Xor~8Ql2>=m6lt} z_y-~tp?Y|0YU&1fYLTS?m79;M=HP*1mW5=%AGN%*P#^qPZE*#aWJ%{{JLZ%2&Br6?6l+eC;z8h9oY(Va)mLrdsXCFz=GH(bAt%;L{MfBijiG|h^Z14 z6ipuUhhvyVTXZn8YV1~c_2j z`1Mz(Ba5iChvb9+!dbF<0zr!GZ^e7TlC%PB(*;X*hq?um9%&84>K4m=_!C|k5$xxS51?}?zi3o*?A-8lq8CZB_ z9G>InD`pX6ZGY!3bYz>7ODi^uTHpv0Wy#5z%_AFGiTTF9EP1R241p5@m0c)MYt)i+ zUF2i(cKnnRLx|iw=zS~m2SI9WS%mtxrjO#`sd%^`p->u@W!6?bBKhrk+)Obez?J#o z#2=9#CQEFpFk4y2R2u+5IKniO*0RQ#I$Z&$lW-~?=d6_&!y}I`r7TNyrfe{#s19C; z9-GHd&IF;QB^oB8TDW|C4Ez)R5tD#x&^1o_`VX^eeLx@>SD0nur6x`C?k}D+73k~~ zNU*F|9_fwsoL%*SdZRu{AFYqoYhw5WF!r0SL5;;rb9(2_(;DXB*o3tQVFFF>V2~?fc zq||6x8hkh^A~r|6cWh6ENuwU7-F_-8V!e(2awV zm3NZ4YG(ppw>MC5RCYX%eO7hX;37VB(bwzcx$F2{>W{O}{^ezIUz4-x1OgZwTfcg} z2TVF}8kYPpcIC?n=MGGrckhRIk28PFB+?s!FaR{q#4MJ5HcA#rU-`;&>IUI^%zOUa zcubUo4ULjSt1$Sj&&@kjr24XcC9@QQ@ua1f0 zag;pCn0QfsU%fZKM|tg&Cq?+e9xY1hSI;7TNAfimLg9wO{rKw@!3486uT;0=;D$%f zV;MGCk)`a$rFaXI)Q+I73{?gmWc=?~uslss5igNyxR%8!CY+LrR-5n^_%+dFZixn< z`n{eqDegsL`2rg!s!Kcb9wr+Iouf^$I>*A$zCE3E9&yhPmem|X)w}2>WLOpyPA|HP zZ_=s7vRE1~U{gyQ%O(}O(iT_6d15Z}{df}ZkGq#%Mb?V>6idyEL7p&>k3VXe{h&}_ zX_-{l(JW?ub|WL%c8ySKA$dfweLS)1I5!V;d6LPTVuH8OdK{qhj<3H1_JTirxP@E7 zXuKcp5RT(aJQhHD3Q4cnI?R!w-kY~)xmYm2L3!(fHv+lkO6*%t$eG>FSQz(a8{#WEN2H8_NSRQU4aw`nJfhrzkAQ0&ycn$? zyCdn63Zq|OxG@|l#D4Vb3C|&S*7ZYVT`1%C^Ye0G3ZSjYVHRM`ew-2P#o0U4f8#p@bW$sg|!&Q<*Vx%WNRt zvv2^xDgZ=3wvQ7?(R>$PBP`xs$Z3RH5vkyVSS^exG)Vx*`>HKkEk%ojB=D!E&Vc*p zVISnRf-VX%i!Fy!mL19-5b0U0qrP=FcYaiOulgr0TCy~Fg~-v?x2}rT$hs)fL-b6= z&TekAbE=}SmhCGzc++trva<%3@k?P46uO_;iyG4v8bt8bfXU28vc|)c$DP}5Mc!_J z0<{+SpqLT>)D)GKpwB*pM8cq%xMkg}ga#!Yy`t)MFNYgs!2@5XpuOg=GGiQiYwNZX zb^s;^^2B3I4m6SN|AidjkA7h5`XO3ygkW|0FR&kMZbwi5czQl5$G?j1$zx;CRCZCu zpqQ8_=a6u=0}6aFPqZ-?ZR`6Bc_t<>+4Qphs9d2xKSPm% zswK_K>VGK@ZCzlh6pSbw2Pxx2$y9jM1dpaFLqKop=xf}WXPd-ybZ*6uK8Hp6uct!E zDB&lBHD>ez`yuZOl=fK93u_btA^_rXHYT1#GE0h_lc-L|?`&Qp5OutBL9{AZ;KVy* z+LSaal&ozc3!ED4)cp;xmywoJo8y@RdZ#;q_ zEI6?#XN`NR`?GUDLQzclDeK}3cbJqt>BqgHAA+ zGt_lDTWhK0r_ss6g1w&$^GdggSMWCe`*mvSYZB)DOqkLDf#neqK+oU6GB(~p1lj^1 zTqA4J8R$V@S?leidPF_*dH78+wbtAe;zKthS0n>EYL%bjb>0Z500x*g4n0U8f@$fG zw$Ly#lbGsEv)$vE97h$I_ZKwwc|kD5vOn7Jx*q(pmJP2 zCw;+g+0M^j{)KclosEd^cI| zkOU77N{Yhas*;AibiYHASOG_)svk+&Hp>~qBCch@B(;mI;SBU z;)_&dhV^(NH4@i@QlJXRl>H*AsvJU<^T9_DtF5}BBz4G0^jE99`m6j%oUpg?y_CwQ z9*)v{2_K_vZCqLkj3OKv#f6TRU@XO+v+}N}u)J#_Q;=3_bY<1p_4ovdF~R2e5K-~jgnbZ>{Y7BG=DsiI-`ozf8vNT*AorE$^!5vnzv|M5tZ{~ ze_{dX9D(9?_%G|B8u)ssd8R27;?EosQ&IZd_&I6BAgF2g{dK#eM`1g>clJzssKFmx zsufuVq8*FwH2p6yi=VJ?ioi~BMe>H4M})1jZmDV2deuImZn`WiHDXS>mdmD7Cmle* zvEVPMp}2z82~Ch)!opPqd`T{TYCAxVu0TbHi5x+hEoYT0Pe9{Hld$ym|cS)bg{jW!*&$dU4tv`oAe>w|m9l zOzo0q6Y1}%E3id*#PF;&ZLkb`6Fi6RbbYluz`tgtTzuwG?N10PusKEa4+oEQR9W0YMr zFh(hSQO};nAEID1Bzd<0l2j{!$HizxZaF&gkwmSI?nsR?#*8=+(wUV*N-}qUNm~Fg z<;C_Q7fm5#CX%L>egd0;-QX(RSAvUif@2c~ovG4Dd-NOW@B#D@JcHJE&am&C*F8So zb>4u^_8FZU7Q$x$1l7oz&LATb3U^ME*~`V?&AEnHfsb zkaeL!q11;belg8mksqNf;Xjm(hX);252HtvN3;hWRu34%F%jBONO;hrke>TN3iIbj zRsc2c_G9H8twI^A!R=huEbTqmd079`kKMOy+_+iyfk3i?wyKQlG`AJz)2qm??$&&Jg(Fs) zJSlDCh~>l0Jo%oMjf#uPx3`-XD#A|k37=)*4EXP|a5@*Va7H`EI%@tU6K5F3WPN1f)PKUn zIRoD^oh1L@!NWiQuov&9RRv&!$xG*r$GaXrd>9`ekA|OHxAwFUe{puoh&eRc*OcVS z&Jcn?I2a}e8A^YeE6kVHbMa+hPiXX^)2BsN?rruKjb4UXz3Lgpz-c9XUDRrOL5R=p z`ZT$V&+Ve+5~1VQ?P9-f*Q!_l6{%zAwra9w<@j-H2lVgQIp%V6cn~$KUAIMxTD>w% z@ilt-l${r!k(p4pU8@GO0HRnMv{&$A8F(G6!bd(|OuF0a3hA*ZkhDAW@6ztboD`;fP5?%j;+EfNRZK9EKoMYp|Wp@lDxe2vCVHpIxg#3 zi@u!Sh`4>^YxS)FU#t8^t!;jzn%+3JGQ5nZm2A*6WA2nFp zr*^*|K5fLP?DT$(8}4e|GsuJPjb5ZDi-Z!u9Rw2H+(X$L9%PKHwI3f|gHW#R6f#cm~~#XkF7*1XYa-KSUCcy z_P6@WLOFky{On&&wYLHhm;4-t{$27jL*??R&uDbBI!!vQoG@u+$EJ0f%^8(Gw`1a( z_=I(FUOk$%{JLB77F|%2Iz4>+`Zh{1nGzcH^Y!gsr{Bm_Tq!ELO}$3VTfr^0TDAPD zcGDKDdU3%!G?w(j1 zl5#y(yQ)_Gp^%YMLQ%3iQIYjc$BmekGiu5_bnSu{^nj%|)Qk1%)2?;zSlFfOypg6= z8|F5-dINrqAgWU-V!(i;RkTLdXtV?URvZ%}VWnS=`Y|R(0pyAUQ5(&4^2inVfqslk zQ=9*>0-{>F%UkJV6pBW%h*o9KMmcCFa#ShI>bbd+u`_}w5Dj8M637I0e zg|U~xwc{v`y+05@ZQMe5A+`Z!K@HFZtdi}THd9wn<$QXroey}{rXuA|$GDjks(Q{+ zvC|vWEO%Esy~@NMY0XR&=}Na&kRAJ&o+q9p3$1q1Q%3&OkoN)WRm03cc2k5h4~5%~ zT8bN8+L6R*jmE%R6>{($l%8pAPKXAih)YKX$fi1Up#9 zcN(x^LDHT?{OHogjcKVH){IVHE8Ofk)4ltO?w&Q8_g*xub@&`B1u__P?u^qWLhuNM3R^2Ry`R2~zI6L7K;R$%;(2K& zt54on4pea4fmE~QsZsgJIp_cIfvQ1h6TbIRYj_8KAxBM57;e42)T+lH6V|Gw!)K2^ zOizC+H6Gn?+Y&q!#_d18^AOHLvn@lVofl7!+*7U={(J7c`aTW!4WGFvabfn%6}0v& z>B%d`I@=R)m6?p&x$uVukXCiHYE=+d6!wd);)=rl3vk5h=_b<{IDZaq0q@R6u9m+w zz&sM3#O{{eKpmlj)^+r_$z?VQKhw5FL4W|62Sd5D2dZedZbFUpbSJcBwWTV0lY>rK zz9OU16>YR0jqMsAG8(P^d!qr=^fKknK?6QB3Z>mlCI@(FIhIh#g-EoRH9qDJ@Crtj zlWMG3^kOHs7s+*WRFG(nw0a4jHNwZ`ARpESI^NmG>?2Jh)3dvlIVbGn=BWA5$&}C8y zuVwMew;}_sn>sKd74=F;xG2#z;thaUi{&*qfDXl{LaUOWOH8Y0PXjqo_R;pD4W>y% zh1IxO;s?1G8d)x6WWXPX!yD-q6TJU7jKt?CmrABJXRPNJx+W4;~(f&*qe?`|csbt^jKpmy@q7~N~)3}Ndib~N#=8T|r zw+jsmM!C=!p(cj3yvW!jgB%v&9g424o-lEBLY&+e&lo(Tjg%WZY*=igX07U-xeNd@ z?-TdnE1Gnm2Yz5t5pgmtt6>*tXS9p56Jv4()yk);gR97+Iz^76PR}$NU$WMW^}M2d zX|eAlUs~%s$Cp+DzvAlP=(2QQpzsQVd$ zP>RzjnL$KR#8+Y(1{vFjco`xa^k`IRScs>g#>|nsx=6j7ba$)n7*W=>QI8f5HOfN! zp8x_q#B0JiO>dw94xkt7tCUZyBvnbZFH};M9wYMCkbSMkmpSG72$b7MVJDl|Z08}tXJdezp zE>0bT#2JSKjUvHSu4^s%ik5uEj&WW)(8f6g zIv5?I9HJd0x-@8e!f3N1kU8tnp_$M*1s{pqGetbVefx`+4*&v##rwh@O&)2FC+PDZ zw?_k6-Za!G0#T_?A=@$IKF>vCUG`j+j!KIN!7=rVL^ARiFJ#UlW)P6b=OHL zQx}N$4<3AxGE^!N-nvD*h9=jlN=wPe(HfKiU^<`;67oOaUbUr;g)NQNNVKi&kXFZu zj!>*al0zmLCxzT`ud8dItI<`6DWZF4nQR(P5%ksAr2Z83DAIPt(gmw_%qRAG$2vjA z79sjzW4+EbE1OD(7{&YBwmtf;b{CHt&XES^`aQcC!wa(xrISDlB4pw7*;{hhQOf>OukaQCFp($Jc@p;1rgiR(rZ=3_2jm}Zd(ay2XpPV;_2(8t5Gi30VXzsY7 zfA=mru6YFQQ4-S-q%Y>Dw)2e>;M%qXc zU+#>u&~#}()WS0WpvAz$%6y=zmm8U4r9$aqv{%}$Rw!NkX@yetbA!n5EoPq!rl0$4 zy^CJtGmE4>jx`-{Na@M3di|N867|vCsHgIcDf@`Lpb_ zF!dK(qB&?R`*fK4mw8p(U#+t`mRMJBrBfh~=s!+Oqu>iS@%oR>Nl@zdfezIZ-^xS?A2KlE4d@s-Vaa8*48F^Pq z!qa!(?SZW>)xHc{?KS_l@5mDTdtRL#`1h6aH-#-PU^Vq(WtVUR?+yN>poF``yt*!Y zQlG@BHFB7Xq!!)_;e6RzmUv$Z8NSpNmV94eUvJcm%?I$!^>8ut-0_5@=%knYF>m@$ zqb9ysH2!L7JPN_>PHihyKMbSu4d21m2ku^6yJiKxCx`68x7W6;22F_oF-ze!vlP6E zj_j)N!njh83ctYqV;xy^rzMd@EmPLqiL(iX8;-!mM`6_+a0|Y00^ft4t1;OmZVz+LYP$(PT?to0PuiCi zqcVP)HtE(FH0n0g{g@8X(Vy_PF2A*Y?{fgQJX`e=Y=7tw-gyb;!jdbO;Xk&1wF5s` zy%hTF1PZbXO<^345&tp4+DB%!DXDliJR2yyT{HMR{nZHoh(Y2iTc$Z>bp937oSTB8 zv|*Y9ZVJ{PRH```EC!ipAny**3nnf+lxn&<=J541xCJ`V4&H1ru2b^3ZPSJx z8?=A%?p-*8q9^fM#$f0RddQNBTXZsV5P{D_0-V&6piVrK`fB2a)XxS7+dQ)^y~OX%M1-toPMQGL3P z>f*iPD$-)xh)=PWjtw$RRdZQ%SGLnQDG?u}#35Cp#cC?i;!meenan>49@EWl(d>%- z;_yD$yeVPnyeTY;rn4P~R|#fuCMZd~QGROOMOPka#et(G=&C4%u4=5uU3uhMEQw`F z=xR-3NyItxLRyU_tA3LmBM6or^^>lRJ2hb3(`9#dmYwlq-kk$W`%f%a8m>ft4aK_t zXvELi%U(|&);;0n;r02Isz)-uFuYfI!FED8)g8IbP%Lxl3(JxW)X#iV*d*3{Z<3PZ z=^QN(^U(>-cHj(3fgVh&ad5EJrko24hPoN4m83VyQF?-0Z~#L5o^=u`ua4?5WDHdcho)n^e%@IB^zX(V4?DCe`{03BuoiS_*Ja%O8S|b_!9U}d z`1w_Qa$8idnn;|KH0bv~9`D_F9{^a8g8yNWz-`JCz12va_bw?d+KSk}if~Ue0vS)(92-%6{UT}QUoZFtKH{x=6e7$tcsYmvP zZ+Ty`H+uNO7!JE&@2gcaADy_VQO-`nfe+dFNzQ$CZWQ6x3~+UqxN-CGcRirK>+JF4 z;mE_s1|RH%zdw5B`~4Y-ld8@b{gb9Atd+2Aqs1Qmed}7c-guAQhU{%8s?qg7n#@85 z8D%$6lITm$%9-G-dT#mTR$k}x;&ncM8+}PBfvDC%bpMzI;vVE)P0YxAv~a$KF(P7ek*gCZi8u{ zu-aSg`F~DA^R-vs(YE7u!jEK({XjU#ltUF8BUF{6e8c&2SBiwyS<|{Gy-?#NTupl~ zSvECoO?YW&hjp%&uhTeTQ9cWbfiCnWk1#*nq4CDV{dgZ zah=oI=E-P8XLd@lJKH15&vuU3@*@4=whir5?4a}Ge;)4G-!$^(slU?>EWO#QLQek` z`%&B|~VGc+DpAA#QAEdVi;Zyi?kOsBOelX5-bL`psX7kURc4U?tXW4|NZ^jSz zc}{t`u*Q;CS?_=8Gu%1;(Uo?&bxKX1yL|odpO4&2+py@D9%WZ1E!>QPA%f-htp4!q?(5Pav5ofa z?Y|0^F3?_navHu(9Q=%GPeTDfDbgOG0bWNb%E&}A52lJMSk3GRkSe=Zt)_B$1m@Fg zC0>8vXOt)Q_jG11g#dP!3wYOEu<~X(ddDPcWqx)U#6^XcsYLeGiLs^iCg;3?6kXOb zyo*5cFbX;R;fpQ#?c%!+Y?w1XbH&>Buxpp0nJ2Q+Ry{a09xv|Rq+V9pTJ5_I?B1qD zjC;=H4pUk-7?@r!dFIT-$*HyRsxcccu05Te6`u@;G>GUG)h$_QTA@#;daZj#b?gEl z5LM<_XV9%U5>aQ-u`tEc3QYzXg^9pLXH~KjXL@+iAeJ4qC?#eBX{$vNaTbQ!;p3Ea zcHzQQSP#vJ$Mxc1fw7wrRkgfemaYo`(yuIk$sJ6WB@a&}?T}~DFP3Uoc6AUL9MIM1 zQw-Qjc5@Jw)LK5xiPLChcL!1Rw=h2e4cd}>k6`=U=lmFl(h2 z>C9R<(h-%zHT%Iv_^_B2hZ7&5R5e3=w#t9g)r$Ydi_3nog*zYx@QDZz3plDkEPJj1 zrftrVSA@bJN?^7gZmKI|Y3i>hZr?ulLu%^v1uNEMi&-~?W2*`K^IIVryN(+^Vk*lC zIVwhp2N`y|G#DUjSdEKZ4P%_se8gb7lcu?U!WHW4u3?NQ>@L@x_r-@OZ-#2zm0!#Y z<75zpg8`;nMzV52${`Lty`fr)*Z`Gy?6I*V{bSvT&hZ&p60x82GCIVYH}pVuy=If- zkH@VnAG%H0aat7S{X;n$+f6ty`=1HKl8()=v_C#VaBTnJswOYV{H`I(&Suq3SCIMe z0Nx-=7JPj9`B3C8XEPNa`}a_Q>>gyMJRl$R_fp>SGTP=s*s+?q4(v*~=2T8m<}XuA z8xjUNmaR&C`zv}-QsD00DJ^gha|$|OX)1I#ucwSuLie~!C`Z+>)B)(L#PLfYMxRD=Q-Ogzy0K>uT(k=Y##rY>De~YiKLwS~curd_Ket;FBCEvDx1B>gD03<6aRN45E z50!(8x_#OuK2b*azwHtP4V?Ig6?q;VMr3~-S7>EZCn6C?MIu!cQgVZ{n$2pkcN{>Mh;=}l?@n_A z-Gk9(^lk`uO9P$8=nC2>iUQm%3^XY;#nBl)H_PWS%Mx*dIGR!$JTs*Rr_LEazmCVs z5&g)M@@w28d!6%|l;?o|VzJfxRmxXO{IPMzNO@;fUgU{md@Xt0;SvZzmx#wh&@Bvf zA4Zqast|OdfsO)=67bPd-keBG!85xl4ZWqzqFx%G#nCM5iLCS(bP1gZw0ROWs?eS* z(Vd~8LYH~dLb&5K`a6l18UhUseYDnmKWe(Cs%eqMHO=P`xC}3oc7vU9LnOLDx6mPC zh>zwunU8MU2)ab<2|;HW=mCr_BQFHq-avO?bOqIlkwC{Di)d${n*oj7``l7qF6B$` z4)xRd8Hl&S?BSBZ5=57X?|?S9qEifX4@Q^Kfe`Lg15H3fLm%yVh@ky!+!0bfKtFS_ zI07uOhYS)l%N)5Pe>3W{4AO7JM?^r!UM}Ay3=QrpL(pAg(ar%zm(lGZ=ry_=EsAWkPn7Z@ zx(6AL9t0K)l)x}uUh6qe+I+#SD2Of*=ZB!%$D*ABj4q?AL(m-!^y@&Q1SDF@y{$x| zhqGVpYoG_Y#M>`RQoiBbZ!97byBQOuk`6#b^0}|rEak5ABeRrw1(GGUuSk#SEB--b zr8#SWhAuu@K4$?@WTW$$l#kMNI-laf5^J_ftIv_0h0+?W%l18@06MD?bcrYpLAQ%V zI|mqDMmL0@I~eHC7+pcvh3MVhK)((&axb}k`2(_s)BZjDp< z$HZ1qIqvMpCi_I{PW@}{W2uyHMh+=3c8{`i zv_D$Mf&!S~aQ*>H4e77cuz+wuFoda*L5a>$ub#c&Wf8aIliTNC_Gsyz=T>Zrv`efn zwkhssr7v{(@cH#O*ab62O?>vcvelPdaNU)Y#8oe>D0gY$iOskekGbl`3uf-Jt~hsc zsXt4U@9ny{acY)`*1t`Rqb4MC%`=i|vYli0~U1QGj=S@-JpT0vh$+eNy&dGK2-RO@zJDw|lH9UOg z&12i+dL)d}+)Lv9=QQCm*YoF8=37iJK^MtY+0tOCRxH5WOqS;95X%$&jd{w&bs@9% zRtDoL#R&9BBF)&@$B>}ave!A*siX{=UzMaikNAx|EY?z#7-Dqg-lpo%G+V9WtMU&O zrju(c)5$gBFP4`zjj+UjXWInaUIX1wogZvX?f6K`W9wh2Nhj9kN3J_~ziU=4I;{Yb zU2GF|FlSk2#0Z6w+sJ0mA+7id0_npOXXG5N`|YH!r*+g#UtW6g$CtnU-NA#KADMCY zkt6zz8h9Re$H(8WCdHcXJf3pn&-Zs(@W<`$&p#ZOw)&UBC-fVW-*egoRVY)ZM1Ftc zvE~b2t8bOPxHT=J*F;gEH6Db?>Y9S z(6@|GeamHJtOj{5&&*wzd9konpOC0nt<~h8M$L(fsc3uMydJgfWyRGiG(b;vswR(xk)L;L$OUzrm8!Owcs+2@3zs2l? z$!l-SO5=J<^zjN!J;l*JV{(3FYlZRNAhJ%4%jC6kg*QbE53H=?H2PtQKGJz#&3}RJ z;ng-Qc}9OF(IcWiGWT3>dH&1B(fuM zt)={MZExu%S_iCL@tXY+iP;0|)JTo)DCWnmv!Fqt9f1ai>nB~{?v?UW-9phG8jMtO zZ%jI!<9= zJHo7z$G8=;PXCTN?XBys71PuS)q+cPsFDj92ou z?pLgNe}zXWZxqAz%%iKJ?>^Rd(Rr3au$H~t9`-$`+rFCp4EH-JPjh=%!yMnHHbKd0 zrIh>l6Bw_we}oA56Rb-#9&*|VId+iZ@_<)b{$2EMbj^?^cY5xP4k3Q3nCaZlcG5Jq zs#ef`Q53MjnwF9pSV|Q725J(p!Wb6Y=yv9wOS{!*OZlc<2NsWs8gsR>ctrUv(K;qF z&tme#K+R)nwgo&2a~DN4k7+@k$2?0!i8z{?fhVg5akSae)Ei6+6;Fe6{2Z!4=T*&3rUE7gZkmVl=io6zMR2pra z_0u!Ut&9E;_Mp;wgVNQ#uUYu^>()!PC%GFwinRRm4Zr;iAd3Eq9f(3b*ZM&eHk_HV zz4j;~=VkP0lQnu61=kxu^S(qE-j^t&N^wN!z7g9R!97*=mL~+QB&}kZqkn)I)=i(; zAL*q0Jd9xjc_*at8OnG+`V{*9X&OBsXi;S}xTE`+yIfojZga(v9Lw#j0=Gh^hj0VU zdUt2;Mf8Fg7~pPcaQ_T$^wSd~4Vf96L=@K+`-NBOIoq#)VeJ^}?Tr2nC33w+Kj4q= zIFxWK&pDp4|A@OnVy@AcsJOzYDapuV%0%x1yDfT)`3fzDdR}0DrB{SrwTdcZWm}k` zTG`%s?;Pq!Rnw*OM3v`%yw^s|t6J1XoG1TFet3TJB>&?}`R&SdVfkeV!R>8xw=%IB+d^9NkHC1&?RCtqgCtX95Ff>Xq42fAai0Y z7P-$=xt}F-@A*f)`ufik+rUtCH8XHHYDY6Hm52i|*pfV8W3Qp&-Ly}MEGL=_tX`E; zkU3tXUzO;?oUK5kKl9N_XM3<;yW$HyH(5*BMt>Gtc8Ev~{XW+v{Vkqpo=ZKf5p;>T zU80p0r>%iWW=t8Cg)p{@MMGPKuAl{!9YALp=&e8_&px-5-zen-y*|>p_(DIEy=uAV z45CZK4M3aD%_#;tnbBo*UkG<zb;xn_%eGHAL214n5cu1d# zQ5z>!XCsPc2HhOof5`Z^?>}Uy{f7)0W-}u{!}@RCfj}hAKE@72Sxi{Y*c}KJqLX|3 zL@u{Q=Vmo56JB4H%396CoBoY%CksQ`Nrzapvyah>X(_jXjs~WhG3DY+ZcBM}7&qU} zvljxRR-|*>Z*==P2HI@b+B_c^)p(@x%89Jw(2s7@w&lK*9T;iiVoqY@IBzg|u2;b5 zz!>JeBhf9LeT-i09YdG>$_&hH;+dnL?}wqV;7E6O z>o&u3;mapSKBq*p9bjH#AW^?()F!cYRFB2b<_q0BJwus+vA9`Go(6;M3$4%j?oZ5; z$SjNKZ3?#Hmc|(Q29Kz7>3+)AZ7$Qm>|@MgdW_qyG1f*i7_(GZQuk)MXRU0fSN249 zDsuR#&fy@5GA)1)xc%%@c_op(|h zlMD>zb7uxeXU59);%0lH!eYKT!*iJt^-QM9A^W z(}FeAoHV+@|? zXvQoNtuTi-OYYDb-1wmJk!S|vm(m}UXh6NwBblXbC6+kS!x4g zhvCK&NzTx2UGWjafRos8%Qj9KIMj}Al1*RL@6*ofv0+!_!sqV4?^z)oB7Sv$oynWC z#dECpmPgVL?z(BggEvK5d7i&h;QWC$wMF+uvnVicXPX7)c0g}dEpT#X=zN>8&Q@Tt zqL`d1r6Y(UAEKRqpxgNg!M>jR380;7Mwg4c5Oi`ZI+_SHTIlIn0jzO8JK9U1l#bG~ zd!*DGh|>>8@G0bH-HS*_xn#C?!$R0q%daI%%6&V}iO~YJ(+BxIQtA=OJw1x{qHHQi zf!ymyK7Rp`a|q-E<|zDGzMPs#{*92Y)%ZccFYyjo$41YT{I4Sa&v{L~9h6~MU(s?C z;j@q(a|&GAm7{*%^uExANN02USfo1>+gFet$lvcqx+~I~{ahm5jlcg6>HNBMv;gTI z{QZ8UdlK)%IIqcc0e^oNzVB6U*G9T8vHc3^0Z8|e>F1C>k{UgU-MHNgk+uI8jhFJj zqZFSN7kJfv%V1loEJdF2o+&N3-$&yldYwk+d7F(^F45f2mbo({TfqIYMh{|cw)yc` zzEaj_JLhLzpR(2czOK=|*oUPa8&LNffPJnL*F0m}*T{v9AD*R~wowz=Dq6>F#Jgnn zi84JJ>2m2gy&2zMh;+7pV;a(v5Z&WwcdR|c9wb}P8C5BWePKS(^u1w|R$}a2IT7Kv z5_Qmo1j8j6QfgqnP41bNmMjWHa+>c15(nFDM99TbPId1&zu5S3DoqNO=xylgo5Z$(|3q^QUKcB-9R;^BUz) zaa9vU?J>9AkjRvYOt^qG$%LDo{|7$eNv2bEYOHHzCXO0qHuS0NmEAE12N?apRvqfX z_SiC!;s>~^3-J`$^Q3#^Y4?ca5AXcu@=G^9{n#5-;>PvG?oVGo3Hoj zZFQ~hx#AMk`398f10tbOube)z-*^XSN50T=i_iFcUn^k#^}ZIhi1f11zV{z8y$8>z z(R{V(e+Rx_8R&WW93=2LVLh?Y^YSTU^e2OePi!GQ4CzOSBA+=g z$=vMGC3dH`OSgCAA=oD&I)#Pw81z9ncljTS*b<-Ux9XICC1Q&e7O|!4WlzK*V#}7_ z=We=12W%;S{`r${o$Ci|$^E0_BL}Yc1GfCQxx;(k^NtMq&Z)@9;Y5)tq^Hnd_#@B~ zi5uwbkn)}Sl)!i1j)2WSK6cj`r88cg3L+ByQDZ02Uw9gL54a=55x|{T_f)$T{1^7t zo!j+(G+I9Ii|}sK7T#@IJT7AFVepv7dt`;YM^;ytn=ac5wUta0uV z>(daQyH;V`K=%*vX#kqJ3EU_-e{Zjj1@$&r%h9$2ends|TgZN0Q?Lg;35xuhYgmT7 zin+)>mbOZCloIf)+wDT}CDKu(AM}2UG{YG&2Rb?8U8+0XWjpKnbk`zpi1%rO71BU^ zgh=wa#C61d2+FjFE~Qmmrn~{omZJM4`dZ}UWQ~3|cmjkiMTfa}`Mn|gF+L`yP{i*y z+`IgK1KtUc(>loieg22&D}k<2XmK8+xdzy>{O|KjLeGV_a*sy8&u=Bq`k4C?BBwd} z#Wg6?i`_v^Q@s1{Ae}*EzaRa<$`)pL*3k zp4Y`{KeRGU;U~Ex;=9N`vd+V1s(p#-|J@Ny(s5?6K*^mmh=3nu&%t?^&#)_XvRLG; zkn&mX=t#MJf|T#p@*}*J@E0A${-R3$Iq=imQS1e#b9xh&yEsCm0cPw?|C)Q>5Mj?^k*#PINU zm*2*F_-&j^S9$x*U3^AsZfIVkHOv#oFiRy^Ag3FldAKiY<9=%wO8ItwEEQ=;Pn7Al zetC-4_20({S?+22`KjW_I-Ijv%3G_FxTJ-Y-YTVU;dJA78ckw6R;fE9oAGo{q0i+x zD9Y^%T@oAA$uyyRcpj~v;L&>S;3gW8WXxovU{N{yKpYe9!N%yL`I$>aZ`seLHaH>H zx~4J(y%AW}Iv!Ynr)BEQlh9|LfO?w9eh@l*t#vpE9nK+&l%bY>*X_lxqqRiNjyQi7 z{cSu^4t28^>e5<=Up+zOoQx6CCI9C3(@@7}`K5^wbSSBjX}vKrJ!5|k`5bpW zk4#E_bWE?YjC+lz?6<@O-D{Y>!WXLF0yCd7Lw)xitmCozP>twIseu)TDob$M#nI{D zRQQFS3%u#|TUh|S=D(l$`_g)GlyN>m^Cv5O26UbReucl8>@fbGvHU+Ue?NLRME_=d zmd@9|DEb`u75?@R{kzmu_K4+wkNNw{_T4swAFYVX{9f=Y{4L%$Vfyz19`(*q8z@Ib zZ4kQt!=pFoR>7Xy_|@%1Lbr}^k8RG&YR=1%v{4+RPZG--XdRn_%fPKrw^GzcVXUd_ z15|+Ph<}v}sK&YC`!Lr4dS4tD)<)7|Sr39$;qRpQurlr)tLtyfKT`6KsMobkEb9x* zI#RMG*6Z3gw!RX%zA#!hT3;=U`r5+vh4H)5`s&8#>#MOA*OnKFex90QwzLteT8y=j zUrrW}*sByC@B1<_P47)NGiIG7>bJmLN*STPdYQ~qK`X@Ye`VzVj2SC%Vm@RB&fK@f zEdsadKVBCDDK+46h4)F1c@v}4z^?Fjc(uTr?3JArz6iQ6Wd6SNyciVVZ^`{xOO(fC z%^$V;ULFZ!&jlLVpB1;8+56EdXm6hMYwq`EtbL#8vtU>Ft3$Mxr}%S#*CoG&`TNsy z(J4&(RLu|V?_urxU$H%mJr8KKCysbRIV$3b(CsQb@`-M39OVGNx|&GnR@Z2>gV!Wx zFWO=^)y^X0#WcNBZEMVfMB97qbOjk;5fLY_dE2gnulYDAqBH8{d#jR$~CMEBN zcjGeoe(r?4K))NFUSYfes}AN)kl)}PfZXgo6oirME;##?)c^uDrKwBT; z#DKs$5pyj)-+lxu{s$FWToYpd$!&zYNK6ai?%W7>5q%oMonvr6&)iQriDFWKJJ;YY z0XNY0EtC=9&NjH)Fn5JW5rYHVU1GVN&zQS{?g&Qi;9Oqou6G`fW`bM2#Rmy2?#uQg z_OoD7^4k#orChd!CFni+Y59-9KOo2B^@t@uQOk!=y+6h>g-1^JhzVi-A(&N9)R=21 zGw2`U?1UxgAzjnk*%G8~#`nu0qn^?J1h$=rHTo*H?WleDbVdici$o!FtLSpLSE>>2 zBKlZ!8#}ZH_bPC!y!|Am1-R2=xuY|{t=kje365*%^%ox2n(YyjoSy_9ynkU{Ugmm95l$5B4C~N+ExS9IO<(!DjBS6d`vG z@n*Aa^(lo%PM;K`^cuE_VNtzM{T7%ZlxePWHBS=rRQNl0fmlz?jCFGjubV4IG%>KT zmguuw&%QcJI*vn*l`R%q{yO3~dcvDS&8ezorXNdDe$@GbEo9#=SjsFLC6ntej8vcm z4k)>}8uF(l{z2fsR`N&($j_1ZGT?vLJb93>k@y_omnk_t2>B9;9|-(TEx!`-j_z^J z9nPy#@8dPkhu%`p^A5O^?a}_YEl$w-?DbxZ@lTDCkGH&9BD>V7q-4sVc~yjSlpO4w zEtMkE0mlPMtn=x`*H9RfZQ|&Cas|&!$cd=SC-Hqb(dp|wj zb+@}&D^^@0dP%`)PrSH#seP)uY4)1SU;f-awRqb$*Q$N+u{&>CV*S(QM^G2F&q&Q_ z1T}scbyah9({uAcbjjuj;utRvt(to3(2_WoYTfQuTyooOk#lOBi^(_@ zuidI+b;@?v;Q8tQwa=g9t}0!!#Co{)b1_UDaGQz)#o~)o-T5TEpNX7!ng0~JK9GN- zLRlH}7*NJ9j$7LdSex#n*4~|v;UG`UUGBq5^KZ@x4Aj%tn}J%t@Pr^;RnB! z2jJc(5_P*2lt@!U+AI&StWcQKA|DoyjqzQTU||corSw{qlV+!0wX{A^F7H6;fg1Ow zOGRO7Ytj2s_omNn_Z0DPapdEJD<({cj5wG}B# zm7gTr^mO^rup9|ZAW7Z`jL+tXCoBK&f7BP|qwB?%d)x``xVyxbjW4-_?-mbM6zYt36|&6npV9hD?+@IE)` z3i-#p*bW$0zp6RXq59`;5z}vVH@X{d6;t1S&0Te?=qNhg=B|2A{N~1s^=@zRTd}Bd zhly2gM?M24_r;>Lj{I~RB6}c4+dS{o2}O%cfo@7uw2VV&^iZe`TgFn8vg?Dxmvy$__O3% zb~ErpwS1}OFJ!zrCqLcY3w)1QJiJ`K)BL-E@2Ys5WbiL=tM%J*yym|J@_*M^HN10M zv1fOZMo&i!Cy8WB@@lU;NB2=rdYk6>zxA>?x{s2NrYTxuj)(*KN@#YwTP=D4KT^pf z`H)L|v;g=XI)^VpexHDD#eW3k5@ZjBe6z-v_;SjT^7EZU zDgRmHXSg+WdP)zPsIRB?zp6pHC#Ro8I+xh@!B2}1kcLkk(%X?@7Z z`Ph&8-&oU^Lz5rFY95-M01qfvpA34PvckP`%z6&Clkj@B^YH!dK)thnu#dNT1lmEM z-bv7ja<=)ly^uQ7Lsgyfy6{@ixOFL2CQ=g{x?(pqZ?TLvZRMZ#&BdR}T)E24m8;yg zx%s)4T)F2?&$Z?)zdd)6{1ba{y(+O&uDVxL?x9y@v}%e(!#mpfif-JY6^+9OE&(~B zAhrG`?1HSwz$N!y`()|kYr?x=eF zzL__77`WxmXPUdyMS08Rx14d+C1+lEx+sQ!@olk9}+BgwabrW)~8{Tnto8; zA?1r6e`Q_8;)-N(?o+QdcV~&R6p^|0nzEm-d3()`cW>W#?VI1;a$8s*mf((ZjzbKO zG;Kp&;H}^{@C|+g=h6!HQ*3JV2ohrn?Ew!&gd?+It*G9dy{f13_Bis*A>A{Ht>RP2 zaerBqB-8o6oJy=`Ajj=mh!0Q#IU-iT6SO;ff~xswp1Ykr|0G^)0lr8)3A`Z(|LA(T zvz6s%h*^Pn58$CCkjrS}#)+#(#X0)K)oea-1vzcf^XaqsG={<#>5=~wK8>N|Ey==6 zXg2yyjO37~s2<8a6a6E`3h?iyc)g?DQ{QjQJKFyO)7``x0C?Js&IgX*NDReLxAaNL zjkNba?K(^jz&s+@m5<~2I1c_hKXV*a)i73fsIKr$6_E7;TF80>U7=D*b8Dzd?fczi zl618NLp}dYn(ii5oy<%YVYyjQvRk%DkxO-@`*>6e6;UA&Xu?AWX8imdokbnpoz)e> z01V_^I55C2?63oSZ(kxtc6Nm0AqXKmBBPvh?qF6C2jAEch+*!}d*O%|nv=7usQUOg zx}DUeyP;#9-RUrM&S22Vsk1u>d=|Ir0%n-wJfF?qG2g#J3IYib;)PwoK|p2{1_s_Q z1jtFh(gBSDs2mBo^vhegrIzBGx?%V#WCBzxw7$Ns^&7r}y6{aRKPBJzt@>(08H%E5 zxx=@<p) zjoBfB1wx=09z{Y`01}7q6djlu1W5f4`HLA?000310006b5;#)zZ(k2Q^#B=2B000000C?JCU}Rum&-us0z`$w#OW~g@ zrxZ{G1+ek~0Bk%2Q+V1mm1A^dSrmo$d-vS?YI@AJZQEL5Td|Xwj?=ao+h*HHdTiUa zZBNZkt(hO+I`8_Nvv;jhnTP=Z0I+`ek7rP3`y)qMutHL>R)3Bp`3i|v2sYYT$h0fa zTg9Tg?1P_m2-9p|jJ7^Uo*IrG+`oyOBdbXinM;n4J!AoiC$ZKk?6h()O*(Qe2}RN$ z+f+T4I}4E}Zr<}LTJ;$0)zi@`S!5T-n~1#MY5v}GcuAL(B*e+jt z;%0pdF3Q~qkVi32&q2L>i=NIfOqY)_QJz32c^pC3muOG}F^UmtITomOuxuaPE4;*9MWt*-kmuY6B-&>=z80}| zK00!(RK1P?#)X;cBaBi{qZi{UyAkuOhj5PZD!m1H{LYkMY?OS2>c`phUg%`qg&KJk zaViamO)L^rI;vC?wn`|rnRw2}!) zgQ}K#K83aB8pN0h*q}}z!12M2G76!d{@sJiat0;lA!^@3T{7X#y8>kg^C(23-piaG zqn@kS(78SQ3d?<9`JV=<1xl0#*vH>wu492%P4EF zPvX(03ouMaVS^rtd9oSn=##q{XX;i2=xl7Ik2c9}q|g&*)fX7Xe1j#B{rna_{H~TF zq}y@0L|=_oUsHnzG1fEh#WQQTmp_nsV=iF}A|2mF(#)R4rqRuIj z&G8&0n?N+01XSw|=xc25^Cqm#>}Cu=sKmHG;W)v(f_~;Bo>}kyPI!;g1;I9v zp)&w4=pWH6Pouv~LTAU|BV+Km*^esSf@)V2o_FHujUHI1-bGlu9&&)*`5N8S_weW= z^pbM}?~F#)|99&fut!ER*Y|OV`ZkcA)Oa0f0siPk2I+ISOA445^U&Afg6uQ7WVOVQDcM<*Rf?YFQepW(bLMZMX8CE5#P^%1nnVKlm~$3^`F^Bsh<<~jD{ z2W*x5nA@+IsD8vK^8@41LH>i)%Z_axNoCJd57*49AH z=ofvKZ{)Mr-=bB2gQM-g1F1lohb(kf2XUiTeCHpGqUZd~O!%93slyWHHvl7K9yPU* z>fD7nCKY3yCvmr_M6rC2L(&QBSwnB#6?5s0T=skry)ewagmAe9a193jk9HgB09YXa zb%Z^N-}M9lo+sek9E@&9Pe6?shV7~r!>vR_kr`Gb1~UfQF^INTW1hVPgXzJ!vIooU zV&tnjH0$1Iwt^7sJcD365{V>I6=R0|5vHmzY-JxJ%s~1r18uG_Tr@ZHy9;$o!7{xa zebr|eD_z;U*@)MD*z*stLA4>cT^IQd3Hl}!nVyI?Z()~t2%Ahi5+sj%=in4IpDDR$ zk}%A2t;0s!aUW)Gv7Y~uj+ie4uu(c-qV1r?_Q!hbQ*4$8dB&f855`PWLx|kNxDBxY z;2MDd*LZ~3AHtvPAgcseK|;t}vX$hKY5&a!ks7jEdcjZn;#QfAA*^|f%ta?TNX>d< zD0TCtS4-t6^P7co#?|s3%Jt7ESM?kRFg}T?)*Gz*EsoD&lVbFoGZ@T0x2m%o^G?rM zMpXbWd5GuU!&Dv4x$nrQ*rk`Dk8DDcGXedb`Ftag?{lBb=C=#uOlS0$@mNUzat^g} zn&Vs0OJB>eKjxZ_C^r$Fy`pnDH&+^jiQ(CksMX!+=Qh5*gthNu z?UVRE?;+(nA6GNqFwc9;+f&Ou81Jw)DZ?Q4*NaRgi6nx|Ad85fiokZe5oZ+hl!@&3 zair*ZxT3q^ZuJdn^dQDp*!x{vXT36waTz*VkDx@=ARYMYGCdfg*1PlMDkQ1RggsPy zkgm2PogQ69rjkSwL1vIe#7~E?k9A}d?$#F>FJYH@nf30$Ui$5Nc?vTmfm)7$FW)M% z3XyG2v%X5CTF<+)Bo)(0GU@hjBjx}DNfSij-o4r1wr$%sV*lpZwr$(CZQDk0w(aYC zUv4Xz^kuS_(o&=i1p^2nRZbN4!0quqEiUHkqtFS2jq`xHWHq8|Ry%h&~3r&>-bQb%GL+7zg z=h0ofT9{(`Dg@dp4zv|u56m4h`(nK$MsLdZi?Cnp$i-+x%Qk%C&NgzLvN8(6r@_UtU`-wLRvxybrCImS=4sv`rcO2v+<_|$mk3;c^ z4ZVaZ!cy6Cv(TA3Ks``Ax1=^0un&ZGQdbPri#RwJgV`T~TE(6KHOxS~L{0r?nSuUi z`RZ?(YR+X|^KVNN-IC7dds~l29B@C@m*KNvKZb8`uk>Ez4Su7=(cfq$bT`_Xo&w*b zccEXRSJGOG8RI#O?q*FiKfcJC%t_2p8(1H0ZT9gV@1wi13p=rk{s7yEd+ftD@&hrA z?qxme0r5+0VGR9^|I-7Km*@l0-@IeKY#jPF{WE=ao-VE<@r};HCi+LqPiCvxLGMDp zk=4*Q-tdF_^~U#IReA~ZzvV5~ps(RP=r!mM_#Ngyiy_Nj=u`SJVBgu?*nthkmOD(> z8`G!IOK|S&Gi3T3dJy^=dJlSPvnPQc$uXXrbLa1G#J4An>+I&J{&W;i)Ll2Vy(jQJ zN#oZ4=Hf6fTECo&&9_39HZFo+(+Ar56ASpS^)S?>XqUeTH1@K_T;>gbJWBhM=1;^0 zzE7+ww>?OoaMgc1wdKFH$%`Kj6ZOcK-m9260!Ww4(50P_>Eq1N;WJX-79g**!@r^PM z`0nZZ{NQM`zYzW9KT&V?JY#4#ay|Kz{EnU{m!tD7Z=?Uo$JQ%Qd-%!2@t30RRBN*iC~fww>Cxt=PuBZQHhO+qP}n#_-3#3j%>m|4s+( z1ZRS`Lkb|5ATOX4Xfd=qbS`uU^gQ$f3Bb#eXUu29$%8)YWtCglTFOYKZuOT*E+)9%o7=_Uq}k;1smY-U=S{a9L71#1lJ z44cg!&tAiUanzhf&MeMRE{V(Jrf}=HKJIy54zCyQJHML0SkTyx`x>hnuQr97NzF4`;#v$X3tP#pz1mXSzP0z!A#{4(THPbvAAP*ORBtrI z8)h1|7|t7WjnhncQ>Mvb+G!@6S!S6z*_>~lXMtJtmR*)(mP=NSwTJb(EzNe*9T5pzj zr1!0_tM8>>=RXt>2c`z0!QR0ip{CG^(4TN!_;mPs_%T5HPaYrx5`i250LB2zfuq1f z;4SbMblYIU@BLU!nPd3S|)XL!+hQ+fS* zXnN**KYOu!PJFU`MSY`w2Yw-bJAPGuZ+_o@27f<)R)33tC4gyw?}0IaM1fabda-=B9U2<(vm)spOVRv|C4%? ztdskcEtGMT>y<^7tCk6tewOo>eV5Rf5SVG048a2c<1hdKz_)GNwr$(CZQC|x+gs+X zO}ehZ+qP}<4xVgtGJNurtg~#d?2YPIkVD|#Zua`!jiDgx8AaK zwC%B7uot!uwX5tO9n&37$603{=O!m}6?V;V-Ee1jcXl6ko82+@Y4?5iM^7$KInQd( zQ*R5e%$Lbm*SFbs%U{L6-R}w%3e*VrKpD^-^asPicrYEz2g|{FupR6N$AKD{fg3~t z3N{Mv3)Nuv5 z8eDsB7&n(&$sOdBoR#CbtK1vz2Van{!MEpo^ON|M`~lv~Cwa=>=fA=HurzE0d%_8D zIotS%CcUwr$%+xXC8_gW9$=!*4yf^$EpBX;A@G88t&a z(M?Y|b8Ax4R5VvX1#&I%$PiFY!NOeYJ-%Cf2KC$a;e-X56N>f zl=tMss^eNYOz|aHmlw0usW?SE2N}y z>Y;k6KB}KOhEAe0=;FGb?y86B1$u?vpm*p4QKl$gR5Gd^wT=2m!=ky-FNg_AAuVKu zGEfhiK|AOM{a^yjfCaDuHoy)z04LxA+yD*_;01gzwM}Ew+H^M~%|tWPEH!J*5p&Dj zH{Wa$o7)z*m2E3K&3u<8+1K~2eP`d>kM;BYYQNd<^QZhZFZ^x)>2`v@1;GP=95Da@z}mKL z+qP}nwr$(CZQC~ExCBx-`Xqfuxs+JH`=2MD47C&YPh30ws?!#(hL zybSNd*YG>+NnDbZlqF3_e=>`#A^XTFa*aG9?}(?-X?j|m)~DU+c)FbKr`IWoMRu3HWSD*8F?j}FoY&)B`53;K@8TEvUH+0|ZumcuROAtrL@Uuv z3=-qSEU`>%68pp{aVa8K#G;5tp+uq4p%39a;W6QtvZSmi8_Bk^tL!U>%CT~)oGX{g zwQ|3_C|^jWqO0_(xT>$ZtMO{N+OMvw_v(|5uT$&ny09*qUBtKA_L& z8~Ta?M24KC-VYu)+rRkBj5dxoj?* z_PJy3oV(`kxo7U3Ba!_hpZYSsif`aM`N4j)pY9j?^?tWM?l1fM{XCtRfILa9b7r7wkDtl^fa>Z!V)s)n>R4mqh zGQ944E+47Dr3CR;sZFT|jmpI%TuO84t>23eojP8c#pmk#L9-fBvk^5`bb&2LZ)-VQ ze_}m8TbWTkol4Jn>$?y;>ll^dV^CLgmAD`^UtBGoV=KHKYz6hqeDHgSc^l*Km1Vcv z&Dex8>YJ<|ks&L#`Q~@GnE^>TDGhWdPaQSXQY5A&&1r$h^n`IQ2HihtMc=P!Ruit-n`_zw z(Ew?Q;d|&B+~?HgL=41nx)qs;H_cR}sLj#EC*BBY(}ZJBK|CU^h+!V!1y)GAGq!Wk zz`%~+kaV{J4As+{)_f5Edx<&F5pSR`%J6RK8M1FKc#66P*?z(q5GiPj9X9k!JIL9{ zIl0>FmVf{3#<+OeV_;?gga26!DGXQu04g5=(Exbb+Q6f|fkB&L6C)3kHsdB>*{nI_g58=^lG9s; t2GQwbg#sOJ7!Vu{$k1T&S}UHF>4V@koT0-D0}{D7(}1*?`U4&|SJ46;-QEBI literal 0 Hc$@e~|Ns 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

    , because it just gets in the way. + from_box.parentNode.removeChild(ps[i]); + } else if (ps[i].className.indexOf("help") !== -1) { + // 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(ps[i], from_box.parentNode.firstChild); + } + } + + //

    or
    + var selector_div = quickElement('div', from_box.parentNode); + selector_div.className = is_stacked ? 'selector stacked' : 'selector'; + + //
    + var selector_available = quickElement('div', selector_div); + selector_available.className = 'selector-available'; + var 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] + ) + ); + + var filter_p = quickElement('p', selector_available, '', 'id', field_id + '_filter'); + filter_p.className = 'selector-filter'; + + var 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(' ')); + + var filter_input = quickElement('input', filter_p, '', 'type', 'text', 'placeholder', gettext("Filter")); + filter_input.id = field_id + '_input'; + + selector_available.appendChild(from_box); + var 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'; + + //
      + var selector_chooser = quickElement('ul', selector_div); + selector_chooser.className = 'selector-chooser'; + var add_link = quickElement('a', quickElement('li', selector_chooser), gettext('Choose'), 'title', gettext('Choose'), 'href', '#', 'id', field_id + '_add_link'); + add_link.className = 'selector-add'; + var remove_link = quickElement('a', quickElement('li', selector_chooser), gettext('Remove'), 'title', gettext('Remove'), 'href', '#', 'id', field_id + '_remove_link'); + remove_link.className = 'selector-remove'; + + //
      + var selector_chosen = quickElement('div', selector_div); + selector_chosen.className = 'selector-chosen'; + var 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] + ) + ); + + var to_box = quickElement('select', selector_chosen, '', 'id', field_id + '_to', 'multiple', 'multiple', 'size', from_box.size, 'name', from_box.getAttribute('name')); + to_box.className = 'filtered'; + var 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.setAttribute('name', from_box.getAttribute('name') + '_old'); + + // Set up the JavaScript event handlers for the select box filter interface + var move_selection = function(e, elem, move_func, from, to) { + if (elem.className.indexOf('active') !== -1) { + move_func(from, to); + SelectFilter.refresh_icons(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'); + }); + filter_input.addEventListener('keypress', function(e) { + SelectFilter.filter_key_press(e, field_id); + }); + filter_input.addEventListener('keyup', function(e) { + SelectFilter.filter_key_up(e, field_id); + }); + filter_input.addEventListener('keydown', function(e) { + SelectFilter.filter_key_down(e, field_id); + }); + 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); + } + }); + findForm(from_box).addEventListener('submit', function() { + 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'); + + if (!is_stacked) { + // In horizontal mode, give the same height to the two boxes. + var j_from_box = $('#' + field_id + '_from'); + var j_to_box = $('#' + field_id + '_to'); + j_to_box.height($(filter_p).outerHeight() + j_from_box.outerHeight()); + } + + // Initial icon refresh + SelectFilter.refresh_icons(field_id); + }, + any_selected: function(field) { + var any_selected = false; + try { + // Temporarily add the required attribute and check validity. + // This is much faster in WebKit browsers than the fallback. + field.attr('required', 'required'); + any_selected = field.is(':valid'); + field.removeAttr('required'); + } catch (e) { + // Browsers that don't support :valid (IE < 10) + any_selected = field.find('option:selected').length > 0; + } + return any_selected; + }, + refresh_icons: function(field_id) { + var from = $('#' + field_id + '_from'); + var to = $('#' + field_id + '_to'); + // Active if at least one item is selected + $('#' + field_id + '_add_link').toggleClass('active', SelectFilter.any_selected(from)); + $('#' + field_id + '_remove_link').toggleClass('active', SelectFilter.any_selected(to)); + // Active if the corresponding box isn't empty + $('#' + field_id + '_add_all_link').toggleClass('active', from.find('option').length > 0); + $('#' + field_id + '_remove_all_link').toggleClass('active', to.find('option').length > 0); + }, + filter_key_press: function(event, field_id) { + var from = document.getElementById(field_id + '_from'); + // don't submit form if user pressed Enter + if ((event.which && event.which === 13) || (event.keyCode && event.keyCode === 13)) { + from.selectedIndex = 0; + SelectBox.move(field_id + '_from', field_id + '_to'); + from.selectedIndex = 0; + event.preventDefault(); + return false; + } + }, + filter_key_up: function(event, field_id) { + var from = document.getElementById(field_id + '_from'); + var temp = from.selectedIndex; + SelectBox.filter(field_id + '_from', document.getElementById(field_id + '_input').value); + from.selectedIndex = temp; + return true; + }, + filter_key_down: function(event, field_id) { + var from = document.getElementById(field_id + '_from'); + // right arrow -- move across + if ((event.which && event.which === 39) || (event.keyCode && event.keyCode === 39)) { + var old_index = from.selectedIndex; + SelectBox.move(field_id + '_from', field_id + '_to'); + from.selectedIndex = (old_index === from.length) ? from.length - 1 : old_index; + return false; + } + // down arrow -- wrap around + if ((event.which && event.which === 40) || (event.keyCode && event.keyCode === 40)) { + from.selectedIndex = (from.length === from.selectedIndex + 1) ? 0 : from.selectedIndex + 1; + } + // up arrow -- wrap around + if ((event.which && event.which === 38) || (event.keyCode && event.keyCode === 38)) { + from.selectedIndex = (from.selectedIndex === 0) ? from.length - 1 : from.selectedIndex - 1; + } + return true; + } + }; + + window.addEventListener('load', function(e) { + $('select.selectfilter, select.selectfilterstacked').each(function() { + var $el = $(this), + data = $el.data(); + SelectFilter.init($el.attr('id'), data.fieldName, parseInt(data.isStacked, 10)); + }); + }); + +})(django.jQuery); diff --git a/static/admin/js/actions.js b/static/admin/js/actions.js new file mode 100644 index 0000000..524616f --- /dev/null +++ b/static/admin/js/actions.js @@ -0,0 +1,153 @@ +/*global gettext, interpolate, ngettext*/ +(function($) { + 'use strict'; + var lastChecked; + + $.fn.actions = function(opts) { + var options = $.extend({}, $.fn.actions.defaults, opts); + var actionCheckboxes = $(this); + var list_editable_changed = false; + var showQuestion = function() { + $(options.acrossClears).hide(); + $(options.acrossQuestions).show(); + $(options.allContainer).hide(); + }, + showClear = function() { + $(options.acrossClears).show(); + $(options.acrossQuestions).hide(); + $(options.actionContainer).toggleClass(options.selectedClass); + $(options.allContainer).show(); + $(options.counterContainer).hide(); + }, + reset = function() { + $(options.acrossClears).hide(); + $(options.acrossQuestions).hide(); + $(options.allContainer).hide(); + $(options.counterContainer).show(); + }, + clearAcross = function() { + reset(); + $(options.acrossInput).val(0); + $(options.actionContainer).removeClass(options.selectedClass); + }, + checker = function(checked) { + if (checked) { + showQuestion(); + } else { + reset(); + } + $(actionCheckboxes).prop("checked", checked) + .parent().parent().toggleClass(options.selectedClass, checked); + }, + updateCounter = function() { + var sel = $(actionCheckboxes).filter(":checked").length; + // data-actions-icnt is defined in the generated HTML + // and contains the total amount of objects in the queryset + var actions_icnt = $('.action-counter').data('actionsIcnt'); + $(options.counterContainer).html(interpolate( + ngettext('%(sel)s of %(cnt)s selected', '%(sel)s of %(cnt)s selected', sel), { + sel: sel, + cnt: actions_icnt + }, true)); + $(options.allToggle).prop("checked", function() { + var value; + if (sel === actionCheckboxes.length) { + value = true; + showQuestion(); + } else { + value = false; + clearAcross(); + } + return value; + }); + }; + // Show counter by default + $(options.counterContainer).show(); + // Check state of checkboxes and reinit state if needed + $(this).filter(":checked").each(function(i) { + $(this).parent().parent().toggleClass(options.selectedClass); + updateCounter(); + if ($(options.acrossInput).val() === 1) { + showClear(); + } + }); + $(options.allToggle).show().on('click', function() { + checker($(this).prop("checked")); + updateCounter(); + }); + $("a", options.acrossQuestions).on('click', function(event) { + event.preventDefault(); + $(options.acrossInput).val(1); + showClear(); + }); + $("a", options.acrossClears).on('click', function(event) { + event.preventDefault(); + $(options.allToggle).prop("checked", false); + clearAcross(); + checker(0); + updateCounter(); + }); + lastChecked = null; + $(actionCheckboxes).on('click', function(event) { + if (!event) { event = window.event; } + var target = event.target ? event.target : event.srcElement; + if (lastChecked && $.data(lastChecked) !== $.data(target) && event.shiftKey === true) { + var inrange = false; + $(lastChecked).prop("checked", target.checked) + .parent().parent().toggleClass(options.selectedClass, target.checked); + $(actionCheckboxes).each(function() { + if ($.data(this) === $.data(lastChecked) || $.data(this) === $.data(target)) { + inrange = (inrange) ? false : true; + } + if (inrange) { + $(this).prop("checked", target.checked) + .parent().parent().toggleClass(options.selectedClass, target.checked); + } + }); + } + $(target).parent().parent().toggleClass(options.selectedClass, target.checked); + lastChecked = target; + updateCounter(); + }); + $('form#changelist-form table#result_list tr').on('change', 'td:gt(0) :input', function() { + list_editable_changed = true; + }); + $('form#changelist-form button[name="index"]').on('click', function(event) { + if (list_editable_changed) { + return confirm(gettext("You have unsaved changes on individual editable fields. If you run an action, your unsaved changes will be lost.")); + } + }); + $('form#changelist-form input[name="_save"]').on('click', function(event) { + var action_changed = false; + $('select option:selected', options.actionContainer).each(function() { + if ($(this).val()) { + action_changed = true; + } + }); + if (action_changed) { + if (list_editable_changed) { + return confirm(gettext("You have selected an action, but you haven't saved your changes to individual fields yet. Please click OK to save. You'll need to re-run the action.")); + } else { + return confirm(gettext("You have selected an action, and you haven't made any changes on individual fields. You're probably looking for the Go button rather than the Save button.")); + } + } + }); + }; + /* Setup plugin defaults */ + $.fn.actions.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", + allToggle: "#action-toggle", + selectedClass: "selected" + }; + $(document).ready(function() { + var $actionsEls = $('tr input.action-select'); + if ($actionsEls.length > 0) { + $actionsEls.actions(); + } + }); +})(django.jQuery); diff --git a/static/admin/js/actions.min.js b/static/admin/js/actions.min.js new file mode 100644 index 0000000..31e83c1 --- /dev/null +++ b/static/admin/js/actions.min.js @@ -0,0 +1,7 @@ +(function(a){var f;a.fn.actions=function(e){var b=a.extend({},a.fn.actions.defaults,e),g=a(this),k=!1,l=function(){a(b.acrossClears).hide();a(b.acrossQuestions).show();a(b.allContainer).hide()},m=function(){a(b.acrossClears).show();a(b.acrossQuestions).hide();a(b.actionContainer).toggleClass(b.selectedClass);a(b.allContainer).show();a(b.counterContainer).hide()},n=function(){a(b.acrossClears).hide();a(b.acrossQuestions).hide();a(b.allContainer).hide();a(b.counterContainer).show()},p=function(){n(); +a(b.acrossInput).val(0);a(b.actionContainer).removeClass(b.selectedClass)},q=function(c){c?l():n();a(g).prop("checked",c).parent().parent().toggleClass(b.selectedClass,c)},h=function(){var c=a(g).filter(":checked").length,d=a(".action-counter").data("actionsIcnt");a(b.counterContainer).html(interpolate(ngettext("%(sel)s of %(cnt)s selected","%(sel)s of %(cnt)s selected",c),{sel:c,cnt:d},!0));a(b.allToggle).prop("checked",function(){if(c===g.length){var a=!0;l()}else a=!1,p();return a})};a(b.counterContainer).show(); +a(this).filter(":checked").each(function(c){a(this).parent().parent().toggleClass(b.selectedClass);h();1===a(b.acrossInput).val()&&m()});a(b.allToggle).show().on("click",function(){q(a(this).prop("checked"));h()});a("a",b.acrossQuestions).on("click",function(c){c.preventDefault();a(b.acrossInput).val(1);m()});a("a",b.acrossClears).on("click",function(c){c.preventDefault();a(b.allToggle).prop("checked",!1);p();q(0);h()});f=null;a(g).on("click",function(c){c||(c=window.event);var d=c.target?c.target: +c.srcElement;if(f&&a.data(f)!==a.data(d)&&!0===c.shiftKey){var e=!1;a(f).prop("checked",d.checked).parent().parent().toggleClass(b.selectedClass,d.checked);a(g).each(function(){if(a.data(this)===a.data(f)||a.data(this)===a.data(d))e=e?!1:!0;e&&a(this).prop("checked",d.checked).parent().parent().toggleClass(b.selectedClass,d.checked)})}a(d).parent().parent().toggleClass(b.selectedClass,d.checked);f=d;h()});a("form#changelist-form table#result_list tr").on("change","td:gt(0) :input",function(){k=!0}); +a('form#changelist-form button[name="index"]').on("click",function(a){if(k)return confirm(gettext("You have unsaved changes on individual editable fields. If you run an action, your unsaved changes will be lost."))});a('form#changelist-form input[name="_save"]').on("click",function(c){var d=!1;a("select option:selected",b.actionContainer).each(function(){a(this).val()&&(d=!0)});if(d)return k?confirm(gettext("You have selected an action, but you haven't saved your changes to individual fields yet. Please click OK to save. You'll need to re-run the action.")): +confirm(gettext("You have selected an action, and you haven't made any changes on individual fields. You're probably looking for the Go button rather than the Save button."))})};a.fn.actions.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",allToggle:"#action-toggle",selectedClass:"selected"};a(document).ready(function(){var e= +a("tr input.action-select");0 +// +(function() { + 'use strict'; + var 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
      that gets toggled + calendarDivName2: 'calendarin', // name of
      that contains calendar + calendarLinkName: 'calendarlink',// name of the link that is used to toggle + clockDivName: 'clockbox', // name of clock
      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() { + var body = document.getElementsByTagName('body')[0]; + var serverOffset = body.getAttribute('data-admin-utc-offset'); + if (serverOffset) { + var localOffset = new Date().getTimezoneOffset() * -60; + DateTimeShortcuts.timezoneOffset = localOffset - serverOffset; + } + + var inputs = document.getElementsByTagName('input'); + for (var i = 0; i < inputs.length; i++) { + var inp = inputs[i]; + if (inp.getAttribute('type') === 'text' && inp.className.match(/vTimeField/)) { + DateTimeShortcuts.addClock(inp); + DateTimeShortcuts.addTimezoneWarning(inp); + } + else if (inp.getAttribute('type') === 'text' && inp.className.match(/vDateField/)) { + DateTimeShortcuts.addCalendar(inp); + DateTimeShortcuts.addTimezoneWarning(inp); + } + } + }, + // Return the current time while accounting for the server timezone. + now: function() { + var body = document.getElementsByTagName('body')[0]; + var serverOffset = body.getAttribute('data-admin-utc-offset'); + if (serverOffset) { + var localNow = new Date(); + var 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) { + var warningClass = DateTimeShortcuts.timezoneWarningClass; + var 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; + } + + var 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]); + + var warning = document.createElement('span'); + warning.className = warningClass; + warning.textContent = message; + inp.parentNode.appendChild(document.createElement('br')); + inp.parentNode.appendChild(warning); + }, + // Add clock widget to a given field + addClock: function(inp) { + var num = DateTimeShortcuts.clockInputs.length; + DateTimeShortcuts.clockInputs[num] = inp; + DateTimeShortcuts.dismissClockFunc[num] = function() { DateTimeShortcuts.dismissClock(num); return true; }; + + // Shortcut links (clock icon and "Now" link) + var shortcuts_span = document.createElement('span'); + shortcuts_span.className = DateTimeShortcuts.shortCutsClass; + inp.parentNode.insertBefore(shortcuts_span, inp.nextSibling); + var now_link = document.createElement('a'); + now_link.setAttribute('href', "#"); + now_link.textContent = gettext('Now'); + now_link.addEventListener('click', function(e) { + e.preventDefault(); + DateTimeShortcuts.handleClockQuicklink(num, -1); + }); + var clock_link = document.createElement('a'); + clock_link.setAttribute('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: + // + + var clock_box = document.createElement('div'); + clock_box.style.display = 'none'; + clock_box.style.position = 'absolute'; + clock_box.className = 'clockbox module'; + clock_box.setAttribute('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')); + var 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 . + var name = typeof DateTimeShortcuts.clockHours[inp.name] === 'undefined' ? 'default_' : inp.name; + DateTimeShortcuts.clockHours[name].forEach(function(element) { + var 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]); + }); + }); + + var cancel_p = quickElement('p', clock_box); + cancel_p.className = 'calendar-cancel'; + var 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) { + var clock_box = document.getElementById(DateTimeShortcuts.clockDivName + num); + var clock_link = document.getElementById(DateTimeShortcuts.clockLinkName + num); + + // Recalculate the clockbox position + // is it left-to-right or right-to-left layout ? + if (getStyle(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 + // TODO: IE returns wrong value for findPosX when in rtl mode + // (it returns as it was left aligned), needs to be fixed. + 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) { + var 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) { + var num = DateTimeShortcuts.calendars.length; + + DateTimeShortcuts.calendarInputs[num] = inp; + DateTimeShortcuts.dismissCalendarFunc[num] = function() { DateTimeShortcuts.dismissCalendar(num); return true; }; + + // Shortcut links (calendar icon and "Today" link) + var shortcuts_span = document.createElement('span'); + shortcuts_span.className = DateTimeShortcuts.shortCutsClass; + inp.parentNode.insertBefore(shortcuts_span, inp.nextSibling); + var today_link = document.createElement('a'); + today_link.setAttribute('href', '#'); + today_link.appendChild(document.createTextNode(gettext('Today'))); + today_link.addEventListener('click', function(e) { + e.preventDefault(); + DateTimeShortcuts.handleCalendarQuickLink(num, 0); + }); + var cal_link = document.createElement('a'); + cal_link.setAttribute('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: + // + //
      + //

      + // + // February 2003 + //

      + //
      + // + //
      + //
      + // Yesterday | Today | Tomorrow + //
      + //

      Cancel

      + //
      + var cal_box = document.createElement('div'); + cal_box.style.display = 'none'; + cal_box.style.position = 'absolute'; + cal_box.className = 'calendarbox module'; + cal_box.setAttribute('id', DateTimeShortcuts.calendarDivName1 + num); + document.body.appendChild(cal_box); + cal_box.addEventListener('click', function(e) { e.stopPropagation(); }); + + // next-prev links + var cal_nav = quickElement('div', cal_box); + var 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); + }); + + var 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 + var 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 + var shortcuts = quickElement('div', cal_box); + shortcuts.className = 'calendar-shortcuts'; + var 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 + var cancel_p = quickElement('p', cal_box); + cancel_p.className = 'calendar-cancel'; + var 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) { + var cal_box = document.getElementById(DateTimeShortcuts.calendarDivName1 + num); + var cal_link = document.getElementById(DateTimeShortcuts.calendarLinkName + num); + var 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) { + var format = get_format('DATE_INPUT_FORMATS')[0]; + var selected = inp.value.strptime(format); + var year = selected.getUTCFullYear(); + var month = selected.getUTCMonth() + 1; + var 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 (getStyle(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 + // TODO: IE returns wrong value for findPosX when in rtl mode + // (it returns as it was left aligned), needs to be fixed. + 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) { + var format = get_format('DATE_INPUT_FORMATS')[0]; + // the format needs to be escaped a little + format = format.replace('\\', '\\\\') + .replace('\r', '\\r') + .replace('\n', '\\n') + .replace('\t', '\\t') + .replace("'", "\\'"); + 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) { + var 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; +})(); diff --git a/static/admin/js/admin/RelatedObjectLookups.js b/static/admin/js/admin/RelatedObjectLookups.js new file mode 100644 index 0000000..f4c57c4 --- /dev/null +++ b/static/admin/js/admin/RelatedObjectLookups.js @@ -0,0 +1,181 @@ +/*global SelectBox, interpolate*/ +// Handles related-objects functionality: lookup link for raw_id_fields +// and Add Another links. + +(function($) { + 'use strict'; + + // IE doesn't accept periods or dashes in the window name, but the element IDs + // we use to generate popup window names may contain them, therefore we map them + // to allowed characters in a reversible way so that we can locate the correct + // element when the popup window is dismissed. + function id_to_windowname(text) { + text = text.replace(/\./g, '__dot__'); + text = text.replace(/\-/g, '__dash__'); + return text; + } + + function windowname_to_id(text) { + text = text.replace(/__dot__/g, '.'); + text = text.replace(/__dash__/g, '-'); + return text; + } + + function showAdminPopup(triggeringLink, name_regexp, add_popup) { + var name = triggeringLink.id.replace(name_regexp, ''); + name = id_to_windowname(name); + var href = triggeringLink.href; + if (add_popup) { + if (href.indexOf('?') === -1) { + href += '?_popup=1'; + } else { + href += '&_popup=1'; + } + } + var win = window.open(href, name, 'height=500,width=800,resizable=yes,scrollbars=yes'); + win.focus(); + return false; + } + + function showRelatedObjectLookupPopup(triggeringLink) { + return showAdminPopup(triggeringLink, /^lookup_/, true); + } + + function dismissRelatedLookupPopup(win, chosenId) { + var name = windowname_to_id(win.name); + var elem = document.getElementById(name); + if (elem.className.indexOf('vManyToManyRawIdAdminField') !== -1 && elem.value) { + elem.value += ',' + chosenId; + } else { + document.getElementById(name).value = chosenId; + } + win.close(); + } + + function showRelatedObjectPopup(triggeringLink) { + return showAdminPopup(triggeringLink, /^(change|add|delete)_/, false); + } + + function updateRelatedObjectLinks(triggeringLink) { + var $this = $(triggeringLink); + var siblings = $this.nextAll('.view-related, .change-related, .delete-related'); + if (!siblings.length) { + return; + } + var value = $this.val(); + if (value) { + siblings.each(function() { + var elm = $(this); + elm.attr('href', elm.attr('data-href-template').replace('__fk__', value)); + }); + } else { + siblings.removeAttr('href'); + } + } + + function dismissAddRelatedObjectPopup(win, newId, newRepr) { + var name = windowname_to_id(win.name); + var elem = document.getElementById(name); + if (elem) { + var elemName = elem.nodeName.toUpperCase(); + if (elemName === 'SELECT') { + elem.options[elem.options.length] = new Option(newRepr, newId, true, true); + } else if (elemName === 'INPUT') { + if (elem.className.indexOf('vManyToManyRawIdAdminField') !== -1 && elem.value) { + elem.value += ',' + newId; + } else { + elem.value = newId; + } + } + // Trigger a change event to update related links if required. + $(elem).trigger('change'); + } else { + var toId = name + "_to"; + var o = new Option(newRepr, newId); + SelectBox.add_to_cache(toId, o); + SelectBox.redisplay(toId); + } + win.close(); + } + + function dismissChangeRelatedObjectPopup(win, objId, newRepr, newId) { + var id = windowname_to_id(win.name).replace(/^edit_/, ''); + var selectsSelector = interpolate('#%s, #%s_from, #%s_to', [id, id, id]); + var selects = $(selectsSelector); + selects.find('option').each(function() { + if (this.value === objId) { + this.textContent = newRepr; + this.value = 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; + }); + win.close(); + } + + function dismissDeleteRelatedObjectPopup(win, objId) { + var id = windowname_to_id(win.name).replace(/^delete_/, ''); + var selectsSelector = interpolate('#%s, #%s_from, #%s_to', [id, id, id]); + var selects = $(selectsSelector); + selects.find('option').each(function() { + if (this.value === objId) { + $(this).remove(); + } + }).trigger('change'); + win.close(); + } + + // Global for testing purposes + window.id_to_windowname = id_to_windowname; + window.windowname_to_id = windowname_to_id; + + window.showRelatedObjectLookupPopup = showRelatedObjectLookupPopup; + window.dismissRelatedLookupPopup = dismissRelatedLookupPopup; + window.showRelatedObjectPopup = showRelatedObjectPopup; + window.updateRelatedObjectLinks = updateRelatedObjectLinks; + window.dismissAddRelatedObjectPopup = dismissAddRelatedObjectPopup; + window.dismissChangeRelatedObjectPopup = dismissChangeRelatedObjectPopup; + window.dismissDeleteRelatedObjectPopup = dismissDeleteRelatedObjectPopup; + + // Kept for backward compatibility + window.showAddAnotherPopup = showRelatedObjectPopup; + window.dismissAddAnotherPopup = dismissAddRelatedObjectPopup; + + $(document).ready(function() { + $("a[data-popup-opener]").on('click', function(event) { + event.preventDefault(); + opener.dismissRelatedLookupPopup(window, $(this).data("popup-opener")); + }); + $('body').on('click', '.related-widget-wrapper-link', function(e) { + e.preventDefault(); + if (this.href) { + var 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) { + var 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(); + var event = $.Event('django:lookup-related'); + $(this).trigger(event); + if (!event.isDefaultPrevented()) { + showRelatedObjectLookupPopup(this); + } + }); + }); + +})(django.jQuery); diff --git a/static/admin/js/autocomplete.js b/static/admin/js/autocomplete.js new file mode 100644 index 0000000..65c0702 --- /dev/null +++ b/static/admin/js/autocomplete.js @@ -0,0 +1,37 @@ +(function($) { + 'use strict'; + var init = function($element, options) { + var settings = $.extend({ + ajax: { + data: function(params) { + return { + term: params.term, + page: params.page + }; + } + } + }, options); + $element.select2(settings); + }; + + $.fn.djangoAdminSelect2 = function(options) { + var settings = $.extend({}, options); + $.each(this, function(i, element) { + var $element = $(element); + init($element, settings); + }); + 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).on('formset:added', (function() { + return function(event, $newFormset) { + return $newFormset.find('.admin-autocomplete').djangoAdminSelect2(); + }; + })(this)); +}(django.jQuery)); diff --git a/static/admin/js/calendar.js b/static/admin/js/calendar.js new file mode 100644 index 0000000..a4c047a --- /dev/null +++ b/static/admin/js/calendar.js @@ -0,0 +1,208 @@ +/*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 +*/ + +(function() { + 'use strict'; + // CalendarNamespace -- Provides a collection of HTML calendar-related helper functions + var 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') + ], + daysOfWeek: [ + 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) { + var 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 + var today = new Date(); + var todayDay = today.getDate(); + var todayMonth = today.getMonth() + 1; + var todayYear = today.getFullYear(); + var 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. + var isSelectedMonth = false; + if (typeof selected !== 'undefined') { + isSelectedMonth = (selected.getUTCFullYear() === year && (selected.getUTCMonth() + 1) === month); + } + + month = parseInt(month); + year = parseInt(year); + var calDiv = document.getElementById(div_id); + removeChildren(calDiv); + var calTable = document.createElement('table'); + quickElement('caption', calTable, CalendarNamespace.monthsOfYear[month - 1] + ' ' + year); + var tableBody = quickElement('tbody', calTable); + + // Draw days-of-week header + var tableRow = quickElement('tr', tableBody); + for (var i = 0; i < 7; i++) { + quickElement('th', tableRow, CalendarNamespace.daysOfWeek[(i + CalendarNamespace.firstDayOfWeek) % 7]); + } + + var startingPos = new Date(year, month - 1, 1 - CalendarNamespace.firstDayOfWeek).getDay(); + var days = CalendarNamespace.getDaysInMonth(month, year); + + var nonDayCell; + + // Draw blanks before first of month + tableRow = quickElement('tr', tableBody); + for (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 + var currentDay = 1; + for (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"; + } + + var cell = quickElement('td', tableRow, '', 'class', todayClass); + var 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; +})(); diff --git a/static/admin/js/cancel.js b/static/admin/js/cancel.js new file mode 100644 index 0000000..04ec812 --- /dev/null +++ b/static/admin/js/cancel.js @@ -0,0 +1,13 @@ +(function($) { + 'use strict'; + $(function() { + $('.cancel-link').on('click', function(e) { + e.preventDefault(); + if (window.location.search.indexOf('&_popup=1') === -1) { + window.history.back(); // Go back if not a popup. + } else { + window.close(); // Otherwise, close the popup. + } + }); + }); +})(django.jQuery); diff --git a/static/admin/js/change_form.js b/static/admin/js/change_form.js new file mode 100644 index 0000000..4797383 --- /dev/null +++ b/static/admin/js/change_form.js @@ -0,0 +1,20 @@ +/*global showAddAnotherPopup, showRelatedObjectLookupPopup showRelatedObjectPopup updateRelatedObjectLinks*/ + +(function($) { + 'use strict'; + $(document).ready(function() { + var modelName = $('#django-admin-form-add-constants').data('modelName'); + $('body').on('click', '.add-another', function(e) { + e.preventDefault(); + var event = $.Event('django:add-another-related'); + $(this).trigger(event); + if (!event.isDefaultPrevented()) { + showAddAnotherPopup(this); + } + }); + + if (modelName) { + $('form#' + modelName + '_form :input:visible:enabled:first').focus(); + } + }); +})(django.jQuery); diff --git a/static/admin/js/collapse.js b/static/admin/js/collapse.js new file mode 100644 index 0000000..3123878 --- /dev/null +++ b/static/admin/js/collapse.js @@ -0,0 +1,52 @@ +/*global gettext*/ +(function() { + 'use strict'; + var closestElem = function(elem, tagName) { + if (elem.nodeName === tagName.toUpperCase()) { + return elem; + } + if (elem.parentNode.nodeName === 'BODY') { + return null; + } + return elem.parentNode && closestElem(elem.parentNode, tagName); + }; + + window.addEventListener('load', function() { + // Add anchor tag for Show/Hide link + var fieldsets = document.querySelectorAll('fieldset.collapse'); + for (var i = 0; i < fieldsets.length; i++) { + var elem = fieldsets[i]; + // Don't hide if fields in this fieldset have errors + if (elem.querySelectorAll('div.errors').length === 0) { + elem.classList.add('collapsed'); + var h2 = elem.querySelector('h2'); + var link = document.createElement('a'); + link.setAttribute('id', 'fieldsetcollapser' + i); + link.setAttribute('class', 'collapse-toggle'); + link.setAttribute('href', '#'); + link.textContent = gettext('Show'); + h2.appendChild(document.createTextNode(' (')); + h2.appendChild(link); + h2.appendChild(document.createTextNode(')')); + } + } + // Add toggle to anchor tag + var toggles = document.querySelectorAll('fieldset.collapse a.collapse-toggle'); + var toggleFunc = function(ev) { + ev.preventDefault(); + var fieldset = closestElem(this, 'fieldset'); + if (fieldset.classList.contains('collapsed')) { + // Show + this.textContent = gettext('Hide'); + fieldset.classList.remove('collapsed'); + } else { + // Hide + this.textContent = gettext('Show'); + fieldset.classList.add('collapsed'); + } + }; + for (i = 0; i < toggles.length; i++) { + toggles[i].addEventListener('click', toggleFunc); + } + }); +})(); diff --git a/static/admin/js/collapse.min.js b/static/admin/js/collapse.min.js new file mode 100644 index 0000000..6f59280 --- /dev/null +++ b/static/admin/js/collapse.min.js @@ -0,0 +1,2 @@ +(function(){var e=function(a,b){return a.nodeName===b.toUpperCase()?a:"BODY"===a.parentNode.nodeName?null:a.parentNode&&e(a.parentNode,b)};window.addEventListener("load",function(){for(var a=document.querySelectorAll("fieldset.collapse"),b=0;b= 0) && parseFloat(navigator.appVersion); +var isIE = ((document.all) && (!isOpera)) && parseFloat(navigator.appVersion.split("MSIE ")[1].split(";")[0]); + +// quickElement(tagType, parentReference [, textInChildNode, attribute, attributeValue ...]); +function quickElement() { + 'use strict'; + var obj = document.createElement(arguments[0]); + if (arguments[2]) { + var textNode = document.createTextNode(arguments[2]); + obj.appendChild(textNode); + } + var len = arguments.length; + for (var 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) { + 'use strict'; + while (a.hasChildNodes()) { + a.removeChild(a.lastChild); + } +} + +// ---------------------------------------------------------------------------- +// Find-position functions by PPK +// See https://www.quirksmode.org/js/findpos.html +// ---------------------------------------------------------------------------- +function findPosX(obj) { + 'use strict'; + var curleft = 0; + if (obj.offsetParent) { + while (obj.offsetParent) { + curleft += obj.offsetLeft - ((isOpera) ? 0 : obj.scrollLeft); + obj = obj.offsetParent; + } + // IE offsetParent does not include the top-level + if (isIE && obj.parentElement) { + curleft += obj.offsetLeft - obj.scrollLeft; + } + } else if (obj.x) { + curleft += obj.x; + } + return curleft; +} + +function findPosY(obj) { + 'use strict'; + var curtop = 0; + if (obj.offsetParent) { + while (obj.offsetParent) { + curtop += obj.offsetTop - ((isOpera) ? 0 : obj.scrollTop); + obj = obj.offsetParent; + } + // IE offsetParent does not include the top-level + if (isIE && obj.parentElement) { + curtop += obj.offsetTop - obj.scrollTop; + } + } else if (obj.y) { + curtop += obj.y; + } + return curtop; +} + +//----------------------------------------------------------------------------- +// Date object extensions +// ---------------------------------------------------------------------------- +(function() { + 'use strict'; + Date.prototype.getTwelveHours = function() { + var hours = this.getHours(); + if (hours === 0) { + return 12; + } + else { + return hours <= 12 ? hours : hours - 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.getHourMinute = function() { + return this.getTwoDigitHour() + ':' + this.getTwoDigitMinute(); + }; + + Date.prototype.getHourMinuteSecond = function() { + return this.getTwoDigitHour() + ':' + this.getTwoDigitMinute() + ':' + this.getTwoDigitSecond(); + }; + + Date.prototype.getFullMonthName = function() { + return typeof window.CalendarNamespace === "undefined" + ? this.getTwoDigitMonth() + : window.CalendarNamespace.monthsOfYear[this.getMonth()]; + }; + + Date.prototype.strftime = function(format) { + var fields = { + 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(), + '%': '%' + }; + var result = '', i = 0; + while (i < format.length) { + if (format.charAt(i) === '%') { + result = result + fields[format.charAt(i + 1)]; + ++i; + } + else { + result = result + format.charAt(i); + } + ++i; + } + return result; + }; + +// ---------------------------------------------------------------------------- +// String object extensions +// ---------------------------------------------------------------------------- + String.prototype.pad_left = function(pad_length, pad_string) { + var new_string = this; + for (var i = 0; new_string.length < pad_length; i++) { + new_string = pad_string + new_string; + } + return new_string; + }; + + String.prototype.strptime = function(format) { + var split_format = format.split(/[.\-/]/); + var date = this.split(/[.\-/]/); + var i = 0; + var 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": + year = date[i]; + 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)); + }; + +})(); +// ---------------------------------------------------------------------------- +// Get the computed style for and element +// ---------------------------------------------------------------------------- +function getStyle(oElm, strCssRule) { + 'use strict'; + var strValue = ""; + if(document.defaultView && document.defaultView.getComputedStyle) { + strValue = document.defaultView.getComputedStyle(oElm, "").getPropertyValue(strCssRule); + } + else if(oElm.currentStyle) { + strCssRule = strCssRule.replace(/\-(\w)/g, function(strMatch, p1) { + return p1.toUpperCase(); + }); + strValue = oElm.currentStyle[strCssRule]; + } + return strValue; +} diff --git a/static/admin/js/inlines.js b/static/admin/js/inlines.js new file mode 100644 index 0000000..045ef1e --- /dev/null +++ b/static/admin/js/inlines.js @@ -0,0 +1,298 @@ +/*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 + */ +(function($) { + 'use strict'; + $.fn.formset = function(opts) { + var options = $.extend({}, $.fn.formset.defaults, opts); + var $this = $(this); + var $parent = $this.parent(); + var updateElementIndex = function(el, prefix, ndx) { + var id_regex = new RegExp("(" + prefix + "-(\\d+|__prefix__))"); + var 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); + } + }; + var totalForms = $("#id_" + options.prefix + "-TOTAL_FORMS").prop("autocomplete", "off"); + var nextIndex = parseInt(totalForms.val(), 10); + var maxForms = $("#id_" + options.prefix + "-MAX_NUM_FORMS").prop("autocomplete", "off"); + // only show the add button if we are allowed to add more items, + // note that max_num = None translates to a blank string. + var showAddButton = maxForms.val() === '' || (maxForms.val() - totalForms.val()) > 0; + $this.each(function(i) { + $(this).not("." + options.emptyCssClass).addClass(options.formCssClass); + }); + if ($this.length && showAddButton) { + var addButton = options.addButton; + 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: + var numCols = this.eq(-1).children().length; + $parent.append('' + options.addText + ""); + addButton = $parent.find("tr:last a"); + } else { + // Otherwise, insert it immediately after the last form: + $this.filter(":last").after('"); + addButton = $this.filter(":last").next().find("a"); + } + } + addButton.on('click', function(e) { + e.preventDefault(); + var template = $("#" + options.prefix + "-empty"); + var row = template.clone(true); + row.removeClass(options.emptyCssClass) + .addClass(options.formCssClass) + .attr("id", options.prefix + "-" + nextIndex); + 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('"); + } else if (row.is("ul") || row.is("ol")) { + // If they're laid out as an ordered/unordered list, + // insert an
    • after the last list item: + row.append('
    • ' + options.deleteText + "
    • "); + } else { + // Otherwise, just insert the remove button as the + // last child element of the form's container: + row.children(":first").append('' + options.deleteText + ""); + } + 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 add button in case we've hit the max, except we want to add infinitely + if ((maxForms.val() !== '') && (maxForms.val() - totalForms.val()) <= 0) { + addButton.parent().hide(); + } + // The delete button of each row triggers a bunch of other things + row.find("a." + options.deleteCssClass).on('click', function(e1) { + e1.preventDefault(); + // Remove the parent form containing this button: + row.remove(); + nextIndex -= 1; + // If a post-delete callback was provided, call it with the deleted form: + if (options.removed) { + options.removed(row); + } + $(document).trigger('formset:removed', [row, options.prefix]); + // Update the TOTAL_FORMS form count. + var forms = $("." + options.formCssClass); + $("#id_" + options.prefix + "-TOTAL_FORMS").val(forms.length); + // Show add button again once we drop below max + if ((maxForms.val() === '') || (maxForms.val() - forms.length) > 0) { + addButton.parent().show(); + } + // Also, update names and ids for all remaining form controls + // so they remain in sequence: + var i, formCount; + var 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); + } + }); + // If a post-add callback was supplied, call it with the added form: + if (options.added) { + options.added(row); + } + $(document).trigger('formset:added', [row, options.prefix]); + }); + } + 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) { + var $rows = $(this); + var alternatingRows = function(row) { + $(selector).not(".add-row").removeClass("row1 row2") + .filter(":even").addClass("row1").end() + .filter(":odd").addClass("row2"); + }; + + var reinitDateTimeShortCuts = function() { + // Reinitialize the calendar and clock widgets by force + if (typeof DateTimeShortcuts !== "undefined") { + $(".datetimeshortcuts").remove(); + DateTimeShortcuts.init(); + } + }; + + var 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) { + var namearr = value.name.split('-'); + SelectFilter.init(value.id, namearr[namearr.length - 1], false); + }); + $('.selectfilterstacked').each(function(index, value) { + var namearr = value.name.split('-'); + SelectFilter.init(value.id, namearr[namearr.length - 1], true); + }); + } + }; + + var initPrepopulatedFields = function(row) { + row.find('.prepopulated_field').each(function() { + var 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", + removed: alternatingRows, + added: function(row) { + initPrepopulatedFields(row); + reinitDateTimeShortCuts(); + updateSelectFilter(); + alternatingRows(row); + }, + addButton: options.addButton + }); + + return $rows; + }; + + // Stacked inlines --------------------------------------------------------- + $.fn.stackedFormset = function(selector, options) { + var $rows = $(this); + var updateInlineLabel = function(row) { + $(selector).find(".inline_label").each(function(i) { + var count = i + 1; + $(this).html($(this).html().replace(/(#\d+)/g, "#" + count)); + }); + }; + + var reinitDateTimeShortCuts = function() { + // Reinitialize the calendar and clock widgets by force, yuck. + if (typeof DateTimeShortcuts !== "undefined") { + $(".datetimeshortcuts").remove(); + DateTimeShortcuts.init(); + } + }; + + var updateSelectFilter = function() { + // If any SelectFilter widgets were added, instantiate a new instance. + if (typeof SelectFilter !== "undefined") { + $(".selectfilter").each(function(index, value) { + var namearr = value.name.split('-'); + SelectFilter.init(value.id, namearr[namearr.length - 1], false); + }); + $(".selectfilterstacked").each(function(index, value) { + var namearr = value.name.split('-'); + SelectFilter.init(value.id, namearr[namearr.length - 1], true); + }); + } + }; + + var initPrepopulatedFields = function(row) { + row.find('.prepopulated_field').each(function() { + var 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('.form-row .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", + 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() { + var data = $(this).data(), + inlineOptions = data.inlineFormset, + 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"; + $(selector).tabularFormset(selector, inlineOptions.options); + break; + } + }); + }); +})(django.jQuery); diff --git a/static/admin/js/inlines.min.js b/static/admin/js/inlines.min.js new file mode 100644 index 0000000..65af8eb --- /dev/null +++ b/static/admin/js/inlines.min.js @@ -0,0 +1,13 @@ +var $jscomp=$jscomp||{};$jscomp.scope={};$jscomp.findInternal=function(b,d,a){b instanceof String&&(b=String(b));for(var c=b.length,f=0;f'+a.addText+""),l=d.find("tr:last a")):(c.filter(":last").after('"),l=c.filter(":last").next().find("a")));l.on("click",function(d){d.preventDefault();d=b("#"+a.prefix+"-empty"); +var c=d.clone(!0);c.removeClass(a.emptyCssClass).addClass(a.formCssClass).attr("id",a.prefix+"-"+h);c.is("tr")?c.children(":last").append('"):c.is("ul")||c.is("ol")?c.append('
    • '+a.deleteText+"
    • "):c.children(":first").append(''+a.deleteText+"");c.find("*").each(function(){f(this,a.prefix,g.val())});c.insertBefore(b(d)); +b(g).val(parseInt(g.val(),10)+1);h+=1;""!==e.val()&&0>=e.val()-g.val()&&l.parent().hide();c.find("a."+a.deleteCssClass).on("click",function(d){d.preventDefault();c.remove();--h;a.removed&&a.removed(c);b(document).trigger("formset:removed",[c,a.prefix]);d=b("."+a.formCssClass);b("#id_"+a.prefix+"-TOTAL_FORMS").val(d.length);(""===e.val()||0 tr",b(d).tabularFormset(d,a.options)}})})})(django.jQuery); diff --git a/static/admin/js/jquery.init.js b/static/admin/js/jquery.init.js new file mode 100644 index 0000000..f3ac162 --- /dev/null +++ b/static/admin/js/jquery.init.js @@ -0,0 +1,8 @@ +/*global django:true, jQuery:false*/ +/* 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). + */ +var django = django || {}; +django.jQuery = jQuery.noConflict(true); diff --git a/static/admin/js/popup_response.js b/static/admin/js/popup_response.js new file mode 100644 index 0000000..b4a07e7 --- /dev/null +++ b/static/admin/js/popup_response.js @@ -0,0 +1,16 @@ +/*global opener */ +(function() { + 'use strict'; + var 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; + } +})(); diff --git a/static/admin/js/prepopulate.js b/static/admin/js/prepopulate.js new file mode 100644 index 0000000..bef45a3 --- /dev/null +++ b/static/admin/js/prepopulate.js @@ -0,0 +1,42 @@ +/*global URLify*/ +(function($) { + 'use strict'; + $.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() { + var prepopulatedField = $(this); + + var populate = function() { + // Bail if the field's value has been changed by the user + if (prepopulatedField.data('_changed')) { + return; + } + + var 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); + } + }); + }; +})(django.jQuery); diff --git a/static/admin/js/prepopulate.min.js b/static/admin/js/prepopulate.min.js new file mode 100644 index 0000000..43c1b79 --- /dev/null +++ b/static/admin/js/prepopulate.min.js @@ -0,0 +1 @@ +(function(b){b.fn.prepopulate=function(d,f,g){return this.each(function(){var a=b(this),h=function(){if(!a.data("_changed")){var e=[];b.each(d,function(a,c){c=b(c);0 elements + // (i.e., `typeof document.createElement( "object" ) === "function"`). + // We don't want to classify *any* DOM node as a function. + return typeof obj === "function" && typeof obj.nodeType !== "number"; + }; + + +var isWindow = function isWindow( obj ) { + return obj != null && obj === obj.window; + }; + + + + + var preservedScriptAttributes = { + type: true, + src: true, + noModule: true + }; + + function DOMEval( code, doc, node ) { + doc = doc || document; + + var i, + script = doc.createElement( "script" ); + + script.text = code; + if ( node ) { + for ( i in preservedScriptAttributes ) { + if ( node[ i ] ) { + script[ i ] = node[ i ]; + } + } + } + doc.head.appendChild( script ).parentNode.removeChild( script ); + } + + +function toType( obj ) { + if ( obj == null ) { + return obj + ""; + } + + // Support: Android <=2.3 only (functionish RegExp) + return typeof obj === "object" || typeof obj === "function" ? + class2type[ toString.call( obj ) ] || "object" : + typeof obj; +} +/* global Symbol */ +// Defining this global in .eslintrc.json would create a danger of using the global +// unguarded in another place, it seems safer to define global only for this module + + + +var + version = "3.3.1", + + // Define a local copy of jQuery + jQuery = function( selector, context ) { + + // The jQuery object is actually just the init constructor 'enhanced' + // Need init if jQuery is called (just allow error to be thrown if not included) + return new jQuery.fn.init( selector, context ); + }, + + // Support: Android <=4.0 only + // Make sure we trim BOM and NBSP + rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g; + +jQuery.fn = jQuery.prototype = { + + // The current version of jQuery being used + jquery: version, + + constructor: jQuery, + + // The default length of a jQuery object is 0 + length: 0, + + toArray: function() { + return slice.call( this ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + + // Return all the elements in a clean array + if ( num == null ) { + return slice.call( this ); + } + + // Return just the one element from the set + return num < 0 ? this[ num + this.length ] : this[ num ]; + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems ) { + + // Build a new jQuery matched element set + var ret = jQuery.merge( this.constructor(), elems ); + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + each: function( callback ) { + return jQuery.each( this, callback ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map( this, function( elem, i ) { + return callback.call( elem, i, elem ); + } ) ); + }, + + slice: function() { + return this.pushStack( slice.apply( this, arguments ) ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + eq: function( i ) { + var len = this.length, + j = +i + ( i < 0 ? len : 0 ); + return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); + }, + + end: function() { + return this.prevObject || this.constructor(); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: arr.sort, + splice: arr.splice +}; + +jQuery.extend = jQuery.fn.extend = function() { + var options, name, src, copy, copyIsArray, clone, + target = arguments[ 0 ] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + + // Skip the boolean and the target + target = arguments[ i ] || {}; + i++; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !isFunction( target ) ) { + target = {}; + } + + // Extend jQuery itself if only one argument is passed + if ( i === length ) { + target = this; + i--; + } + + for ( ; i < length; i++ ) { + + // Only deal with non-null/undefined values + if ( ( options = arguments[ i ] ) != null ) { + + // Extend the base object + for ( name in options ) { + src = target[ name ]; + copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject( copy ) || + ( copyIsArray = Array.isArray( copy ) ) ) ) { + + if ( copyIsArray ) { + copyIsArray = false; + clone = src && Array.isArray( src ) ? src : []; + + } else { + clone = src && jQuery.isPlainObject( src ) ? src : {}; + } + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend( { + + // Unique for each copy of jQuery on the page + expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), + + // Assume jQuery is ready without the ready module + isReady: true, + + error: function( msg ) { + throw new Error( msg ); + }, + + noop: function() {}, + + isPlainObject: function( obj ) { + var proto, Ctor; + + // Detect obvious negatives + // Use toString instead of jQuery.type to catch host objects + if ( !obj || toString.call( obj ) !== "[object Object]" ) { + return false; + } + + proto = getProto( obj ); + + // Objects with no prototype (e.g., `Object.create( null )`) are plain + if ( !proto ) { + return true; + } + + // Objects with prototype are plain iff they were constructed by a global Object function + Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; + return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; + }, + + isEmptyObject: function( obj ) { + + /* eslint-disable no-unused-vars */ + // See https://github.com/eslint/eslint/issues/6125 + var name; + + for ( name in obj ) { + return false; + } + return true; + }, + + // Evaluates a script in a global context + globalEval: function( code ) { + DOMEval( code ); + }, + + each: function( obj, callback ) { + var length, i = 0; + + if ( isArrayLike( obj ) ) { + length = obj.length; + for ( ; i < length; i++ ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } else { + for ( i in obj ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } + + return obj; + }, + + // Support: Android <=4.0 only + trim: function( text ) { + return text == null ? + "" : + ( text + "" ).replace( rtrim, "" ); + }, + + // results is for internal usage only + makeArray: function( arr, results ) { + var ret = results || []; + + if ( arr != null ) { + if ( isArrayLike( Object( arr ) ) ) { + jQuery.merge( ret, + typeof arr === "string" ? + [ arr ] : arr + ); + } else { + push.call( ret, arr ); + } + } + + return ret; + }, + + inArray: function( elem, arr, i ) { + return arr == null ? -1 : indexOf.call( arr, elem, i ); + }, + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + merge: function( first, second ) { + var len = +second.length, + j = 0, + i = first.length; + + for ( ; j < len; j++ ) { + first[ i++ ] = second[ j ]; + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, invert ) { + var callbackInverse, + matches = [], + i = 0, + length = elems.length, + callbackExpect = !invert; + + // Go through the array, only saving the items + // that pass the validator function + for ( ; i < length; i++ ) { + callbackInverse = !callback( elems[ i ], i ); + if ( callbackInverse !== callbackExpect ) { + matches.push( elems[ i ] ); + } + } + + return matches; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var length, value, + i = 0, + ret = []; + + // Go through the array, translating each of the items to their new values + if ( isArrayLike( elems ) ) { + length = elems.length; + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + + // Go through every key on the object, + } else { + for ( i in elems ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + } + + // Flatten any nested arrays + return concat.apply( [], ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // jQuery.support is not used in Core but other projects attach their + // properties to it so it needs to exist. + support: support +} ); + +if ( typeof Symbol === "function" ) { + jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; +} + +// Populate the class2type map +jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), +function( i, name ) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); +} ); + +function isArrayLike( obj ) { + + // Support: real iOS 8.2 only (not reproducible in simulator) + // `in` check used to prevent JIT error (gh-2145) + // hasOwn isn't used here due to false negatives + // regarding Nodelist length in IE + var length = !!obj && "length" in obj && obj.length, + type = toType( obj ); + + if ( isFunction( obj ) || isWindow( obj ) ) { + return false; + } + + return type === "array" || length === 0 || + typeof length === "number" && length > 0 && ( length - 1 ) in obj; +} +var Sizzle = +/*! + * Sizzle CSS Selector Engine v2.3.3 + * https://sizzlejs.com/ + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2016-08-08 + */ +(function( window ) { + +var i, + support, + Expr, + getText, + isXML, + tokenize, + compile, + select, + outermostContext, + sortInput, + hasDuplicate, + + // Local document vars + setDocument, + document, + docElem, + documentIsHTML, + rbuggyQSA, + rbuggyMatches, + matches, + contains, + + // Instance-specific data + expando = "sizzle" + 1 * new Date(), + preferredDoc = window.document, + dirruns = 0, + done = 0, + classCache = createCache(), + tokenCache = createCache(), + compilerCache = createCache(), + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + } + return 0; + }, + + // Instance methods + hasOwn = ({}).hasOwnProperty, + arr = [], + pop = arr.pop, + push_native = arr.push, + push = arr.push, + slice = arr.slice, + // Use a stripped-down indexOf as it's faster than native + // https://jsperf.com/thor-indexof-vs-for/5 + indexOf = function( list, elem ) { + var i = 0, + len = list.length; + for ( ; i < len; i++ ) { + if ( list[i] === elem ) { + return i; + } + } + return -1; + }, + + booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", + + // Regular expressions + + // http://www.w3.org/TR/css3-selectors/#whitespace + whitespace = "[\\x20\\t\\r\\n\\f]", + + // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier + identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+", + + // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors + attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + + // Operator (capture 2) + "*([*^$|!~]?=)" + whitespace + + // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + + "*\\]", + + pseudos = ":(" + identifier + ")(?:\\((" + + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: + // 1. quoted (capture 3; capture 4 or capture 5) + "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + + // 2. simple (capture 6) + "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + + // 3. anything else (capture 2) + ".*" + + ")\\)|)", + + // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter + rwhitespace = new RegExp( whitespace + "+", "g" ), + rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), + + rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), + rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), + + rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ), + + rpseudo = new RegExp( pseudos ), + ridentifier = new RegExp( "^" + identifier + "$" ), + + matchExpr = { + "ID": new RegExp( "^#(" + identifier + ")" ), + "CLASS": new RegExp( "^\\.(" + identifier + ")" ), + "TAG": new RegExp( "^(" + identifier + "|[*])" ), + "ATTR": new RegExp( "^" + attributes ), + "PSEUDO": new RegExp( "^" + pseudos ), + "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), + "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), + // For use in libraries implementing .is() + // We use this for POS matching in `select` + "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) + }, + + rinputs = /^(?:input|select|textarea|button)$/i, + rheader = /^h\d$/i, + + rnative = /^[^{]+\{\s*\[native \w/, + + // Easily-parseable/retrievable ID or TAG or CLASS selectors + rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, + + rsibling = /[+~]/, + + // CSS escapes + // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters + runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), + funescape = function( _, escaped, escapedWhitespace ) { + var high = "0x" + escaped - 0x10000; + // NaN means non-codepoint + // Support: Firefox<24 + // Workaround erroneous numeric interpretation of +"0x" + return high !== high || escapedWhitespace ? + escaped : + high < 0 ? + // BMP codepoint + String.fromCharCode( high + 0x10000 ) : + // Supplemental Plane codepoint (surrogate pair) + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); + }, + + // CSS string/identifier serialization + // https://drafts.csswg.org/cssom/#common-serializing-idioms + rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, + fcssescape = function( ch, asCodePoint ) { + if ( asCodePoint ) { + + // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER + if ( ch === "\0" ) { + return "\uFFFD"; + } + + // Control characters and (dependent upon position) numbers get escaped as code points + return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; + } + + // Other potentially-special ASCII characters get backslash-escaped + return "\\" + ch; + }, + + // Used for iframes + // See setDocument() + // Removing the function wrapper causes a "Permission Denied" + // error in IE + unloadHandler = function() { + setDocument(); + }, + + disabledAncestor = addCombinator( + function( elem ) { + return elem.disabled === true && ("form" in elem || "label" in elem); + }, + { dir: "parentNode", next: "legend" } + ); + +// Optimize for push.apply( _, NodeList ) +try { + push.apply( + (arr = slice.call( preferredDoc.childNodes )), + preferredDoc.childNodes + ); + // Support: Android<4.0 + // Detect silently failing push.apply + arr[ preferredDoc.childNodes.length ].nodeType; +} catch ( e ) { + push = { apply: arr.length ? + + // Leverage slice if possible + function( target, els ) { + push_native.apply( target, slice.call(els) ); + } : + + // Support: IE<9 + // Otherwise append directly + function( target, els ) { + var j = target.length, + i = 0; + // Can't trust NodeList.length + while ( (target[j++] = els[i++]) ) {} + target.length = j - 1; + } + }; +} + +function Sizzle( selector, context, results, seed ) { + var m, i, elem, nid, match, groups, newSelector, + newContext = context && context.ownerDocument, + + // nodeType defaults to 9, since context defaults to document + nodeType = context ? context.nodeType : 9; + + results = results || []; + + // Return early from calls with invalid selector or context + if ( typeof selector !== "string" || !selector || + nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { + + return results; + } + + // Try to shortcut find operations (as opposed to filters) in HTML documents + if ( !seed ) { + + if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { + setDocument( context ); + } + context = context || document; + + if ( documentIsHTML ) { + + // If the selector is sufficiently simple, try using a "get*By*" DOM method + // (excepting DocumentFragment context, where the methods don't exist) + if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) { + + // ID selector + if ( (m = match[1]) ) { + + // Document context + if ( nodeType === 9 ) { + if ( (elem = context.getElementById( m )) ) { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( elem.id === m ) { + results.push( elem ); + return results; + } + } else { + return results; + } + + // Element context + } else { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( newContext && (elem = newContext.getElementById( m )) && + contains( context, elem ) && + elem.id === m ) { + + results.push( elem ); + return results; + } + } + + // Type selector + } else if ( match[2] ) { + push.apply( results, context.getElementsByTagName( selector ) ); + return results; + + // Class selector + } else if ( (m = match[3]) && support.getElementsByClassName && + context.getElementsByClassName ) { + + push.apply( results, context.getElementsByClassName( m ) ); + return results; + } + } + + // Take advantage of querySelectorAll + if ( support.qsa && + !compilerCache[ selector + " " ] && + (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { + + if ( nodeType !== 1 ) { + newContext = context; + newSelector = selector; + + // qSA looks outside Element context, which is not what we want + // Thanks to Andrew Dupont for this workaround technique + // Support: IE <=8 + // Exclude object elements + } else if ( context.nodeName.toLowerCase() !== "object" ) { + + // Capture the context ID, setting it first if necessary + if ( (nid = context.getAttribute( "id" )) ) { + nid = nid.replace( rcssescape, fcssescape ); + } else { + context.setAttribute( "id", (nid = expando) ); + } + + // Prefix every selector in the list + groups = tokenize( selector ); + i = groups.length; + while ( i-- ) { + groups[i] = "#" + nid + " " + toSelector( groups[i] ); + } + newSelector = groups.join( "," ); + + // Expand context for sibling selectors + newContext = rsibling.test( selector ) && testContext( context.parentNode ) || + context; + } + + if ( newSelector ) { + try { + push.apply( results, + newContext.querySelectorAll( newSelector ) + ); + return results; + } catch ( qsaError ) { + } finally { + if ( nid === expando ) { + context.removeAttribute( "id" ); + } + } + } + } + } + } + + // All others + return select( selector.replace( rtrim, "$1" ), context, results, seed ); +} + +/** + * Create key-value caches of limited size + * @returns {function(string, object)} Returns the Object data after storing it on itself with + * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) + * deleting the oldest entry + */ +function createCache() { + var keys = []; + + function cache( key, value ) { + // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) + if ( keys.push( key + " " ) > Expr.cacheLength ) { + // Only keep the most recent entries + delete cache[ keys.shift() ]; + } + return (cache[ key + " " ] = value); + } + return cache; +} + +/** + * Mark a function for special use by Sizzle + * @param {Function} fn The function to mark + */ +function markFunction( fn ) { + fn[ expando ] = true; + return fn; +} + +/** + * Support testing using an element + * @param {Function} fn Passed the created element and returns a boolean result + */ +function assert( fn ) { + var el = document.createElement("fieldset"); + + try { + return !!fn( el ); + } catch (e) { + return false; + } finally { + // Remove from its parent by default + if ( el.parentNode ) { + el.parentNode.removeChild( el ); + } + // release memory in IE + el = null; + } +} + +/** + * Adds the same handler for all of the specified attrs + * @param {String} attrs Pipe-separated list of attributes + * @param {Function} handler The method that will be applied + */ +function addHandle( attrs, handler ) { + var arr = attrs.split("|"), + i = arr.length; + + while ( i-- ) { + Expr.attrHandle[ arr[i] ] = handler; + } +} + +/** + * Checks document order of two siblings + * @param {Element} a + * @param {Element} b + * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b + */ +function siblingCheck( a, b ) { + var cur = b && a, + diff = cur && a.nodeType === 1 && b.nodeType === 1 && + a.sourceIndex - b.sourceIndex; + + // Use IE sourceIndex if available on both nodes + if ( diff ) { + return diff; + } + + // Check if b follows a + if ( cur ) { + while ( (cur = cur.nextSibling) ) { + if ( cur === b ) { + return -1; + } + } + } + + return a ? 1 : -1; +} + +/** + * Returns a function to use in pseudos for input types + * @param {String} type + */ +function createInputPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for buttons + * @param {String} type + */ +function createButtonPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for :enabled/:disabled + * @param {Boolean} disabled true for :disabled; false for :enabled + */ +function createDisabledPseudo( disabled ) { + + // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable + return function( elem ) { + + // Only certain elements can match :enabled or :disabled + // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled + // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled + if ( "form" in elem ) { + + // Check for inherited disabledness on relevant non-disabled elements: + // * listed form-associated elements in a disabled fieldset + // https://html.spec.whatwg.org/multipage/forms.html#category-listed + // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled + // * option elements in a disabled optgroup + // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled + // All such elements have a "form" property. + if ( elem.parentNode && elem.disabled === false ) { + + // Option elements defer to a parent optgroup if present + if ( "label" in elem ) { + if ( "label" in elem.parentNode ) { + return elem.parentNode.disabled === disabled; + } else { + return elem.disabled === disabled; + } + } + + // Support: IE 6 - 11 + // Use the isDisabled shortcut property to check for disabled fieldset ancestors + return elem.isDisabled === disabled || + + // Where there is no isDisabled, check manually + /* jshint -W018 */ + elem.isDisabled !== !disabled && + disabledAncestor( elem ) === disabled; + } + + return elem.disabled === disabled; + + // Try to winnow out elements that can't be disabled before trusting the disabled property. + // Some victims get caught in our net (label, legend, menu, track), but it shouldn't + // even exist on them, let alone have a boolean value. + } else if ( "label" in elem ) { + return elem.disabled === disabled; + } + + // Remaining elements are neither :enabled nor :disabled + return false; + }; +} + +/** + * Returns a function to use in pseudos for positionals + * @param {Function} fn + */ +function createPositionalPseudo( fn ) { + return markFunction(function( argument ) { + argument = +argument; + return markFunction(function( seed, matches ) { + var j, + matchIndexes = fn( [], seed.length, argument ), + i = matchIndexes.length; + + // Match elements found at the specified indexes + while ( i-- ) { + if ( seed[ (j = matchIndexes[i]) ] ) { + seed[j] = !(matches[j] = seed[j]); + } + } + }); + }); +} + +/** + * Checks a node for validity as a Sizzle context + * @param {Element|Object=} context + * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value + */ +function testContext( context ) { + return context && typeof context.getElementsByTagName !== "undefined" && context; +} + +// Expose support vars for convenience +support = Sizzle.support = {}; + +/** + * Detects XML nodes + * @param {Element|Object} elem An element or a document + * @returns {Boolean} True iff elem is a non-HTML XML node + */ +isXML = Sizzle.isXML = function( elem ) { + // documentElement is verified for cases where it doesn't yet exist + // (such as loading iframes in IE - #4833) + var documentElement = elem && (elem.ownerDocument || elem).documentElement; + return documentElement ? documentElement.nodeName !== "HTML" : false; +}; + +/** + * Sets document-related variables once based on the current document + * @param {Element|Object} [doc] An element or document object to use to set the document + * @returns {Object} Returns the current document + */ +setDocument = Sizzle.setDocument = function( node ) { + var hasCompare, subWindow, + doc = node ? node.ownerDocument || node : preferredDoc; + + // Return early if doc is invalid or already selected + if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { + return document; + } + + // Update global variables + document = doc; + docElem = document.documentElement; + documentIsHTML = !isXML( document ); + + // Support: IE 9-11, Edge + // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) + if ( preferredDoc !== document && + (subWindow = document.defaultView) && subWindow.top !== subWindow ) { + + // Support: IE 11, Edge + if ( subWindow.addEventListener ) { + subWindow.addEventListener( "unload", unloadHandler, false ); + + // Support: IE 9 - 10 only + } else if ( subWindow.attachEvent ) { + subWindow.attachEvent( "onunload", unloadHandler ); + } + } + + /* Attributes + ---------------------------------------------------------------------- */ + + // Support: IE<8 + // Verify that getAttribute really returns attributes and not properties + // (excepting IE8 booleans) + support.attributes = assert(function( el ) { + el.className = "i"; + return !el.getAttribute("className"); + }); + + /* getElement(s)By* + ---------------------------------------------------------------------- */ + + // Check if getElementsByTagName("*") returns only elements + support.getElementsByTagName = assert(function( el ) { + el.appendChild( document.createComment("") ); + return !el.getElementsByTagName("*").length; + }); + + // Support: IE<9 + support.getElementsByClassName = rnative.test( document.getElementsByClassName ); + + // Support: IE<10 + // Check if getElementById returns elements by name + // The broken getElementById methods don't pick up programmatically-set names, + // so use a roundabout getElementsByName test + support.getById = assert(function( el ) { + docElem.appendChild( el ).id = expando; + return !document.getElementsByName || !document.getElementsByName( expando ).length; + }); + + // ID filter and find + if ( support.getById ) { + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + return elem.getAttribute("id") === attrId; + }; + }; + Expr.find["ID"] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var elem = context.getElementById( id ); + return elem ? [ elem ] : []; + } + }; + } else { + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + var node = typeof elem.getAttributeNode !== "undefined" && + elem.getAttributeNode("id"); + return node && node.value === attrId; + }; + }; + + // Support: IE 6 - 7 only + // getElementById is not reliable as a find shortcut + Expr.find["ID"] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var node, i, elems, + elem = context.getElementById( id ); + + if ( elem ) { + + // Verify the id attribute + node = elem.getAttributeNode("id"); + if ( node && node.value === id ) { + return [ elem ]; + } + + // Fall back on getElementsByName + elems = context.getElementsByName( id ); + i = 0; + while ( (elem = elems[i++]) ) { + node = elem.getAttributeNode("id"); + if ( node && node.value === id ) { + return [ elem ]; + } + } + } + + return []; + } + }; + } + + // Tag + Expr.find["TAG"] = support.getElementsByTagName ? + function( tag, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( tag ); + + // DocumentFragment nodes don't have gEBTN + } else if ( support.qsa ) { + return context.querySelectorAll( tag ); + } + } : + + function( tag, context ) { + var elem, + tmp = [], + i = 0, + // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too + results = context.getElementsByTagName( tag ); + + // Filter out possible comments + if ( tag === "*" ) { + while ( (elem = results[i++]) ) { + if ( elem.nodeType === 1 ) { + tmp.push( elem ); + } + } + + return tmp; + } + return results; + }; + + // Class + Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { + if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { + return context.getElementsByClassName( className ); + } + }; + + /* QSA/matchesSelector + ---------------------------------------------------------------------- */ + + // QSA and matchesSelector support + + // matchesSelector(:active) reports false when true (IE9/Opera 11.5) + rbuggyMatches = []; + + // qSa(:focus) reports false when true (Chrome 21) + // We allow this because of a bug in IE8/9 that throws an error + // whenever `document.activeElement` is accessed on an iframe + // So, we allow :focus to pass through QSA all the time to avoid the IE error + // See https://bugs.jquery.com/ticket/13378 + rbuggyQSA = []; + + if ( (support.qsa = rnative.test( document.querySelectorAll )) ) { + // Build QSA regex + // Regex strategy adopted from Diego Perini + assert(function( el ) { + // Select is set to empty string on purpose + // This is to test IE's treatment of not explicitly + // setting a boolean content attribute, + // since its presence should be enough + // https://bugs.jquery.com/ticket/12359 + docElem.appendChild( el ).innerHTML = "" + + ""; + + // Support: IE8, Opera 11-12.16 + // Nothing should be selected when empty strings follow ^= or $= or *= + // The test attribute must be unknown in Opera but "safe" for WinRT + // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section + if ( el.querySelectorAll("[msallowcapture^='']").length ) { + rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); + } + + // Support: IE8 + // Boolean attributes and "value" are not treated correctly + if ( !el.querySelectorAll("[selected]").length ) { + rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); + } + + // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ + if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { + rbuggyQSA.push("~="); + } + + // Webkit/Opera - :checked should return selected option elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + // IE8 throws error here and will not see later tests + if ( !el.querySelectorAll(":checked").length ) { + rbuggyQSA.push(":checked"); + } + + // Support: Safari 8+, iOS 8+ + // https://bugs.webkit.org/show_bug.cgi?id=136851 + // In-page `selector#id sibling-combinator selector` fails + if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { + rbuggyQSA.push(".#.+[+~]"); + } + }); + + assert(function( el ) { + el.innerHTML = "" + + ""; + + // Support: Windows 8 Native Apps + // The type and name attributes are restricted during .innerHTML assignment + var input = document.createElement("input"); + input.setAttribute( "type", "hidden" ); + el.appendChild( input ).setAttribute( "name", "D" ); + + // Support: IE8 + // Enforce case-sensitivity of name attribute + if ( el.querySelectorAll("[name=d]").length ) { + rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); + } + + // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) + // IE8 throws error here and will not see later tests + if ( el.querySelectorAll(":enabled").length !== 2 ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Support: IE9-11+ + // IE's :disabled selector does not pick up the children of disabled fieldsets + docElem.appendChild( el ).disabled = true; + if ( el.querySelectorAll(":disabled").length !== 2 ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Opera 10-11 does not throw on post-comma invalid pseudos + el.querySelectorAll("*,:x"); + rbuggyQSA.push(",.*:"); + }); + } + + if ( (support.matchesSelector = rnative.test( (matches = docElem.matches || + docElem.webkitMatchesSelector || + docElem.mozMatchesSelector || + docElem.oMatchesSelector || + docElem.msMatchesSelector) )) ) { + + assert(function( el ) { + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9) + support.disconnectedMatch = matches.call( el, "*" ); + + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( el, "[s!='']:x" ); + rbuggyMatches.push( "!=", pseudos ); + }); + } + + rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); + rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); + + /* Contains + ---------------------------------------------------------------------- */ + hasCompare = rnative.test( docElem.compareDocumentPosition ); + + // Element contains another + // Purposefully self-exclusive + // As in, an element does not contain itself + contains = hasCompare || rnative.test( docElem.contains ) ? + function( a, b ) { + var adown = a.nodeType === 9 ? a.documentElement : a, + bup = b && b.parentNode; + return a === bup || !!( bup && bup.nodeType === 1 && ( + adown.contains ? + adown.contains( bup ) : + a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 + )); + } : + function( a, b ) { + if ( b ) { + while ( (b = b.parentNode) ) { + if ( b === a ) { + return true; + } + } + } + return false; + }; + + /* Sorting + ---------------------------------------------------------------------- */ + + // Document order sorting + sortOrder = hasCompare ? + function( a, b ) { + + // Flag for duplicate removal + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + // Sort on method existence if only one input has compareDocumentPosition + var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; + if ( compare ) { + return compare; + } + + // Calculate position if both inputs belong to the same document + compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ? + a.compareDocumentPosition( b ) : + + // Otherwise we know they are disconnected + 1; + + // Disconnected nodes + if ( compare & 1 || + (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { + + // Choose the first element that is related to our preferred document + if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { + return -1; + } + if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) { + return 1; + } + + // Maintain original order + return sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + } + + return compare & 4 ? -1 : 1; + } : + function( a, b ) { + // Exit early if the nodes are identical + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + var cur, + i = 0, + aup = a.parentNode, + bup = b.parentNode, + ap = [ a ], + bp = [ b ]; + + // Parentless nodes are either documents or disconnected + if ( !aup || !bup ) { + return a === document ? -1 : + b === document ? 1 : + aup ? -1 : + bup ? 1 : + sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + + // If the nodes are siblings, we can do a quick check + } else if ( aup === bup ) { + return siblingCheck( a, b ); + } + + // Otherwise we need full lists of their ancestors for comparison + cur = a; + while ( (cur = cur.parentNode) ) { + ap.unshift( cur ); + } + cur = b; + while ( (cur = cur.parentNode) ) { + bp.unshift( cur ); + } + + // Walk down the tree looking for a discrepancy + while ( ap[i] === bp[i] ) { + i++; + } + + return i ? + // Do a sibling check if the nodes have a common ancestor + siblingCheck( ap[i], bp[i] ) : + + // Otherwise nodes in our document sort first + ap[i] === preferredDoc ? -1 : + bp[i] === preferredDoc ? 1 : + 0; + }; + + return document; +}; + +Sizzle.matches = function( expr, elements ) { + return Sizzle( expr, null, null, elements ); +}; + +Sizzle.matchesSelector = function( elem, expr ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + // Make sure that attribute selectors are quoted + expr = expr.replace( rattributeQuotes, "='$1']" ); + + if ( support.matchesSelector && documentIsHTML && + !compilerCache[ expr + " " ] && + ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && + ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { + + try { + var ret = matches.call( elem, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || support.disconnectedMatch || + // As well, disconnected nodes are said to be in a document + // fragment in IE 9 + elem.document && elem.document.nodeType !== 11 ) { + return ret; + } + } catch (e) {} + } + + return Sizzle( expr, document, null, [ elem ] ).length > 0; +}; + +Sizzle.contains = function( context, elem ) { + // Set document vars if needed + if ( ( context.ownerDocument || context ) !== document ) { + setDocument( context ); + } + return contains( context, elem ); +}; + +Sizzle.attr = function( elem, name ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + var fn = Expr.attrHandle[ name.toLowerCase() ], + // Don't get fooled by Object.prototype properties (jQuery #13807) + val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? + fn( elem, name, !documentIsHTML ) : + undefined; + + return val !== undefined ? + val : + support.attributes || !documentIsHTML ? + elem.getAttribute( name ) : + (val = elem.getAttributeNode(name)) && val.specified ? + val.value : + null; +}; + +Sizzle.escape = function( sel ) { + return (sel + "").replace( rcssescape, fcssescape ); +}; + +Sizzle.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +/** + * Document sorting and removing duplicates + * @param {ArrayLike} results + */ +Sizzle.uniqueSort = function( results ) { + var elem, + duplicates = [], + j = 0, + i = 0; + + // Unless we *know* we can detect duplicates, assume their presence + hasDuplicate = !support.detectDuplicates; + sortInput = !support.sortStable && results.slice( 0 ); + results.sort( sortOrder ); + + if ( hasDuplicate ) { + while ( (elem = results[i++]) ) { + if ( elem === results[ i ] ) { + j = duplicates.push( i ); + } + } + while ( j-- ) { + results.splice( duplicates[ j ], 1 ); + } + } + + // Clear input after sorting to release objects + // See https://github.com/jquery/sizzle/pull/225 + sortInput = null; + + return results; +}; + +/** + * Utility function for retrieving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ +getText = Sizzle.getText = function( elem ) { + var node, + ret = "", + i = 0, + nodeType = elem.nodeType; + + if ( !nodeType ) { + // If no nodeType, this is expected to be an array + while ( (node = elem[i++]) ) { + // Do not traverse comment nodes + ret += getText( node ); + } + } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { + // Use textContent for elements + // innerText usage removed for consistency of new lines (jQuery #11153) + if ( typeof elem.textContent === "string" ) { + return elem.textContent; + } else { + // Traverse its children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + ret += getText( elem ); + } + } + } else if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + // Do not include comment or processing instruction nodes + + return ret; +}; + +Expr = Sizzle.selectors = { + + // Can be adjusted by the user + cacheLength: 50, + + createPseudo: markFunction, + + match: matchExpr, + + attrHandle: {}, + + find: {}, + + relative: { + ">": { dir: "parentNode", first: true }, + " ": { dir: "parentNode" }, + "+": { dir: "previousSibling", first: true }, + "~": { dir: "previousSibling" } + }, + + preFilter: { + "ATTR": function( match ) { + match[1] = match[1].replace( runescape, funescape ); + + // Move the given value to match[3] whether quoted or unquoted + match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape ); + + if ( match[2] === "~=" ) { + match[3] = " " + match[3] + " "; + } + + return match.slice( 0, 4 ); + }, + + "CHILD": function( match ) { + /* matches from matchExpr["CHILD"] + 1 type (only|nth|...) + 2 what (child|of-type) + 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) + 4 xn-component of xn+y argument ([+-]?\d*n|) + 5 sign of xn-component + 6 x of xn-component + 7 sign of y-component + 8 y of y-component + */ + match[1] = match[1].toLowerCase(); + + if ( match[1].slice( 0, 3 ) === "nth" ) { + // nth-* requires argument + if ( !match[3] ) { + Sizzle.error( match[0] ); + } + + // numeric x and y parameters for Expr.filter.CHILD + // remember that false/true cast respectively to 0/1 + match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); + match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); + + // other types prohibit arguments + } else if ( match[3] ) { + Sizzle.error( match[0] ); + } + + return match; + }, + + "PSEUDO": function( match ) { + var excess, + unquoted = !match[6] && match[2]; + + if ( matchExpr["CHILD"].test( match[0] ) ) { + return null; + } + + // Accept quoted arguments as-is + if ( match[3] ) { + match[2] = match[4] || match[5] || ""; + + // Strip excess characters from unquoted arguments + } else if ( unquoted && rpseudo.test( unquoted ) && + // Get excess from tokenize (recursively) + (excess = tokenize( unquoted, true )) && + // advance to the next closing parenthesis + (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { + + // excess is a negative index + match[0] = match[0].slice( 0, excess ); + match[2] = unquoted.slice( 0, excess ); + } + + // Return only captures needed by the pseudo filter method (type and argument) + return match.slice( 0, 3 ); + } + }, + + filter: { + + "TAG": function( nodeNameSelector ) { + var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); + return nodeNameSelector === "*" ? + function() { return true; } : + function( elem ) { + return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; + }; + }, + + "CLASS": function( className ) { + var pattern = classCache[ className + " " ]; + + return pattern || + (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && + classCache( className, function( elem ) { + return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" ); + }); + }, + + "ATTR": function( name, operator, check ) { + return function( elem ) { + var result = Sizzle.attr( elem, name ); + + if ( result == null ) { + return operator === "!="; + } + if ( !operator ) { + return true; + } + + result += ""; + + return operator === "=" ? result === check : + operator === "!=" ? result !== check : + operator === "^=" ? check && result.indexOf( check ) === 0 : + operator === "*=" ? check && result.indexOf( check ) > -1 : + operator === "$=" ? check && result.slice( -check.length ) === check : + operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : + operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : + false; + }; + }, + + "CHILD": function( type, what, argument, first, last ) { + var simple = type.slice( 0, 3 ) !== "nth", + forward = type.slice( -4 ) !== "last", + ofType = what === "of-type"; + + return first === 1 && last === 0 ? + + // Shortcut for :nth-*(n) + function( elem ) { + return !!elem.parentNode; + } : + + function( elem, context, xml ) { + var cache, uniqueCache, outerCache, node, nodeIndex, start, + dir = simple !== forward ? "nextSibling" : "previousSibling", + parent = elem.parentNode, + name = ofType && elem.nodeName.toLowerCase(), + useCache = !xml && !ofType, + diff = false; + + if ( parent ) { + + // :(first|last|only)-(child|of-type) + if ( simple ) { + while ( dir ) { + node = elem; + while ( (node = node[ dir ]) ) { + if ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) { + + return false; + } + } + // Reverse direction for :only-* (if we haven't yet done so) + start = dir = type === "only" && !start && "nextSibling"; + } + return true; + } + + start = [ forward ? parent.firstChild : parent.lastChild ]; + + // non-xml :nth-child(...) stores cache data on `parent` + if ( forward && useCache ) { + + // Seek `elem` from a previously-cached index + + // ...in a gzip-friendly way + node = parent; + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex && cache[ 2 ]; + node = nodeIndex && parent.childNodes[ nodeIndex ]; + + while ( (node = ++nodeIndex && node && node[ dir ] || + + // Fallback to seeking `elem` from the start + (diff = nodeIndex = 0) || start.pop()) ) { + + // When found, cache indexes on `parent` and break + if ( node.nodeType === 1 && ++diff && node === elem ) { + uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; + break; + } + } + + } else { + // Use previously-cached element index if available + if ( useCache ) { + // ...in a gzip-friendly way + node = elem; + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex; + } + + // xml :nth-child(...) + // or :nth-last-child(...) or :nth(-last)?-of-type(...) + if ( diff === false ) { + // Use the same loop as above to seek `elem` from the start + while ( (node = ++nodeIndex && node && node[ dir ] || + (diff = nodeIndex = 0) || start.pop()) ) { + + if ( ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) && + ++diff ) { + + // Cache the index of each encountered element + if ( useCache ) { + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + uniqueCache[ type ] = [ dirruns, diff ]; + } + + if ( node === elem ) { + break; + } + } + } + } + } + + // Incorporate the offset, then check against cycle size + diff -= last; + return diff === first || ( diff % first === 0 && diff / first >= 0 ); + } + }; + }, + + "PSEUDO": function( pseudo, argument ) { + // pseudo-class names are case-insensitive + // http://www.w3.org/TR/selectors/#pseudo-classes + // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters + // Remember that setFilters inherits from pseudos + var args, + fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || + Sizzle.error( "unsupported pseudo: " + pseudo ); + + // The user may use createPseudo to indicate that + // arguments are needed to create the filter function + // just as Sizzle does + if ( fn[ expando ] ) { + return fn( argument ); + } + + // But maintain support for old signatures + if ( fn.length > 1 ) { + args = [ pseudo, pseudo, "", argument ]; + return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? + markFunction(function( seed, matches ) { + var idx, + matched = fn( seed, argument ), + i = matched.length; + while ( i-- ) { + idx = indexOf( seed, matched[i] ); + seed[ idx ] = !( matches[ idx ] = matched[i] ); + } + }) : + function( elem ) { + return fn( elem, 0, args ); + }; + } + + return fn; + } + }, + + pseudos: { + // Potentially complex pseudos + "not": markFunction(function( selector ) { + // Trim the selector passed to compile + // to avoid treating leading and trailing + // spaces as combinators + var input = [], + results = [], + matcher = compile( selector.replace( rtrim, "$1" ) ); + + return matcher[ expando ] ? + markFunction(function( seed, matches, context, xml ) { + var elem, + unmatched = matcher( seed, null, xml, [] ), + i = seed.length; + + // Match elements unmatched by `matcher` + while ( i-- ) { + if ( (elem = unmatched[i]) ) { + seed[i] = !(matches[i] = elem); + } + } + }) : + function( elem, context, xml ) { + input[0] = elem; + matcher( input, null, xml, results ); + // Don't keep the element (issue #299) + input[0] = null; + return !results.pop(); + }; + }), + + "has": markFunction(function( selector ) { + return function( elem ) { + return Sizzle( selector, elem ).length > 0; + }; + }), + + "contains": markFunction(function( text ) { + text = text.replace( runescape, funescape ); + return function( elem ) { + return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; + }; + }), + + // "Whether an element is represented by a :lang() selector + // is based solely on the element's language value + // being equal to the identifier C, + // or beginning with the identifier C immediately followed by "-". + // The matching of C against the element's language value is performed case-insensitively. + // The identifier C does not have to be a valid language name." + // http://www.w3.org/TR/selectors/#lang-pseudo + "lang": markFunction( function( lang ) { + // lang value must be a valid identifier + if ( !ridentifier.test(lang || "") ) { + Sizzle.error( "unsupported lang: " + lang ); + } + lang = lang.replace( runescape, funescape ).toLowerCase(); + return function( elem ) { + var elemLang; + do { + if ( (elemLang = documentIsHTML ? + elem.lang : + elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { + + elemLang = elemLang.toLowerCase(); + return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; + } + } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); + return false; + }; + }), + + // Miscellaneous + "target": function( elem ) { + var hash = window.location && window.location.hash; + return hash && hash.slice( 1 ) === elem.id; + }, + + "root": function( elem ) { + return elem === docElem; + }, + + "focus": function( elem ) { + return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); + }, + + // Boolean properties + "enabled": createDisabledPseudo( false ), + "disabled": createDisabledPseudo( true ), + + "checked": function( elem ) { + // In CSS3, :checked should return both checked and selected elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + var nodeName = elem.nodeName.toLowerCase(); + return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); + }, + + "selected": function( elem ) { + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + // Contents + "empty": function( elem ) { + // http://www.w3.org/TR/selectors/#empty-pseudo + // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), + // but not by others (comment: 8; processing instruction: 7; etc.) + // nodeType < 6 works because attributes (2) do not appear as children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + if ( elem.nodeType < 6 ) { + return false; + } + } + return true; + }, + + "parent": function( elem ) { + return !Expr.pseudos["empty"]( elem ); + }, + + // Element/input types + "header": function( elem ) { + return rheader.test( elem.nodeName ); + }, + + "input": function( elem ) { + return rinputs.test( elem.nodeName ); + }, + + "button": function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === "button" || name === "button"; + }, + + "text": function( elem ) { + var attr; + return elem.nodeName.toLowerCase() === "input" && + elem.type === "text" && + + // Support: IE<8 + // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" + ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" ); + }, + + // Position-in-collection + "first": createPositionalPseudo(function() { + return [ 0 ]; + }), + + "last": createPositionalPseudo(function( matchIndexes, length ) { + return [ length - 1 ]; + }), + + "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { + return [ argument < 0 ? argument + length : argument ]; + }), + + "even": createPositionalPseudo(function( matchIndexes, length ) { + var i = 0; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "odd": createPositionalPseudo(function( matchIndexes, length ) { + var i = 1; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; --i >= 0; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; ++i < length; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }) + } +}; + +Expr.pseudos["nth"] = Expr.pseudos["eq"]; + +// Add button/input type pseudos +for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { + Expr.pseudos[ i ] = createInputPseudo( i ); +} +for ( i in { submit: true, reset: true } ) { + Expr.pseudos[ i ] = createButtonPseudo( i ); +} + +// Easy API for creating new setFilters +function setFilters() {} +setFilters.prototype = Expr.filters = Expr.pseudos; +Expr.setFilters = new setFilters(); + +tokenize = Sizzle.tokenize = function( selector, parseOnly ) { + var matched, match, tokens, type, + soFar, groups, preFilters, + cached = tokenCache[ selector + " " ]; + + if ( cached ) { + return parseOnly ? 0 : cached.slice( 0 ); + } + + soFar = selector; + groups = []; + preFilters = Expr.preFilter; + + while ( soFar ) { + + // Comma and first run + if ( !matched || (match = rcomma.exec( soFar )) ) { + if ( match ) { + // Don't consume trailing commas as valid + soFar = soFar.slice( match[0].length ) || soFar; + } + groups.push( (tokens = []) ); + } + + matched = false; + + // Combinators + if ( (match = rcombinators.exec( soFar )) ) { + matched = match.shift(); + tokens.push({ + value: matched, + // Cast descendant combinators to space + type: match[0].replace( rtrim, " " ) + }); + soFar = soFar.slice( matched.length ); + } + + // Filters + for ( type in Expr.filter ) { + if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || + (match = preFilters[ type ]( match ))) ) { + matched = match.shift(); + tokens.push({ + value: matched, + type: type, + matches: match + }); + soFar = soFar.slice( matched.length ); + } + } + + if ( !matched ) { + break; + } + } + + // Return the length of the invalid excess + // if we're just parsing + // Otherwise, throw an error or return tokens + return parseOnly ? + soFar.length : + soFar ? + Sizzle.error( selector ) : + // Cache the tokens + tokenCache( selector, groups ).slice( 0 ); +}; + +function toSelector( tokens ) { + var i = 0, + len = tokens.length, + selector = ""; + for ( ; i < len; i++ ) { + selector += tokens[i].value; + } + return selector; +} + +function addCombinator( matcher, combinator, base ) { + var dir = combinator.dir, + skip = combinator.next, + key = skip || dir, + checkNonElements = base && key === "parentNode", + doneName = done++; + + return combinator.first ? + // Check against closest ancestor/preceding element + function( elem, context, xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + return matcher( elem, context, xml ); + } + } + return false; + } : + + // Check against all ancestor/preceding elements + function( elem, context, xml ) { + var oldCache, uniqueCache, outerCache, + newCache = [ dirruns, doneName ]; + + // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching + if ( xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + if ( matcher( elem, context, xml ) ) { + return true; + } + } + } + } else { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + outerCache = elem[ expando ] || (elem[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {}); + + if ( skip && skip === elem.nodeName.toLowerCase() ) { + elem = elem[ dir ] || elem; + } else if ( (oldCache = uniqueCache[ key ]) && + oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { + + // Assign to newCache so results back-propagate to previous elements + return (newCache[ 2 ] = oldCache[ 2 ]); + } else { + // Reuse newcache so results back-propagate to previous elements + uniqueCache[ key ] = newCache; + + // A match means we're done; a fail means we have to keep checking + if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) { + return true; + } + } + } + } + } + return false; + }; +} + +function elementMatcher( matchers ) { + return matchers.length > 1 ? + function( elem, context, xml ) { + var i = matchers.length; + while ( i-- ) { + if ( !matchers[i]( elem, context, xml ) ) { + return false; + } + } + return true; + } : + matchers[0]; +} + +function multipleContexts( selector, contexts, results ) { + var i = 0, + len = contexts.length; + for ( ; i < len; i++ ) { + Sizzle( selector, contexts[i], results ); + } + return results; +} + +function condense( unmatched, map, filter, context, xml ) { + var elem, + newUnmatched = [], + i = 0, + len = unmatched.length, + mapped = map != null; + + for ( ; i < len; i++ ) { + if ( (elem = unmatched[i]) ) { + if ( !filter || filter( elem, context, xml ) ) { + newUnmatched.push( elem ); + if ( mapped ) { + map.push( i ); + } + } + } + } + + return newUnmatched; +} + +function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { + if ( postFilter && !postFilter[ expando ] ) { + postFilter = setMatcher( postFilter ); + } + if ( postFinder && !postFinder[ expando ] ) { + postFinder = setMatcher( postFinder, postSelector ); + } + return markFunction(function( seed, results, context, xml ) { + var temp, i, elem, + preMap = [], + postMap = [], + preexisting = results.length, + + // Get initial elements from seed or context + elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), + + // Prefilter to get matcher input, preserving a map for seed-results synchronization + matcherIn = preFilter && ( seed || !selector ) ? + condense( elems, preMap, preFilter, context, xml ) : + elems, + + matcherOut = matcher ? + // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, + postFinder || ( seed ? preFilter : preexisting || postFilter ) ? + + // ...intermediate processing is necessary + [] : + + // ...otherwise use results directly + results : + matcherIn; + + // Find primary matches + if ( matcher ) { + matcher( matcherIn, matcherOut, context, xml ); + } + + // Apply postFilter + if ( postFilter ) { + temp = condense( matcherOut, postMap ); + postFilter( temp, [], context, xml ); + + // Un-match failing elements by moving them back to matcherIn + i = temp.length; + while ( i-- ) { + if ( (elem = temp[i]) ) { + matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); + } + } + } + + if ( seed ) { + if ( postFinder || preFilter ) { + if ( postFinder ) { + // Get the final matcherOut by condensing this intermediate into postFinder contexts + temp = []; + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) ) { + // Restore matcherIn since elem is not yet a final match + temp.push( (matcherIn[i] = elem) ); + } + } + postFinder( null, (matcherOut = []), temp, xml ); + } + + // Move matched elements from seed to results to keep them synchronized + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) && + (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) { + + seed[temp] = !(results[temp] = elem); + } + } + } + + // Add elements to results, through postFinder if defined + } else { + matcherOut = condense( + matcherOut === results ? + matcherOut.splice( preexisting, matcherOut.length ) : + matcherOut + ); + if ( postFinder ) { + postFinder( null, results, matcherOut, xml ); + } else { + push.apply( results, matcherOut ); + } + } + }); +} + +function matcherFromTokens( tokens ) { + var checkContext, matcher, j, + len = tokens.length, + leadingRelative = Expr.relative[ tokens[0].type ], + implicitRelative = leadingRelative || Expr.relative[" "], + i = leadingRelative ? 1 : 0, + + // The foundational matcher ensures that elements are reachable from top-level context(s) + matchContext = addCombinator( function( elem ) { + return elem === checkContext; + }, implicitRelative, true ), + matchAnyContext = addCombinator( function( elem ) { + return indexOf( checkContext, elem ) > -1; + }, implicitRelative, true ), + matchers = [ function( elem, context, xml ) { + var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( + (checkContext = context).nodeType ? + matchContext( elem, context, xml ) : + matchAnyContext( elem, context, xml ) ); + // Avoid hanging onto element (issue #299) + checkContext = null; + return ret; + } ]; + + for ( ; i < len; i++ ) { + if ( (matcher = Expr.relative[ tokens[i].type ]) ) { + matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; + } else { + matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); + + // Return special upon seeing a positional matcher + if ( matcher[ expando ] ) { + // Find the next relative operator (if any) for proper handling + j = ++i; + for ( ; j < len; j++ ) { + if ( Expr.relative[ tokens[j].type ] ) { + break; + } + } + return setMatcher( + i > 1 && elementMatcher( matchers ), + i > 1 && toSelector( + // If the preceding token was a descendant combinator, insert an implicit any-element `*` + tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) + ).replace( rtrim, "$1" ), + matcher, + i < j && matcherFromTokens( tokens.slice( i, j ) ), + j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), + j < len && toSelector( tokens ) + ); + } + matchers.push( matcher ); + } + } + + return elementMatcher( matchers ); +} + +function matcherFromGroupMatchers( elementMatchers, setMatchers ) { + var bySet = setMatchers.length > 0, + byElement = elementMatchers.length > 0, + superMatcher = function( seed, context, xml, results, outermost ) { + var elem, j, matcher, + matchedCount = 0, + i = "0", + unmatched = seed && [], + setMatched = [], + contextBackup = outermostContext, + // We must always have either seed elements or outermost context + elems = seed || byElement && Expr.find["TAG"]( "*", outermost ), + // Use integer dirruns iff this is the outermost matcher + dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1), + len = elems.length; + + if ( outermost ) { + outermostContext = context === document || context || outermost; + } + + // Add elements passing elementMatchers directly to results + // Support: IE<9, Safari + // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id + for ( ; i !== len && (elem = elems[i]) != null; i++ ) { + if ( byElement && elem ) { + j = 0; + if ( !context && elem.ownerDocument !== document ) { + setDocument( elem ); + xml = !documentIsHTML; + } + while ( (matcher = elementMatchers[j++]) ) { + if ( matcher( elem, context || document, xml) ) { + results.push( elem ); + break; + } + } + if ( outermost ) { + dirruns = dirrunsUnique; + } + } + + // Track unmatched elements for set filters + if ( bySet ) { + // They will have gone through all possible matchers + if ( (elem = !matcher && elem) ) { + matchedCount--; + } + + // Lengthen the array for every element, matched or not + if ( seed ) { + unmatched.push( elem ); + } + } + } + + // `i` is now the count of elements visited above, and adding it to `matchedCount` + // makes the latter nonnegative. + matchedCount += i; + + // Apply set filters to unmatched elements + // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` + // equals `i`), unless we didn't visit _any_ elements in the above loop because we have + // no element matchers and no seed. + // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that + // case, which will result in a "00" `matchedCount` that differs from `i` but is also + // numerically zero. + if ( bySet && i !== matchedCount ) { + j = 0; + while ( (matcher = setMatchers[j++]) ) { + matcher( unmatched, setMatched, context, xml ); + } + + if ( seed ) { + // Reintegrate element matches to eliminate the need for sorting + if ( matchedCount > 0 ) { + while ( i-- ) { + if ( !(unmatched[i] || setMatched[i]) ) { + setMatched[i] = pop.call( results ); + } + } + } + + // Discard index placeholder values to get only actual matches + setMatched = condense( setMatched ); + } + + // Add matches to results + push.apply( results, setMatched ); + + // Seedless set matches succeeding multiple successful matchers stipulate sorting + if ( outermost && !seed && setMatched.length > 0 && + ( matchedCount + setMatchers.length ) > 1 ) { + + Sizzle.uniqueSort( results ); + } + } + + // Override manipulation of globals by nested matchers + if ( outermost ) { + dirruns = dirrunsUnique; + outermostContext = contextBackup; + } + + return unmatched; + }; + + return bySet ? + markFunction( superMatcher ) : + superMatcher; +} + +compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { + var i, + setMatchers = [], + elementMatchers = [], + cached = compilerCache[ selector + " " ]; + + if ( !cached ) { + // Generate a function of recursive functions that can be used to check each element + if ( !match ) { + match = tokenize( selector ); + } + i = match.length; + while ( i-- ) { + cached = matcherFromTokens( match[i] ); + if ( cached[ expando ] ) { + setMatchers.push( cached ); + } else { + elementMatchers.push( cached ); + } + } + + // Cache the compiled function + cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); + + // Save selector and tokenization + cached.selector = selector; + } + return cached; +}; + +/** + * A low-level selection function that works with Sizzle's compiled + * selector functions + * @param {String|Function} selector A selector or a pre-compiled + * selector function built with Sizzle.compile + * @param {Element} context + * @param {Array} [results] + * @param {Array} [seed] A set of elements to match against + */ +select = Sizzle.select = function( selector, context, results, seed ) { + var i, tokens, token, type, find, + compiled = typeof selector === "function" && selector, + match = !seed && tokenize( (selector = compiled.selector || selector) ); + + results = results || []; + + // Try to minimize operations if there is only one selector in the list and no seed + // (the latter of which guarantees us context) + if ( match.length === 1 ) { + + // Reduce context if the leading compound selector is an ID + tokens = match[0] = match[0].slice( 0 ); + if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && + context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) { + + context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; + if ( !context ) { + return results; + + // Precompiled matchers will still verify ancestry, so step up a level + } else if ( compiled ) { + context = context.parentNode; + } + + selector = selector.slice( tokens.shift().value.length ); + } + + // Fetch a seed set for right-to-left matching + i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; + while ( i-- ) { + token = tokens[i]; + + // Abort if we hit a combinator + if ( Expr.relative[ (type = token.type) ] ) { + break; + } + if ( (find = Expr.find[ type ]) ) { + // Search, expanding context for leading sibling combinators + if ( (seed = find( + token.matches[0].replace( runescape, funescape ), + rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context + )) ) { + + // If seed is empty or no tokens remain, we can return early + tokens.splice( i, 1 ); + selector = seed.length && toSelector( tokens ); + if ( !selector ) { + push.apply( results, seed ); + return results; + } + + break; + } + } + } + } + + // Compile and execute a filtering function if one is not provided + // Provide `match` to avoid retokenization if we modified the selector above + ( compiled || compile( selector, match ) )( + seed, + context, + !documentIsHTML, + results, + !context || rsibling.test( selector ) && testContext( context.parentNode ) || context + ); + return results; +}; + +// One-time assignments + +// Sort stability +support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; + +// Support: Chrome 14-35+ +// Always assume duplicates if they aren't passed to the comparison function +support.detectDuplicates = !!hasDuplicate; + +// Initialize against the default document +setDocument(); + +// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) +// Detached nodes confoundingly follow *each other* +support.sortDetached = assert(function( el ) { + // Should return 1, but returns 4 (following) + return el.compareDocumentPosition( document.createElement("fieldset") ) & 1; +}); + +// Support: IE<8 +// Prevent attribute/property "interpolation" +// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx +if ( !assert(function( el ) { + el.innerHTML = ""; + return el.firstChild.getAttribute("href") === "#" ; +}) ) { + addHandle( "type|href|height|width", function( elem, name, isXML ) { + if ( !isXML ) { + return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); + } + }); +} + +// Support: IE<9 +// Use defaultValue in place of getAttribute("value") +if ( !support.attributes || !assert(function( el ) { + el.innerHTML = ""; + el.firstChild.setAttribute( "value", "" ); + return el.firstChild.getAttribute( "value" ) === ""; +}) ) { + addHandle( "value", function( elem, name, isXML ) { + if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { + return elem.defaultValue; + } + }); +} + +// Support: IE<9 +// Use getAttributeNode to fetch booleans when getAttribute lies +if ( !assert(function( el ) { + return el.getAttribute("disabled") == null; +}) ) { + addHandle( booleans, function( elem, name, isXML ) { + var val; + if ( !isXML ) { + return elem[ name ] === true ? name.toLowerCase() : + (val = elem.getAttributeNode( name )) && val.specified ? + val.value : + null; + } + }); +} + +return Sizzle; + +})( window ); + + + +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; + +// Deprecated +jQuery.expr[ ":" ] = jQuery.expr.pseudos; +jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; +jQuery.escapeSelector = Sizzle.escape; + + + + +var dir = function( elem, dir, until ) { + var matched = [], + truncate = until !== undefined; + + while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { + if ( elem.nodeType === 1 ) { + if ( truncate && jQuery( elem ).is( until ) ) { + break; + } + matched.push( elem ); + } + } + return matched; +}; + + +var siblings = function( n, elem ) { + var matched = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + matched.push( n ); + } + } + + return matched; +}; + + +var rneedsContext = jQuery.expr.match.needsContext; + + + +function nodeName( elem, name ) { + + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + +}; +var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); + + + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, not ) { + if ( isFunction( qualifier ) ) { + return jQuery.grep( elements, function( elem, i ) { + return !!qualifier.call( elem, i, elem ) !== not; + } ); + } + + // Single element + if ( qualifier.nodeType ) { + return jQuery.grep( elements, function( elem ) { + return ( elem === qualifier ) !== not; + } ); + } + + // Arraylike of elements (jQuery, arguments, Array) + if ( typeof qualifier !== "string" ) { + return jQuery.grep( elements, function( elem ) { + return ( indexOf.call( qualifier, elem ) > -1 ) !== not; + } ); + } + + // Filtered directly for both simple and complex selectors + return jQuery.filter( qualifier, elements, not ); +} + +jQuery.filter = function( expr, elems, not ) { + var elem = elems[ 0 ]; + + if ( not ) { + expr = ":not(" + expr + ")"; + } + + if ( elems.length === 1 && elem.nodeType === 1 ) { + return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; + } + + return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { + return elem.nodeType === 1; + } ) ); +}; + +jQuery.fn.extend( { + find: function( selector ) { + var i, ret, + len = this.length, + self = this; + + if ( typeof selector !== "string" ) { + return this.pushStack( jQuery( selector ).filter( function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + } ) ); + } + + ret = this.pushStack( [] ); + + for ( i = 0; i < len; i++ ) { + jQuery.find( selector, self[ i ], ret ); + } + + return len > 1 ? jQuery.uniqueSort( ret ) : ret; + }, + filter: function( selector ) { + return this.pushStack( winnow( this, selector || [], false ) ); + }, + not: function( selector ) { + return this.pushStack( winnow( this, selector || [], true ) ); + }, + is: function( selector ) { + return !!winnow( + this, + + // If this is a positional/relative selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + typeof selector === "string" && rneedsContext.test( selector ) ? + jQuery( selector ) : + selector || [], + false + ).length; + } +} ); + + +// Initialize a jQuery object + + +// A central reference to the root jQuery(document) +var rootjQuery, + + // A simple way to check for HTML strings + // Prioritize #id over to avoid XSS via location.hash (#9521) + // Strict HTML recognition (#11290: must start with <) + // Shortcut simple #id case for speed + rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, + + init = jQuery.fn.init = function( selector, context, root ) { + var match, elem; + + // HANDLE: $(""), $(null), $(undefined), $(false) + if ( !selector ) { + return this; + } + + // Method init() accepts an alternate rootjQuery + // so migrate can support jQuery.sub (gh-2101) + root = root || rootjQuery; + + // Handle HTML strings + if ( typeof selector === "string" ) { + if ( selector[ 0 ] === "<" && + selector[ selector.length - 1 ] === ">" && + selector.length >= 3 ) { + + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = rquickExpr.exec( selector ); + } + + // Match html or make sure no context is specified for #id + if ( match && ( match[ 1 ] || !context ) ) { + + // HANDLE: $(html) -> $(array) + if ( match[ 1 ] ) { + context = context instanceof jQuery ? context[ 0 ] : context; + + // Option to run scripts is true for back-compat + // Intentionally let the error be thrown if parseHTML is not present + jQuery.merge( this, jQuery.parseHTML( + match[ 1 ], + context && context.nodeType ? context.ownerDocument || context : document, + true + ) ); + + // HANDLE: $(html, props) + if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { + for ( match in context ) { + + // Properties of context are called as methods if possible + if ( isFunction( this[ match ] ) ) { + this[ match ]( context[ match ] ); + + // ...and otherwise set as attributes + } else { + this.attr( match, context[ match ] ); + } + } + } + + return this; + + // HANDLE: $(#id) + } else { + elem = document.getElementById( match[ 2 ] ); + + if ( elem ) { + + // Inject the element directly into the jQuery object + this[ 0 ] = elem; + this.length = 1; + } + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return ( context || root ).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(DOMElement) + } else if ( selector.nodeType ) { + this[ 0 ] = selector; + this.length = 1; + return this; + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( isFunction( selector ) ) { + return root.ready !== undefined ? + root.ready( selector ) : + + // Execute immediately if ready is not present + selector( jQuery ); + } + + return jQuery.makeArray( selector, this ); + }; + +// Give the init function the jQuery prototype for later instantiation +init.prototype = jQuery.fn; + +// Initialize central reference +rootjQuery = jQuery( document ); + + +var rparentsprev = /^(?:parents|prev(?:Until|All))/, + + // Methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.fn.extend( { + has: function( target ) { + var targets = jQuery( target, this ), + l = targets.length; + + return this.filter( function() { + var i = 0; + for ( ; i < l; i++ ) { + if ( jQuery.contains( this, targets[ i ] ) ) { + return true; + } + } + } ); + }, + + closest: function( selectors, context ) { + var cur, + i = 0, + l = this.length, + matched = [], + targets = typeof selectors !== "string" && jQuery( selectors ); + + // Positional selectors never match, since there's no _selection_ context + if ( !rneedsContext.test( selectors ) ) { + for ( ; i < l; i++ ) { + for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { + + // Always skip document fragments + if ( cur.nodeType < 11 && ( targets ? + targets.index( cur ) > -1 : + + // Don't pass non-elements to Sizzle + cur.nodeType === 1 && + jQuery.find.matchesSelector( cur, selectors ) ) ) { + + matched.push( cur ); + break; + } + } + } + } + + return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); + }, + + // Determine the position of an element within the set + index: function( elem ) { + + // No argument, return index in parent + if ( !elem ) { + return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; + } + + // Index in selector + if ( typeof elem === "string" ) { + return indexOf.call( jQuery( elem ), this[ 0 ] ); + } + + // Locate the position of the desired element + return indexOf.call( this, + + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[ 0 ] : elem + ); + }, + + add: function( selector, context ) { + return this.pushStack( + jQuery.uniqueSort( + jQuery.merge( this.get(), jQuery( selector, context ) ) + ) + ); + }, + + addBack: function( selector ) { + return this.add( selector == null ? + this.prevObject : this.prevObject.filter( selector ) + ); + } +} ); + +function sibling( cur, dir ) { + while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} + return cur; +} + +jQuery.each( { + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, i, until ) { + return dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return sibling( elem, "nextSibling" ); + }, + prev: function( elem ) { + return sibling( elem, "previousSibling" ); + }, + nextAll: function( elem ) { + return dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, i, until ) { + return dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, i, until ) { + return dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return siblings( ( elem.parentNode || {} ).firstChild, elem ); + }, + children: function( elem ) { + return siblings( elem.firstChild ); + }, + contents: function( elem ) { + if ( nodeName( elem, "iframe" ) ) { + return elem.contentDocument; + } + + // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only + // Treat the template element as a regular one in browsers that + // don't support it. + if ( nodeName( elem, "template" ) ) { + elem = elem.content || elem; + } + + return jQuery.merge( [], elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var matched = jQuery.map( this, fn, until ); + + if ( name.slice( -5 ) !== "Until" ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + matched = jQuery.filter( selector, matched ); + } + + if ( this.length > 1 ) { + + // Remove duplicates + if ( !guaranteedUnique[ name ] ) { + jQuery.uniqueSort( matched ); + } + + // Reverse order for parents* and prev-derivatives + if ( rparentsprev.test( name ) ) { + matched.reverse(); + } + } + + return this.pushStack( matched ); + }; +} ); +var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); + + + +// Convert String-formatted options into Object-formatted ones +function createOptions( options ) { + var object = {}; + jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { + object[ flag ] = true; + } ); + return object; +} + +/* + * Create a callback list using the following parameters: + * + * options: an optional list of space-separated options that will change how + * the callback list behaves or a more traditional option object + * + * By default a callback list will act like an event callback list and can be + * "fired" multiple times. + * + * Possible options: + * + * once: will ensure the callback list can only be fired once (like a Deferred) + * + * memory: will keep track of previous values and will call any callback added + * after the list has been fired right away with the latest "memorized" + * values (like a Deferred) + * + * unique: will ensure a callback can only be added once (no duplicate in the list) + * + * stopOnFalse: interrupt callings when a callback returns false + * + */ +jQuery.Callbacks = function( options ) { + + // Convert options from String-formatted to Object-formatted if needed + // (we check in cache first) + options = typeof options === "string" ? + createOptions( options ) : + jQuery.extend( {}, options ); + + var // Flag to know if list is currently firing + firing, + + // Last fire value for non-forgettable lists + memory, + + // Flag to know if list was already fired + fired, + + // Flag to prevent firing + locked, + + // Actual callback list + list = [], + + // Queue of execution data for repeatable lists + queue = [], + + // Index of currently firing callback (modified by add/remove as needed) + firingIndex = -1, + + // Fire callbacks + fire = function() { + + // Enforce single-firing + locked = locked || options.once; + + // Execute callbacks for all pending executions, + // respecting firingIndex overrides and runtime changes + fired = firing = true; + for ( ; queue.length; firingIndex = -1 ) { + memory = queue.shift(); + while ( ++firingIndex < list.length ) { + + // Run callback and check for early termination + if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && + options.stopOnFalse ) { + + // Jump to end and forget the data so .add doesn't re-fire + firingIndex = list.length; + memory = false; + } + } + } + + // Forget the data if we're done with it + if ( !options.memory ) { + memory = false; + } + + firing = false; + + // Clean up if we're done firing for good + if ( locked ) { + + // Keep an empty list if we have data for future add calls + if ( memory ) { + list = []; + + // Otherwise, this object is spent + } else { + list = ""; + } + } + }, + + // Actual Callbacks object + self = { + + // Add a callback or a collection of callbacks to the list + add: function() { + if ( list ) { + + // If we have memory from a past run, we should fire after adding + if ( memory && !firing ) { + firingIndex = list.length - 1; + queue.push( memory ); + } + + ( function add( args ) { + jQuery.each( args, function( _, arg ) { + if ( isFunction( arg ) ) { + if ( !options.unique || !self.has( arg ) ) { + list.push( arg ); + } + } else if ( arg && arg.length && toType( arg ) !== "string" ) { + + // Inspect recursively + add( arg ); + } + } ); + } )( arguments ); + + if ( memory && !firing ) { + fire(); + } + } + return this; + }, + + // Remove a callback from the list + remove: function() { + jQuery.each( arguments, function( _, arg ) { + var index; + while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { + list.splice( index, 1 ); + + // Handle firing indexes + if ( index <= firingIndex ) { + firingIndex--; + } + } + } ); + return this; + }, + + // Check if a given callback is in the list. + // If no argument is given, return whether or not list has callbacks attached. + has: function( fn ) { + return fn ? + jQuery.inArray( fn, list ) > -1 : + list.length > 0; + }, + + // Remove all callbacks from the list + empty: function() { + if ( list ) { + list = []; + } + return this; + }, + + // Disable .fire and .add + // Abort any current/pending executions + // Clear all callbacks and values + disable: function() { + locked = queue = []; + list = memory = ""; + return this; + }, + disabled: function() { + return !list; + }, + + // Disable .fire + // Also disable .add unless we have memory (since it would have no effect) + // Abort any pending executions + lock: function() { + locked = queue = []; + if ( !memory && !firing ) { + list = memory = ""; + } + return this; + }, + locked: function() { + return !!locked; + }, + + // Call all callbacks with the given context and arguments + fireWith: function( context, args ) { + if ( !locked ) { + args = args || []; + args = [ context, args.slice ? args.slice() : args ]; + queue.push( args ); + if ( !firing ) { + fire(); + } + } + return this; + }, + + // Call all the callbacks with the given arguments + fire: function() { + self.fireWith( this, arguments ); + return this; + }, + + // To know if the callbacks have already been called at least once + fired: function() { + return !!fired; + } + }; + + return self; +}; + + +function Identity( v ) { + return v; +} +function Thrower( ex ) { + throw ex; +} + +function adoptValue( value, resolve, reject, noValue ) { + var method; + + try { + + // Check for promise aspect first to privilege synchronous behavior + if ( value && isFunction( ( method = value.promise ) ) ) { + method.call( value ).done( resolve ).fail( reject ); + + // Other thenables + } else if ( value && isFunction( ( method = value.then ) ) ) { + method.call( value, resolve, reject ); + + // Other non-thenables + } else { + + // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: + // * false: [ value ].slice( 0 ) => resolve( value ) + // * true: [ value ].slice( 1 ) => resolve() + resolve.apply( undefined, [ value ].slice( noValue ) ); + } + + // For Promises/A+, convert exceptions into rejections + // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in + // Deferred#then to conditionally suppress rejection. + } catch ( value ) { + + // Support: Android 4.0 only + // Strict mode functions invoked without .call/.apply get global-object context + reject.apply( undefined, [ value ] ); + } +} + +jQuery.extend( { + + Deferred: function( func ) { + var tuples = [ + + // action, add listener, callbacks, + // ... .then handlers, argument index, [final state] + [ "notify", "progress", jQuery.Callbacks( "memory" ), + jQuery.Callbacks( "memory" ), 2 ], + [ "resolve", "done", jQuery.Callbacks( "once memory" ), + jQuery.Callbacks( "once memory" ), 0, "resolved" ], + [ "reject", "fail", jQuery.Callbacks( "once memory" ), + jQuery.Callbacks( "once memory" ), 1, "rejected" ] + ], + state = "pending", + promise = { + state: function() { + return state; + }, + always: function() { + deferred.done( arguments ).fail( arguments ); + return this; + }, + "catch": function( fn ) { + return promise.then( null, fn ); + }, + + // Keep pipe for back-compat + pipe: function( /* fnDone, fnFail, fnProgress */ ) { + var fns = arguments; + + return jQuery.Deferred( function( newDefer ) { + jQuery.each( tuples, function( i, tuple ) { + + // Map tuples (progress, done, fail) to arguments (done, fail, progress) + var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; + + // deferred.progress(function() { bind to newDefer or newDefer.notify }) + // deferred.done(function() { bind to newDefer or newDefer.resolve }) + // deferred.fail(function() { bind to newDefer or newDefer.reject }) + deferred[ tuple[ 1 ] ]( function() { + var returned = fn && fn.apply( this, arguments ); + if ( returned && isFunction( returned.promise ) ) { + returned.promise() + .progress( newDefer.notify ) + .done( newDefer.resolve ) + .fail( newDefer.reject ); + } else { + newDefer[ tuple[ 0 ] + "With" ]( + this, + fn ? [ returned ] : arguments + ); + } + } ); + } ); + fns = null; + } ).promise(); + }, + then: function( onFulfilled, onRejected, onProgress ) { + var maxDepth = 0; + function resolve( depth, deferred, handler, special ) { + return function() { + var that = this, + args = arguments, + mightThrow = function() { + var returned, then; + + // Support: Promises/A+ section 2.3.3.3.3 + // https://promisesaplus.com/#point-59 + // Ignore double-resolution attempts + if ( depth < maxDepth ) { + return; + } + + returned = handler.apply( that, args ); + + // Support: Promises/A+ section 2.3.1 + // https://promisesaplus.com/#point-48 + if ( returned === deferred.promise() ) { + throw new TypeError( "Thenable self-resolution" ); + } + + // Support: Promises/A+ sections 2.3.3.1, 3.5 + // https://promisesaplus.com/#point-54 + // https://promisesaplus.com/#point-75 + // Retrieve `then` only once + then = returned && + + // Support: Promises/A+ section 2.3.4 + // https://promisesaplus.com/#point-64 + // Only check objects and functions for thenability + ( typeof returned === "object" || + typeof returned === "function" ) && + returned.then; + + // Handle a returned thenable + if ( isFunction( then ) ) { + + // Special processors (notify) just wait for resolution + if ( special ) { + then.call( + returned, + resolve( maxDepth, deferred, Identity, special ), + resolve( maxDepth, deferred, Thrower, special ) + ); + + // Normal processors (resolve) also hook into progress + } else { + + // ...and disregard older resolution values + maxDepth++; + + then.call( + returned, + resolve( maxDepth, deferred, Identity, special ), + resolve( maxDepth, deferred, Thrower, special ), + resolve( maxDepth, deferred, Identity, + deferred.notifyWith ) + ); + } + + // Handle all other returned values + } else { + + // Only substitute handlers pass on context + // and multiple values (non-spec behavior) + if ( handler !== Identity ) { + that = undefined; + args = [ returned ]; + } + + // Process the value(s) + // Default process is resolve + ( special || deferred.resolveWith )( that, args ); + } + }, + + // Only normal processors (resolve) catch and reject exceptions + process = special ? + mightThrow : + function() { + try { + mightThrow(); + } catch ( e ) { + + if ( jQuery.Deferred.exceptionHook ) { + jQuery.Deferred.exceptionHook( e, + process.stackTrace ); + } + + // Support: Promises/A+ section 2.3.3.3.4.1 + // https://promisesaplus.com/#point-61 + // Ignore post-resolution exceptions + if ( depth + 1 >= maxDepth ) { + + // Only substitute handlers pass on context + // and multiple values (non-spec behavior) + if ( handler !== Thrower ) { + that = undefined; + args = [ e ]; + } + + deferred.rejectWith( that, args ); + } + } + }; + + // Support: Promises/A+ section 2.3.3.3.1 + // https://promisesaplus.com/#point-57 + // Re-resolve promises immediately to dodge false rejection from + // subsequent errors + if ( depth ) { + process(); + } else { + + // Call an optional hook to record the stack, in case of exception + // since it's otherwise lost when execution goes async + if ( jQuery.Deferred.getStackHook ) { + process.stackTrace = jQuery.Deferred.getStackHook(); + } + window.setTimeout( process ); + } + }; + } + + return jQuery.Deferred( function( newDefer ) { + + // progress_handlers.add( ... ) + tuples[ 0 ][ 3 ].add( + resolve( + 0, + newDefer, + isFunction( onProgress ) ? + onProgress : + Identity, + newDefer.notifyWith + ) + ); + + // fulfilled_handlers.add( ... ) + tuples[ 1 ][ 3 ].add( + resolve( + 0, + newDefer, + isFunction( onFulfilled ) ? + onFulfilled : + Identity + ) + ); + + // rejected_handlers.add( ... ) + tuples[ 2 ][ 3 ].add( + resolve( + 0, + newDefer, + isFunction( onRejected ) ? + onRejected : + Thrower + ) + ); + } ).promise(); + }, + + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + return obj != null ? jQuery.extend( obj, promise ) : promise; + } + }, + deferred = {}; + + // Add list-specific methods + jQuery.each( tuples, function( i, tuple ) { + var list = tuple[ 2 ], + stateString = tuple[ 5 ]; + + // promise.progress = list.add + // promise.done = list.add + // promise.fail = list.add + promise[ tuple[ 1 ] ] = list.add; + + // Handle state + if ( stateString ) { + list.add( + function() { + + // state = "resolved" (i.e., fulfilled) + // state = "rejected" + state = stateString; + }, + + // rejected_callbacks.disable + // fulfilled_callbacks.disable + tuples[ 3 - i ][ 2 ].disable, + + // rejected_handlers.disable + // fulfilled_handlers.disable + tuples[ 3 - i ][ 3 ].disable, + + // progress_callbacks.lock + tuples[ 0 ][ 2 ].lock, + + // progress_handlers.lock + tuples[ 0 ][ 3 ].lock + ); + } + + // progress_handlers.fire + // fulfilled_handlers.fire + // rejected_handlers.fire + list.add( tuple[ 3 ].fire ); + + // deferred.notify = function() { deferred.notifyWith(...) } + // deferred.resolve = function() { deferred.resolveWith(...) } + // deferred.reject = function() { deferred.rejectWith(...) } + deferred[ tuple[ 0 ] ] = function() { + deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); + return this; + }; + + // deferred.notifyWith = list.fireWith + // deferred.resolveWith = list.fireWith + // deferred.rejectWith = list.fireWith + deferred[ tuple[ 0 ] + "With" ] = list.fireWith; + } ); + + // Make the deferred a promise + promise.promise( deferred ); + + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function( singleValue ) { + var + + // count of uncompleted subordinates + remaining = arguments.length, + + // count of unprocessed arguments + i = remaining, + + // subordinate fulfillment data + resolveContexts = Array( i ), + resolveValues = slice.call( arguments ), + + // the master Deferred + master = jQuery.Deferred(), + + // subordinate callback factory + updateFunc = function( i ) { + return function( value ) { + resolveContexts[ i ] = this; + resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; + if ( !( --remaining ) ) { + master.resolveWith( resolveContexts, resolveValues ); + } + }; + }; + + // Single- and empty arguments are adopted like Promise.resolve + if ( remaining <= 1 ) { + adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject, + !remaining ); + + // Use .then() to unwrap secondary thenables (cf. gh-3000) + if ( master.state() === "pending" || + isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { + + return master.then(); + } + } + + // Multiple arguments are aggregated like Promise.all array elements + while ( i-- ) { + adoptValue( resolveValues[ i ], updateFunc( i ), master.reject ); + } + + return master.promise(); + } +} ); + + +// These usually indicate a programmer mistake during development, +// warn about them ASAP rather than swallowing them by default. +var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; + +jQuery.Deferred.exceptionHook = function( error, stack ) { + + // Support: IE 8 - 9 only + // Console exists when dev tools are open, which can happen at any time + if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { + window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); + } +}; + + + + +jQuery.readyException = function( error ) { + window.setTimeout( function() { + throw error; + } ); +}; + + + + +// The deferred used on DOM ready +var readyList = jQuery.Deferred(); + +jQuery.fn.ready = function( fn ) { + + readyList + .then( fn ) + + // Wrap jQuery.readyException in a function so that the lookup + // happens at the time of error handling instead of callback + // registration. + .catch( function( error ) { + jQuery.readyException( error ); + } ); + + return this; +}; + +jQuery.extend( { + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Handle when the DOM is ready + ready: function( wait ) { + + // Abort if there are pending holds or we're already ready + if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { + return; + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.resolveWith( document, [ jQuery ] ); + } +} ); + +jQuery.ready.then = readyList.then; + +// The ready event handler and self cleanup method +function completed() { + document.removeEventListener( "DOMContentLoaded", completed ); + window.removeEventListener( "load", completed ); + jQuery.ready(); +} + +// Catch cases where $(document).ready() is called +// after the browser event has already occurred. +// Support: IE <=9 - 10 only +// Older IE sometimes signals "interactive" too soon +if ( document.readyState === "complete" || + ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { + + // Handle it asynchronously to allow scripts the opportunity to delay ready + window.setTimeout( jQuery.ready ); + +} else { + + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", completed ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", completed ); +} + + + + +// Multifunctional method to get and set values of a collection +// The value/s can optionally be executed if it's a function +var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { + var i = 0, + len = elems.length, + bulk = key == null; + + // Sets many values + if ( toType( key ) === "object" ) { + chainable = true; + for ( i in key ) { + access( elems, fn, i, key[ i ], true, emptyGet, raw ); + } + + // Sets one value + } else if ( value !== undefined ) { + chainable = true; + + if ( !isFunction( value ) ) { + raw = true; + } + + if ( bulk ) { + + // Bulk operations run against the entire set + if ( raw ) { + fn.call( elems, value ); + fn = null; + + // ...except when executing function values + } else { + bulk = fn; + fn = function( elem, key, value ) { + return bulk.call( jQuery( elem ), value ); + }; + } + } + + if ( fn ) { + for ( ; i < len; i++ ) { + fn( + elems[ i ], key, raw ? + value : + value.call( elems[ i ], i, fn( elems[ i ], key ) ) + ); + } + } + } + + if ( chainable ) { + return elems; + } + + // Gets + if ( bulk ) { + return fn.call( elems ); + } + + return len ? fn( elems[ 0 ], key ) : emptyGet; +}; + + +// Matches dashed string for camelizing +var rmsPrefix = /^-ms-/, + rdashAlpha = /-([a-z])/g; + +// Used by camelCase as callback to replace() +function fcamelCase( all, letter ) { + return letter.toUpperCase(); +} + +// Convert dashed to camelCase; used by the css and data modules +// Support: IE <=9 - 11, Edge 12 - 15 +// Microsoft forgot to hump their vendor prefix (#9572) +function camelCase( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); +} +var acceptData = function( owner ) { + + // Accepts only: + // - Node + // - Node.ELEMENT_NODE + // - Node.DOCUMENT_NODE + // - Object + // - Any + return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); +}; + + + + +function Data() { + this.expando = jQuery.expando + Data.uid++; +} + +Data.uid = 1; + +Data.prototype = { + + cache: function( owner ) { + + // Check if the owner object already has a cache + var value = owner[ this.expando ]; + + // If not, create one + if ( !value ) { + value = {}; + + // We can accept data for non-element nodes in modern browsers, + // but we should not, see #8335. + // Always return an empty object. + if ( acceptData( owner ) ) { + + // If it is a node unlikely to be stringify-ed or looped over + // use plain assignment + if ( owner.nodeType ) { + owner[ this.expando ] = value; + + // Otherwise secure it in a non-enumerable property + // configurable must be true to allow the property to be + // deleted when data is removed + } else { + Object.defineProperty( owner, this.expando, { + value: value, + configurable: true + } ); + } + } + } + + return value; + }, + set: function( owner, data, value ) { + var prop, + cache = this.cache( owner ); + + // Handle: [ owner, key, value ] args + // Always use camelCase key (gh-2257) + if ( typeof data === "string" ) { + cache[ camelCase( data ) ] = value; + + // Handle: [ owner, { properties } ] args + } else { + + // Copy the properties one-by-one to the cache object + for ( prop in data ) { + cache[ camelCase( prop ) ] = data[ prop ]; + } + } + return cache; + }, + get: function( owner, key ) { + return key === undefined ? + this.cache( owner ) : + + // Always use camelCase key (gh-2257) + owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ]; + }, + access: function( owner, key, value ) { + + // In cases where either: + // + // 1. No key was specified + // 2. A string key was specified, but no value provided + // + // Take the "read" path and allow the get method to determine + // which value to return, respectively either: + // + // 1. The entire cache object + // 2. The data stored at the key + // + if ( key === undefined || + ( ( key && typeof key === "string" ) && value === undefined ) ) { + + return this.get( owner, key ); + } + + // When the key is not a string, or both a key and value + // are specified, set or extend (existing objects) with either: + // + // 1. An object of properties + // 2. A key and value + // + this.set( owner, key, value ); + + // Since the "set" path can have two possible entry points + // return the expected data based on which path was taken[*] + return value !== undefined ? value : key; + }, + remove: function( owner, key ) { + var i, + cache = owner[ this.expando ]; + + if ( cache === undefined ) { + return; + } + + if ( key !== undefined ) { + + // Support array or space separated string of keys + if ( Array.isArray( key ) ) { + + // If key is an array of keys... + // We always set camelCase keys, so remove that. + key = key.map( camelCase ); + } else { + key = camelCase( key ); + + // If a key with the spaces exists, use it. + // Otherwise, create an array by matching non-whitespace + key = key in cache ? + [ key ] : + ( key.match( rnothtmlwhite ) || [] ); + } + + i = key.length; + + while ( i-- ) { + delete cache[ key[ i ] ]; + } + } + + // Remove the expando if there's no more data + if ( key === undefined || jQuery.isEmptyObject( cache ) ) { + + // Support: Chrome <=35 - 45 + // Webkit & Blink performance suffers when deleting properties + // from DOM nodes, so set to undefined instead + // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) + if ( owner.nodeType ) { + owner[ this.expando ] = undefined; + } else { + delete owner[ this.expando ]; + } + } + }, + hasData: function( owner ) { + var cache = owner[ this.expando ]; + return cache !== undefined && !jQuery.isEmptyObject( cache ); + } +}; +var dataPriv = new Data(); + +var dataUser = new Data(); + + + +// Implementation Summary +// +// 1. Enforce API surface and semantic compatibility with 1.9.x branch +// 2. Improve the module's maintainability by reducing the storage +// paths to a single mechanism. +// 3. Use the same single mechanism to support "private" and "user" data. +// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) +// 5. Avoid exposing implementation details on user objects (eg. expando properties) +// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 + +var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, + rmultiDash = /[A-Z]/g; + +function getData( data ) { + if ( data === "true" ) { + return true; + } + + if ( data === "false" ) { + return false; + } + + if ( data === "null" ) { + return null; + } + + // Only convert to a number if it doesn't change the string + if ( data === +data + "" ) { + return +data; + } + + if ( rbrace.test( data ) ) { + return JSON.parse( data ); + } + + return data; +} + +function dataAttr( elem, key, data ) { + var name; + + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = getData( data ); + } catch ( e ) {} + + // Make sure we set the data so it isn't changed later + dataUser.set( elem, key, data ); + } else { + data = undefined; + } + } + return data; +} + +jQuery.extend( { + hasData: function( elem ) { + return dataUser.hasData( elem ) || dataPriv.hasData( elem ); + }, + + data: function( elem, name, data ) { + return dataUser.access( elem, name, data ); + }, + + removeData: function( elem, name ) { + dataUser.remove( elem, name ); + }, + + // TODO: Now that all calls to _data and _removeData have been replaced + // with direct calls to dataPriv methods, these can be deprecated. + _data: function( elem, name, data ) { + return dataPriv.access( elem, name, data ); + }, + + _removeData: function( elem, name ) { + dataPriv.remove( elem, name ); + } +} ); + +jQuery.fn.extend( { + data: function( key, value ) { + var i, name, data, + elem = this[ 0 ], + attrs = elem && elem.attributes; + + // Gets all values + if ( key === undefined ) { + if ( this.length ) { + data = dataUser.get( elem ); + + if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { + i = attrs.length; + while ( i-- ) { + + // Support: IE 11 only + // The attrs elements can be null (#14894) + if ( attrs[ i ] ) { + name = attrs[ i ].name; + if ( name.indexOf( "data-" ) === 0 ) { + name = camelCase( name.slice( 5 ) ); + dataAttr( elem, name, data[ name ] ); + } + } + } + dataPriv.set( elem, "hasDataAttrs", true ); + } + } + + return data; + } + + // Sets multiple values + if ( typeof key === "object" ) { + return this.each( function() { + dataUser.set( this, key ); + } ); + } + + return access( this, function( value ) { + var data; + + // The calling jQuery object (element matches) is not empty + // (and therefore has an element appears at this[ 0 ]) and the + // `value` parameter was not undefined. An empty jQuery object + // will result in `undefined` for elem = this[ 0 ] which will + // throw an exception if an attempt to read a data cache is made. + if ( elem && value === undefined ) { + + // Attempt to get data from the cache + // The key will always be camelCased in Data + data = dataUser.get( elem, key ); + if ( data !== undefined ) { + return data; + } + + // Attempt to "discover" the data in + // HTML5 custom data-* attrs + data = dataAttr( elem, key ); + if ( data !== undefined ) { + return data; + } + + // We tried really hard, but the data doesn't exist. + return; + } + + // Set the data... + this.each( function() { + + // We always store the camelCased key + dataUser.set( this, key, value ); + } ); + }, null, value, arguments.length > 1, null, true ); + }, + + removeData: function( key ) { + return this.each( function() { + dataUser.remove( this, key ); + } ); + } +} ); + + +jQuery.extend( { + queue: function( elem, type, data ) { + var queue; + + if ( elem ) { + type = ( type || "fx" ) + "queue"; + queue = dataPriv.get( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !queue || Array.isArray( data ) ) { + queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); + } else { + queue.push( data ); + } + } + return queue || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + startLength = queue.length, + fn = queue.shift(), + hooks = jQuery._queueHooks( elem, type ), + next = function() { + jQuery.dequeue( elem, type ); + }; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + startLength--; + } + + if ( fn ) { + + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift( "inprogress" ); + } + + // Clear up the last queue stop function + delete hooks.stop; + fn.call( elem, next, hooks ); + } + + if ( !startLength && hooks ) { + hooks.empty.fire(); + } + }, + + // Not public - generate a queueHooks object, or return the current one + _queueHooks: function( elem, type ) { + var key = type + "queueHooks"; + return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { + empty: jQuery.Callbacks( "once memory" ).add( function() { + dataPriv.remove( elem, [ type + "queue", key ] ); + } ) + } ); + } +} ); + +jQuery.fn.extend( { + queue: function( type, data ) { + var setter = 2; + + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + setter--; + } + + if ( arguments.length < setter ) { + return jQuery.queue( this[ 0 ], type ); + } + + return data === undefined ? + this : + this.each( function() { + var queue = jQuery.queue( this, type, data ); + + // Ensure a hooks for this queue + jQuery._queueHooks( this, type ); + + if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + } ); + }, + dequeue: function( type ) { + return this.each( function() { + jQuery.dequeue( this, type ); + } ); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, obj ) { + var tmp, + count = 1, + defer = jQuery.Deferred(), + elements = this, + i = this.length, + resolve = function() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + }; + + if ( typeof type !== "string" ) { + obj = type; + type = undefined; + } + type = type || "fx"; + + while ( i-- ) { + tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); + if ( tmp && tmp.empty ) { + count++; + tmp.empty.add( resolve ); + } + } + resolve(); + return defer.promise( obj ); + } +} ); +var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; + +var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); + + +var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; + +var isHiddenWithinTree = function( elem, el ) { + + // isHiddenWithinTree might be called from jQuery#filter function; + // in that case, element will be second argument + elem = el || elem; + + // Inline style trumps all + return elem.style.display === "none" || + elem.style.display === "" && + + // Otherwise, check computed style + // Support: Firefox <=43 - 45 + // Disconnected elements can have computed display: none, so first confirm that elem is + // in the document. + jQuery.contains( elem.ownerDocument, elem ) && + + jQuery.css( elem, "display" ) === "none"; + }; + +var swap = function( elem, options, callback, args ) { + var ret, name, + old = {}; + + // Remember the old values, and insert the new ones + for ( name in options ) { + old[ name ] = elem.style[ name ]; + elem.style[ name ] = options[ name ]; + } + + ret = callback.apply( elem, args || [] ); + + // Revert the old values + for ( name in options ) { + elem.style[ name ] = old[ name ]; + } + + return ret; +}; + + + + +function adjustCSS( elem, prop, valueParts, tween ) { + var adjusted, scale, + maxIterations = 20, + currentValue = tween ? + function() { + return tween.cur(); + } : + function() { + return jQuery.css( elem, prop, "" ); + }, + initial = currentValue(), + unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), + + // Starting value computation is required for potential unit mismatches + initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && + rcssNum.exec( jQuery.css( elem, prop ) ); + + if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { + + // Support: Firefox <=54 + // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144) + initial = initial / 2; + + // Trust units reported by jQuery.css + unit = unit || initialInUnit[ 3 ]; + + // Iteratively approximate from a nonzero starting point + initialInUnit = +initial || 1; + + while ( maxIterations-- ) { + + // Evaluate and update our best guess (doubling guesses that zero out). + // Finish if the scale equals or crosses 1 (making the old*new product non-positive). + jQuery.style( elem, prop, initialInUnit + unit ); + if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) { + maxIterations = 0; + } + initialInUnit = initialInUnit / scale; + + } + + initialInUnit = initialInUnit * 2; + jQuery.style( elem, prop, initialInUnit + unit ); + + // Make sure we update the tween properties later on + valueParts = valueParts || []; + } + + if ( valueParts ) { + initialInUnit = +initialInUnit || +initial || 0; + + // Apply relative offset (+=/-=) if specified + adjusted = valueParts[ 1 ] ? + initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : + +valueParts[ 2 ]; + if ( tween ) { + tween.unit = unit; + tween.start = initialInUnit; + tween.end = adjusted; + } + } + return adjusted; +} + + +var defaultDisplayMap = {}; + +function getDefaultDisplay( elem ) { + var temp, + doc = elem.ownerDocument, + nodeName = elem.nodeName, + display = defaultDisplayMap[ nodeName ]; + + if ( display ) { + return display; + } + + temp = doc.body.appendChild( doc.createElement( nodeName ) ); + display = jQuery.css( temp, "display" ); + + temp.parentNode.removeChild( temp ); + + if ( display === "none" ) { + display = "block"; + } + defaultDisplayMap[ nodeName ] = display; + + return display; +} + +function showHide( elements, show ) { + var display, elem, + values = [], + index = 0, + length = elements.length; + + // Determine new display value for elements that need to change + for ( ; index < length; index++ ) { + elem = elements[ index ]; + if ( !elem.style ) { + continue; + } + + display = elem.style.display; + if ( show ) { + + // Since we force visibility upon cascade-hidden elements, an immediate (and slow) + // check is required in this first loop unless we have a nonempty display value (either + // inline or about-to-be-restored) + if ( display === "none" ) { + values[ index ] = dataPriv.get( elem, "display" ) || null; + if ( !values[ index ] ) { + elem.style.display = ""; + } + } + if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { + values[ index ] = getDefaultDisplay( elem ); + } + } else { + if ( display !== "none" ) { + values[ index ] = "none"; + + // Remember what we're overwriting + dataPriv.set( elem, "display", display ); + } + } + } + + // Set the display of the elements in a second loop to avoid constant reflow + for ( index = 0; index < length; index++ ) { + if ( values[ index ] != null ) { + elements[ index ].style.display = values[ index ]; + } + } + + return elements; +} + +jQuery.fn.extend( { + show: function() { + return showHide( this, true ); + }, + hide: function() { + return showHide( this ); + }, + toggle: function( state ) { + if ( typeof state === "boolean" ) { + return state ? this.show() : this.hide(); + } + + return this.each( function() { + if ( isHiddenWithinTree( this ) ) { + jQuery( this ).show(); + } else { + jQuery( this ).hide(); + } + } ); + } +} ); +var rcheckableType = ( /^(?:checkbox|radio)$/i ); + +var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]+)/i ); + +var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i ); + + + +// We have to close these tags to support XHTML (#13200) +var wrapMap = { + + // Support: IE <=9 only + option: [ 1, "" ], + + // XHTML parsers do not magically insert elements in the + // same way that tag soup parsers do. So we cannot shorten + // this by omitting or other required elements. + thead: [ 1, "", "
      " ], + col: [ 2, "", "
      " ], + tr: [ 2, "", "
      " ], + td: [ 3, "", "
      " ], + + _default: [ 0, "", "" ] +}; + +// Support: IE <=9 only +wrapMap.optgroup = wrapMap.option; + +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + + +function getAll( context, tag ) { + + // Support: IE <=9 - 11 only + // Use typeof to avoid zero-argument method invocation on host objects (#15151) + var ret; + + if ( typeof context.getElementsByTagName !== "undefined" ) { + ret = context.getElementsByTagName( tag || "*" ); + + } else if ( typeof context.querySelectorAll !== "undefined" ) { + ret = context.querySelectorAll( tag || "*" ); + + } else { + ret = []; + } + + if ( tag === undefined || tag && nodeName( context, tag ) ) { + return jQuery.merge( [ context ], ret ); + } + + return ret; +} + + +// Mark scripts as having already been evaluated +function setGlobalEval( elems, refElements ) { + var i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + dataPriv.set( + elems[ i ], + "globalEval", + !refElements || dataPriv.get( refElements[ i ], "globalEval" ) + ); + } +} + + +var rhtml = /<|&#?\w+;/; + +function buildFragment( elems, context, scripts, selection, ignored ) { + var elem, tmp, tag, wrap, contains, j, + fragment = context.createDocumentFragment(), + nodes = [], + i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + elem = elems[ i ]; + + if ( elem || elem === 0 ) { + + // Add nodes directly + if ( toType( elem ) === "object" ) { + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); + + // Convert non-html into a text node + } else if ( !rhtml.test( elem ) ) { + nodes.push( context.createTextNode( elem ) ); + + // Convert html into DOM nodes + } else { + tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); + + // Deserialize a standard representation + tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); + wrap = wrapMap[ tag ] || wrapMap._default; + tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; + + // Descend through wrappers to the right content + j = wrap[ 0 ]; + while ( j-- ) { + tmp = tmp.lastChild; + } + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, tmp.childNodes ); + + // Remember the top-level container + tmp = fragment.firstChild; + + // Ensure the created nodes are orphaned (#12392) + tmp.textContent = ""; + } + } + } + + // Remove wrapper from fragment + fragment.textContent = ""; + + i = 0; + while ( ( elem = nodes[ i++ ] ) ) { + + // Skip elements already in the context collection (trac-4087) + if ( selection && jQuery.inArray( elem, selection ) > -1 ) { + if ( ignored ) { + ignored.push( elem ); + } + continue; + } + + contains = jQuery.contains( elem.ownerDocument, elem ); + + // Append to fragment + tmp = getAll( fragment.appendChild( elem ), "script" ); + + // Preserve script evaluation history + if ( contains ) { + setGlobalEval( tmp ); + } + + // Capture executables + if ( scripts ) { + j = 0; + while ( ( elem = tmp[ j++ ] ) ) { + if ( rscriptType.test( elem.type || "" ) ) { + scripts.push( elem ); + } + } + } + } + + return fragment; +} + + +( function() { + var fragment = document.createDocumentFragment(), + div = fragment.appendChild( document.createElement( "div" ) ), + input = document.createElement( "input" ); + + // Support: Android 4.0 - 4.3 only + // Check state lost if the name is set (#11217) + // Support: Windows Web Apps (WWA) + // `name` and `type` must use .setAttribute for WWA (#14901) + input.setAttribute( "type", "radio" ); + input.setAttribute( "checked", "checked" ); + input.setAttribute( "name", "t" ); + + div.appendChild( input ); + + // Support: Android <=4.1 only + // Older WebKit doesn't clone checked state correctly in fragments + support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Support: IE <=11 only + // Make sure textarea (and checkbox) defaultValue is properly cloned + div.innerHTML = ""; + support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; +} )(); +var documentElement = document.documentElement; + + + +var + rkeyEvent = /^key/, + rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, + rtypenamespace = /^([^.]*)(?:\.(.+)|)/; + +function returnTrue() { + return true; +} + +function returnFalse() { + return false; +} + +// Support: IE <=9 only +// See #13393 for more info +function safeActiveElement() { + try { + return document.activeElement; + } catch ( err ) { } +} + +function on( elem, types, selector, data, fn, one ) { + var origFn, type; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { + + // ( types-Object, data ) + data = data || selector; + selector = undefined; + } + for ( type in types ) { + on( elem, type, selector, data, types[ type ], one ); + } + return elem; + } + + if ( data == null && fn == null ) { + + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return elem; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return elem.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + } ); +} + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +jQuery.event = { + + global: {}, + + add: function( elem, types, handler, data, selector ) { + + var handleObjIn, eventHandle, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.get( elem ); + + // Don't attach events to noData or text/comment nodes (but allow plain objects) + if ( !elemData ) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + selector = handleObjIn.selector; + } + + // Ensure that invalid selectors throw exceptions at attach time + // Evaluate against documentElement in case elem is a non-element node (e.g., document) + if ( selector ) { + jQuery.find.matchesSelector( documentElement, selector ); + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + if ( !( events = elemData.events ) ) { + events = elemData.events = {}; + } + if ( !( eventHandle = elemData.handle ) ) { + eventHandle = elemData.handle = function( e ) { + + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? + jQuery.event.dispatch.apply( elem, arguments ) : undefined; + }; + } + + // Handle multiple events separated by a space + types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // There *must* be a type, no attaching namespace-only handlers + if ( !type ) { + continue; + } + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[ type ] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = ( selector ? special.delegateType : special.bindType ) || type; + + // Update special based on newly reset type + special = jQuery.event.special[ type ] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend( { + type: type, + origType: origType, + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + needsContext: selector && jQuery.expr.match.needsContext.test( selector ), + namespace: namespaces.join( "." ) + }, handleObjIn ); + + // Init the event handler queue if we're the first + if ( !( handlers = events[ type ] ) ) { + handlers = events[ type ] = []; + handlers.delegateCount = 0; + + // Only use addEventListener if the special events handler returns false + if ( !special.setup || + special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); + } else { + handlers.push( handleObj ); + } + + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[ type ] = true; + } + + }, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector, mappedTypes ) { + + var j, origCount, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); + + if ( !elemData || !( events = elemData.events ) ) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // Unbind all events (on this namespace, if provided) for the element + if ( !type ) { + for ( type in events ) { + jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + } + continue; + } + + special = jQuery.event.special[ type ] || {}; + type = ( selector ? special.delegateType : special.bindType ) || type; + handlers = events[ type ] || []; + tmp = tmp[ 2 ] && + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); + + // Remove matching events + origCount = j = handlers.length; + while ( j-- ) { + handleObj = handlers[ j ]; + + if ( ( mappedTypes || origType === handleObj.origType ) && + ( !handler || handler.guid === handleObj.guid ) && + ( !tmp || tmp.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || + selector === "**" && handleObj.selector ) ) { + handlers.splice( j, 1 ); + + if ( handleObj.selector ) { + handlers.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if ( origCount && !handlers.length ) { + if ( !special.teardown || + special.teardown.call( elem, namespaces, elemData.handle ) === false ) { + + jQuery.removeEvent( elem, type, elemData.handle ); + } + + delete events[ type ]; + } + } + + // Remove data and the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + dataPriv.remove( elem, "handle events" ); + } + }, + + dispatch: function( nativeEvent ) { + + // Make a writable jQuery.Event from the native event object + var event = jQuery.event.fix( nativeEvent ); + + var i, j, ret, matched, handleObj, handlerQueue, + args = new Array( arguments.length ), + handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [], + special = jQuery.event.special[ event.type ] || {}; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[ 0 ] = event; + + for ( i = 1; i < arguments.length; i++ ) { + args[ i ] = arguments[ i ]; + } + + event.delegateTarget = this; + + // Call the preDispatch hook for the mapped type, and let it bail if desired + if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { + return; + } + + // Determine handlers + handlerQueue = jQuery.event.handlers.call( this, event, handlers ); + + // Run delegates first; they may want to stop propagation beneath us + i = 0; + while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { + event.currentTarget = matched.elem; + + j = 0; + while ( ( handleObj = matched.handlers[ j++ ] ) && + !event.isImmediatePropagationStopped() ) { + + // Triggered event must either 1) have no namespace, or 2) have namespace(s) + // a subset or equal to those in the bound event (both can have no namespace). + if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) { + + event.handleObj = handleObj; + event.data = handleObj.data; + + ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || + handleObj.handler ).apply( matched.elem, args ); + + if ( ret !== undefined ) { + if ( ( event.result = ret ) === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + // Call the postDispatch hook for the mapped type + if ( special.postDispatch ) { + special.postDispatch.call( this, event ); + } + + return event.result; + }, + + handlers: function( event, handlers ) { + var i, handleObj, sel, matchedHandlers, matchedSelectors, + handlerQueue = [], + delegateCount = handlers.delegateCount, + cur = event.target; + + // Find delegate handlers + if ( delegateCount && + + // Support: IE <=9 + // Black-hole SVG instance trees (trac-13180) + cur.nodeType && + + // Support: Firefox <=42 + // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) + // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click + // Support: IE 11 only + // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) + !( event.type === "click" && event.button >= 1 ) ) { + + for ( ; cur !== this; cur = cur.parentNode || this ) { + + // Don't check non-elements (#13208) + // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) + if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { + matchedHandlers = []; + matchedSelectors = {}; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + + // Don't conflict with Object.prototype properties (#13203) + sel = handleObj.selector + " "; + + if ( matchedSelectors[ sel ] === undefined ) { + matchedSelectors[ sel ] = handleObj.needsContext ? + jQuery( sel, this ).index( cur ) > -1 : + jQuery.find( sel, this, null, [ cur ] ).length; + } + if ( matchedSelectors[ sel ] ) { + matchedHandlers.push( handleObj ); + } + } + if ( matchedHandlers.length ) { + handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); + } + } + } + } + + // Add the remaining (directly-bound) handlers + cur = this; + if ( delegateCount < handlers.length ) { + handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); + } + + return handlerQueue; + }, + + addProp: function( name, hook ) { + Object.defineProperty( jQuery.Event.prototype, name, { + enumerable: true, + configurable: true, + + get: isFunction( hook ) ? + function() { + if ( this.originalEvent ) { + return hook( this.originalEvent ); + } + } : + function() { + if ( this.originalEvent ) { + return this.originalEvent[ name ]; + } + }, + + set: function( value ) { + Object.defineProperty( this, name, { + enumerable: true, + configurable: true, + writable: true, + value: value + } ); + } + } ); + }, + + fix: function( originalEvent ) { + return originalEvent[ jQuery.expando ] ? + originalEvent : + new jQuery.Event( originalEvent ); + }, + + special: { + load: { + + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + focus: { + + // Fire native event if possible so blur/focus sequence is correct + trigger: function() { + if ( this !== safeActiveElement() && this.focus ) { + this.focus(); + return false; + } + }, + delegateType: "focusin" + }, + blur: { + trigger: function() { + if ( this === safeActiveElement() && this.blur ) { + this.blur(); + return false; + } + }, + delegateType: "focusout" + }, + click: { + + // For checkbox, fire native event so checked state will be right + trigger: function() { + if ( this.type === "checkbox" && this.click && nodeName( this, "input" ) ) { + this.click(); + return false; + } + }, + + // For cross-browser consistency, don't fire native .click() on links + _default: function( event ) { + return nodeName( event.target, "a" ); + } + }, + + beforeunload: { + postDispatch: function( event ) { + + // Support: Firefox 20+ + // Firefox doesn't alert if the returnValue field is not set. + if ( event.result !== undefined && event.originalEvent ) { + event.originalEvent.returnValue = event.result; + } + } + } + } +}; + +jQuery.removeEvent = function( elem, type, handle ) { + + // This "if" is needed for plain objects + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle ); + } +}; + +jQuery.Event = function( src, props ) { + + // Allow instantiation without the 'new' keyword + if ( !( this instanceof jQuery.Event ) ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = src.defaultPrevented || + src.defaultPrevented === undefined && + + // Support: Android <=2.3 only + src.returnValue === false ? + returnTrue : + returnFalse; + + // Create target properties + // Support: Safari <=6 - 7 only + // Target should not be a text node (#504, #13143) + this.target = ( src.target && src.target.nodeType === 3 ) ? + src.target.parentNode : + src.target; + + this.currentTarget = src.currentTarget; + this.relatedTarget = src.relatedTarget; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || Date.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + constructor: jQuery.Event, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse, + isSimulated: false, + + preventDefault: function() { + var e = this.originalEvent; + + this.isDefaultPrevented = returnTrue; + + if ( e && !this.isSimulated ) { + e.preventDefault(); + } + }, + stopPropagation: function() { + var e = this.originalEvent; + + this.isPropagationStopped = returnTrue; + + if ( e && !this.isSimulated ) { + e.stopPropagation(); + } + }, + stopImmediatePropagation: function() { + var e = this.originalEvent; + + this.isImmediatePropagationStopped = returnTrue; + + if ( e && !this.isSimulated ) { + e.stopImmediatePropagation(); + } + + this.stopPropagation(); + } +}; + +// Includes all common event props including KeyEvent and MouseEvent specific props +jQuery.each( { + altKey: true, + bubbles: true, + cancelable: true, + changedTouches: true, + ctrlKey: true, + detail: true, + eventPhase: true, + metaKey: true, + pageX: true, + pageY: true, + shiftKey: true, + view: true, + "char": true, + charCode: true, + key: true, + keyCode: true, + button: true, + buttons: true, + clientX: true, + clientY: true, + offsetX: true, + offsetY: true, + pointerId: true, + pointerType: true, + screenX: true, + screenY: true, + targetTouches: true, + toElement: true, + touches: true, + + which: function( event ) { + var button = event.button; + + // Add which for key events + if ( event.which == null && rkeyEvent.test( event.type ) ) { + return event.charCode != null ? event.charCode : event.keyCode; + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) { + if ( button & 1 ) { + return 1; + } + + if ( button & 2 ) { + return 3; + } + + if ( button & 4 ) { + return 2; + } + + return 0; + } + + return event.which; + } +}, jQuery.event.addProp ); + +// Create mouseenter/leave events using mouseover/out and event-time checks +// so that event delegation works in jQuery. +// Do the same for pointerenter/pointerleave and pointerover/pointerout +// +// Support: Safari 7 only +// Safari sends mouseenter too often; see: +// https://bugs.chromium.org/p/chromium/issues/detail?id=470258 +// for the description of the bug (it existed in older Chrome versions as well). +jQuery.each( { + mouseenter: "mouseover", + mouseleave: "mouseout", + pointerenter: "pointerover", + pointerleave: "pointerout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + delegateType: fix, + bindType: fix, + + handle: function( event ) { + var ret, + target = this, + related = event.relatedTarget, + handleObj = event.handleObj; + + // For mouseenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply( this, arguments ); + event.type = fix; + } + return ret; + } + }; +} ); + +jQuery.fn.extend( { + + on: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn ); + }, + one: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + var handleObj, type; + if ( types && types.preventDefault && types.handleObj ) { + + // ( event ) dispatched jQuery.Event + handleObj = types.handleObj; + jQuery( types.delegateTarget ).off( + handleObj.namespace ? + handleObj.origType + "." + handleObj.namespace : + handleObj.origType, + handleObj.selector, + handleObj.handler + ); + return this; + } + if ( typeof types === "object" ) { + + // ( types-object [, selector] ) + for ( type in types ) { + this.off( type, selector, types[ type ] ); + } + return this; + } + if ( selector === false || typeof selector === "function" ) { + + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if ( fn === false ) { + fn = returnFalse; + } + return this.each( function() { + jQuery.event.remove( this, types, fn, selector ); + } ); + } +} ); + + +var + + /* eslint-disable max-len */ + + // See https://github.com/eslint/eslint/issues/3229 + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi, + + /* eslint-enable */ + + // Support: IE <=10 - 11, Edge 12 - 13 only + // In IE/Edge using regex groups here causes severe slowdowns. + // See https://connect.microsoft.com/IE/feedback/details/1736512/ + rnoInnerhtml = /\s*$/g; + +// Prefer a tbody over its parent table for containing new rows +function manipulationTarget( elem, content ) { + if ( nodeName( elem, "table" ) && + nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { + + return jQuery( elem ).children( "tbody" )[ 0 ] || elem; + } + + return elem; +} + +// Replace/restore the type attribute of script elements for safe DOM manipulation +function disableScript( elem ) { + elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; + return elem; +} +function restoreScript( elem ) { + if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) { + elem.type = elem.type.slice( 5 ); + } else { + elem.removeAttribute( "type" ); + } + + return elem; +} + +function cloneCopyEvent( src, dest ) { + var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events; + + if ( dest.nodeType !== 1 ) { + return; + } + + // 1. Copy private data: events, handlers, etc. + if ( dataPriv.hasData( src ) ) { + pdataOld = dataPriv.access( src ); + pdataCur = dataPriv.set( dest, pdataOld ); + events = pdataOld.events; + + if ( events ) { + delete pdataCur.handle; + pdataCur.events = {}; + + for ( type in events ) { + for ( i = 0, l = events[ type ].length; i < l; i++ ) { + jQuery.event.add( dest, type, events[ type ][ i ] ); + } + } + } + } + + // 2. Copy user data + if ( dataUser.hasData( src ) ) { + udataOld = dataUser.access( src ); + udataCur = jQuery.extend( {}, udataOld ); + + dataUser.set( dest, udataCur ); + } +} + +// Fix IE bugs, see support tests +function fixInput( src, dest ) { + var nodeName = dest.nodeName.toLowerCase(); + + // Fails to persist the checked state of a cloned checkbox or radio button. + if ( nodeName === "input" && rcheckableType.test( src.type ) ) { + dest.checked = src.checked; + + // Fails to return the selected option to the default selected state when cloning options + } else if ( nodeName === "input" || nodeName === "textarea" ) { + dest.defaultValue = src.defaultValue; + } +} + +function domManip( collection, args, callback, ignored ) { + + // Flatten any nested arrays + args = concat.apply( [], args ); + + var fragment, first, scripts, hasScripts, node, doc, + i = 0, + l = collection.length, + iNoClone = l - 1, + value = args[ 0 ], + valueIsFunction = isFunction( value ); + + // We can't cloneNode fragments that contain checked, in WebKit + if ( valueIsFunction || + ( l > 1 && typeof value === "string" && + !support.checkClone && rchecked.test( value ) ) ) { + return collection.each( function( index ) { + var self = collection.eq( index ); + if ( valueIsFunction ) { + args[ 0 ] = value.call( this, index, self.html() ); + } + domManip( self, args, callback, ignored ); + } ); + } + + if ( l ) { + fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); + first = fragment.firstChild; + + if ( fragment.childNodes.length === 1 ) { + fragment = first; + } + + // Require either new content or an interest in ignored elements to invoke the callback + if ( first || ignored ) { + scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); + hasScripts = scripts.length; + + // Use the original fragment for the last item + // instead of the first because it can end up + // being emptied incorrectly in certain situations (#8070). + for ( ; i < l; i++ ) { + node = fragment; + + if ( i !== iNoClone ) { + node = jQuery.clone( node, true, true ); + + // Keep references to cloned scripts for later restoration + if ( hasScripts ) { + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( scripts, getAll( node, "script" ) ); + } + } + + callback.call( collection[ i ], node, i ); + } + + if ( hasScripts ) { + doc = scripts[ scripts.length - 1 ].ownerDocument; + + // Reenable scripts + jQuery.map( scripts, restoreScript ); + + // Evaluate executable scripts on first document insertion + for ( i = 0; i < hasScripts; i++ ) { + node = scripts[ i ]; + if ( rscriptType.test( node.type || "" ) && + !dataPriv.access( node, "globalEval" ) && + jQuery.contains( doc, node ) ) { + + if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) { + + // Optional AJAX dependency, but won't run scripts if not present + if ( jQuery._evalUrl ) { + jQuery._evalUrl( node.src ); + } + } else { + DOMEval( node.textContent.replace( rcleanScript, "" ), doc, node ); + } + } + } + } + } + } + + return collection; +} + +function remove( elem, selector, keepData ) { + var node, + nodes = selector ? jQuery.filter( selector, elem ) : elem, + i = 0; + + for ( ; ( node = nodes[ i ] ) != null; i++ ) { + if ( !keepData && node.nodeType === 1 ) { + jQuery.cleanData( getAll( node ) ); + } + + if ( node.parentNode ) { + if ( keepData && jQuery.contains( node.ownerDocument, node ) ) { + setGlobalEval( getAll( node, "script" ) ); + } + node.parentNode.removeChild( node ); + } + } + + return elem; +} + +jQuery.extend( { + htmlPrefilter: function( html ) { + return html.replace( rxhtmlTag, "<$1>" ); + }, + + clone: function( elem, dataAndEvents, deepDataAndEvents ) { + var i, l, srcElements, destElements, + clone = elem.cloneNode( true ), + inPage = jQuery.contains( elem.ownerDocument, elem ); + + // Fix IE cloning issues + if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && + !jQuery.isXMLDoc( elem ) ) { + + // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 + destElements = getAll( clone ); + srcElements = getAll( elem ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + fixInput( srcElements[ i ], destElements[ i ] ); + } + } + + // Copy the events from the original to the clone + if ( dataAndEvents ) { + if ( deepDataAndEvents ) { + srcElements = srcElements || getAll( elem ); + destElements = destElements || getAll( clone ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + cloneCopyEvent( srcElements[ i ], destElements[ i ] ); + } + } else { + cloneCopyEvent( elem, clone ); + } + } + + // Preserve script evaluation history + destElements = getAll( clone, "script" ); + if ( destElements.length > 0 ) { + setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); + } + + // Return the cloned set + return clone; + }, + + cleanData: function( elems ) { + var data, elem, type, + special = jQuery.event.special, + i = 0; + + for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { + if ( acceptData( elem ) ) { + if ( ( data = elem[ dataPriv.expando ] ) ) { + if ( data.events ) { + for ( type in data.events ) { + if ( special[ type ] ) { + jQuery.event.remove( elem, type ); + + // This is a shortcut to avoid jQuery.event.remove's overhead + } else { + jQuery.removeEvent( elem, type, data.handle ); + } + } + } + + // Support: Chrome <=35 - 45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataPriv.expando ] = undefined; + } + if ( elem[ dataUser.expando ] ) { + + // Support: Chrome <=35 - 45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataUser.expando ] = undefined; + } + } + } + } +} ); + +jQuery.fn.extend( { + detach: function( selector ) { + return remove( this, selector, true ); + }, + + remove: function( selector ) { + return remove( this, selector ); + }, + + text: function( value ) { + return access( this, function( value ) { + return value === undefined ? + jQuery.text( this ) : + this.empty().each( function() { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + this.textContent = value; + } + } ); + }, null, value, arguments.length ); + }, + + append: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.appendChild( elem ); + } + } ); + }, + + prepend: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.insertBefore( elem, target.firstChild ); + } + } ); + }, + + before: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this ); + } + } ); + }, + + after: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this.nextSibling ); + } + } ); + }, + + empty: function() { + var elem, + i = 0; + + for ( ; ( elem = this[ i ] ) != null; i++ ) { + if ( elem.nodeType === 1 ) { + + // Prevent memory leaks + jQuery.cleanData( getAll( elem, false ) ); + + // Remove any remaining nodes + elem.textContent = ""; + } + } + + return this; + }, + + clone: function( dataAndEvents, deepDataAndEvents ) { + dataAndEvents = dataAndEvents == null ? false : dataAndEvents; + deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; + + return this.map( function() { + return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); + } ); + }, + + html: function( value ) { + return access( this, function( value ) { + var elem = this[ 0 ] || {}, + i = 0, + l = this.length; + + if ( value === undefined && elem.nodeType === 1 ) { + return elem.innerHTML; + } + + // See if we can take a shortcut and just use innerHTML + if ( typeof value === "string" && !rnoInnerhtml.test( value ) && + !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { + + value = jQuery.htmlPrefilter( value ); + + try { + for ( ; i < l; i++ ) { + elem = this[ i ] || {}; + + // Remove element nodes and prevent memory leaks + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + elem.innerHTML = value; + } + } + + elem = 0; + + // If using innerHTML throws an exception, use the fallback method + } catch ( e ) {} + } + + if ( elem ) { + this.empty().append( value ); + } + }, null, value, arguments.length ); + }, + + replaceWith: function() { + var ignored = []; + + // Make the changes, replacing each non-ignored context element with the new content + return domManip( this, arguments, function( elem ) { + var parent = this.parentNode; + + if ( jQuery.inArray( this, ignored ) < 0 ) { + jQuery.cleanData( getAll( this ) ); + if ( parent ) { + parent.replaceChild( elem, this ); + } + } + + // Force callback invocation + }, ignored ); + } +} ); + +jQuery.each( { + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" +}, function( name, original ) { + jQuery.fn[ name ] = function( selector ) { + var elems, + ret = [], + insert = jQuery( selector ), + last = insert.length - 1, + i = 0; + + for ( ; i <= last; i++ ) { + elems = i === last ? this : this.clone( true ); + jQuery( insert[ i ] )[ original ]( elems ); + + // Support: Android <=4.0 only, PhantomJS 1 only + // .get() because push.apply(_, arraylike) throws on ancient WebKit + push.apply( ret, elems.get() ); + } + + return this.pushStack( ret ); + }; +} ); +var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); + +var getStyles = function( elem ) { + + // Support: IE <=11 only, Firefox <=30 (#15098, #14150) + // IE throws on elements created in popups + // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" + var view = elem.ownerDocument.defaultView; + + if ( !view || !view.opener ) { + view = window; + } + + return view.getComputedStyle( elem ); + }; + +var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); + + + +( function() { + + // Executing both pixelPosition & boxSizingReliable tests require only one layout + // so they're executed at the same time to save the second computation. + function computeStyleTests() { + + // This is a singleton, we need to execute it only once + if ( !div ) { + return; + } + + container.style.cssText = "position:absolute;left:-11111px;width:60px;" + + "margin-top:1px;padding:0;border:0"; + div.style.cssText = + "position:relative;display:block;box-sizing:border-box;overflow:scroll;" + + "margin:auto;border:1px;padding:1px;" + + "width:60%;top:1%"; + documentElement.appendChild( container ).appendChild( div ); + + var divStyle = window.getComputedStyle( div ); + pixelPositionVal = divStyle.top !== "1%"; + + // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 + reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12; + + // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3 + // Some styles come back with percentage values, even though they shouldn't + div.style.right = "60%"; + pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36; + + // Support: IE 9 - 11 only + // Detect misreporting of content dimensions for box-sizing:border-box elements + boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36; + + // Support: IE 9 only + // Detect overflow:scroll screwiness (gh-3699) + div.style.position = "absolute"; + scrollboxSizeVal = div.offsetWidth === 36 || "absolute"; + + documentElement.removeChild( container ); + + // Nullify the div so it wouldn't be stored in the memory and + // it will also be a sign that checks already performed + div = null; + } + + function roundPixelMeasures( measure ) { + return Math.round( parseFloat( measure ) ); + } + + var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal, + reliableMarginLeftVal, + container = document.createElement( "div" ), + div = document.createElement( "div" ); + + // Finish early in limited (non-browser) environments + if ( !div.style ) { + return; + } + + // Support: IE <=9 - 11 only + // Style of cloned element affects source element cloned (#8908) + div.style.backgroundClip = "content-box"; + div.cloneNode( true ).style.backgroundClip = ""; + support.clearCloneStyle = div.style.backgroundClip === "content-box"; + + jQuery.extend( support, { + boxSizingReliable: function() { + computeStyleTests(); + return boxSizingReliableVal; + }, + pixelBoxStyles: function() { + computeStyleTests(); + return pixelBoxStylesVal; + }, + pixelPosition: function() { + computeStyleTests(); + return pixelPositionVal; + }, + reliableMarginLeft: function() { + computeStyleTests(); + return reliableMarginLeftVal; + }, + scrollboxSize: function() { + computeStyleTests(); + return scrollboxSizeVal; + } + } ); +} )(); + + +function curCSS( elem, name, computed ) { + var width, minWidth, maxWidth, ret, + + // Support: Firefox 51+ + // Retrieving style before computed somehow + // fixes an issue with getting wrong values + // on detached elements + style = elem.style; + + computed = computed || getStyles( elem ); + + // getPropertyValue is needed for: + // .css('filter') (IE 9 only, #12537) + // .css('--customProperty) (#3144) + if ( computed ) { + ret = computed.getPropertyValue( name ) || computed[ name ]; + + if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) { + ret = jQuery.style( elem, name ); + } + + // A tribute to the "awesome hack by Dean Edwards" + // Android Browser returns percentage for some values, + // but width seems to be reliably pixels. + // This is against the CSSOM draft spec: + // https://drafts.csswg.org/cssom/#resolved-values + if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) { + + // Remember the original values + width = style.width; + minWidth = style.minWidth; + maxWidth = style.maxWidth; + + // Put in the new values to get a computed value out + style.minWidth = style.maxWidth = style.width = ret; + ret = computed.width; + + // Revert the changed values + style.width = width; + style.minWidth = minWidth; + style.maxWidth = maxWidth; + } + } + + return ret !== undefined ? + + // Support: IE <=9 - 11 only + // IE returns zIndex value as an integer. + ret + "" : + ret; +} + + +function addGetHookIf( conditionFn, hookFn ) { + + // Define the hook, we'll check on the first run if it's really needed. + return { + get: function() { + if ( conditionFn() ) { + + // Hook not needed (or it's not possible to use it due + // to missing dependency), remove it. + delete this.get; + return; + } + + // Hook needed; redefine it so that the support test is not executed again. + return ( this.get = hookFn ).apply( this, arguments ); + } + }; +} + + +var + + // Swappable if display is none or starts with table + // except "table", "table-cell", or "table-caption" + // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display + rdisplayswap = /^(none|table(?!-c[ea]).+)/, + rcustomProp = /^--/, + cssShow = { position: "absolute", visibility: "hidden", display: "block" }, + cssNormalTransform = { + letterSpacing: "0", + fontWeight: "400" + }, + + cssPrefixes = [ "Webkit", "Moz", "ms" ], + emptyStyle = document.createElement( "div" ).style; + +// Return a css property mapped to a potentially vendor prefixed property +function vendorPropName( name ) { + + // Shortcut for names that are not vendor prefixed + if ( name in emptyStyle ) { + return name; + } + + // Check for vendor prefixed names + var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), + i = cssPrefixes.length; + + while ( i-- ) { + name = cssPrefixes[ i ] + capName; + if ( name in emptyStyle ) { + return name; + } + } +} + +// Return a property mapped along what jQuery.cssProps suggests or to +// a vendor prefixed property. +function finalPropName( name ) { + var ret = jQuery.cssProps[ name ]; + if ( !ret ) { + ret = jQuery.cssProps[ name ] = vendorPropName( name ) || name; + } + return ret; +} + +function setPositiveNumber( elem, value, subtract ) { + + // Any relative (+/-) values have already been + // normalized at this point + var matches = rcssNum.exec( value ); + return matches ? + + // Guard against undefined "subtract", e.g., when used as in cssHooks + Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : + value; +} + +function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) { + var i = dimension === "width" ? 1 : 0, + extra = 0, + delta = 0; + + // Adjustment may not be necessary + if ( box === ( isBorderBox ? "border" : "content" ) ) { + return 0; + } + + for ( ; i < 4; i += 2 ) { + + // Both box models exclude margin + if ( box === "margin" ) { + delta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); + } + + // If we get here with a content-box, we're seeking "padding" or "border" or "margin" + if ( !isBorderBox ) { + + // Add padding + delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + + // For "border" or "margin", add border + if ( box !== "padding" ) { + delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + + // But still keep track of it otherwise + } else { + extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + + // If we get here with a border-box (content + padding + border), we're seeking "content" or + // "padding" or "margin" + } else { + + // For "content", subtract padding + if ( box === "content" ) { + delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + } + + // For "content" or "padding", subtract border + if ( box !== "margin" ) { + delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + } + } + + // Account for positive content-box scroll gutter when requested by providing computedVal + if ( !isBorderBox && computedVal >= 0 ) { + + // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border + // Assuming integer scroll gutter, subtract the rest and round down + delta += Math.max( 0, Math.ceil( + elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - + computedVal - + delta - + extra - + 0.5 + ) ); + } + + return delta; +} + +function getWidthOrHeight( elem, dimension, extra ) { + + // Start with computed style + var styles = getStyles( elem ), + val = curCSS( elem, dimension, styles ), + isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box", + valueIsBorderBox = isBorderBox; + + // Support: Firefox <=54 + // Return a confounding non-pixel value or feign ignorance, as appropriate. + if ( rnumnonpx.test( val ) ) { + if ( !extra ) { + return val; + } + val = "auto"; + } + + // Check for style in case a browser which returns unreliable values + // for getComputedStyle silently falls back to the reliable elem.style + valueIsBorderBox = valueIsBorderBox && + ( support.boxSizingReliable() || val === elem.style[ dimension ] ); + + // Fall back to offsetWidth/offsetHeight when value is "auto" + // This happens for inline elements with no explicit setting (gh-3571) + // Support: Android <=4.1 - 4.3 only + // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) + if ( val === "auto" || + !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) { + + val = elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ]; + + // offsetWidth/offsetHeight provide border-box values + valueIsBorderBox = true; + } + + // Normalize "" and auto + val = parseFloat( val ) || 0; + + // Adjust for the element's box model + return ( val + + boxModelAdjustment( + elem, + dimension, + extra || ( isBorderBox ? "border" : "content" ), + valueIsBorderBox, + styles, + + // Provide the current computed size to request scroll gutter calculation (gh-3589) + val + ) + ) + "px"; +} + +jQuery.extend( { + + // Add in style property hooks for overriding the default + // behavior of getting and setting a style property + cssHooks: { + opacity: { + get: function( elem, computed ) { + if ( computed ) { + + // We should always get a number back from opacity + var ret = curCSS( elem, "opacity" ); + return ret === "" ? "1" : ret; + } + } + } + }, + + // Don't automatically add "px" to these possibly-unitless properties + cssNumber: { + "animationIterationCount": true, + "columnCount": true, + "fillOpacity": true, + "flexGrow": true, + "flexShrink": true, + "fontWeight": true, + "lineHeight": true, + "opacity": true, + "order": true, + "orphans": true, + "widows": true, + "zIndex": true, + "zoom": true + }, + + // Add in properties whose names you wish to fix before + // setting or getting the value + cssProps: {}, + + // Get and set the style property on a DOM Node + style: function( elem, name, value, extra ) { + + // Don't set styles on text and comment nodes + if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { + return; + } + + // Make sure that we're working with the right name + var ret, type, hooks, + origName = camelCase( name ), + isCustomProp = rcustomProp.test( name ), + style = elem.style; + + // Make sure that we're working with the right name. We don't + // want to query the value if it is a CSS custom property + // since they are user-defined. + if ( !isCustomProp ) { + name = finalPropName( origName ); + } + + // Gets hook for the prefixed version, then unprefixed version + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // Check if we're setting a value + if ( value !== undefined ) { + type = typeof value; + + // Convert "+=" or "-=" to relative numbers (#7345) + if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { + value = adjustCSS( elem, name, ret ); + + // Fixes bug #9237 + type = "number"; + } + + // Make sure that null and NaN values aren't set (#7116) + if ( value == null || value !== value ) { + return; + } + + // If a number was passed in, add the unit (except for certain CSS properties) + if ( type === "number" ) { + value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); + } + + // background-* props affect original clone's values + if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { + style[ name ] = "inherit"; + } + + // If a hook was provided, use that value, otherwise just set the specified value + if ( !hooks || !( "set" in hooks ) || + ( value = hooks.set( elem, value, extra ) ) !== undefined ) { + + if ( isCustomProp ) { + style.setProperty( name, value ); + } else { + style[ name ] = value; + } + } + + } else { + + // If a hook was provided get the non-computed value from there + if ( hooks && "get" in hooks && + ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { + + return ret; + } + + // Otherwise just get the value from the style object + return style[ name ]; + } + }, + + css: function( elem, name, extra, styles ) { + var val, num, hooks, + origName = camelCase( name ), + isCustomProp = rcustomProp.test( name ); + + // Make sure that we're working with the right name. We don't + // want to modify the value if it is a CSS custom property + // since they are user-defined. + if ( !isCustomProp ) { + name = finalPropName( origName ); + } + + // Try prefixed name followed by the unprefixed name + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // If a hook was provided get the computed value from there + if ( hooks && "get" in hooks ) { + val = hooks.get( elem, true, extra ); + } + + // Otherwise, if a way to get the computed value exists, use that + if ( val === undefined ) { + val = curCSS( elem, name, styles ); + } + + // Convert "normal" to computed value + if ( val === "normal" && name in cssNormalTransform ) { + val = cssNormalTransform[ name ]; + } + + // Make numeric if forced or a qualifier was provided and val looks numeric + if ( extra === "" || extra ) { + num = parseFloat( val ); + return extra === true || isFinite( num ) ? num || 0 : val; + } + + return val; + } +} ); + +jQuery.each( [ "height", "width" ], function( i, dimension ) { + jQuery.cssHooks[ dimension ] = { + get: function( elem, computed, extra ) { + if ( computed ) { + + // Certain elements can have dimension info if we invisibly show them + // but it must have a current display style that would benefit + return rdisplayswap.test( jQuery.css( elem, "display" ) ) && + + // Support: Safari 8+ + // Table columns in Safari have non-zero offsetWidth & zero + // getBoundingClientRect().width unless display is changed. + // Support: IE <=11 only + // Running getBoundingClientRect on a disconnected node + // in IE throws an error. + ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? + swap( elem, cssShow, function() { + return getWidthOrHeight( elem, dimension, extra ); + } ) : + getWidthOrHeight( elem, dimension, extra ); + } + }, + + set: function( elem, value, extra ) { + var matches, + styles = getStyles( elem ), + isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box", + subtract = extra && boxModelAdjustment( + elem, + dimension, + extra, + isBorderBox, + styles + ); + + // Account for unreliable border-box dimensions by comparing offset* to computed and + // faking a content-box to get border and padding (gh-3699) + if ( isBorderBox && support.scrollboxSize() === styles.position ) { + subtract -= Math.ceil( + elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - + parseFloat( styles[ dimension ] ) - + boxModelAdjustment( elem, dimension, "border", false, styles ) - + 0.5 + ); + } + + // Convert to pixels if value adjustment is needed + if ( subtract && ( matches = rcssNum.exec( value ) ) && + ( matches[ 3 ] || "px" ) !== "px" ) { + + elem.style[ dimension ] = value; + value = jQuery.css( elem, dimension ); + } + + return setPositiveNumber( elem, value, subtract ); + } + }; +} ); + +jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, + function( elem, computed ) { + if ( computed ) { + return ( parseFloat( curCSS( elem, "marginLeft" ) ) || + elem.getBoundingClientRect().left - + swap( elem, { marginLeft: 0 }, function() { + return elem.getBoundingClientRect().left; + } ) + ) + "px"; + } + } +); + +// These hooks are used by animate to expand properties +jQuery.each( { + margin: "", + padding: "", + border: "Width" +}, function( prefix, suffix ) { + jQuery.cssHooks[ prefix + suffix ] = { + expand: function( value ) { + var i = 0, + expanded = {}, + + // Assumes a single number if not a string + parts = typeof value === "string" ? value.split( " " ) : [ value ]; + + for ( ; i < 4; i++ ) { + expanded[ prefix + cssExpand[ i ] + suffix ] = + parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; + } + + return expanded; + } + }; + + if ( prefix !== "margin" ) { + jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; + } +} ); + +jQuery.fn.extend( { + css: function( name, value ) { + return access( this, function( elem, name, value ) { + var styles, len, + map = {}, + i = 0; + + if ( Array.isArray( name ) ) { + styles = getStyles( elem ); + len = name.length; + + for ( ; i < len; i++ ) { + map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); + } + + return map; + } + + return value !== undefined ? + jQuery.style( elem, name, value ) : + jQuery.css( elem, name ); + }, name, value, arguments.length > 1 ); + } +} ); + + +function Tween( elem, options, prop, end, easing ) { + return new Tween.prototype.init( elem, options, prop, end, easing ); +} +jQuery.Tween = Tween; + +Tween.prototype = { + constructor: Tween, + init: function( elem, options, prop, end, easing, unit ) { + this.elem = elem; + this.prop = prop; + this.easing = easing || jQuery.easing._default; + this.options = options; + this.start = this.now = this.cur(); + this.end = end; + this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); + }, + cur: function() { + var hooks = Tween.propHooks[ this.prop ]; + + return hooks && hooks.get ? + hooks.get( this ) : + Tween.propHooks._default.get( this ); + }, + run: function( percent ) { + var eased, + hooks = Tween.propHooks[ this.prop ]; + + if ( this.options.duration ) { + this.pos = eased = jQuery.easing[ this.easing ]( + percent, this.options.duration * percent, 0, 1, this.options.duration + ); + } else { + this.pos = eased = percent; + } + this.now = ( this.end - this.start ) * eased + this.start; + + if ( this.options.step ) { + this.options.step.call( this.elem, this.now, this ); + } + + if ( hooks && hooks.set ) { + hooks.set( this ); + } else { + Tween.propHooks._default.set( this ); + } + return this; + } +}; + +Tween.prototype.init.prototype = Tween.prototype; + +Tween.propHooks = { + _default: { + get: function( tween ) { + var result; + + // Use a property on the element directly when it is not a DOM element, + // or when there is no matching style property that exists. + if ( tween.elem.nodeType !== 1 || + tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { + return tween.elem[ tween.prop ]; + } + + // Passing an empty string as a 3rd parameter to .css will automatically + // attempt a parseFloat and fallback to a string if the parse fails. + // Simple values such as "10px" are parsed to Float; + // complex values such as "rotate(1rad)" are returned as-is. + result = jQuery.css( tween.elem, tween.prop, "" ); + + // Empty strings, null, undefined and "auto" are converted to 0. + return !result || result === "auto" ? 0 : result; + }, + set: function( tween ) { + + // Use step hook for back compat. + // Use cssHook if its there. + // Use .style if available and use plain properties where available. + if ( jQuery.fx.step[ tween.prop ] ) { + jQuery.fx.step[ tween.prop ]( tween ); + } else if ( tween.elem.nodeType === 1 && + ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || + jQuery.cssHooks[ tween.prop ] ) ) { + jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); + } else { + tween.elem[ tween.prop ] = tween.now; + } + } + } +}; + +// Support: IE <=9 only +// Panic based approach to setting things on disconnected nodes +Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { + set: function( tween ) { + if ( tween.elem.nodeType && tween.elem.parentNode ) { + tween.elem[ tween.prop ] = tween.now; + } + } +}; + +jQuery.easing = { + linear: function( p ) { + return p; + }, + swing: function( p ) { + return 0.5 - Math.cos( p * Math.PI ) / 2; + }, + _default: "swing" +}; + +jQuery.fx = Tween.prototype.init; + +// Back compat <1.8 extension point +jQuery.fx.step = {}; + + + + +var + fxNow, inProgress, + rfxtypes = /^(?:toggle|show|hide)$/, + rrun = /queueHooks$/; + +function schedule() { + if ( inProgress ) { + if ( document.hidden === false && window.requestAnimationFrame ) { + window.requestAnimationFrame( schedule ); + } else { + window.setTimeout( schedule, jQuery.fx.interval ); + } + + jQuery.fx.tick(); + } +} + +// Animations created synchronously will run synchronously +function createFxNow() { + window.setTimeout( function() { + fxNow = undefined; + } ); + return ( fxNow = Date.now() ); +} + +// Generate parameters to create a standard animation +function genFx( type, includeWidth ) { + var which, + i = 0, + attrs = { height: type }; + + // If we include width, step value is 1 to do all cssExpand values, + // otherwise step value is 2 to skip over Left and Right + includeWidth = includeWidth ? 1 : 0; + for ( ; i < 4; i += 2 - includeWidth ) { + which = cssExpand[ i ]; + attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; + } + + if ( includeWidth ) { + attrs.opacity = attrs.width = type; + } + + return attrs; +} + +function createTween( value, prop, animation ) { + var tween, + collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), + index = 0, + length = collection.length; + for ( ; index < length; index++ ) { + if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { + + // We're done with this property + return tween; + } + } +} + +function defaultPrefilter( elem, props, opts ) { + var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, + isBox = "width" in props || "height" in props, + anim = this, + orig = {}, + style = elem.style, + hidden = elem.nodeType && isHiddenWithinTree( elem ), + dataShow = dataPriv.get( elem, "fxshow" ); + + // Queue-skipping animations hijack the fx hooks + if ( !opts.queue ) { + hooks = jQuery._queueHooks( elem, "fx" ); + if ( hooks.unqueued == null ) { + hooks.unqueued = 0; + oldfire = hooks.empty.fire; + hooks.empty.fire = function() { + if ( !hooks.unqueued ) { + oldfire(); + } + }; + } + hooks.unqueued++; + + anim.always( function() { + + // Ensure the complete handler is called before this completes + anim.always( function() { + hooks.unqueued--; + if ( !jQuery.queue( elem, "fx" ).length ) { + hooks.empty.fire(); + } + } ); + } ); + } + + // Detect show/hide animations + for ( prop in props ) { + value = props[ prop ]; + if ( rfxtypes.test( value ) ) { + delete props[ prop ]; + toggle = toggle || value === "toggle"; + if ( value === ( hidden ? "hide" : "show" ) ) { + + // Pretend to be hidden if this is a "show" and + // there is still data from a stopped show/hide + if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { + hidden = true; + + // Ignore all other no-op show/hide data + } else { + continue; + } + } + orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); + } + } + + // Bail out if this is a no-op like .hide().hide() + propTween = !jQuery.isEmptyObject( props ); + if ( !propTween && jQuery.isEmptyObject( orig ) ) { + return; + } + + // Restrict "overflow" and "display" styles during box animations + if ( isBox && elem.nodeType === 1 ) { + + // Support: IE <=9 - 11, Edge 12 - 15 + // Record all 3 overflow attributes because IE does not infer the shorthand + // from identically-valued overflowX and overflowY and Edge just mirrors + // the overflowX value there. + opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; + + // Identify a display type, preferring old show/hide data over the CSS cascade + restoreDisplay = dataShow && dataShow.display; + if ( restoreDisplay == null ) { + restoreDisplay = dataPriv.get( elem, "display" ); + } + display = jQuery.css( elem, "display" ); + if ( display === "none" ) { + if ( restoreDisplay ) { + display = restoreDisplay; + } else { + + // Get nonempty value(s) by temporarily forcing visibility + showHide( [ elem ], true ); + restoreDisplay = elem.style.display || restoreDisplay; + display = jQuery.css( elem, "display" ); + showHide( [ elem ] ); + } + } + + // Animate inline elements as inline-block + if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { + if ( jQuery.css( elem, "float" ) === "none" ) { + + // Restore the original display value at the end of pure show/hide animations + if ( !propTween ) { + anim.done( function() { + style.display = restoreDisplay; + } ); + if ( restoreDisplay == null ) { + display = style.display; + restoreDisplay = display === "none" ? "" : display; + } + } + style.display = "inline-block"; + } + } + } + + if ( opts.overflow ) { + style.overflow = "hidden"; + anim.always( function() { + style.overflow = opts.overflow[ 0 ]; + style.overflowX = opts.overflow[ 1 ]; + style.overflowY = opts.overflow[ 2 ]; + } ); + } + + // Implement show/hide animations + propTween = false; + for ( prop in orig ) { + + // General show/hide setup for this element animation + if ( !propTween ) { + if ( dataShow ) { + if ( "hidden" in dataShow ) { + hidden = dataShow.hidden; + } + } else { + dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); + } + + // Store hidden/visible for toggle so `.stop().toggle()` "reverses" + if ( toggle ) { + dataShow.hidden = !hidden; + } + + // Show elements before animating them + if ( hidden ) { + showHide( [ elem ], true ); + } + + /* eslint-disable no-loop-func */ + + anim.done( function() { + + /* eslint-enable no-loop-func */ + + // The final step of a "hide" animation is actually hiding the element + if ( !hidden ) { + showHide( [ elem ] ); + } + dataPriv.remove( elem, "fxshow" ); + for ( prop in orig ) { + jQuery.style( elem, prop, orig[ prop ] ); + } + } ); + } + + // Per-property setup + propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); + if ( !( prop in dataShow ) ) { + dataShow[ prop ] = propTween.start; + if ( hidden ) { + propTween.end = propTween.start; + propTween.start = 0; + } + } + } +} + +function propFilter( props, specialEasing ) { + var index, name, easing, value, hooks; + + // camelCase, specialEasing and expand cssHook pass + for ( index in props ) { + name = camelCase( index ); + easing = specialEasing[ name ]; + value = props[ index ]; + if ( Array.isArray( value ) ) { + easing = value[ 1 ]; + value = props[ index ] = value[ 0 ]; + } + + if ( index !== name ) { + props[ name ] = value; + delete props[ index ]; + } + + hooks = jQuery.cssHooks[ name ]; + if ( hooks && "expand" in hooks ) { + value = hooks.expand( value ); + delete props[ name ]; + + // Not quite $.extend, this won't overwrite existing keys. + // Reusing 'index' because we have the correct "name" + for ( index in value ) { + if ( !( index in props ) ) { + props[ index ] = value[ index ]; + specialEasing[ index ] = easing; + } + } + } else { + specialEasing[ name ] = easing; + } + } +} + +function Animation( elem, properties, options ) { + var result, + stopped, + index = 0, + length = Animation.prefilters.length, + deferred = jQuery.Deferred().always( function() { + + // Don't match elem in the :animated selector + delete tick.elem; + } ), + tick = function() { + if ( stopped ) { + return false; + } + var currentTime = fxNow || createFxNow(), + remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), + + // Support: Android 2.3 only + // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) + temp = remaining / animation.duration || 0, + percent = 1 - temp, + index = 0, + length = animation.tweens.length; + + for ( ; index < length; index++ ) { + animation.tweens[ index ].run( percent ); + } + + deferred.notifyWith( elem, [ animation, percent, remaining ] ); + + // If there's more to do, yield + if ( percent < 1 && length ) { + return remaining; + } + + // If this was an empty animation, synthesize a final progress notification + if ( !length ) { + deferred.notifyWith( elem, [ animation, 1, 0 ] ); + } + + // Resolve the animation and report its conclusion + deferred.resolveWith( elem, [ animation ] ); + return false; + }, + animation = deferred.promise( { + elem: elem, + props: jQuery.extend( {}, properties ), + opts: jQuery.extend( true, { + specialEasing: {}, + easing: jQuery.easing._default + }, options ), + originalProperties: properties, + originalOptions: options, + startTime: fxNow || createFxNow(), + duration: options.duration, + tweens: [], + createTween: function( prop, end ) { + var tween = jQuery.Tween( elem, animation.opts, prop, end, + animation.opts.specialEasing[ prop ] || animation.opts.easing ); + animation.tweens.push( tween ); + return tween; + }, + stop: function( gotoEnd ) { + var index = 0, + + // If we are going to the end, we want to run all the tweens + // otherwise we skip this part + length = gotoEnd ? animation.tweens.length : 0; + if ( stopped ) { + return this; + } + stopped = true; + for ( ; index < length; index++ ) { + animation.tweens[ index ].run( 1 ); + } + + // Resolve when we played the last frame; otherwise, reject + if ( gotoEnd ) { + deferred.notifyWith( elem, [ animation, 1, 0 ] ); + deferred.resolveWith( elem, [ animation, gotoEnd ] ); + } else { + deferred.rejectWith( elem, [ animation, gotoEnd ] ); + } + return this; + } + } ), + props = animation.props; + + propFilter( props, animation.opts.specialEasing ); + + for ( ; index < length; index++ ) { + result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); + if ( result ) { + if ( isFunction( result.stop ) ) { + jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = + result.stop.bind( result ); + } + return result; + } + } + + jQuery.map( props, createTween, animation ); + + if ( isFunction( animation.opts.start ) ) { + animation.opts.start.call( elem, animation ); + } + + // Attach callbacks from options + animation + .progress( animation.opts.progress ) + .done( animation.opts.done, animation.opts.complete ) + .fail( animation.opts.fail ) + .always( animation.opts.always ); + + jQuery.fx.timer( + jQuery.extend( tick, { + elem: elem, + anim: animation, + queue: animation.opts.queue + } ) + ); + + return animation; +} + +jQuery.Animation = jQuery.extend( Animation, { + + tweeners: { + "*": [ function( prop, value ) { + var tween = this.createTween( prop, value ); + adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); + return tween; + } ] + }, + + tweener: function( props, callback ) { + if ( isFunction( props ) ) { + callback = props; + props = [ "*" ]; + } else { + props = props.match( rnothtmlwhite ); + } + + var prop, + index = 0, + length = props.length; + + for ( ; index < length; index++ ) { + prop = props[ index ]; + Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; + Animation.tweeners[ prop ].unshift( callback ); + } + }, + + prefilters: [ defaultPrefilter ], + + prefilter: function( callback, prepend ) { + if ( prepend ) { + Animation.prefilters.unshift( callback ); + } else { + Animation.prefilters.push( callback ); + } + } +} ); + +jQuery.speed = function( speed, easing, fn ) { + var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { + complete: fn || !fn && easing || + isFunction( speed ) && speed, + duration: speed, + easing: fn && easing || easing && !isFunction( easing ) && easing + }; + + // Go to the end state if fx are off + if ( jQuery.fx.off ) { + opt.duration = 0; + + } else { + if ( typeof opt.duration !== "number" ) { + if ( opt.duration in jQuery.fx.speeds ) { + opt.duration = jQuery.fx.speeds[ opt.duration ]; + + } else { + opt.duration = jQuery.fx.speeds._default; + } + } + } + + // Normalize opt.queue - true/undefined/null -> "fx" + if ( opt.queue == null || opt.queue === true ) { + opt.queue = "fx"; + } + + // Queueing + opt.old = opt.complete; + + opt.complete = function() { + if ( isFunction( opt.old ) ) { + opt.old.call( this ); + } + + if ( opt.queue ) { + jQuery.dequeue( this, opt.queue ); + } + }; + + return opt; +}; + +jQuery.fn.extend( { + fadeTo: function( speed, to, easing, callback ) { + + // Show any hidden elements after setting opacity to 0 + return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() + + // Animate to the value specified + .end().animate( { opacity: to }, speed, easing, callback ); + }, + animate: function( prop, speed, easing, callback ) { + var empty = jQuery.isEmptyObject( prop ), + optall = jQuery.speed( speed, easing, callback ), + doAnimation = function() { + + // Operate on a copy of prop so per-property easing won't be lost + var anim = Animation( this, jQuery.extend( {}, prop ), optall ); + + // Empty animations, or finishing resolves immediately + if ( empty || dataPriv.get( this, "finish" ) ) { + anim.stop( true ); + } + }; + doAnimation.finish = doAnimation; + + return empty || optall.queue === false ? + this.each( doAnimation ) : + this.queue( optall.queue, doAnimation ); + }, + stop: function( type, clearQueue, gotoEnd ) { + var stopQueue = function( hooks ) { + var stop = hooks.stop; + delete hooks.stop; + stop( gotoEnd ); + }; + + if ( typeof type !== "string" ) { + gotoEnd = clearQueue; + clearQueue = type; + type = undefined; + } + if ( clearQueue && type !== false ) { + this.queue( type || "fx", [] ); + } + + return this.each( function() { + var dequeue = true, + index = type != null && type + "queueHooks", + timers = jQuery.timers, + data = dataPriv.get( this ); + + if ( index ) { + if ( data[ index ] && data[ index ].stop ) { + stopQueue( data[ index ] ); + } + } else { + for ( index in data ) { + if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { + stopQueue( data[ index ] ); + } + } + } + + for ( index = timers.length; index--; ) { + if ( timers[ index ].elem === this && + ( type == null || timers[ index ].queue === type ) ) { + + timers[ index ].anim.stop( gotoEnd ); + dequeue = false; + timers.splice( index, 1 ); + } + } + + // Start the next in the queue if the last step wasn't forced. + // Timers currently will call their complete callbacks, which + // will dequeue but only if they were gotoEnd. + if ( dequeue || !gotoEnd ) { + jQuery.dequeue( this, type ); + } + } ); + }, + finish: function( type ) { + if ( type !== false ) { + type = type || "fx"; + } + return this.each( function() { + var index, + data = dataPriv.get( this ), + queue = data[ type + "queue" ], + hooks = data[ type + "queueHooks" ], + timers = jQuery.timers, + length = queue ? queue.length : 0; + + // Enable finishing flag on private data + data.finish = true; + + // Empty the queue first + jQuery.queue( this, type, [] ); + + if ( hooks && hooks.stop ) { + hooks.stop.call( this, true ); + } + + // Look for any active animations, and finish them + for ( index = timers.length; index--; ) { + if ( timers[ index ].elem === this && timers[ index ].queue === type ) { + timers[ index ].anim.stop( true ); + timers.splice( index, 1 ); + } + } + + // Look for any animations in the old queue and finish them + for ( index = 0; index < length; index++ ) { + if ( queue[ index ] && queue[ index ].finish ) { + queue[ index ].finish.call( this ); + } + } + + // Turn off finishing flag + delete data.finish; + } ); + } +} ); + +jQuery.each( [ "toggle", "show", "hide" ], function( i, name ) { + var cssFn = jQuery.fn[ name ]; + jQuery.fn[ name ] = function( speed, easing, callback ) { + return speed == null || typeof speed === "boolean" ? + cssFn.apply( this, arguments ) : + this.animate( genFx( name, true ), speed, easing, callback ); + }; +} ); + +// Generate shortcuts for custom animations +jQuery.each( { + slideDown: genFx( "show" ), + slideUp: genFx( "hide" ), + slideToggle: genFx( "toggle" ), + fadeIn: { opacity: "show" }, + fadeOut: { opacity: "hide" }, + fadeToggle: { opacity: "toggle" } +}, function( name, props ) { + jQuery.fn[ name ] = function( speed, easing, callback ) { + return this.animate( props, speed, easing, callback ); + }; +} ); + +jQuery.timers = []; +jQuery.fx.tick = function() { + var timer, + i = 0, + timers = jQuery.timers; + + fxNow = Date.now(); + + for ( ; i < timers.length; i++ ) { + timer = timers[ i ]; + + // Run the timer and safely remove it when done (allowing for external removal) + if ( !timer() && timers[ i ] === timer ) { + timers.splice( i--, 1 ); + } + } + + if ( !timers.length ) { + jQuery.fx.stop(); + } + fxNow = undefined; +}; + +jQuery.fx.timer = function( timer ) { + jQuery.timers.push( timer ); + jQuery.fx.start(); +}; + +jQuery.fx.interval = 13; +jQuery.fx.start = function() { + if ( inProgress ) { + return; + } + + inProgress = true; + schedule(); +}; + +jQuery.fx.stop = function() { + inProgress = null; +}; + +jQuery.fx.speeds = { + slow: 600, + fast: 200, + + // Default speed + _default: 400 +}; + + +// Based off of the plugin by Clint Helfers, with permission. +// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ +jQuery.fn.delay = function( time, type ) { + time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; + type = type || "fx"; + + return this.queue( type, function( next, hooks ) { + var timeout = window.setTimeout( next, time ); + hooks.stop = function() { + window.clearTimeout( timeout ); + }; + } ); +}; + + +( function() { + var input = document.createElement( "input" ), + select = document.createElement( "select" ), + opt = select.appendChild( document.createElement( "option" ) ); + + input.type = "checkbox"; + + // Support: Android <=4.3 only + // Default value for a checkbox should be "on" + support.checkOn = input.value !== ""; + + // Support: IE <=11 only + // Must access selectedIndex to make default options select + support.optSelected = opt.selected; + + // Support: IE <=11 only + // An input loses its value after becoming a radio + input = document.createElement( "input" ); + input.value = "t"; + input.type = "radio"; + support.radioValue = input.value === "t"; +} )(); + + +var boolHook, + attrHandle = jQuery.expr.attrHandle; + +jQuery.fn.extend( { + attr: function( name, value ) { + return access( this, jQuery.attr, name, value, arguments.length > 1 ); + }, + + removeAttr: function( name ) { + return this.each( function() { + jQuery.removeAttr( this, name ); + } ); + } +} ); + +jQuery.extend( { + attr: function( elem, name, value ) { + var ret, hooks, + nType = elem.nodeType; + + // Don't get/set attributes on text, comment and attribute nodes + if ( nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + // Fallback to prop when attributes are not supported + if ( typeof elem.getAttribute === "undefined" ) { + return jQuery.prop( elem, name, value ); + } + + // Attribute hooks are determined by the lowercase version + // Grab necessary hook if one is defined + if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { + hooks = jQuery.attrHooks[ name.toLowerCase() ] || + ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); + } + + if ( value !== undefined ) { + if ( value === null ) { + jQuery.removeAttr( elem, name ); + return; + } + + if ( hooks && "set" in hooks && + ( ret = hooks.set( elem, value, name ) ) !== undefined ) { + return ret; + } + + elem.setAttribute( name, value + "" ); + return value; + } + + if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { + return ret; + } + + ret = jQuery.find.attr( elem, name ); + + // Non-existent attributes return null, we normalize to undefined + return ret == null ? undefined : ret; + }, + + attrHooks: { + type: { + set: function( elem, value ) { + if ( !support.radioValue && value === "radio" && + nodeName( elem, "input" ) ) { + var val = elem.value; + elem.setAttribute( "type", value ); + if ( val ) { + elem.value = val; + } + return value; + } + } + } + }, + + removeAttr: function( elem, value ) { + var name, + i = 0, + + // Attribute names can contain non-HTML whitespace characters + // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 + attrNames = value && value.match( rnothtmlwhite ); + + if ( attrNames && elem.nodeType === 1 ) { + while ( ( name = attrNames[ i++ ] ) ) { + elem.removeAttribute( name ); + } + } + } +} ); + +// Hooks for boolean attributes +boolHook = { + set: function( elem, value, name ) { + if ( value === false ) { + + // Remove boolean attributes when set to false + jQuery.removeAttr( elem, name ); + } else { + elem.setAttribute( name, name ); + } + return name; + } +}; + +jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) { + var getter = attrHandle[ name ] || jQuery.find.attr; + + attrHandle[ name ] = function( elem, name, isXML ) { + var ret, handle, + lowercaseName = name.toLowerCase(); + + if ( !isXML ) { + + // Avoid an infinite loop by temporarily removing this function from the getter + handle = attrHandle[ lowercaseName ]; + attrHandle[ lowercaseName ] = ret; + ret = getter( elem, name, isXML ) != null ? + lowercaseName : + null; + attrHandle[ lowercaseName ] = handle; + } + return ret; + }; +} ); + + + + +var rfocusable = /^(?:input|select|textarea|button)$/i, + rclickable = /^(?:a|area)$/i; + +jQuery.fn.extend( { + prop: function( name, value ) { + return access( this, jQuery.prop, name, value, arguments.length > 1 ); + }, + + removeProp: function( name ) { + return this.each( function() { + delete this[ jQuery.propFix[ name ] || name ]; + } ); + } +} ); + +jQuery.extend( { + prop: function( elem, name, value ) { + var ret, hooks, + nType = elem.nodeType; + + // Don't get/set properties on text, comment and attribute nodes + if ( nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { + + // Fix name and attach hooks + name = jQuery.propFix[ name ] || name; + hooks = jQuery.propHooks[ name ]; + } + + if ( value !== undefined ) { + if ( hooks && "set" in hooks && + ( ret = hooks.set( elem, value, name ) ) !== undefined ) { + return ret; + } + + return ( elem[ name ] = value ); + } + + if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { + return ret; + } + + return elem[ name ]; + }, + + propHooks: { + tabIndex: { + get: function( elem ) { + + // Support: IE <=9 - 11 only + // elem.tabIndex doesn't always return the + // correct value when it hasn't been explicitly set + // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ + // Use proper attribute retrieval(#12072) + var tabindex = jQuery.find.attr( elem, "tabindex" ); + + if ( tabindex ) { + return parseInt( tabindex, 10 ); + } + + if ( + rfocusable.test( elem.nodeName ) || + rclickable.test( elem.nodeName ) && + elem.href + ) { + return 0; + } + + return -1; + } + } + }, + + propFix: { + "for": "htmlFor", + "class": "className" + } +} ); + +// Support: IE <=11 only +// Accessing the selectedIndex property +// forces the browser to respect setting selected +// on the option +// The getter ensures a default option is selected +// when in an optgroup +// eslint rule "no-unused-expressions" is disabled for this code +// since it considers such accessions noop +if ( !support.optSelected ) { + jQuery.propHooks.selected = { + get: function( elem ) { + + /* eslint no-unused-expressions: "off" */ + + var parent = elem.parentNode; + if ( parent && parent.parentNode ) { + parent.parentNode.selectedIndex; + } + return null; + }, + set: function( elem ) { + + /* eslint no-unused-expressions: "off" */ + + var parent = elem.parentNode; + if ( parent ) { + parent.selectedIndex; + + if ( parent.parentNode ) { + parent.parentNode.selectedIndex; + } + } + } + }; +} + +jQuery.each( [ + "tabIndex", + "readOnly", + "maxLength", + "cellSpacing", + "cellPadding", + "rowSpan", + "colSpan", + "useMap", + "frameBorder", + "contentEditable" +], function() { + jQuery.propFix[ this.toLowerCase() ] = this; +} ); + + + + + // Strip and collapse whitespace according to HTML spec + // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace + function stripAndCollapse( value ) { + var tokens = value.match( rnothtmlwhite ) || []; + return tokens.join( " " ); + } + + +function getClass( elem ) { + return elem.getAttribute && elem.getAttribute( "class" ) || ""; +} + +function classesToArray( value ) { + if ( Array.isArray( value ) ) { + return value; + } + if ( typeof value === "string" ) { + return value.match( rnothtmlwhite ) || []; + } + return []; +} + +jQuery.fn.extend( { + addClass: function( value ) { + var classes, elem, cur, curValue, clazz, j, finalValue, + i = 0; + + if ( isFunction( value ) ) { + return this.each( function( j ) { + jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); + } ); + } + + classes = classesToArray( value ); + + if ( classes.length ) { + while ( ( elem = this[ i++ ] ) ) { + curValue = getClass( elem ); + cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + + if ( cur ) { + j = 0; + while ( ( clazz = classes[ j++ ] ) ) { + if ( cur.indexOf( " " + clazz + " " ) < 0 ) { + cur += clazz + " "; + } + } + + // Only assign if different to avoid unneeded rendering. + finalValue = stripAndCollapse( cur ); + if ( curValue !== finalValue ) { + elem.setAttribute( "class", finalValue ); + } + } + } + } + + return this; + }, + + removeClass: function( value ) { + var classes, elem, cur, curValue, clazz, j, finalValue, + i = 0; + + if ( isFunction( value ) ) { + return this.each( function( j ) { + jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); + } ); + } + + if ( !arguments.length ) { + return this.attr( "class", "" ); + } + + classes = classesToArray( value ); + + if ( classes.length ) { + while ( ( elem = this[ i++ ] ) ) { + curValue = getClass( elem ); + + // This expression is here for better compressibility (see addClass) + cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + + if ( cur ) { + j = 0; + while ( ( clazz = classes[ j++ ] ) ) { + + // Remove *all* instances + while ( cur.indexOf( " " + clazz + " " ) > -1 ) { + cur = cur.replace( " " + clazz + " ", " " ); + } + } + + // Only assign if different to avoid unneeded rendering. + finalValue = stripAndCollapse( cur ); + if ( curValue !== finalValue ) { + elem.setAttribute( "class", finalValue ); + } + } + } + } + + return this; + }, + + toggleClass: function( value, stateVal ) { + var type = typeof value, + isValidValue = type === "string" || Array.isArray( value ); + + if ( typeof stateVal === "boolean" && isValidValue ) { + return stateVal ? this.addClass( value ) : this.removeClass( value ); + } + + if ( isFunction( value ) ) { + return this.each( function( i ) { + jQuery( this ).toggleClass( + value.call( this, i, getClass( this ), stateVal ), + stateVal + ); + } ); + } + + return this.each( function() { + var className, i, self, classNames; + + if ( isValidValue ) { + + // Toggle individual class names + i = 0; + self = jQuery( this ); + classNames = classesToArray( value ); + + while ( ( className = classNames[ i++ ] ) ) { + + // Check each className given, space separated list + if ( self.hasClass( className ) ) { + self.removeClass( className ); + } else { + self.addClass( className ); + } + } + + // Toggle whole class name + } else if ( value === undefined || type === "boolean" ) { + className = getClass( this ); + if ( className ) { + + // Store className if set + dataPriv.set( this, "__className__", className ); + } + + // If the element has a class name or if we're passed `false`, + // then remove the whole classname (if there was one, the above saved it). + // Otherwise bring back whatever was previously saved (if anything), + // falling back to the empty string if nothing was stored. + if ( this.setAttribute ) { + this.setAttribute( "class", + className || value === false ? + "" : + dataPriv.get( this, "__className__" ) || "" + ); + } + } + } ); + }, + + hasClass: function( selector ) { + var className, elem, + i = 0; + + className = " " + selector + " "; + while ( ( elem = this[ i++ ] ) ) { + if ( elem.nodeType === 1 && + ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { + return true; + } + } + + return false; + } +} ); + + + + +var rreturn = /\r/g; + +jQuery.fn.extend( { + val: function( value ) { + var hooks, ret, valueIsFunction, + elem = this[ 0 ]; + + if ( !arguments.length ) { + if ( elem ) { + hooks = jQuery.valHooks[ elem.type ] || + jQuery.valHooks[ elem.nodeName.toLowerCase() ]; + + if ( hooks && + "get" in hooks && + ( ret = hooks.get( elem, "value" ) ) !== undefined + ) { + return ret; + } + + ret = elem.value; + + // Handle most common string cases + if ( typeof ret === "string" ) { + return ret.replace( rreturn, "" ); + } + + // Handle cases where value is null/undef or number + return ret == null ? "" : ret; + } + + return; + } + + valueIsFunction = isFunction( value ); + + return this.each( function( i ) { + var val; + + if ( this.nodeType !== 1 ) { + return; + } + + if ( valueIsFunction ) { + val = value.call( this, i, jQuery( this ).val() ); + } else { + val = value; + } + + // Treat null/undefined as ""; convert numbers to string + if ( val == null ) { + val = ""; + + } else if ( typeof val === "number" ) { + val += ""; + + } else if ( Array.isArray( val ) ) { + val = jQuery.map( val, function( value ) { + return value == null ? "" : value + ""; + } ); + } + + hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; + + // If set returns undefined, fall back to normal setting + if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { + this.value = val; + } + } ); + } +} ); + +jQuery.extend( { + valHooks: { + option: { + get: function( elem ) { + + var val = jQuery.find.attr( elem, "value" ); + return val != null ? + val : + + // Support: IE <=10 - 11 only + // option.text throws exceptions (#14686, #14858) + // Strip and collapse whitespace + // https://html.spec.whatwg.org/#strip-and-collapse-whitespace + stripAndCollapse( jQuery.text( elem ) ); + } + }, + select: { + get: function( elem ) { + var value, option, i, + options = elem.options, + index = elem.selectedIndex, + one = elem.type === "select-one", + values = one ? null : [], + max = one ? index + 1 : options.length; + + if ( index < 0 ) { + i = max; + + } else { + i = one ? index : 0; + } + + // Loop through all the selected options + for ( ; i < max; i++ ) { + option = options[ i ]; + + // Support: IE <=9 only + // IE8-9 doesn't update selected after form reset (#2551) + if ( ( option.selected || i === index ) && + + // Don't return options that are disabled or in a disabled optgroup + !option.disabled && + ( !option.parentNode.disabled || + !nodeName( option.parentNode, "optgroup" ) ) ) { + + // Get the specific value for the option + value = jQuery( option ).val(); + + // We don't need an array for one selects + if ( one ) { + return value; + } + + // Multi-Selects return an array + values.push( value ); + } + } + + return values; + }, + + set: function( elem, value ) { + var optionSet, option, + options = elem.options, + values = jQuery.makeArray( value ), + i = options.length; + + while ( i-- ) { + option = options[ i ]; + + /* eslint-disable no-cond-assign */ + + if ( option.selected = + jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 + ) { + optionSet = true; + } + + /* eslint-enable no-cond-assign */ + } + + // Force browsers to behave consistently when non-matching value is set + if ( !optionSet ) { + elem.selectedIndex = -1; + } + return values; + } + } + } +} ); + +// Radios and checkboxes getter/setter +jQuery.each( [ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = { + set: function( elem, value ) { + if ( Array.isArray( value ) ) { + return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); + } + } + }; + if ( !support.checkOn ) { + jQuery.valHooks[ this ].get = function( elem ) { + return elem.getAttribute( "value" ) === null ? "on" : elem.value; + }; + } +} ); + + + + +// Return jQuery for attributes-only inclusion + + +support.focusin = "onfocusin" in window; + + +var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, + stopPropagationCallback = function( e ) { + e.stopPropagation(); + }; + +jQuery.extend( jQuery.event, { + + trigger: function( event, data, elem, onlyHandlers ) { + + var i, cur, tmp, bubbleType, ontype, handle, special, lastElement, + eventPath = [ elem || document ], + type = hasOwn.call( event, "type" ) ? event.type : event, + namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; + + cur = lastElement = tmp = elem = elem || document; + + // Don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + // focus/blur morphs to focusin/out; ensure we're not firing them right now + if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { + return; + } + + if ( type.indexOf( "." ) > -1 ) { + + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split( "." ); + type = namespaces.shift(); + namespaces.sort(); + } + ontype = type.indexOf( ":" ) < 0 && "on" + type; + + // Caller can pass in a jQuery.Event object, Object, or just an event type string + event = event[ jQuery.expando ] ? + event : + new jQuery.Event( type, typeof event === "object" && event ); + + // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) + event.isTrigger = onlyHandlers ? 2 : 3; + event.namespace = namespaces.join( "." ); + event.rnamespace = event.namespace ? + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : + null; + + // Clean up the event in case it is being reused + event.result = undefined; + if ( !event.target ) { + event.target = elem; + } + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data == null ? + [ event ] : + jQuery.makeArray( data, [ event ] ); + + // Allow special events to draw outside the lines + special = jQuery.event.special[ type ] || {}; + if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { + return; + } + + // Determine event propagation path in advance, per W3C events spec (#9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) + if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) { + + bubbleType = special.delegateType || type; + if ( !rfocusMorph.test( bubbleType + type ) ) { + cur = cur.parentNode; + } + for ( ; cur; cur = cur.parentNode ) { + eventPath.push( cur ); + tmp = cur; + } + + // Only add window if we got to document (e.g., not plain obj or detached DOM) + if ( tmp === ( elem.ownerDocument || document ) ) { + eventPath.push( tmp.defaultView || tmp.parentWindow || window ); + } + } + + // Fire handlers on the event path + i = 0; + while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { + lastElement = cur; + event.type = i > 1 ? + bubbleType : + special.bindType || type; + + // jQuery handler + handle = ( dataPriv.get( cur, "events" ) || {} )[ event.type ] && + dataPriv.get( cur, "handle" ); + if ( handle ) { + handle.apply( cur, data ); + } + + // Native handler + handle = ontype && cur[ ontype ]; + if ( handle && handle.apply && acceptData( cur ) ) { + event.result = handle.apply( cur, data ); + if ( event.result === false ) { + event.preventDefault(); + } + } + } + event.type = type; + + // If nobody prevented the default action, do it now + if ( !onlyHandlers && !event.isDefaultPrevented() ) { + + if ( ( !special._default || + special._default.apply( eventPath.pop(), data ) === false ) && + acceptData( elem ) ) { + + // Call a native DOM method on the target with the same name as the event. + // Don't do default actions on window, that's where global variables be (#6170) + if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) { + + // Don't re-trigger an onFOO event when we call its FOO() method + tmp = elem[ ontype ]; + + if ( tmp ) { + elem[ ontype ] = null; + } + + // Prevent re-triggering of the same event, since we already bubbled it above + jQuery.event.triggered = type; + + if ( event.isPropagationStopped() ) { + lastElement.addEventListener( type, stopPropagationCallback ); + } + + elem[ type ](); + + if ( event.isPropagationStopped() ) { + lastElement.removeEventListener( type, stopPropagationCallback ); + } + + jQuery.event.triggered = undefined; + + if ( tmp ) { + elem[ ontype ] = tmp; + } + } + } + } + + return event.result; + }, + + // Piggyback on a donor event to simulate a different one + // Used only for `focus(in | out)` events + simulate: function( type, elem, event ) { + var e = jQuery.extend( + new jQuery.Event(), + event, + { + type: type, + isSimulated: true + } + ); + + jQuery.event.trigger( e, null, elem ); + } + +} ); + +jQuery.fn.extend( { + + trigger: function( type, data ) { + return this.each( function() { + jQuery.event.trigger( type, data, this ); + } ); + }, + triggerHandler: function( type, data ) { + var elem = this[ 0 ]; + if ( elem ) { + return jQuery.event.trigger( type, data, elem, true ); + } + } +} ); + + +// Support: Firefox <=44 +// Firefox doesn't have focus(in | out) events +// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 +// +// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 +// focus(in | out) events fire after focus & blur events, +// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order +// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 +if ( !support.focusin ) { + jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler on the document while someone wants focusin/focusout + var handler = function( event ) { + jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); + }; + + jQuery.event.special[ fix ] = { + setup: function() { + var doc = this.ownerDocument || this, + attaches = dataPriv.access( doc, fix ); + + if ( !attaches ) { + doc.addEventListener( orig, handler, true ); + } + dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); + }, + teardown: function() { + var doc = this.ownerDocument || this, + attaches = dataPriv.access( doc, fix ) - 1; + + if ( !attaches ) { + doc.removeEventListener( orig, handler, true ); + dataPriv.remove( doc, fix ); + + } else { + dataPriv.access( doc, fix, attaches ); + } + } + }; + } ); +} +var location = window.location; + +var nonce = Date.now(); + +var rquery = ( /\?/ ); + + + +// Cross-browser xml parsing +jQuery.parseXML = function( data ) { + var xml; + if ( !data || typeof data !== "string" ) { + return null; + } + + // Support: IE 9 - 11 only + // IE throws on parseFromString with invalid input. + try { + xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); + } catch ( e ) { + xml = undefined; + } + + if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) { + jQuery.error( "Invalid XML: " + data ); + } + return xml; +}; + + +var + rbracket = /\[\]$/, + rCRLF = /\r?\n/g, + rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, + rsubmittable = /^(?:input|select|textarea|keygen)/i; + +function buildParams( prefix, obj, traditional, add ) { + var name; + + if ( Array.isArray( obj ) ) { + + // Serialize array item. + jQuery.each( obj, function( i, v ) { + if ( traditional || rbracket.test( prefix ) ) { + + // Treat each array item as a scalar. + add( prefix, v ); + + } else { + + // Item is non-scalar (array or object), encode its numeric index. + buildParams( + prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", + v, + traditional, + add + ); + } + } ); + + } else if ( !traditional && toType( obj ) === "object" ) { + + // Serialize object item. + for ( name in obj ) { + buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); + } + + } else { + + // Serialize scalar item. + add( prefix, obj ); + } +} + +// Serialize an array of form elements or a set of +// key/values into a query string +jQuery.param = function( a, traditional ) { + var prefix, + s = [], + add = function( key, valueOrFunction ) { + + // If value is a function, invoke it and use its return value + var value = isFunction( valueOrFunction ) ? + valueOrFunction() : + valueOrFunction; + + s[ s.length ] = encodeURIComponent( key ) + "=" + + encodeURIComponent( value == null ? "" : value ); + }; + + // If an array was passed in, assume that it is an array of form elements. + if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { + + // Serialize the form elements + jQuery.each( a, function() { + add( this.name, this.value ); + } ); + + } else { + + // If traditional, encode the "old" way (the way 1.3.2 or older + // did it), otherwise encode params recursively. + for ( prefix in a ) { + buildParams( prefix, a[ prefix ], traditional, add ); + } + } + + // Return the resulting serialization + return s.join( "&" ); +}; + +jQuery.fn.extend( { + serialize: function() { + return jQuery.param( this.serializeArray() ); + }, + serializeArray: function() { + return this.map( function() { + + // Can add propHook for "elements" to filter or add form elements + var elements = jQuery.prop( this, "elements" ); + return elements ? jQuery.makeArray( elements ) : this; + } ) + .filter( function() { + var type = this.type; + + // Use .is( ":disabled" ) so that fieldset[disabled] works + return this.name && !jQuery( this ).is( ":disabled" ) && + rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && + ( this.checked || !rcheckableType.test( type ) ); + } ) + .map( function( i, elem ) { + var val = jQuery( this ).val(); + + if ( val == null ) { + return null; + } + + if ( Array.isArray( val ) ) { + return jQuery.map( val, function( val ) { + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + } ); + } + + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + } ).get(); + } +} ); + + +var + r20 = /%20/g, + rhash = /#.*$/, + rantiCache = /([?&])_=[^&]*/, + rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, + + // #7653, #8125, #8152: local protocol detection + rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, + rnoContent = /^(?:GET|HEAD)$/, + rprotocol = /^\/\//, + + /* Prefilters + * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) + * 2) These are called: + * - BEFORE asking for a transport + * - AFTER param serialization (s.data is a string if s.processData is true) + * 3) key is the dataType + * 4) the catchall symbol "*" can be used + * 5) execution will start with transport dataType and THEN continue down to "*" if needed + */ + prefilters = {}, + + /* Transports bindings + * 1) key is the dataType + * 2) the catchall symbol "*" can be used + * 3) selection will start with transport dataType and THEN go to "*" if needed + */ + transports = {}, + + // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression + allTypes = "*/".concat( "*" ), + + // Anchor tag for parsing the document origin + originAnchor = document.createElement( "a" ); + originAnchor.href = location.href; + +// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport +function addToPrefiltersOrTransports( structure ) { + + // dataTypeExpression is optional and defaults to "*" + return function( dataTypeExpression, func ) { + + if ( typeof dataTypeExpression !== "string" ) { + func = dataTypeExpression; + dataTypeExpression = "*"; + } + + var dataType, + i = 0, + dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; + + if ( isFunction( func ) ) { + + // For each dataType in the dataTypeExpression + while ( ( dataType = dataTypes[ i++ ] ) ) { + + // Prepend if requested + if ( dataType[ 0 ] === "+" ) { + dataType = dataType.slice( 1 ) || "*"; + ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); + + // Otherwise append + } else { + ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); + } + } + } + }; +} + +// Base inspection function for prefilters and transports +function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { + + var inspected = {}, + seekingTransport = ( structure === transports ); + + function inspect( dataType ) { + var selected; + inspected[ dataType ] = true; + jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { + var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); + if ( typeof dataTypeOrTransport === "string" && + !seekingTransport && !inspected[ dataTypeOrTransport ] ) { + + options.dataTypes.unshift( dataTypeOrTransport ); + inspect( dataTypeOrTransport ); + return false; + } else if ( seekingTransport ) { + return !( selected = dataTypeOrTransport ); + } + } ); + return selected; + } + + return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); +} + +// A special extend for ajax options +// that takes "flat" options (not to be deep extended) +// Fixes #9887 +function ajaxExtend( target, src ) { + var key, deep, + flatOptions = jQuery.ajaxSettings.flatOptions || {}; + + for ( key in src ) { + if ( src[ key ] !== undefined ) { + ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; + } + } + if ( deep ) { + jQuery.extend( true, target, deep ); + } + + return target; +} + +/* Handles responses to an ajax request: + * - finds the right dataType (mediates between content-type and expected dataType) + * - returns the corresponding response + */ +function ajaxHandleResponses( s, jqXHR, responses ) { + + var ct, type, finalDataType, firstDataType, + contents = s.contents, + dataTypes = s.dataTypes; + + // Remove auto dataType and get content-type in the process + while ( dataTypes[ 0 ] === "*" ) { + dataTypes.shift(); + if ( ct === undefined ) { + ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); + } + } + + // Check if we're dealing with a known content-type + if ( ct ) { + for ( type in contents ) { + if ( contents[ type ] && contents[ type ].test( ct ) ) { + dataTypes.unshift( type ); + break; + } + } + } + + // Check to see if we have a response for the expected dataType + if ( dataTypes[ 0 ] in responses ) { + finalDataType = dataTypes[ 0 ]; + } else { + + // Try convertible dataTypes + for ( type in responses ) { + if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { + finalDataType = type; + break; + } + if ( !firstDataType ) { + firstDataType = type; + } + } + + // Or just use first one + finalDataType = finalDataType || firstDataType; + } + + // If we found a dataType + // We add the dataType to the list if needed + // and return the corresponding response + if ( finalDataType ) { + if ( finalDataType !== dataTypes[ 0 ] ) { + dataTypes.unshift( finalDataType ); + } + return responses[ finalDataType ]; + } +} + +/* Chain conversions given the request and the original response + * Also sets the responseXXX fields on the jqXHR instance + */ +function ajaxConvert( s, response, jqXHR, isSuccess ) { + var conv2, current, conv, tmp, prev, + converters = {}, + + // Work with a copy of dataTypes in case we need to modify it for conversion + dataTypes = s.dataTypes.slice(); + + // Create converters map with lowercased keys + if ( dataTypes[ 1 ] ) { + for ( conv in s.converters ) { + converters[ conv.toLowerCase() ] = s.converters[ conv ]; + } + } + + current = dataTypes.shift(); + + // Convert to each sequential dataType + while ( current ) { + + if ( s.responseFields[ current ] ) { + jqXHR[ s.responseFields[ current ] ] = response; + } + + // Apply the dataFilter if provided + if ( !prev && isSuccess && s.dataFilter ) { + response = s.dataFilter( response, s.dataType ); + } + + prev = current; + current = dataTypes.shift(); + + if ( current ) { + + // There's only work to do if current dataType is non-auto + if ( current === "*" ) { + + current = prev; + + // Convert response if prev dataType is non-auto and differs from current + } else if ( prev !== "*" && prev !== current ) { + + // Seek a direct converter + conv = converters[ prev + " " + current ] || converters[ "* " + current ]; + + // If none found, seek a pair + if ( !conv ) { + for ( conv2 in converters ) { + + // If conv2 outputs current + tmp = conv2.split( " " ); + if ( tmp[ 1 ] === current ) { + + // If prev can be converted to accepted input + conv = converters[ prev + " " + tmp[ 0 ] ] || + converters[ "* " + tmp[ 0 ] ]; + if ( conv ) { + + // Condense equivalence converters + if ( conv === true ) { + conv = converters[ conv2 ]; + + // Otherwise, insert the intermediate dataType + } else if ( converters[ conv2 ] !== true ) { + current = tmp[ 0 ]; + dataTypes.unshift( tmp[ 1 ] ); + } + break; + } + } + } + } + + // Apply converter (if not an equivalence) + if ( conv !== true ) { + + // Unless errors are allowed to bubble, catch and return them + if ( conv && s.throws ) { + response = conv( response ); + } else { + try { + response = conv( response ); + } catch ( e ) { + return { + state: "parsererror", + error: conv ? e : "No conversion from " + prev + " to " + current + }; + } + } + } + } + } + } + + return { state: "success", data: response }; +} + +jQuery.extend( { + + // Counter for holding the number of active queries + active: 0, + + // Last-Modified header cache for next request + lastModified: {}, + etag: {}, + + ajaxSettings: { + url: location.href, + type: "GET", + isLocal: rlocalProtocol.test( location.protocol ), + global: true, + processData: true, + async: true, + contentType: "application/x-www-form-urlencoded; charset=UTF-8", + + /* + timeout: 0, + data: null, + dataType: null, + username: null, + password: null, + cache: null, + throws: false, + traditional: false, + headers: {}, + */ + + accepts: { + "*": allTypes, + text: "text/plain", + html: "text/html", + xml: "application/xml, text/xml", + json: "application/json, text/javascript" + }, + + contents: { + xml: /\bxml\b/, + html: /\bhtml/, + json: /\bjson\b/ + }, + + responseFields: { + xml: "responseXML", + text: "responseText", + json: "responseJSON" + }, + + // Data converters + // Keys separate source (or catchall "*") and destination types with a single space + converters: { + + // Convert anything to text + "* text": String, + + // Text to html (true = no transformation) + "text html": true, + + // Evaluate text as a json expression + "text json": JSON.parse, + + // Parse text as xml + "text xml": jQuery.parseXML + }, + + // For options that shouldn't be deep extended: + // you can add your own custom options here if + // and when you create one that shouldn't be + // deep extended (see ajaxExtend) + flatOptions: { + url: true, + context: true + } + }, + + // Creates a full fledged settings object into target + // with both ajaxSettings and settings fields. + // If target is omitted, writes into ajaxSettings. + ajaxSetup: function( target, settings ) { + return settings ? + + // Building a settings object + ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : + + // Extending ajaxSettings + ajaxExtend( jQuery.ajaxSettings, target ); + }, + + ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), + ajaxTransport: addToPrefiltersOrTransports( transports ), + + // Main method + ajax: function( url, options ) { + + // If url is an object, simulate pre-1.5 signature + if ( typeof url === "object" ) { + options = url; + url = undefined; + } + + // Force options to be an object + options = options || {}; + + var transport, + + // URL without anti-cache param + cacheURL, + + // Response headers + responseHeadersString, + responseHeaders, + + // timeout handle + timeoutTimer, + + // Url cleanup var + urlAnchor, + + // Request state (becomes false upon send and true upon completion) + completed, + + // To know if global events are to be dispatched + fireGlobals, + + // Loop variable + i, + + // uncached part of the url + uncached, + + // Create the final options object + s = jQuery.ajaxSetup( {}, options ), + + // Callbacks context + callbackContext = s.context || s, + + // Context for global events is callbackContext if it is a DOM node or jQuery collection + globalEventContext = s.context && + ( callbackContext.nodeType || callbackContext.jquery ) ? + jQuery( callbackContext ) : + jQuery.event, + + // Deferreds + deferred = jQuery.Deferred(), + completeDeferred = jQuery.Callbacks( "once memory" ), + + // Status-dependent callbacks + statusCode = s.statusCode || {}, + + // Headers (they are sent all at once) + requestHeaders = {}, + requestHeadersNames = {}, + + // Default abort message + strAbort = "canceled", + + // Fake xhr + jqXHR = { + readyState: 0, + + // Builds headers hashtable if needed + getResponseHeader: function( key ) { + var match; + if ( completed ) { + if ( !responseHeaders ) { + responseHeaders = {}; + while ( ( match = rheaders.exec( responseHeadersString ) ) ) { + responseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ]; + } + } + match = responseHeaders[ key.toLowerCase() ]; + } + return match == null ? null : match; + }, + + // Raw string + getAllResponseHeaders: function() { + return completed ? responseHeadersString : null; + }, + + // Caches the header + setRequestHeader: function( name, value ) { + if ( completed == null ) { + name = requestHeadersNames[ name.toLowerCase() ] = + requestHeadersNames[ name.toLowerCase() ] || name; + requestHeaders[ name ] = value; + } + return this; + }, + + // Overrides response content-type header + overrideMimeType: function( type ) { + if ( completed == null ) { + s.mimeType = type; + } + return this; + }, + + // Status-dependent callbacks + statusCode: function( map ) { + var code; + if ( map ) { + if ( completed ) { + + // Execute the appropriate callbacks + jqXHR.always( map[ jqXHR.status ] ); + } else { + + // Lazy-add the new callbacks in a way that preserves old ones + for ( code in map ) { + statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; + } + } + } + return this; + }, + + // Cancel the request + abort: function( statusText ) { + var finalText = statusText || strAbort; + if ( transport ) { + transport.abort( finalText ); + } + done( 0, finalText ); + return this; + } + }; + + // Attach deferreds + deferred.promise( jqXHR ); + + // Add protocol if not provided (prefilters might expect it) + // Handle falsy url in the settings object (#10093: consistency with old signature) + // We also use the url parameter if available + s.url = ( ( url || s.url || location.href ) + "" ) + .replace( rprotocol, location.protocol + "//" ); + + // Alias method option to type as per ticket #12004 + s.type = options.method || options.type || s.method || s.type; + + // Extract dataTypes list + s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; + + // A cross-domain request is in order when the origin doesn't match the current origin. + if ( s.crossDomain == null ) { + urlAnchor = document.createElement( "a" ); + + // Support: IE <=8 - 11, Edge 12 - 15 + // IE throws exception on accessing the href property if url is malformed, + // e.g. http://example.com:80x/ + try { + urlAnchor.href = s.url; + + // Support: IE <=8 - 11 only + // Anchor's host property isn't correctly set when s.url is relative + urlAnchor.href = urlAnchor.href; + s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== + urlAnchor.protocol + "//" + urlAnchor.host; + } catch ( e ) { + + // If there is an error parsing the URL, assume it is crossDomain, + // it can be rejected by the transport if it is invalid + s.crossDomain = true; + } + } + + // Convert data if not already a string + if ( s.data && s.processData && typeof s.data !== "string" ) { + s.data = jQuery.param( s.data, s.traditional ); + } + + // Apply prefilters + inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); + + // If request was aborted inside a prefilter, stop there + if ( completed ) { + return jqXHR; + } + + // We can fire global events as of now if asked to + // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) + fireGlobals = jQuery.event && s.global; + + // Watch for a new set of requests + if ( fireGlobals && jQuery.active++ === 0 ) { + jQuery.event.trigger( "ajaxStart" ); + } + + // Uppercase the type + s.type = s.type.toUpperCase(); + + // Determine if request has content + s.hasContent = !rnoContent.test( s.type ); + + // Save the URL in case we're toying with the If-Modified-Since + // and/or If-None-Match header later on + // Remove hash to simplify url manipulation + cacheURL = s.url.replace( rhash, "" ); + + // More options handling for requests with no content + if ( !s.hasContent ) { + + // Remember the hash so we can put it back + uncached = s.url.slice( cacheURL.length ); + + // If data is available and should be processed, append data to url + if ( s.data && ( s.processData || typeof s.data === "string" ) ) { + cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; + + // #9682: remove data so that it's not used in an eventual retry + delete s.data; + } + + // Add or update anti-cache param if needed + if ( s.cache === false ) { + cacheURL = cacheURL.replace( rantiCache, "$1" ); + uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce++ ) + uncached; + } + + // Put hash and anti-cache on the URL that will be requested (gh-1732) + s.url = cacheURL + uncached; + + // Change '%20' to '+' if this is encoded form body content (gh-2658) + } else if ( s.data && s.processData && + ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { + s.data = s.data.replace( r20, "+" ); + } + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + if ( jQuery.lastModified[ cacheURL ] ) { + jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); + } + if ( jQuery.etag[ cacheURL ] ) { + jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); + } + } + + // Set the correct header, if data is being sent + if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { + jqXHR.setRequestHeader( "Content-Type", s.contentType ); + } + + // Set the Accepts header for the server, depending on the dataType + jqXHR.setRequestHeader( + "Accept", + s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? + s.accepts[ s.dataTypes[ 0 ] ] + + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : + s.accepts[ "*" ] + ); + + // Check for headers option + for ( i in s.headers ) { + jqXHR.setRequestHeader( i, s.headers[ i ] ); + } + + // Allow custom headers/mimetypes and early abort + if ( s.beforeSend && + ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { + + // Abort if not done already and return + return jqXHR.abort(); + } + + // Aborting is no longer a cancellation + strAbort = "abort"; + + // Install callbacks on deferreds + completeDeferred.add( s.complete ); + jqXHR.done( s.success ); + jqXHR.fail( s.error ); + + // Get transport + transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); + + // If no transport, we auto-abort + if ( !transport ) { + done( -1, "No Transport" ); + } else { + jqXHR.readyState = 1; + + // Send global event + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); + } + + // If request was aborted inside ajaxSend, stop there + if ( completed ) { + return jqXHR; + } + + // Timeout + if ( s.async && s.timeout > 0 ) { + timeoutTimer = window.setTimeout( function() { + jqXHR.abort( "timeout" ); + }, s.timeout ); + } + + try { + completed = false; + transport.send( requestHeaders, done ); + } catch ( e ) { + + // Rethrow post-completion exceptions + if ( completed ) { + throw e; + } + + // Propagate others as results + done( -1, e ); + } + } + + // Callback for when everything is done + function done( status, nativeStatusText, responses, headers ) { + var isSuccess, success, error, response, modified, + statusText = nativeStatusText; + + // Ignore repeat invocations + if ( completed ) { + return; + } + + completed = true; + + // Clear timeout if it exists + if ( timeoutTimer ) { + window.clearTimeout( timeoutTimer ); + } + + // Dereference transport for early garbage collection + // (no matter how long the jqXHR object will be used) + transport = undefined; + + // Cache response headers + responseHeadersString = headers || ""; + + // Set readyState + jqXHR.readyState = status > 0 ? 4 : 0; + + // Determine if successful + isSuccess = status >= 200 && status < 300 || status === 304; + + // Get response data + if ( responses ) { + response = ajaxHandleResponses( s, jqXHR, responses ); + } + + // Convert no matter what (that way responseXXX fields are always set) + response = ajaxConvert( s, response, jqXHR, isSuccess ); + + // If successful, handle type chaining + if ( isSuccess ) { + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + modified = jqXHR.getResponseHeader( "Last-Modified" ); + if ( modified ) { + jQuery.lastModified[ cacheURL ] = modified; + } + modified = jqXHR.getResponseHeader( "etag" ); + if ( modified ) { + jQuery.etag[ cacheURL ] = modified; + } + } + + // if no content + if ( status === 204 || s.type === "HEAD" ) { + statusText = "nocontent"; + + // if not modified + } else if ( status === 304 ) { + statusText = "notmodified"; + + // If we have data, let's convert it + } else { + statusText = response.state; + success = response.data; + error = response.error; + isSuccess = !error; + } + } else { + + // Extract error from statusText and normalize for non-aborts + error = statusText; + if ( status || !statusText ) { + statusText = "error"; + if ( status < 0 ) { + status = 0; + } + } + } + + // Set data for the fake xhr object + jqXHR.status = status; + jqXHR.statusText = ( nativeStatusText || statusText ) + ""; + + // Success/Error + if ( isSuccess ) { + deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); + } else { + deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); + } + + // Status-dependent callbacks + jqXHR.statusCode( statusCode ); + statusCode = undefined; + + if ( fireGlobals ) { + globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", + [ jqXHR, s, isSuccess ? success : error ] ); + } + + // Complete + completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); + + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); + + // Handle the global AJAX counter + if ( !( --jQuery.active ) ) { + jQuery.event.trigger( "ajaxStop" ); + } + } + } + + return jqXHR; + }, + + getJSON: function( url, data, callback ) { + return jQuery.get( url, data, callback, "json" ); + }, + + getScript: function( url, callback ) { + return jQuery.get( url, undefined, callback, "script" ); + } +} ); + +jQuery.each( [ "get", "post" ], function( i, method ) { + jQuery[ method ] = function( url, data, callback, type ) { + + // Shift arguments if data argument was omitted + if ( isFunction( data ) ) { + type = type || callback; + callback = data; + data = undefined; + } + + // The url can be an options object (which then must have .url) + return jQuery.ajax( jQuery.extend( { + url: url, + type: method, + dataType: type, + data: data, + success: callback + }, jQuery.isPlainObject( url ) && url ) ); + }; +} ); + + +jQuery._evalUrl = function( url ) { + return jQuery.ajax( { + url: url, + + // Make this explicit, since user can override this through ajaxSetup (#11264) + type: "GET", + dataType: "script", + cache: true, + async: false, + global: false, + "throws": true + } ); +}; + + +jQuery.fn.extend( { + wrapAll: function( html ) { + var wrap; + + if ( this[ 0 ] ) { + if ( isFunction( html ) ) { + html = html.call( this[ 0 ] ); + } + + // The elements to wrap the target around + wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); + + if ( this[ 0 ].parentNode ) { + wrap.insertBefore( this[ 0 ] ); + } + + wrap.map( function() { + var elem = this; + + while ( elem.firstElementChild ) { + elem = elem.firstElementChild; + } + + return elem; + } ).append( this ); + } + + return this; + }, + + wrapInner: function( html ) { + if ( isFunction( html ) ) { + return this.each( function( i ) { + jQuery( this ).wrapInner( html.call( this, i ) ); + } ); + } + + return this.each( function() { + var self = jQuery( this ), + contents = self.contents(); + + if ( contents.length ) { + contents.wrapAll( html ); + + } else { + self.append( html ); + } + } ); + }, + + wrap: function( html ) { + var htmlIsFunction = isFunction( html ); + + return this.each( function( i ) { + jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html ); + } ); + }, + + unwrap: function( selector ) { + this.parent( selector ).not( "body" ).each( function() { + jQuery( this ).replaceWith( this.childNodes ); + } ); + return this; + } +} ); + + +jQuery.expr.pseudos.hidden = function( elem ) { + return !jQuery.expr.pseudos.visible( elem ); +}; +jQuery.expr.pseudos.visible = function( elem ) { + return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); +}; + + + + +jQuery.ajaxSettings.xhr = function() { + try { + return new window.XMLHttpRequest(); + } catch ( e ) {} +}; + +var xhrSuccessStatus = { + + // File protocol always yields status code 0, assume 200 + 0: 200, + + // Support: IE <=9 only + // #1450: sometimes IE returns 1223 when it should be 204 + 1223: 204 + }, + xhrSupported = jQuery.ajaxSettings.xhr(); + +support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); +support.ajax = xhrSupported = !!xhrSupported; + +jQuery.ajaxTransport( function( options ) { + var callback, errorCallback; + + // Cross domain only allowed if supported through XMLHttpRequest + if ( support.cors || xhrSupported && !options.crossDomain ) { + return { + send: function( headers, complete ) { + var i, + xhr = options.xhr(); + + xhr.open( + options.type, + options.url, + options.async, + options.username, + options.password + ); + + // Apply custom fields if provided + if ( options.xhrFields ) { + for ( i in options.xhrFields ) { + xhr[ i ] = options.xhrFields[ i ]; + } + } + + // Override mime type if needed + if ( options.mimeType && xhr.overrideMimeType ) { + xhr.overrideMimeType( options.mimeType ); + } + + // X-Requested-With header + // For cross-domain requests, seeing as conditions for a preflight are + // akin to a jigsaw puzzle, we simply never set it to be sure. + // (it can always be set on a per-request basis or even using ajaxSetup) + // For same-domain requests, won't change header if already provided. + if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { + headers[ "X-Requested-With" ] = "XMLHttpRequest"; + } + + // Set headers + for ( i in headers ) { + xhr.setRequestHeader( i, headers[ i ] ); + } + + // Callback + callback = function( type ) { + return function() { + if ( callback ) { + callback = errorCallback = xhr.onload = + xhr.onerror = xhr.onabort = xhr.ontimeout = + xhr.onreadystatechange = null; + + if ( type === "abort" ) { + xhr.abort(); + } else if ( type === "error" ) { + + // Support: IE <=9 only + // On a manual native abort, IE9 throws + // errors on any property access that is not readyState + if ( typeof xhr.status !== "number" ) { + complete( 0, "error" ); + } else { + complete( + + // File: protocol always yields status 0; see #8605, #14207 + xhr.status, + xhr.statusText + ); + } + } else { + complete( + xhrSuccessStatus[ xhr.status ] || xhr.status, + xhr.statusText, + + // Support: IE <=9 only + // IE9 has no XHR2 but throws on binary (trac-11426) + // For XHR2 non-text, let the caller handle it (gh-2498) + ( xhr.responseType || "text" ) !== "text" || + typeof xhr.responseText !== "string" ? + { binary: xhr.response } : + { text: xhr.responseText }, + xhr.getAllResponseHeaders() + ); + } + } + }; + }; + + // Listen to events + xhr.onload = callback(); + errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" ); + + // Support: IE 9 only + // Use onreadystatechange to replace onabort + // to handle uncaught aborts + if ( xhr.onabort !== undefined ) { + xhr.onabort = errorCallback; + } else { + xhr.onreadystatechange = function() { + + // Check readyState before timeout as it changes + if ( xhr.readyState === 4 ) { + + // Allow onerror to be called first, + // but that will not handle a native abort + // Also, save errorCallback to a variable + // as xhr.onerror cannot be accessed + window.setTimeout( function() { + if ( callback ) { + errorCallback(); + } + } ); + } + }; + } + + // Create the abort callback + callback = callback( "abort" ); + + try { + + // Do send the request (this may raise an exception) + xhr.send( options.hasContent && options.data || null ); + } catch ( e ) { + + // #14683: Only rethrow if this hasn't been notified as an error yet + if ( callback ) { + throw e; + } + } + }, + + abort: function() { + if ( callback ) { + callback(); + } + } + }; + } +} ); + + + + +// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) +jQuery.ajaxPrefilter( function( s ) { + if ( s.crossDomain ) { + s.contents.script = false; + } +} ); + +// Install script dataType +jQuery.ajaxSetup( { + accepts: { + script: "text/javascript, application/javascript, " + + "application/ecmascript, application/x-ecmascript" + }, + contents: { + script: /\b(?:java|ecma)script\b/ + }, + converters: { + "text script": function( text ) { + jQuery.globalEval( text ); + return text; + } + } +} ); + +// Handle cache's special case and crossDomain +jQuery.ajaxPrefilter( "script", function( s ) { + if ( s.cache === undefined ) { + s.cache = false; + } + if ( s.crossDomain ) { + s.type = "GET"; + } +} ); + +// Bind script tag hack transport +jQuery.ajaxTransport( "script", function( s ) { + + // This transport only deals with cross domain requests + if ( s.crossDomain ) { + var script, callback; + return { + send: function( _, complete ) { + script = jQuery( "

    {i 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 + + + + + + + + + + + + + diff --git a/static/admin/img/gis/move_vertex_off.svg b/static/admin/img/gis/move_vertex_off.svg new file mode 100644 index 0000000..228854f --- /dev/null +++ b/static/admin/img/gis/move_vertex_off.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/admin/img/gis/move_vertex_on.svg b/static/admin/img/gis/move_vertex_on.svg new file mode 100644 index 0000000..96b87fd --- /dev/null +++ b/static/admin/img/gis/move_vertex_on.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/admin/img/icon-addlink.svg b/static/admin/img/icon-addlink.svg new file mode 100644 index 0000000..e004fb1 --- /dev/null +++ b/static/admin/img/icon-addlink.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/admin/img/icon-alert.svg b/static/admin/img/icon-alert.svg new file mode 100644 index 0000000..e51ea83 --- /dev/null +++ b/static/admin/img/icon-alert.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/admin/img/icon-calendar.svg b/static/admin/img/icon-calendar.svg new file mode 100644 index 0000000..97910a9 --- /dev/null +++ b/static/admin/img/icon-calendar.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/static/admin/img/icon-changelink.svg b/static/admin/img/icon-changelink.svg new file mode 100644 index 0000000..bbb137a --- /dev/null +++ b/static/admin/img/icon-changelink.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/admin/img/icon-clock.svg b/static/admin/img/icon-clock.svg new file mode 100644 index 0000000..bf9985d --- /dev/null +++ b/static/admin/img/icon-clock.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/static/admin/img/icon-deletelink.svg b/static/admin/img/icon-deletelink.svg new file mode 100644 index 0000000..4059b15 --- /dev/null +++ b/static/admin/img/icon-deletelink.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/admin/img/icon-no.svg b/static/admin/img/icon-no.svg new file mode 100644 index 0000000..2e0d383 --- /dev/null +++ b/static/admin/img/icon-no.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/admin/img/icon-unknown-alt.svg b/static/admin/img/icon-unknown-alt.svg new file mode 100644 index 0000000..1c6b99f --- /dev/null +++ b/static/admin/img/icon-unknown-alt.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/admin/img/icon-unknown.svg b/static/admin/img/icon-unknown.svg new file mode 100644 index 0000000..50b4f97 --- /dev/null +++ b/static/admin/img/icon-unknown.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/admin/img/icon-viewlink.svg b/static/admin/img/icon-viewlink.svg new file mode 100644 index 0000000..a1ca1d3 --- /dev/null +++ b/static/admin/img/icon-viewlink.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/admin/img/icon-yes.svg b/static/admin/img/icon-yes.svg new file mode 100644 index 0000000..5883d87 --- /dev/null +++ b/static/admin/img/icon-yes.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/admin/img/inline-delete.svg b/static/admin/img/inline-delete.svg new file mode 100644 index 0000000..17d1ad6 --- /dev/null +++ b/static/admin/img/inline-delete.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/admin/img/search.svg b/static/admin/img/search.svg new file mode 100644 index 0000000..c8c69b2 --- /dev/null +++ b/static/admin/img/search.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/admin/img/selector-icons.svg b/static/admin/img/selector-icons.svg new file mode 100644 index 0000000..926b8e2 --- /dev/null +++ b/static/admin/img/selector-icons.svg @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/admin/img/sorting-icons.svg b/static/admin/img/sorting-icons.svg new file mode 100644 index 0000000..7c31ec9 --- /dev/null +++ b/static/admin/img/sorting-icons.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/static/admin/img/tooltag-add.svg b/static/admin/img/tooltag-add.svg new file mode 100644 index 0000000..1ca64ae --- /dev/null +++ b/static/admin/img/tooltag-add.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/admin/img/tooltag-arrowright.svg b/static/admin/img/tooltag-arrowright.svg new file mode 100644 index 0000000..b664d61 --- /dev/null +++ b/static/admin/img/tooltag-arrowright.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/admin/js/SelectBox.js b/static/admin/js/SelectBox.js new file mode 100644 index 0000000..1a14959 --- /dev/null +++ b/static/admin/js/SelectBox.js @@ -0,0 +1,144 @@ +(function($) { + 'use strict'; + var SelectBox = { + cache: {}, + init: function(id) { + var box = document.getElementById(id); + var node; + SelectBox.cache[id] = []; + var cache = SelectBox.cache[id]; + var boxOptions = box.options; + var boxOptionsLength = boxOptions.length; + for (var i = 0, j = boxOptionsLength; i < j; i++) { + node = boxOptions[i]; + cache.push({value: node.value, text: node.text, displayed: 1}); + } + }, + redisplay: function(id) { + // Repopulate HTML select box from cache + var box = document.getElementById(id); + var node; + $(box).empty(); // clear all options + var new_options = box.outerHTML.slice(0, -9); // grab just the opening tag + var cache = SelectBox.cache[id]; + for (var i = 0, j = cache.length; i < j; i++) { + node = cache[i]; + if (node.displayed) { + var new_option = new Option(node.text, node.value, false, false); + // Shows a tooltip when hovering over the option + new_option.setAttribute("title", node.text); + new_options += new_option.outerHTML; + } + } + new_options += ''; + box.outerHTML = new_options; + }, + filter: function(id, text) { + // Redisplay the HTML select box, displaying only the choices containing ALL + // the words in text. (It's an AND search.) + var tokens = text.toLowerCase().split(/\s+/); + var node, token; + var cache = SelectBox.cache[id]; + for (var i = 0, j = cache.length; i < j; i++) { + node = cache[i]; + node.displayed = 1; + var node_text = node.text.toLowerCase(); + var numTokens = tokens.length; + for (var k = 0; k < numTokens; k++) { + token = tokens[k]; + if (node_text.indexOf(token) === -1) { + node.displayed = 0; + break; // Once the first token isn't found we're done + } + } + } + SelectBox.redisplay(id); + }, + delete_from_cache: function(id, value) { + var node, delete_index = null; + var cache = SelectBox.cache[id]; + for (var i = 0, j = cache.length; i < j; i++) { + node = cache[i]; + 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 + var node; + var cache = SelectBox.cache[id]; + for (var i = 0, j = cache.length; i < j; i++) { + node = cache[i]; + if (node.value === value) { + return true; + } + } + return false; + }, + move: function(from, to) { + var from_box = document.getElementById(from); + var option; + var boxOptions = from_box.options; + var boxOptionsLength = boxOptions.length; + for (var i = 0, j = boxOptionsLength; i < j; i++) { + option = boxOptions[i]; + var 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) { + var from_box = document.getElementById(from); + var option; + var boxOptions = from_box.options; + var boxOptionsLength = boxOptions.length; + for (var i = 0, j = boxOptionsLength; i < j; i++) { + option = boxOptions[i]; + var 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(); + try { + if (a > b) { + return 1; + } + if (a < b) { + return -1; + } + } + catch (e) { + // silently fail on IE 'unknown' exception + } + return 0; + } ); + }, + select_all: function(id) { + var box = document.getElementById(id); + var boxOptions = box.options; + var boxOptionsLength = boxOptions.length; + for (var i = 0; i < boxOptionsLength; i++) { + boxOptions[i].selected = 'selected'; + } + } + }; + window.SelectBox = SelectBox; +})(django.jQuery); diff --git a/static/admin/js/SelectFilter2.js b/static/admin/js/SelectFilter2.js new file mode 100644 index 0000000..4221778 --- /dev/null +++ b/static/admin/js/SelectFilter2.js @@ -0,0 +1,246 @@ +/*global SelectBox, gettext, interpolate, quickElement, SelectFilter*/ +/* +SelectFilter2 - Turns a multiple-select box into a filter interface. + +Requires jQuery, core.js, and SelectBox.js. +*/ +(function($) { + 'use strict'; + function findForm(node) { + // returns the node of the form containing the given node + if (node.tagName.toLowerCase() !== 'form') { + return findForm(node.parentNode); + } + return node; + } + + window.SelectFilter = { + init: function(field_id, field_name, is_stacked) { + if (field_id.match(/__prefix__/)) { + // Don't initialize on empty forms. + return; + } + var from_box = document.getElementById(field_id); + from_box.id += '_from'; // change its ID + from_box.className = 'filtered'; + + var ps = from_box.parentNode.getElementsByTagName('p'); + for (var i = 0; i < ps.length; i++) { + if (ps[i].className.indexOf("info") !== -1) { + // Remove