From fd9e0e1528422e426f12a53c4d090e9723f62e36 Mon Sep 17 00:00:00 2001 From: Nikita Manovich Date: Thu, 30 Jul 2020 11:45:57 +0300 Subject: [PATCH 1/7] Removed outdated code --- .gitignore | 1 + cvat-ui/src/components/task-page/job-list.tsx | 9 - cvat/apps/authentication/api_urls.py | 28 - cvat/apps/authentication/forms.py | 60 - .../authentication/migrations/__init__.py | 5 - cvat/apps/authentication/models.py | 9 - cvat/apps/authentication/templates/403.html | 17 - .../authentication/templates/auth_base.html | 99 - cvat/apps/authentication/templates/login.html | 29 - .../authentication/templates/register.html | 32 - .../templates/user_profile.html | 21 - cvat/apps/authentication/tests.py | 9 - cvat/apps/authentication/urls.py | 25 +- cvat/apps/authentication/views.py | 18 - cvat/apps/documentation/admin.py | 9 - .../apps/documentation/migrations/__init__.py | 5 - cvat/apps/documentation/models.py | 9 - cvat/apps/documentation/tests.py | 9 - cvat/apps/engine/static/engine/base.css | 181 - .../engine/fonts/BarlowSemiCondensed-Bold.ttf | Bin 91412 -> 0 bytes .../fonts/BarlowSemiCondensed-Regular.ttf | Bin 85532 -> 0 bytes .../fonts/BarlowSemiCondensed-SemiBold.ttf | Bin 89760 -> 0 bytes .../apps/engine/static/engine/fonts/README.md | 95 - .../apps/engine/static/engine/icons/README.md | 5 - cvat/apps/engine/static/engine/icons/copy.png | Bin 254 -> 0 bytes .../static/engine/icons/hidden-shape.png | Bin 532 -> 0 bytes .../static/engine/icons/hidden-text.png | Bin 690 -> 0 bytes .../static/engine/icons/initKeyFrame.png | Bin 668 -> 0 bytes .../engine/static/engine/icons/keyframe.png | Bin 509 -> 0 bytes cvat/apps/engine/static/engine/icons/lock.png | Bin 185 -> 0 bytes .../static/engine/icons/nextKeyFrame.png | Bin 657 -> 0 bytes .../engine/static/engine/icons/non-hidden.png | Bin 634 -> 0 bytes .../static/engine/icons/non-keyframe.png | Bin 630 -> 0 bytes .../static/engine/icons/non-occluded.png | Bin 287 -> 0 bytes .../static/engine/icons/non-outside.png | Bin 410 -> 0 bytes .../engine/static/engine/icons/occluded.png | Bin 422 -> 0 bytes .../engine/static/engine/icons/outside.png | Bin 446 -> 0 bytes .../static/engine/icons/prevKeyFrame.png | Bin 673 -> 0 bytes .../engine/static/engine/icons/propagate.png | Bin 409 -> 0 bytes .../engine/static/engine/icons/unlock.png | Bin 182 -> 0 bytes .../engine/static/engine/js/3rdparty.patch | 128 - .../engine/js/3rdparty/Decoder.worker.js | 2 - .../engine/static/engine/js/3rdparty/avc.wasm | Bin 126815 -> 0 bytes .../static/engine/js/3rdparty/defiant.min.js | 6 - .../static/engine/js/3rdparty/jquery-3.3.1.js | 10364 ---------------- .../engine/js/3rdparty/jquery.fullscreen.js | 184 - .../static/engine/js/3rdparty/js.cookie.js | 165 - .../static/engine/js/3rdparty/mousetrap.js | 1044 -- .../static/engine/js/3rdparty/platform.js | 1219 -- .../engine/js/3rdparty/svg.draggable.js | 227 - .../static/engine/js/3rdparty/svg.draw.js | 442 - .../engine/static/engine/js/3rdparty/svg.js | 5601 --------- .../engine/js/3rdparty/svg.resize.min.js | 1 - .../static/engine/js/3rdparty/svg.select.js | 417 - .../static/engine/js/annotationParser.js | 439 - .../static/engine/js/annotationSaver.js | 452 - .../engine/static/engine/js/annotationUI.js | 761 -- .../engine/js/attributeAnnotationMode.js | 453 - cvat/apps/engine/static/engine/js/base.js | 227 - .../apps/engine/static/engine/js/bootstrap.js | 34 - .../engine/static/engine/js/borderSticker.js | 213 - .../engine/static/engine/js/checkPlatform.js | 22 - .../static/engine/js/coordinateTranslator.js | 177 - .../engine/static/engine/js/cuboidShape.js | 1370 -- .../engine/static/engine/js/cvat-core.min.js | 15 - cvat/apps/engine/static/engine/js/cvat.js | 22 - .../static/engine/js/download.worker.js | 9 - cvat/apps/engine/static/engine/js/history.js | 219 - .../engine/static/engine/js/labelsInfo.js | 192 - cvat/apps/engine/static/engine/js/listener.js | 51 - cvat/apps/engine/static/engine/js/logger.js | 564 - cvat/apps/engine/static/engine/js/player.js | 1041 -- .../static/engine/js/polyshapeEditor.js | 494 - .../engine/static/engine/js/qunitTests.js | 549 - cvat/apps/engine/static/engine/js/server.js | 11 - .../engine/static/engine/js/shapeBuffer.js | 563 - .../static/engine/js/shapeCollection.js | 1659 --- .../engine/static/engine/js/shapeCreator.js | 963 -- .../engine/static/engine/js/shapeFilter.js | 246 - .../engine/static/engine/js/shapeGrouper.js | 274 - .../engine/static/engine/js/shapeMerger.js | 285 - .../engine/static/engine/js/shapeSplitter.js | 91 - cvat/apps/engine/static/engine/js/shapes.js | 3395 ----- .../static/engine/js/unzip_imgs.worker.js | 9 - .../engine/static/engine/js/userConfig.js | 368 - cvat/apps/engine/static/engine/js/utils.js | 56 - cvat/apps/engine/static/engine/stylesheet.css | 599 - .../engine/templates/engine/annotation.html | 473 - cvat/apps/engine/templates/engine/base.html | 90 - cvat/apps/engine/urls.py | 2 +- cvat/apps/engine/views.py | 7 - cvat/apps/git/admin.py | 3 - cvat/apps/log_viewer/migrations/__init__.py | 0 cvat/apps/restrictions/migrations/__init__.py | 3 - 94 files changed, 17 insertions(+), 36859 deletions(-) delete mode 100644 cvat/apps/authentication/api_urls.py delete mode 100644 cvat/apps/authentication/forms.py delete mode 100644 cvat/apps/authentication/migrations/__init__.py delete mode 100644 cvat/apps/authentication/models.py delete mode 100644 cvat/apps/authentication/templates/403.html delete mode 100644 cvat/apps/authentication/templates/auth_base.html delete mode 100644 cvat/apps/authentication/templates/login.html delete mode 100644 cvat/apps/authentication/templates/register.html delete mode 100644 cvat/apps/authentication/templates/user_profile.html delete mode 100644 cvat/apps/authentication/tests.py delete mode 100644 cvat/apps/documentation/admin.py delete mode 100644 cvat/apps/documentation/migrations/__init__.py delete mode 100644 cvat/apps/documentation/models.py delete mode 100644 cvat/apps/documentation/tests.py delete mode 100644 cvat/apps/engine/static/engine/base.css delete mode 100644 cvat/apps/engine/static/engine/fonts/BarlowSemiCondensed-Bold.ttf delete mode 100644 cvat/apps/engine/static/engine/fonts/BarlowSemiCondensed-Regular.ttf delete mode 100644 cvat/apps/engine/static/engine/fonts/BarlowSemiCondensed-SemiBold.ttf delete mode 100644 cvat/apps/engine/static/engine/fonts/README.md delete mode 100644 cvat/apps/engine/static/engine/icons/README.md delete mode 100644 cvat/apps/engine/static/engine/icons/copy.png delete mode 100644 cvat/apps/engine/static/engine/icons/hidden-shape.png delete mode 100644 cvat/apps/engine/static/engine/icons/hidden-text.png delete mode 100644 cvat/apps/engine/static/engine/icons/initKeyFrame.png delete mode 100644 cvat/apps/engine/static/engine/icons/keyframe.png delete mode 100644 cvat/apps/engine/static/engine/icons/lock.png delete mode 100644 cvat/apps/engine/static/engine/icons/nextKeyFrame.png delete mode 100644 cvat/apps/engine/static/engine/icons/non-hidden.png delete mode 100644 cvat/apps/engine/static/engine/icons/non-keyframe.png delete mode 100644 cvat/apps/engine/static/engine/icons/non-occluded.png delete mode 100644 cvat/apps/engine/static/engine/icons/non-outside.png delete mode 100644 cvat/apps/engine/static/engine/icons/occluded.png delete mode 100644 cvat/apps/engine/static/engine/icons/outside.png delete mode 100644 cvat/apps/engine/static/engine/icons/prevKeyFrame.png delete mode 100644 cvat/apps/engine/static/engine/icons/propagate.png delete mode 100644 cvat/apps/engine/static/engine/icons/unlock.png delete mode 100644 cvat/apps/engine/static/engine/js/3rdparty.patch delete mode 100644 cvat/apps/engine/static/engine/js/3rdparty/Decoder.worker.js delete mode 100644 cvat/apps/engine/static/engine/js/3rdparty/avc.wasm delete mode 100644 cvat/apps/engine/static/engine/js/3rdparty/defiant.min.js delete mode 100644 cvat/apps/engine/static/engine/js/3rdparty/jquery-3.3.1.js delete mode 100644 cvat/apps/engine/static/engine/js/3rdparty/jquery.fullscreen.js delete mode 100644 cvat/apps/engine/static/engine/js/3rdparty/js.cookie.js delete mode 100644 cvat/apps/engine/static/engine/js/3rdparty/mousetrap.js delete mode 100644 cvat/apps/engine/static/engine/js/3rdparty/platform.js delete mode 100644 cvat/apps/engine/static/engine/js/3rdparty/svg.draggable.js delete mode 100644 cvat/apps/engine/static/engine/js/3rdparty/svg.draw.js delete mode 100644 cvat/apps/engine/static/engine/js/3rdparty/svg.js delete mode 100644 cvat/apps/engine/static/engine/js/3rdparty/svg.resize.min.js delete mode 100644 cvat/apps/engine/static/engine/js/3rdparty/svg.select.js delete mode 100644 cvat/apps/engine/static/engine/js/annotationParser.js delete mode 100644 cvat/apps/engine/static/engine/js/annotationSaver.js delete mode 100644 cvat/apps/engine/static/engine/js/annotationUI.js delete mode 100644 cvat/apps/engine/static/engine/js/attributeAnnotationMode.js delete mode 100644 cvat/apps/engine/static/engine/js/base.js delete mode 100644 cvat/apps/engine/static/engine/js/bootstrap.js delete mode 100644 cvat/apps/engine/static/engine/js/borderSticker.js delete mode 100644 cvat/apps/engine/static/engine/js/checkPlatform.js delete mode 100644 cvat/apps/engine/static/engine/js/coordinateTranslator.js delete mode 100644 cvat/apps/engine/static/engine/js/cuboidShape.js delete mode 100644 cvat/apps/engine/static/engine/js/cvat-core.min.js delete mode 100644 cvat/apps/engine/static/engine/js/cvat.js delete mode 100644 cvat/apps/engine/static/engine/js/download.worker.js delete mode 100644 cvat/apps/engine/static/engine/js/history.js delete mode 100644 cvat/apps/engine/static/engine/js/labelsInfo.js delete mode 100644 cvat/apps/engine/static/engine/js/listener.js delete mode 100644 cvat/apps/engine/static/engine/js/logger.js delete mode 100644 cvat/apps/engine/static/engine/js/player.js delete mode 100644 cvat/apps/engine/static/engine/js/polyshapeEditor.js delete mode 100644 cvat/apps/engine/static/engine/js/qunitTests.js delete mode 100644 cvat/apps/engine/static/engine/js/server.js delete mode 100644 cvat/apps/engine/static/engine/js/shapeBuffer.js delete mode 100644 cvat/apps/engine/static/engine/js/shapeCollection.js delete mode 100644 cvat/apps/engine/static/engine/js/shapeCreator.js delete mode 100644 cvat/apps/engine/static/engine/js/shapeFilter.js delete mode 100644 cvat/apps/engine/static/engine/js/shapeGrouper.js delete mode 100644 cvat/apps/engine/static/engine/js/shapeMerger.js delete mode 100644 cvat/apps/engine/static/engine/js/shapeSplitter.js delete mode 100644 cvat/apps/engine/static/engine/js/shapes.js delete mode 100644 cvat/apps/engine/static/engine/js/unzip_imgs.worker.js delete mode 100644 cvat/apps/engine/static/engine/js/userConfig.js delete mode 100644 cvat/apps/engine/static/engine/js/utils.js delete mode 100644 cvat/apps/engine/static/engine/stylesheet.css delete mode 100644 cvat/apps/engine/templates/engine/annotation.html delete mode 100644 cvat/apps/engine/templates/engine/base.html delete mode 100644 cvat/apps/git/admin.py delete mode 100644 cvat/apps/log_viewer/migrations/__init__.py delete mode 100644 cvat/apps/restrictions/migrations/__init__.py diff --git a/.gitignore b/.gitignore index cbe91f69a9c3..db888c9f4db3 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,7 @@ node_modules /Mask_RCNN/ /letsencrypt-webroot/ +.vscode/settings.json # Ignore temporary files docker-compose.override.yml diff --git a/cvat-ui/src/components/task-page/job-list.tsx b/cvat-ui/src/components/task-page/job-list.tsx index 647d72584daa..dc89b51a2ee9 100644 --- a/cvat-ui/src/components/task-page/job-list.tsx +++ b/cvat-ui/src/components/task-page/job-list.tsx @@ -54,15 +54,6 @@ function JobListComponent(props: Props & RouteComponentProps): JSX.Element { > {`Job #${id}`} - | - - - ), }, { diff --git a/cvat/apps/authentication/api_urls.py b/cvat/apps/authentication/api_urls.py deleted file mode 100644 index a3752ad5bf9c..000000000000 --- a/cvat/apps/authentication/api_urls.py +++ /dev/null @@ -1,28 +0,0 @@ -# Copyright (C) 2018 Intel Corporation -# -# SPDX-License-Identifier: MIT - -from django.urls import path -from django.conf import settings -from rest_auth.views import ( - LoginView, LogoutView, PasswordChangeView, - PasswordResetView, PasswordResetConfirmView) -from rest_auth.registration.views import RegisterView -from .views import SigningView - -urlpatterns = [ - path('login', LoginView.as_view(), name='rest_login'), - path('logout', LogoutView.as_view(), name='rest_logout'), - path('signing', SigningView.as_view(), name='signing') -] - -if settings.DJANGO_AUTH_TYPE == 'BASIC': - urlpatterns += [ - path('register', RegisterView.as_view(), name='rest_register'), - path('password/reset', PasswordResetView.as_view(), - name='rest_password_reset'), - path('password/reset/confirm', PasswordResetConfirmView.as_view(), - name='rest_password_reset_confirm'), - path('password/change', PasswordChangeView.as_view(), - name='rest_password_change'), - ] diff --git a/cvat/apps/authentication/forms.py b/cvat/apps/authentication/forms.py deleted file mode 100644 index 238b15988e9b..000000000000 --- a/cvat/apps/authentication/forms.py +++ /dev/null @@ -1,60 +0,0 @@ - -# Copyright (C) 2018 Intel Corporation -# -# SPDX-License-Identifier: MIT - -from django.contrib.auth.forms import ( - UsernameField, - AuthenticationForm, - UserCreationForm, -) -from django.utils.translation import gettext, gettext_lazy as _ -from django.contrib.auth.models import User - -from django import forms - -class AuthForm(AuthenticationForm): - username = UsernameField( - widget=forms.TextInput(attrs={'autofocus': True, 'placeholder': "Username"}), - ) - password = forms.CharField( - label=_("Password"), - strip=False, - widget=forms.PasswordInput(attrs={'placeholder': "Password"}), - ) - -class NewUserForm(UserCreationForm): - username = UsernameField( - widget=forms.TextInput(attrs={'autofocus': True, 'placeholder': "Username (required)"}), - required=True, - ) - - first_name = UsernameField( - widget=forms.TextInput(attrs={'placeholder': "First name"}), - required=False, - ) - - last_name = UsernameField( - widget=forms.TextInput(attrs={'placeholder': "Last name"}), - required=False, - ) - - email = forms.EmailField( - widget=forms.EmailInput(attrs={'placeholder': "Email (required)"}), - required=True, - ) - - password1 = forms.CharField( - label=_("Password"), - strip=False, - widget=forms.PasswordInput(attrs={'placeholder': "Password (required)"}), - ) - password2 = forms.CharField( - label=_("Password confirmation"), - widget=forms.PasswordInput(attrs={'placeholder': "Password confirmation (required)"}), - strip=False, - ) - - class Meta: - model = User - fields = ('username', 'first_name', 'last_name', 'email', ) diff --git a/cvat/apps/authentication/migrations/__init__.py b/cvat/apps/authentication/migrations/__init__.py deleted file mode 100644 index d8e62e54b356..000000000000 --- a/cvat/apps/authentication/migrations/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ - -# Copyright (C) 2018 Intel Corporation -# -# SPDX-License-Identifier: MIT - diff --git a/cvat/apps/authentication/models.py b/cvat/apps/authentication/models.py deleted file mode 100644 index cdf3b0827bf1..000000000000 --- a/cvat/apps/authentication/models.py +++ /dev/null @@ -1,9 +0,0 @@ - -# Copyright (C) 2018 Intel Corporation -# -# SPDX-License-Identifier: MIT - -from django.db import models - -# Create your models here. - diff --git a/cvat/apps/authentication/templates/403.html b/cvat/apps/authentication/templates/403.html deleted file mode 100644 index e275bb1fe140..000000000000 --- a/cvat/apps/authentication/templates/403.html +++ /dev/null @@ -1,17 +0,0 @@ - -{% extends "auth_base.html" %} - -{% block title %}Forbidden{% endblock %} - -{% block content %} -

Forbidden

- {% if user.is_authenticated %} -

Your account doesn't have access to this page. To proceed, - please login with an account that has access or contact your admin.
- Login

- {% endif %} -{% endblock %} diff --git a/cvat/apps/authentication/templates/auth_base.html b/cvat/apps/authentication/templates/auth_base.html deleted file mode 100644 index a9a4b98f4d90..000000000000 --- a/cvat/apps/authentication/templates/auth_base.html +++ /dev/null @@ -1,99 +0,0 @@ - - - - - - - - {% block title %}{% endblock %} - - - - - - - -
- {% block note %} {% endblock %} -
- - diff --git a/cvat/apps/authentication/templates/login.html b/cvat/apps/authentication/templates/login.html deleted file mode 100644 index 855031f73222..000000000000 --- a/cvat/apps/authentication/templates/login.html +++ /dev/null @@ -1,29 +0,0 @@ - -{% extends "auth_base.html" %} - -{% block title %}Login{% endblock %} - -{% block content %} -

Login

- {% if form.errors %} - Your username and password didn't match. Please try again. - {% endif %} -
- {% csrf_token %} - {% for field in form %} - {{ field }} - {% endfor %} - - -
-{% endblock %} - -{% block note%} - {% autoescape off %} - {{ note }} - {% endautoescape %} -{% endblock %} \ No newline at end of file diff --git a/cvat/apps/authentication/templates/register.html b/cvat/apps/authentication/templates/register.html deleted file mode 100644 index b655e221eb84..000000000000 --- a/cvat/apps/authentication/templates/register.html +++ /dev/null @@ -1,32 +0,0 @@ - -{% extends "auth_base.html" %} - -{% block title %}Create user{% endblock %} - -{% block content %} - - -
- -
-{% endblock %} diff --git a/cvat/apps/authentication/templates/user_profile.html b/cvat/apps/authentication/templates/user_profile.html deleted file mode 100644 index 37ea7d49b11e..000000000000 --- a/cvat/apps/authentication/templates/user_profile.html +++ /dev/null @@ -1,21 +0,0 @@ - -
- {% if user.is_authenticated %} - {% if user.ldap_user and 'thumbnailPhoto' in user.ldap_user.attrs %} - {# TODO insert photo from ldap #} - {% endif %} - - {% if user.first_name and user.last_name %} -

{{ user.first_name }} {{ user.last_name }}

- {% else %} -

{{ user.username }}

- {% endif %} -
- -
- {% endif %} -
\ No newline at end of file diff --git a/cvat/apps/authentication/tests.py b/cvat/apps/authentication/tests.py deleted file mode 100644 index 53bc3b7adb85..000000000000 --- a/cvat/apps/authentication/tests.py +++ /dev/null @@ -1,9 +0,0 @@ - -# Copyright (C) 2018 Intel Corporation -# -# SPDX-License-Identifier: MIT - -from django.test import TestCase - -# Create your tests here. - diff --git a/cvat/apps/authentication/urls.py b/cvat/apps/authentication/urls.py index e05d734035f9..a3752ad5bf9c 100644 --- a/cvat/apps/authentication/urls.py +++ b/cvat/apps/authentication/urls.py @@ -1,23 +1,28 @@ - # Copyright (C) 2018 Intel Corporation # # SPDX-License-Identifier: MIT from django.urls import path -from django.contrib.auth import views as auth_views from django.conf import settings - -from . import forms -from . import views +from rest_auth.views import ( + LoginView, LogoutView, PasswordChangeView, + PasswordResetView, PasswordResetConfirmView) +from rest_auth.registration.views import RegisterView +from .views import SigningView urlpatterns = [ - path('login', auth_views.LoginView.as_view(form_class=forms.AuthForm, - template_name='login.html', extra_context={'note': settings.AUTH_LOGIN_NOTE}), - name='login'), - path('logout', auth_views.LogoutView.as_view(next_page='login'), name='logout'), + path('login', LoginView.as_view(), name='rest_login'), + path('logout', LogoutView.as_view(), name='rest_logout'), + path('signing', SigningView.as_view(), name='signing') ] if settings.DJANGO_AUTH_TYPE == 'BASIC': urlpatterns += [ - path('register', views.register_user, name='register'), + path('register', RegisterView.as_view(), name='rest_register'), + path('password/reset', PasswordResetView.as_view(), + name='rest_password_reset'), + path('password/reset/confirm', PasswordResetConfirmView.as_view(), + name='rest_password_reset_confirm'), + path('password/change', PasswordChangeView.as_view(), + name='rest_password_change'), ] diff --git a/cvat/apps/authentication/views.py b/cvat/apps/authentication/views.py index b2497e2aba68..f38e3409e7f6 100644 --- a/cvat/apps/authentication/views.py +++ b/cvat/apps/authentication/views.py @@ -2,35 +2,17 @@ # # SPDX-License-Identifier: MIT -from django.shortcuts import render, redirect -from django.conf import settings -from django.contrib.auth import login, authenticate from rest_framework import views from rest_framework.exceptions import ValidationError from rest_framework.response import Response from furl import furl -from . import forms from . import signature from django.utils.decorators import method_decorator from drf_yasg.utils import swagger_auto_schema from drf_yasg import openapi -def register_user(request): - if request.method == 'POST': - form = forms.NewUserForm(request.POST) - if form.is_valid(): - form.save() - username = form.cleaned_data.get('username') - raw_password = form.cleaned_data.get('password1') - user = authenticate(username=username, password=raw_password) - login(request, user) - return redirect(settings.LOGIN_REDIRECT_URL) - else: - form = forms.NewUserForm() - return render(request, 'register.html', {'form': form}) - @method_decorator(name='post', decorator=swagger_auto_schema( request_body=openapi.Schema( type=openapi.TYPE_OBJECT, diff --git a/cvat/apps/documentation/admin.py b/cvat/apps/documentation/admin.py deleted file mode 100644 index af8dfc47525b..000000000000 --- a/cvat/apps/documentation/admin.py +++ /dev/null @@ -1,9 +0,0 @@ - -# Copyright (C) 2018 Intel Corporation -# -# SPDX-License-Identifier: MIT - -from django.contrib import admin - -# Register your models here. - diff --git a/cvat/apps/documentation/migrations/__init__.py b/cvat/apps/documentation/migrations/__init__.py deleted file mode 100644 index d8e62e54b356..000000000000 --- a/cvat/apps/documentation/migrations/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ - -# Copyright (C) 2018 Intel Corporation -# -# SPDX-License-Identifier: MIT - diff --git a/cvat/apps/documentation/models.py b/cvat/apps/documentation/models.py deleted file mode 100644 index cdf3b0827bf1..000000000000 --- a/cvat/apps/documentation/models.py +++ /dev/null @@ -1,9 +0,0 @@ - -# Copyright (C) 2018 Intel Corporation -# -# SPDX-License-Identifier: MIT - -from django.db import models - -# Create your models here. - diff --git a/cvat/apps/documentation/tests.py b/cvat/apps/documentation/tests.py deleted file mode 100644 index 53bc3b7adb85..000000000000 --- a/cvat/apps/documentation/tests.py +++ /dev/null @@ -1,9 +0,0 @@ - -# Copyright (C) 2018 Intel Corporation -# -# SPDX-License-Identifier: MIT - -from django.test import TestCase - -# Create your tests here. - diff --git a/cvat/apps/engine/static/engine/base.css b/cvat/apps/engine/static/engine/base.css deleted file mode 100644 index 61115dd7ba5c..000000000000 --- a/cvat/apps/engine/static/engine/base.css +++ /dev/null @@ -1,181 +0,0 @@ -/* - * Copyright (C) 2018 Intel Corporation - * - * SPDX-License-Identifier: MIT - */ - -html { - background-color: #FFFFFF; - margin: 0px auto; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} - -@font-face { - font-family: BarlowSemiCondensed-Regular; - src: url(fonts/BarlowSemiCondensed-Regular.ttf); -} - -@font-face { - font-family: BarlowSemiCondensed-SemiBold; - src: url(fonts/BarlowSemiCondensed-SemiBold.ttf); -} - -@font-face { - font-family: BarlowSemiCondensed-Bold; - src: url(fonts/BarlowSemiCondensed-Bold.ttf); -} - -.regular { - font-family: BarlowSemiCondensed-Regular; -} - -.semiBold { - font-family: BarlowSemiCondensed-SemiBold; -} - -.bold { - font-family: BarlowSemiCondensed-Bold; -} - -.h2 { - font-size: 1.2em; -} - -.h1 { - font-size: 1.4em; -} - -.h3 { - font-size: 1.1em; -} - -.overlay { - position: fixed; - display: none; - width: 100%; - height: 100%; - top: 0; - left: 0; - right: 0; - bottom: 0; - background-color: white; - z-index: 100; -} - -.modal { - position: fixed; - z-index: 10; - left: 0; - top: 0; - width: 100%; - height: 100%; - overflow: auto; - background-color: rgb(0,0,0); - background-color: rgba(0,0,0,0.4); -} - -.modal-content { - background-color: #FFFFFF; - margin: 15% auto; - padding: 20px; - border: 1px solid #888; - width: 80%; -} - -.close { - position: absolute; - right: 5px; - top: 5px; - width: 32px; - height: 32px; - opacity: 0.3; - } - - .close:hover { - opacity: 1; - } - - .close:before, .close:after { - position: absolute; - left: 15px; - content: ' '; - height: 22px; - width: 2px; - background-color: #333; - } - - .close:before { - transform: rotate(45deg); - } - - .close:after { - transform: rotate(-45deg); - } - -.tab { - overflow: hidden; - border: 1px solid black; - background-color: #B0C4DE; -} - -.tab button { - background-color: inherit; - float: left; - border: none; - outline: none; - cursor: pointer; - padding: 3px 0px; - transition: 0.3s; - -} - -.tab button:hover { - background-color: #81aee8; -} - -.tab button.active { - background-color: #ccc; -} - -.activeTabButton { - background-color: #81aee8 !important; -} - -.hidden { - display: none; -} - -.selectable { - -webkit-user-select: text; - -moz-user-select: text; - -ms-user-select: text; - user-select: text; -} - -.dropdown { - position: relative; -} - -.dropdown-content { - position: absolute; - background-color: #f1f1f1; - min-width: 160px; - box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2); - z-index: 1; - list-style-type: none; - padding-inline-start: 0; - margin-left: 20%; - margin-top: -1%; -} - -.dropdown-content li { - color: black; - padding: 12px 16px; - text-decoration: none; - display: block; -} - -.dropdown-content li:hover {background-color: #ddd} \ No newline at end of file diff --git a/cvat/apps/engine/static/engine/fonts/BarlowSemiCondensed-Bold.ttf b/cvat/apps/engine/static/engine/fonts/BarlowSemiCondensed-Bold.ttf deleted file mode 100644 index 35b5a372f108b748b669f3a5247eececc9c12903..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 91412 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 diff --git a/cvat/apps/engine/static/engine/fonts/BarlowSemiCondensed-Regular.ttf b/cvat/apps/engine/static/engine/fonts/BarlowSemiCondensed-Regular.ttf deleted file mode 100644 index ccdebedcd51e3e589fc28fa45ee852b88a8de194..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 85532 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 z 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 YSbBl=w997J6yUC67oh8bDW8D>05sneW&i*H diff --git a/cvat/apps/engine/static/engine/fonts/BarlowSemiCondensed-SemiBold.ttf b/cvat/apps/engine/static/engine/fonts/BarlowSemiCondensed-SemiBold.ttf deleted file mode 100644 index 660b40256c7c938563cfdcdc7c1f1bcc673bc8af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 89760 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 diff --git a/cvat/apps/engine/static/engine/fonts/README.md b/cvat/apps/engine/static/engine/fonts/README.md deleted file mode 100644 index 73a8fef315af..000000000000 --- a/cvat/apps/engine/static/engine/fonts/README.md +++ /dev/null @@ -1,95 +0,0 @@ -Fonts was downloaded from: https://fonts.google.com/specimen/Barlow+Semi+Condensed - -Copyright 2017 The Barlow Project Authors (https://github.com/jpt/barlow) - -This Font Software is licensed under the SIL Open Font License, Version 1.1. -This license is copied below, and is also available with a FAQ at: -http://scripts.sil.org/OFL - - ------------------------------------------------------------ -SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 ------------------------------------------------------------ - -PREAMBLE -The goals of the Open Font License (OFL) are to stimulate worldwide -development of collaborative font projects, to support the font creation -efforts of academic and linguistic communities, and to provide a free and -open framework in which fonts may be shared and improved in partnership -with others. - -The OFL allows the licensed fonts to be used, studied, modified and -redistributed freely as long as they are not sold by themselves. The -fonts, including any derivative works, can be bundled, embedded, -redistributed and/or sold with any software provided that any reserved -names are not used by derivative works. The fonts and derivatives, -however, cannot be released under any other type of license. The -requirement for fonts to remain under this license does not apply -to any document created using the fonts or their derivatives. - -DEFINITIONS -"Font Software" refers to the set of files released by the Copyright -Holder(s) under this license and clearly marked as such. This may -include source files, build scripts and documentation. - -"Reserved Font Name" refers to any names specified as such after the -copyright statement(s). - -"Original Version" refers to the collection of Font Software components as -distributed by the Copyright Holder(s). - -"Modified Version" refers to any derivative made by adding to, deleting, -or substituting -- in part or in whole -- any of the components of the -Original Version, by changing formats or by porting the Font Software to a -new environment. - -"Author" refers to any designer, engineer, programmer, technical -writer or other person who contributed to the Font Software. - -PERMISSION & CONDITIONS -Permission is hereby granted, free of charge, to any person obtaining -a copy of the Font Software, to use, study, copy, merge, embed, modify, -redistribute, and sell modified and unmodified copies of the Font -Software, subject to the following conditions: - -1) Neither the Font Software nor any of its individual components, -in Original or Modified Versions, may be sold by itself. - -2) Original or Modified Versions of the Font Software may be bundled, -redistributed and/or sold with any software, provided that each copy -contains the above copyright notice and this license. These can be -included either as stand-alone text files, human-readable headers or -in the appropriate machine-readable metadata fields within text or -binary files as long as those fields can be easily viewed by the user. - -3) No Modified Version of the Font Software may use the Reserved Font -Name(s) unless explicit written permission is granted by the corresponding -Copyright Holder. This restriction only applies to the primary font name as -presented to the users. - -4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font -Software shall not be used to promote, endorse or advertise any -Modified Version, except to acknowledge the contribution(s) of the -Copyright Holder(s) and the Author(s) or with their explicit written -permission. - -5) The Font Software, modified or unmodified, in part or in whole, -must be distributed entirely under this license, and must not be -distributed under any other license. The requirement for fonts to -remain under this license does not apply to any document created -using the Font Software. - -TERMINATION -This license becomes null and void if any of the above conditions are -not met. - -DISCLAIMER -THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT -OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE -COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL -DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM -OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/cvat/apps/engine/static/engine/icons/README.md b/cvat/apps/engine/static/engine/icons/README.md deleted file mode 100644 index bad04298db46..000000000000 --- a/cvat/apps/engine/static/engine/icons/README.md +++ /dev/null @@ -1,5 +0,0 @@ -Icons was downloaded from: https://icomoon.io/#preview-free [GitHub](https://github.com/Keyamoon/IcoMoon-Free) - -[License](https://github.com/Keyamoon/IcoMoon-Free/blob/master/License.txt): - -You can use this package under one of these two licenses: [CC BY 4.0](http://creativecommons.org/licenses/by/4.0/) or [GPL](http://www.gnu.org/licenses/gpl.html). diff --git a/cvat/apps/engine/static/engine/icons/copy.png b/cvat/apps/engine/static/engine/icons/copy.png deleted file mode 100644 index 5e76a30c5e38eb741746b1f2aa159500177deabe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 254 zcmVC zZs(iz)*t1%Sc}hU3wj$;09Wxe7w7vqA2k$=K$G6}!0KIQ&IprSR zEb7`jMd21NW5@u|xxqLPk{e!tu-xzfgyx0^Aarbh4Z!3^je5p`0Wcg0cK|ue!iP_z z`H?4j3SI+1g_*yn)~XH+fZ@Pz9YDd&dQY0Q4kQrR4tUT~38>HiRR91007*qoM6N<$ Ef)TE2!vFvP diff --git a/cvat/apps/engine/static/engine/icons/hidden-shape.png b/cvat/apps/engine/static/engine/icons/hidden-shape.png deleted file mode 100644 index 60fb969e58d73e0d861be843277f5414b37d7378..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 532 zcmV+v0_**WP)2dmxF25>9s zG9X+Q0_0xOT^&Ik0G_@kA@+FPw1yO&R7Il-fV?8^4YwDLXaE6BVPybBKYI{2K_K?h zNTdMk4trf>h`^!!nF3I7RQnJ{QKBaUpw&Kl41HC1WT`NKM@i>HxSnV{NxCoqieqbF z05qonFyWpD7B{&W0A0fWE$J%hX=Vo#Zzt%;0|0N5jshDIN01PvMjO*&5r}sH*t8!2 znB@me)s|>F7XbVP#92CRIN@k#CaK#t0$|J(EV~pTw;pDBRS_~xNrTt2BJ9$JK+uNE zT!|v44I|=g&Dt#{+FjWLRUIs7)}Fk*_4*P#w1yr*7@jClOwrhDB2_Pb;WK%i_JL2W(xsrnNM<`4t zUe{>gH4`$s0asbu+mJof1s`EzdO;B8aSHs3*C~hxAYBgxKYN~AiU=`6bP=gT+-3hF W{bK%rzCf4&0000I1y04tC_9duIb&`a;mPY?w{S+ zd9Po8-blmjP||^<4N0q#w$tbDl4g=VB|S=ds=anpaS*TzNq_@dV~~N!c_J2m(?{S^ z(&+$T4+N1LNmmhrhyb2G8;NVY?m9z=_DgD%2oP7mOLBiDXyw^@J4>?KPDs6TX=LQlt$7LN8U&E}!MwnGLQ=B6{t(uCx{OwBRTx9S%RiBX zhb04Gt0yU1S?Mj`ZSze2!!MUA$)RRXQ?KJ$xI zAZMty<{SimoLA9&@aOu(sJdq<2>eF~rokljA($>j5-z$7Bk#$XVj23@RmQJhYFbrNT1tH=AjdOSsIGZ$ zRU+Y7@BCPAq|b+=wVYD3`H;`&zh1m&Z?J1Qb3U)-rF{Z$-gmC$83_5h>V0TVg#DrB zuNn1TQlo|hUeh1u8*s_`2=EPRa0$s&O9Wt&7xJCSTSLGShXlX;_uO_ufQT=l1H8(9 Y0qsVj{)r9IfdBvi07*qoM6N<$f&j)gQUCw| diff --git a/cvat/apps/engine/static/engine/icons/initKeyFrame.png b/cvat/apps/engine/static/engine/icons/initKeyFrame.png deleted file mode 100644 index 62761e7cc41f363527b487c6f2e544fbfddf8061..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 668 zcmV;N0%QG&P)|ftl_% z@AcP?)Xz>N9ZTAlG?uhiT%Sw&lJp_zNz!xF?I>`NU{{g|PSA(}1|XLOu*N%G0InsS z_XwN@0?3`Dnn{#KrjE50wCyn5*!_&F~=?>-6kM*JQE&3O8a*~XY|!g0AT~kHeAK* z+hGp?iph2}=o%W_d;tPk%}7e(l@d^DZ;tv1?H+LHutg^?2l=p+!Wg)hbXr^{;XvGF zKgofvlIA#!T4Fv(IQ`JODwYMXYB;+iemWspXT=EVhPKE*? zaOoolfW0`U3MzMVBp3?7ORyM{gt-h%@& zV9-S{o09f-`}SkY#i9Q&0kD0Tq)QF76C7DrtZVv_n9%6i=pzLn>3qu#xX!u&a0fPU z!t0_y2nJV)Y&#%o4RI2Z zoG@D#U^Cc@7!P8++c#&*cVM|bgChX(yoPs+5dd6EItXG;9oI0Nngc+Dd?_WCYxagg zI5CY&uxf~fI7^Y{z^Wkr#A6PmZjBA`Pdo>}yRjga#7h7Xg7SLQkW4LI9wl9-+b<5X z4k92he00000NkvXXu0mjfRMX74 diff --git a/cvat/apps/engine/static/engine/icons/lock.png b/cvat/apps/engine/static/engine/icons/lock.png deleted file mode 100644 index c8174e56b4f446bca1ed940b39bfe9d8e18a79b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 185 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJ22U5qkcif|7cO!(81S%MkY1=< zVr<={oU$b^!2FVYYmm~Vf<^M;C&HcIt2Ufk&$NK?M*c3whj~`RP-;n zBE_+PmjT1$Z=w!m&p!Qh+ka@sRPlSt$11HFZ1o!${5}fC@+jr~nm^3M3Vv11jMB_Pp6Md3Lk2abh#) z(rF9e90(#elCJ6))DhsO&rV`{{v+Lt+ungl)iUmFo%U9@7xeZOiL(U@pR(UOa{ z;G*tb&zTuUEF;Ko18LdgnAV^-%`F-wMZp4raFq@M0yS@9d z<>Ju4m_XQGO!B1$*#Rf4GuAZyNK9n(YP1OjBw0X;4YFynACc^gMx*CT}c8Q(2{@*L@ood?4C9P z*OJaFfISdIZYAC17~}|W(ibCf$*C8u!J@;I8Yu$!3V2HHuORJf@S7JC?7^yoVAW=V z4QfCl?wKv|1OWX=fCG#j_k~iNhV`BZB(|**mOxH+GMX2%xh8lYgt;{~P+%`Uumm_E z*>2+@fY$)~wU9V*4@pY!8Vm66-AT{Mxq4j$SJEocSP>QQEb*Mgs+B!Q7CVsM=EO|h zNC2QUv-_+f;Yt-EkM7K3FgGB8%#Y>|PLCyh1f|-lFob}Ye^Ipshjum(LvDN)TA41(TIX!lhqB ze>Er;w9GytS%?5yMk)TL`Q@4sOsNN5HY4u8E%9^Bh;9X_ZAi3Gs$v)6+cBqy%(QJF zAwlVk|B0f3q$!QAEb|=pkf^l-RcXI|sF~PlJ2jMgD3wK7n9?N U{#xv9p#T5?07*qoM6N<$f)4>5CjbBd diff --git a/cvat/apps/engine/static/engine/icons/non-keyframe.png b/cvat/apps/engine/static/engine/icons/non-keyframe.png deleted file mode 100644 index 619dd5bdbac98565d4c2fb9b67248f3011c84bff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 630 zcmV-+0*U>JP)>Y5g-CC0z`la5CQd0x9S?RGkbHcbk$X<-P!5a zU;oS)=$~ycrT<;~{<3wSX#rj&eM(yX4*;USFvok6npBuZ0is_t0RC=Lp%oxT@9H zPxfrQ27qHp>*lPFY$x_jZY_Hq_1VOrMgR~YIis-LMn*{lPVUk4+22)jB~g%P1nPzo zLr*~p(KJ*lWU+n6&IvNsz$_uM&b=h4pKa=!8B-)j!z6+|c^jqXxi2ZamWf6n)eH;_R=jO_g!*;@ME!)bmK+ zrsKGl3O_ZA^-}{lle91CR?=3+<9L{K)CTtgiul|LFbiA*U_>)M)A`ScW#-5G0Bhn2 z=;s1s9ndBKqMNfz1~94PbW^&J{k#g$2C{){U^id{Mvx8k!!|)uv=4YB8g6obfaIJ&fD3!} z$YX&E&;bwM&L6Yd@L~X+YM});3Gh&(Ay5efDh&ZA5O5j-y+GiuA&?3W-39(nzzN_^ zL!cH2)EWZ0Kp@u;fV9WpwBYdi#((-C^(g%ZhRG)+dK7Q{I3^-swt|PKzxTsrzyTH@IYW&F$n|vm3xeZA_rq lP@stkNH*Wns%*yJ%o7xZT0(vLCQASS002ovPDHLkV1o2ZbbtT= diff --git a/cvat/apps/engine/static/engine/icons/non-outside.png b/cvat/apps/engine/static/engine/icons/non-outside.png deleted file mode 100644 index 567710452b9e5b591eb36ca1ca4fd520a6bf3c27..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 410 zcmV;L0cHM)P)az0vo^x-5_iL8^8vzLAycNApJm`3Snb#^VP#U=Y2$y^(4zS zffFZA?1uwBfCtb5Pv9kditQmW?w!JSpjKjgSBZ7Bu3 zRBUGKc__)J5wSa>VLRI@0LiU=4wf?-JR;g(@Ouc09parQ-=O@h73dSY46%$9&_R3z z4j2=}N7hfWcLcC~2z~xNwAVI^_*d7kF#hU*copfqvEndYv%v(mEVnUZdmJOn-E*v8 z)`7@tXm>)N{y8R-xK7xJZBFd)-;!!eT%!zhSWDuoNpulgLHN^M?h)3wv3|!>*pcu# z*0|#zON-CZ3 zD=pZ=0|%f7eg^fxaTu!_K|qWt)Pivam?T#NXrBSJuK^SdAQAWgRyBaG3QVX0A!7>W zQ{;JGyYN6^7mmT4MNUw_i>{=$I?e!7)P-8{>Mo2U#kKJQVw|tpHhJ z9#?iz#CHR7+;7dl1HoQfG#Bolqp<=kgj-On00Z<3;Jw8965RqwA3_MP(iA*)ZM9!; ztsCMiq3t;M1&07*qoM6N<$f+_pO)&Kwi diff --git a/cvat/apps/engine/static/engine/icons/prevKeyFrame.png b/cvat/apps/engine/static/engine/icons/prevKeyFrame.png deleted file mode 100644 index 82b6520016ac264be28a465633040e1b6a634faf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 673 zcmV;S0$%-zP)Py-S+b5E~C4EYImh@8UwpXwauq#P`16pE`fyiYbmfh1t z;9Amo3*Z)Zwjw~*9i`Mr5x^PXUhc6Z z)Oah=U(#V%f8f?b7!pQ$_E$^*(2oe5I3i;gyO4Ank=XG{cmlEPKS9pYQ|Abx1|i#U zH)h`!djd#IwwobWDfmzla-U^bK!UKEk(A(7A>gXLJL%iV4)}fW{7^%}hl6~Wg~AkI z<7se0!oj%2Jh-i|BY~opn2(Z%MgT?@qf+Tp;E*5;kVu&i1(=%<;NCuk)!cK!(PUk~ z%_rsB>cjv7UjC6JVpV6$fa8}dO?Aaa5b$wnl7CrnKz$g-5TG*c21eY^xk}}v_z!U0 zQE9nx*aQN<4kXtb{tMioD$KPYu*wij*CGj5ehqygqDWAqn{1h+Tqs0j3{g`rb=pQB!wuebP)F3GPo#u^U+*P`n1u+5?X5`Y057sX8F8%sc7fs>00000NkvXX Hu0mjf!L~7y diff --git a/cvat/apps/engine/static/engine/icons/propagate.png b/cvat/apps/engine/static/engine/icons/propagate.png deleted file mode 100644 index a575441e63bd8ae262fab35da1ee504a8e0b1818..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 409 zcmV;K0cQS*P)z+422&XbOYFc5y~d80o|bO2CxBa0wb^iY|s&UFK73Jkz&aSmmk!BNU)vv+19f( z!^CYiu|9?XtN?tb1$+ZIwJfFuAPe(XHUfk}A^@83EfLHGNeILPU0KSJo z`T#t_<*|oBG=LW2W)KN5hHw~!0M8J1gJb{((7Tv*O+j^R@wPIDvB5iIA^OhLD34%l z5K}l`TviYc1*r<>ov7I`3gQ;l02qu*06g~}aaR1l2I3Wd1F!~gkw;LvfZ{si`fkN#-4Jzw z1rin>>H-PEXBk|5D<0hi+D+{Z#(x)dMXWa$yoL*`)UV}&Ru?>Ic&g$&$pR@qs=2_d zYa#$OkdUya9x$m>N8S-F7u4qd^|$PR`{SO0lLPz$a?!D&*$jGy00000NkvXXu0mjf D_rj#{ diff --git a/cvat/apps/engine/static/engine/icons/unlock.png b/cvat/apps/engine/static/engine/icons/unlock.png deleted file mode 100644 index 5b736985c3d3aecfd099a13e7e9d1ef82b3833d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJT2B|pkcif|7cO!(81S%MkY1=< zVr<={oMK|WLi%OD6Q^LNE$c(3?^h4(6}eEbj9~@Cw(byy%hE?*F0*J-QA>EMkuNx9 zCi|)LB5ViZ_cNS07-x6y#r_BDyG}*7++WUo<2Mt>2iXHn$1h4ep0r%hfq{`l07(2} fH%Qv~b=v#$Ro8MIn7Sqd9m3%0>gTe~DWM4fl2SxJ diff --git a/cvat/apps/engine/static/engine/js/3rdparty.patch b/cvat/apps/engine/static/engine/js/3rdparty.patch deleted file mode 100644 index 7fb966933a87..000000000000 --- a/cvat/apps/engine/static/engine/js/3rdparty.patch +++ /dev/null @@ -1,128 +0,0 @@ -From 11bd98c7f1ecf5a57b0eb327e6e86fa1e6ca33d9 Mon Sep 17 00:00:00 2001 -From: Boris Sekachev -Date: Tue, 25 Feb 2020 19:08:36 +0300 -Subject: [PATCH] Applied patch - ---- - .../static/engine/js/3rdparty/svg.draggable.js | 1 + - .../static/engine/js/3rdparty/svg.draw.js | 17 +++++++++++++++-- - .../static/engine/js/3rdparty/svg.resize.min.js | 2 +- - .../static/engine/js/3rdparty/svg.select.js | 5 ++++- - 4 files changed, 21 insertions(+), 4 deletions(-) - -diff --git a/cvat/apps/engine/static/engine/js/3rdparty/svg.draggable.js b/cvat/apps/engine/static/engine/js/3rdparty/svg.draggable.js -index d88abf5..aba474c 100644 ---- a/cvat/apps/engine/static/engine/js/3rdparty/svg.draggable.js -+++ b/cvat/apps/engine/static/engine/js/3rdparty/svg.draggable.js -@@ -109,6 +109,7 @@ - - // while dragging - DragHandler.prototype.drag = function(e){ -+ this.m = this.el.node.getScreenCTM().inverse(); - - var box = this.getBBox() - , p = this.transformPoint(e) -diff --git a/cvat/apps/engine/static/engine/js/3rdparty/svg.draw.js b/cvat/apps/engine/static/engine/js/3rdparty/svg.draw.js -index 68dbf2a..20a6917 100644 ---- a/cvat/apps/engine/static/engine/js/3rdparty/svg.draw.js -+++ b/cvat/apps/engine/static/engine/js/3rdparty/svg.draw.js -@@ -18,6 +18,7 @@ - this.startPoint = null; - this.lastUpdateCall = null; - this.options = {}; -+ this.set = new SVG.Set(); - - // Merge options and defaults - for (var i in this.el.draw.defaults) { -@@ -139,6 +140,8 @@ - // Call the calc-function which calculates the new position and size - this.calc(event); - -+ this.m = this.el.node.getScreenCTM().inverse(); -+ this.offset = { x: window.pageXOffset, y: window.pageYOffset }; - // Fire the `drawupdate`-event - this.el.fire('drawupdate', {event:event, p:this.p, m:this.m}); - }; -@@ -160,6 +163,16 @@ - this.el.fire('drawcancel'); - }; - -+ // Undo last drawed point -+ PaintHandler.prototype.undo = function () { -+ if (this.set.length()) { -+ this.set.members.splice(-1, 1)[0].remove(); -+ this.el.array().value.splice(-2, 1); -+ this.el.plot(this.el.array()); -+ this.el.fire('undopoint'); -+ } -+ }; -+ - // Calculate the corrected position when using `snapToGrid` - PaintHandler.prototype.snapToGrid = function (draw) { - -@@ -371,14 +384,14 @@ - - this.set.clear(); - -- for (var i = 0; i < array.length; ++i) { -+ for (var i = 0; i < array.length - 1; ++i) { - - this.p.x = array[i][0] - this.p.y = array[i][1] - - var p = this.p.matrixTransform(this.parent.node.getScreenCTM().inverse().multiply(this.el.node.getScreenCTM())); - -- this.set.add(this.parent.circle(5).stroke({width: 1}).fill('#ccc').center(p.x, p.y)); -+ this.set.add(this.parent.circle(5).stroke({width: 1}).fill('#ccc').center(p.x, p.y)).addClass("svg_draw_point"); - } - } - -diff --git a/cvat/apps/engine/static/engine/js/3rdparty/svg.resize.min.js b/cvat/apps/engine/static/engine/js/3rdparty/svg.resize.min.js -index 2dca34b..50ef3d3 100644 ---- a/cvat/apps/engine/static/engine/js/3rdparty/svg.resize.min.js -+++ b/cvat/apps/engine/static/engine/js/3rdparty/svg.resize.min.js -@@ -1 +1 @@ --/*! svg.resize.js v1.4.3 MIT*/;!function(){"use strict";(function(){function t(t){t.remember("_resizeHandler",this),this.el=t,this.parameters={},this.lastUpdateCall=null,this.p=t.doc().node.createSVGPoint()}t.prototype.transformPoint=function(t,e,i){return this.p.x=t-(this.offset.x-window.pageXOffset),this.p.y=e-(this.offset.y-window.pageYOffset),this.p.matrixTransform(i||this.m)},t.prototype._extractPosition=function(t){return{x:null!=t.clientX?t.clientX:t.touches[0].clientX,y:null!=t.clientY?t.clientY:t.touches[0].clientY}},t.prototype.init=function(t){var e=this;if(this.stop(),"stop"!==t){this.options={};for(var i in this.el.resize.defaults)this.options[i]=this.el.resize.defaults[i],void 0!==t[i]&&(this.options[i]=t[i]);this.el.on("lt.resize",function(t){e.resize(t||window.event)}),this.el.on("rt.resize",function(t){e.resize(t||window.event)}),this.el.on("rb.resize",function(t){e.resize(t||window.event)}),this.el.on("lb.resize",function(t){e.resize(t||window.event)}),this.el.on("t.resize",function(t){e.resize(t||window.event)}),this.el.on("r.resize",function(t){e.resize(t||window.event)}),this.el.on("b.resize",function(t){e.resize(t||window.event)}),this.el.on("l.resize",function(t){e.resize(t||window.event)}),this.el.on("rot.resize",function(t){e.resize(t||window.event)}),this.el.on("point.resize",function(t){e.resize(t||window.event)}),this.update()}},t.prototype.stop=function(){return this.el.off("lt.resize"),this.el.off("rt.resize"),this.el.off("rb.resize"),this.el.off("lb.resize"),this.el.off("t.resize"),this.el.off("r.resize"),this.el.off("b.resize"),this.el.off("l.resize"),this.el.off("rot.resize"),this.el.off("point.resize"),this},t.prototype.resize=function(t){var e=this;this.m=this.el.node.getScreenCTM().inverse(),this.offset={x:window.pageXOffset,y:window.pageYOffset};var i=this._extractPosition(t.detail.event);if(this.parameters={type:this.el.type,p:this.transformPoint(i.x,i.y),x:t.detail.x,y:t.detail.y,box:this.el.bbox(),rotation:this.el.transform().rotation},"text"===this.el.type&&(this.parameters.fontSize=this.el.attr()["font-size"]),void 0!==t.detail.i){var s=this.el.array().valueOf();this.parameters.i=t.detail.i,this.parameters.pointCoords=[s[t.detail.i][0],s[t.detail.i][1]]}switch(t.type){case"lt":this.calc=function(t,e){var i=this.snapToGrid(t,e);if(this.parameters.box.width-i[0]>0&&this.parameters.box.height-i[1]>0){if("text"===this.parameters.type)return this.el.move(this.parameters.box.x+i[0],this.parameters.box.y),void this.el.attr("font-size",this.parameters.fontSize-i[0]);i=this.checkAspectRatio(i),this.el.move(this.parameters.box.x+i[0],this.parameters.box.y+i[1]).size(this.parameters.box.width-i[0],this.parameters.box.height-i[1])}};break;case"rt":this.calc=function(t,e){var i=this.snapToGrid(t,e,2);if(this.parameters.box.width+i[0]>0&&this.parameters.box.height-i[1]>0){if("text"===this.parameters.type)return this.el.move(this.parameters.box.x-i[0],this.parameters.box.y),void this.el.attr("font-size",this.parameters.fontSize+i[0]);i=this.checkAspectRatio(i,!0),this.el.move(this.parameters.box.x,this.parameters.box.y+i[1]).size(this.parameters.box.width+i[0],this.parameters.box.height-i[1])}};break;case"rb":this.calc=function(t,e){var i=this.snapToGrid(t,e,0);if(this.parameters.box.width+i[0]>0&&this.parameters.box.height+i[1]>0){if("text"===this.parameters.type)return this.el.move(this.parameters.box.x-i[0],this.parameters.box.y),void this.el.attr("font-size",this.parameters.fontSize+i[0]);i=this.checkAspectRatio(i),this.el.move(this.parameters.box.x,this.parameters.box.y).size(this.parameters.box.width+i[0],this.parameters.box.height+i[1])}};break;case"lb":this.calc=function(t,e){var i=this.snapToGrid(t,e,1);if(this.parameters.box.width-i[0]>0&&this.parameters.box.height+i[1]>0){if("text"===this.parameters.type)return this.el.move(this.parameters.box.x+i[0],this.parameters.box.y),void this.el.attr("font-size",this.parameters.fontSize-i[0]);i=this.checkAspectRatio(i,!0),this.el.move(this.parameters.box.x+i[0],this.parameters.box.y).size(this.parameters.box.width-i[0],this.parameters.box.height+i[1])}};break;case"t":this.calc=function(t,e){var i=this.snapToGrid(t,e,2);if(this.parameters.box.height-i[1]>0){if("text"===this.parameters.type)return;this.el.move(this.parameters.box.x,this.parameters.box.y+i[1]).height(this.parameters.box.height-i[1])}};break;case"r":this.calc=function(t,e){var i=this.snapToGrid(t,e,0);if(this.parameters.box.width+i[0]>0){if("text"===this.parameters.type)return;this.el.move(this.parameters.box.x,this.parameters.box.y).width(this.parameters.box.width+i[0])}};break;case"b":this.calc=function(t,e){var i=this.snapToGrid(t,e,0);if(this.parameters.box.height+i[1]>0){if("text"===this.parameters.type)return;this.el.move(this.parameters.box.x,this.parameters.box.y).height(this.parameters.box.height+i[1])}};break;case"l":this.calc=function(t,e){var i=this.snapToGrid(t,e,1);if(this.parameters.box.width-i[0]>0){if("text"===this.parameters.type)return;this.el.move(this.parameters.box.x+i[0],this.parameters.box.y).width(this.parameters.box.width-i[0])}};break;case"rot":this.calc=function(t,e){var i={x:t+this.parameters.p.x,y:e+this.parameters.p.y},s=Math.atan2(this.parameters.p.y-this.parameters.box.y-this.parameters.box.height/2,this.parameters.p.x-this.parameters.box.x-this.parameters.box.width/2),r=Math.atan2(i.y-this.parameters.box.y-this.parameters.box.height/2,i.x-this.parameters.box.x-this.parameters.box.width/2),a=this.parameters.rotation+180*(r-s)/Math.PI+this.options.snapToAngle/2;this.el.center(this.parameters.box.cx,this.parameters.box.cy).rotate(a-a%this.options.snapToAngle,this.parameters.box.cx,this.parameters.box.cy)};break;case"point":this.calc=function(t,e){var i=this.snapToGrid(t,e,this.parameters.pointCoords[0],this.parameters.pointCoords[1]),s=this.el.array().valueOf();s[this.parameters.i][0]=this.parameters.pointCoords[0]+i[0],s[this.parameters.i][1]=this.parameters.pointCoords[1]+i[1],this.el.plot(s)}}this.el.fire("resizestart",{dx:this.parameters.x,dy:this.parameters.y,event:t}),SVG.on(window,"touchmove.resize",function(t){e.update(t||window.event)}),SVG.on(window,"touchend.resize",function(){e.done()}),SVG.on(window,"mousemove.resize",function(t){e.update(t||window.event)}),SVG.on(window,"mouseup.resize",function(){e.done()})},t.prototype.update=function(t){if(!t)return void(this.lastUpdateCall&&this.calc(this.lastUpdateCall[0],this.lastUpdateCall[1]));var e=this._extractPosition(t),i=this.transformPoint(e.x,e.y),s=i.x-this.parameters.p.x,r=i.y-this.parameters.p.y;this.lastUpdateCall=[s,r],this.calc(s,r),this.el.fire("resizing",{dx:s,dy:r,event:t})},t.prototype.done=function(){this.lastUpdateCall=null,SVG.off(window,"mousemove.resize"),SVG.off(window,"mouseup.resize"),SVG.off(window,"touchmove.resize"),SVG.off(window,"touchend.resize"),this.el.fire("resizedone")},t.prototype.snapToGrid=function(t,e,i,s){var r;return void 0!==s?r=[(i+t)%this.options.snapToGrid,(s+e)%this.options.snapToGrid]:(i=null==i?3:i,r=[(this.parameters.box.x+t+(1&i?0:this.parameters.box.width))%this.options.snapToGrid,(this.parameters.box.y+e+(2&i?0:this.parameters.box.height))%this.options.snapToGrid]),t<0&&(r[0]-=this.options.snapToGrid),e<0&&(r[1]-=this.options.snapToGrid),t-=Math.abs(r[0])o.maxX&&(t=o.maxX-r),void 0!==o.minY&&a+eo.maxY&&(e=o.maxY-a),[t,e]},t.prototype.checkAspectRatio=function(t,e){if(!this.options.saveAspectRatio)return t;var i=t.slice(),s=this.parameters.box.width/this.parameters.box.height,r=this.parameters.box.width+t[0],a=this.parameters.box.height-t[1],o=r/a;return os&&(i[0]=this.parameters.box.width-a*s,e&&(i[0]=-i[0])),i},SVG.extend(SVG.Element,{resize:function(e){return(this.remember("_resizeHandler")||new t(this)).init(e||{}),this}}),SVG.Element.prototype.resize.defaults={snapToAngle:.1,snapToGrid:1,constraint:{},saveAspectRatio:!1}}).call(this)}(); -+/*! svg.resize.js v1.4.3 MIT*/;!function(){"use strict";(function(){function t(t){t.remember("_resizeHandler",this),this.el=t,this.parameters={},this.lastUpdateCall=null,this.p=t.doc().node.createSVGPoint()}t.prototype.transformPoint=function(t,e,i){return this.p.x=t-(this.offset.x-window.pageXOffset),this.p.y=e-(this.offset.y-window.pageYOffset),this.p.matrixTransform(i||this.m)},t.prototype._extractPosition=function(t){return{x:null!=t.clientX?t.clientX:t.touches[0].clientX,y:null!=t.clientY?t.clientY:t.touches[0].clientY}},t.prototype.init=function(t){var e=this;if(this.stop(),"stop"!==t){this.options={};for(var i in this.el.resize.defaults)this.options[i]=this.el.resize.defaults[i],void 0!==t[i]&&(this.options[i]=t[i]);this.el.on("lt.resize",function(t){e.resize(t||window.event)}),this.el.on("rt.resize",function(t){e.resize(t||window.event)}),this.el.on("rb.resize",function(t){e.resize(t||window.event)}),this.el.on("lb.resize",function(t){e.resize(t||window.event)}),this.el.on("t.resize",function(t){e.resize(t||window.event)}),this.el.on("r.resize",function(t){e.resize(t||window.event)}),this.el.on("b.resize",function(t){e.resize(t||window.event)}),this.el.on("l.resize",function(t){e.resize(t||window.event)}),this.el.on("rot.resize",function(t){e.resize(t||window.event)}),this.el.on("point.resize",function(t){e.resize(t||window.event)}),this.update()}},t.prototype.stop=function(){return this.el.off("lt.resize"),this.el.off("rt.resize"),this.el.off("rb.resize"),this.el.off("lb.resize"),this.el.off("t.resize"),this.el.off("r.resize"),this.el.off("b.resize"),this.el.off("l.resize"),this.el.off("rot.resize"),this.el.off("point.resize"),this},t.prototype.resize=function(t){if(!t.detail.event.button){var e=this;this.m=this.el.node.getScreenCTM().inverse(),this.offset={x:window.pageXOffset,y:window.pageYOffset};var i=this._extractPosition(t.detail.event);if(this.parameters={type:this.el.type,p:this.transformPoint(i.x,i.y),x:t.detail.x,y:t.detail.y,box:this.el.bbox(),rotation:this.el.transform().rotation},"text"===this.el.type&&(this.parameters.fontSize=this.el.attr()["font-size"]),void 0!==t.detail.i){var s=this.el.array().valueOf();this.parameters.i=t.detail.i,this.parameters.pointCoords=[s[t.detail.i][0],s[t.detail.i][1]]}switch(t.type){case"lt":this.calc=function(t,e){var i=this.snapToGrid(t,e);if(this.parameters.box.width-i[0]>0&&this.parameters.box.height-i[1]>0){if("text"===this.parameters.type)return this.el.move(this.parameters.box.x+i[0],this.parameters.box.y),void this.el.attr("font-size",this.parameters.fontSize-i[0]);i=this.checkAspectRatio(i),this.el.move(this.parameters.box.x+i[0],this.parameters.box.y+i[1]).size(this.parameters.box.width-i[0],this.parameters.box.height-i[1])}};break;case"rt":this.calc=function(t,e){var i=this.snapToGrid(t,e,2);if(this.parameters.box.width+i[0]>0&&this.parameters.box.height-i[1]>0){if("text"===this.parameters.type)return this.el.move(this.parameters.box.x-i[0],this.parameters.box.y),void this.el.attr("font-size",this.parameters.fontSize+i[0]);i=this.checkAspectRatio(i,!0),this.el.move(this.parameters.box.x,this.parameters.box.y+i[1]).size(this.parameters.box.width+i[0],this.parameters.box.height-i[1])}};break;case"rb":this.calc=function(t,e){var i=this.snapToGrid(t,e,0);if(this.parameters.box.width+i[0]>0&&this.parameters.box.height+i[1]>0){if("text"===this.parameters.type)return this.el.move(this.parameters.box.x-i[0],this.parameters.box.y),void this.el.attr("font-size",this.parameters.fontSize+i[0]);i=this.checkAspectRatio(i),this.el.move(this.parameters.box.x,this.parameters.box.y).size(this.parameters.box.width+i[0],this.parameters.box.height+i[1])}};break;case"lb":this.calc=function(t,e){var i=this.snapToGrid(t,e,1);if(this.parameters.box.width-i[0]>0&&this.parameters.box.height+i[1]>0){if("text"===this.parameters.type)return this.el.move(this.parameters.box.x+i[0],this.parameters.box.y),void this.el.attr("font-size",this.parameters.fontSize-i[0]);i=this.checkAspectRatio(i,!0),this.el.move(this.parameters.box.x+i[0],this.parameters.box.y).size(this.parameters.box.width-i[0],this.parameters.box.height+i[1])}};break;case"t":this.calc=function(t,e){var i=this.snapToGrid(t,e,2);if(this.parameters.box.height-i[1]>0){if("text"===this.parameters.type)return;this.el.move(this.parameters.box.x,this.parameters.box.y+i[1]).height(this.parameters.box.height-i[1])}};break;case"r":this.calc=function(t,e){var i=this.snapToGrid(t,e,0);if(this.parameters.box.width+i[0]>0){if("text"===this.parameters.type)return;this.el.move(this.parameters.box.x,this.parameters.box.y).width(this.parameters.box.width+i[0])}};break;case"b":this.calc=function(t,e){var i=this.snapToGrid(t,e,0);if(this.parameters.box.height+i[1]>0){if("text"===this.parameters.type)return;this.el.move(this.parameters.box.x,this.parameters.box.y).height(this.parameters.box.height+i[1])}};break;case"l":this.calc=function(t,e){var i=this.snapToGrid(t,e,1);if(this.parameters.box.width-i[0]>0){if("text"===this.parameters.type)return;this.el.move(this.parameters.box.x+i[0],this.parameters.box.y).width(this.parameters.box.width-i[0])}};break;case"rot":this.calc=function(t,e){var i={x:t+this.parameters.p.x,y:e+this.parameters.p.y},s=Math.atan2(this.parameters.p.y-this.parameters.box.y-this.parameters.box.height/2,this.parameters.p.x-this.parameters.box.x-this.parameters.box.width/2),r=Math.atan2(i.y-this.parameters.box.y-this.parameters.box.height/2,i.x-this.parameters.box.x-this.parameters.box.width/2),a=this.parameters.rotation+180*(r-s)/Math.PI+this.options.snapToAngle/2;this.el.center(this.parameters.box.cx,this.parameters.box.cy).rotate(a-a%this.options.snapToAngle,this.parameters.box.cx,this.parameters.box.cy)};break;case"point":this.calc=function(t,e){var i=this.snapToGrid(t,e,this.parameters.pointCoords[0],this.parameters.pointCoords[1]),s=this.el.array().valueOf();s[this.parameters.i][0]=this.parameters.pointCoords[0]+i[0],s[this.parameters.i][1]=this.parameters.pointCoords[1]+i[1],this.el.plot(s)}}this.el.fire("resizestart",{dx:this.parameters.x,dy:this.parameters.y,event:t}),SVG.on(window,"touchmove.resize",function(t){e.update(t||window.event)}),SVG.on(window,"touchend.resize",function(){e.done()}),SVG.on(window,"mousemove.resize",function(t){e.update(t||window.event)}),SVG.on(window,"mouseup.resize",function(){e.done()})}},t.prototype.update=function(t){if(!t)return void(this.lastUpdateCall&&this.calc(this.lastUpdateCall[0],this.lastUpdateCall[1]));this.m=this.el.node.getScreenCTM().inverse();var e=this._extractPosition(t),i=this.transformPoint(e.x,e.y),s=i.x-this.parameters.p.x,r=i.y-this.parameters.p.y;this.lastUpdateCall=[s,r],this.calc(s,r),this.el.fire("resizing",{dx:s,dy:r,event:t})},t.prototype.done=function(){this.lastUpdateCall=null,SVG.off(window,"mousemove.resize"),SVG.off(window,"mouseup.resize"),SVG.off(window,"touchmove.resize"),SVG.off(window,"touchend.resize"),this.el.fire("resizedone")},t.prototype.snapToGrid=function(t,e,i,s){var r;return void 0!==s?r=[(i+t)%this.options.snapToGrid,(s+e)%this.options.snapToGrid]:(i=null==i?3:i,r=[(this.parameters.box.x+t+(1&i?0:this.parameters.box.width))%this.options.snapToGrid,(this.parameters.box.y+e+(2&i?0:this.parameters.box.height))%this.options.snapToGrid]),t<0&&(r[0]-=this.options.snapToGrid),e<0&&(r[1]-=this.options.snapToGrid),t-=Math.abs(r[0])o.maxX&&(t=o.maxX-r),void 0!==o.minY&&a+eo.maxY&&(e=o.maxY-a),[t,e]},t.prototype.checkAspectRatio=function(t,e){if(!this.options.saveAspectRatio)return t;var i=t.slice(),s=this.parameters.box.width/this.parameters.box.height,r=this.parameters.box.width+t[0],a=this.parameters.box.height-t[1],o=r/a;return os&&(i[0]=this.parameters.box.width-a*s,e&&(i[0]=-i[0])),i},SVG.extend(SVG.Element,{resize:function(e){return(this.remember("_resizeHandler")||new t(this)).init(e||{}),this}}),SVG.Element.prototype.resize.defaults={snapToAngle:.1,snapToGrid:1,constraint:{},saveAspectRatio:!1}}).call(this)}(); -\ No newline at end of file -diff --git a/cvat/apps/engine/static/engine/js/3rdparty/svg.select.js b/cvat/apps/engine/static/engine/js/3rdparty/svg.select.js -index 47e07bd..cee6d34 100644 ---- a/cvat/apps/engine/static/engine/js/3rdparty/svg.select.js -+++ b/cvat/apps/engine/static/engine/js/3rdparty/svg.select.js -@@ -160,6 +160,7 @@ SelectHandler.prototype.drawPoints = function () { - ev.preventDefault ? ev.preventDefault() : ev.returnValue = false; - ev.stopPropagation(); - -+ if (ev.which != 1) return false; - var x = ev.pageX || ev.touches[0].pageX; - var y = ev.pageY || ev.touches[0].pageY; - _this.el.fire('point', {x: x, y: y, i: k, event: ev}); -@@ -361,6 +362,7 @@ SelectHandler.prototype.cleanup = function () { - // stop watching the element, remove the selection - this.rectSelection.set.each(function () { - this.remove(); -+ SVG.off(this.node); - }); - - this.rectSelection.set.clear(); -@@ -371,6 +373,7 @@ SelectHandler.prototype.cleanup = function () { - // Remove all points, clear the set, stop watching the element - this.pointSelection.set.each(function () { - this.remove(); -+ SVG.off(this.node); - }); - - this.pointSelection.set.clear(); -@@ -379,8 +382,8 @@ SelectHandler.prototype.cleanup = function () { - - if (!this.pointSelection.isSelected && !this.rectSelection.isSelected) { - this.nested.remove(); -+ SVG.off(this.nested.node); - delete this.nested; -- - } - }; - --- -2.19.1 - diff --git a/cvat/apps/engine/static/engine/js/3rdparty/Decoder.worker.js b/cvat/apps/engine/static/engine/js/3rdparty/Decoder.worker.js deleted file mode 100644 index 23f3206ac717..000000000000 --- a/cvat/apps/engine/static/engine/js/3rdparty/Decoder.worker.js +++ /dev/null @@ -1,2 +0,0 @@ -!function(e){var n={};function t(r){if(n[r])return n[r].exports;var a=n[r]={i:r,l:!1,exports:{}};return e[r].call(a.exports,a,a.exports,t),a.l=!0,a.exports}t.m=e,t.c=n,t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{enumerable:!0,get:r})},t.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.t=function(e,n){if(1&n&&(e=t(e)),8&n)return e;if(4&n&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(t.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&n&&"string"!=typeof e)for(var a in e)t.d(r,a,function(n){return e[n]}.bind(null,a));return r},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},t.p="",t(t.s=0)}([function(e,n,t){var r,a,i;a=[],void 0===(i="function"==typeof(r=function(){var e;!function(){(e=this)||("undefined"!=typeof window?e=window:"undefined"!=typeof self&&(e=self))}();var n=function(n,t){var r,a=void 0!==a?a:{},i={};for(r in a)a.hasOwnProperty(r)&&(i[r]=a[r]);var o,f=[],u=!1,s=!0,c="";(u||s)&&(s?c=self.location.href:document.currentScript&&(c=document.currentScript.src),c=0!==c.indexOf("blob:")?c.substr(0,c.lastIndexOf("/")+1):"",s&&(o=function(e){var n=new XMLHttpRequest;return n.open("GET",e,!1),n.responseType="arraybuffer",n.send(null),new Uint8Array(n.response)}));var d=a.print||console.log.bind(console),l=a.printErr||console.warn.bind(console);for(r in i)i.hasOwnProperty(r)&&(a[r]=i[r]);i=null,a.arguments&&(f=a.arguments),a.thisProgram&&a.thisProgram,a.quit&&a.quit;var p,y,h={"f64-rem":function(e,n){return e%n},debugger:function(){}};new Array(0),a.wasmBinary&&(p=a.wasmBinary),a.noExitRuntime&&a.noExitRuntime,"object"!=typeof WebAssembly&&l("no native wasm support detected");var v,m,g,b,w=new WebAssembly.Table({initial:10,maximum:10,element:"anyfunc"}),A=!1,M="undefined"!=typeof TextDecoder?new TextDecoder("utf8"):void 0;function P(e,n,t){for(var r=n+t,a=n;e[a]&&!(a>=r);)++a;if(a-n>16&&e.subarray&&M)return M.decode(e.subarray(n,a));for(var i="";n>10,56320|1023&s)}}else i+=String.fromCharCode((31&o)<<6|f)}else i+=String.fromCharCode(o)}return i}"undefined"!=typeof TextDecoder&&new TextDecoder("utf-16le");var D,S=a.TOTAL_MEMORY||104857600;function _(e){for(;e.length>0;){var n=e.shift();if("function"!=typeof n){var t=n.func;"number"==typeof t?void 0===n.arg?a.dynCall_v(t):a.dynCall_vi(t,n.arg):t(void 0===n.arg?null:n.arg)}else n()}}(y=a.wasmMemory?a.wasmMemory:new WebAssembly.Memory({initial:S/65536,maximum:S/65536}))&&(v=y.buffer),S=v.byteLength,v=D=v,a.HEAP8=m=new Int8Array(D),a.HEAP16=new Int16Array(D),a.HEAP32=b=new Int32Array(D),a.HEAPU8=g=new Uint8Array(D),a.HEAPU16=new Uint16Array(D),a.HEAPU32=new Uint32Array(D),a.HEAPF32=new Float32Array(D),a.HEAPF64=new Float64Array(D),b[2748]=5254064;var R=[],U=[],E=[],I=[],O=0,x=null,B=null;function C(e){throw a.onAbort&&a.onAbort(e),d(e+=""),l(e),A=!0,e="abort("+e+"). Build with -s ASSERTIONS=1 for more info.",new WebAssembly.RuntimeError(e)}a.preloadedImages={},a.preloadedAudios={};var H="data:application/octet-stream;base64,";function T(e){return String.prototype.startsWith?e.startsWith(H):0===e.indexOf(H)}var W,j="avc.wasm";function F(){try{if(p)return new Uint8Array(p);if(o)return o(j);throw"both async and sync fetching of the wasm failed"}catch(e){C(e)}}T(j)||(W=j,j=a.locateFile?a.locateFile(W,c):c+W),a.asm=function(){var e={env:V,wasi_unstable:V,global:{NaN:NaN,Infinity:1/0},"global.Math":Math,asm2wasm:h};function n(e,n){var t=e.exports;a.asm=t,function(e){if(O--,a.monitorRunDependencies&&a.monitorRunDependencies(O),0==O&&(null!==x&&(clearInterval(x),x=null),B)){var n=B;B=null,n()}}()}function t(e){n(e.instance)}function r(n){return(p||!u&&!s||"function"!=typeof fetch?new Promise((function(e,n){e(F())})):fetch(j,{credentials:"same-origin"}).then((function(e){if(!e.ok)throw"failed to load wasm binary file at '"+j+"'";return e.arrayBuffer()})).catch((function(){return F()}))).then((function(n){return WebAssembly.instantiate(n,e)})).then(n,(function(e){l("failed to asynchronously prepare wasm: "+e),C(e)}))}if(O++,a.monitorRunDependencies&&a.monitorRunDependencies(O),a.instantiateWasm)try{return a.instantiateWasm(e,n)}catch(e){return l("Module.instantiateWasm callback failed with error: "+e),!1}return function(){if(p||"function"!=typeof WebAssembly.instantiateStreaming||T(j)||"function"!=typeof fetch)return r(t);fetch(j,{credentials:"same-origin"}).then((function(n){return WebAssembly.instantiateStreaming(n,e).then(t,(function(e){l("wasm streaming compile failed: "+e),l("falling back to ArrayBuffer instantiation"),r(t)}))}))}(),{}};var N={buffers:[null,[],[]],printChar:function(e,n){var t=N.buffers[e];0===n||10===n?((1===e?d:l)(P(t,0)),t.length=0):t.push(n)},varargs:0,get:function(e){return N.varargs+=4,b[N.varargs-4>>2]},getStr:function(){var e,n;return(e=N.get())?P(g,e,n):""},get64:function(){var e=N.get();return N.get(),e},getZero:function(){N.get()}};function k(e,n,t,r){try{for(var a=0,i=0;i>2],f=b[n+(8*i+4)>>2],u=0;u>2]=a,0}catch(e){return"undefined"!=typeof FS&&e instanceof FS.ErrnoError||C(e),e.errno}}function z(){n()}function L(e,n,r){t(e,n,r)}a._broadwayOnHeadersDecoded=z,a._broadwayOnPictureDecoded=L;var q,G,V={g:function(){return k.apply(null,arguments)},__memory_base:1024,__table_base:0,f:z,e:L,b:function(){return m.length},d:function(e,n,t){g.set(g.subarray(n,n+t),e)},a:function(e){C("OOM")},c:C,memory:y,table:w},X=a.asm({},V,v);function Y(e){function n(){q||(q=!0,A||(_(U),_(E),a.onRuntimeInitialized&&a.onRuntimeInitialized(),function(){if(a.postRun)for("function"==typeof a.postRun&&(a.postRun=[a.postRun]);a.postRun.length;)e=a.postRun.shift(),I.unshift(e);var e;_(I)}()))}e=e||f,O>0||(function(){if(a.preRun)for("function"==typeof a.preRun&&(a.preRun=[a.preRun]);a.preRun.length;)e=a.preRun.shift(),R.unshift(e);var e;_(R)}(),O>0||(a.setStatus?(a.setStatus("Running..."),setTimeout((function(){setTimeout((function(){a.setStatus("")}),1),n()}),1)):n()))}if(a.asm=X,a._broadwayCreateStream=function(){return a.asm.h.apply(null,arguments)},a._broadwayExit=function(){return a.asm.i.apply(null,arguments)},a._broadwayGetMajorVersion=function(){return a.asm.j.apply(null,arguments)},a._broadwayGetMinorVersion=function(){return a.asm.k.apply(null,arguments)},a._broadwayInit=function(){return a.asm.l.apply(null,arguments)},a._broadwayPlayStream=function(){return a.asm.m.apply(null,arguments)},a.asm=X,B=function e(){q||Y(),q||(B=e)},a.run=Y,a.preInit)for("function"==typeof a.preInit&&(a.preInit=[a.preInit]);a.preInit.length>0;)a.preInit.pop()();Y(),void 0!==e&&e.Module&&(G=e.Module),void 0!==a&&(G=a),G._broadwayOnHeadersDecoded=n,G._broadwayOnPictureDecoded=t;var Z,J=!1;return G.onRuntimeInitialized=function(){J=!0,Z&&Z(G)},function(e){J?e(G):Z=e}};return function(){"use strict";var t=function(){return(new Date).getTime()};"undefined"!=typeof performance&&performance.now&&(t=function(){return performance.now()});var r=function(e){var r;this.options=e||{},this.now=t;var a,o,f=function(e,n,o){var f,u=this.pictureBuffers[e];u||(u=this.pictureBuffers[e]=a(e,n*o*3/2));var s=!1;if(this.infoAr.length&&(s=!0,f=this.infoAr),this.infoAr=[],this.options.rgb){r||(r=i(n,o)),r.inp.set(u),r.doit();var c=new Uint8Array(r.outSize);return c.set(r.out),s&&(f[0].finishDecoding=t()),void this.onPictureDecoded(c,n,o,f)}s&&(f[0].finishDecoding=t()),this.onPictureDecoded(u,n,o,f)}.bind(this);this.options.sliceMode&&(f=function(e,n,r,i){var f=this.pictureBuffers[e];f||(f=this.pictureBuffers[e]=a(e,n*r*3/2));var u,s=this.pictureBuffers[i];s||(s=this.pictureBuffers[i]=o(i,18)),this.infoAr.length&&(u=this.infoAr),this.infoAr=[],u[0].finishDecoding=t();for(var c=[],d=0;d<20;++d)c.push(s[d]);u[0].sliceInfoAr=c,this.onPictureDecoded(f,n,r,u)}.bind(this));var u=n.apply({},[function(){},f]),s=this;this.onPictureDecoded=function(e,n,t,r){},this.onDecoderReady=function(){};var c=[];this.decode=function(e,n,t){c.push([e,n,t])},u((function(e){e.HEAP8;var n=e.HEAPU8;e.HEAP16,e.HEAP32,e._broadwayInit(),a=function(e,t){return n.subarray(e,e+t)},o=function(e,t){return new Uint32Array(n.buffer,e,t)},s.streamBuffer=a(e._broadwayCreateStream(1048576),1048576),s.pictureBuffers={},s.infoAr=[];var r=0;if(s.options.sliceMode?(r=s.options.sliceNum,s.decode=function(n,a,i){s.infoAr.push(a),a.startDecoding=t();var o,f=a.nals;if(!f){f=[],a.nals=f;var u=n.length,c=!1,d=0,l=0;for(o=0;o>2,f=i+o+o,u=n*t*4,s=f+u+4*Math.pow(2,24),c=Math.pow(2,24),d=c;d>2;m=r(r(l,p)|0,4)|0;v=(y+h|0)+h|0;b=0;g=b+m|0;A=g+v|0;a=~~+o(+2,+24);a=r(a,4)|0;for(t=0|0;(t|0)<(a|0)|0;t=t+4|0){d[(A+t|0)>>2]=0}}function P(){var e=0;var n=0;var t=0;var r=0;var a=0;var i=0;var o=0;var f=0;var u=0;var c=0;var v=0;var m=0;var M=0;var P=0;M=b|0;e=g|0;n=e+y|0|0;t=n+h|0;for(u=0;(u|0)<(p|0);u=u+2|0){v=n;m=t;for(c=0;(c|0)<(l|0);c=c+2|0){r=s[e>>0]|0;a=s[(e+l|0)>>0]|0;i=s[n>>0]|0;o=s[t>>0]|0;P=((r<<16|0)+(i<<8|0)|0)+o|0;f=d[(A>>2)+P|0]|0;if(f){}else{f=D(r,i,o)|0;d[(A>>2)+P|0]=f|0}d[M>>2]=f;P=((a<<16|0)+(i<<8|0)|0)+o|0;f=d[(A>>2)+P|0]|0;if(f){}else{f=D(a,i,o)|0;d[(A>>2)+P|0]=f|0}d[(M+w|0)>>2]=f;M=M+4|0;e=e+1|0;r=s[e>>0]|0;a=s[(e+l|0)>>0]|0;P=((r<<16|0)+(i<<8|0)|0)+o|0;f=d[(A>>2)+P|0]|0;if(f){}else{f=D(r,i,o)|0;d[(A>>2)+P|0]=f|0}d[M>>2]=f;P=((a<<16|0)+(i<<8|0)|0)+o|0;f=d[(A>>2)+P|0]|0;if(f){}else{f=D(a,i,o)|0;d[(A>>2)+P|0]=f|0}d[(M+w|0)>>2]=f;M=M+4|0;e=e+1|0;n=n+1|0;t=t+1|0}M=M+w|0;e=e+l|0}}function D(e,n,t){e=e|0;n=n|0;t=t|0;var o=0;var f=0;var u=0;var s=0;var c=0;var d=0;var l=0;var p=0;var y=0;c=r(1192,e-16|0)|0;d=r(1634,t-128|0)|0;l=r(832,t-128|0)|0;p=r(400,n-128|0)|0;y=r(2066,n-128|0)|0;o=(c+d|0)>>10|0;f=((c-l|0)-p|0)>>10|0;u=(c+y|0)>>10|0;if((o&255|0)!=(o|0)|0){o=a(255,i(0,o|0)|0)|0}if((f&255|0)!=(f|0)|0){f=a(255,i(0,f|0)|0)|0}if((u&255|0)!=(u|0)|0){u=a(255,i(0,u|0)|0)|0}s=255;s=s<<8|0;s=s+u|0;s=s<<8|0;s=s+f|0;s=s<<8|0;s=s+o|0;return s|0}return{init:M,doit:P}}(e,{},l);return p.init(n,t),a[r]=p,p.heap=l,p.out=new Uint8Array(l,0,u),p.inp=new Uint8Array(l,u,f),p.outSize=u,p};if("undefined"!=typeof self){var o,f,u,s,c,d,l=!1,p=!1,y=!1,h=0,v=0,m=0,g=0,b=[],w=[],A=function(e){if(w.length){for(var n=w.shift();n&&n.byteLength!==e;)n=w.shift();if(n)return n}return new ArrayBuffer(e)},M=function(e,n,t,r,a){var i=function(t,a){var i=0;for(i=0;i<16;++i){var o=t+r*i,f=a+r*i;n.set(e.subarray(o,f),o)}},o=function(t,a){var i=0;for(i=0;i<8;++i){var o=t+r/2*i,f=a+r/2*i;n.set(e.subarray(o,f),o)}},f=function(t,r){n.set(e.subarray(t,r),t)},u=t[0],s=t[1];s>0&&(i(u,s),o(t[2],t[3]),o(t[4],t[5])),u=t[6],(s=t[7])>0&&(i(u,s),o(t[8],t[9]),o(t[10],t[11])),u=t[12],(s=t[15])>0&&(f(u,s),f(t[13],t[16]),f(t[14],t[17]))},P=function(e){m=(v=e)-1};self.addEventListener("message",(function(e){if(l){if(p&&e.data.reuse&&w.push(e.data.reuse),e.data.buf)return void(y&&0!==g?b.push(e.data):o.decode(new Uint8Array(e.data.buf,e.data.offset||0,e.data.length),e.data.info,(function(){y&&h!==m&&postMessage(e.data,[e.data.buf])})));if(e.data.slice){var n=t();if(M(new Uint8Array(e.data.slice),u,e.data.infos[0].sliceInfoAr,e.data.width,e.data.height),e.data.theOne&&(M(u,new Uint8Array(e.data.slice),f,e.data.width,e.data.height),d>e.data.infos[0].timeDecoding&&(e.data.infos[0].timeDecoding=d),e.data.infos[0].timeCopy+=t()-n),postMessage(e.data,[e.data.slice]),0==(g-=1)&&b.length){var a=b.shift();o.decode(new Uint8Array(a.buf,a.offset||0,a.length),a.info,(function(){y&&h!==m&&postMessage(a,[a.buf])}))}return}if(e.data.setSliceCnt)return void P(e.data.sliceCnt)}else e.data&&"Broadway.js - Worker init"===e.data.type&&(l=!0,o=new r(e.data.options),e.data.options.sliceMode?(p=!0,y=!0,h=e.data.options.sliceNum,P(e.data.options.sliceCnt),o.onPictureDecoded=function(e,n,t,r){var a=new Uint8Array(A(e.length));M(e,a,r[0].sliceInfoAr,n),s=r[0].startDecoding,c=r[0].finishDecoding,d=c-s,r[0].timeDecoding=d,r[0].timeCopy=0,postMessage({slice:a.buffer,sliceNum:h,width:n,height:t,infos:r},[a.buffer]),g=v-1,u=e,f=r[0].sliceInfoAr}):e.data.options.reuseMemory?(p=!0,o.onPictureDecoded=function(e,n,t,r){var a=new Uint8Array(A(e.length));a.set(e,0,e.length),postMessage({buf:a.buffer,length:e.length,width:n,height:t,infos:r},[a.buffer])}):o.onPictureDecoded=function(e,n,t,r){e&&(e=new Uint8Array(e));var a=new Uint8Array(e.length);a.set(e,0,e.length),postMessage({buf:a.buffer,length:e.length,width:n,height:t,infos:r},[a.buffer])},postMessage({consoleLog:"broadway worker initialized"}))}),!1)}return r.nowValue=t,r}()})?r.apply(n,a):r)||(e.exports=i)}]); -//# sourceMappingURL=Decoder.worker.js.map \ No newline at end of file diff --git a/cvat/apps/engine/static/engine/js/3rdparty/avc.wasm b/cvat/apps/engine/static/engine/js/3rdparty/avc.wasm deleted file mode 100644 index 559b2b3157a0fccbcf3128e8a5d4e371654d2d3e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 126815 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 - * License GNU AGPLv3 - */if(function(window,module){"use strict";var defiant={is_ie:/(msie|trident)/i.test(navigator.userAgent),is_safari:/safari/i.test(navigator.userAgent),env:"production",xml_decl:'',namespace:'xmlns:d="defiant-namespace"',tabsize:4,snapshots:{},node:{},renderXml:function(e,t){var n=new window.XSLTProcessor,r=document.createElement("span"),a='//xsl:template[@name="'+e+'"]',s=this.node.selectSingleNode(this.xsl_template,a);return(s=this.node.selectSingleNode(this.xsl_template,a)).setAttribute("match","/"),n.importStylesheet(this.xsl_template),r.appendChild(n.transformToFragment(t,document)),s.removeAttribute("match"),r.innerHTML},render:function(e,t){var n,r,a,s,o=new window.XSLTProcessor,i=document.createElement("span"),l={match:"/"};switch(typeof e){case"object":this.extend(l,e),l.data||(l.data=t);break;case"string":l.template=e,l.data=t;break;default:throw"error"}if(l.data=l.data.nodeType?l.data:defiant.json.toXML(l.data),n='//xsl:template[@name="'+l.template+'"]',this.xsl_template||this.gatherTemplates(),l.sorter&&(s=this.node.selectSingleNode(this.xsl_template,n+"//xsl:for-each//xsl:sort"))&&(l.sorter.order&&s.setAttribute("order",l.sorter.order),l.sorter.select&&s.setAttribute("select",l.sorter.select),s.setAttribute("data-type",l.sorter.type||"text")),(a=this.node.selectSingleNode(this.xsl_template,n)).setAttribute("match",l.match),o.importStylesheet(this.xsl_template),i.appendChild(o.transformToFragment(l.data,document)),a.removeAttribute("match"),this.is_safari)for(var c=0,d=(r=i.getElementsByTagName("script")).length;c"+t.replace(/defiant:(\w+)/g,"$1")+"")},registerTemplate:function(e){this.xsl_template=this.xmlFromString('"+e.replace(/defiant:(\w+)/g,"$1")+"")},getSnapshot:function(e,t){return this.json.toXML(e,t||!0)},createSnapshot:function(e,t){var n=this,r="snapshot_"+Date.now();this.json.toXML(e,function(e){n.snapshots[r]=e,t(r)})},getFacets:function(e,t){var n,r,a,s,o,i,l=e.constructor===String&&"snapshot_"===e.slice(0,9)?this.snapshots[e].doc:defiant.json.toXML(e),c=l.cloneNode(!0),d={},u={},p=0,h=function(e){var t=e.childNodes.length;switch(e.nodeType){case 1:t>=p&&(p=t,r=e);case 9:e.childNodes.map(function(e){return h(e)})}};for(i in h(l),r.childNodes.map(function(e){u[e.nodeName]||(u[e.nodeName]=1),u[e.nodeName]++}),p=0,u)p<=u[i]&&(p=u[i],o=i);return this.createFacetTemplate(t),s=defiant.node.selectSingleNode(c,'//*[@d:mi="'+r.getAttribute("d:mi")+'"]'),defiant.node.selectNodes(c,'//*[@d:mi="'+r.getAttribute("d:mi")+'"]/'+o).map(function(e){return e.parentNode.removeChild(e)}),a=defiant.node.selectNodes(l,'//*[@d:mi="'+r.getAttribute("d:mi")+'"]/'+o),n=a.length-1,a.map(function(e,t){if(s.appendChild(e.cloneNode(!0)),t%50==49||t===n){var a=defiant.render("facets",c).replace(/\n|\t/g,"").replace(/"": 0,?/g,"").replace(/,\}/g,"}"),i=JSON.parse(a);d=defiant.concatFacet(i,d),defiant.node.selectNodes(c,'//*[@d:mi="'+r.getAttribute("d:mi")+'"]/'+o).map(function(e){return e.parentNode.removeChild(e)})}}),d},createFacetTemplate:function(e){var t,n,r=[],a=[];for(n in e)r.push(''),a.push('"'+n+'": {"": '+',}'.replace(/\n|\t/g,""));t=r.join("")+'{'+a.join(",")+"}",this.registerTemplate(t)},xmlFromString:function(e){var t;return null===(e=e.replace(/>\s{1,}<")).trim().match(/<\?xml/)&&(e=this.xml_decl+e),"ActiveXObject"in window?((t=new ActiveXObject("Msxml2.DOMDocument")).loadXML(e),t.setProperty("SelectionNamespaces",this.namespace),-1===e.indexOf("xsl:stylesheet")&&t.setProperty("SelectionLanguage","XPath")):t=(new DOMParser).parseFromString(e,"text/xml"),t},concatFacet:function(e,t){for(var n in t)e[n]&&"object"==typeof t[n]?this.concatFacet(e[n],t[n]):e[n]=(e[n]||0)+t[n];return e},extend:function(e,t){for(var n in t)e[n]&&"object"==typeof t[n]?this.extend(e[n],t[n]):e[n]=t[n];return e},node:{selectNodes:function(e,t){if(e.evaluate){for(var n=e.createNSResolver(e.documentElement),r=e.evaluate(t,e,n,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null),a=[],s=0,o=r.snapshotLength;s0?n[0]:null}return e.selectSingleNode(t)},prettyPrint:function(e){var t,n=defiant,r=n.tabsize,a=n.xml_decl.toLowerCase();t=n.is_ie?e.xml:(new XMLSerializer).serializeToString(e),"development"!==n.env&&(t=t.replace(/ \w+\:d=".*?"| d\:\w+=".*?"/g,""));for(var s,o,i=t.trim().replace(/(>)\s*(<)(\/*)/g,"$1\n$2$3").split("\n"),l=-1,c=0,d=i.length;c/g),o=null!==i[c].match(/<\/[\w\:]+>/g),null!==i[c].match(/<.*?\/>/g)&&(s=o=!0),s&&l++,i[c]=String().fill(l,"\t")+i[c],s&&o&&l--,!s&&o&&l--);return i.join("\n").replace(/\t/g,String().fill(r," "))},toJSON:function(e,t){var n=function(e){var t,r,a,s,o,i,l,c,d,u,p={},h=window;switch(e.nodeType){case 1:for("Array"===(o=e.getAttribute("d:constr"))?p=[]:"String"===o&&""===e.textContent&&(p=""),c=0,d=(t=e.attributes).length;c/,rx_constructor:/<(.+?)( d:contr=".*?")>/,rx_namespace:/ xmlns\:d="defiant\-namespace"/,rx_data:/(<.+?>)(.*?)(<\/d:data>)/i,rx_function:/function (\w+)/i,namespace:'xmlns:d="defiant-namespace"',to_xml_str:function(e){return{str:this.hash_to_xml(null,e),map:this.map}},hash_to_xml:function(e,t,n){var r,a,s,o,i,l,c,d,u,p=t.constructor===Array,h=this,m=[],f=[],g=function(t,r){if(null!==(a=r[t])&&void 0!==a&&"NaN"!==a.toString()||(a=null),o="@"===t.slice(0,1),(i=n?e:t)==+i&&r.constructor!==Object&&(i="d:item"),null===a?(l=null,c=!1):(l=a.constructor,c=l.toString().match(h.rx_function)[1]),o)f.push(i.slice(1)+'="'+h.escape_xml(a)+'"'),"String"!==c&&f.push("d:"+i.slice(1)+'="'+c+'"');else if(null===a)m.push(h.scalar_to_xml(i,a));else switch(l){case Function:throw"JSON data should not contain functions. Please check your structure.";case Object:m.push(h.hash_to_xml(i,a));break;case Array:if(t===i){if(s=a.constructor===Array)for(d=a.length;d--;)null!==a[d]&&a[d]&&a[d].constructor!==Array||(s=!0),s||a[d].constructor!==Object||(s=!0);m.push(h.scalar_to_xml(i,a,s));break}case String:if("string"==typeof a&&(a=a.toString().replace(/\&/g,"&").replace(/\r|\n/g," ")),"#text"===i){h.map.push(r),f.push('d:mi="'+h.map.length+'"'),f.push('d:constr="'+c+'"'),m.push(h.escape_xml(a));break}case Number:case Boolean:if("#text"===i&&"String"!==c){h.map.push(r),f.push('d:mi="'+h.map.length+'"'),f.push('d:constr="'+c+'"'),m.push(h.escape_xml(a));break}m.push(h.scalar_to_xml(i,a))}};if(t.constructor===Array)for(d=0,u=t.length;d"+m.join("")+"":"/>"))},scalar_to_xml:function(e,t,n){var r,a,s,o="";if(null===e.match(this.rx_validate_name)&&(o+=' d:name="'+e+'"',e="d:name",n=!1),null!==t&&"NaN"!==t.toString()||(t=null),null===t)return"<"+e+' d:constr="null"/>';if(1===t.length&&t.constructor===Array&&!t[0])return"<"+e+' d:constr="null" d:type="ArrayItem"/>';if(1===t.length&&t[0].constructor===Object){var i=(r=this.hash_to_xml(!1,t[0])).match(this.rx_node),l=r.match(this.rx_constructor);return"<"+e+(i=null!==i?i[2].replace(this.rx_namespace,"").replace(/>/,"").replace(/"\/$/,'"'):"")+" "+(l=null!==l?l[2]:"")+' d:type="ArrayItem">'+(r=null!==(r=r.match(this.rx_data))?r[2]:"")+""}return 0===t.length&&t.constructor===Array?"<"+e+' d:constr="Array"/>':n?this.hash_to_xml(e,t,!0):(s=(a=t.constructor).toString().match(this.rx_function)[1],r=a===Array?this.hash_to_xml("d:item",t,!0):this.escape_xml(t),o+=' d:constr="'+s+'"',this.map.push(t),o+=' d:mi="'+this.map.length+'"',"#text"===e?this.escape_xml(t):"<"+e+o+">"+r+"")},escape_xml:function(e){return String(e).replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/ /g," ")}},toXML:function(e,t){var n,r,a=defiant.json.interpreter;switch(typeof t){case"function":return void defiant.compiled.to_xml_str(e,function(n){t({doc:defiant.xmlFromString(n.str),src:e,map:n.map})});case"boolean":return n=a.to_xml_str.call(a,e),{doc:defiant.xmlFromString(n.str),src:e,map:n.map};default:return n=a.to_xml_str.call(a,e),r=defiant.xmlFromString(n.str),this.search.map=n.map,r}},search:function(e,t,n){e.constructor===String&&"snapshot_"===e.slice(0,9)&&defiant.snapshots[e]&&(e=defiant.snapshots[e]);var r,a,s=defiant.json,o=e.doc&&e.doc.nodeType,i=o?e.doc:s.toXML(e),l=o?e.map:s.search.map,c=o?e.src:e,d=defiant.node[n?"selectSingleNode":"selectNodes"](i,t.xTransform()),u=[];for(n&&(d=[d]),a=d.length;a--;)switch(d[a].nodeType){case 2:case 3:u.unshift(d[a].nodeValue);break;default:r=+d[a].getAttribute("d:mi"),u.unshift(l[r-1])}return"development"===defiant.env&&(u.trace=s.matchTrace(c,u,d)),u},matchTrace:function(e,t,n){var r=[],a=0,s=window,o=defiant.node.toJSON,i=function(e){return JSON.stringify(e,null,"\t").replace(/\t/g,"")},l=i(e);return n.map(function(e,c){var d,u,p,h,m,f,g,x=0;switch(e.nodeType){case 2:d=n[c].ownerElement?n[c].ownerElement.getAttribute("d:"+n[c].nodeName):"String",h=s[d](t[c]),m='"@'+n[c].nodeName+'": '+h,f=l.indexOf(m,a);break;case 3:d=n[c].parentNode.getAttribute("d:constr"),h=s[d](t[c]),m='"'+n[c].parentNode.nodeName+'": '+("Number"===m?h:'"'+h+'"'),f=l.indexOf(m,a);break;default:d=e.getAttribute("d:constr"),["String","Number"].indexOf(d)>-1?(u=o(n[c].parentNode),p=i(u),h=s[d](t[c]),m='"'+n[c].nodeName+'": '+("Number"===d?h:'"'+h+'"'),f=l.indexOf(p,a)+p.indexOf(m)):(m=i(t[c]),f=l.indexOf(m),x=m.split("\n").length-1)}a=f+1,g=l.slice(0,f).split("\n").length,r.push([g,x])}),r}}},x10={id:1,work_handler:function(e){var t=Array.prototype.slice.call(e.data,2),n=e.data[0],r=e.data[1],a=tree[n].apply(tree,t);a.map=JSON.parse(JSON.stringify(a.map)),postMessage([r,n,a])},setup:function(e){var t=window.URL||window.webkitURL,n="var tree = {"+this.parse(e).join(",")+"};",r=new Blob([n+'self.addEventListener("message", '+this.work_handler.toString()+", false);"],{type:"text/javascript"}),a=new Worker(t.createObjectURL(r));return a.onmessage=function(e){var t=Array.prototype.slice.call(e.data,2),n=e.data[0],r=e.data[1];x10.observer.emit("x10:"+r+n,t),x10.observer.off("x10:"+r+n)},a},call_handler:function(e,t){return function(){var n=Array.prototype.slice.call(arguments,0,-1),r=arguments[arguments.length-1],a=x10.id++;n.unshift(a),n.unshift(e),x10.observer.on("x10:"+e+a,function(e){r(e.detail[0])}),t.postMessage(n)}},compile:function(e){var t,n=this.setup("function"==typeof e?{func:e}:e),r={};if("function"==typeof e)return r.func=this.call_handler("func",n),r.func;for(t in e)r[t]=this.call_handler(t,n);return r},parse:function(e,t){var n,r,a,s=[];for(n in e)if(null!==(a=e[n]))if(void 0!==a){switch(a.constructor){case Date:r="new Date("+a.valueOf()+")";break;case Object:r="{"+this.parse(a).join(",")+"}";break;case Array:r="["+this.parse(a,!0).join(",")+"]";break;case String:r='"'+a.replace(/"/g,'\\"')+'"';break;case RegExp:case Function:r=a.toString();break;default:r=a}t?s.push(r):s.push(n+":"+r)}else s.push(n+":undefined");else s.push(n+":null");return s},observer:(stack={},{on:function(e,t){stack[e]||(stack[e]=[]),stack[e].unshift(t)},off:function(e,t){if(stack[e]){var n=stack[e].indexOf(t);stack[e].splice(n,1)}},emit:function(e,t){if(stack[e])for(var n={type:e,detail:t,isCanceled:!1,cancelBubble:function(){this.isCanceled=!0}},r=stack[e].length;r--;){if(n.isCanceled)return;stack[e][r](n)}}})},stack;String.prototype.fill||(String.prototype.fill=function(e,t){var n=this;for(t=t||" ";n.length 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( " - - - - - - - - - - {% for js_file in js_3rdparty %} - - {% endfor %} -{% endblock %} - - -{% block head_js_cvat %} - {{ block.super }} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -{% endblock %} - - -{% block content %} -
-
-
-
- - - - - - - - - - - - - - - -
    -
  • Copy Object URL
  • -
  • Change Color
  • -
  • Remove Shape
  • -
  • Switch Occluded
  • -
  • Switch Lock
  • -
  • Split
  • -
  • Enable Dragging
  • -
  • Reset Perspective
  • -
  • Switch Perspective Orientation
  • - -
- -
    -
  • Copy Job URL
  • -
  • Copy Frame URL
  • -
- -
    -
  • Remove
  • -
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - -
- - -
-
- - - - - - - -
-
-
-
-
-
-
-
-
-
-
-
- - -
-
- - -
-
- - -
-
- -
-
-
-
- - - - - - -
- - -
- - -
-
-
- -
- - - - - - -
- - -
-
- -
-{% endblock %} diff --git a/cvat/apps/engine/templates/engine/base.html b/cvat/apps/engine/templates/engine/base.html deleted file mode 100644 index 56415d880194..000000000000 --- a/cvat/apps/engine/templates/engine/base.html +++ /dev/null @@ -1,90 +0,0 @@ - - -{% load static compress %} - - - - - - {% block head_title %} - Computer Vision Annotation Tool (CVAT) - {% endblock %} - - - {% compress css %} - {% block head_css %} - - {% endblock %} - {% endcompress %} - - {% compress js file platformchecker %} - - - {% endcompress %} - - {% compress js file thirdparty %} - {% block head_js_3rdparty %} - - - - {% endblock %} - {% endcompress %} - - {% compress js file cvat %} - {% block head_js_cvat %} - - - {% endblock %} - {% endcompress %} - - - {% block header %} - {% endblock %} - - {% block content %} - {% endblock %} - - {% block footer %} - {% endblock %} - - - LOADING - - - - - - - - - - diff --git a/cvat/apps/engine/urls.py b/cvat/apps/engine/urls.py index bb5477530089..5fbf8e76e024 100644 --- a/cvat/apps/engine/urls.py +++ b/cvat/apps/engine/urls.py @@ -46,6 +46,6 @@ schema_view.with_ui('redoc', cache_timeout=0)), name='schema-redoc'), # entry point for API - path('api/v1/auth/', include('cvat.apps.authentication.api_urls')), + path('api/v1/auth/', include('cvat.apps.authentication.urls')), path('api/v1/', include((router.urls, 'cvat'), namespace='v1')) ] diff --git a/cvat/apps/engine/views.py b/cvat/apps/engine/views.py index c9d6e5d05eeb..9ec3d576f895 100644 --- a/cvat/apps/engine/views.py +++ b/cvat/apps/engine/views.py @@ -77,13 +77,6 @@ def dispatch_request(request): permanent=True, query_string=True )(request) - elif request.method == 'GET' and 'id' in request.GET and request.path == '/': - return render(request, 'engine/annotation.html', { - 'css_3rdparty': CSS_3RDPARTY.get('engine', []), - 'js_3rdparty': JS_3RDPARTY.get('engine', []), - 'status_list': [str(i) for i in StatusChoice], - 'ui_url': settings.UI_URL - }) else: return HttpResponseNotFound() diff --git a/cvat/apps/git/admin.py b/cvat/apps/git/admin.py deleted file mode 100644 index b66dde17a5cf..000000000000 --- a/cvat/apps/git/admin.py +++ /dev/null @@ -1,3 +0,0 @@ -# Copyright (C) 2018 Intel Corporation -# -# SPDX-License-Identifier: MIT diff --git a/cvat/apps/log_viewer/migrations/__init__.py b/cvat/apps/log_viewer/migrations/__init__.py deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/cvat/apps/restrictions/migrations/__init__.py b/cvat/apps/restrictions/migrations/__init__.py deleted file mode 100644 index f19d9bef37a6..000000000000 --- a/cvat/apps/restrictions/migrations/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -# Copyright (C) 2020 Intel Corporation -# -# SPDX-License-Identifier: MIT From fdc7e0f70ebb139978acf3b665d58c820337e84f Mon Sep 17 00:00:00 2001 From: Nikita Manovich Date: Thu, 30 Jul 2020 11:47:30 +0300 Subject: [PATCH 2/7] Revert changes in .gitignore --- .gitignore | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitignore b/.gitignore index db888c9f4db3..cbe91f69a9c3 100644 --- a/.gitignore +++ b/.gitignore @@ -13,7 +13,6 @@ node_modules /Mask_RCNN/ /letsencrypt-webroot/ -.vscode/settings.json # Ignore temporary files docker-compose.override.yml From 428023c2e902bff88b4a3650c0e1c71148eb5d0e Mon Sep 17 00:00:00 2001 From: Nikita Manovich Date: Thu, 30 Jul 2020 11:55:18 +0300 Subject: [PATCH 3/7] Fix docker build --- Dockerfile | 3 --- 1 file changed, 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index c70baef85344..02535a02d4b6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -106,9 +106,6 @@ COPY datumaro/ ${HOME}/datumaro RUN python3 -m pip install --no-cache-dir -r ${HOME}/datumaro/requirements.txt -# Binary option is necessary to correctly apply the patch on Windows platform. -# https://unix.stackexchange.com/questions/239364/how-to-fix-hunk-1-failed-at-1-different-line-endings-message -RUN patch --binary -p1 < ${HOME}/cvat/apps/engine/static/engine/js/3rdparty.patch RUN chown -R ${USER}:${USER} . # RUN all commands below as 'django' user From 1c722d2bc1367d1a21757dfcd3c584ec8175145d Mon Sep 17 00:00:00 2001 From: Nikita Manovich Date: Fri, 31 Jul 2020 18:16:38 +0300 Subject: [PATCH 4/7] Remove karma + some dummy code --- Dockerfile.ci | 9 --- cvat/apps/engine/views.py | 1 - cvat/settings/base.py | 4 -- tests/eslintrc.conf.js | 131 -------------------------------------- tests/karma.conf.js | 68 -------------------- tests/run_js_linter.sh | 15 ----- 6 files changed, 228 deletions(-) delete mode 100644 tests/eslintrc.conf.js delete mode 100644 tests/karma.conf.js delete mode 100644 tests/run_js_linter.sh diff --git a/Dockerfile.ci b/Dockerfile.ci index d3d068741d76..7628335a9ea5 100644 --- a/Dockerfile.ci +++ b/Dockerfile.ci @@ -28,15 +28,6 @@ COPY .coveragerc . USER ${USER} RUN mkdir -p tests && cd tests && npm install \ - eslint \ - eslint-detailed-reporter \ - karma \ - karma-chrome-launcher \ - karma-coveralls \ - karma-coverage \ - karma-junit-reporter \ - karma-qunit \ - qunit; \ CI=true npm install cypress; \ echo "export PATH=~/tests/node_modules/.bin:${PATH}" >> ~/.bashrc; diff --git a/cvat/apps/engine/views.py b/cvat/apps/engine/views.py index 9ec3d576f895..b40842eea945 100644 --- a/cvat/apps/engine/views.py +++ b/cvat/apps/engine/views.py @@ -44,7 +44,6 @@ FileInfoSerializer, JobSerializer, LabeledDataSerializer, LogEventSerializer, ProjectSerializer, RqStatusSerializer, TaskSerializer, UserSerializer) -from cvat.settings.base import CSS_3RDPARTY, JS_3RDPARTY from cvat.apps.engine.utils import av_scan_paths from . import models, task diff --git a/cvat/settings/base.py b/cvat/settings/base.py index 15fe3264637a..59e1a12109c5 100644 --- a/cvat/settings/base.py +++ b/cvat/settings/base.py @@ -82,10 +82,6 @@ def generate_ssh_keys(): except Exception: pass -# Application definition -JS_3RDPARTY = {} -CSS_3RDPARTY = {} - INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', diff --git a/tests/eslintrc.conf.js b/tests/eslintrc.conf.js deleted file mode 100644 index cd04f937236a..000000000000 --- a/tests/eslintrc.conf.js +++ /dev/null @@ -1,131 +0,0 @@ -/* - * Copyright (C) 2018 Intel Corporation - * - * SPDX-License-Identifier: MIT - */ - -module.exports = { - 'env': { - 'browser': true, - 'es6': true, - 'jquery': true, - 'qunit': true, - }, - "extends": "eslint:recommended", - 'rules': { - 'indent': [ - 'warn', - 4 - ], - 'linebreak-style': [ - 'error', - 'unix' - ], - 'semi': [ - 'warn' - ], - 'no-extra-semi': [ - 'warn' - ], - 'no-console': [ - 'warn' - ], - }, - 'globals': { - // from attributeAnnotationMode.js - 'AAMController': true, - 'AAMModel': true, - 'AAMView': true, - 'AAMUndefinedKeyword': true, - // from annotationParser.js - 'AnnotationParser': true, - // from annotationUI.js - 'callAnnotationUI': true, - 'blurAllElements': true, - 'drawBoxSize': true, - 'copyToClipboard': true, - // from base.js - 'showMessage': true, - 'showOverlay': true, - 'confirm': true, - 'dumpAnnotationRequest': true, - 'createExportContainer': true, - 'ExportType': true, - 'getExportTargetContainer': true, - // from idGenerator.js - 'IncrementIdGenerator': true, - 'ConstIdGenerator': true, - // from shapeCollection.js - 'ShapeCollectionModel': true, - 'ShapeCollectionController': true, - 'ShapeCollectionView': true, - // from shapeCreator.js - 'ShapeCreatorModel': true, - 'ShapeCreatorController': true, - 'ShapeCreatorView': true, - // from shapeGrouper.js - 'ShapeGrouperModel': true, - 'ShapeGrouperController': true, - 'ShapeGrouperView': true, - // from labelsInfo.js - 'LabelsInfo': true, - // from listener.js - 'Listener': true, - // from logger.js - 'Logger': true, - // from shapeMerger.js - 'ShapeMergerModel': true, - 'ShapeMergerController': true, - 'ShapeMergerView': true, - // from shapes.js - 'PolyShapeModel': true, - 'PolyShapeView': true, - 'buildShapeModel': true, - 'buildShapeController': true, - 'buildShapeView': true, - 'STROKE_WIDTH': true, - 'POINT_RADIUS': true, - 'AREA_TRESHOLD': true, - 'SELECT_POINT_STROKE_WIDTH': true, - // from mousetrap.js - 'Mousetrap': true, - // from platform.js - 'platform': true, - // from player.js - 'PlayerController': true, - 'PlayerModel': true, - 'PlayerView': true, - // from server.js - 'serverRequest': true, - 'saveJobRequest': true, - // from shapeBuffer.js - 'ShapeBufferController': true, - 'ShapeBufferModel': true, - 'ShapeBufferView': true, - // from trackFilter.js - 'FilterModel': true, - 'FilterController': true, - 'FilterView': true, - // from shapeSplitter.js - 'ShapeSplitter': true, - // from userConfig.js - 'Config': true, - // from cookies.js - 'Cookies': true, - // from dashboard django template - 'maxUploadCount': true, - 'maxUploadSize': true, - // from SVG.js - 'SVG': true, - // from history.js - 'HistoryModel': true, - 'HistoryController': true, - 'HistoryView': true, - // from polyshapeEditor.js - 'PolyshapeEditorModel': true, - 'PolyshapeEditorController': true, - 'PolyshapeEditorView': true, - // from coordinateTranslator - 'CoordinateTranslator': true, - }, -}; diff --git a/tests/karma.conf.js b/tests/karma.conf.js deleted file mode 100644 index 8e28f6566b0d..000000000000 --- a/tests/karma.conf.js +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (C) 2018 Intel Corporation - * - * SPDX-License-Identifier: MIT - */ - -const path = require('path'); -module.exports = function(config) { - config.set({ - basePath: path.join(process.env.HOME, 'cvat/apps/'), - frameworks: ['qunit'], - files: [ - 'engine/static/engine/js/labelsInfo.js', - 'engine/static/engine/js/annotationParser.js', - 'engine/static/engine/js/listener.js', - 'engine/static/engine/js/player.js', - 'engine/static/engine/js/shapes.js', - 'engine/static/engine/js/qunitTests.js', - ], - port: 9876, - colors: true, - autoWatch: false, - browsers: ['ChromeNoSandbox'], - - // Continuous Integration mode - // if true, Karma captures browsers, runs the tests and exits - singleRun: true, - - // Concurrency level - // how many browser should be started simultanous - concurrency: Infinity, - - preprocessors: { - '**/!(qunitTests).js': ['coverage'] - }, - - reporters: ['progress', 'junit', 'coverage', 'coveralls'], - - coverageReporter: { - dir: path.join(process.env.HOME, 'media/coverage'), - reporters: [ - { type: 'html', subdir: '.' }, { type: 'lcov', subdir: '.' } - ], - instrumenterOptions: { - istanbul: { noCompact: true } - } - }, - - junitReporter: { - outputDir: path.join(process.env.HOME, 'media/junit'), - outputFile: undefined, - useBrowserName: true, - nameFormatter: undefined, - classNameFormatter: undefined, - properties: {}, - xmlVersion: null - }, - - customLaunchers: { - ChromeNoSandbox: { - base: 'ChromeHeadless', - flags: ['--no-sandbox'] - } - }, - - logLevel: config.LOG_DEBUG - }); -} diff --git a/tests/run_js_linter.sh b/tests/run_js_linter.sh deleted file mode 100644 index a0685185b473..000000000000 --- a/tests/run_js_linter.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/bash -# -# Copyright (C) 2018 Intel Corporation -# -# SPDX-License-Identifier: MIT -# - -eslint -c ~/tests/eslintrc.conf.js -f ~/tests/node_modules/eslint-detailed-reporter/lib/detailed-multi.js \ - ~/cvat/apps/**/static/**/js/*.js -o ./report.html -ret_code=$? - -mkdir -p ~/media/eslint -mv -t ~/media/eslint main.js styles.css report.html - -exit $ret_code From b9438f2fc10fb66d6ccf84a5c1a8d43206b8f58f Mon Sep 17 00:00:00 2001 From: Nikita Manovich Date: Sat, 1 Aug 2020 07:34:06 +0300 Subject: [PATCH 5/7] Fix a type in Dockerfile.ci --- Dockerfile.ci | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Dockerfile.ci b/Dockerfile.ci index 7628335a9ea5..3c4807b45d76 100644 --- a/Dockerfile.ci +++ b/Dockerfile.ci @@ -27,8 +27,7 @@ COPY .coveragerc . # RUN all commands below as 'django' user USER ${USER} -RUN mkdir -p tests && cd tests && npm install \ - CI=true npm install cypress; \ +RUN mkdir -p tests && cd tests && CI=true npm install cypress; \ echo "export PATH=~/tests/node_modules/.bin:${PATH}" >> ~/.bashrc; ENTRYPOINT [] From ba5a14a01e2adaff1da619e179c58d57146d9ba5 Mon Sep 17 00:00:00 2001 From: Nikita Manovich Date: Sat, 1 Aug 2020 11:21:36 +0300 Subject: [PATCH 6/7] Fix swagger and remove dispatch_request. --- cvat/apps/engine/urls.py | 29 ++++++++++++++++++++++++----- cvat/apps/engine/views.py | 35 +---------------------------------- cvat/settings/base.py | 2 +- 3 files changed, 26 insertions(+), 40 deletions(-) diff --git a/cvat/apps/engine/urls.py b/cvat/apps/engine/urls.py index 5fbf8e76e024..699ea1db5548 100644 --- a/cvat/apps/engine/urls.py +++ b/cvat/apps/engine/urls.py @@ -9,7 +9,10 @@ from rest_framework import permissions from drf_yasg.views import get_schema_view from drf_yasg import openapi +from django.views.generic import RedirectView +from django.conf import settings from cvat.apps.restrictions.views import RestrictionsViewSet +from cvat.apps.authentication.decorators import login_required schema_view = get_schema_view( openapi.Info( @@ -24,6 +27,22 @@ permission_classes=(permissions.IsAuthenticated,), ) +# drf-yasg component doesn't handle correctly URL_FORMAT_OVERRIDE and +# send requests with ?format=openapi suffix instead of ?scheme=openapi. +# We map the required paramater explicitly and add it into query arguments +# on the server side. +def wrap_swagger(view): + @login_required + def _map_format_to_schema(request, scheme=None): + if 'format' in request.GET: + request.GET = request.GET.copy() + format_alias = settings.REST_FRAMEWORK['URL_FORMAT_OVERRIDE'] + request.GET[format_alias] = request.GET['format'] + + return view(request, format=scheme) + + return _map_format_to_schema + router = routers.DefaultRouter(trailing_slash=False) router.register('projects', views.ProjectViewSet) router.register('tasks', views.TaskViewSet) @@ -34,15 +53,15 @@ urlpatterns = [ # Entry point for a client - path('', views.dispatch_request), - path('dashboard/', views.dispatch_request), + path('', RedirectView.as_view(url=settings.UI_URL, permanent=True, + query_string=True)), # documentation for API - path('api/swagger', views.wrap_swagger( + path('api/swagger', wrap_swagger( schema_view.without_ui(cache_timeout=0)), name='schema-json'), - path('api/swagger/', views.wrap_swagger( + path('api/swagger/', wrap_swagger( schema_view.with_ui('swagger', cache_timeout=0)), name='schema-swagger-ui'), - path('api/docs/', views.wrap_swagger( + path('api/docs/', wrap_swagger( schema_view.with_ui('redoc', cache_timeout=0)), name='schema-redoc'), # entry point for API diff --git a/cvat/apps/engine/views.py b/cvat/apps/engine/views.py index b40842eea945..2ee873d28b81 100644 --- a/cvat/apps/engine/views.py +++ b/cvat/apps/engine/views.py @@ -13,11 +13,9 @@ from django.conf import settings from django.contrib.auth.models import User from django.db import IntegrityError -from django.http import HttpResponse, HttpResponseNotFound -from django.shortcuts import render +from django.http import HttpResponse from django.utils import timezone from django.utils.decorators import method_decorator -from django.views.generic import RedirectView from django_filters import rest_framework as filters from django_filters.rest_framework import DjangoFilterBackend from drf_yasg import openapi @@ -34,7 +32,6 @@ import cvat.apps.dataset_manager as dm import cvat.apps.dataset_manager.views # pylint: disable=unused-import from cvat.apps.authentication import auth -from cvat.apps.authentication.decorators import login_required from cvat.apps.dataset_manager.serializers import DatasetFormatsSerializer from cvat.apps.engine.frame_provider import FrameProvider from cvat.apps.engine.models import Job, StatusChoice, Task @@ -50,36 +47,6 @@ from .log import clogger, slogger -# drf-yasg component doesn't handle correctly URL_FORMAT_OVERRIDE and -# send requests with ?format=openapi suffix instead of ?scheme=openapi. -# We map the required paramater explicitly and add it into query arguments -# on the server side. -def wrap_swagger(view): - @login_required - def _map_format_to_schema(request, scheme=None): - if 'format' in request.GET: - request.GET = request.GET.copy() - format_alias = settings.REST_FRAMEWORK['URL_FORMAT_OVERRIDE'] - request.GET[format_alias] = request.GET['format'] - - return view(request, format=scheme) - - return _map_format_to_schema - -# Server REST API -@login_required -def dispatch_request(request): - """An entry point to dispatch legacy requests""" - if 'dashboard' in request.path or (request.path == '/' and 'id' not in request.GET): - return RedirectView.as_view( - url=settings.UI_URL, - permanent=True, - query_string=True - )(request) - else: - return HttpResponseNotFound() - - class ServerViewSet(viewsets.ViewSet): serializer_class = None diff --git a/cvat/settings/base.py b/cvat/settings/base.py index 59e1a12109c5..5b373c5838ec 100644 --- a/cvat/settings/base.py +++ b/cvat/settings/base.py @@ -205,7 +205,7 @@ def generate_ssh_keys(): # Django Auth DJANGO_AUTH_TYPE = 'BASIC' DJANGO_AUTH_DEFAULT_GROUPS = [] -LOGIN_URL = 'login' +LOGIN_URL = 'rest_login' LOGIN_REDIRECT_URL = '/' AUTH_LOGIN_NOTE = '

Have not registered yet? Register here.

' From b522dada68f12b357a790fb9db3aa44169be4d47 Mon Sep 17 00:00:00 2001 From: Nikita Manovich Date: Sat, 1 Aug 2020 11:25:15 +0300 Subject: [PATCH 7/7] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7c1fd2a7baec..d183477368e7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Removed - Removed OpenVINO and CUDA components because they are not necessary anymore () +- Removed the old UI code () ### Fixed - Some objects aren't shown on canvas sometimes. For example after propagation on of objects is invisible ()