PageSourceSearch

https://mnkl.co.kr/ind-script/optimizer_user.php?filename=jZBBDoJA…0b5dd8582645d3a0a4c5649&t=1771486427&user=T

js mnkl.co.kr collected 2026-10-09 00:41:27 UTC 702,244 bytes, 17,276 lines download raw bytes

1/**
2 * 움직이는 배너 Jquery Plug-in
3 * @author  cafe24
4 */
5
6(function($){
7
8    $.fn.floatBanner = function(options) {
9        options = $.extend({}, $.fn.floatBanner.defaults , options);
10
11        return this.each(function() {
12            var aPosition = $(this).position();
13            var jbOffset = $(this).offset();
14            var node = this;
15
16            $(window).on('scroll', function() {
17                var _top = $(document).scrollTop();
18                _top = (aPosition.top < _top) ? _top : aPosition.top;
19
20                setTimeout(function () {
21                    var newinit = $(document).scrollTop();
22
23                    if ( newinit > jbOffset.top ) {
24                        _top -= jbOffset.top;
25                        var container_height = $("#wrap").height();
26                        var quick_height = $(node).height();
27                        var cul = container_height - quick_height;
28                        if(_top > cul){
29                            _top = cul;
30                        }
31                    } else {
32                        _top = 0;
33                    }
34
35                    $(node).stop().animate({top: _top}, options.animate);
36                }, options.delay);
37            });
38        });
39    };
40
41    $.fn.floatBanner.defaults = {
42        'animate'  : 500,
43        'delay'    : 500
44    };
45
46})(jQuery);
47
48/**
49 * 문서 구동후 시작
50 */
51$(function(){
52    $('#banner:visible, #quick:visible').floatBanner();
53
54    //placeholder
55    $(".ePlaceholder input, .ePlaceholder textarea").each(function(i){
56        var placeholderName = $(this).parents().attr('title');
57        $(this).attr("placeholder", placeholderName);
58    });
59    /* placeholder ie8, ie9 */
60    $.fn.extend({
61        placeholder : function() {
62            //IE 8 버전에는 hasPlaceholderSupport() 값이 false를 리턴
63           if (hasPlaceholderSupport() === true) {
64                return this;
65            }
66            //hasPlaceholderSupport() 값이 false 일 경우 아래 코드를 실행
67            return this.each(function(){
68                var findThis = $(this);
69                var sPlaceholder = findThis.attr('placeholder');
70                if ( ! sPlaceholder) {
71                   return;
72                }
73                findThis.wrap('<label class="ePlaceholder" />');
74                var sDisplayPlaceHolder = $(this).val() ? ' style="display:none;"' : '';
75                findThis.before('<span' + sDisplayPlaceHolder + '>' + sPlaceholder + '</span>');
76                this.onpropertychange = function(e){
77                    e = event || e;
78                    if (e.propertyName == 'value') {
79                        $(this).trigger('focusout');
80                    }
81                };
82                //공통 class
83                var agent = navigator.userAgent.toLowerCase();
84                if (agent.indexOf("msie") != -1) {
85                    $(".ePlaceholder").css({"position":"relative"});
86                    $(".ePlaceholder span").css({"position":"absolute", "padding":"0 4px", "color":"#878787"});
87                    $(".ePlaceholder label").css({"padding":"0"});
88                }
89            });
90        }
91    });
92
93    $(':input[placeholder]').placeholder(); //placeholder() 함수를 호출
94
95    //클릭하면 placeholder 숨김
96    $('body').on('click', '.ePlaceholder span', function(){
97        $(this).hide();
98    });
99
100    //input창 포커스 인 일때 placeholder 숨김
101    $('body').on('focusin', '.ePlaceholder :input', function(){
102        $(this).prev('span').hide();
103    });
104
105    //input창 포커스 아웃 일때 value 가 true 이면 숨김, false 이면 보여짐
106    $('body').on('focusout', '.ePlaceholder :input', function(){
107        if (this.value) {
108            $(this).prev('span').hide();
109        } else {
110            $(this).prev('span').show();
111        }
112    });
113
114    //input에 placeholder가 지원이 되면 true를 안되면 false를 리턴값으로 던져줌
115    function hasPlaceholderSupport() {
116        if ('placeholder' in document.createElement('input')) {
117            return true;
118        } else {
119            return false;
120        }
121    }
122});
123
124/**
125 *  썸네일 이미지 엑박일경우 기본값 설정
126 */
127$(window).on('load', function() {
128    $("img.thumb,img.ThumbImage,img.BigImage").each(function($i,$item){
129        var $img = new Image();
130        $img.onerror = function () {
131            $item.src="//img.echosting.cafe24.com/thumb/img_product_big.gif";
132        }
133        $img.src = this.src;
134    });
135});
136
137/**
138 *  tooltip
139 */
140$('.eTooltip').each(function(i){
141    $(this).find('.btnClose').attr('tabIndex','-1');
142});
143//tooltip input focus
144$('.eTooltip').find('input').on('focus', function() {
145    var targetName = returnTagetName(this);
146    targetName.siblings('.ec-base-tooltip').show();
147});
148$('.eTooltip').find('input').on('focusout', function() {
149    var targetName = returnTagetName(this);
150    targetName.siblings('.ec-base-tooltip').hide();
151});
152function returnTagetName(_this){
153    var ePlacename = $(_this).parent().attr("class");
154    var targetName;
155    if(ePlacename == "ePlaceholder"){ //ePlaceholder 대응
156        targetName = $(_this).parents();
157    }else{
158        targetName = $(_this);
159    }
160    return targetName;
161}
162
163/**
164 *  eTab
165 */
166$("body").on("click", ".eTab a", function(e){
167    // 클릭한 li 에 selected 클래스 추가, 기존 li에 있는 selected 클래스는 삭제.
168    var _li = $(this).parent("li").addClass("selected").siblings().removeClass("selected"),
169    _target = $(this).attr("href"),
170    _siblings = $(_target).attr("class"),
171    _arr = _siblings.split(" "),
172    _classSiblings = "."+_arr[0];
173
174    //클릭한 탭에 해당하는 요소는 활성화, 기존 요소는 비활성화 함.
175    $(_target).show().siblings(_classSiblings).hide();
176
177
178    //preventDefault 는 a 태그 처럼 클릭 이벤트 외에 별도의 브라우저 행동을 막기 위해 사용됨.
179    e.preventDefault();
180});
181
182
183
184//window popup script
185function winPop(url) {
186    window.open(url, "popup", "width=300,height=300,left=10,top=10,resizable=no,scrollbars=no");
187}
188
189//const newDomain = "https://m.mnkl.co.kr";
190// 현재 URL의 경로와 쿼리 문자열 추출
191//const path = window.location.pathname;
192//const queryString = window.location.search;
193// 최종 URL 생성 및 리디렉션
194//const newUrl = newDomain + path + queryString;
195//window.location.href = newUrl;
196
197var currentHost = window.location.host;
198var newDomain = "https://m.mnkl.co.kr";
199
200if (currentHost === "mnkl.co.kr" || currentHost === "www.mnkl.co.kr" || currentHost === "officialmnkl.cafe24.com") {
201  var path = window.location.pathname;
202  var queryString = window.location.search;
203  var newUrl = newDomain + path + queryString;
204  window.location.href = newUrl;
205}
206
207/**
208 * document.location.href split
209 * return array Param
210 */
211function getQueryString(sKey)
212{
213    var sQueryString = document.location.search.substring(1);
214    var aParam       = {};
215
216    if (sQueryString) {
217        var aFields = sQueryString.split("&");
218        var aField  = [];
219        for (var i=0; i<aFields.length; i++) {
220            aField = aFields[i].split('=');
221            aParam[aField[0]] = aField[1];
222        }
223    }
224
225    aParam.page = aParam.page ? aParam.page : 1;
226    return sKey ? aParam[sKey] : aParam;
227};
228
229$(function(){
230    // tab
231    $.eTab = function(ul){
232        $(ul).find('a').on('click', function(){
233            var _li = $(this).parent('li').addClass('selected').siblings().removeClass('selected'),
234                _target = $(this).attr('href'),
235                _siblings = '.' + $(_target).attr('class');
236            $(_target).show().siblings(_siblings).hide();
237            return false
238        });
239    }
240    if ( window.call_eTab ) {
241        call_eTab();
242    };
243});
244(function($){
245    $.fn.extend({
246        center: function() {
247            this.each(function() {
248                var
249                    $this = $(this),
250                    $w = $(window);
251                $this.css({
252                    position: "absolute",
253                    top: ~~(($w.height() - $this.outerHeight()) / 2) + $w.scrollTop() + "px",
254                    left: ~~(($w.width() - $this.outerWidth()) / 2) + $w.scrollLeft() + "px"
255                });
256            });
257            return this;
258        }
259    });
260    $(function() {
261        var $container = function(){/*
262    <div id="modalContainer">
263        <iframe id="modalContent" scroll="0" scrolling="no" frameBorder="0"></iframe>
264    </div>');
265    */}.toString().slice(14,-3);
266        $('body')
267        .append($('<div id="modalBackpanel"></div>'))
268        .append($($container));
269        function closeModal () {
270            $('#modalContainer').hide();
271            $('#modalBackpanel').hide();
272        }
273        $('#modalBackpanel').on('click',closeModal);
274        zoom = function ($piProductNo, $piCategoryNo, $piDisplayGroup) {
275            var $url = '/product/image_zoom.html?product_no=' + $piProductNo + '&cate_no=' + $piCategoryNo + '&display_group=' + $piDisplayGroup;
276            $('#modalContent').attr('src', $url);
277            $('#modalContent').on("load",function(){
278                $(".header .close",this.contentWindow.document.body).on("click", closeModal);
279            });
280            $('#modalBackpanel').css({width:$("body").width(),height:$("body").height(),opacity:.4}).show();
281            $('#modalContainer').center().show();
282        }
283    });
284})(jQuery);
285/* Slide menu */
286/* morenvy.com 190610 정환 수정 */
287
288var aCategory = [];
289$(document).ready(function(){
290    $('#header').append('<div id="dimmedSlider"></div>');
291    var methods = {
292        aCategory    : [],
293        aSubCategory : {},
294        get: function()
295        {
296             $.ajax({
297                url : '/exec/front/Product/SubCategory',
298                dataType: 'json',
299                success: function(aData) {
300                    if (aData == null || aData == 'undefined') {
301                        methods.checkSub();
302                        return;
303                    }
304                    for (var i=0; i<aData.length; i++)
305                    {
306                        var sParentCateNo = aData[i].parent_cate_no;
307                        var sCateNo = aData[i].cate_no;
308                        if (!methods.aSubCategory[sParentCateNo]) {
309                            methods.aSubCategory[sParentCateNo] = [];
310                        }
311                        if (!aCategory[sCateNo]) {
312                            aCategory[sCateNo] = [];
313                        }
314                        methods.aSubCategory[sParentCateNo].push( aData[i] );
315                        aCategory[sCateNo] = aData[i];
316                    }
317                    methods.checkSub();
318                }
319            });
320        },
321        getParam: function(sUrl, sKey) {
322            var aUrl         = sUrl.split('?');
323            var sQueryString = aUrl[1];
324            var aParam       = {};
325            if (sQueryString) {
326                var aFields = sQueryString.split("&");
327                var aField  = [];
328                for (var i=0; i<aFields.length; i++) {
329                    aField = aFields[i].split('=');
330                    aParam[aField[0]] = aField[1];
331                }
332            }
333            return sKey ? aParam[sKey] : aParam;
334        },
335
336        show: function(overNode, iCateNo) {
337             var oParentNode = overNode;
338            var aHtml = [];
339            var sMyCateList = localStorage.getItem("myCateList");
340            if (methods.aSubCategory[iCateNo] != undefined) {
341                aHtml.push('<div class="sub_depth"><ul class="slideSubMenu">');
342                $(methods.aSubCategory[iCateNo]).each(function() {
343                    var sNextParentNo = this.cate_no;
344                    var sCateSelected = (checkInArray(sMyCateList, this.cate_no) == true) ? ' selected' : '';
345                    if (methods.aSubCategory[sNextParentNo] == undefined) {
346                        aHtml.push('<li class="noChild" id="cate'+this.cate_no+'">');
347                        var sHref = ''
348                    } else {
349                        aHtml.push('<li id="cate'+this.cate_no+'">');
350                        var sHref = '#none';
351                    }
352                    aHtml.push('<a href="'+this.link_product_list+'" class="cate" cate="'+this.param+'" onmouseover="subMenuon(this);">'+this.name+'</a>'); // 중분류
353
354                    if (methods.aSubCategory[sNextParentNo] != undefined) {
355                        aHtml.push('<ul>');
356                        $(methods.aSubCategory[sNextParentNo]).each(function() {
357                            var sNextParentNo2 = this.cate_no;
358                            var sCateSelected = (checkInArray(sMyCateList, this.cate_no) == true) ? ' selected' : '';
359                            if (methods.aSubCategory[sNextParentNo2] == undefined) {
360                                aHtml.push('<li class="noChild" id="cate'+this.cate_no+'">');
361                                var sHref = ''
362                            } else {
363                                aHtml.push('<li id="cate'+this.cate_no+'">');
364                                var sHref = '#none';
365                            }
366                            aHtml.push('<a href="'+this.link_product_list+'" class="cate" cate="'+this.param+'" onmouseover="subMenuon(this);">'+this.name+'</a>'); // 소분류
367
368
369                            if (methods.aSubCategory[sNextParentNo2] != undefined) {
370                                aHtml.push('<ul>');
371
372                                $(methods.aSubCategory[sNextParentNo2]).each(function() {
373                                    aHtml.push('<li class="noChild" id="cate'+this.cate_no+'">');
374                                    var sCateSelected = (checkInArray(sMyCateList, this.cate_no) == true) ? ' selected' : '';
375                                    aHtml.push('<a href="'+this.link_product_list+'" class="cate" cate="'+this.param+'" onmouseover="subMenuon(this);">'+this.name+'</a>'); // 하위분류
376                                    aHtml.push('</li>');
377                                });
378                                aHtml.push('</ul>');
379                            }
380                            aHtml.push('</li>');
381                        });
382                        aHtml.push('</ul>');
383                    }
384                    aHtml.push('</li>');
385                });
386                aHtml.push('</ul></div>');
387            }
388            $(oParentNode).append(aHtml.join(''));
389        },
390        close: function() {
391            $('.slideSubMenu').remove();
392        },
393        checkSub: function() {
394            $('.cate').each(function(){
395                var iCateNo = Number(methods.getParam($(this).attr('cate'), 'cate_no'));
396                var result = methods.aSubCategory[iCateNo];
397                if (result == undefined) {
398                    var sHref = '/product/list.html'+$(this).attr('cate'); // 중분류 없는 대분류
399                    $(this).attr('href', sHref);
400                    $(this).parent().attr('class', 'noChild');
401                }
402            });
403        },
404    };
405
406    methods.get();
407
408	setTimeout(function(){
409		$('#slideCateList li > a.cate').each(function(e) {
410			var iCateNo = Number(methods.getParam($(this).attr('cate'), 'cate_no'));
411			if ($(this).parent().attr('class') == 'xans-record- selected') {
412			} else {
413				if (!iCateNo) return;
414				$('#mcategory #slideCateList li').removeClass('selected');
415				methods.show(this.parentNode, iCateNo);
416			}
417		});
418	},300)
419
420
421	jQuery('#mcategory ul li').mouseenter(function(e){
422		e.preventDefault();
423		$(this).addClass('selected');
424	}).mouseleave(function(e){
425		e.preventDefault();
426		$(this).removeClass('selected');
427		$(this).find('.selected').removeClass('selected');
428	});
429
430	/* morenvy.com 상단 오픈 카테고리 가로값 */
431	var cate_area01 = jQuery('#mheader #comment_top .area01').outerWidth(true);
432	var cate_area02 = jQuery('#mheader #comment_top .area02').outerWidth(true);
433	jQuery('#mheader #comment_top .area01 .sub_depth .slideSubMenu').css('width',cate_area01 + cate_area02)
434	jQuery('#mheader #comment_top .area01 .sub_depth').css('width',jQuery(window).width())
435
436	jQuery(window).resize(function(){
437		jQuery('#mheader #comment_top .area01 .sub_depth').css('width',jQuery(window).width())
438	})
439});
440
441function subMenuon(obj) {
442    $(obj).parent().find('li').removeClass('selected');
443	$(obj).parent().addClass('selected');
444	$(obj).parent().siblings().removeClass("selected");
445}
446
447function subArea() {
448	var cate_area01 = jQuery('#mheader #comment_top .area01').outerWidth(true);
449	var cate_area02 = jQuery('#mheader #comment_top .area02').outerWidth(true);
450	jQuery('#mheader #comment_top .area01 .sub_depth .slideSubMenu').css('width',cate_area01 + cate_area02)
451	jQuery('#mheader #comment_top .area01 .sub_depth').css('width',jQuery(window).width())
452}
453
454function checkInArray(sBookmarkList, iCateNo) {
455    return false;
456}
457
458/* morenvy.com 220628 주영광 */
459jQuery(document).ready(function() {
460	/* morenvy.com 상단 스크롤 고정 */
461	var msie6 = $.browser == 'msie' && $.browser.version < 7;
462	if (!msie6) {
463		var top = jQuery('#comment_top').offset().top - parseFloat(jQuery('#comment_top').css('margin-top').replace(/auto/, 0));
464		jQuery(window).scroll(function (event) {
465			// what the y position of the scroll is
466			var y = jQuery(this).scrollTop();
467			// whether that's below the form
468			if(jQuery('#m_onoffmulti_top').css('display') == 'none'){ //최상단 배너 닫았을때
469				if (y >= 86){
470					jQuery('#comment_top').addClass('fixed');
471				} else {
472					jQuery('#comment_top').removeClass('fixed');
473					jQuery('#layer_shadow').fadeOut(300)
474					jQuery('.top_search_area').removeClass('open')
475				}
476			} else { //최상단 배너 열려있을때
477				if (y >= top) {
478				// if so, ad the fixed class
479				jQuery('#comment_top').addClass('fixed');
480				} else {
481				// otherwise remove it
482					jQuery('#comment_top').removeClass('fixed');
483					jQuery('#layer_shadow').fadeOut(300)
484					jQuery('.top_search_area').removeClass('open')
485				}
486			}
487		});
488	}
489	
490	/* morenvy.com 최상단 배너 */
491    jQuery('.closebtn').bind('click', function() {
492        var that = jQuery(this);
493        if (that.hasClass('is-open')) {
494            that.removeClass('is-open').addClass('is-closed');
495            jQuery('#m_onoffmulti_top').slideDown('fast');
496        } else {
497            that.removeClass('is-closed').addClass('is-open');
498            jQuery('#m_onoffmulti_top').slideUp('fast');
499        }
500    });
501
502	/* morenvy.com 검색창 팝업 */
503	jQuery('.top_menu_search > a').click(function(){
504		jQuery('#layer_shadow').fadeIn(300)
505		jQuery('.top_search_area').addClass('open')
506	})
507	jQuery('#layer_shadow, .search_close').click(function(){
508		jQuery('#layer_shadow').fadeOut(300)
509		jQuery('.top_search_area').removeClass('open')
510	})
511
512	/* morenvy.com 검색창 기본텍스트 추가 */
513	jQuery( ".top_search .xans-layout-searchheader fieldset" ).each(function() {
514		var searchheader_text = jQuery(this).attr('title'); 
515		jQuery('.xans-layout-searchheader #keyword').attr('placeholder',searchheader_text);
516	});
517
518	/* morenvy.com 인기 검색어 */
519	var swiper_hot = new Swiper('.swiper_hot', {
520		direction: 'vertical',
521		loop: true,
522		roundLengths: true,
523		spaceBetween: 10,
524		speed:700,
525		observer: true,
526		observeParents: true,
527        autoplay: {
528			delay: 3000,
529			disableOnInteraction: false,
530		},
531	});
532	jQuery('.hot_keyword').hover(
533		function(){
534		jQuery('.keyword_sub').stop().fadeIn(300);
535		},
536		function(){
537		jQuery('.keyword_sub').stop().fadeOut(300);
538		}
539	)
540	jQuery('.hot_keyword .swiper_hot .swiper-slide span').each(function(index){
541		jQuery(this).append(index + ". ");
542	});
543	jQuery('.hot_keyword .swiper_hot .swiper-slide:last-child span').each(function(index){
544		jQuery(this).text(1 + ". ");
545	});
546	jQuery('.hot_keyword .keyword_sub a span').each(function(index){
547		jQuery(this).append(index+1 + ". ");
548	});
549	setTimeout(function(){	// 크롬때문에 딜레이 넣어줘야함
550		jQuery(".hot_keyword").addClass("delay");
551	}, 10);
552
553	/* morenvy.com 헤더 마이페이지 호버 */
554	jQuery('#mheader .top_menu > div.top_login').hover(
555		function(){
556		jQuery(this).find('.login_menu').stop().fadeIn(300);
557		},
558		function(){
559		jQuery(this).find('.login_menu').stop().fadeOut(300);
560		}
561	)
562	/* morenvy.com 헤더 인기검색어,마이페이지 호버 스크롤 버그 해결 */
563	var f = true;
564	jQuery(window).scroll(function(){ // 헤더에 .fixed 클래스가 있을때,없을때를 스크롤중 한번씩만 체크함
565		if (jQuery('#comment_top').hasClass('fixed') && f == true){
566			jQuery('.keyword_sub').css('display','none');
567			jQuery('.login_menu').css('display','none');
568			f = false;
569		}
570		else if (jQuery('#comment_top').hasClass('') && f == false) {
571			jQuery('.keyword_sub').css('display','none');
572			jQuery('.login_menu').css('display','none');
573			f = true;
574		}
575	})
576
577	/* morenvy.com 하단 퀵바 */
578	jQuery(window).scroll(function(){
579		s_t = jQuery(this).scrollTop();
580		if (s_t >= jQuery(window).height()){ // scrollTop 값이 100vh 넘으면
581			jQuery('#right_quick .q_arrow_top').stop().fadeIn(200)
582		} else {jQuery('#right_quick .q_arrow_top').stop().fadeOut(200)}
583		
584	})
585
586	/* morenvy.com 상품 공통 */
587	setTimeout(function(){
588		children_title(); //정보표시
589		brand_title();
590		cal_percent (); //할인율
591		noOpt(); //옵션 미리보기
592		noCart(); //장바구니
593	},300);
594
595	jQuery(".btnMore").click( function( ){
596		setTimeout(function(){
597			rank();
598			children_title();
599			brand_title();
600			cal_percent ();
601			noOpt();
602			noCart();
603		},600);
604	});
605
606});
607
608/* morenvy.com 상품정보표시 브랜드 */
609function brand_title () {
610	jQuery('.ec-base-product .prdList > li').each(function(){
611		if( jQuery(this).find("[rel='브랜드']").length == 0 ){
612			jQuery(this).find('.description').addClass('exist_b');	
613		}
614	});
615}
616
617/* morenvy.com 상품정보표시 */
618function children_title () {
619	jQuery('.description ul.spec li').not('.swiper_rel .description ul.spec li , .swiper_add .description ul.spec li').each(function(){
620		var isTitle = jQuery(this).children('.title').children('span').text()
621		jQuery(this).attr('rel',isTitle)
622	})
623}
624
625/* morenvy.com 할인율 */
626function cal_percent () {
627	jQuery("[rel='판매가']").each(function(){
628		var m_custom = jQuery(this).siblings("[rel='소비자가']").find('.m_item').text().replace(/[^0-9]/g,'');  //소비자가
629		var m_price = jQuery(this).find('.m_item').text().replace(/[^0-9]/g,''); // 판매가
630		var m_sale = '';
631		if (jQuery(this).siblings("[rel='할인판매가']").find('#span_product_price_sale').length != 0 ){
632			m_sale =  jQuery(this).siblings("[rel='할인판매가']").find('#span_product_price_sale').html().split('<')[0].replace(/[^0-9]/g,''); //상세페이지 할인판매가
633		} else {
634			m_sale = jQuery(this).siblings("[rel='할인판매가']").find('.m_item').text().replace(/[^0-9]/g,''); //상품목록 할인판매가
635		}
636		if( typeof m_sale == "undefined" || m_sale == "" || m_sale == null ) { //할인판매가가 공백일 때
637			m_sale = m_price	
638		}
639		
640
641		/* 할인율 계산 */
642		if((jQuery(this).siblings("[rel='할인판매가']").length != 0 && m_price != m_sale) || (jQuery(this).siblings("[rel='소비자가']").length == 0 && jQuery(this).siblings("[rel='할인판매가']").length != 0 && m_sale != m_price)){
643			//var c_sale = Math.round(  ( m_custom - m_sale ) / m_custom * 100 );  //소비자가와 할인판매가
644			var p_sale = Math.round(  ( m_price - m_sale ) / m_price * 100 ); //판매가와 할인판매가
645
646			jQuery(this).parents('.box').find('.sale_box').text(p_sale + '%').insertAfter(jQuery(this)); // 상품목록 할인율 출력
647			jQuery(this).parents('.xans-product-detail').find('.price_box .sale_box').show().text(p_sale + '%'); // 상세페이지 할인율 출력
648			
649			/* 상품목록 */
650			jQuery(this).addClass('through');
651			jQuery(this).siblings("[rel='소비자가']").hide();
652			jQuery(this).siblings("[rel='할인판매가']").addClass('msale');
653
654			/* 상세페이지 */
655			jQuery(this).parents('.xans-product-detail').find('.sale').addClass('msale');
656			jQuery(this).parents('.xans-product-detail').find('.price').addClass('through');
657			jQuery(this).parents('.xans-product-detail').find('.custom').hide();
658
659		} else if (jQuery(this).siblings("[rel='소비자가']").length != 0){
660			if (m_custom != m_price){
661				var sale_cnt = Math.round(  ( m_custom - m_price ) / m_custom * 100 ); //소비자가와 판매가
662
663				jQuery(this).parents('.box').find('.sale_box').text(sale_cnt + '%').insertAfter(jQuery(this).next()); // 상품목록 할인율 출력
664				jQuery(this).parents('.xans-product-detail').find('.price_box .sale_box').show().text(sale_cnt + '%'); // 상세페이지 할인율 출력
665				
666				/* 상품목록 */
667				jQuery(this).addClass('msale');
668				jQuery(this).siblings("[rel='소비자가']").addClass('through');
669
670				/* 상세페이지 */
671				jQuery(this).parents('.xans-product-detail').find('.price').addClass('msale');
672				jQuery(this).parents('.xans-product-detail').find('.custom').addClass('through');
673			} else {
674				/* 상품목록 */
675				jQuery(this).addClass('msale');
676				jQuery(this).siblings("[rel='소비자가']").hide();
677
678				/* 상세페이지 */
679				jQuery(this).parents('.xans-product-detail').find('.custom').hide();
680			}
681		} else {
682			jQuery(this).addClass('msale');
683		}
684	})
685};
686
687/* morenvy.com 옵션 미리보기 없으면 미출력 */
688function noOpt () {
689	jQuery('.wrap_icon_box .option').each(function(){
690		if(jQuery(this).find('img').length == 0){
691			jQuery(this).hide();
692		}
693	})
694}
695
696/* morenvy.com 장바구니 사용안할시 숨김 */
697function noCart () {
698	jQuery('.wrap_icon_box .m_cart').each(function(){
699		if(jQuery(this).find('.ec-admin-icon').length == 0){
700			jQuery(this).hide();
701		}
702	})
703}
704
vendor: 146,326 bytes, lines 705-717
705/**
706 * Swiper 6.8.4
707 * Most modern mobile touch slider and framework with hardware accelerated transitions
708 * https://swiperjs.com
709 *
710 * Copyright 2014-2021 Vladimir Kharlampidi
711 *
712 * Released under the MIT License
713 *
714 * Released on: August 23, 2021
715 */
716
717!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).Swiper=t()}(this,(function(){"use strict";function e(e,t){for(var a=0;a<t.length;a++){var i=t[a];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(e,i.key,i)}}function t(){return(t=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var a=arguments[t];for(var i in a)Object.prototype.hasOwnProperty.call(a,i)&&(e[i]=a[i])}return e}).apply(this,arguments)}function a(e){return null!==e&&"object"==typeof e&&"constructor"in e&&e.constructor===Object}function i(e,t){void 0===e&&(e={}),void 0===t&&(t={}),Object.keys(t).forEach((function(s){void 0===e[s]?e[s]=t[s]:a(t[s])&&a(e[s])&&Object.keys(t[s]).length>0&&i(e[s],t[s])}))}var s={body:{},addEventListener:function(){},removeEventListener:function(){},activeElement:{blur:function(){},nodeName:""},querySelector:function(){return null},querySelectorAll:function(){return[]},getElementById:function(){return null},createEvent:function(){return{initEvent:function(){}}},createElement:function(){return{children:[],childNodes:[],style:{},setAttribute:function(){},getElementsByTagName:function(){return[]}}},createElementNS:function(){return{}},importNode:function(){return null},location:{hash:"",host:"",hostname:"",href:"",origin:"",pathname:"",protocol:"",search:""}};function r(){var e="undefined"!=typeof document?document:{};return i(e,s),e}var n={document:s,navigator:{userAgent:""},location:{hash:"",host:"",hostname:"",href:"",origin:"",pathname:"",protocol:"",search:""},history:{replaceState:function(){},pushState:function(){},go:function(){},back:function(){}},CustomEvent:function(){return this},addEventListener:function(){},removeEventListener:function(){},getComputedStyle:function(){return{getPropertyValue:function(){return""}}},Image:function(){},Date:function(){},screen:{},setTimeout:function(){},clearTimeout:function(){},matchMedia:function(){return{}},requestAnimationFrame:function(e){return"undefined"==typeof setTimeout?(e(),null):setTimeout(e,0)},cancelAnimationFrame:function(e){"undefined"!=typeof setTimeout&&clearTimeout(e)}};function l(){var e="undefined"!=typeof window?window:{};return i(e,n),e}function o(e){return(o=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function d(e,t){return(d=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}function p(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],(function(){}))),!0}catch(e){return!1}}function u(e,t,a){return(u=p()?Reflect.construct:function(e,t,a){var i=[null];i.push.apply(i,t);var s=new(Function.bind.apply(e,i));return a&&d(s,a.prototype),s}).apply(null,arguments)}function c(e){var t="function"==typeof Map?new Map:void 0;return(c=function(e){if(null===e||(a=e,-1===Function.toString.call(a).indexOf("[native code]")))return e;var a;if("function"!=typeof e)throw new TypeError("Super expression must either be null or a function");if(void 0!==t){if(t.has(e))return t.get(e);t.set(e,i)}function i(){return u(e,arguments,o(this).constructor)}return i.prototype=Object.create(e.prototype,{constructor:{value:i,enumerable:!1,writable:!0,configurable:!0}}),d(i,e)})(e)}var h=function(e){var t,a;function i(t){var a,i,s;return a=e.call.apply(e,[this].concat(t))||this,i=function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(a),s=i.__proto__,Object.defineProperty(i,"__proto__",{get:function(){return s},set:function(e){s.__proto__=e}}),a}return a=e,(t=i).prototype=Object.create(a.prototype),t.prototype.constructor=t,t.__proto__=a,i}(c(Array));function v(e){void 0===e&&(e=[]);var t=[];return e.forEach((function(e){Array.isArray(e)?t.push.apply(t,v(e)):t.push(e)})),t}function f(e,t){return Array.prototype.filter.call(e,t)}function m(e,t){var a=l(),i=r(),s=[];if(!t&&e instanceof h)return e;if(!e)return new h(s);if("string"==typeof e){var n=e.trim();if(n.indexOf("<")>=0&&n.indexOf(">")>=0){var o="div";0===n.indexOf("<li")&&(o="ul"),0===n.indexOf("<tr")&&(o="tbody"),0!==n.indexOf("<td")&&0!==n.indexOf("<th")||(o="tr"),0===n.indexOf("<tbody")&&(o="table"),0===n.indexOf("<option")&&(o="select");var d=i.createElement(o);d.innerHTML=n;for(var p=0;p<d.childNodes.length;p+=1)s.push(d.childNodes[p])}else s=function(e,t){if("string"!=typeof e)return[e];for(var a=[],i=t.querySelectorAll(e),s=0;s<i.length;s+=1)a.push(i[s]);return a}(e.trim(),t||i)}else if(e.nodeType||e===a||e===i)s.push(e);else if(Array.isArray(e)){if(e instanceof h)return e;s=e}return new h(function(e){for(var t=[],a=0;a<e.length;a+=1)-1===t.indexOf(e[a])&&t.push(e[a]);return t}(s))}m.fn=h.prototype;var g,b,w,y={addClass:function(){for(var e=arguments.length,t=new Array(e),a=0;a<e;a++)t[a]=arguments[a];var i=v(t.map((function(e){return e.split(" ")})));return this.forEach((function(e){var t;(t=e.classList).add.apply(t,i)})),this},removeClass:function(){for(var e=arguments.length,t=new Array(e),a=0;a<e;a++)t[a]=arguments[a];var i=v(t.map((function(e){return e.split(" ")})));return this.forEach((function(e){var t;(t=e.classList).remove.apply(t,i)})),this},hasClass:function(){for(var e=arguments.length,t=new Array(e),a=0;a<e;a++)t[a]=arguments[a];var i=v(t.map((function(e){return e.split(" ")})));return f(this,(function(e){return i.filter((function(t){return e.classList.contains(t)})).length>0})).length>0},toggleClass:function(){for(var e=arguments.length,t=new Array(e),a=0;a<e;a++)t[a]=arguments[a];var i=v(t.map((function(e){return e.split(" ")})));this.forEach((function(e){i.forEach((function(t){e.classList.toggle(t)}))}))},attr:function(e,t){if(1===arguments.length&&"string"==typeof e)return this[0]?this[0].getAttribute(e):void 0;for(var a=0;a<this.length;a+=1)if(2===arguments.length)this[a].setAttribute(e,t);else for(var i in e)this[a][i]=e[i],this[a].setAttribute(i,e[i]);return this},removeAttr:function(e){for(var t=0;t<this.length;t+=1)this[t].removeAttribute(e);return this},transform:function(e){for(var t=0;t<this.length;t+=1)this[t].style.transform=e;return this},transition:function(e){for(var t=0;t<this.length;t+=1)this[t].style.transitionDuration="string"!=typeof e?e+"ms":e;return this},on:function(){for(var e=arguments.length,t=new Array(e),a=0;a<e;a++)t[a]=arguments[a];var i=t[0],s=t[1],r=t[2],n=t[3];function l(e){var t=e.target;if(t){var a=e.target.dom7EventData||[];if(a.indexOf(e)<0&&a.unshift(e),m(t).is(s))r.apply(t,a);else for(var i=m(t).parents(),n=0;n<i.length;n+=1)m(i[n]).is(s)&&r.apply(i[n],a)}}function o(e){var t=e&&e.target&&e.target.dom7EventData||[];t.indexOf(e)<0&&t.unshift(e),r.apply(this,t)}"function"==typeof t[1]&&(i=t[0],r=t[1],n=t[2],s=void 0),n||(n=!1);for(var d,p=i.split(" "),u=0;u<this.length;u+=1){var c=this[u];if(s)for(d=0;d<p.length;d+=1){var h=p[d];c.dom7LiveListeners||(c.dom7LiveListeners={}),c.dom7LiveListeners[h]||(c.dom7LiveListeners[h]=[]),c.dom7LiveListeners[h].push({listener:r,proxyListener:l}),c.addEventListener(h,l,n)}else for(d=0;d<p.length;d+=1){var v=p[d];c.dom7Listeners||(c.dom7Listeners={}),c.dom7Listeners[v]||(c.dom7Listeners[v]=[]),c.dom7Listeners[v].push({listener:r,proxyListener:o}),c.addEventListener(v,o,n)}}return this},off:function(){for(var e=arguments.length,t=new Array(e),a=0;a<e;a++)t[a]=arguments[a];var i=t[0],s=t[1],r=t[2],n=t[3];"function"==typeof t[1]&&(i=t[0],r=t[1],n=t[2],s=void 0),n||(n=!1);for(var l=i.split(" "),o=0;o<l.length;o+=1)for(var d=l[o],p=0;p<this.length;p+=1){var u=this[p],c=void 0;if(!s&&u.dom7Listeners?c=u.dom7Listeners[d]:s&&u.dom7LiveListeners&&(c=u.dom7LiveListeners[d]),c&&c.length)for(var h=c.length-1;h>=0;h-=1){var v=c[h];r&&v.listener===r||r&&v.listener&&v.listener.dom7proxy&&v.listener.dom7proxy===r?(u.removeEventListener(d,v.proxyListener,n),c.splice(h,1)):r||(u.removeEventListener(d,v.proxyListener,n),c.splice(h,1))}}return this},trigger:function(){for(var e=l(),t=arguments.length,a=new Array(t),i=0;i<t;i++)a[i]=arguments[i];for(var s=a[0].split(" "),r=a[1],n=0;n<s.length;n+=1)for(var o=s[n],d=0;d<this.length;d+=1){var p=this[d];if(e.CustomEvent){var u=new e.CustomEvent(o,{detail:r,bubbles:!0,cancelable:!0});p.dom7EventData=a.filter((function(e,t){return t>0})),p.dispatchEvent(u),p.dom7EventData=[],delete p.dom7EventData}}return this},transitionEnd:function(e){var t=this;return e&&t.on("transitionend",(function a(i){i.target===this&&(e.call(this,i),t.off("transitionend",a))})),this},outerWidth:function(e){if(this.length>0){if(e){var t=this.styles();return this[0].offsetWidth+parseFloat(t.getPropertyValue("margin-right"))+parseFloat(t.getPropertyValue("margin-left"))}return this[0].offsetWidth}return null},outerHeight:function(e){if(this.length>0){if(e){var t=this.styles();return this[0].offsetHeight+parseFloat(t.getPropertyValue("margin-top"))+parseFloat(t.getPropertyValue("margin-bottom"))}return this[0].offsetHeight}return null},styles:function(){var e=l();return this[0]?e.getComputedStyle(this[0],null):{}},offset:function(){if(this.length>0){var e=l(),t=r(),a=this[0],i=a.getBoundingClientRect(),s=t.body,n=a.clientTop||s.clientTop||0,o=a.clientLeft||s.clientLeft||0,d=a===e?e.scrollY:a.scrollTop,p=a===e?e.scrollX:a.scrollLeft;return{top:i.top+d-n,left:i.left+p-o}}return null},css:function(e,t){var a,i=l();if(1===arguments.length){if("string"!=typeof e){for(a=0;a<this.length;a+=1)for(var s in e)this[a].style[s]=e[s];return this}if(this[0])return i.getComputedStyle(this[0],null).getPropertyValue(e)}if(2===arguments.length&&"string"==typeof e){for(a=0;a<this.length;a+=1)this[a].style[e]=t;return this}return this},each:function(e){return e?(this.forEach((function(t,a){e.apply(t,[t,a])})),this):this},html:function(e){if(void 0===e)return this[0]?this[0].innerHTML:null;for(var t=0;t<this.length;t+=1)this[t].innerHTML=e;return this},text:function(e){if(void 0===e)return this[0]?this[0].textContent.trim():null;for(var t=0;t<this.length;t+=1)this[t].textContent=e;return this},is:function(e){var t,a,i=l(),s=r(),n=this[0];if(!n||void 0===e)return!1;if("string"==typeof e){if(n.matches)return n.matches(e);if(n.webkitMatchesSelector)return n.webkitMatchesSelector(e);if(n.msMatchesSelector)return n.msMatchesSelector(e);for(t=m(e),a=0;a<t.length;a+=1)if(t[a]===n)return!0;return!1}if(e===s)return n===s;if(e===i)return n===i;if(e.nodeType||e instanceof h){for(t=e.nodeType?[e]:e,a=0;a<t.length;a+=1)if(t[a]===n)return!0;return!1}return!1},index:function(){var e,t=this[0];if(t){for(e=0;null!==(t=t.previousSibling);)1===t.nodeType&&(e+=1);return e}},eq:function(e){if(void 0===e)return this;var t=this.length;if(e>t-1)return m([]);if(e<0){var a=t+e;return m(a<0?[]:[this[a]])}return m([this[e]])},append:function(){for(var e,t=r(),a=0;a<arguments.length;a+=1){e=a<0||arguments.length<=a?void 0:arguments[a];for(var i=0;i<this.length;i+=1)if("string"==typeof e){var s=t.createElement("div");for(s.innerHTML=e;s.firstChild;)this[i].appendChild(s.firstChild)}else if(e instanceof h)for(var n=0;n<e.length;n+=1)this[i].appendChild(e[n]);else this[i].appendChild(e)}return this},prepend:function(e){var t,a,i=r();for(t=0;t<this.length;t+=1)if("string"==typeof e){var s=i.createElement("div");for(s.innerHTML=e,a=s.childNodes.length-1;a>=0;a-=1)this[t].insertBefore(s.childNodes[a],this[t].childNodes[0])}else if(e instanceof h)for(a=0;a<e.length;a+=1)this[t].insertBefore(e[a],this[t].childNodes[0]);else this[t].insertBefore(e,this[t].childNodes[0]);return this},next:function(e){return this.length>0?e?this[0].nextElementSibling&&m(this[0].nextElementSibling).is(e)?m([this[0].nextElementSibling]):m([]):this[0].nextElementSibling?m([this[0].nextElementSibling]):m([]):m([])},nextAll:function(e){var t=[],a=this[0];if(!a)return m([]);for(;a.nextElementSibling;){var i=a.nextElementSibling;e?m(i).is(e)&&t.push(i):t.push(i),a=i}return m(t)},prev:function(e){if(this.length>0){var t=this[0];return e?t.previousElementSibling&&m(t.previousElementSibling).is(e)?m([t.previousElementSibling]):m([]):t.previousElementSibling?m([t.previousElementSibling]):m([])}return m([])},prevAll:function(e){var t=[],a=this[0];if(!a)return m([]);for(;a.previousElementSibling;){var i=a.previousElementSibling;e?m(i).is(e)&&t.push(i):t.push(i),a=i}return m(t)},parent:function(e){for(var t=[],a=0;a<this.length;a+=1)null!==this[a].parentNode&&(e?m(this[a].parentNode).is(e)&&t.push(this[a].parentNode):t.push(this[a].parentNode));return m(t)},parents:function(e){for(var t=[],a=0;a<this.length;a+=1)for(var i=this[a].parentNode;i;)e?m(i).is(e)&&t.push(i):t.push(i),i=i.parentNode;return m(t)},closest:function(e){var t=this;return void 0===e?m([]):(t.is(e)||(t=t.parents(e).eq(0)),t)},find:function(e){for(var t=[],a=0;a<this.length;a+=1)for(var i=this[a].querySelectorAll(e),s=0;s<i.length;s+=1)t.push(i[s]);return m(t)},children:function(e){for(var t=[],a=0;a<this.length;a+=1)for(var i=this[a].children,s=0;s<i.length;s+=1)e&&!m(i[s]).is(e)||t.push(i[s]);return m(t)},filter:function(e){return m(f(this,e))},remove:function(){for(var e=0;e<this.length;e+=1)this[e].parentNode&&this[e].parentNode.removeChild(this[e]);return this}};function E(e,t){return void 0===t&&(t=0),setTimeout(e,t)}function x(){return Date.now()}function T(e,t){void 0===t&&(t="x");var a,i,s,r=l(),n=function(e){var t,a=l();return a.getComputedStyle&&(t=a.getComputedStyle(e,null)),!t&&e.currentStyle&&(t=e.currentStyle),t||(t=e.style),t}(e);return r.WebKitCSSMatrix?((i=n.transform||n.webkitTransform).split(",").length>6&&(i=i.split(", ").map((function(e){return e.replace(",",".")})).join(", ")),s=new r.WebKitCSSMatrix("none"===i?"":i)):a=(s=n.MozTransform||n.OTransform||n.MsTransform||n.msTransform||n.transform||n.getPropertyValue("transform").replace("translate(","matrix(1, 0, 0, 1,")).toString().split(","),"x"===t&&(i=r.WebKitCSSMatrix?s.m41:16===a.length?parseFloat(a[12]):parseFloat(a[4])),"y"===t&&(i=r.WebKitCSSMatrix?s.m42:16===a.length?parseFloat(a[13]):parseFloat(a[5])),i||0}function C(e){return"object"==typeof e&&null!==e&&e.constructor&&"Object"===Object.prototype.toString.call(e).slice(8,-1)}function S(e){return"undefined"!=typeof window&&void 0!==window.HTMLElement?e instanceof HTMLElement:e&&(1===e.nodeType||11===e.nodeType)}function M(){for(var e=Object(arguments.length<=0?void 0:arguments[0]),t=["__proto__","constructor","prototype"],a=1;a<arguments.length;a+=1){var i=a<0||arguments.length<=a?void 0:arguments[a];if(null!=i&&!S(i))for(var s=Object.keys(Object(i)).filter((function(e){return t.indexOf(e)<0})),r=0,n=s.length;r<n;r+=1){var l=s[r],o=Object.getOwnPropertyDescriptor(i,l);void 0!==o&&o.enumerable&&(C(e[l])&&C(i[l])?i[l].__swiper__?e[l]=i[l]:M(e[l],i[l]):!C(e[l])&&C(i[l])?(e[l]={},i[l].__swiper__?e[l]=i[l]:M(e[l],i[l])):e[l]=i[l])}}return e}function z(e,t){Object.keys(t).forEach((function(a){C(t[a])&&Object.keys(t[a]).forEach((function(i){"function"==typeof t[a][i]&&(t[a][i]=t[a][i].bind(e))})),e[a]=t[a]}))}function P(e){return void 0===e&&(e=""),"."+e.trim().replace(/([\.:!\/])/g,"\\$1").replace(/ /g,".")}function k(e,t,a,i){var s=r();return a&&Object.keys(i).forEach((function(a){if(!t[a]&&!0===t.auto){var r=s.createElement("div");r.className=i[a],e.append(r),t[a]=r}})),t}function $(){return g||(g=function(){var e=l(),t=r();return{touch:!!("ontouchstart"in e||e.DocumentTouch&&t instanceof e.DocumentTouch),pointerEvents:!!e.PointerEvent&&"maxTouchPoints"in e.navigator&&e.navigator.maxTouchPoints>=0,observer:"MutationObserver"in e||"WebkitMutationObserver"in e,passiveListener:function(){var t=!1;try{var a=Object.defineProperty({},"passive",{get:function(){t=!0}});e.addEventListener("testPassiveListener",null,a)}catch(e){}return t}(),gestures:"ongesturestart"in e}}()),g}function L(e){return void 0===e&&(e={}),b||(b=function(e){var t=(void 0===e?{}:e).userAgent,a=$(),i=l(),s=i.navigator.platform,r=t||i.navigator.userAgent,n={ios:!1,android:!1},o=i.screen.width,d=i.screen.height,p=r.match(/(Android);?[\s\/]+([\d.]+)?/),u=r.match(/(iPad).*OS\s([\d_]+)/),c=r.match(/(iPod)(.*OS\s([\d_]+))?/),h=!u&&r.match(/(iPhone\sOS|iOS)\s([\d_]+)/),v="Win32"===s,f="MacIntel"===s;return!u&&f&&a.touch&&["1024x1366","1366x1024","834x1194","1194x834","834x1112","1112x834","768x1024","1024x768","820x1180","1180x820","810x1080","1080x810"].indexOf(o+"x"+d)>=0&&((u=r.match(/(Version)\/([\d.]+)/))||(u=[0,1,"13_0_0"]),f=!1),p&&!v&&(n.os="android",n.android=!0),(u||h||c)&&(n.os="ios",n.ios=!0),n}(e)),b}function I(){return w||(w=function(){var e,t=l();return{isEdge:!!t.navigator.userAgent.match(/Edge/g),isSafari:(e=t.navigator.userAgent.toLowerCase(),e.indexOf("safari")>=0&&e.indexOf("chrome")<0&&e.indexOf("android")<0),isWebView:/(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test(t.navigator.userAgent)}}()),w}Object.keys(y).forEach((function(e){Object.defineProperty(m.fn,e,{value:y[e],writable:!0})}));var O={name:"resize",create:function(){var e=this;M(e,{resize:{observer:null,createObserver:function(){e&&!e.destroyed&&e.initialized&&(e.resize.observer=new ResizeObserver((function(t){var a=e.width,i=e.height,s=a,r=i;t.forEach((function(t){var a=t.contentBoxSize,i=t.contentRect,n=t.target;n&&n!==e.el||(s=i?i.width:(a[0]||a).inlineSize,r=i?i.height:(a[0]||a).blockSize)})),s===a&&r===i||e.resize.resizeHandler()})),e.resize.observer.observe(e.el))},removeObserver:function(){e.resize.observer&&e.resize.observer.unobserve&&e.el&&(e.resize.observer.unobserve(e.el),e.resize.observer=null)},resizeHandler:function(){e&&!e.destroyed&&e.initialized&&(e.emit("beforeResize"),e.emit("resize"))},orientationChangeHandler:function(){e&&!e.destroyed&&e.initialized&&e.emit("orientationchange")}}})},on:{init:function(e){var t=l();e.params.resizeObserver&&void 0!==l().ResizeObserver?e.resize.createObserver():(t.addEventListener("resize",e.resize.resizeHandler),t.addEventListener("orientationchange",e.resize.orientationChangeHandler))},destroy:function(e){var t=l();e.resize.removeObserver(),t.removeEventListener("resize",e.resize.resizeHandler),t.removeEventListener("orientationchange",e.resize.orientationChangeHandler)}}},A={attach:function(e,t){void 0===t&&(t={});var a=l(),i=this,s=new(a.MutationObserver||a.WebkitMutationObserver)((function(e){if(1!==e.length){var t=function(){i.emit("observerUpdate",e[0])};a.requestAnimationFrame?a.requestAnimationFrame(t):a.setTimeout(t,0)}else i.emit("observerUpdate",e[0])}));s.observe(e,{attributes:void 0===t.attributes||t.attributes,childList:void 0===t.childList||t.childList,characterData:void 0===t.characterData||t.characterData}),i.observer.observers.push(s)},init:function(){var e=this;if(e.support.observer&&e.params.observer){if(e.params.observeParents)for(var t=e.$el.parents(),a=0;a<t.length;a+=1)e.observer.attach(t[a]);e.observer.attach(e.$el[0],{childList:e.params.observeSlideChildren}),e.observer.attach(e.$wrapperEl[0],{attributes:!1})}},destroy:function(){this.observer.observers.forEach((function(e){e.disconnect()})),this.observer.observers=[]}},D={name:"observer",params:{observer:!1,observeParents:!1,observeSlideChildren:!1},create:function(){z(this,{observer:t({},A,{observers:[]})})},on:{init:function(e){e.observer.init()},destroy:function(e){e.observer.destroy()}}};function N(e){var t=this,a=r(),i=l(),s=t.touchEventsData,n=t.params,o=t.touches;if(t.enabled&&(!t.animating||!n.preventInteractionOnTransition)){var d=e;d.originalEvent&&(d=d.originalEvent);var p=m(d.target);if(("wrapper"!==n.touchEventsTarget||p.closest(t.wrapperEl).length)&&(s.isTouchEvent="touchstart"===d.type,(s.isTouchEvent||!("which"in d)||3!==d.which)&&!(!s.isTouchEvent&&"button"in d&&d.button>0||s.isTouched&&s.isMoved))){!!n.noSwipingClass&&""!==n.noSwipingClass&&d.target&&d.target.shadowRoot&&e.path&&e.path[0]&&(p=m(e.path[0]));var u=n.noSwipingSelector?n.noSwipingSelector:"."+n.noSwipingClass,c=!(!d.target||!d.target.shadowRoot);if(n.noSwiping&&(c?function(e,t){return void 0===t&&(t=this),function t(a){return a&&a!==r()&&a!==l()?(a.assignedSlot&&(a=a.assignedSlot),a.closest(e)||t(a.getRootNode().host)):null}(t)}(u,d.target):p.closest(u)[0]))t.allowClick=!0;else if(!n.swipeHandler||p.closest(n.swipeHandler)[0]){o.currentX="touchstart"===d.type?d.targetTouches[0].pageX:d.pageX,o.currentY="touchstart"===d.type?d.targetTouches[0].pageY:d.pageY;var h=o.currentX,v=o.currentY,f=n.edgeSwipeDetection||n.iOSEdgeSwipeDetection,g=n.edgeSwipeThreshold||n.iOSEdgeSwipeThreshold;if(f&&(h<=g||h>=i.innerWidth-g)){if("prevent"!==f)return;e.preventDefault()}if(M(s,{isTouched:!0,isMoved:!1,allowTouchCallbacks:!0,isScrolling:void 0,startMoving:void 0}),o.startX=h,o.startY=v,s.touchStartTime=x(),t.allowClick=!0,t.updateSize(),t.swipeDirection=void 0,n.threshold>0&&(s.allowThresholdMove=!1),"touchstart"!==d.type){var b=!0;p.is(s.focusableElements)&&(b=!1),a.activeElement&&m(a.activeElement).is(s.focusableElements)&&a.activeElement!==p[0]&&a.activeElement.blur();var w=b&&t.allowTouchMove&&n.touchStartPreventDefault;!n.touchStartForcePreventDefault&&!w||p[0].isContentEditable||d.preventDefault()}t.emit("touchStart",d)}}}}function G(e){var t=r(),a=this,i=a.touchEventsData,s=a.params,n=a.touches,l=a.rtlTranslate;if(a.enabled){var o=e;if(o.originalEvent&&(o=o.originalEvent),i.isTouched){if(!i.isTouchEvent||"touchmove"===o.type){var d="touchmove"===o.type&&o.targetTouches&&(o.targetTouches[0]||o.changedTouches[0]),p="touchmove"===o.type?d.pageX:o.pageX,u="touchmove"===o.type?d.pageY:o.pageY;if(o.preventedByNestedSwiper)return n.startX=p,void(n.startY=u);if(!a.allowTouchMove)return a.allowClick=!1,void(i.isTouched&&(M(n,{startX:p,startY:u,currentX:p,currentY:u}),i.touchStartTime=x()));if(i.isTouchEvent&&s.touchReleaseOnEdges&&!s.loop)if(a.isVertical()){if(u<n.startY&&a.translate<=a.maxTranslate()||u>n.startY&&a.translate>=a.minTranslate())return i.isTouched=!1,void(i.isMoved=!1)}else if(p<n.startX&&a.translate<=a.maxTranslate()||p>n.startX&&a.translate>=a.minTranslate())return;if(i.isTouchEvent&&t.activeElement&&o.target===t.activeElement&&m(o.target).is(i.focusableElements))return i.isMoved=!0,void(a.allowClick=!1);if(i.allowTouchCallbacks&&a.emit("touchMove",o),!(o.targetTouches&&o.targetTouches.length>1)){n.currentX=p,n.currentY=u;var c=n.currentX-n.startX,h=n.currentY-n.startY;if(!(a.params.threshold&&Math.sqrt(Math.pow(c,2)+Math.pow(h,2))<a.params.threshold)){var v;if(void 0===i.isScrolling)a.isHorizontal()&&n.currentY===n.startY||a.isVertical()&&n.currentX===n.startX?i.isScrolling=!1:c*c+h*h>=25&&(v=180*Math.atan2(Math.abs(h),Math.abs(c))/Math.PI,i.isScrolling=a.isHorizontal()?v>s.touchAngle:90-v>s.touchAngle);if(i.isScrolling&&a.emit("touchMoveOpposite",o),void 0===i.startMoving&&(n.currentX===n.startX&&n.currentY===n.startY||(i.startMoving=!0)),i.isScrolling)i.isTouched=!1;else if(i.startMoving){a.allowClick=!1,!s.cssMode&&o.cancelable&&o.preventDefault(),s.touchMoveStopPropagation&&!s.nested&&o.stopPropagation(),i.isMoved||(s.loop&&a.loopFix(),i.startTranslate=a.getTranslate(),a.setTransition(0),a.animating&&a.$wrapperEl.trigger("webkitTransitionEnd transitionend"),i.allowMomentumBounce=!1,!s.grabCursor||!0!==a.allowSlideNext&&!0!==a.allowSlidePrev||a.setGrabCursor(!0),a.emit("sliderFirstMove",o)),a.emit("sliderMove",o),i.isMoved=!0;var f=a.isHorizontal()?c:h;n.diff=f,f*=s.touchRatio,l&&(f=-f),a.swipeDirection=f>0?"prev":"next",i.currentTranslate=f+i.startTranslate;var g=!0,b=s.resistanceRatio;if(s.touchReleaseOnEdges&&(b=0),f>0&&i.currentTranslate>a.minTranslate()?(g=!1,s.resistance&&(i.currentTranslate=a.minTranslate()-1+Math.pow(-a.minTranslate()+i.startTranslate+f,b))):f<0&&i.currentTranslate<a.maxTranslate()&&(g=!1,s.resistance&&(i.currentTranslate=a.maxTranslate()+1-Math.pow(a.maxTranslate()-i.startTranslate-f,b))),g&&(o.preventedByNestedSwiper=!0),!a.allowSlideNext&&"next"===a.swipeDirection&&i.currentTranslate<i.startTranslate&&(i.currentTranslate=i.startTranslate),!a.allowSlidePrev&&"prev"===a.swipeDirection&&i.currentTranslate>i.startTranslate&&(i.currentTranslate=i.startTranslate),a.allowSlidePrev||a.allowSlideNext||(i.currentTranslate=i.startTranslate),s.threshold>0){if(!(Math.abs(f)>s.threshold||i.allowThresholdMove))return void(i.currentTranslate=i.startTranslate);if(!i.allowThresholdMove)return i.allowThresholdMove=!0,n.startX=n.currentX,n.startY=n.currentY,i.currentTranslate=i.startTranslate,void(n.diff=a.isHorizontal()?n.currentX-n.startX:n.currentY-n.startY)}s.followFinger&&!s.cssMode&&((s.freeMode||s.watchSlidesProgress||s.watchSlidesVisibility)&&(a.updateActiveIndex(),a.updateSlidesClasses()),s.freeMode&&(0===i.velocities.length&&i.velocities.push({position:n[a.isHorizontal()?"startX":"startY"],time:i.touchStartTime}),i.velocities.push({position:n[a.isHorizontal()?"currentX":"currentY"],time:x()})),a.updateProgress(i.currentTranslate),a.setTranslate(i.currentTranslate))}}}}}else i.startMoving&&i.isScrolling&&a.emit("touchMoveOpposite",o)}}function B(e){var t=this,a=t.touchEventsData,i=t.params,s=t.touches,r=t.rtlTranslate,n=t.$wrapperEl,l=t.slidesGrid,o=t.snapGrid;if(t.enabled){var d=e;if(d.originalEvent&&(d=d.originalEvent),a.allowTouchCallbacks&&t.emit("touchEnd",d),a.allowTouchCallbacks=!1,!a.isTouched)return a.isMoved&&i.grabCursor&&t.setGrabCursor(!1),a.isMoved=!1,void(a.startMoving=!1);i.grabCursor&&a.isMoved&&a.isTouched&&(!0===t.allowSlideNext||!0===t.allowSlidePrev)&&t.setGrabCursor(!1);var p,u=x(),c=u-a.touchStartTime;if(t.allowClick&&(t.updateClickedSlide(d),t.emit("tap click",d),c<300&&u-a.lastClickTime<300&&t.emit("doubleTap doubleClick",d)),a.lastClickTime=x(),E((function(){t.destroyed||(t.allowClick=!0)})),!a.isTouched||!a.isMoved||!t.swipeDirection||0===s.diff||a.currentTranslate===a.startTranslate)return a.isTouched=!1,a.isMoved=!1,void(a.startMoving=!1);if(a.isTouched=!1,a.isMoved=!1,a.startMoving=!1,p=i.followFinger?r?t.translate:-t.translate:-a.currentTranslate,!i.cssMode)if(i.freeMode){if(p<-t.minTranslate())return void t.slideTo(t.activeIndex);if(p>-t.maxTranslate())return void(t.slides.length<o.length?t.slideTo(o.length-1):t.slideTo(t.slides.length-1));if(i.freeModeMomentum){if(a.velocities.length>1){var h=a.velocities.pop(),v=a.velocities.pop(),f=h.position-v.position,m=h.time-v.time;t.velocity=f/m,t.velocity/=2,Math.abs(t.velocity)<i.freeModeMinimumVelocity&&(t.velocity=0),(m>150||x()-h.time>300)&&(t.velocity=0)}else t.velocity=0;t.velocity*=i.freeModeMomentumVelocityRatio,a.velocities.length=0;var g=1e3*i.freeModeMomentumRatio,b=t.velocity*g,w=t.translate+b;r&&(w=-w);var y,T,C=!1,S=20*Math.abs(t.velocity)*i.freeModeMomentumBounceRatio;if(w<t.maxTranslate())i.freeModeMomentumBounce?(w+t.maxTranslate()<-S&&(w=t.maxTranslate()-S),y=t.maxTranslate(),C=!0,a.allowMomentumBounce=!0):w=t.maxTranslate(),i.loop&&i.centeredSlides&&(T=!0);else if(w>t.minTranslate())i.freeModeMomentumBounce?(w-t.minTranslate()>S&&(w=t.minTranslate()+S),y=t.minTranslate(),C=!0,a.allowMomentumBounce=!0):w=t.minTranslate(),i.loop&&i.centeredSlides&&(T=!0);else if(i.freeModeSticky){for(var M,z=0;z<o.length;z+=1)if(o[z]>-w){M=z;break}w=-(w=Math.abs(o[M]-w)<Math.abs(o[M-1]-w)||"next"===t.swipeDirection?o[M]:o[M-1])}if(T&&t.once("transitionEnd",(function(){t.loopFix()})),0!==t.velocity){if(g=r?Math.abs((-w-t.translate)/t.velocity):Math.abs((w-t.translate)/t.velocity),i.freeModeSticky){var P=Math.abs((r?-w:w)-t.translate),k=t.slidesSizesGrid[t.activeIndex];g=P<k?i.speed:P<2*k?1.5*i.speed:2.5*i.speed}}else if(i.freeModeSticky)return void t.slideToClosest();i.freeModeMomentumBounce&&C?(t.updateProgress(y),t.setTransition(g),t.setTranslate(w),t.transitionStart(!0,t.swipeDirection),t.animating=!0,n.transitionEnd((function(){t&&!t.destroyed&&a.allowMomentumBounce&&(t.emit("momentumBounce"),t.setTransition(i.speed),setTimeout((function(){t.setTranslate(y),n.transitionEnd((function(){t&&!t.destroyed&&t.transitionEnd()}))}),0))}))):t.velocity?(t.updateProgress(w),t.setTransition(g),t.setTranslate(w),t.transitionStart(!0,t.swipeDirection),t.animating||(t.animating=!0,n.transitionEnd((function(){t&&!t.destroyed&&t.transitionEnd()})))):(t.emit("_freeModeNoMomentumRelease"),t.updateProgress(w)),t.updateActiveIndex(),t.updateSlidesClasses()}else{if(i.freeModeSticky)return void t.slideToClosest();i.freeMode&&t.emit("_freeModeNoMomentumRelease")}(!i.freeModeMomentum||c>=i.longSwipesMs)&&(t.updateProgress(),t.updateActiveIndex(),t.updateSlidesClasses())}else{for(var $=0,L=t.slidesSizesGrid[0],I=0;I<l.length;I+=I<i.slidesPerGroupSkip?1:i.slidesPerGroup){var O=I<i.slidesPerGroupSkip-1?1:i.slidesPerGroup;void 0!==l[I+O]?p>=l[I]&&p<l[I+O]&&($=I,L=l[I+O]-l[I]):p>=l[I]&&($=I,L=l[l.length-1]-l[l.length-2])}var A=(p-l[$])/L,D=$<i.slidesPerGroupSkip-1?1:i.slidesPerGroup;if(c>i.longSwipesMs){if(!i.longSwipes)return void t.slideTo(t.activeIndex);"next"===t.swipeDirection&&(A>=i.longSwipesRatio?t.slideTo($+D):t.slideTo($)),"prev"===t.swipeDirection&&(A>1-i.longSwipesRatio?t.slideTo($+D):t.slideTo($))}else{if(!i.shortSwipes)return void t.slideTo(t.activeIndex);t.navigation&&(d.target===t.navigation.nextEl||d.target===t.navigation.prevEl)?d.target===t.navigation.nextEl?t.slideTo($+D):t.slideTo($):("next"===t.swipeDirection&&t.slideTo($+D),"prev"===t.swipeDirection&&t.slideTo($))}}}}function H(){var e=this,t=e.params,a=e.el;if(!a||0!==a.offsetWidth){t.breakpoints&&e.setBreakpoint();var i=e.allowSlideNext,s=e.allowSlidePrev,r=e.snapGrid;e.allowSlideNext=!0,e.allowSlidePrev=!0,e.updateSize(),e.updateSlides(),e.updateSlidesClasses(),("auto"===t.slidesPerView||t.slidesPerView>1)&&e.isEnd&&!e.isBeginning&&!e.params.centeredSlides?e.slideTo(e.slides.length-1,0,!1,!0):e.slideTo(e.activeIndex,0,!1,!0),e.autoplay&&e.autoplay.running&&e.autoplay.paused&&e.autoplay.run(),e.allowSlidePrev=s,e.allowSlideNext=i,e.params.watchOverflow&&r!==e.snapGrid&&e.checkOverflow()}}function R(e){var t=this;t.enabled&&(t.allowClick||(t.params.preventClicks&&e.preventDefault(),t.params.preventClicksPropagation&&t.animating&&(e.stopPropagation(),e.stopImmediatePropagation())))}function X(){var e=this,t=e.wrapperEl,a=e.rtlTranslate;if(e.enabled){e.previousTranslate=e.translate,e.isHorizontal()?e.translate=a?t.scrollWidth-t.offsetWidth-t.scrollLeft:-t.scrollLeft:e.translate=-t.scrollTop,-0===e.translate&&(e.translate=0),e.updateActiveIndex(),e.updateSlidesClasses();var i=e.maxTranslate()-e.minTranslate();(0===i?0:(e.translate-e.minTranslate())/i)!==e.progress&&e.updateProgress(a?-e.translate:e.translate),e.emit("setTranslate",e.translate,!1)}}var Y=!1;function V(){}var W={init:!0,direction:"horizontal",touchEventsTarget:"container",initialSlide:0,speed:300,cssMode:!1,updateOnWindowResize:!0,resizeObserver:!1,nested:!1,createElements:!1,enabled:!0,focusableElements:"input, select, option, textarea, button, video, label",width:null,height:null,preventInteractionOnTransition:!1,userAgent:null,url:null,edgeSwipeDetection:!1,edgeSwipeThreshold:20,freeMode:!1,freeModeMomentum:!0,freeModeMomentumRatio:1,freeModeMomentumBounce:!0,freeModeMomentumBounceRatio:1,freeModeMomentumVelocityRatio:1,freeModeSticky:!1,freeModeMinimumVelocity:.02,autoHeight:!1,setWrapperSize:!1,virtualTranslate:!1,effect:"slide",breakpoints:void 0,breakpointsBase:"window",spaceBetween:0,slidesPerView:1,slidesPerColumn:1,slidesPerColumnFill:"column",slidesPerGroup:1,slidesPerGroupSkip:0,centeredSlides:!1,centeredSlidesBounds:!1,slidesOffsetBefore:0,slidesOffsetAfter:0,normalizeSlideIndex:!0,centerInsufficientSlides:!1,watchOverflow:!1,roundLengths:!1,touchRatio:1,touchAngle:45,simulateTouch:!0,shortSwipes:!0,longSwipes:!0,longSwipesRatio:.5,longSwipesMs:300,followFinger:!0,allowTouchMove:!0,threshold:0,touchMoveStopPropagation:!1,touchStartPreventDefault:!0,touchStartForcePreventDefault:!1,touchReleaseOnEdges:!1,uniqueNavElements:!0,resistance:!0,resistanceRatio:.85,watchSlidesProgress:!1,watchSlidesVisibility:!1,grabCursor:!1,preventClicks:!0,preventClicksPropagation:!0,slideToClickedSlide:!1,preloadImages:!0,updateOnImagesReady:!0,loop:!1,loopAdditionalSlides:0,loopedSlides:null,loopFillGroupWithBlank:!1,loopPreventsSlide:!0,allowSlidePrev:!0,allowSlideNext:!0,swipeHandler:null,noSwiping:!0,noSwipingClass:"swiper-no-swiping",noSwipingSelector:null,passiveListeners:!0,containerModifierClass:"swiper-container-",slideClass:"swiper-slide",slideBlankClass:"swiper-slide-invisible-blank",slideActiveClass:"swiper-slide-active",slideDuplicateActiveClass:"swiper-slide-duplicate-active",slideVisibleClass:"swiper-slide-visible",slideDuplicateClass:"swiper-slide-duplicate",slideNextClass:"swiper-slide-next",slideDuplicateNextClass:"swiper-slide-duplicate-next",slidePrevClass:"swiper-slide-prev",slideDuplicatePrevClass:"swiper-slide-duplicate-prev",wrapperClass:"swiper-wrapper",runCallbacksOnInit:!0,_emitClasses:!1},F={modular:{useParams:function(e){var t=this;t.modules&&Object.keys(t.modules).forEach((function(a){var i=t.modules[a];i.params&&M(e,i.params)}))},useModules:function(e){void 0===e&&(e={});var t=this;t.modules&&Object.keys(t.modules).forEach((function(a){var i=t.modules[a],s=e[a]||{};i.on&&t.on&&Object.keys(i.on).forEach((function(e){t.on(e,i.on[e])})),i.create&&i.create.bind(t)(s)}))}},eventsEmitter:{on:function(e,t,a){var i=this;if("function"!=typeof t)return i;var s=a?"unshift":"push";return e.split(" ").forEach((function(e){i.eventsListeners[e]||(i.eventsListeners[e]=[]),i.eventsListeners[e][s](t)})),i},once:function(e,t,a){var i=this;if("function"!=typeof t)return i;function s(){i.off(e,s),s.__emitterProxy&&delete s.__emitterProxy;for(var a=arguments.length,r=new Array(a),n=0;n<a;n++)r[n]=arguments[n];t.apply(i,r)}return s.__emitterProxy=t,i.on(e,s,a)},onAny:function(e,t){var a=this;if("function"!=typeof e)return a;var i=t?"unshift":"push";return a.eventsAnyListeners.indexOf(e)<0&&a.eventsAnyListeners[i](e),a},offAny:function(e){var t=this;if(!t.eventsAnyListeners)return t;var a=t.eventsAnyListeners.indexOf(e);return a>=0&&t.eventsAnyListeners.splice(a,1),t},off:function(e,t){var a=this;return a.eventsListeners?(e.split(" ").forEach((function(e){void 0===t?a.eventsListeners[e]=[]:a.eventsListeners[e]&&a.eventsListeners[e].forEach((function(i,s){(i===t||i.__emitterProxy&&i.__emitterProxy===t)&&a.eventsListeners[e].splice(s,1)}))})),a):a},emit:function(){var e,t,a,i=this;if(!i.eventsListeners)return i;for(var s=arguments.length,r=new Array(s),n=0;n<s;n++)r[n]=arguments[n];"string"==typeof r[0]||Array.isArray(r[0])?(e=r[0],t=r.slice(1,r.length),a=i):(e=r[0].events,t=r[0].data,a=r[0].context||i),t.unshift(a);var l=Array.isArray(e)?e:e.split(" ");return l.forEach((function(e){i.eventsAnyListeners&&i.eventsAnyListeners.length&&i.eventsAnyListeners.forEach((function(i){i.apply(a,[e].concat(t))})),i.eventsListeners&&i.eventsListeners[e]&&i.eventsListeners[e].forEach((function(e){e.apply(a,t)}))})),i}},update:{updateSize:function(){var e,t,a=this,i=a.$el;e=void 0!==a.params.width&&null!==a.params.width?a.params.width:i[0].clientWidth,t=void 0!==a.params.height&&null!==a.params.height?a.params.height:i[0].clientHeight,0===e&&a.isHorizontal()||0===t&&a.isVertical()||(e=e-parseInt(i.css("padding-left")||0,10)-parseInt(i.css("padding-right")||0,10),t=t-parseInt(i.css("padding-top")||0,10)-parseInt(i.css("padding-bottom")||0,10),Number.isNaN(e)&&(e=0),Number.isNaN(t)&&(t=0),M(a,{width:e,height:t,size:a.isHorizontal()?e:t}))},updateSlides:function(){var e=this;function t(t){return e.isHorizontal()?t:{width:"height","margin-top":"margin-left","margin-bottom ":"margin-right","margin-left":"margin-top","margin-right":"margin-bottom","padding-left":"padding-top","padding-right":"padding-bottom",marginRight:"marginBottom"}[t]}function a(e,a){return parseFloat(e.getPropertyValue(t(a))||0)}var i=e.params,s=e.$wrapperEl,r=e.size,n=e.rtlTranslate,l=e.wrongRTL,o=e.virtual&&i.virtual.enabled,d=o?e.virtual.slides.length:e.slides.length,p=s.children("."+e.params.slideClass),u=o?e.virtual.slides.length:p.length,c=[],h=[],v=[],f=i.slidesOffsetBefore;"function"==typeof f&&(f=i.slidesOffsetBefore.call(e));var m=i.slidesOffsetAfter;"function"==typeof m&&(m=i.slidesOffsetAfter.call(e));var g=e.snapGrid.length,b=e.slidesGrid.length,w=i.spaceBetween,y=-f,E=0,x=0;if(void 0!==r){var T,C;"string"==typeof w&&w.indexOf("%")>=0&&(w=parseFloat(w.replace("%",""))/100*r),e.virtualSize=-w,n?p.css({marginLeft:"",marginBottom:"",marginTop:""}):p.css({marginRight:"",marginBottom:"",marginTop:""}),i.slidesPerColumn>1&&(T=Math.floor(u/i.slidesPerColumn)===u/e.params.slidesPerColumn?u:Math.ceil(u/i.slidesPerColumn)*i.slidesPerColumn,"auto"!==i.slidesPerView&&"row"===i.slidesPerColumnFill&&(T=Math.max(T,i.slidesPerView*i.slidesPerColumn)));for(var S,z,P,k=i.slidesPerColumn,$=T/k,L=Math.floor(u/i.slidesPerColumn),I=0;I<u;I+=1){C=0;var O=p.eq(I);if(i.slidesPerColumn>1){var A=void 0,D=void 0,N=void 0;if("row"===i.slidesPerColumnFill&&i.slidesPerGroup>1){var G=Math.floor(I/(i.slidesPerGroup*i.slidesPerColumn)),B=I-i.slidesPerColumn*i.slidesPerGroup*G,H=0===G?i.slidesPerGroup:Math.min(Math.ceil((u-G*k*i.slidesPerGroup)/k),i.slidesPerGroup);A=(D=B-(N=Math.floor(B/H))*H+G*i.slidesPerGroup)+N*T/k,O.css({"-webkit-box-ordinal-group":A,"-moz-box-ordinal-group":A,"-ms-flex-order":A,"-webkit-order":A,order:A})}else"column"===i.slidesPerColumnFill?(N=I-(D=Math.floor(I/k))*k,(D>L||D===L&&N===k-1)&&(N+=1)>=k&&(N=0,D+=1)):D=I-(N=Math.floor(I/$))*$;O.css(t("margin-top"),0!==N?i.spaceBetween&&i.spaceBetween+"px":"")}if("none"!==O.css("display")){if("auto"===i.slidesPerView){var R=getComputedStyle(O[0]),X=O[0].style.transform,Y=O[0].style.webkitTransform;if(X&&(O[0].style.transform="none"),Y&&(O[0].style.webkitTransform="none"),i.roundLengths)C=e.isHorizontal()?O.outerWidth(!0):O.outerHeight(!0);else{var V=a(R,"width"),W=a(R,"padding-left"),F=a(R,"padding-right"),_=a(R,"margin-left"),q=a(R,"margin-right"),j=R.getPropertyValue("box-sizing");if(j&&"border-box"===j)C=V+_+q;else{var U=O[0],K=U.clientWidth;C=V+W+F+_+q+(U.offsetWidth-K)}}X&&(O[0].style.transform=X),Y&&(O[0].style.webkitTransform=Y),i.roundLengths&&(C=Math.floor(C))}else C=(r-(i.slidesPerView-1)*w)/i.slidesPerView,i.roundLengths&&(C=Math.floor(C)),p[I]&&(p[I].style[t("width")]=C+"px");p[I]&&(p[I].swiperSlideSize=C),v.push(C),i.centeredSlides?(y=y+C/2+E/2+w,0===E&&0!==I&&(y=y-r/2-w),0===I&&(y=y-r/2-w),Math.abs(y)<.001&&(y=0),i.roundLengths&&(y=Math.floor(y)),x%i.slidesPerGroup==0&&c.push(y),h.push(y)):(i.roundLengths&&(y=Math.floor(y)),(x-Math.min(e.params.slidesPerGroupSkip,x))%e.params.slidesPerGroup==0&&c.push(y),h.push(y),y=y+C+w),e.virtualSize+=C+w,E=C,x+=1}}if(e.virtualSize=Math.max(e.virtualSize,r)+m,n&&l&&("slide"===i.effect||"coverflow"===i.effect)&&s.css({width:e.virtualSize+i.spaceBetween+"px"}),i.setWrapperSize)s.css(((z={})[t("width")]=e.virtualSize+i.spaceBetween+"px",z));if(i.slidesPerColumn>1)if(e.virtualSize=(C+i.spaceBetween)*T,e.virtualSize=Math.ceil(e.virtualSize/i.slidesPerColumn)-i.spaceBetween,s.css(((P={})[t("width")]=e.virtualSize+i.spaceBetween+"px",P)),i.centeredSlides){S=[];for(var Z=0;Z<c.length;Z+=1){var J=c[Z];i.roundLengths&&(J=Math.floor(J)),c[Z]<e.virtualSize+c[0]&&S.push(J)}c=S}if(!i.centeredSlides){S=[];for(var Q=0;Q<c.length;Q+=1){var ee=c[Q];i.roundLengths&&(ee=Math.floor(ee)),c[Q]<=e.virtualSize-r&&S.push(ee)}c=S,Math.floor(e.virtualSize-r)-Math.floor(c[c.length-1])>1&&c.push(e.virtualSize-r)}if(0===c.length&&(c=[0]),0!==i.spaceBetween){var te,ae=e.isHorizontal()&&n?"marginLeft":t("marginRight");p.filter((function(e,t){return!i.cssMode||t!==p.length-1})).css(((te={})[ae]=w+"px",te))}if(i.centeredSlides&&i.centeredSlidesBounds){var ie=0;v.forEach((function(e){ie+=e+(i.spaceBetween?i.spaceBetween:0)}));var se=(ie-=i.spaceBetween)-r;c=c.map((function(e){return e<0?-f:e>se?se+m:e}))}if(i.centerInsufficientSlides){var re=0;if(v.forEach((function(e){re+=e+(i.spaceBetween?i.spaceBetween:0)})),(re-=i.spaceBetween)<r){var ne=(r-re)/2;c.forEach((function(e,t){c[t]=e-ne})),h.forEach((function(e,t){h[t]=e+ne}))}}M(e,{slides:p,snapGrid:c,slidesGrid:h,slidesSizesGrid:v}),u!==d&&e.emit("slidesLengthChange"),c.length!==g&&(e.params.watchOverflow&&e.checkOverflow(),e.emit("snapGridLengthChange")),h.length!==b&&e.emit("slidesGridLengthChange"),(i.watchSlidesProgress||i.watchSlidesVisibility)&&e.updateSlidesOffset()}},updateAutoHeight:function(e){var t,a=this,i=[],s=a.virtual&&a.params.virtual.enabled,r=0;"number"==typeof e?a.setTransition(e):!0===e&&a.setTransition(a.params.speed);var n=function(e){return s?a.slides.filter((function(t){return parseInt(t.getAttribute("data-swiper-slide-index"),10)===e}))[0]:a.slides.eq(e)[0]};if("auto"!==a.params.slidesPerView&&a.params.slidesPerView>1)if(a.params.centeredSlides)a.visibleSlides.each((function(e){i.push(e)}));else for(t=0;t<Math.ceil(a.params.slidesPerView);t+=1){var l=a.activeIndex+t;if(l>a.slides.length&&!s)break;i.push(n(l))}else i.push(n(a.activeIndex));for(t=0;t<i.length;t+=1)if(void 0!==i[t]){var o=i[t].offsetHeight;r=o>r?o:r}r&&a.$wrapperEl.css("height",r+"px")},updateSlidesOffset:function(){for(var e=this.slides,t=0;t<e.length;t+=1)e[t].swiperSlideOffset=this.isHorizontal()?e[t].offsetLeft:e[t].offsetTop},updateSlidesProgress:function(e){void 0===e&&(e=this&&this.translate||0);var t=this,a=t.params,i=t.slides,s=t.rtlTranslate;if(0!==i.length){void 0===i[0].swiperSlideOffset&&t.updateSlidesOffset();var r=-e;s&&(r=e),i.removeClass(a.slideVisibleClass),t.visibleSlidesIndexes=[],t.visibleSlides=[];for(var n=0;n<i.length;n+=1){var l=i[n],o=(r+(a.centeredSlides?t.minTranslate():0)-l.swiperSlideOffset)/(l.swiperSlideSize+a.spaceBetween);if(a.watchSlidesVisibility||a.centeredSlides&&a.autoHeight){var d=-(r-l.swiperSlideOffset),p=d+t.slidesSizesGrid[n];(d>=0&&d<t.size-1||p>1&&p<=t.size||d<=0&&p>=t.size)&&(t.visibleSlides.push(l),t.visibleSlidesIndexes.push(n),i.eq(n).addClass(a.slideVisibleClass))}l.progress=s?-o:o}t.visibleSlides=m(t.visibleSlides)}},updateProgress:function(e){var t=this;if(void 0===e){var a=t.rtlTranslate?-1:1;e=t&&t.translate&&t.translate*a||0}var i=t.params,s=t.maxTranslate()-t.minTranslate(),r=t.progress,n=t.isBeginning,l=t.isEnd,o=n,d=l;0===s?(r=0,n=!0,l=!0):(n=(r=(e-t.minTranslate())/s)<=0,l=r>=1),M(t,{progress:r,isBeginning:n,isEnd:l}),(i.watchSlidesProgress||i.watchSlidesVisibility||i.centeredSlides&&i.autoHeight)&&t.updateSlidesProgress(e),n&&!o&&t.emit("reachBeginning toEdge"),l&&!d&&t.emit("reachEnd toEdge"),(o&&!n||d&&!l)&&t.emit("fromEdge"),t.emit("progress",r)},updateSlidesClasses:function(){var e,t=this,a=t.slides,i=t.params,s=t.$wrapperEl,r=t.activeIndex,n=t.realIndex,l=t.virtual&&i.virtual.enabled;a.removeClass(i.slideActiveClass+" "+i.slideNextClass+" "+i.slidePrevClass+" "+i.slideDuplicateActiveClass+" "+i.slideDuplicateNextClass+" "+i.slideDuplicatePrevClass),(e=l?t.$wrapperEl.find("."+i.slideClass+'[data-swiper-slide-index="'+r+'"]'):a.eq(r)).addClass(i.slideActiveClass),i.loop&&(e.hasClass(i.slideDuplicateClass)?s.children("."+i.slideClass+":not(."+i.slideDuplicateClass+')[data-swiper-slide-index="'+n+'"]').addClass(i.slideDuplicateActiveClass):s.children("."+i.slideClass+"."+i.slideDuplicateClass+'[data-swiper-slide-index="'+n+'"]').addClass(i.slideDuplicateActiveClass));var o=e.nextAll("."+i.slideClass).eq(0).addClass(i.slideNextClass);i.loop&&0===o.length&&(o=a.eq(0)).addClass(i.slideNextClass);var d=e.prevAll("."+i.slideClass).eq(0).addClass(i.slidePrevClass);i.loop&&0===d.length&&(d=a.eq(-1)).addClass(i.slidePrevClass),i.loop&&(o.hasClass(i.slideDuplicateClass)?s.children("."+i.slideClass+":not(."+i.slideDuplicateClass+')[data-swiper-slide-index="'+o.attr("data-swiper-slide-index")+'"]').addClass(i.slideDuplicateNextClass):s.children("."+i.slideClass+"."+i.slideDuplicateClass+'[data-swiper-slide-index="'+o.attr("data-swiper-slide-index")+'"]').addClass(i.slideDuplicateNextClass),d.hasClass(i.slideDuplicateClass)?s.children("."+i.slideClass+":not(."+i.slideDuplicateClass+')[data-swiper-slide-index="'+d.attr("data-swiper-slide-index")+'"]').addClass(i.slideDuplicatePrevClass):s.children("."+i.slideClass+"."+i.slideDuplicateClass+'[data-swiper-slide-index="'+d.attr("data-swiper-slide-index")+'"]').addClass(i.slideDuplicatePrevClass)),t.emitSlidesClasses()},updateActiveIndex:function(e){var t,a=this,i=a.rtlTranslate?a.translate:-a.translate,s=a.slidesGrid,r=a.snapGrid,n=a.params,l=a.activeIndex,o=a.realIndex,d=a.snapIndex,p=e;if(void 0===p){for(var u=0;u<s.length;u+=1)void 0!==s[u+1]?i>=s[u]&&i<s[u+1]-(s[u+1]-s[u])/2?p=u:i>=s[u]&&i<s[u+1]&&(p=u+1):i>=s[u]&&(p=u);n.normalizeSlideIndex&&(p<0||void 0===p)&&(p=0)}if(r.indexOf(i)>=0)t=r.indexOf(i);else{var c=Math.min(n.slidesPerGroupSkip,p);t=c+Math.floor((p-c)/n.slidesPerGroup)}if(t>=r.length&&(t=r.length-1),p!==l){var h=parseInt(a.slides.eq(p).attr("data-swiper-slide-index")||p,10);M(a,{snapIndex:t,realIndex:h,previousIndex:l,activeIndex:p}),a.emit("activeIndexChange"),a.emit("snapIndexChange"),o!==h&&a.emit("realIndexChange"),(a.initialized||a.params.runCallbacksOnInit)&&a.emit("slideChange")}else t!==d&&(a.snapIndex=t,a.emit("snapIndexChange"))},updateClickedSlide:function(e){var t,a=this,i=a.params,s=m(e.target).closest("."+i.slideClass)[0],r=!1;if(s)for(var n=0;n<a.slides.length;n+=1)if(a.slides[n]===s){r=!0,t=n;break}if(!s||!r)return a.clickedSlide=void 0,void(a.clickedIndex=void 0);a.clickedSlide=s,a.virtual&&a.params.virtual.enabled?a.clickedIndex=parseInt(m(s).attr("data-swiper-slide-index"),10):a.clickedIndex=t,i.slideToClickedSlide&&void 0!==a.clickedIndex&&a.clickedIndex!==a.activeIndex&&a.slideToClickedSlide()}},translate:{getTranslate:function(e){void 0===e&&(e=this.isHorizontal()?"x":"y");var t=this,a=t.params,i=t.rtlTranslate,s=t.translate,r=t.$wrapperEl;if(a.virtualTranslate)return i?-s:s;if(a.cssMode)return s;var n=T(r[0],e);return i&&(n=-n),n||0},setTranslate:function(e,t){var a=this,i=a.rtlTranslate,s=a.params,r=a.$wrapperEl,n=a.wrapperEl,l=a.progress,o=0,d=0;a.isHorizontal()?o=i?-e:e:d=e,s.roundLengths&&(o=Math.floor(o),d=Math.floor(d)),s.cssMode?n[a.isHorizontal()?"scrollLeft":"scrollTop"]=a.isHorizontal()?-o:-d:s.virtualTranslate||r.transform("translate3d("+o+"px, "+d+"px, 0px)"),a.previousTranslate=a.translate,a.translate=a.isHorizontal()?o:d;var p=a.maxTranslate()-a.minTranslate();(0===p?0:(e-a.minTranslate())/p)!==l&&a.updateProgress(e),a.emit("setTranslate",a.translate,t)},minTranslate:function(){return-this.snapGrid[0]},maxTranslate:function(){return-this.snapGrid[this.snapGrid.length-1]},translateTo:function(e,t,a,i,s){void 0===e&&(e=0),void 0===t&&(t=this.params.speed),void 0===a&&(a=!0),void 0===i&&(i=!0);var r=this,n=r.params,l=r.wrapperEl;if(r.animating&&n.preventInteractionOnTransition)return!1;var o,d=r.minTranslate(),p=r.maxTranslate();if(o=i&&e>d?d:i&&e<p?p:e,r.updateProgress(o),n.cssMode){var u,c=r.isHorizontal();if(0===t)l[c?"scrollLeft":"scrollTop"]=-o;else if(l.scrollTo)l.scrollTo(((u={})[c?"left":"top"]=-o,u.behavior="smooth",u));else l[c?"scrollLeft":"scrollTop"]=-o;return!0}return 0===t?(r.setTransition(0),r.setTranslate(o),a&&(r.emit("beforeTransitionStart",t,s),r.emit("transitionEnd"))):(r.setTransition(t),r.setTranslate(o),a&&(r.emit("beforeTransitionStart",t,s),r.emit("transitionStart")),r.animating||(r.animating=!0,r.onTranslateToWrapperTransitionEnd||(r.onTranslateToWrapperTransitionEnd=function(e){r&&!r.destroyed&&e.target===this&&(r.$wrapperEl[0].removeEventListener("transitionend",r.onTranslateToWrapperTransitionEnd),r.$wrapperEl[0].removeEventListener("webkitTransitionEnd",r.onTranslateToWrapperTransitionEnd),r.onTranslateToWrapperTransitionEnd=null,delete r.onTranslateToWrapperTransitionEnd,a&&r.emit("transitionEnd"))}),r.$wrapperEl[0].addEventListener("transitionend",r.onTranslateToWrapperTransitionEnd),r.$wrapperEl[0].addEventListener("webkitTransitionEnd",r.onTranslateToWrapperTransitionEnd))),!0}},transition:{setTransition:function(e,t){var a=this;a.params.cssMode||a.$wrapperEl.transition(e),a.emit("setTransition",e,t)},transitionStart:function(e,t){void 0===e&&(e=!0);var a=this,i=a.activeIndex,s=a.params,r=a.previousIndex;if(!s.cssMode){s.autoHeight&&a.updateAutoHeight();var n=t;if(n||(n=i>r?"next":i<r?"prev":"reset"),a.emit("transitionStart"),e&&i!==r){if("reset"===n)return void a.emit("slideResetTransitionStart");a.emit("slideChangeTransitionStart"),"next"===n?a.emit("slideNextTransitionStart"):a.emit("slidePrevTransitionStart")}}},transitionEnd:function(e,t){void 0===e&&(e=!0);var a=this,i=a.activeIndex,s=a.previousIndex,r=a.params;if(a.animating=!1,!r.cssMode){a.setTransition(0);var n=t;if(n||(n=i>s?"next":i<s?"prev":"reset"),a.emit("transitionEnd"),e&&i!==s){if("reset"===n)return void a.emit("slideResetTransitionEnd");a.emit("slideChangeTransitionEnd"),"next"===n?a.emit("slideNextTransitionEnd"):a.emit("slidePrevTransitionEnd")}}}},slide:{slideTo:function(e,t,a,i,s){if(void 0===e&&(e=0),void 0===t&&(t=this.params.speed),void 0===a&&(a=!0),"number"!=typeof e&&"string"!=typeof e)throw new Error("The 'index' argument cannot have type other than 'number' or 'string'. ["+typeof e+"] given.");if("string"==typeof e){var r=parseInt(e,10);if(!isFinite(r))throw new Error("The passed-in 'index' (string) couldn't be converted to 'number'. ["+e+"] given.");e=r}var n=this,l=e;l<0&&(l=0);var o=n.params,d=n.snapGrid,p=n.slidesGrid,u=n.previousIndex,c=n.activeIndex,h=n.rtlTranslate,v=n.wrapperEl,f=n.enabled;if(n.animating&&o.preventInteractionOnTransition||!f&&!i&&!s)return!1;var m=Math.min(n.params.slidesPerGroupSkip,l),g=m+Math.floor((l-m)/n.params.slidesPerGroup);g>=d.length&&(g=d.length-1),(c||o.initialSlide||0)===(u||0)&&a&&n.emit("beforeSlideChangeStart");var b,w=-d[g];if(n.updateProgress(w),o.normalizeSlideIndex)for(var y=0;y<p.length;y+=1){var E=-Math.floor(100*w),x=Math.floor(100*p[y]),T=Math.floor(100*p[y+1]);void 0!==p[y+1]?E>=x&&E<T-(T-x)/2?l=y:E>=x&&E<T&&(l=y+1):E>=x&&(l=y)}if(n.initialized&&l!==c){if(!n.allowSlideNext&&w<n.translate&&w<n.minTranslate())return!1;if(!n.allowSlidePrev&&w>n.translate&&w>n.maxTranslate()&&(c||0)!==l)return!1}if(b=l>c?"next":l<c?"prev":"reset",h&&-w===n.translate||!h&&w===n.translate)return n.updateActiveIndex(l),o.autoHeight&&n.updateAutoHeight(),n.updateSlidesClasses(),"slide"!==o.effect&&n.setTranslate(w),"reset"!==b&&(n.transitionStart(a,b),n.transitionEnd(a,b)),!1;if(o.cssMode){var C,S=n.isHorizontal(),M=-w;if(h&&(M=v.scrollWidth-v.offsetWidth-M),0===t)v[S?"scrollLeft":"scrollTop"]=M;else if(v.scrollTo)v.scrollTo(((C={})[S?"left":"top"]=M,C.behavior="smooth",C));else v[S?"scrollLeft":"scrollTop"]=M;return!0}return 0===t?(n.setTransition(0),n.setTranslate(w),n.updateActiveIndex(l),n.updateSlidesClasses(),n.emit("beforeTransitionStart",t,i),n.transitionStart(a,b),n.transitionEnd(a,b)):(n.setTransition(t),n.setTranslate(w),n.updateActiveIndex(l),n.updateSlidesClasses(),n.emit("beforeTransitionStart",t,i),n.transitionStart(a,b),n.animating||(n.animating=!0,n.onSlideToWrapperTransitionEnd||(n.onSlideToWrapperTransitionEnd=function(e){n&&!n.destroyed&&e.target===this&&(n.$wrapperEl[0].removeEventListener("transitionend",n.onSlideToWrapperTransitionEnd),n.$wrapperEl[0].removeEventListener("webkitTransitionEnd",n.onSlideToWrapperTransitionEnd),n.onSlideToWrapperTransitionEnd=null,delete n.onSlideToWrapperTransitionEnd,n.transitionEnd(a,b))}),n.$wrapperEl[0].addEventListener("transitionend",n.onSlideToWrapperTransitionEnd),n.$wrapperEl[0].addEventListener("webkitTransitionEnd",n.onSlideToWrapperTransitionEnd))),!0},slideToLoop:function(e,t,a,i){void 0===e&&(e=0),void 0===t&&(t=this.params.speed),void 0===a&&(a=!0);var s=this,r=e;return s.params.loop&&(r+=s.loopedSlides),s.slideTo(r,t,a,i)},slideNext:function(e,t,a){void 0===e&&(e=this.params.speed),void 0===t&&(t=!0);var i=this,s=i.params,r=i.animating;if(!i.enabled)return i;var n=i.activeIndex<s.slidesPerGroupSkip?1:s.slidesPerGroup;if(s.loop){if(r&&s.loopPreventsSlide)return!1;i.loopFix(),i._clientLeft=i.$wrapperEl[0].clientLeft}return i.slideTo(i.activeIndex+n,e,t,a)},slidePrev:function(e,t,a){void 0===e&&(e=this.params.speed),void 0===t&&(t=!0);var i=this,s=i.params,r=i.animating,n=i.snapGrid,l=i.slidesGrid,o=i.rtlTranslate;if(!i.enabled)return i;if(s.loop){if(r&&s.loopPreventsSlide)return!1;i.loopFix(),i._clientLeft=i.$wrapperEl[0].clientLeft}function d(e){return e<0?-Math.floor(Math.abs(e)):Math.floor(e)}var p,u=d(o?i.translate:-i.translate),c=n.map((function(e){return d(e)})),h=n[c.indexOf(u)-1];return void 0===h&&s.cssMode&&n.forEach((function(e){!h&&u>=e&&(h=e)})),void 0!==h&&(p=l.indexOf(h))<0&&(p=i.activeIndex-1),i.slideTo(p,e,t,a)},slideReset:function(e,t,a){return void 0===e&&(e=this.params.speed),void 0===t&&(t=!0),this.slideTo(this.activeIndex,e,t,a)},slideToClosest:function(e,t,a,i){void 0===e&&(e=this.params.speed),void 0===t&&(t=!0),void 0===i&&(i=.5);var s=this,r=s.activeIndex,n=Math.min(s.params.slidesPerGroupSkip,r),l=n+Math.floor((r-n)/s.params.slidesPerGroup),o=s.rtlTranslate?s.translate:-s.translate;if(o>=s.snapGrid[l]){var d=s.snapGrid[l];o-d>(s.snapGrid[l+1]-d)*i&&(r+=s.params.slidesPerGroup)}else{var p=s.snapGrid[l-1];o-p<=(s.snapGrid[l]-p)*i&&(r-=s.params.slidesPerGroup)}return r=Math.max(r,0),r=Math.min(r,s.slidesGrid.length-1),s.slideTo(r,e,t,a)},slideToClickedSlide:function(){var e,t=this,a=t.params,i=t.$wrapperEl,s="auto"===a.slidesPerView?t.slidesPerViewDynamic():a.slidesPerView,r=t.clickedIndex;if(a.loop){if(t.animating)return;e=parseInt(m(t.clickedSlide).attr("data-swiper-slide-index"),10),a.centeredSlides?r<t.loopedSlides-s/2||r>t.slides.length-t.loopedSlides+s/2?(t.loopFix(),r=i.children("."+a.slideClass+'[data-swiper-slide-index="'+e+'"]:not(.'+a.slideDuplicateClass+")").eq(0).index(),E((function(){t.slideTo(r)}))):t.slideTo(r):r>t.slides.length-s?(t.loopFix(),r=i.children("."+a.slideClass+'[data-swiper-slide-index="'+e+'"]:not(.'+a.slideDuplicateClass+")").eq(0).index(),E((function(){t.slideTo(r)}))):t.slideTo(r)}else t.slideTo(r)}},loop:{loopCreate:function(){var e=this,t=r(),a=e.params,i=e.$wrapperEl;i.children("."+a.slideClass+"."+a.slideDuplicateClass).remove();var s=i.children("."+a.slideClass);if(a.loopFillGroupWithBlank){var n=a.slidesPerGroup-s.length%a.slidesPerGroup;if(n!==a.slidesPerGroup){for(var l=0;l<n;l+=1){var o=m(t.createElement("div")).addClass(a.slideClass+" "+a.slideBlankClass);i.append(o)}s=i.children("."+a.slideClass)}}"auto"!==a.slidesPerView||a.loopedSlides||(a.loopedSlides=s.length),e.loopedSlides=Math.ceil(parseFloat(a.loopedSlides||a.slidesPerView,10)),e.loopedSlides+=a.loopAdditionalSlides,e.loopedSlides>s.length&&(e.loopedSlides=s.length);var d=[],p=[];s.each((function(t,a){var i=m(t);a<e.loopedSlides&&p.push(t),a<s.length&&a>=s.length-e.loopedSlides&&d.push(t),i.attr("data-swiper-slide-index",a)}));for(var u=0;u<p.length;u+=1)i.append(m(p[u].cloneNode(!0)).addClass(a.slideDuplicateClass));for(var c=d.length-1;c>=0;c-=1)i.prepend(m(d[c].cloneNode(!0)).addClass(a.slideDuplicateClass))},loopFix:function(){var e=this;e.emit("beforeLoopFix");var t,a=e.activeIndex,i=e.slides,s=e.loopedSlides,r=e.allowSlidePrev,n=e.allowSlideNext,l=e.snapGrid,o=e.rtlTranslate;e.allowSlidePrev=!0,e.allowSlideNext=!0;var d=-l[a]-e.getTranslate();if(a<s)t=i.length-3*s+a,t+=s,e.slideTo(t,0,!1,!0)&&0!==d&&e.setTranslate((o?-e.translate:e.translate)-d);else if(a>=i.length-s){t=-i.length+a+s,t+=s,e.slideTo(t,0,!1,!0)&&0!==d&&e.setTranslate((o?-e.translate:e.translate)-d)}e.allowSlidePrev=r,e.allowSlideNext=n,e.emit("loopFix")},loopDestroy:function(){var e=this,t=e.$wrapperEl,a=e.params,i=e.slides;t.children("."+a.slideClass+"."+a.slideDuplicateClass+",."+a.slideClass+"."+a.slideBlankClass).remove(),i.removeAttr("data-swiper-slide-index")}},grabCursor:{setGrabCursor:function(e){var t=this;if(!(t.support.touch||!t.params.simulateTouch||t.params.watchOverflow&&t.isLocked||t.params.cssMode)){var a=t.el;a.style.cursor="move",a.style.cursor=e?"-webkit-grabbing":"-webkit-grab",a.style.cursor=e?"-moz-grabbin":"-moz-grab",a.style.cursor=e?"grabbing":"grab"}},unsetGrabCursor:function(){var e=this;e.support.touch||e.params.watchOverflow&&e.isLocked||e.params.cssMode||(e.el.style.cursor="")}},manipulation:{appendSlide:function(e){var t=this,a=t.$wrapperEl,i=t.params;if(i.loop&&t.loopDestroy(),"object"==typeof e&&"length"in e)for(var s=0;s<e.length;s+=1)e[s]&&a.append(e[s]);else a.append(e);i.loop&&t.loopCreate(),i.observer&&t.support.observer||t.update()},prependSlide:function(e){var t=this,a=t.params,i=t.$wrapperEl,s=t.activeIndex;a.loop&&t.loopDestroy();var r=s+1;if("object"==typeof e&&"length"in e){for(var n=0;n<e.length;n+=1)e[n]&&i.prepend(e[n]);r=s+e.length}else i.prepend(e);a.loop&&t.loopCreate(),a.observer&&t.support.observer||t.update(),t.slideTo(r,0,!1)},addSlide:function(e,t){var a=this,i=a.$wrapperEl,s=a.params,r=a.activeIndex;s.loop&&(r-=a.loopedSlides,a.loopDestroy(),a.slides=i.children("."+s.slideClass));var n=a.slides.length;if(e<=0)a.prependSlide(t);else if(e>=n)a.appendSlide(t);else{for(var l=r>e?r+1:r,o=[],d=n-1;d>=e;d-=1){var p=a.slides.eq(d);p.remove(),o.unshift(p)}if("object"==typeof t&&"length"in t){for(var u=0;u<t.length;u+=1)t[u]&&i.append(t[u]);l=r>e?r+t.length:r}else i.append(t);for(var c=0;c<o.length;c+=1)i.append(o[c]);s.loop&&a.loopCreate(),s.observer&&a.support.observer||a.update(),s.loop?a.slideTo(l+a.loopedSlides,0,!1):a.slideTo(l,0,!1)}},removeSlide:function(e){var t=this,a=t.params,i=t.$wrapperEl,s=t.activeIndex;a.loop&&(s-=t.loopedSlides,t.loopDestroy(),t.slides=i.children("."+a.slideClass));var r,n=s;if("object"==typeof e&&"length"in e){for(var l=0;l<e.length;l+=1)r=e[l],t.slides[r]&&t.slides.eq(r).remove(),r<n&&(n-=1);n=Math.max(n,0)}else r=e,t.slides[r]&&t.slides.eq(r).remove(),r<n&&(n-=1),n=Math.max(n,0);a.loop&&t.loopCreate(),a.observer&&t.support.observer||t.update(),a.loop?t.slideTo(n+t.loopedSlides,0,!1):t.slideTo(n,0,!1)},removeAllSlides:function(){for(var e=[],t=0;t<this.slides.length;t+=1)e.push(t);this.removeSlide(e)}},events:{attachEvents:function(){var e=this,t=r(),a=e.params,i=e.touchEvents,s=e.el,n=e.wrapperEl,l=e.device,o=e.support;e.onTouchStart=N.bind(e),e.onTouchMove=G.bind(e),e.onTouchEnd=B.bind(e),a.cssMode&&(e.onScroll=X.bind(e)),e.onClick=R.bind(e);var d=!!a.nested;if(!o.touch&&o.pointerEvents)s.addEventListener(i.start,e.onTouchStart,!1),t.addEventListener(i.move,e.onTouchMove,d),t.addEventListener(i.end,e.onTouchEnd,!1);else{if(o.touch){var p=!("touchstart"!==i.start||!o.passiveListener||!a.passiveListeners)&&{passive:!0,capture:!1};s.addEventListener(i.start,e.onTouchStart,p),s.addEventListener(i.move,e.onTouchMove,o.passiveListener?{passive:!1,capture:d}:d),s.addEventListener(i.end,e.onTouchEnd,p),i.cancel&&s.addEventListener(i.cancel,e.onTouchEnd,p),Y||(t.addEventListener("touchstart",V),Y=!0)}(a.simulateTouch&&!l.ios&&!l.android||a.simulateTouch&&!o.touch&&l.ios)&&(s.addEventListener("mousedown",e.onTouchStart,!1),t.addEventListener("mousemove",e.onTouchMove,d),t.addEventListener("mouseup",e.onTouchEnd,!1))}(a.preventClicks||a.preventClicksPropagation)&&s.addEventListener("click",e.onClick,!0),a.cssMode&&n.addEventListener("scroll",e.onScroll),a.updateOnWindowResize?e.on(l.ios||l.android?"resize orientationchange observerUpdate":"resize observerUpdate",H,!0):e.on("observerUpdate",H,!0)},detachEvents:function(){var e=this,t=r(),a=e.params,i=e.touchEvents,s=e.el,n=e.wrapperEl,l=e.device,o=e.support,d=!!a.nested;if(!o.touch&&o.pointerEvents)s.removeEventListener(i.start,e.onTouchStart,!1),t.removeEventListener(i.move,e.onTouchMove,d),t.removeEventListener(i.end,e.onTouchEnd,!1);else{if(o.touch){var p=!("onTouchStart"!==i.start||!o.passiveListener||!a.passiveListeners)&&{passive:!0,capture:!1};s.removeEventListener(i.start,e.onTouchStart,p),s.removeEventListener(i.move,e.onTouchMove,d),s.removeEventListener(i.end,e.onTouchEnd,p),i.cancel&&s.removeEventListener(i.cancel,e.onTouchEnd,p)}(a.simulateTouch&&!l.ios&&!l.android||a.simulateTouch&&!o.touch&&l.ios)&&(s.removeEventListener("mousedown",e.onTouchStart,!1),t.removeEventListener("mousemove",e.onTouchMove,d),t.removeEventListener("mouseup",e.onTouchEnd,!1))}(a.preventClicks||a.preventClicksPropagation)&&s.removeEventListener("click",e.onClick,!0),a.cssMode&&n.removeEventListener("scroll",e.onScroll),e.off(l.ios||l.android?"resize orientationchange observerUpdate":"resize observerUpdate",H)}},breakpoints:{setBreakpoint:function(){var e=this,t=e.activeIndex,a=e.initialized,i=e.loopedSlides,s=void 0===i?0:i,r=e.params,n=e.$el,l=r.breakpoints;if(l&&(!l||0!==Object.keys(l).length)){var o=e.getBreakpoint(l,e.params.breakpointsBase,e.el);if(o&&e.currentBreakpoint!==o){var d=o in l?l[o]:void 0;d&&["slidesPerView","spaceBetween","slidesPerGroup","slidesPerGroupSkip","slidesPerColumn"].forEach((function(e){var t=d[e];void 0!==t&&(d[e]="slidesPerView"!==e||"AUTO"!==t&&"auto"!==t?"slidesPerView"===e?parseFloat(t):parseInt(t,10):"auto")}));var p=d||e.originalParams,u=r.slidesPerColumn>1,c=p.slidesPerColumn>1,h=r.enabled;u&&!c?(n.removeClass(r.containerModifierClass+"multirow "+r.containerModifierClass+"multirow-column"),e.emitContainerClasses()):!u&&c&&(n.addClass(r.containerModifierClass+"multirow"),(p.slidesPerColumnFill&&"column"===p.slidesPerColumnFill||!p.slidesPerColumnFill&&"column"===r.slidesPerColumnFill)&&n.addClass(r.containerModifierClass+"multirow-column"),e.emitContainerClasses());var v=p.direction&&p.direction!==r.direction,f=r.loop&&(p.slidesPerView!==r.slidesPerView||v);v&&a&&e.changeDirection(),M(e.params,p);var m=e.params.enabled;M(e,{allowTouchMove:e.params.allowTouchMove,allowSlideNext:e.params.allowSlideNext,allowSlidePrev:e.params.allowSlidePrev}),h&&!m?e.disable():!h&&m&&e.enable(),e.currentBreakpoint=o,e.emit("_beforeBreakpoint",p),f&&a&&(e.loopDestroy(),e.loopCreate(),e.updateSlides(),e.slideTo(t-s+e.loopedSlides,0,!1)),e.emit("breakpoint",p)}}},getBreakpoint:function(e,t,a){if(void 0===t&&(t="window"),e&&("container"!==t||a)){var i=!1,s=l(),r="window"===t?s.innerHeight:a.clientHeight,n=Object.keys(e).map((function(e){if("string"==typeof e&&0===e.indexOf("@")){var t=parseFloat(e.substr(1));return{value:r*t,point:e}}return{value:e,point:e}}));n.sort((function(e,t){return parseInt(e.value,10)-parseInt(t.value,10)}));for(var o=0;o<n.length;o+=1){var d=n[o],p=d.point,u=d.value;"window"===t?s.matchMedia("(min-width: "+u+"px)").matches&&(i=p):u<=a.clientWidth&&(i=p)}return i||"max"}}},checkOverflow:{checkOverflow:function(){var e=this,t=e.params,a=e.isLocked,i=e.slides.length>0&&t.slidesOffsetBefore+t.spaceBetween*(e.slides.length-1)+e.slides[0].offsetWidth*e.slides.length;t.slidesOffsetBefore&&t.slidesOffsetAfter&&i?e.isLocked=i<=e.size:e.isLocked=1===e.snapGrid.length,e.allowSlideNext=!e.isLocked,e.allowSlidePrev=!e.isLocked,a!==e.isLocked&&e.emit(e.isLocked?"lock":"unlock"),a&&a!==e.isLocked&&(e.isEnd=!1,e.navigation&&e.navigation.update())}},classes:{addClasses:function(){var e,t,a,i=this,s=i.classNames,r=i.params,n=i.rtl,l=i.$el,o=i.device,d=i.support,p=(e=["initialized",r.direction,{"pointer-events":d.pointerEvents&&!d.touch},{"free-mode":r.freeMode},{autoheight:r.autoHeight},{rtl:n},{multirow:r.slidesPerColumn>1},{"multirow-column":r.slidesPerColumn>1&&"column"===r.slidesPerColumnFill},{android:o.android},{ios:o.ios},{"css-mode":r.cssMode}],t=r.containerModifierClass,a=[],e.forEach((function(e){"object"==typeof e?Object.keys(e).forEach((function(i){e[i]&&a.push(t+i)})):"string"==typeof e&&a.push(t+e)})),a);s.push.apply(s,p),l.addClass([].concat(s).join(" ")),i.emitContainerClasses()},removeClasses:function(){var e=this,t=e.$el,a=e.classNames;t.removeClass(a.join(" ")),e.emitContainerClasses()}},images:{loadImage:function(e,t,a,i,s,r){var n,o=l();function d(){r&&r()}m(e).parent("picture")[0]||e.complete&&s?d():t?((n=new o.Image).onload=d,n.onerror=d,i&&(n.sizes=i),a&&(n.srcset=a),t&&(n.src=t)):d()},preloadImages:function(){var e=this;function t(){null!=e&&e&&!e.destroyed&&(void 0!==e.imagesLoaded&&(e.imagesLoaded+=1),e.imagesLoaded===e.imagesToLoad.length&&(e.params.updateOnImagesReady&&e.update(),e.emit("imagesReady")))}e.imagesToLoad=e.$el.find("img");for(var a=0;a<e.imagesToLoad.length;a+=1){var i=e.imagesToLoad[a];e.loadImage(i,i.currentSrc||i.getAttribute("src"),i.srcset||i.getAttribute("srcset"),i.sizes||i.getAttribute("sizes"),!0,t)}}}},_={},q=function(){function t(){for(var e,a,i=arguments.length,s=new Array(i),r=0;r<i;r++)s[r]=arguments[r];if(1===s.length&&s[0].constructor&&"Object"===Object.prototype.toString.call(s[0]).slice(8,-1)?a=s[0]:(e=s[0],a=s[1]),a||(a={}),a=M({},a),e&&!a.el&&(a.el=e),a.el&&m(a.el).length>1){var n=[];return m(a.el).each((function(e){var i=M({},a,{el:e});n.push(new t(i))})),n}var l=this;l.__swiper__=!0,l.support=$(),l.device=L({userAgent:a.userAgent}),l.browser=I(),l.eventsListeners={},l.eventsAnyListeners=[],void 0===l.modules&&(l.modules={}),Object.keys(l.modules).forEach((function(e){var t=l.modules[e];if(t.params){var i=Object.keys(t.params)[0],s=t.params[i];if("object"!=typeof s||null===s)return;if(["navigation","pagination","scrollbar"].indexOf(i)>=0&&!0===a[i]&&(a[i]={auto:!0}),!(i in a)||!("enabled"in s))return;!0===a[i]&&(a[i]={enabled:!0}),"object"!=typeof a[i]||"enabled"in a[i]||(a[i].enabled=!0),a[i]||(a[i]={enabled:!1})}}));var o,d,p=M({},W);return l.useParams(p),l.params=M({},p,_,a),l.originalParams=M({},l.params),l.passedParams=M({},a),l.params&&l.params.on&&Object.keys(l.params.on).forEach((function(e){l.on(e,l.params.on[e])})),l.params&&l.params.onAny&&l.onAny(l.params.onAny),l.$=m,M(l,{enabled:l.params.enabled,el:e,classNames:[],slides:m(),slidesGrid:[],snapGrid:[],slidesSizesGrid:[],isHorizontal:function(){return"horizontal"===l.params.direction},isVertical:function(){return"vertical"===l.params.direction},activeIndex:0,realIndex:0,isBeginning:!0,isEnd:!1,translate:0,previousTranslate:0,progress:0,velocity:0,animating:!1,allowSlideNext:l.params.allowSlideNext,allowSlidePrev:l.params.allowSlidePrev,touchEvents:(o=["touchstart","touchmove","touchend","touchcancel"],d=["mousedown","mousemove","mouseup"],l.support.pointerEvents&&(d=["pointerdown","pointermove","pointerup"]),l.touchEventsTouch={start:o[0],move:o[1],end:o[2],cancel:o[3]},l.touchEventsDesktop={start:d[0],move:d[1],end:d[2]},l.support.touch||!l.params.simulateTouch?l.touchEventsTouch:l.touchEventsDesktop),touchEventsData:{isTouched:void 0,isMoved:void 0,allowTouchCallbacks:void 0,touchStartTime:void 0,isScrolling:void 0,currentTranslate:void 0,startTranslate:void 0,allowThresholdMove:void 0,focusableElements:l.params.focusableElements,lastClickTime:x(),clickTimeout:void 0,velocities:[],allowMomentumBounce:void 0,isTouchEvent:void 0,startMoving:void 0},allowClick:!0,allowTouchMove:l.params.allowTouchMove,touches:{startX:0,startY:0,currentX:0,currentY:0,diff:0},imagesToLoad:[],imagesLoaded:0}),l.useModules(),l.emit("_swiper"),l.params.init&&l.init(),l}var a,i,s,n=t.prototype;return n.enable=function(){var e=this;e.enabled||(e.enabled=!0,e.params.grabCursor&&e.setGrabCursor(),e.emit("enable"))},n.disable=function(){var e=this;e.enabled&&(e.enabled=!1,e.params.grabCursor&&e.unsetGrabCursor(),e.emit("disable"))},n.setProgress=function(e,t){var a=this;e=Math.min(Math.max(e,0),1);var i=a.minTranslate(),s=(a.maxTranslate()-i)*e+i;a.translateTo(s,void 0===t?0:t),a.updateActiveIndex(),a.updateSlidesClasses()},n.emitContainerClasses=function(){var e=this;if(e.params._emitClasses&&e.el){var t=e.el.className.split(" ").filter((function(t){return 0===t.indexOf("swiper-container")||0===t.indexOf(e.params.containerModifierClass)}));e.emit("_containerClasses",t.join(" "))}},n.getSlideClasses=function(e){var t=this;return e.className.split(" ").filter((function(e){return 0===e.indexOf("swiper-slide")||0===e.indexOf(t.params.slideClass)})).join(" ")},n.emitSlidesClasses=function(){var e=this;if(e.params._emitClasses&&e.el){var t=[];e.slides.each((function(a){var i=e.getSlideClasses(a);t.push({slideEl:a,classNames:i}),e.emit("_slideClass",a,i)})),e.emit("_slideClasses",t)}},n.slidesPerViewDynamic=function(){var e=this,t=e.params,a=e.slides,i=e.slidesGrid,s=e.size,r=e.activeIndex,n=1;if(t.centeredSlides){for(var l,o=a[r].swiperSlideSize,d=r+1;d<a.length;d+=1)a[d]&&!l&&(n+=1,(o+=a[d].swiperSlideSize)>s&&(l=!0));for(var p=r-1;p>=0;p-=1)a[p]&&!l&&(n+=1,(o+=a[p].swiperSlideSize)>s&&(l=!0))}else for(var u=r+1;u<a.length;u+=1)i[u]-i[r]<s&&(n+=1);return n},n.update=function(){var e=this;if(e&&!e.destroyed){var t=e.snapGrid,a=e.params;a.breakpoints&&e.setBreakpoint(),e.updateSize(),e.updateSlides(),e.updateProgress(),e.updateSlidesClasses(),e.params.freeMode?(i(),e.params.autoHeight&&e.updateAutoHeight()):(("auto"===e.params.slidesPerView||e.params.slidesPerView>1)&&e.isEnd&&!e.params.centeredSlides?e.slideTo(e.slides.length-1,0,!1,!0):e.slideTo(e.activeIndex,0,!1,!0))||i(),a.watchOverflow&&t!==e.snapGrid&&e.checkOverflow(),e.emit("update")}function i(){var t=e.rtlTranslate?-1*e.translate:e.translate,a=Math.min(Math.max(t,e.maxTranslate()),e.minTranslate());e.setTranslate(a),e.updateActiveIndex(),e.updateSlidesClasses()}},n.changeDirection=function(e,t){void 0===t&&(t=!0);var a=this,i=a.params.direction;return e||(e="horizontal"===i?"vertical":"horizontal"),e===i||"horizontal"!==e&&"vertical"!==e||(a.$el.removeClass(""+a.params.containerModifierClass+i).addClass(""+a.params.containerModifierClass+e),a.emitContainerClasses(),a.params.direction=e,a.slides.each((function(t){"vertical"===e?t.style.width="":t.style.height=""})),a.emit("changeDirection"),t&&a.update()),a},n.mount=function(e){var t=this;if(t.mounted)return!0;var a=m(e||t.params.el);if(!(e=a[0]))return!1;e.swiper=t;var i=function(){return"."+(t.params.wrapperClass||"").trim().split(" ").join(".")},s=function(){if(e&&e.shadowRoot&&e.shadowRoot.querySelector){var t=m(e.shadowRoot.querySelector(i()));return t.children=function(e){return a.children(e)},t}return a.children(i())}();if(0===s.length&&t.params.createElements){var n=r().createElement("div");s=m(n),n.className=t.params.wrapperClass,a.append(n),a.children("."+t.params.slideClass).each((function(e){s.append(e)}))}return M(t,{$el:a,el:e,$wrapperEl:s,wrapperEl:s[0],mounted:!0,rtl:"rtl"===e.dir.toLowerCase()||"rtl"===a.css("direction"),rtlTranslate:"horizontal"===t.params.direction&&("rtl"===e.dir.toLowerCase()||"rtl"===a.css("direction")),wrongRTL:"-webkit-box"===s.css("display")}),!0},n.init=function(e){var t=this;return t.initialized||!1===t.mount(e)||(t.emit("beforeInit"),t.params.breakpoints&&t.setBreakpoint(),t.addClasses(),t.params.loop&&t.loopCreate(),t.updateSize(),t.updateSlides(),t.params.watchOverflow&&t.checkOverflow(),t.params.grabCursor&&t.enabled&&t.setGrabCursor(),t.params.preloadImages&&t.preloadImages(),t.params.loop?t.slideTo(t.params.initialSlide+t.loopedSlides,0,t.params.runCallbacksOnInit,!1,!0):t.slideTo(t.params.initialSlide,0,t.params.runCallbacksOnInit,!1,!0),t.attachEvents(),t.initialized=!0,t.emit("init"),t.emit("afterInit")),t},n.destroy=function(e,t){void 0===e&&(e=!0),void 0===t&&(t=!0);var a,i=this,s=i.params,r=i.$el,n=i.$wrapperEl,l=i.slides;return void 0===i.params||i.destroyed||(i.emit("beforeDestroy"),i.initialized=!1,i.detachEvents(),s.loop&&i.loopDestroy(),t&&(i.removeClasses(),r.removeAttr("style"),n.removeAttr("style"),l&&l.length&&l.removeClass([s.slideVisibleClass,s.slideActiveClass,s.slideNextClass,s.slidePrevClass].join(" ")).removeAttr("style").removeAttr("data-swiper-slide-index")),i.emit("destroy"),Object.keys(i.eventsListeners).forEach((function(e){i.off(e)})),!1!==e&&(i.$el[0].swiper=null,a=i,Object.keys(a).forEach((function(e){try{a[e]=null}catch(e){}try{delete a[e]}catch(e){}}))),i.destroyed=!0),null},t.extendDefaults=function(e){M(_,e)},t.installModule=function(e){t.prototype.modules||(t.prototype.modules={});var a=e.name||Object.keys(t.prototype.modules).length+"_"+x();t.prototype.modules[a]=e},t.use=function(e){return Array.isArray(e)?(e.forEach((function(e){return t.installModule(e)})),t):(t.installModule(e),t)},a=t,s=[{key:"extendedDefaults",get:function(){return _}},{key:"defaults",get:function(){return W}}],(i=null)&&e(a.prototype,i),s&&e(a,s),t}();Object.keys(F).forEach((function(e){Object.keys(F[e]).forEach((function(t){q.prototype[t]=F[e][t]}))})),q.use([O,D]);var j={update:function(e){var t=this,a=t.params,i=a.slidesPerView,s=a.slidesPerGroup,r=a.centeredSlides,n=t.params.virtual,l=n.addSlidesBefore,o=n.addSlidesAfter,d=t.virtual,p=d.from,u=d.to,c=d.slides,h=d.slidesGrid,v=d.renderSlide,f=d.offset;t.updateActiveIndex();var m,g,b,w=t.activeIndex||0;m=t.rtlTranslate?"right":t.isHorizontal()?"left":"top",r?(g=Math.floor(i/2)+s+o,b=Math.floor(i/2)+s+l):(g=i+(s-1)+o,b=s+l);var y=Math.max((w||0)-b,0),E=Math.min((w||0)+g,c.length-1),x=(t.slidesGrid[y]||0)-(t.slidesGrid[0]||0);function T(){t.updateSlides(),t.updateProgress(),t.updateSlidesClasses(),t.lazy&&t.params.lazy.enabled&&t.lazy.load()}if(M(t.virtual,{from:y,to:E,offset:x,slidesGrid:t.slidesGrid}),p===y&&u===E&&!e)return t.slidesGrid!==h&&x!==f&&t.slides.css(m,x+"px"),void t.updateProgress();if(t.params.virtual.renderExternal)return t.params.virtual.renderExternal.call(t,{offset:x,from:y,to:E,slides:function(){for(var e=[],t=y;t<=E;t+=1)e.push(c[t]);return e}()}),void(t.params.virtual.renderExternalUpdate&&T());var C=[],S=[];if(e)t.$wrapperEl.find("."+t.params.slideClass).remove();else for(var z=p;z<=u;z+=1)(z<y||z>E)&&t.$wrapperEl.find("."+t.params.slideClass+'[data-swiper-slide-index="'+z+'"]').remove();for(var P=0;P<c.length;P+=1)P>=y&&P<=E&&(void 0===u||e?S.push(P):(P>u&&S.push(P),P<p&&C.push(P)));S.forEach((function(e){t.$wrapperEl.append(v(c[e],e))})),C.sort((function(e,t){return t-e})).forEach((function(e){t.$wrapperEl.prepend(v(c[e],e))})),t.$wrapperEl.children(".swiper-slide").css(m,x+"px"),T()},renderSlide:function(e,t){var a=this,i=a.params.virtual;if(i.cache&&a.virtual.cache[t])return a.virtual.cache[t];var s=i.renderSlide?m(i.renderSlide.call(a,e,t)):m('<div class="'+a.params.slideClass+'" data-swiper-slide-index="'+t+'">'+e+"</div>");return s.attr("data-swiper-slide-index")||s.attr("data-swiper-slide-index",t),i.cache&&(a.virtual.cache[t]=s),s},appendSlide:function(e){var t=this;if("object"==typeof e&&"length"in e)for(var a=0;a<e.length;a+=1)e[a]&&t.virtual.slides.push(e[a]);else t.virtual.slides.push(e);t.virtual.update(!0)},prependSlide:function(e){var t=this,a=t.activeIndex,i=a+1,s=1;if(Array.isArray(e)){for(var r=0;r<e.length;r+=1)e[r]&&t.virtual.slides.unshift(e[r]);i=a+e.length,s=e.length}else t.virtual.slides.unshift(e);if(t.params.virtual.cache){var n=t.virtual.cache,l={};Object.keys(n).forEach((function(e){var t=n[e],a=t.attr("data-swiper-slide-index");a&&t.attr("data-swiper-slide-index",parseInt(a,10)+1),l[parseInt(e,10)+s]=t})),t.virtual.cache=l}t.virtual.update(!0),t.slideTo(i,0)},removeSlide:function(e){var t=this;if(null!=e){var a=t.activeIndex;if(Array.isArray(e))for(var i=e.length-1;i>=0;i-=1)t.virtual.slides.splice(e[i],1),t.params.virtual.cache&&delete t.virtual.cache[e[i]],e[i]<a&&(a-=1),a=Math.max(a,0);else t.virtual.slides.splice(e,1),t.params.virtual.cache&&delete t.virtual.cache[e],e<a&&(a-=1),a=Math.max(a,0);t.virtual.update(!0),t.slideTo(a,0)}},removeAllSlides:function(){var e=this;e.virtual.slides=[],e.params.virtual.cache&&(e.virtual.cache={}),e.virtual.update(!0),e.slideTo(0,0)}},U={name:"virtual",params:{virtual:{enabled:!1,slides:[],cache:!0,renderSlide:null,renderExternal:null,renderExternalUpdate:!0,addSlidesBefore:0,addSlidesAfter:0}},create:function(){z(this,{virtual:t({},j,{slides:this.params.virtual.slides,cache:{}})})},on:{beforeInit:function(e){if(e.params.virtual.enabled){e.classNames.push(e.params.containerModifierClass+"virtual");var t={watchSlidesProgress:!0};M(e.params,t),M(e.originalParams,t),e.params.initialSlide||e.virtual.update()}},setTranslate:function(e){e.params.virtual.enabled&&e.virtual.update()}}},K={handle:function(e){var t=this;if(t.enabled){var a=l(),i=r(),s=t.rtlTranslate,n=e;n.originalEvent&&(n=n.originalEvent);var o=n.keyCode||n.charCode,d=t.params.keyboard.pageUpDown,p=d&&33===o,u=d&&34===o,c=37===o,h=39===o,v=38===o,f=40===o;if(!t.allowSlideNext&&(t.isHorizontal()&&h||t.isVertical()&&f||u))return!1;if(!t.allowSlidePrev&&(t.isHorizontal()&&c||t.isVertical()&&v||p))return!1;if(!(n.shiftKey||n.altKey||n.ctrlKey||n.metaKey||i.activeElement&&i.activeElement.nodeName&&("input"===i.activeElement.nodeName.toLowerCase()||"textarea"===i.activeElement.nodeName.toLowerCase()))){if(t.params.keyboard.onlyInViewport&&(p||u||c||h||v||f)){var m=!1;if(t.$el.parents("."+t.params.slideClass).length>0&&0===t.$el.parents("."+t.params.slideActiveClass).length)return;var g=t.$el,b=g[0].clientWidth,w=g[0].clientHeight,y=a.innerWidth,E=a.innerHeight,x=t.$el.offset();s&&(x.left-=t.$el[0].scrollLeft);for(var T=[[x.left,x.top],[x.left+b,x.top],[x.left,x.top+w],[x.left+b,x.top+w]],C=0;C<T.length;C+=1){var S=T[C];if(S[0]>=0&&S[0]<=y&&S[1]>=0&&S[1]<=E){if(0===S[0]&&0===S[1])continue;m=!0}}if(!m)return}t.isHorizontal()?((p||u||c||h)&&(n.preventDefault?n.preventDefault():n.returnValue=!1),((u||h)&&!s||(p||c)&&s)&&t.slideNext(),((p||c)&&!s||(u||h)&&s)&&t.slidePrev()):((p||u||v||f)&&(n.preventDefault?n.preventDefault():n.returnValue=!1),(u||f)&&t.slideNext(),(p||v)&&t.slidePrev()),t.emit("keyPress",o)}}},enable:function(){var e=this,t=r();e.keyboard.enabled||(m(t).on("keydown",e.keyboard.handle),e.keyboard.enabled=!0)},disable:function(){var e=this,t=r();e.keyboard.enabled&&(m(t).off("keydown",e.keyboard.handle),e.keyboard.enabled=!1)}},Z={name:"keyboard",params:{keyboard:{enabled:!1,onlyInViewport:!0,pageUpDown:!0}},create:function(){z(this,{keyboard:t({enabled:!1},K)})},on:{init:function(e){e.params.keyboard.enabled&&e.keyboard.enable()},destroy:function(e){e.keyboard.enabled&&e.keyboard.disable()}}};var J={lastScrollTime:x(),lastEventBeforeSnap:void 0,recentWheelEvents:[],event:function(){return l().navigator.userAgent.indexOf("firefox")>-1?"DOMMouseScroll":function(){var e=r(),t="onwheel",a=t in e;if(!a){var i=e.createElement("div");i.setAttribute(t,"return;"),a="function"==typeof i.onwheel}return!a&&e.implementation&&e.implementation.hasFeature&&!0!==e.implementation.hasFeature("","")&&(a=e.implementation.hasFeature("Events.wheel","3.0")),a}()?"wheel":"mousewheel"},normalize:function(e){var t=0,a=0,i=0,s=0;return"detail"in e&&(a=e.detail),"wheelDelta"in e&&(a=-e.wheelDelta/120),"wheelDeltaY"in e&&(a=-e.wheelDeltaY/120),"wheelDeltaX"in e&&(t=-e.wheelDeltaX/120),"axis"in e&&e.axis===e.HORIZONTAL_AXIS&&(t=a,a=0),i=10*t,s=10*a,"deltaY"in e&&(s=e.deltaY),"deltaX"in e&&(i=e.deltaX),e.shiftKey&&!i&&(i=s,s=0),(i||s)&&e.deltaMode&&(1===e.deltaMode?(i*=40,s*=40):(i*=800,s*=800)),i&&!t&&(t=i<1?-1:1),s&&!a&&(a=s<1?-1:1),{spinX:t,spinY:a,pixelX:i,pixelY:s}},handleMouseEnter:function(){this.enabled&&(this.mouseEntered=!0)},handleMouseLeave:function(){this.enabled&&(this.mouseEntered=!1)},handle:function(e){var t=e,a=this;if(a.enabled){var i=a.params.mousewheel;a.params.cssMode&&t.preventDefault();var s=a.$el;if("container"!==a.params.mousewheel.eventsTarget&&(s=m(a.params.mousewheel.eventsTarget)),!a.mouseEntered&&!s[0].contains(t.target)&&!i.releaseOnEdges)return!0;t.originalEvent&&(t=t.originalEvent);var r=0,n=a.rtlTranslate?-1:1,l=J.normalize(t);if(i.forceToAxis)if(a.isHorizontal()){if(!(Math.abs(l.pixelX)>Math.abs(l.pixelY)))return!0;r=-l.pixelX*n}else{if(!(Math.abs(l.pixelY)>Math.abs(l.pixelX)))return!0;r=-l.pixelY}else r=Math.abs(l.pixelX)>Math.abs(l.pixelY)?-l.pixelX*n:-l.pixelY;if(0===r)return!0;i.invert&&(r=-r);var o=a.getTranslate()+r*i.sensitivity;if(o>=a.minTranslate()&&(o=a.minTranslate()),o<=a.maxTranslate()&&(o=a.maxTranslate()),(!!a.params.loop||!(o===a.minTranslate()||o===a.maxTranslate()))&&a.params.nested&&t.stopPropagation(),a.params.freeMode){var d={time:x(),delta:Math.abs(r),direction:Math.sign(r)},p=a.mousewheel.lastEventBeforeSnap,u=p&&d.time<p.time+500&&d.delta<=p.delta&&d.direction===p.direction;if(!u){a.mousewheel.lastEventBeforeSnap=void 0,a.params.loop&&a.loopFix();var c=a.getTranslate()+r*i.sensitivity,h=a.isBeginning,v=a.isEnd;if(c>=a.minTranslate()&&(c=a.minTranslate()),c<=a.maxTranslate()&&(c=a.maxTranslate()),a.setTransition(0),a.setTranslate(c),a.updateProgress(),a.updateActiveIndex(),a.updateSlidesClasses(),(!h&&a.isBeginning||!v&&a.isEnd)&&a.updateSlidesClasses(),a.params.freeModeSticky){clearTimeout(a.mousewheel.timeout),a.mousewheel.timeout=void 0;var f=a.mousewheel.recentWheelEvents;f.length>=15&&f.shift();var g=f.length?f[f.length-1]:void 0,b=f[0];if(f.push(d),g&&(d.delta>g.delta||d.direction!==g.direction))f.splice(0);else if(f.length>=15&&d.time-b.time<500&&b.delta-d.delta>=1&&d.delta<=6){var w=r>0?.8:.2;a.mousewheel.lastEventBeforeSnap=d,f.splice(0),a.mousewheel.timeout=E((function(){a.slideToClosest(a.params.speed,!0,void 0,w)}),0)}a.mousewheel.timeout||(a.mousewheel.timeout=E((function(){a.mousewheel.lastEventBeforeSnap=d,f.splice(0),a.slideToClosest(a.params.speed,!0,void 0,.5)}),500))}if(u||a.emit("scroll",t),a.params.autoplay&&a.params.autoplayDisableOnInteraction&&a.autoplay.stop(),c===a.minTranslate()||c===a.maxTranslate())return!0}}else{var y={time:x(),delta:Math.abs(r),direction:Math.sign(r),raw:e},T=a.mousewheel.recentWheelEvents;T.length>=2&&T.shift();var C=T.length?T[T.length-1]:void 0;if(T.push(y),C?(y.direction!==C.direction||y.delta>C.delta||y.time>C.time+150)&&a.mousewheel.animateSlider(y):a.mousewheel.animateSlider(y),a.mousewheel.releaseScroll(y))return!0}return t.preventDefault?t.preventDefault():t.returnValue=!1,!1}},animateSlider:function(e){var t=this,a=l();return!(this.params.mousewheel.thresholdDelta&&e.delta<this.params.mousewheel.thresholdDelta)&&(!(this.params.mousewheel.thresholdTime&&x()-t.mousewheel.lastScrollTime<this.params.mousewheel.thresholdTime)&&(e.delta>=6&&x()-t.mousewheel.lastScrollTime<60||(e.direction<0?t.isEnd&&!t.params.loop||t.animating||(t.slideNext(),t.emit("scroll",e.raw)):t.isBeginning&&!t.params.loop||t.animating||(t.slidePrev(),t.emit("scroll",e.raw)),t.mousewheel.lastScrollTime=(new a.Date).getTime(),!1)))},releaseScroll:function(e){var t=this,a=t.params.mousewheel;if(e.direction<0){if(t.isEnd&&!t.params.loop&&a.releaseOnEdges)return!0}else if(t.isBeginning&&!t.params.loop&&a.releaseOnEdges)return!0;return!1},enable:function(){var e=this,t=J.event();if(e.params.cssMode)return e.wrapperEl.removeEventListener(t,e.mousewheel.handle),!0;if(!t)return!1;if(e.mousewheel.enabled)return!1;var a=e.$el;return"container"!==e.params.mousewheel.eventsTarget&&(a=m(e.params.mousewheel.eventsTarget)),a.on("mouseenter",e.mousewheel.handleMouseEnter),a.on("mouseleave",e.mousewheel.handleMouseLeave),a.on(t,e.mousewheel.handle),e.mousewheel.enabled=!0,!0},disable:function(){var e=this,t=J.event();if(e.params.cssMode)return e.wrapperEl.addEventListener(t,e.mousewheel.handle),!0;if(!t)return!1;if(!e.mousewheel.enabled)return!1;var a=e.$el;return"container"!==e.params.mousewheel.eventsTarget&&(a=m(e.params.mousewheel.eventsTarget)),a.off(t,e.mousewheel.handle),e.mousewheel.enabled=!1,!0}},Q={toggleEl:function(e,t){e[t?"addClass":"removeClass"](this.params.navigation.disabledClass),e[0]&&"BUTTON"===e[0].tagName&&(e[0].disabled=t)},update:function(){var e=this,t=e.params.navigation,a=e.navigation.toggleEl;if(!e.params.loop){var i=e.navigation,s=i.$nextEl,r=i.$prevEl;r&&r.length>0&&(e.isBeginning?a(r,!0):a(r,!1),e.params.watchOverflow&&e.enabled&&r[e.isLocked?"addClass":"removeClass"](t.lockClass)),s&&s.length>0&&(e.isEnd?a(s,!0):a(s,!1),e.params.watchOverflow&&e.enabled&&s[e.isLocked?"addClass":"removeClass"](t.lockClass))}},onPrevClick:function(e){var t=this;e.preventDefault(),t.isBeginning&&!t.params.loop||t.slidePrev()},onNextClick:function(e){var t=this;e.preventDefault(),t.isEnd&&!t.params.loop||t.slideNext()},init:function(){var e,t,a=this,i=a.params.navigation;(a.params.navigation=k(a.$el,a.params.navigation,a.params.createElements,{nextEl:"swiper-button-next",prevEl:"swiper-button-prev"}),i.nextEl||i.prevEl)&&(i.nextEl&&(e=m(i.nextEl),a.params.uniqueNavElements&&"string"==typeof i.nextEl&&e.length>1&&1===a.$el.find(i.nextEl).length&&(e=a.$el.find(i.nextEl))),i.prevEl&&(t=m(i.prevEl),a.params.uniqueNavElements&&"string"==typeof i.prevEl&&t.length>1&&1===a.$el.find(i.prevEl).length&&(t=a.$el.find(i.prevEl))),e&&e.length>0&&e.on("click",a.navigation.onNextClick),t&&t.length>0&&t.on("click",a.navigation.onPrevClick),M(a.navigation,{$nextEl:e,nextEl:e&&e[0],$prevEl:t,prevEl:t&&t[0]}),a.enabled||(e&&e.addClass(i.lockClass),t&&t.addClass(i.lockClass)))},destroy:function(){var e=this,t=e.navigation,a=t.$nextEl,i=t.$prevEl;a&&a.length&&(a.off("click",e.navigation.onNextClick),a.removeClass(e.params.navigation.disabledClass)),i&&i.length&&(i.off("click",e.navigation.onPrevClick),i.removeClass(e.params.navigation.disabledClass))}},ee={update:function(){var e=this,t=e.rtl,a=e.params.pagination;if(a.el&&e.pagination.el&&e.pagination.$el&&0!==e.pagination.$el.length){var i,s=e.virtual&&e.params.virtual.enabled?e.virtual.slides.length:e.slides.length,r=e.pagination.$el,n=e.params.loop?Math.ceil((s-2*e.loopedSlides)/e.params.slidesPerGroup):e.snapGrid.length;if(e.params.loop?((i=Math.ceil((e.activeIndex-e.loopedSlides)/e.params.slidesPerGroup))>s-1-2*e.loopedSlides&&(i-=s-2*e.loopedSlides),i>n-1&&(i-=n),i<0&&"bullets"!==e.params.paginationType&&(i=n+i)):i=void 0!==e.snapIndex?e.snapIndex:e.activeIndex||0,"bullets"===a.type&&e.pagination.bullets&&e.pagination.bullets.length>0){var l,o,d,p=e.pagination.bullets;if(a.dynamicBullets&&(e.pagination.bulletSize=p.eq(0)[e.isHorizontal()?"outerWidth":"outerHeight"](!0),r.css(e.isHorizontal()?"width":"height",e.pagination.bulletSize*(a.dynamicMainBullets+4)+"px"),a.dynamicMainBullets>1&&void 0!==e.previousIndex&&(e.pagination.dynamicBulletIndex+=i-e.previousIndex,e.pagination.dynamicBulletIndex>a.dynamicMainBullets-1?e.pagination.dynamicBulletIndex=a.dynamicMainBullets-1:e.pagination.dynamicBulletIndex<0&&(e.pagination.dynamicBulletIndex=0)),l=i-e.pagination.dynamicBulletIndex,d=((o=l+(Math.min(p.length,a.dynamicMainBullets)-1))+l)/2),p.removeClass(a.bulletActiveClass+" "+a.bulletActiveClass+"-next "+a.bulletActiveClass+"-next-next "+a.bulletActiveClass+"-prev "+a.bulletActiveClass+"-prev-prev "+a.bulletActiveClass+"-main"),r.length>1)p.each((function(e){var t=m(e),s=t.index();s===i&&t.addClass(a.bulletActiveClass),a.dynamicBullets&&(s>=l&&s<=o&&t.addClass(a.bulletActiveClass+"-main"),s===l&&t.prev().addClass(a.bulletActiveClass+"-prev").prev().addClass(a.bulletActiveClass+"-prev-prev"),s===o&&t.next().addClass(a.bulletActiveClass+"-next").next().addClass(a.bulletActiveClass+"-next-next"))}));else{var u=p.eq(i),c=u.index();if(u.addClass(a.bulletActiveClass),a.dynamicBullets){for(var h=p.eq(l),v=p.eq(o),f=l;f<=o;f+=1)p.eq(f).addClass(a.bulletActiveClass+"-main");if(e.params.loop)if(c>=p.length-a.dynamicMainBullets){for(var g=a.dynamicMainBullets;g>=0;g-=1)p.eq(p.length-g).addClass(a.bulletActiveClass+"-main");p.eq(p.length-a.dynamicMainBullets-1).addClass(a.bulletActiveClass+"-prev")}else h.prev().addClass(a.bulletActiveClass+"-prev").prev().addClass(a.bulletActiveClass+"-prev-prev"),v.next().addClass(a.bulletActiveClass+"-next").next().addClass(a.bulletActiveClass+"-next-next");else h.prev().addClass(a.bulletActiveClass+"-prev").prev().addClass(a.bulletActiveClass+"-prev-prev"),v.next().addClass(a.bulletActiveClass+"-next").next().addClass(a.bulletActiveClass+"-next-next")}}if(a.dynamicBullets){var b=Math.min(p.length,a.dynamicMainBullets+4),w=(e.pagination.bulletSize*b-e.pagination.bulletSize)/2-d*e.pagination.bulletSize,y=t?"right":"left";p.css(e.isHorizontal()?y:"top",w+"px")}}if("fraction"===a.type&&(r.find(P(a.currentClass)).text(a.formatFractionCurrent(i+1)),r.find(P(a.totalClass)).text(a.formatFractionTotal(n))),"progressbar"===a.type){var E;E=a.progressbarOpposite?e.isHorizontal()?"vertical":"horizontal":e.isHorizontal()?"horizontal":"vertical";var x=(i+1)/n,T=1,C=1;"horizontal"===E?T=x:C=x,r.find(P(a.progressbarFillClass)).transform("translate3d(0,0,0) scaleX("+T+") scaleY("+C+")").transition(e.params.speed)}"custom"===a.type&&a.renderCustom?(r.html(a.renderCustom(e,i+1,n)),e.emit("paginationRender",r[0])):e.emit("paginationUpdate",r[0]),e.params.watchOverflow&&e.enabled&&r[e.isLocked?"addClass":"removeClass"](a.lockClass)}},render:function(){var e=this,t=e.params.pagination;if(t.el&&e.pagination.el&&e.pagination.$el&&0!==e.pagination.$el.length){var a=e.virtual&&e.params.virtual.enabled?e.virtual.slides.length:e.slides.length,i=e.pagination.$el,s="";if("bullets"===t.type){var r=e.params.loop?Math.ceil((a-2*e.loopedSlides)/e.params.slidesPerGroup):e.snapGrid.length;e.params.freeMode&&!e.params.loop&&r>a&&(r=a);for(var n=0;n<r;n+=1)t.renderBullet?s+=t.renderBullet.call(e,n,t.bulletClass):s+="<"+t.bulletElement+' class="'+t.bulletClass+'"></'+t.bulletElement+">";i.html(s),e.pagination.bullets=i.find(P(t.bulletClass))}"fraction"===t.type&&(s=t.renderFraction?t.renderFraction.call(e,t.currentClass,t.totalClass):'<span class="'+t.currentClass+'"></span> / <span class="'+t.totalClass+'"></span>',i.html(s)),"progressbar"===t.type&&(s=t.renderProgressbar?t.renderProgressbar.call(e,t.progressbarFillClass):'<span class="'+t.progressbarFillClass+'"></span>',i.html(s)),"custom"!==t.type&&e.emit("paginationRender",e.pagination.$el[0])}},init:function(){var e=this;e.params.pagination=k(e.$el,e.params.pagination,e.params.createElements,{el:"swiper-pagination"});var t=e.params.pagination;if(t.el){var a=m(t.el);0!==a.length&&(e.params.uniqueNavElements&&"string"==typeof t.el&&a.length>1&&(a=e.$el.find(t.el)),"bullets"===t.type&&t.clickable&&a.addClass(t.clickableClass),a.addClass(t.modifierClass+t.type),"bullets"===t.type&&t.dynamicBullets&&(a.addClass(""+t.modifierClass+t.type+"-dynamic"),e.pagination.dynamicBulletIndex=0,t.dynamicMainBullets<1&&(t.dynamicMainBullets=1)),"progressbar"===t.type&&t.progressbarOpposite&&a.addClass(t.progressbarOppositeClass),t.clickable&&a.on("click",P(t.bulletClass),(function(t){t.preventDefault();var a=m(this).index()*e.params.slidesPerGroup;e.params.loop&&(a+=e.loopedSlides),e.slideTo(a)})),M(e.pagination,{$el:a,el:a[0]}),e.enabled||a.addClass(t.lockClass))}},destroy:function(){var e=this,t=e.params.pagination;if(t.el&&e.pagination.el&&e.pagination.$el&&0!==e.pagination.$el.length){var a=e.pagination.$el;a.removeClass(t.hiddenClass),a.removeClass(t.modifierClass+t.type),e.pagination.bullets&&e.pagination.bullets.removeClass(t.bulletActiveClass),t.clickable&&a.off("click",P(t.bulletClass))}}},te={setTranslate:function(){var e=this;if(e.params.scrollbar.el&&e.scrollbar.el){var t=e.scrollbar,a=e.rtlTranslate,i=e.progress,s=t.dragSize,r=t.trackSize,n=t.$dragEl,l=t.$el,o=e.params.scrollbar,d=s,p=(r-s)*i;a?(p=-p)>0?(d=s-p,p=0):-p+s>r&&(d=r+p):p<0?(d=s+p,p=0):p+s>r&&(d=r-p),e.isHorizontal()?(n.transform("translate3d("+p+"px, 0, 0)"),n[0].style.width=d+"px"):(n.transform("translate3d(0px, "+p+"px, 0)"),n[0].style.height=d+"px"),o.hide&&(clearTimeout(e.scrollbar.timeout),l[0].style.opacity=1,e.scrollbar.timeout=setTimeout((function(){l[0].style.opacity=0,l.transition(400)}),1e3))}},setTransition:function(e){var t=this;t.params.scrollbar.el&&t.scrollbar.el&&t.scrollbar.$dragEl.transition(e)},updateSize:function(){var e=this;if(e.params.scrollbar.el&&e.scrollbar.el){var t=e.scrollbar,a=t.$dragEl,i=t.$el;a[0].style.width="",a[0].style.height="";var s,r=e.isHorizontal()?i[0].offsetWidth:i[0].offsetHeight,n=e.size/e.virtualSize,l=n*(r/e.size);s="auto"===e.params.scrollbar.dragSize?r*n:parseInt(e.params.scrollbar.dragSize,10),e.isHorizontal()?a[0].style.width=s+"px":a[0].style.height=s+"px",i[0].style.display=n>=1?"none":"",e.params.scrollbar.hide&&(i[0].style.opacity=0),M(t,{trackSize:r,divider:n,moveDivider:l,dragSize:s}),e.params.watchOverflow&&e.enabled&&t.$el[e.isLocked?"addClass":"removeClass"](e.params.scrollbar.lockClass)}},getPointerPosition:function(e){return this.isHorizontal()?"touchstart"===e.type||"touchmove"===e.type?e.targetTouches[0].clientX:e.clientX:"touchstart"===e.type||"touchmove"===e.type?e.targetTouches[0].clientY:e.clientY},setDragPosition:function(e){var t,a=this,i=a.scrollbar,s=a.rtlTranslate,r=i.$el,n=i.dragSize,l=i.trackSize,o=i.dragStartPos;t=(i.getPointerPosition(e)-r.offset()[a.isHorizontal()?"left":"top"]-(null!==o?o:n/2))/(l-n),t=Math.max(Math.min(t,1),0),s&&(t=1-t);var d=a.minTranslate()+(a.maxTranslate()-a.minTranslate())*t;a.updateProgress(d),a.setTranslate(d),a.updateActiveIndex(),a.updateSlidesClasses()},onDragStart:function(e){var t=this,a=t.params.scrollbar,i=t.scrollbar,s=t.$wrapperEl,r=i.$el,n=i.$dragEl;t.scrollbar.isTouched=!0,t.scrollbar.dragStartPos=e.target===n[0]||e.target===n?i.getPointerPosition(e)-e.target.getBoundingClientRect()[t.isHorizontal()?"left":"top"]:null,e.preventDefault(),e.stopPropagation(),s.transition(100),n.transition(100),i.setDragPosition(e),clearTimeout(t.scrollbar.dragTimeout),r.transition(0),a.hide&&r.css("opacity",1),t.params.cssMode&&t.$wrapperEl.css("scroll-snap-type","none"),t.emit("scrollbarDragStart",e)},onDragMove:function(e){var t=this,a=t.scrollbar,i=t.$wrapperEl,s=a.$el,r=a.$dragEl;t.scrollbar.isTouched&&(e.preventDefault?e.preventDefault():e.returnValue=!1,a.setDragPosition(e),i.transition(0),s.transition(0),r.transition(0),t.emit("scrollbarDragMove",e))},onDragEnd:function(e){var t=this,a=t.params.scrollbar,i=t.scrollbar,s=t.$wrapperEl,r=i.$el;t.scrollbar.isTouched&&(t.scrollbar.isTouched=!1,t.params.cssMode&&(t.$wrapperEl.css("scroll-snap-type",""),s.transition("")),a.hide&&(clearTimeout(t.scrollbar.dragTimeout),t.scrollbar.dragTimeout=E((function(){r.css("opacity",0),r.transition(400)}),1e3)),t.emit("scrollbarDragEnd",e),a.snapOnRelease&&t.slideToClosest())},enableDraggable:function(){var e=this;if(e.params.scrollbar.el){var t=r(),a=e.scrollbar,i=e.touchEventsTouch,s=e.touchEventsDesktop,n=e.params,l=e.support,o=a.$el[0],d=!(!l.passiveListener||!n.passiveListeners)&&{passive:!1,capture:!1},p=!(!l.passiveListener||!n.passiveListeners)&&{passive:!0,capture:!1};o&&(l.touch?(o.addEventListener(i.start,e.scrollbar.onDragStart,d),o.addEventListener(i.move,e.scrollbar.onDragMove,d),o.addEventListener(i.end,e.scrollbar.onDragEnd,p)):(o.addEventListener(s.start,e.scrollbar.onDragStart,d),t.addEventListener(s.move,e.scrollbar.onDragMove,d),t.addEventListener(s.end,e.scrollbar.onDragEnd,p)))}},disableDraggable:function(){var e=this;if(e.params.scrollbar.el){var t=r(),a=e.scrollbar,i=e.touchEventsTouch,s=e.touchEventsDesktop,n=e.params,l=e.support,o=a.$el[0],d=!(!l.passiveListener||!n.passiveListeners)&&{passive:!1,capture:!1},p=!(!l.passiveListener||!n.passiveListeners)&&{passive:!0,capture:!1};o&&(l.touch?(o.removeEventListener(i.start,e.scrollbar.onDragStart,d),o.removeEventListener(i.move,e.scrollbar.onDragMove,d),o.removeEventListener(i.end,e.scrollbar.onDragEnd,p)):(o.removeEventListener(s.start,e.scrollbar.onDragStart,d),t.removeEventListener(s.move,e.scrollbar.onDragMove,d),t.removeEventListener(s.end,e.scrollbar.onDragEnd,p)))}},init:function(){var e=this,t=e.scrollbar,a=e.$el;e.params.scrollbar=k(a,e.params.scrollbar,e.params.createElements,{el:"swiper-scrollbar"});var i=e.params.scrollbar;if(i.el){var s=m(i.el);e.params.uniqueNavElements&&"string"==typeof i.el&&s.length>1&&1===a.find(i.el).length&&(s=a.find(i.el));var r=s.find("."+e.params.scrollbar.dragClass);0===r.length&&(r=m('<div class="'+e.params.scrollbar.dragClass+'"></div>'),s.append(r)),M(t,{$el:s,el:s[0],$dragEl:r,dragEl:r[0]}),i.draggable&&t.enableDraggable(),s&&s[e.enabled?"removeClass":"addClass"](e.params.scrollbar.lockClass)}},destroy:function(){this.scrollbar.disableDraggable()}},ae={setTransform:function(e,t){var a=this.rtl,i=m(e),s=a?-1:1,r=i.attr("data-swiper-parallax")||"0",n=i.attr("data-swiper-parallax-x"),l=i.attr("data-swiper-parallax-y"),o=i.attr("data-swiper-parallax-scale"),d=i.attr("data-swiper-parallax-opacity");if(n||l?(n=n||"0",l=l||"0"):this.isHorizontal()?(n=r,l="0"):(l=r,n="0"),n=n.indexOf("%")>=0?parseInt(n,10)*t*s+"%":n*t*s+"px",l=l.indexOf("%")>=0?parseInt(l,10)*t+"%":l*t+"px",null!=d){var p=d-(d-1)*(1-Math.abs(t));i[0].style.opacity=p}if(null==o)i.transform("translate3d("+n+", "+l+", 0px)");else{var u=o-(o-1)*(1-Math.abs(t));i.transform("translate3d("+n+", "+l+", 0px) scale("+u+")")}},setTranslate:function(){var e=this,t=e.$el,a=e.slides,i=e.progress,s=e.snapGrid;t.children("[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]").each((function(t){e.parallax.setTransform(t,i)})),a.each((function(t,a){var r=t.progress;e.params.slidesPerGroup>1&&"auto"!==e.params.slidesPerView&&(r+=Math.ceil(a/2)-i*(s.length-1)),r=Math.min(Math.max(r,-1),1),m(t).find("[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]").each((function(t){e.parallax.setTransform(t,r)}))}))},setTransition:function(e){void 0===e&&(e=this.params.speed);this.$el.find("[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]").each((function(t){var a=m(t),i=parseInt(a.attr("data-swiper-parallax-duration"),10)||e;0===e&&(i=0),a.transition(i)}))}},ie={getDistanceBetweenTouches:function(e){if(e.targetTouches.length<2)return 1;var t=e.targetTouches[0].pageX,a=e.targetTouches[0].pageY,i=e.targetTouches[1].pageX,s=e.targetTouches[1].pageY;return Math.sqrt(Math.pow(i-t,2)+Math.pow(s-a,2))},onGestureStart:function(e){var t=this,a=t.support,i=t.params.zoom,s=t.zoom,r=s.gesture;if(s.fakeGestureTouched=!1,s.fakeGestureMoved=!1,!a.gestures){if("touchstart"!==e.type||"touchstart"===e.type&&e.targetTouches.length<2)return;s.fakeGestureTouched=!0,r.scaleStart=ie.getDistanceBetweenTouches(e)}r.$slideEl&&r.$slideEl.length||(r.$slideEl=m(e.target).closest("."+t.params.slideClass),0===r.$slideEl.length&&(r.$slideEl=t.slides.eq(t.activeIndex)),r.$imageEl=r.$slideEl.find("img, svg, canvas, picture, .swiper-zoom-target"),r.$imageWrapEl=r.$imageEl.parent("."+i.containerClass),r.maxRatio=r.$imageWrapEl.attr("data-swiper-zoom")||i.maxRatio,0!==r.$imageWrapEl.length)?(r.$imageEl&&r.$imageEl.transition(0),t.zoom.isScaling=!0):r.$imageEl=void 0},onGestureChange:function(e){var t=this,a=t.support,i=t.params.zoom,s=t.zoom,r=s.gesture;if(!a.gestures){if("touchmove"!==e.type||"touchmove"===e.type&&e.targetTouches.length<2)return;s.fakeGestureMoved=!0,r.scaleMove=ie.getDistanceBetweenTouches(e)}r.$imageEl&&0!==r.$imageEl.length?(a.gestures?s.scale=e.scale*s.currentScale:s.scale=r.scaleMove/r.scaleStart*s.currentScale,s.scale>r.maxRatio&&(s.scale=r.maxRatio-1+Math.pow(s.scale-r.maxRatio+1,.5)),s.scale<i.minRatio&&(s.scale=i.minRatio+1-Math.pow(i.minRatio-s.scale+1,.5)),r.$imageEl.transform("translate3d(0,0,0) scale("+s.scale+")")):"gesturechange"===e.type&&s.onGestureStart(e)},onGestureEnd:function(e){var t=this,a=t.device,i=t.support,s=t.params.zoom,r=t.zoom,n=r.gesture;if(!i.gestures){if(!r.fakeGestureTouched||!r.fakeGestureMoved)return;if("touchend"!==e.type||"touchend"===e.type&&e.changedTouches.length<2&&!a.android)return;r.fakeGestureTouched=!1,r.fakeGestureMoved=!1}n.$imageEl&&0!==n.$imageEl.length&&(r.scale=Math.max(Math.min(r.scale,n.maxRatio),s.minRatio),n.$imageEl.transition(t.params.speed).transform("translate3d(0,0,0) scale("+r.scale+")"),r.currentScale=r.scale,r.isScaling=!1,1===r.scale&&(n.$slideEl=void 0))},onTouchStart:function(e){var t=this.device,a=this.zoom,i=a.gesture,s=a.image;i.$imageEl&&0!==i.$imageEl.length&&(s.isTouched||(t.android&&e.cancelable&&e.preventDefault(),s.isTouched=!0,s.touchesStart.x="touchstart"===e.type?e.targetTouches[0].pageX:e.pageX,s.touchesStart.y="touchstart"===e.type?e.targetTouches[0].pageY:e.pageY))},onTouchMove:function(e){var t=this,a=t.zoom,i=a.gesture,s=a.image,r=a.velocity;if(i.$imageEl&&0!==i.$imageEl.length&&(t.allowClick=!1,s.isTouched&&i.$slideEl)){s.isMoved||(s.width=i.$imageEl[0].offsetWidth,s.height=i.$imageEl[0].offsetHeight,s.startX=T(i.$imageWrapEl[0],"x")||0,s.startY=T(i.$imageWrapEl[0],"y")||0,i.slideWidth=i.$slideEl[0].offsetWidth,i.slideHeight=i.$slideEl[0].offsetHeight,i.$imageWrapEl.transition(0));var n=s.width*a.scale,l=s.height*a.scale;if(!(n<i.slideWidth&&l<i.slideHeight)){if(s.minX=Math.min(i.slideWidth/2-n/2,0),s.maxX=-s.minX,s.minY=Math.min(i.slideHeight/2-l/2,0),s.maxY=-s.minY,s.touchesCurrent.x="touchmove"===e.type?e.targetTouches[0].pageX:e.pageX,s.touchesCurrent.y="touchmove"===e.type?e.targetTouches[0].pageY:e.pageY,!s.isMoved&&!a.isScaling){if(t.isHorizontal()&&(Math.floor(s.minX)===Math.floor(s.startX)&&s.touchesCurrent.x<s.touchesStart.x||Math.floor(s.maxX)===Math.floor(s.startX)&&s.touchesCurrent.x>s.touchesStart.x))return void(s.isTouched=!1);if(!t.isHorizontal()&&(Math.floor(s.minY)===Math.floor(s.startY)&&s.touchesCurrent.y<s.touchesStart.y||Math.floor(s.maxY)===Math.floor(s.startY)&&s.touchesCurrent.y>s.touchesStart.y))return void(s.isTouched=!1)}e.cancelable&&e.preventDefault(),e.stopPropagation(),s.isMoved=!0,s.currentX=s.touchesCurrent.x-s.touchesStart.x+s.startX,s.currentY=s.touchesCurrent.y-s.touchesStart.y+s.startY,s.currentX<s.minX&&(s.currentX=s.minX+1-Math.pow(s.minX-s.currentX+1,.8)),s.currentX>s.maxX&&(s.currentX=s.maxX-1+Math.pow(s.currentX-s.maxX+1,.8)),s.currentY<s.minY&&(s.currentY=s.minY+1-Math.pow(s.minY-s.currentY+1,.8)),s.currentY>s.maxY&&(s.currentY=s.maxY-1+Math.pow(s.currentY-s.maxY+1,.8)),r.prevPositionX||(r.prevPositionX=s.touchesCurrent.x),r.prevPositionY||(r.prevPositionY=s.touchesCurrent.y),r.prevTime||(r.prevTime=Date.now()),r.x=(s.touchesCurrent.x-r.prevPositionX)/(Date.now()-r.prevTime)/2,r.y=(s.touchesCurrent.y-r.prevPositionY)/(Date.now()-r.prevTime)/2,Math.abs(s.touchesCurrent.x-r.prevPositionX)<2&&(r.x=0),Math.abs(s.touchesCurrent.y-r.prevPositionY)<2&&(r.y=0),r.prevPositionX=s.touchesCurrent.x,r.prevPositionY=s.touchesCurrent.y,r.prevTime=Date.now(),i.$imageWrapEl.transform("translate3d("+s.currentX+"px, "+s.currentY+"px,0)")}}},onTouchEnd:function(){var e=this.zoom,t=e.gesture,a=e.image,i=e.velocity;if(t.$imageEl&&0!==t.$imageEl.length){if(!a.isTouched||!a.isMoved)return a.isTouched=!1,void(a.isMoved=!1);a.isTouched=!1,a.isMoved=!1;var s=300,r=300,n=i.x*s,l=a.currentX+n,o=i.y*r,d=a.currentY+o;0!==i.x&&(s=Math.abs((l-a.currentX)/i.x)),0!==i.y&&(r=Math.abs((d-a.currentY)/i.y));var p=Math.max(s,r);a.currentX=l,a.currentY=d;var u=a.width*e.scale,c=a.height*e.scale;a.minX=Math.min(t.slideWidth/2-u/2,0),a.maxX=-a.minX,a.minY=Math.min(t.slideHeight/2-c/2,0),a.maxY=-a.minY,a.currentX=Math.max(Math.min(a.currentX,a.maxX),a.minX),a.currentY=Math.max(Math.min(a.currentY,a.maxY),a.minY),t.$imageWrapEl.transition(p).transform("translate3d("+a.currentX+"px, "+a.currentY+"px,0)")}},onTransitionEnd:function(){var e=this,t=e.zoom,a=t.gesture;a.$slideEl&&e.previousIndex!==e.activeIndex&&(a.$imageEl&&a.$imageEl.transform("translate3d(0,0,0) scale(1)"),a.$imageWrapEl&&a.$imageWrapEl.transform("translate3d(0,0,0)"),t.scale=1,t.currentScale=1,a.$slideEl=void 0,a.$imageEl=void 0,a.$imageWrapEl=void 0)},toggle:function(e){var t=this.zoom;t.scale&&1!==t.scale?t.out():t.in(e)},in:function(e){var t,a,i,s,r,n,o,d,p,u,c,h,v,f,g,b,w=this,y=l(),E=w.zoom,x=w.params.zoom,T=E.gesture,C=E.image;(T.$slideEl||(e&&e.target&&(T.$slideEl=m(e.target).closest("."+w.params.slideClass)),T.$slideEl||(w.params.virtual&&w.params.virtual.enabled&&w.virtual?T.$slideEl=w.$wrapperEl.children("."+w.params.slideActiveClass):T.$slideEl=w.slides.eq(w.activeIndex)),T.$imageEl=T.$slideEl.find("img, svg, canvas, picture, .swiper-zoom-target"),T.$imageWrapEl=T.$imageEl.parent("."+x.containerClass)),T.$imageEl&&0!==T.$imageEl.length&&T.$imageWrapEl&&0!==T.$imageWrapEl.length)&&(T.$slideEl.addClass(""+x.zoomedSlideClass),void 0===C.touchesStart.x&&e?(t="touchend"===e.type?e.changedTouches[0].pageX:e.pageX,a="touchend"===e.type?e.changedTouches[0].pageY:e.pageY):(t=C.touchesStart.x,a=C.touchesStart.y),E.scale=T.$imageWrapEl.attr("data-swiper-zoom")||x.maxRatio,E.currentScale=T.$imageWrapEl.attr("data-swiper-zoom")||x.maxRatio,e?(g=T.$slideEl[0].offsetWidth,b=T.$slideEl[0].offsetHeight,i=T.$slideEl.offset().left+y.scrollX+g/2-t,s=T.$slideEl.offset().top+y.scrollY+b/2-a,o=T.$imageEl[0].offsetWidth,d=T.$imageEl[0].offsetHeight,p=o*E.scale,u=d*E.scale,v=-(c=Math.min(g/2-p/2,0)),f=-(h=Math.min(b/2-u/2,0)),(r=i*E.scale)<c&&(r=c),r>v&&(r=v),(n=s*E.scale)<h&&(n=h),n>f&&(n=f)):(r=0,n=0),T.$imageWrapEl.transition(300).transform("translate3d("+r+"px, "+n+"px,0)"),T.$imageEl.transition(300).transform("translate3d(0,0,0) scale("+E.scale+")"))},out:function(){var e=this,t=e.zoom,a=e.params.zoom,i=t.gesture;i.$slideEl||(e.params.virtual&&e.params.virtual.enabled&&e.virtual?i.$slideEl=e.$wrapperEl.children("."+e.params.slideActiveClass):i.$slideEl=e.slides.eq(e.activeIndex),i.$imageEl=i.$slideEl.find("img, svg, canvas, picture, .swiper-zoom-target"),i.$imageWrapEl=i.$imageEl.parent("."+a.containerClass)),i.$imageEl&&0!==i.$imageEl.length&&i.$imageWrapEl&&0!==i.$imageWrapEl.length&&(t.scale=1,t.currentScale=1,i.$imageWrapEl.transition(300).transform("translate3d(0,0,0)"),i.$imageEl.transition(300).transform("translate3d(0,0,0) scale(1)"),i.$slideEl.removeClass(""+a.zoomedSlideClass),i.$slideEl=void 0)},toggleGestures:function(e){var t=this,a=t.zoom,i=a.slideSelector,s=a.passiveListener;t.$wrapperEl[e]("gesturestart",i,a.onGestureStart,s),t.$wrapperEl[e]("gesturechange",i,a.onGestureChange,s),t.$wrapperEl[e]("gestureend",i,a.onGestureEnd,s)},enableGestures:function(){this.zoom.gesturesEnabled||(this.zoom.gesturesEnabled=!0,this.zoom.toggleGestures("on"))},disableGestures:function(){this.zoom.gesturesEnabled&&(this.zoom.gesturesEnabled=!1,this.zoom.toggleGestures("off"))},enable:function(){var e=this,t=e.support,a=e.zoom;if(!a.enabled){a.enabled=!0;var i=!("touchstart"!==e.touchEvents.start||!t.passiveListener||!e.params.passiveListeners)&&{passive:!0,capture:!1},s=!t.passiveListener||{passive:!1,capture:!0},r="."+e.params.slideClass;e.zoom.passiveListener=i,e.zoom.slideSelector=r,t.gestures?(e.$wrapperEl.on(e.touchEvents.start,e.zoom.enableGestures,i),e.$wrapperEl.on(e.touchEvents.end,e.zoom.disableGestures,i)):"touchstart"===e.touchEvents.start&&(e.$wrapperEl.on(e.touchEvents.start,r,a.onGestureStart,i),e.$wrapperEl.on(e.touchEvents.move,r,a.onGestureChange,s),e.$wrapperEl.on(e.touchEvents.end,r,a.onGestureEnd,i),e.touchEvents.cancel&&e.$wrapperEl.on(e.touchEvents.cancel,r,a.onGestureEnd,i)),e.$wrapperEl.on(e.touchEvents.move,"."+e.params.zoom.containerClass,a.onTouchMove,s)}},disable:function(){var e=this,t=e.zoom;if(t.enabled){var a=e.support;e.zoom.enabled=!1;var i=!("touchstart"!==e.touchEvents.start||!a.passiveListener||!e.params.passiveListeners)&&{passive:!0,capture:!1},s=!a.passiveListener||{passive:!1,capture:!0},r="."+e.params.slideClass;a.gestures?(e.$wrapperEl.off(e.touchEvents.start,e.zoom.enableGestures,i),e.$wrapperEl.off(e.touchEvents.end,e.zoom.disableGestures,i)):"touchstart"===e.touchEvents.start&&(e.$wrapperEl.off(e.touchEvents.start,r,t.onGestureStart,i),e.$wrapperEl.off(e.touchEvents.move,r,t.onGestureChange,s),e.$wrapperEl.off(e.touchEvents.end,r,t.onGestureEnd,i),e.touchEvents.cancel&&e.$wrapperEl.off(e.touchEvents.cancel,r,t.onGestureEnd,i)),e.$wrapperEl.off(e.touchEvents.move,"."+e.params.zoom.containerClass,t.onTouchMove,s)}}},se={loadInSlide:function(e,t){void 0===t&&(t=!0);var a=this,i=a.params.lazy;if(void 0!==e&&0!==a.slides.length){var s=a.virtual&&a.params.virtual.enabled?a.$wrapperEl.children("."+a.params.slideClass+'[data-swiper-slide-index="'+e+'"]'):a.slides.eq(e),r=s.find("."+i.elementClass+":not(."+i.loadedClass+"):not(."+i.loadingClass+")");!s.hasClass(i.elementClass)||s.hasClass(i.loadedClass)||s.hasClass(i.loadingClass)||r.push(s[0]),0!==r.length&&r.each((function(e){var r=m(e);r.addClass(i.loadingClass);var n=r.attr("data-background"),l=r.attr("data-src"),o=r.attr("data-srcset"),d=r.attr("data-sizes"),p=r.parent("picture");a.loadImage(r[0],l||n,o,d,!1,(function(){if(null!=a&&a&&(!a||a.params)&&!a.destroyed){if(n?(r.css("background-image",'url("'+n+'")'),r.removeAttr("data-background")):(o&&(r.attr("srcset",o),r.removeAttr("data-srcset")),d&&(r.attr("sizes",d),r.removeAttr("data-sizes")),p.length&&p.children("source").each((function(e){var t=m(e);t.attr("data-srcset")&&(t.attr("srcset",t.attr("data-srcset")),t.removeAttr("data-srcset"))})),l&&(r.attr("src",l),r.removeAttr("data-src"))),r.addClass(i.loadedClass).removeClass(i.loadingClass),s.find("."+i.preloaderClass).remove(),a.params.loop&&t){var e=s.attr("data-swiper-slide-index");if(s.hasClass(a.params.slideDuplicateClass)){var u=a.$wrapperEl.children('[data-swiper-slide-index="'+e+'"]:not(.'+a.params.slideDuplicateClass+")");a.lazy.loadInSlide(u.index(),!1)}else{var c=a.$wrapperEl.children("."+a.params.slideDuplicateClass+'[data-swiper-slide-index="'+e+'"]');a.lazy.loadInSlide(c.index(),!1)}}a.emit("lazyImageReady",s[0],r[0]),a.params.autoHeight&&a.updateAutoHeight()}})),a.emit("lazyImageLoad",s[0],r[0])}))}},load:function(){var e=this,t=e.$wrapperEl,a=e.params,i=e.slides,s=e.activeIndex,r=e.virtual&&a.virtual.enabled,n=a.lazy,l=a.slidesPerView;function o(e){if(r){if(t.children("."+a.slideClass+'[data-swiper-slide-index="'+e+'"]').length)return!0}else if(i[e])return!0;return!1}function d(e){return r?m(e).attr("data-swiper-slide-index"):m(e).index()}if("auto"===l&&(l=0),e.lazy.initialImageLoaded||(e.lazy.initialImageLoaded=!0),e.params.watchSlidesVisibility)t.children("."+a.slideVisibleClass).each((function(t){var a=r?m(t).attr("data-swiper-slide-index"):m(t).index();e.lazy.loadInSlide(a)}));else if(l>1)for(var p=s;p<s+l;p+=1)o(p)&&e.lazy.loadInSlide(p);else e.lazy.loadInSlide(s);if(n.loadPrevNext)if(l>1||n.loadPrevNextAmount&&n.loadPrevNextAmount>1){for(var u=n.loadPrevNextAmount,c=l,h=Math.min(s+c+Math.max(u,c),i.length),v=Math.max(s-Math.max(c,u),0),f=s+l;f<h;f+=1)o(f)&&e.lazy.loadInSlide(f);for(var g=v;g<s;g+=1)o(g)&&e.lazy.loadInSlide(g)}else{var b=t.children("."+a.slideNextClass);b.length>0&&e.lazy.loadInSlide(d(b));var w=t.children("."+a.slidePrevClass);w.length>0&&e.lazy.loadInSlide(d(w))}},checkInViewOnLoad:function(){var e=l(),t=this;if(t&&!t.destroyed){var a=t.params.lazy.scrollingElement?m(t.params.lazy.scrollingElement):m(e),i=a[0]===e,s=i?e.innerWidth:a[0].offsetWidth,r=i?e.innerHeight:a[0].offsetHeight,n=t.$el.offset(),o=!1;t.rtlTranslate&&(n.left-=t.$el[0].scrollLeft);for(var d=[[n.left,n.top],[n.left+t.width,n.top],[n.left,n.top+t.height],[n.left+t.width,n.top+t.height]],p=0;p<d.length;p+=1){var u=d[p];if(u[0]>=0&&u[0]<=s&&u[1]>=0&&u[1]<=r){if(0===u[0]&&0===u[1])continue;o=!0}}var c=!("touchstart"!==t.touchEvents.start||!t.support.passiveListener||!t.params.passiveListeners)&&{passive:!0,capture:!1};o?(t.lazy.load(),a.off("scroll",t.lazy.checkInViewOnLoad,c)):t.lazy.scrollHandlerAttached||(t.lazy.scrollHandlerAttached=!0,a.on("scroll",t.lazy.checkInViewOnLoad,c))}}},re={LinearSpline:function(e,t){var a,i,s,r,n,l=function(e,t){for(i=-1,a=e.length;a-i>1;)e[s=a+i>>1]<=t?i=s:a=s;return a};return this.x=e,this.y=t,this.lastIndex=e.length-1,this.interpolate=function(e){return e?(n=l(this.x,e),r=n-1,(e-this.x[r])*(this.y[n]-this.y[r])/(this.x[n]-this.x[r])+this.y[r]):0},this},getInterpolateFunction:function(e){var t=this;t.controller.spline||(t.controller.spline=t.params.loop?new re.LinearSpline(t.slidesGrid,e.slidesGrid):new re.LinearSpline(t.snapGrid,e.snapGrid))},setTranslate:function(e,t){var a,i,s=this,r=s.controller.control,n=s.constructor;function l(e){var t=s.rtlTranslate?-s.translate:s.translate;"slide"===s.params.controller.by&&(s.controller.getInterpolateFunction(e),i=-s.controller.spline.interpolate(-t)),i&&"container"!==s.params.controller.by||(a=(e.maxTranslate()-e.minTranslate())/(s.maxTranslate()-s.minTranslate()),i=(t-s.minTranslate())*a+e.minTranslate()),s.params.controller.inverse&&(i=e.maxTranslate()-i),e.updateProgress(i),e.setTranslate(i,s),e.updateActiveIndex(),e.updateSlidesClasses()}if(Array.isArray(r))for(var o=0;o<r.length;o+=1)r[o]!==t&&r[o]instanceof n&&l(r[o]);else r instanceof n&&t!==r&&l(r)},setTransition:function(e,t){var a,i=this,s=i.constructor,r=i.controller.control;function n(t){t.setTransition(e,i),0!==e&&(t.transitionStart(),t.params.autoHeight&&E((function(){t.updateAutoHeight()})),t.$wrapperEl.transitionEnd((function(){r&&(t.params.loop&&"slide"===i.params.controller.by&&t.loopFix(),t.transitionEnd())})))}if(Array.isArray(r))for(a=0;a<r.length;a+=1)r[a]!==t&&r[a]instanceof s&&n(r[a]);else r instanceof s&&t!==r&&n(r)}},ne={getRandomNumber:function(e){void 0===e&&(e=16);return"x".repeat(e).replace(/x/g,(function(){return Math.round(16*Math.random()).toString(16)}))},makeElFocusable:function(e){return e.attr("tabIndex","0"),e},makeElNotFocusable:function(e){return e.attr("tabIndex","-1"),e},addElRole:function(e,t){return e.attr("role",t),e},addElRoleDescription:function(e,t){return e.attr("aria-roledescription",t),e},addElControls:function(e,t){return e.attr("aria-controls",t),e},addElLabel:function(e,t){return e.attr("aria-label",t),e},addElId:function(e,t){return e.attr("id",t),e},addElLive:function(e,t){return e.attr("aria-live",t),e},disableEl:function(e){return e.attr("aria-disabled",!0),e},enableEl:function(e){return e.attr("aria-disabled",!1),e},onEnterOrSpaceKey:function(e){if(13===e.keyCode||32===e.keyCode){var t=this,a=t.params.a11y,i=m(e.target);t.navigation&&t.navigation.$nextEl&&i.is(t.navigation.$nextEl)&&(t.isEnd&&!t.params.loop||t.slideNext(),t.isEnd?t.a11y.notify(a.lastSlideMessage):t.a11y.notify(a.nextSlideMessage)),t.navigation&&t.navigation.$prevEl&&i.is(t.navigation.$prevEl)&&(t.isBeginning&&!t.params.loop||t.slidePrev(),t.isBeginning?t.a11y.notify(a.firstSlideMessage):t.a11y.notify(a.prevSlideMessage)),t.pagination&&i.is(P(t.params.pagination.bulletClass))&&i[0].click()}},notify:function(e){var t=this.a11y.liveRegion;0!==t.length&&(t.html(""),t.html(e))},updateNavigation:function(){var e=this;if(!e.params.loop&&e.navigation){var t=e.navigation,a=t.$nextEl,i=t.$prevEl;i&&i.length>0&&(e.isBeginning?(e.a11y.disableEl(i),e.a11y.makeElNotFocusable(i)):(e.a11y.enableEl(i),e.a11y.makeElFocusable(i))),a&&a.length>0&&(e.isEnd?(e.a11y.disableEl(a),e.a11y.makeElNotFocusable(a)):(e.a11y.enableEl(a),e.a11y.makeElFocusable(a)))}},updatePagination:function(){var e=this,t=e.params.a11y;e.pagination&&e.params.pagination.clickable&&e.pagination.bullets&&e.pagination.bullets.length&&e.pagination.bullets.each((function(a){var i=m(a);e.a11y.makeElFocusable(i),e.params.pagination.renderBullet||(e.a11y.addElRole(i,"button"),e.a11y.addElLabel(i,t.paginationBulletMessage.replace(/\{\{index\}\}/,i.index()+1)))}))},init:function(){var e=this,t=e.params.a11y;e.$el.append(e.a11y.liveRegion);var a=e.$el;t.containerRoleDescriptionMessage&&e.a11y.addElRoleDescription(a,t.containerRoleDescriptionMessage),t.containerMessage&&e.a11y.addElLabel(a,t.containerMessage);var i=e.$wrapperEl,s=i.attr("id")||"swiper-wrapper-"+e.a11y.getRandomNumber(16),r=e.params.autoplay&&e.params.autoplay.enabled?"off":"polite";e.a11y.addElId(i,s),e.a11y.addElLive(i,r),t.itemRoleDescriptionMessage&&e.a11y.addElRoleDescription(m(e.slides),t.itemRoleDescriptionMessage),e.a11y.addElRole(m(e.slides),t.slideRole);var n,l,o=e.params.loop?e.slides.filter((function(t){return!t.classList.contains(e.params.slideDuplicateClass)})).length:e.slides.length;e.slides.each((function(a,i){var s=m(a),r=e.params.loop?parseInt(s.attr("data-swiper-slide-index"),10):i,n=t.slideLabelMessage.replace(/\{\{index\}\}/,r+1).replace(/\{\{slidesLength\}\}/,o);e.a11y.addElLabel(s,n)})),e.navigation&&e.navigation.$nextEl&&(n=e.navigation.$nextEl),e.navigation&&e.navigation.$prevEl&&(l=e.navigation.$prevEl),n&&n.length&&(e.a11y.makeElFocusable(n),"BUTTON"!==n[0].tagName&&(e.a11y.addElRole(n,"button"),n.on("keydown",e.a11y.onEnterOrSpaceKey)),e.a11y.addElLabel(n,t.nextSlideMessage),e.a11y.addElControls(n,s)),l&&l.length&&(e.a11y.makeElFocusable(l),"BUTTON"!==l[0].tagName&&(e.a11y.addElRole(l,"button"),l.on("keydown",e.a11y.onEnterOrSpaceKey)),e.a11y.addElLabel(l,t.prevSlideMessage),e.a11y.addElControls(l,s)),e.pagination&&e.params.pagination.clickable&&e.pagination.bullets&&e.pagination.bullets.length&&e.pagination.$el.on("keydown",P(e.params.pagination.bulletClass),e.a11y.onEnterOrSpaceKey)},destroy:function(){var e,t,a=this;a.a11y.liveRegion&&a.a11y.liveRegion.length>0&&a.a11y.liveRegion.remove(),a.navigation&&a.navigation.$nextEl&&(e=a.navigation.$nextEl),a.navigation&&a.navigation.$prevEl&&(t=a.navigation.$prevEl),e&&e.off("keydown",a.a11y.onEnterOrSpaceKey),t&&t.off("keydown",a.a11y.onEnterOrSpaceKey),a.pagination&&a.params.pagination.clickable&&a.pagination.bullets&&a.pagination.bullets.length&&a.pagination.$el.off("keydown",P(a.params.pagination.bulletClass),a.a11y.onEnterOrSpaceKey)}},le={init:function(){var e=this,t=l();if(e.params.history){if(!t.history||!t.history.pushState)return e.params.history.enabled=!1,void(e.params.hashNavigation.enabled=!0);var a=e.history;a.initialized=!0,a.paths=le.getPathValues(e.params.url),(a.paths.key||a.paths.value)&&(a.scrollToSlide(0,a.paths.value,e.params.runCallbacksOnInit),e.params.history.replaceState||t.addEventListener("popstate",e.history.setHistoryPopState))}},destroy:function(){var e=l();this.params.history.replaceState||e.removeEventListener("popstate",this.history.setHistoryPopState)},setHistoryPopState:function(){var e=this;e.history.paths=le.getPathValues(e.params.url),e.history.scrollToSlide(e.params.speed,e.history.paths.value,!1)},getPathValues:function(e){var t=l(),a=(e?new URL(e):t.location).pathname.slice(1).split("/").filter((function(e){return""!==e})),i=a.length;return{key:a[i-2],value:a[i-1]}},setHistory:function(e,t){var a=this,i=l();if(a.history.initialized&&a.params.history.enabled){var s;s=a.params.url?new URL(a.params.url):i.location;var r=a.slides.eq(t),n=le.slugify(r.attr("data-history"));if(a.params.history.root.length>0){var o=a.params.history.root;"/"===o[o.length-1]&&(o=o.slice(0,o.length-1)),n=o+"/"+e+"/"+n}else s.pathname.includes(e)||(n=e+"/"+n);var d=i.history.state;d&&d.value===n||(a.params.history.replaceState?i.history.replaceState({value:n},null,n):i.history.pushState({value:n},null,n))}},slugify:function(e){return e.toString().replace(/\s+/g,"-").replace(/[^\w-]+/g,"").replace(/--+/g,"-").replace(/^-+/,"").replace(/-+$/,"")},scrollToSlide:function(e,t,a){var i=this;if(t)for(var s=0,r=i.slides.length;s<r;s+=1){var n=i.slides.eq(s);if(le.slugify(n.attr("data-history"))===t&&!n.hasClass(i.params.slideDuplicateClass)){var l=n.index();i.slideTo(l,e,a)}}else i.slideTo(0,e,a)}},oe={onHashChange:function(){var e=this,t=r();e.emit("hashChange");var a=t.location.hash.replace("#","");if(a!==e.slides.eq(e.activeIndex).attr("data-hash")){var i=e.$wrapperEl.children("."+e.params.slideClass+'[data-hash="'+a+'"]').index();if(void 0===i)return;e.slideTo(i)}},setHash:function(){var e=this,t=l(),a=r();if(e.hashNavigation.initialized&&e.params.hashNavigation.enabled)if(e.params.hashNavigation.replaceState&&t.history&&t.history.replaceState)t.history.replaceState(null,null,"#"+e.slides.eq(e.activeIndex).attr("data-hash")||""),e.emit("hashSet");else{var i=e.slides.eq(e.activeIndex),s=i.attr("data-hash")||i.attr("data-history");a.location.hash=s||"",e.emit("hashSet")}},init:function(){var e=this,t=r(),a=l();if(!(!e.params.hashNavigation.enabled||e.params.history&&e.params.history.enabled)){e.hashNavigation.initialized=!0;var i=t.location.hash.replace("#","");if(i)for(var s=0,n=e.slides.length;s<n;s+=1){var o=e.slides.eq(s);if((o.attr("data-hash")||o.attr("data-history"))===i&&!o.hasClass(e.params.slideDuplicateClass)){var d=o.index();e.slideTo(d,0,e.params.runCallbacksOnInit,!0)}}e.params.hashNavigation.watchState&&m(a).on("hashchange",e.hashNavigation.onHashChange)}},destroy:function(){var e=l();this.params.hashNavigation.watchState&&m(e).off("hashchange",this.hashNavigation.onHashChange)}},de={run:function(){var e=this,t=e.slides.eq(e.activeIndex),a=e.params.autoplay.delay;t.attr("data-swiper-autoplay")&&(a=t.attr("data-swiper-autoplay")||e.params.autoplay.delay),clearTimeout(e.autoplay.timeout),e.autoplay.timeout=E((function(){var t;e.params.autoplay.reverseDirection?e.params.loop?(e.loopFix(),t=e.slidePrev(e.params.speed,!0,!0),e.emit("autoplay")):e.isBeginning?e.params.autoplay.stopOnLastSlide?e.autoplay.stop():(t=e.slideTo(e.slides.length-1,e.params.speed,!0,!0),e.emit("autoplay")):(t=e.slidePrev(e.params.speed,!0,!0),e.emit("autoplay")):e.params.loop?(e.loopFix(),t=e.slideNext(e.params.speed,!0,!0),e.emit("autoplay")):e.isEnd?e.params.autoplay.stopOnLastSlide?e.autoplay.stop():(t=e.slideTo(0,e.params.speed,!0,!0),e.emit("autoplay")):(t=e.slideNext(e.params.speed,!0,!0),e.emit("autoplay")),(e.params.cssMode&&e.autoplay.running||!1===t)&&e.autoplay.run()}),a)},start:function(){var e=this;return void 0===e.autoplay.timeout&&(!e.autoplay.running&&(e.autoplay.running=!0,e.emit("autoplayStart"),e.autoplay.run(),!0))},stop:function(){var e=this;return!!e.autoplay.running&&(void 0!==e.autoplay.timeout&&(e.autoplay.timeout&&(clearTimeout(e.autoplay.timeout),e.autoplay.timeout=void 0),e.autoplay.running=!1,e.emit("autoplayStop"),!0))},pause:function(e){var t=this;t.autoplay.running&&(t.autoplay.paused||(t.autoplay.timeout&&clearTimeout(t.autoplay.timeout),t.autoplay.paused=!0,0!==e&&t.params.autoplay.waitForTransition?["transitionend","webkitTransitionEnd"].forEach((function(e){t.$wrapperEl[0].addEventListener(e,t.autoplay.onTransitionEnd)})):(t.autoplay.paused=!1,t.autoplay.run())))},onVisibilityChange:function(){var e=this,t=r();"hidden"===t.visibilityState&&e.autoplay.running&&e.autoplay.pause(),"visible"===t.visibilityState&&e.autoplay.paused&&(e.autoplay.run(),e.autoplay.paused=!1)},onTransitionEnd:function(e){var t=this;t&&!t.destroyed&&t.$wrapperEl&&e.target===t.$wrapperEl[0]&&(["transitionend","webkitTransitionEnd"].forEach((function(e){t.$wrapperEl[0].removeEventListener(e,t.autoplay.onTransitionEnd)})),t.autoplay.paused=!1,t.autoplay.running?t.autoplay.run():t.autoplay.stop())},onMouseEnter:function(){var e=this;e.params.autoplay.disableOnInteraction?e.autoplay.stop():e.autoplay.pause(),["transitionend","webkitTransitionEnd"].forEach((function(t){e.$wrapperEl[0].removeEventListener(t,e.autoplay.onTransitionEnd)}))},onMouseLeave:function(){var e=this;e.params.autoplay.disableOnInteraction||(e.autoplay.paused=!1,e.autoplay.run())},attachMouseEvents:function(){var e=this;e.params.autoplay.pauseOnMouseEnter&&(e.$el.on("mouseenter",e.autoplay.onMouseEnter),e.$el.on("mouseleave",e.autoplay.onMouseLeave))},detachMouseEvents:function(){var e=this;e.$el.off("mouseenter",e.autoplay.onMouseEnter),e.$el.off("mouseleave",e.autoplay.onMouseLeave)}},pe={setTranslate:function(){for(var e=this,t=e.slides,a=0;a<t.length;a+=1){var i=e.slides.eq(a),s=-i[0].swiperSlideOffset;e.params.virtualTranslate||(s-=e.translate);var r=0;e.isHorizontal()||(r=s,s=0);var n=e.params.fadeEffect.crossFade?Math.max(1-Math.abs(i[0].progress),0):1+Math.min(Math.max(i[0].progress,-1),0);i.css({opacity:n}).transform("translate3d("+s+"px, "+r+"px, 0px)")}},setTransition:function(e){var t=this,a=t.slides,i=t.$wrapperEl;if(a.transition(e),t.params.virtualTranslate&&0!==e){var s=!1;a.transitionEnd((function(){if(!s&&t&&!t.destroyed){s=!0,t.animating=!1;for(var e=["webkitTransitionEnd","transitionend"],a=0;a<e.length;a+=1)i.trigger(e[a])}}))}}},ue={setTranslate:function(){var e,t=this,a=t.$el,i=t.$wrapperEl,s=t.slides,r=t.width,n=t.height,l=t.rtlTranslate,o=t.size,d=t.browser,p=t.params.cubeEffect,u=t.isHorizontal(),c=t.virtual&&t.params.virtual.enabled,h=0;p.shadow&&(u?(0===(e=i.find(".swiper-cube-shadow")).length&&(e=m('<div class="swiper-cube-shadow"></div>'),i.append(e)),e.css({height:r+"px"})):0===(e=a.find(".swiper-cube-shadow")).length&&(e=m('<div class="swiper-cube-shadow"></div>'),a.append(e)));for(var v=0;v<s.length;v+=1){var f=s.eq(v),g=v;c&&(g=parseInt(f.attr("data-swiper-slide-index"),10));var b=90*g,w=Math.floor(b/360);l&&(b=-b,w=Math.floor(-b/360));var y=Math.max(Math.min(f[0].progress,1),-1),E=0,x=0,T=0;g%4==0?(E=4*-w*o,T=0):(g-1)%4==0?(E=0,T=4*-w*o):(g-2)%4==0?(E=o+4*w*o,T=o):(g-3)%4==0&&(E=-o,T=3*o+4*o*w),l&&(E=-E),u||(x=E,E=0);var C="rotateX("+(u?0:-b)+"deg) rotateY("+(u?b:0)+"deg) translate3d("+E+"px, "+x+"px, "+T+"px)";if(y<=1&&y>-1&&(h=90*g+90*y,l&&(h=90*-g-90*y)),f.transform(C),p.slideShadows){var S=u?f.find(".swiper-slide-shadow-left"):f.find(".swiper-slide-shadow-top"),M=u?f.find(".swiper-slide-shadow-right"):f.find(".swiper-slide-shadow-bottom");0===S.length&&(S=m('<div class="swiper-slide-shadow-'+(u?"left":"top")+'"></div>'),f.append(S)),0===M.length&&(M=m('<div class="swiper-slide-shadow-'+(u?"right":"bottom")+'"></div>'),f.append(M)),S.length&&(S[0].style.opacity=Math.max(-y,0)),M.length&&(M[0].style.opacity=Math.max(y,0))}}if(i.css({"-webkit-transform-origin":"50% 50% -"+o/2+"px","-moz-transform-origin":"50% 50% -"+o/2+"px","-ms-transform-origin":"50% 50% -"+o/2+"px","transform-origin":"50% 50% -"+o/2+"px"}),p.shadow)if(u)e.transform("translate3d(0px, "+(r/2+p.shadowOffset)+"px, "+-r/2+"px) rotateX(90deg) rotateZ(0deg) scale("+p.shadowScale+")");else{var z=Math.abs(h)-90*Math.floor(Math.abs(h)/90),P=1.5-(Math.sin(2*z*Math.PI/360)/2+Math.cos(2*z*Math.PI/360)/2),k=p.shadowScale,$=p.shadowScale/P,L=p.shadowOffset;e.transform("scale3d("+k+", 1, "+$+") translate3d(0px, "+(n/2+L)+"px, "+-n/2/$+"px) rotateX(-90deg)")}var I=d.isSafari||d.isWebView?-o/2:0;i.transform("translate3d(0px,0,"+I+"px) rotateX("+(t.isHorizontal()?0:h)+"deg) rotateY("+(t.isHorizontal()?-h:0)+"deg)")},setTransition:function(e){var t=this,a=t.$el;t.slides.transition(e).find(".swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left").transition(e),t.params.cubeEffect.shadow&&!t.isHorizontal()&&a.find(".swiper-cube-shadow").transition(e)}},ce={setTranslate:function(){for(var e=this,t=e.slides,a=e.rtlTranslate,i=0;i<t.length;i+=1){var s=t.eq(i),r=s[0].progress;e.params.flipEffect.limitRotation&&(r=Math.max(Math.min(s[0].progress,1),-1));var n=-180*r,l=0,o=-s[0].swiperSlideOffset,d=0;if(e.isHorizontal()?a&&(n=-n):(d=o,o=0,l=-n,n=0),s[0].style.zIndex=-Math.abs(Math.round(r))+t.length,e.params.flipEffect.slideShadows){var p=e.isHorizontal()?s.find(".swiper-slide-shadow-left"):s.find(".swiper-slide-shadow-top"),u=e.isHorizontal()?s.find(".swiper-slide-shadow-right"):s.find(".swiper-slide-shadow-bottom");0===p.length&&(p=m('<div class="swiper-slide-shadow-'+(e.isHorizontal()?"left":"top")+'"></div>'),s.append(p)),0===u.length&&(u=m('<div class="swiper-slide-shadow-'+(e.isHorizontal()?"right":"bottom")+'"></div>'),s.append(u)),p.length&&(p[0].style.opacity=Math.max(-r,0)),u.length&&(u[0].style.opacity=Math.max(r,0))}s.transform("translate3d("+o+"px, "+d+"px, 0px) rotateX("+l+"deg) rotateY("+n+"deg)")}},setTransition:function(e){var t=this,a=t.slides,i=t.activeIndex,s=t.$wrapperEl;if(a.transition(e).find(".swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left").transition(e),t.params.virtualTranslate&&0!==e){var r=!1;a.eq(i).transitionEnd((function(){if(!r&&t&&!t.destroyed){r=!0,t.animating=!1;for(var e=["webkitTransitionEnd","transitionend"],a=0;a<e.length;a+=1)s.trigger(e[a])}}))}}},he={setTranslate:function(){for(var e=this,t=e.width,a=e.height,i=e.slides,s=e.slidesSizesGrid,r=e.params.coverflowEffect,n=e.isHorizontal(),l=e.translate,o=n?t/2-l:a/2-l,d=n?r.rotate:-r.rotate,p=r.depth,u=0,c=i.length;u<c;u+=1){var h=i.eq(u),v=s[u],f=(o-h[0].swiperSlideOffset-v/2)/v*r.modifier,g=n?d*f:0,b=n?0:d*f,w=-p*Math.abs(f),y=r.stretch;"string"==typeof y&&-1!==y.indexOf("%")&&(y=parseFloat(r.stretch)/100*v);var E=n?0:y*f,x=n?y*f:0,T=1-(1-r.scale)*Math.abs(f);Math.abs(x)<.001&&(x=0),Math.abs(E)<.001&&(E=0),Math.abs(w)<.001&&(w=0),Math.abs(g)<.001&&(g=0),Math.abs(b)<.001&&(b=0),Math.abs(T)<.001&&(T=0);var C="translate3d("+x+"px,"+E+"px,"+w+"px)  rotateX("+b+"deg) rotateY("+g+"deg) scale("+T+")";if(h.transform(C),h[0].style.zIndex=1-Math.abs(Math.round(f)),r.slideShadows){var S=n?h.find(".swiper-slide-shadow-left"):h.find(".swiper-slide-shadow-top"),M=n?h.find(".swiper-slide-shadow-right"):h.find(".swiper-slide-shadow-bottom");0===S.length&&(S=m('<div class="swiper-slide-shadow-'+(n?"left":"top")+'"></div>'),h.append(S)),0===M.length&&(M=m('<div class="swiper-slide-shadow-'+(n?"right":"bottom")+'"></div>'),h.append(M)),S.length&&(S[0].style.opacity=f>0?f:0),M.length&&(M[0].style.opacity=-f>0?-f:0)}}},setTransition:function(e){this.slides.transition(e).find(".swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left").transition(e)}},ve={init:function(){var e=this,t=e.params.thumbs;if(e.thumbs.initialized)return!1;e.thumbs.initialized=!0;var a=e.constructor;return t.swiper instanceof a?(e.thumbs.swiper=t.swiper,M(e.thumbs.swiper.originalParams,{watchSlidesProgress:!0,slideToClickedSlide:!1}),M(e.thumbs.swiper.params,{watchSlidesProgress:!0,slideToClickedSlide:!1})):C(t.swiper)&&(e.thumbs.swiper=new a(M({},t.swiper,{watchSlidesVisibility:!0,watchSlidesProgress:!0,slideToClickedSlide:!1})),e.thumbs.swiperCreated=!0),e.thumbs.swiper.$el.addClass(e.params.thumbs.thumbsContainerClass),e.thumbs.swiper.on("tap",e.thumbs.onThumbClick),!0},onThumbClick:function(){var e=this,t=e.thumbs.swiper;if(t){var a=t.clickedIndex,i=t.clickedSlide;if(!(i&&m(i).hasClass(e.params.thumbs.slideThumbActiveClass)||null==a)){var s;if(s=t.params.loop?parseInt(m(t.clickedSlide).attr("data-swiper-slide-index"),10):a,e.params.loop){var r=e.activeIndex;e.slides.eq(r).hasClass(e.params.slideDuplicateClass)&&(e.loopFix(),e._clientLeft=e.$wrapperEl[0].clientLeft,r=e.activeIndex);var n=e.slides.eq(r).prevAll('[data-swiper-slide-index="'+s+'"]').eq(0).index(),l=e.slides.eq(r).nextAll('[data-swiper-slide-index="'+s+'"]').eq(0).index();s=void 0===n?l:void 0===l?n:l-r<r-n?l:n}e.slideTo(s)}}},update:function(e){var t=this,a=t.thumbs.swiper;if(a){var i="auto"===a.params.slidesPerView?a.slidesPerViewDynamic():a.params.slidesPerView,s=t.params.thumbs.autoScrollOffset,r=s&&!a.params.loop;if(t.realIndex!==a.realIndex||r){var n,l,o=a.activeIndex;if(a.params.loop){a.slides.eq(o).hasClass(a.params.slideDuplicateClass)&&(a.loopFix(),a._clientLeft=a.$wrapperEl[0].clientLeft,o=a.activeIndex);var d=a.slides.eq(o).prevAll('[data-swiper-slide-index="'+t.realIndex+'"]').eq(0).index(),p=a.slides.eq(o).nextAll('[data-swiper-slide-index="'+t.realIndex+'"]').eq(0).index();n=void 0===d?p:void 0===p?d:p-o==o-d?a.params.slidesPerGroup>1?p:o:p-o<o-d?p:d,l=t.activeIndex>t.previousIndex?"next":"prev"}else l=(n=t.realIndex)>t.previousIndex?"next":"prev";r&&(n+="next"===l?s:-1*s),a.visibleSlidesIndexes&&a.visibleSlidesIndexes.indexOf(n)<0&&(a.params.centeredSlides?n=n>o?n-Math.floor(i/2)+1:n+Math.floor(i/2)-1:n>o&&a.params.slidesPerGroup,a.slideTo(n,e?0:void 0))}var u=1,c=t.params.thumbs.slideThumbActiveClass;if(t.params.slidesPerView>1&&!t.params.centeredSlides&&(u=t.params.slidesPerView),t.params.thumbs.multipleActiveThumbs||(u=1),u=Math.floor(u),a.slides.removeClass(c),a.params.loop||a.params.virtual&&a.params.virtual.enabled)for(var h=0;h<u;h+=1)a.$wrapperEl.children('[data-swiper-slide-index="'+(t.realIndex+h)+'"]').addClass(c);else for(var v=0;v<u;v+=1)a.slides.eq(t.realIndex+v).addClass(c)}}},fe=[U,Z,{name:"mousewheel",params:{mousewheel:{enabled:!1,releaseOnEdges:!1,invert:!1,forceToAxis:!1,sensitivity:1,eventsTarget:"container",thresholdDelta:null,thresholdTime:null}},create:function(){z(this,{mousewheel:{enabled:!1,lastScrollTime:x(),lastEventBeforeSnap:void 0,recentWheelEvents:[],enable:J.enable,disable:J.disable,handle:J.handle,handleMouseEnter:J.handleMouseEnter,handleMouseLeave:J.handleMouseLeave,animateSlider:J.animateSlider,releaseScroll:J.releaseScroll}})},on:{init:function(e){!e.params.mousewheel.enabled&&e.params.cssMode&&e.mousewheel.disable(),e.params.mousewheel.enabled&&e.mousewheel.enable()},destroy:function(e){e.params.cssMode&&e.mousewheel.enable(),e.mousewheel.enabled&&e.mousewheel.disable()}}},{name:"navigation",params:{navigation:{nextEl:null,prevEl:null,hideOnClick:!1,disabledClass:"swiper-button-disabled",hiddenClass:"swiper-button-hidden",lockClass:"swiper-button-lock"}},create:function(){z(this,{navigation:t({},Q)})},on:{init:function(e){e.navigation.init(),e.navigation.update()},toEdge:function(e){e.navigation.update()},fromEdge:function(e){e.navigation.update()},destroy:function(e){e.navigation.destroy()},"enable disable":function(e){var t=e.navigation,a=t.$nextEl,i=t.$prevEl;a&&a[e.enabled?"removeClass":"addClass"](e.params.navigation.lockClass),i&&i[e.enabled?"removeClass":"addClass"](e.params.navigation.lockClass)},click:function(e,t){var a=e.navigation,i=a.$nextEl,s=a.$prevEl,r=t.target;if(e.params.navigation.hideOnClick&&!m(r).is(s)&&!m(r).is(i)){if(e.pagination&&e.params.pagination&&e.params.pagination.clickable&&(e.pagination.el===r||e.pagination.el.contains(r)))return;var n;i?n=i.hasClass(e.params.navigation.hiddenClass):s&&(n=s.hasClass(e.params.navigation.hiddenClass)),!0===n?e.emit("navigationShow"):e.emit("navigationHide"),i&&i.toggleClass(e.params.navigation.hiddenClass),s&&s.toggleClass(e.params.navigation.hiddenClass)}}}},{name:"pagination",params:{pagination:{el:null,bulletElement:"span",clickable:!1,hideOnClick:!1,renderBullet:null,renderProgressbar:null,renderFraction:null,renderCustom:null,progressbarOpposite:!1,type:"bullets",dynamicBullets:!1,dynamicMainBullets:1,formatFractionCurrent:function(e){return e},formatFractionTotal:function(e){return e},bulletClass:"swiper-pagination-bullet",bulletActiveClass:"swiper-pagination-bullet-active",modifierClass:"swiper-pagination-",currentClass:"swiper-pagination-current",totalClass:"swiper-pagination-total",hiddenClass:"swiper-pagination-hidden",progressbarFillClass:"swiper-pagination-progressbar-fill",progressbarOppositeClass:"swiper-pagination-progressbar-opposite",clickableClass:"swiper-pagination-clickable",lockClass:"swiper-pagination-lock"}},create:function(){z(this,{pagination:t({dynamicBulletIndex:0},ee)})},on:{init:function(e){e.pagination.init(),e.pagination.render(),e.pagination.update()},activeIndexChange:function(e){(e.params.loop||void 0===e.snapIndex)&&e.pagination.update()},snapIndexChange:function(e){e.params.loop||e.pagination.update()},slidesLengthChange:function(e){e.params.loop&&(e.pagination.render(),e.pagination.update())},snapGridLengthChange:function(e){e.params.loop||(e.pagination.render(),e.pagination.update())},destroy:function(e){e.pagination.destroy()},"enable disable":function(e){var t=e.pagination.$el;t&&t[e.enabled?"removeClass":"addClass"](e.params.pagination.lockClass)},click:function(e,t){var a=t.target;if(e.params.pagination.el&&e.params.pagination.hideOnClick&&e.pagination.$el.length>0&&!m(a).hasClass(e.params.pagination.bulletClass)){if(e.navigation&&(e.navigation.nextEl&&a===e.navigation.nextEl||e.navigation.prevEl&&a===e.navigation.prevEl))return;!0===e.pagination.$el.hasClass(e.params.pagination.hiddenClass)?e.emit("paginationShow"):e.emit("paginationHide"),e.pagination.$el.toggleClass(e.params.pagination.hiddenClass)}}}},{name:"scrollbar",params:{scrollbar:{el:null,dragSize:"auto",hide:!1,draggable:!1,snapOnRelease:!0,lockClass:"swiper-scrollbar-lock",dragClass:"swiper-scrollbar-drag"}},create:function(){z(this,{scrollbar:t({isTouched:!1,timeout:null,dragTimeout:null},te)})},on:{init:function(e){e.scrollbar.init(),e.scrollbar.updateSize(),e.scrollbar.setTranslate()},update:function(e){e.scrollbar.updateSize()},resize:function(e){e.scrollbar.updateSize()},observerUpdate:function(e){e.scrollbar.updateSize()},setTranslate:function(e){e.scrollbar.setTranslate()},setTransition:function(e,t){e.scrollbar.setTransition(t)},"enable disable":function(e){var t=e.scrollbar.$el;t&&t[e.enabled?"removeClass":"addClass"](e.params.scrollbar.lockClass)},destroy:function(e){e.scrollbar.destroy()}}},{name:"parallax",params:{parallax:{enabled:!1}},create:function(){z(this,{parallax:t({},ae)})},on:{beforeInit:function(e){e.params.parallax.enabled&&(e.params.watchSlidesProgress=!0,e.originalParams.watchSlidesProgress=!0)},init:function(e){e.params.parallax.enabled&&e.parallax.setTranslate()},setTranslate:function(e){e.params.parallax.enabled&&e.parallax.setTranslate()},setTransition:function(e,t){e.params.parallax.enabled&&e.parallax.setTransition(t)}}},{name:"zoom",params:{zoom:{enabled:!1,maxRatio:3,minRatio:1,toggle:!0,containerClass:"swiper-zoom-container",zoomedSlideClass:"swiper-slide-zoomed"}},create:function(){var e=this;z(e,{zoom:t({enabled:!1,scale:1,currentScale:1,isScaling:!1,gesture:{$slideEl:void 0,slideWidth:void 0,slideHeight:void 0,$imageEl:void 0,$imageWrapEl:void 0,maxRatio:3},image:{isTouched:void 0,isMoved:void 0,currentX:void 0,currentY:void 0,minX:void 0,minY:void 0,maxX:void 0,maxY:void 0,width:void 0,height:void 0,startX:void 0,startY:void 0,touchesStart:{},touchesCurrent:{}},velocity:{x:void 0,y:void 0,prevPositionX:void 0,prevPositionY:void 0,prevTime:void 0}},ie)});var a=1;Object.defineProperty(e.zoom,"scale",{get:function(){return a},set:function(t){if(a!==t){var i=e.zoom.gesture.$imageEl?e.zoom.gesture.$imageEl[0]:void 0,s=e.zoom.gesture.$slideEl?e.zoom.gesture.$slideEl[0]:void 0;e.emit("zoomChange",t,i,s)}a=t}})},on:{init:function(e){e.params.zoom.enabled&&e.zoom.enable()},destroy:function(e){e.zoom.disable()},touchStart:function(e,t){e.zoom.enabled&&e.zoom.onTouchStart(t)},touchEnd:function(e,t){e.zoom.enabled&&e.zoom.onTouchEnd(t)},doubleTap:function(e,t){!e.animating&&e.params.zoom.enabled&&e.zoom.enabled&&e.params.zoom.toggle&&e.zoom.toggle(t)},transitionEnd:function(e){e.zoom.enabled&&e.params.zoom.enabled&&e.zoom.onTransitionEnd()},slideChange:function(e){e.zoom.enabled&&e.params.zoom.enabled&&e.params.cssMode&&e.zoom.onTransitionEnd()}}},{name:"lazy",params:{lazy:{checkInView:!1,enabled:!1,loadPrevNext:!1,loadPrevNextAmount:1,loadOnTransitionStart:!1,scrollingElement:"",elementClass:"swiper-lazy",loadingClass:"swiper-lazy-loading",loadedClass:"swiper-lazy-loaded",preloaderClass:"swiper-lazy-preloader"}},create:function(){z(this,{lazy:t({initialImageLoaded:!1},se)})},on:{beforeInit:function(e){e.params.lazy.enabled&&e.params.preloadImages&&(e.params.preloadImages=!1)},init:function(e){e.params.lazy.enabled&&!e.params.loop&&0===e.params.initialSlide&&(e.params.lazy.checkInView?e.lazy.checkInViewOnLoad():e.lazy.load())},scroll:function(e){e.params.freeMode&&!e.params.freeModeSticky&&e.lazy.load()},"scrollbarDragMove resize _freeModeNoMomentumRelease":function(e){e.params.lazy.enabled&&e.lazy.load()},transitionStart:function(e){e.params.lazy.enabled&&(e.params.lazy.loadOnTransitionStart||!e.params.lazy.loadOnTransitionStart&&!e.lazy.initialImageLoaded)&&e.lazy.load()},transitionEnd:function(e){e.params.lazy.enabled&&!e.params.lazy.loadOnTransitionStart&&e.lazy.load()},slideChange:function(e){var t=e.params,a=t.lazy,i=t.cssMode,s=t.watchSlidesVisibility,r=t.watchSlidesProgress,n=t.touchReleaseOnEdges,l=t.resistanceRatio;a.enabled&&(i||(s||r)&&(n||0===l))&&e.lazy.load()}}},{name:"controller",params:{controller:{control:void 0,inverse:!1,by:"slide"}},create:function(){z(this,{controller:t({control:this.params.controller.control},re)})},on:{update:function(e){e.controller.control&&e.controller.spline&&(e.controller.spline=void 0,delete e.controller.spline)},resize:function(e){e.controller.control&&e.controller.spline&&(e.controller.spline=void 0,delete e.controller.spline)},observerUpdate:function(e){e.controller.control&&e.controller.spline&&(e.controller.spline=void 0,delete e.controller.spline)},setTranslate:function(e,t,a){e.controller.control&&e.controller.setTranslate(t,a)},setTransition:function(e,t,a){e.controller.control&&e.controller.setTransition(t,a)}}},{name:"a11y",params:{a11y:{enabled:!0,notificationClass:"swiper-notification",prevSlideMessage:"Previous slide",nextSlideMessage:"Next slide",firstSlideMessage:"This is the first slide",lastSlideMessage:"This is the last slide",paginationBulletMessage:"Go to slide {{index}}",slideLabelMessage:"{{index}} / {{slidesLength}}",containerMessage:null,containerRoleDescriptionMessage:null,itemRoleDescriptionMessage:null,slideRole:"group"}},create:function(){z(this,{a11y:t({},ne,{liveRegion:m('<span class="'+this.params.a11y.notificationClass+'" aria-live="assertive" aria-atomic="true"></span>')})})},on:{afterInit:function(e){e.params.a11y.enabled&&(e.a11y.init(),e.a11y.updateNavigation())},toEdge:function(e){e.params.a11y.enabled&&e.a11y.updateNavigation()},fromEdge:function(e){e.params.a11y.enabled&&e.a11y.updateNavigation()},paginationUpdate:function(e){e.params.a11y.enabled&&e.a11y.updatePagination()},destroy:function(e){e.params.a11y.enabled&&e.a11y.destroy()}}},{name:"history",params:{history:{enabled:!1,root:"",replaceState:!1,key:"slides"}},create:function(){z(this,{history:t({},le)})},on:{init:function(e){e.params.history.enabled&&e.history.init()},destroy:function(e){e.params.history.enabled&&e.history.destroy()},"transitionEnd _freeModeNoMomentumRelease":function(e){e.history.initialized&&e.history.setHistory(e.params.history.key,e.activeIndex)},slideChange:function(e){e.history.initialized&&e.params.cssMode&&e.history.setHistory(e.params.history.key,e.activeIndex)}}},{name:"hash-navigation",params:{hashNavigation:{enabled:!1,replaceState:!1,watchState:!1}},create:function(){z(this,{hashNavigation:t({initialized:!1},oe)})},on:{init:function(e){e.params.hashNavigation.enabled&&e.hashNavigation.init()},destroy:function(e){e.params.hashNavigation.enabled&&e.hashNavigation.destroy()},"transitionEnd _freeModeNoMomentumRelease":function(e){e.hashNavigation.initialized&&e.hashNavigation.setHash()},slideChange:function(e){e.hashNavigation.initialized&&e.params.cssMode&&e.hashNavigation.setHash()}}},{name:"autoplay",params:{autoplay:{enabled:!1,delay:3e3,waitForTransition:!0,disableOnInteraction:!0,stopOnLastSlide:!1,reverseDirection:!1,pauseOnMouseEnter:!1}},create:function(){z(this,{autoplay:t({},de,{running:!1,paused:!1})})},on:{init:function(e){e.params.autoplay.enabled&&(e.autoplay.start(),r().addEventListener("visibilitychange",e.autoplay.onVisibilityChange),e.autoplay.attachMouseEvents())},beforeTransitionStart:function(e,t,a){e.autoplay.running&&(a||!e.params.autoplay.disableOnInteraction?e.autoplay.pause(t):e.autoplay.stop())},sliderFirstMove:function(e){e.autoplay.running&&(e.params.autoplay.disableOnInteraction?e.autoplay.stop():e.autoplay.pause())},touchEnd:function(e){e.params.cssMode&&e.autoplay.paused&&!e.params.autoplay.disableOnInteraction&&e.autoplay.run()},destroy:function(e){e.autoplay.detachMouseEvents(),e.autoplay.running&&e.autoplay.stop(),r().removeEventListener("visibilitychange",e.autoplay.onVisibilityChange)}}},{name:"effect-fade",params:{fadeEffect:{crossFade:!1}},create:function(){z(this,{fadeEffect:t({},pe)})},on:{beforeInit:function(e){if("fade"===e.params.effect){e.classNames.push(e.params.containerModifierClass+"fade");var t={slidesPerView:1,slidesPerColumn:1,slidesPerGroup:1,watchSlidesProgress:!0,spaceBetween:0,virtualTranslate:!0};M(e.params,t),M(e.originalParams,t)}},setTranslate:function(e){"fade"===e.params.effect&&e.fadeEffect.setTranslate()},setTransition:function(e,t){"fade"===e.params.effect&&e.fadeEffect.setTransition(t)}}},{name:"effect-cube",params:{cubeEffect:{slideShadows:!0,shadow:!0,shadowOffset:20,shadowScale:.94}},create:function(){z(this,{cubeEffect:t({},ue)})},on:{beforeInit:function(e){if("cube"===e.params.effect){e.classNames.push(e.params.containerModifierClass+"cube"),e.classNames.push(e.params.containerModifierClass+"3d");var t={slidesPerView:1,slidesPerColumn:1,slidesPerGroup:1,watchSlidesProgress:!0,resistanceRatio:0,spaceBetween:0,centeredSlides:!1,virtualTranslate:!0};M(e.params,t),M(e.originalParams,t)}},setTranslate:function(e){"cube"===e.params.effect&&e.cubeEffect.setTranslate()},setTransition:function(e,t){"cube"===e.params.effect&&e.cubeEffect.setTransition(t)}}},{name:"effect-flip",params:{flipEffect:{slideShadows:!0,limitRotation:!0}},create:function(){z(this,{flipEffect:t({},ce)})},on:{beforeInit:function(e){if("flip"===e.params.effect){e.classNames.push(e.params.containerModifierClass+"flip"),e.classNames.push(e.params.containerModifierClass+"3d");var t={slidesPerView:1,slidesPerColumn:1,slidesPerGroup:1,watchSlidesProgress:!0,spaceBetween:0,virtualTranslate:!0};M(e.params,t),M(e.originalParams,t)}},setTranslate:function(e){"flip"===e.params.effect&&e.flipEffect.setTranslate()},setTransition:function(e,t){"flip"===e.params.effect&&e.flipEffect.setTransition(t)}}},{name:"effect-coverflow",params:{coverflowEffect:{rotate:50,stretch:0,depth:100,scale:1,modifier:1,slideShadows:!0}},create:function(){z(this,{coverflowEffect:t({},he)})},on:{beforeInit:function(e){"coverflow"===e.params.effect&&(e.classNames.push(e.params.containerModifierClass+"coverflow"),e.classNames.push(e.params.containerModifierClass+"3d"),e.params.watchSlidesProgress=!0,e.originalParams.watchSlidesProgress=!0)},setTranslate:function(e){"coverflow"===e.params.effect&&e.coverflowEffect.setTranslate()},setTransition:function(e,t){"coverflow"===e.params.effect&&e.coverflowEffect.setTransition(t)}}},{name:"thumbs",params:{thumbs:{swiper:null,multipleActiveThumbs:!0,autoScrollOffset:0,slideThumbActiveClass:"swiper-slide-thumb-active",thumbsContainerClass:"swiper-container-thumbs"}},create:function(){z(this,{thumbs:t({swiper:null,initialized:!1},ve)})},on:{beforeInit:function(e){var t=e.params.thumbs;t&&t.swiper&&(e.thumbs.init(),e.thumbs.update(!0))},slideChange:function(e){e.thumbs.swiper&&e.thumbs.update()},update:function(e){e.thumbs.swiper&&e.thumbs.update()},resize:function(e){e.thumbs.swiper&&e.thumbs.update()},observerUpdate:function(e){e.thumbs.swiper&&e.thumbs.update()},setTransition:function(e,t){var a=e.thumbs.swiper;a&&a.setTransition(t)},beforeDestroy:function(e){var t=e.thumbs.swiper;t&&e.thumbs.swiperCreated&&t&&t.destroy()}}}];return q.use(fe),q}));
718
719/*================================================================================
720 * @name: bPopup - if you can't get it up, use bPopup
721 * @author: (c)Bjoern Klinggaard (twitter@bklinggaard)
722 * @demo: http://dinbror.dk/bpopup
723 * @version: 0.11.0.min
724 ================================================================================*/
725 (function(c){c.fn.bPopup=function(A,E){function L(){a.contentContainer=c(a.contentContainer||b);switch(a.content){case "iframe":var d=c('<iframe class="b-iframe" '+a.iframeAttr+"></iframe>");d.appendTo(a.contentContainer);t=b.outerHeight(!0);u=b.outerWidth(!0);B();d.attr("src",a.loadUrl);l(a.loadCallback);break;case "image":B();c("<img />").load(function(){l(a.loadCallback);F(c(this))}).attr("src",a.loadUrl).hide().appendTo(a.contentContainer);break;default:B(),c('<div class="b-ajax-wrapper"></div>').load(a.loadUrl,a.loadData,function(d,b,e){l(a.loadCallback,b);F(c(this))}).hide().appendTo(a.contentContainer)}}function B(){a.modal&&c('<div class="b-modal '+e+'"></div>').css({backgroundColor:a.modalColor,position:"fixed",top:0,right:0,bottom:0,left:0,opacity:0,zIndex:a.zIndex+v}).appendTo(a.appendTo).fadeTo(a.speed,a.opacity);C();b.data("bPopup",a).data("id",e).css({left:"slideIn"==a.transition||"slideBack"==a.transition?"slideBack"==a.transition?f.scrollLeft()+w:-1*(x+u):m(!(!a.follow[0]&&n||g)),position:a.positionStyle||"absolute",top:"slideDown"==a.transition||"slideUp"==a.transition?"slideUp"==a.transition?f.scrollTop()+y:z+-1*t:p(!(!a.follow[1]&&q||g)),"z-index":a.zIndex+v+1}).each(function(){a.appending&&c(this).appendTo(a.appendTo)});G(!0)}function r(){a.modal&&c(".b-modal."+b.data("id")).fadeTo(a.speed,0,function(){c(this).remove()});a.scrollBar||c("html").css("overflow","auto");c(".b-modal."+e).unbind("click");f.unbind("keydown."+e);k.unbind("."+e).data("bPopup",0<k.data("bPopup")-1?k.data("bPopup")-1:null);b.undelegate(".bClose, ."+a.closeClass,"click."+e,r).data("bPopup",
725null);clearTimeout(H);G();return!1}function I(d){y=k.height();w=k.width();h=D();if(h.x||h.y)clearTimeout(J),J=setTimeout(function(){C();d=d||a.followSpeed;var e={};h.x&&(e.left=a.follow[0]?m(!0):"auto");h.y&&(e.top=a.follow[1]?p(!0):"auto");b.dequeue().each(function(){g?c(this).css({left:x,top:z}):c(this).animate(e,d,a.followEasing)})},50)}function F(d){var c=d.width(),e=d.height(),f={};a.contentContainer.css({height:e,width:c});e>=b.height()&&(f.height=b.height());c>=b.width()&&(f.width=b.width());t=b.outerHeight(!0);u=b.outerWidth(!0);C();a.contentContainer.css({height:"auto",width:"auto"});f.left=m(!(!a.follow[0]&&n||g));f.top=p(!(!a.follow[1]&&q||g));b.animate(f,250,function(){d.show();h=D()})}function M(){k.data("bPopup",v);b.delegate(".bClose, ."+a.closeClass,"click."+e,r);a.modalClose&&c(".b-modal."+e).css("cursor","pointer").bind("click",r);N||!a.follow[0]&&!a.follow[1]||k.bind("scroll."+e,function(){if(h.x||h.y){var d={};h.x&&(d.left=a.follow[0]?m(!g):"auto");h.y&&(d.top=a.follow[1]?p(!g):"auto");b.dequeue().animate(d,a.followSpeed,a.followEasing)}}).bind("resize."+e,function(){I()});a.escClose&&f.bind("keydown."+e,function(a){27==a.which&&r()})}function G(d){function c(e){b.css({display:"block",opacity:1}).animate(e,a.speed,a.easing,function(){K(d)})}switch(d?a.transition:a.transitionClose||a.transition){case "slideIn":c({left:d?m(!(!a.follow[0]&&n||g)):f.scrollLeft()-(u||b.outerWidth(!0))-200});break;case "slideBack":c({left:d?m(!(!a.follow[0]&&n||g)):f.scrollLeft()+w+200});break;case "slideDown":c({top:d?p(!(!a.follow[1]&&q||g)):f.scrollTop()-(t||b.outerHeight(!0))-200});break;case "slideUp":c({top:d?p(!(!a.follow[1]&&q||g)):f.scrollTop()+y+200});break;default:b.stop().fadeTo(a.speed,d?1:0,function(){K(d)})}}function K(d){d?(M(),l(E),a.autoClose&&(H=setTimeout(r,a.autoClose))):(b.hide(),l(a.onClose),a.loadUrl&&(a.contentContainer.empty(),b.css({height:"auto",width:"auto"})))}function m(a){return a?x+f.scrollLeft():x}function p(a){return a?z+f.scrollTop():z}function l(a,e){c.isFunction(a)&&a.call(b,e)}function C(){z=q?a.position[1]:Math.max(0,(y-b.outerHeight(!0))/2-a.amsl);x=n?a.position[0]:(w-b.outerWidth(!0))/2;h=D()}function D(){return{x:w>b.outerWidth(!0),y:y>b.outerHeight(!0)}}c.isFunction(A)&&(E=A,A=null);var a=c.extend({},c.fn.bPopup.defaults,A);a.scrollBar||c("html").css("overflow","hidden");var b=this,f=c(document),k=c(window),y=k.height(),w=k.width(),N=/OS 6(_\d)+/i.test(navigator.userAgent),v=0,e,h,q,n,g,z,x,t,u,J,H;b.close=function(){r()};b.reposition=function(a){I(a)};return b.each(function(){c(this).data("bPopup")||(l(a.onOpen),v=(k.data("bPopup")||0)+1,e="__b-popup"+v+"__",q="auto"!==a.position[1],n="auto"!==a.position[0],g="fixed"===a.positionStyle,t=b.outerHeight(!0),u=b.outerWidth(!0),a.loadUrl?L():B())})};c.fn.bPopup.defaults={amsl:50,appending:!0,appendTo:"body",autoClose:!1,closeClass:"b-close",content:"ajax",contentContainer:!1,easing:"swing",escClose:!0,follow:[!0,!0],followEasing:"swing",followSpeed:500,iframeAttr:'scrolling="no" frameborder="0"',loadCallback:!1,loadData:!1,loadUrl:!1,modal:!0,modalClose:!0,modalColor:"#000",onClose:!1,onOpen:!1,opacity:.7,position:["auto","auto"],positionStyle:"absolute",scrollBar:!0,speed:250,transition:"fadeIn",transitionClose:!1,zIndex:9997}})(jQuery);
726
727/******/ (function(modules) { // webpackBootstrap
728/******/ 	// The module cache
729/******/ 	var installedModules = {};
730/******/
731/******/ 	// The require function
732/******/ 	function __webpack_require__(moduleId) {
733/******/
734/******/ 		// Check if module is in cache
735/******/ 		if(installedModules[moduleId]) {
736/******/ 			return installedModules[moduleId].exports;
737/******/ 		}
738/******/ 		// Create a new module (and put it into the cache)
739/******/ 		var module = installedModules[moduleId] = {
740/******/ 			i: moduleId,
741/******/ 			l: false,
742/******/ 			exports: {}
743/******/ 		};
744/******/
745/******/ 		// Execute the module function
746/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
747/******/
748/******/ 		// Flag the module as loaded
vendor: 2,851 bytes, lines 749-814
749/******/ 		module.l = true;
750/******/
751/******/ 		// Return the exports of the module
752/******/ 		return module.exports;
753/******/ 	}
754/******/
755/******/
756/******/ 	// expose the modules object (__webpack_modules__)
757/******/ 	__webpack_require__.m = modules;
758/******/
759/******/ 	// expose the module cache
760/******/ 	__webpack_require__.c = installedModules;
761/******/
762/******/ 	// define getter function for harmony exports
763/******/ 	__webpack_require__.d = function(exports, name, getter) {
764/******/ 		if(!__webpack_require__.o(exports, name)) {
765/******/ 			Object.defineProperty(exports, name, { enumerable: true, get: getter });
766/******/ 		}
767/******/ 	};
768/******/
769/******/ 	// define __esModule on exports
770/******/ 	__webpack_require__.r = function(exports) {
771/******/ 		if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
772/******/ 			Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
773/******/ 		}
774/******/ 		Object.defineProperty(exports, '__esModule', { value: true });
775/******/ 	};
776/******/
777/******/ 	// create a fake namespace object
778/******/ 	// mode & 1: value is a module id, require it
779/******/ 	// mode & 2: merge all properties of value into the ns
780/******/ 	// mode & 4: return value when already ns object
781/******/ 	// mode & 8|1: behave like require
782/******/ 	__webpack_require__.t = function(value, mode) {
783/******/ 		if(mode & 1) value = __webpack_require__(value);
784/******/ 		if(mode & 8) return value;
785/******/ 		if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
786/******/ 		var ns = Object.create(null);
787/******/ 		__webpack_require__.r(ns);
788/******/ 		Object.defineProperty(ns, 'default', { enumerable: true, value: value });
789/******/ 		if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
790/******/ 		return ns;
791/******/ 	};
792/******/
793/******/ 	// getDefaultExport function for compatibility with non-harmony modules
794/******/ 	__webpack_require__.n = function(module) {
795/******/ 		var getter = module && module.__esModule ?
796/******/ 			function getDefault() { return module['default']; } :
797/******/ 			function getModuleExports() { return module; };
798/******/ 		__webpack_require__.d(getter, 'a', getter);
799/******/ 		return getter;
800/******/ 	};
801/******/
802/******/ 	// Object.prototype.hasOwnProperty.call
803/******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
804/******/
805/******/ 	// __webpack_public_path__
806/******/ 	__webpack_require__.p = "/assets/js/";
807/******/
808/******/
809/******/ 	// Load entry module and return exports
810/******/ 	return __webpack_require__(__webpack_require__.s = "./src/js/index.js");
811/******/ })
812/************************************************************************/
813/******/ ({
814
vendor: 60,623 bytes, lines 815-2251
815/***/ "./node_modules/gsap/CSSPlugin.js":
816/*!****************************************!*\
817  !*** ./node_modules/gsap/CSSPlugin.js ***!
818  \****************************************/
819/*! exports provided: CSSPlugin, default, _getBBox, _createElement, checkPrefix */
820/***/ (function(module, __webpack_exports__, __webpack_require__) {
821
822"use strict";
823__webpack_require__.r(__webpack_exports__);
824/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CSSPlugin", function() { return CSSPlugin; });
825/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return CSSPlugin; });
826/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_getBBox", function() { return _getBBox; });
827/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_createElement", function() { return _createElement; });
828/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "checkPrefix", function() { return _checkPropPrefix; });
829/* harmony import */ var _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./gsap-core.js */ "./node_modules/gsap/gsap-core.js");
830/*** IMPORTS FROM imports-loader ***/
831var define = false;
832
833/*!
834 * CSSPlugin 3.6.1
835 * https://greensock.com
836 *
837 * Copyright 2008-2021, GreenSock. All rights reserved.
838 * Subject to the terms at https://greensock.com/standard-license or for
839 * Club GreenSock members, the agreement issued with that membership.
840 * @author: Jack Doyle, [email protected]
841*/
842
843/* eslint-disable */
844
845
846var _win,
847    _doc,
848    _docElement,
849    _pluginInitted,
850    _tempDiv,
851    _tempDivStyler,
852    _recentSetterPlugin,
853    _windowExists = function _windowExists() {
854  return typeof window !== "undefined";
855},
856    _transformProps = {},
857    _RAD2DEG = 180 / Math.PI,
858    _DEG2RAD = Math.PI / 180,
859    _atan2 = Math.atan2,
860    _bigNum = 1e8,
861    _capsExp = /([A-Z])/g,
862    _horizontalExp = /(?:left|right|width|margin|padding|x)/i,
863    _complexExp = /[\s,\(]\S/,
864    _propertyAliases = {
865  autoAlpha: "opacity,visibility",
866  scale: "scaleX,scaleY",
867  alpha: "opacity"
868},
869    _renderCSSProp = function _renderCSSProp(ratio, data) {
870  return data.set(data.t, data.p, Math.round((data.s + data.c * ratio) * 10000) / 10000 + data.u, data);
871},
872    _renderPropWithEnd = function _renderPropWithEnd(ratio, data) {
873  return data.set(data.t, data.p, ratio === 1 ? data.e : Math.round((data.s + data.c * ratio) * 10000) / 10000 + data.u, data);
874},
875    _renderCSSPropWithBeginning = function _renderCSSPropWithBeginning(ratio, data) {
876  return data.set(data.t, data.p, ratio ? Math.round((data.s + data.c * ratio) * 10000) / 10000 + data.u : data.b, data);
877},
878    //if units change, we need a way to render the original unit/value when the tween goes all the way back to the beginning (ratio:0)
879_renderRoundedCSSProp = function _renderRoundedCSSProp(ratio, data) {
880  var value = data.s + data.c * ratio;
881  data.set(data.t, data.p, ~~(value + (value < 0 ? -.5 : .5)) + data.u, data);
882},
883    _renderNonTweeningValue = function _renderNonTweeningValue(ratio, data) {
884  return data.set(data.t, data.p, ratio ? data.e : data.b, data);
885},
886    _renderNonTweeningValueOnlyAtEnd = function _renderNonTweeningValueOnlyAtEnd(ratio, data) {
887  return data.set(data.t, data.p, ratio !== 1 ? data.b : data.e, data);
888},
889    _setterCSSStyle = function _setterCSSStyle(target, property, value) {
890  return target.style[property] = value;
891},
892    _setterCSSProp = function _setterCSSProp(target, property, value) {
893  return target.style.setProperty(property, value);
894},
895    _setterTransform = function _setterTransform(target, property, value) {
896  return target._gsap[property] = value;
897},
898    _setterScale = function _setterScale(target, property, value) {
899  return target._gsap.scaleX = target._gsap.scaleY = value;
900},
901    _setterScaleWithRender = function _setterScaleWithRender(target, property, value, data, ratio) {
902  var cache = target._gsap;
903  cache.scaleX = cache.scaleY = value;
904  cache.renderTransform(ratio, cache);
905},
906    _setterTransformWithRender = function _setterTransformWithRender(target, property, value, data, ratio) {
907  var cache = target._gsap;
908  cache[property] = value;
909  cache.renderTransform(ratio, cache);
910},
911    _transformProp = "transform",
912    _transformOriginProp = _transformProp + "Origin",
913    _supports3D,
914    _createElement = function _createElement(type, ns) {
915  var e = _doc.createElementNS ? _doc.createElementNS((ns || "http://www.w3.org/1999/xhtml").replace(/^https/, "http"), type) : _doc.createElement(type); //some servers swap in https for http in the namespace which can break things, making "style" inaccessible.
916
917  return e.style ? e : _doc.createElement(type); //some environments won't allow access to the element's style when created with a namespace in which case we default to the standard createElement() to work around the issue. Also note that when GSAP is embedded directly inside an SVG file, createElement() won't allow access to the style object in Firefox (see https://greensock.com/forums/topic/20215-problem-using-tweenmax-in-standalone-self-containing-svg-file-err-cannot-set-property-csstext-of-undefined/).
918},
919    _getComputedProperty = function _getComputedProperty(target, property, skipPrefixFallback) {
920  var cs = getComputedStyle(target);
921  return cs[property] || cs.getPropertyValue(property.replace(_capsExp, "-$1").toLowerCase()) || cs.getPropertyValue(property) || !skipPrefixFallback && _getComputedProperty(target, _checkPropPrefix(property) || property, 1) || ""; //css variables may not need caps swapped out for dashes and lowercase.
922},
923    _prefixes = "O,Moz,ms,Ms,Webkit".split(","),
924    _checkPropPrefix = function _checkPropPrefix(property, element, preferPrefix) {
925  var e = element || _tempDiv,
926      s = e.style,
927      i = 5;
928
929  if (property in s && !preferPrefix) {
930    return property;
931  }
932
933  property = property.charAt(0).toUpperCase() + property.substr(1);
934
935  while (i-- && !(_prefixes[i] + property in s)) {}
936
937  return i < 0 ? null : (i === 3 ? "ms" : i >= 0 ? _prefixes[i] : "") + property;
938},
939    _initCore = function _initCore() {
940  if (_windowExists() && window.document) {
941    _win = window;
942    _doc = _win.document;
943    _docElement = _doc.documentElement;
944    _tempDiv = _createElement("div") || {
945      style: {}
946    };
947    _tempDivStyler = _createElement("div");
948    _transformProp = _checkPropPrefix(_transformProp);
949    _transformOriginProp = _transformProp + "Origin";
950    _tempDiv.style.cssText = "border-width:0;line-height:0;position:absolute;padding:0"; //make sure to override certain properties that may contaminate measurements, in case the user has overreaching style sheets.
951
952    _supports3D = !!_checkPropPrefix("perspective");
953    _pluginInitted = 1;
954  }
955},
956    _getBBoxHack = function _getBBoxHack(swapIfPossible) {
957  //works around issues in some browsers (like Firefox) that don't correctly report getBBox() on SVG elements inside a <defs> element and/or <mask>. We try creating an SVG, adding it to the documentElement and toss the element in there so that it's definitely part of the rendering tree, then grab the bbox and if it works, we actually swap out the original getBBox() method for our own that does these extra steps whenever getBBox is needed. This helps ensure that performance is optimal (only do all these extra steps when absolutely necessary...most elements don't need it).
958  var svg = _createElement("svg", this.ownerSVGElement && this.ownerSVGElement.getAttribute("xmlns") || "http://www.w3.org/2000/svg"),
959      oldParent = this.parentNode,
960      oldSibling = this.nextSibling,
961      oldCSS = this.style.cssText,
962      bbox;
963
964  _docElement.appendChild(svg);
965
966  svg.appendChild(this);
967  this.style.display = "block";
968
969  if (swapIfPossible) {
970    try {
971      bbox = this.getBBox();
972      this._gsapBBox = this.getBBox; //store the original
973
974      this.getBBox = _getBBoxHack;
975    } catch (e) {}
976  } else if (this._gsapBBox) {
977    bbox = this._gsapBBox();
978  }
979
980  if (oldParent) {
981    if (oldSibling) {
982      oldParent.insertBefore(this, oldSibling);
983    } else {
984      oldParent.appendChild(this);
985    }
986  }
987
988  _docElement.removeChild(svg);
989
990  this.style.cssText = oldCSS;
991  return bbox;
992},
993    _getAttributeFallbacks = function _getAttributeFallbacks(target, attributesArray) {
994  var i = attributesArray.length;
995
996  while (i--) {
997    if (target.hasAttribute(attributesArray[i])) {
998      return target.getAttribute(attributesArray[i]);
999    }
1000  }
1001},
1002    _getBBox = function _getBBox(target) {
1003  var bounds;
1004
1005  try {
1006    bounds = target.getBBox(); //Firefox throws errors if you try calling getBBox() on an SVG element that's not rendered (like in a <symbol> or <defs>). https://bugzilla.mozilla.org/show_bug.cgi?id=612118
1007  } catch (error) {
1008    bounds = _getBBoxHack.call(target, true);
1009  }
1010
1011  bounds && (bounds.width || bounds.height) || target.getBBox === _getBBoxHack || (bounds = _getBBoxHack.call(target, true)); //some browsers (like Firefox) misreport the bounds if the element has zero width and height (it just assumes it's at x:0, y:0), thus we need to manually grab the position in that case.
1012
1013  return bounds && !bounds.width && !bounds.x && !bounds.y ? {
1014    x: +_getAttributeFallbacks(target, ["x", "cx", "x1"]) || 0,
1015    y: +_getAttributeFallbacks(target, ["y", "cy", "y1"]) || 0,
1016    width: 0,
1017    height: 0
1018  } : bounds;
1019},
1020    _isSVG = function _isSVG(e) {
1021  return !!(e.getCTM && (!e.parentNode || e.ownerSVGElement) && _getBBox(e));
1022},
1023    //reports if the element is an SVG on which getBBox() actually works
1024_removeProperty = function _removeProperty(target, property) {
1025  if (property) {
1026    var style = target.style;
1027
1028    if (property in _transformProps && property !== _transformOriginProp) {
1029      property = _transformProp;
1030    }
1031
1032    if (style.removeProperty) {
1033      if (property.substr(0, 2) === "ms" || property.substr(0, 6) === "webkit") {
1034        //Microsoft and some Webkit browsers don't conform to the standard of capitalizing the first prefix character, so we adjust so that when we prefix the caps with a dash, it's correct (otherwise it'd be "ms-transform" instead of "-ms-transform" for IE9, for example)
1035        property = "-" + property;
1036      }
1037
1038      style.removeProperty(property.replace(_capsExp, "-$1").toLowerCase());
1039    } else {
1040      //note: old versions of IE use "removeAttribute()" instead of "removeProperty()"
1041      style.removeAttribute(property);
1042    }
1043  }
1044},
1045    _addNonTweeningPT = function _addNonTweeningPT(plugin, target, property, beginning, end, onlySetAtEnd) {
1046  var pt = new _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["PropTween"](plugin._pt, target, property, 0, 1, onlySetAtEnd ? _renderNonTweeningValueOnlyAtEnd : _renderNonTweeningValue);
1047  plugin._pt = pt;
1048  pt.b = beginning;
1049  pt.e = end;
1050
1051  plugin._props.push(property);
1052
1053  return pt;
1054},
1055    _nonConvertibleUnits = {
1056  deg: 1,
1057  rad: 1,
1058  turn: 1
1059},
1060    //takes a single value like 20px and converts it to the unit specified, like "%", returning only the numeric amount.
1061_convertToUnit = function _convertToUnit(target, property, value, unit) {
1062  var curValue = parseFloat(value) || 0,
1063      curUnit = (value + "").trim().substr((curValue + "").length) || "px",
1064      // some browsers leave extra whitespace at the beginning of CSS variables, hence the need to trim()
1065  style = _tempDiv.style,
1066      horizontal = _horizontalExp.test(property),
1067      isRootSVG = target.tagName.toLowerCase() === "svg",
1068      measureProperty = (isRootSVG ? "client" : "offset") + (horizontal ? "Width" : "Height"),
1069      amount = 100,
1070      toPixels = unit === "px",
1071      toPercent = unit === "%",
1072      px,
1073      parent,
1074      cache,
1075      isSVG;
1076
1077  if (unit === curUnit || !curValue || _nonConvertibleUnits[unit] || _nonConvertibleUnits[curUnit]) {
1078    return curValue;
1079  }
1080
1081  curUnit !== "px" && !toPixels && (curValue = _convertToUnit(target, property, value, "px"));
1082  isSVG = target.getCTM && _isSVG(target);
1083
1084  if ((toPercent || curUnit === "%") && (_transformProps[property] || ~property.indexOf("adius"))) {
1085    px = isSVG ? target.getBBox()[horizontal ? "width" : "height"] : target[measureProperty];
1086    return Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_round"])(toPercent ? curValue / px * amount : curValue / 100 * px);
1087  }
1088
1089  style[horizontal ? "width" : "height"] = amount + (toPixels ? curUnit : unit);
1090  parent = ~property.indexOf("adius") || unit === "em" && target.appendChild && !isRootSVG ? target : target.parentNode;
1091
1092  if (isSVG) {
1093    parent = (target.ownerSVGElement || {}).parentNode;
1094  }
1095
1096  if (!parent || parent === _doc || !parent.appendChild) {
1097    parent = _doc.body;
1098  }
1099
1100  cache = parent._gsap;
1101
1102  if (cache && toPercent && cache.width && horizontal && cache.time === _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_ticker"].time) {
1103    return Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_round"])(curValue / cache.width * amount);
1104  } else {
1105    (toPercent || curUnit === "%") && (style.position = _getComputedProperty(target, "position"));
1106    parent === target && (style.position = "static"); // like for borderRadius, if it's a % we must have it relative to the target itself but that may not have position: relative or position: absolute in which case it'd go up the chain until it finds its offsetParent (bad). position: static protects against that.
1107
1108    parent.appendChild(_tempDiv);
1109    px = _tempDiv[measureProperty];
1110    parent.removeChild(_tempDiv);
1111    style.position = "absolute";
1112
1113    if (horizontal && toPercent) {
1114      cache = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_getCache"])(parent);
1115      cache.time = _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_ticker"].time;
1116      cache.width = parent[measureProperty];
1117    }
1118  }
1119
1120  return Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_round"])(toPixels ? px * curValue / amount : px && curValue ? amount / px * curValue : 0);
1121},
1122    _get = function _get(target, property, unit, uncache) {
1123  var value;
1124  _pluginInitted || _initCore();
1125
1126  if (property in _propertyAliases && property !== "transform") {
1127    property = _propertyAliases[property];
1128
1129    if (~property.indexOf(",")) {
1130      property = property.split(",")[0];
1131    }
1132  }
1133
1134  if (_transformProps[property] && property !== "transform") {
1135    value = _parseTransform(target, uncache);
1136    value = property !== "transformOrigin" ? value[property] : _firstTwoOnly(_getComputedProperty(target, _transformOriginProp)) + " " + value.zOrigin + "px";
1137  } else {
1138    value = target.style[property];
1139
1140    if (!value || value === "auto" || uncache || ~(value + "").indexOf("calc(")) {
1141      value = _specialProps[property] && _specialProps[property](target, property, unit) || _getComputedProperty(target, property) || Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_getProperty"])(target, property) || (property === "opacity" ? 1 : 0); // note: some browsers, like Firefox, don't report borderRadius correctly! Instead, it only reports every corner like  borderTopLeftRadius
1142    }
1143  }
1144
1145  return unit && !~(value + "").trim().indexOf(" ") ? _convertToUnit(target, property, value, unit) + unit : value;
1146},
1147    _tweenComplexCSSString = function _tweenComplexCSSString(target, prop, start, end) {
1148  //note: we call _tweenComplexCSSString.call(pluginInstance...) to ensure that it's scoped properly. We may call it from within a plugin too, thus "this" would refer to the plugin.
1149  if (!start || start === "none") {
1150    // some browsers like Safari actually PREFER the prefixed property and mis-report the unprefixed value like clipPath (BUG). In other words, even though clipPath exists in the style ("clipPath" in target.style) and it's set in the CSS properly (along with -webkit-clip-path), Safari reports clipPath as "none" whereas WebkitClipPath reports accurately like "ellipse(100% 0% at 50% 0%)", so in this case we must SWITCH to using the prefixed property instead. See https://greensock.com/forums/topic/18310-clippath-doesnt-work-on-ios/
1151    var p = _checkPropPrefix(prop, target, 1),
1152        s = p && _getComputedProperty(target, p, 1);
1153
1154    if (s && s !== start) {
1155      prop = p;
1156      start = s;
1157    } else if (prop === "borderColor") {
1158      start = _getComputedProperty(target, "borderTopColor"); // Firefox bug: always reports "borderColor" as "", so we must fall back to borderTopColor. See https://greensock.com/forums/topic/24583-how-to-return-colors-that-i-had-after-reverse/
1159    }
1160  }
1161
1162  var pt = new _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["PropTween"](this._pt, target.style, prop, 0, 1, _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_renderComplexString"]),
1163      index = 0,
1164      matchIndex = 0,
1165      a,
1166      result,
1167      startValues,
1168      startNum,
1169      color,
1170      startValue,
1171      endValue,
1172      endNum,
1173      chunk,
1174      endUnit,
1175      startUnit,
1176      relative,
1177      endValues;
1178  pt.b = start;
1179  pt.e = end;
1180  start += ""; //ensure values are strings
1181
1182  end += "";
1183
1184  if (end === "auto") {
1185    target.style[prop] = end;
1186    end = _getComputedProperty(target, prop) || end;
1187    target.style[prop] = start;
1188  }
1189
1190  a = [start, end];
1191
1192  Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_colorStringFilter"])(a); //pass an array with the starting and ending values and let the filter do whatever it needs to the values. If colors are found, it returns true and then we must match where the color shows up order-wise because for things like boxShadow, sometimes the browser provides the computed values with the color FIRST, but the user provides it with the color LAST, so flip them if necessary. Same for drop-shadow().
1193
1194
1195  start = a[0];
1196  end = a[1];
1197  startValues = start.match(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_numWithUnitExp"]) || [];
1198  endValues = end.match(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_numWithUnitExp"]) || [];
1199
1200  if (endValues.length) {
1201    while (result = _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_numWithUnitExp"].exec(end)) {
1202      endValue = result[0];
1203      chunk = end.substring(index, result.index);
1204
1205      if (color) {
1206        color = (color + 1) % 5;
1207      } else if (chunk.substr(-5) === "rgba(" || chunk.substr(-5) === "hsla(") {
1208        color = 1;
1209      }
1210
1211      if (endValue !== (startValue = startValues[matchIndex++] || "")) {
1212        startNum = parseFloat(startValue) || 0;
1213        startUnit = startValue.substr((startNum + "").length);
1214        relative = endValue.charAt(1) === "=" ? +(endValue.charAt(0) + "1") : 0;
1215
1216        if (relative) {
1217          endValue = endValue.substr(2);
1218        }
1219
1220        endNum = parseFloat(endValue);
1221        endUnit = endValue.substr((endNum + "").length);
1222        index = _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_numWithUnitExp"].lastIndex - endUnit.length;
1223
1224        if (!endUnit) {
1225          //if something like "perspective:300" is passed in and we must add a unit to the end
1226          endUnit = endUnit || _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_config"].units[prop] || startUnit;
1227
1228          if (index === end.length) {
1229            end += endUnit;
1230            pt.e += endUnit;
1231          }
1232        }
1233
1234        if (startUnit !== endUnit) {
1235          startNum = _convertToUnit(target, prop, startValue, endUnit) || 0;
1236        } //these nested PropTweens are handled in a special way - we'll never actually call a render or setter method on them. We'll just loop through them in the parent complex string PropTween's render method.
1237
1238
1239        pt._pt = {
1240          _next: pt._pt,
1241          p: chunk || matchIndex === 1 ? chunk : ",",
1242          //note: SVG spec allows omission of comma/space when a negative sign is wedged between two numbers, like 2.5-5.3 instead of 2.5,-5.3 but when tweening, the negative value may switch to positive, so we insert the comma just in case.
1243          s: startNum,
1244          c: relative ? relative * endNum : endNum - startNum,
1245          m: color && color < 4 || prop === "zIndex" ? Math.round : 0
1246        };
1247      }
1248    }
1249
1250    pt.c = index < end.length ? end.substring(index, end.length) : ""; //we use the "c" of the PropTween to store the final part of the string (after the last number)
1251  } else {
1252    pt.r = prop === "display" && end === "none" ? _renderNonTweeningValueOnlyAtEnd : _renderNonTweeningValue;
1253  }
1254
1255  _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_relExp"].test(end) && (pt.e = 0); //if the end string contains relative values or dynamic random(...) values, delete the end it so that on the final render we don't actually set it to the string with += or -= characters (forces it to use the calculated value).
1256
1257  this._pt = pt; //start the linked list with this new PropTween. Remember, we call _tweenComplexCSSString.call(pluginInstance...) to ensure that it's scoped properly. We may call it from within another plugin too, thus "this" would refer to the plugin.
1258
1259  return pt;
1260},
1261    _keywordToPercent = {
1262  top: "0%",
1263  bottom: "100%",
1264  left: "0%",
1265  right: "100%",
1266  center: "50%"
1267},
1268    _convertKeywordsToPercentages = function _convertKeywordsToPercentages(value) {
1269  var split = value.split(" "),
1270      x = split[0],
1271      y = split[1] || "50%";
1272
1273  if (x === "top" || x === "bottom" || y === "left" || y === "right") {
1274    //the user provided them in the wrong order, so flip them
1275    value = x;
1276    x = y;
1277    y = value;
1278  }
1279
1280  split[0] = _keywordToPercent[x] || x;
1281  split[1] = _keywordToPercent[y] || y;
1282  return split.join(" ");
1283},
1284    _renderClearProps = function _renderClearProps(ratio, data) {
1285  if (data.tween && data.tween._time === data.tween._dur) {
1286    var target = data.t,
1287        style = target.style,
1288        props = data.u,
1289        cache = target._gsap,
1290        prop,
1291        clearTransforms,
1292        i;
1293
1294    if (props === "all" || props === true) {
1295      style.cssText = "";
1296      clearTransforms = 1;
1297    } else {
1298      props = props.split(",");
1299      i = props.length;
1300
1301      while (--i > -1) {
1302        prop = props[i];
1303
1304        if (_transformProps[prop]) {
1305          clearTransforms = 1;
1306          prop = prop === "transformOrigin" ? _transformOriginProp : _transformProp;
1307        }
1308
1309        _removeProperty(target, prop);
1310      }
1311    }
1312
1313    if (clearTransforms) {
1314      _removeProperty(target, _transformProp);
1315
1316      if (cache) {
1317        cache.svg && target.removeAttribute("transform");
1318
1319        _parseTransform(target, 1); // force all the cached values back to "normal"/identity, otherwise if there's another tween that's already set to render transforms on this element, it could display the wrong values.
1320
1321
1322        cache.uncache = 1;
1323      }
1324    }
1325  }
1326},
1327    // note: specialProps should return 1 if (and only if) they have a non-zero priority. It indicates we need to sort the linked list.
1328_specialProps = {
1329  clearProps: function clearProps(plugin, target, property, endValue, tween) {
1330    if (tween.data !== "isFromStart") {
1331      var pt = plugin._pt = new _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["PropTween"](plugin._pt, target, property, 0, 0, _renderClearProps);
1332      pt.u = endValue;
1333      pt.pr = -10;
1334      pt.tween = tween;
1335
1336      plugin._props.push(property);
1337
1338      return 1;
1339    }
1340  }
1341  /* className feature (about 0.4kb gzipped).
1342  , className(plugin, target, property, endValue, tween) {
1343  	let _renderClassName = (ratio, data) => {
1344  			data.css.render(ratio, data.css);
1345  			if (!ratio || ratio === 1) {
1346  				let inline = data.rmv,
1347  					target = data.t,
1348  					p;
1349  				target.setAttribute("class", ratio ? data.e : data.b);
1350  				for (p in inline) {
1351  					_removeProperty(target, p);
1352  				}
1353  			}
1354  		},
1355  		_getAllStyles = (target) => {
1356  			let styles = {},
1357  				computed = getComputedStyle(target),
1358  				p;
1359  			for (p in computed) {
1360  				if (isNaN(p) && p !== "cssText" && p !== "length") {
1361  					styles[p] = computed[p];
1362  				}
1363  			}
1364  			_setDefaults(styles, _parseTransform(target, 1));
1365  			return styles;
1366  		},
1367  		startClassList = target.getAttribute("class"),
1368  		style = target.style,
1369  		cssText = style.cssText,
1370  		cache = target._gsap,
1371  		classPT = cache.classPT,
1372  		inlineToRemoveAtEnd = {},
1373  		data = {t:target, plugin:plugin, rmv:inlineToRemoveAtEnd, b:startClassList, e:(endValue.charAt(1) !== "=") ? endValue : startClassList.replace(new RegExp("(?:\\s|^)" + endValue.substr(2) + "(?![\\w-])"), "") + ((endValue.charAt(0) === "+") ? " " + endValue.substr(2) : "")},
1374  		changingVars = {},
1375  		startVars = _getAllStyles(target),
1376  		transformRelated = /(transform|perspective)/i,
1377  		endVars, p;
1378  	if (classPT) {
1379  		classPT.r(1, classPT.d);
1380  		_removeLinkedListItem(classPT.d.plugin, classPT, "_pt");
1381  	}
1382  	target.setAttribute("class", data.e);
1383  	endVars = _getAllStyles(target, true);
1384  	target.setAttribute("class", startClassList);
1385  	for (p in endVars) {
1386  		if (endVars[p] !== startVars[p] && !transformRelated.test(p)) {
1387  			changingVars[p] = endVars[p];
1388  			if (!style[p] && style[p] !== "0") {
1389  				inlineToRemoveAtEnd[p] = 1;
1390  			}
1391  		}
1392  	}
1393  	cache.classPT = plugin._pt = new PropTween(plugin._pt, target, "className", 0, 0, _renderClassName, data, 0, -11);
1394  	if (style.cssText !== cssText) { //only apply if things change. Otherwise, in cases like a background-image that's pulled dynamically, it could cause a refresh. See https://greensock.com/forums/topic/20368-possible-gsap-bug-switching-classnames-in-chrome/.
1395  		style.cssText = cssText; //we recorded cssText before we swapped classes and ran _getAllStyles() because in cases when a className tween is overwritten, we remove all the related tweening properties from that class change (otherwise class-specific stuff can't override properties we've directly set on the target's style object due to specificity).
1396  	}
1397  	_parseTransform(target, true); //to clear the caching of transforms
1398  	data.css = new gsap.plugins.css();
1399  	data.css.init(target, changingVars, tween);
1400  	plugin._props.push(...data.css._props);
1401  	return 1;
1402  }
1403  */
1404
1405},
1406
1407/*
1408 * --------------------------------------------------------------------------------------
1409 * TRANSFORMS
1410 * --------------------------------------------------------------------------------------
1411 */
1412_identity2DMatrix = [1, 0, 0, 1, 0, 0],
1413    _rotationalProperties = {},
1414    _isNullTransform = function _isNullTransform(value) {
1415  return value === "matrix(1, 0, 0, 1, 0, 0)" || value === "none" || !value;
1416},
1417    _getComputedTransformMatrixAsArray = function _getComputedTransformMatrixAsArray(target) {
1418  var matrixString = _getComputedProperty(target, _transformProp);
1419
1420  return _isNullTransform(matrixString) ? _identity2DMatrix : matrixString.substr(7).match(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_numExp"]).map(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_round"]);
1421},
1422    _getMatrix = function _getMatrix(target, force2D) {
1423  var cache = target._gsap || Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_getCache"])(target),
1424      style = target.style,
1425      matrix = _getComputedTransformMatrixAsArray(target),
1426      parent,
1427      nextSibling,
1428      temp,
1429      addedToDOM;
1430
1431  if (cache.svg && target.getAttribute("transform")) {
1432    temp = target.transform.baseVal.consolidate().matrix; //ensures that even complex values like "translate(50,60) rotate(135,0,0)" are parsed because it mashes it into a matrix.
1433
1434    matrix = [temp.a, temp.b, temp.c, temp.d, temp.e, temp.f];
1435    return matrix.join(",") === "1,0,0,1,0,0" ? _identity2DMatrix : matrix;
1436  } else if (matrix === _identity2DMatrix && !target.offsetParent && target !== _docElement && !cache.svg) {
1437    //note: if offsetParent is null, that means the element isn't in the normal document flow, like if it has display:none or one of its ancestors has display:none). Firefox returns null for getComputedStyle() if the element is in an iframe that has display:none. https://bugzilla.mozilla.org/show_bug.cgi?id=548397
1438    //browsers don't report transforms accurately unless the element is in the DOM and has a display value that's not "none". Firefox and Microsoft browsers have a partial bug where they'll report transforms even if display:none BUT not any percentage-based values like translate(-50%, 8px) will be reported as if it's translate(0, 8px).
1439    temp = style.display;
1440    style.display = "block";
1441    parent = target.parentNode;
1442
1443    if (!parent || !target.offsetParent) {
1444      // note: in 3.3.0 we switched target.offsetParent to _doc.body.contains(target) to avoid [sometimes unnecessary] MutationObserver calls but that wasn't adequate because there are edge cases where nested position: fixed elements need to get reparented to accurately sense transforms. See https://github.com/greensock/GSAP/issues/388 and https://github.com/greensock/GSAP/issues/375
1445      addedToDOM = 1; //flag
1446
1447      nextSibling = target.nextSibling;
1448
1449      _docElement.appendChild(target); //we must add it to the DOM in order to get values properly
1450
1451    }
1452
1453    matrix = _getComputedTransformMatrixAsArray(target);
1454    temp ? style.display = temp : _removeProperty(target, "display");
1455
1456    if (addedToDOM) {
1457      nextSibling ? parent.insertBefore(target, nextSibling) : parent ? parent.appendChild(target) : _docElement.removeChild(target);
1458    }
1459  }
1460
1461  return force2D && matrix.length > 6 ? [matrix[0], matrix[1], matrix[4], matrix[5], matrix[12], matrix[13]] : matrix;
1462},
1463    _applySVGOrigin = function _applySVGOrigin(target, origin, originIsAbsolute, smooth, matrixArray, pluginToAddPropTweensTo) {
1464  var cache = target._gsap,
1465      matrix = matrixArray || _getMatrix(target, true),
1466      xOriginOld = cache.xOrigin || 0,
1467      yOriginOld = cache.yOrigin || 0,
1468      xOffsetOld = cache.xOffset || 0,
1469      yOffsetOld = cache.yOffset || 0,
1470      a = matrix[0],
1471      b = matrix[1],
1472      c = matrix[2],
1473      d = matrix[3],
1474      tx = matrix[4],
1475      ty = matrix[5],
1476      originSplit = origin.split(" "),
1477      xOrigin = parseFloat(originSplit[0]) || 0,
1478      yOrigin = parseFloat(originSplit[1]) || 0,
1479      bounds,
1480      determinant,
1481      x,
1482      y;
1483
1484  if (!originIsAbsolute) {
1485    bounds = _getBBox(target);
1486    xOrigin = bounds.x + (~originSplit[0].indexOf("%") ? xOrigin / 100 * bounds.width : xOrigin);
1487    yOrigin = bounds.y + (~(originSplit[1] || originSplit[0]).indexOf("%") ? yOrigin / 100 * bounds.height : yOrigin);
1488  } else if (matrix !== _identity2DMatrix && (determinant = a * d - b * c)) {
1489    //if it's zero (like if scaleX and scaleY are zero), skip it to avoid errors with dividing by zero.
1490    x = xOrigin * (d / determinant) + yOrigin * (-c / determinant) + (c * ty - d * tx) / determinant;
1491    y = xOrigin * (-b / determinant) + yOrigin * (a / determinant) - (a * ty - b * tx) / determinant;
1492    xOrigin = x;
1493    yOrigin = y;
1494  }
1495
1496  if (smooth || smooth !== false && cache.smooth) {
1497    tx = xOrigin - xOriginOld;
1498    ty = yOrigin - yOriginOld;
1499    cache.xOffset = xOffsetOld + (tx * a + ty * c) - tx;
1500    cache.yOffset = yOffsetOld + (tx * b + ty * d) - ty;
1501  } else {
1502    cache.xOffset = cache.yOffset = 0;
1503  }
1504
1505  cache.xOrigin = xOrigin;
1506  cache.yOrigin = yOrigin;
1507  cache.smooth = !!smooth;
1508  cache.origin = origin;
1509  cache.originIsAbsolute = !!originIsAbsolute;
1510  target.style[_transformOriginProp] = "0px 0px"; //otherwise, if someone sets  an origin via CSS, it will likely interfere with the SVG transform attribute ones (because remember, we're baking the origin into the matrix() value).
1511
1512  if (pluginToAddPropTweensTo) {
1513    _addNonTweeningPT(pluginToAddPropTweensTo, cache, "xOrigin", xOriginOld, xOrigin);
1514
1515    _addNonTweeningPT(pluginToAddPropTweensTo, cache, "yOrigin", yOriginOld, yOrigin);
1516
1517    _addNonTweeningPT(pluginToAddPropTweensTo, cache, "xOffset", xOffsetOld, cache.xOffset);
1518
1519    _addNonTweeningPT(pluginToAddPropTweensTo, cache, "yOffset", yOffsetOld, cache.yOffset);
1520  }
1521
1522  target.setAttribute("data-svg-origin", xOrigin + " " + yOrigin);
1523},
1524    _parseTransform = function _parseTransform(target, uncache) {
1525  var cache = target._gsap || new _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["GSCache"](target);
1526
1527  if ("x" in cache && !uncache && !cache.uncache) {
1528    return cache;
1529  }
1530
1531  var style = target.style,
1532      invertedScaleX = cache.scaleX < 0,
1533      px = "px",
1534      deg = "deg",
1535      origin = _getComputedProperty(target, _transformOriginProp) || "0",
1536      x,
1537      y,
1538      z,
1539      scaleX,
1540      scaleY,
1541      rotation,
1542      rotationX,
1543      rotationY,
1544      skewX,
1545      skewY,
1546      perspective,
1547      xOrigin,
1548      yOrigin,
1549      matrix,
1550      angle,
1551      cos,
1552      sin,
1553      a,
1554      b,
1555      c,
1556      d,
1557      a12,
1558      a22,
1559      t1,
1560      t2,
1561      t3,
1562      a13,
1563      a23,
1564      a33,
1565      a42,
1566      a43,
1567      a32;
1568  x = y = z = rotation = rotationX = rotationY = skewX = skewY = perspective = 0;
1569  scaleX = scaleY = 1;
1570  cache.svg = !!(target.getCTM && _isSVG(target));
1571  matrix = _getMatrix(target, cache.svg);
1572
1573  if (cache.svg) {
1574    t1 = !cache.uncache && !uncache && target.getAttribute("data-svg-origin");
1575
1576    _applySVGOrigin(target, t1 || origin, !!t1 || cache.originIsAbsolute, cache.smooth !== false, matrix);
1577  }
1578
1579  xOrigin = cache.xOrigin || 0;
1580  yOrigin = cache.yOrigin || 0;
1581
1582  if (matrix !== _identity2DMatrix) {
1583    a = matrix[0]; //a11
1584
1585    b = matrix[1]; //a21
1586
1587    c = matrix[2]; //a31
1588
1589    d = matrix[3]; //a41
1590
1591    x = a12 = matrix[4];
1592    y = a22 = matrix[5]; //2D matrix
1593
1594    if (matrix.length === 6) {
1595      scaleX = Math.sqrt(a * a + b * b);
1596      scaleY = Math.sqrt(d * d + c * c);
1597      rotation = a || b ? _atan2(b, a) * _RAD2DEG : 0; //note: if scaleX is 0, we cannot accurately measure rotation. Same for skewX with a scaleY of 0. Therefore, we default to the previously recorded value (or zero if that doesn't exist).
1598
1599      skewX = c || d ? _atan2(c, d) * _RAD2DEG + rotation : 0;
1600      skewX && (scaleY *= Math.abs(Math.cos(skewX * _DEG2RAD)));
1601
1602      if (cache.svg) {
1603        x -= xOrigin - (xOrigin * a + yOrigin * c);
1604        y -= yOrigin - (xOrigin * b + yOrigin * d);
1605      } //3D matrix
1606
1607    } else {
1608      a32 = matrix[6];
1609      a42 = matrix[7];
1610      a13 = matrix[8];
1611      a23 = matrix[9];
1612      a33 = matrix[10];
1613      a43 = matrix[11];
1614      x = matrix[12];
1615      y = matrix[13];
1616      z = matrix[14];
1617      angle = _atan2(a32, a33);
1618      rotationX = angle * _RAD2DEG; //rotationX
1619
1620      if (angle) {
1621        cos = Math.cos(-angle);
1622        sin = Math.sin(-angle);
1623        t1 = a12 * cos + a13 * sin;
1624        t2 = a22 * cos + a23 * sin;
1625        t3 = a32 * cos + a33 * sin;
1626        a13 = a12 * -sin + a13 * cos;
1627        a23 = a22 * -sin + a23 * cos;
1628        a33 = a32 * -sin + a33 * cos;
1629        a43 = a42 * -sin + a43 * cos;
1630        a12 = t1;
1631        a22 = t2;
1632        a32 = t3;
1633      } //rotationY
1634
1635
1636      angle = _atan2(-c, a33);
1637      rotationY = angle * _RAD2DEG;
1638
1639      if (angle) {
1640        cos = Math.cos(-angle);
1641        sin = Math.sin(-angle);
1642        t1 = a * cos - a13 * sin;
1643        t2 = b * cos - a23 * sin;
1644        t3 = c * cos - a33 * sin;
1645        a43 = d * sin + a43 * cos;
1646        a = t1;
1647        b = t2;
1648        c = t3;
1649      } //rotationZ
1650
1651
1652      angle = _atan2(b, a);
1653      rotation = angle * _RAD2DEG;
1654
1655      if (angle) {
1656        cos = Math.cos(angle);
1657        sin = Math.sin(angle);
1658        t1 = a * cos + b * sin;
1659        t2 = a12 * cos + a22 * sin;
1660        b = b * cos - a * sin;
1661        a22 = a22 * cos - a12 * sin;
1662        a = t1;
1663        a12 = t2;
1664      }
1665
1666      if (rotationX && Math.abs(rotationX) + Math.abs(rotation) > 359.9) {
1667        //when rotationY is set, it will often be parsed as 180 degrees different than it should be, and rotationX and rotation both being 180 (it looks the same), so we adjust for that here.
1668        rotationX = rotation = 0;
1669        rotationY = 180 - rotationY;
1670      }
1671
1672      scaleX = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_round"])(Math.sqrt(a * a + b * b + c * c));
1673      scaleY = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_round"])(Math.sqrt(a22 * a22 + a32 * a32));
1674      angle = _atan2(a12, a22);
1675      skewX = Math.abs(angle) > 0.0002 ? angle * _RAD2DEG : 0;
1676      perspective = a43 ? 1 / (a43 < 0 ? -a43 : a43) : 0;
1677    }
1678
1679    if (cache.svg) {
1680      //sense if there are CSS transforms applied on an SVG element in which case we must overwrite them when rendering. The transform attribute is more reliable cross-browser, but we can't just remove the CSS ones because they may be applied in a CSS rule somewhere (not just inline).
1681      t1 = target.getAttribute("transform");
1682      cache.forceCSS = target.setAttribute("transform", "") || !_isNullTransform(_getComputedProperty(target, _transformProp));
1683      t1 && target.setAttribute("transform", t1);
1684    }
1685  }
1686
1687  if (Math.abs(skewX) > 90 && Math.abs(skewX) < 270) {
1688    if (invertedScaleX) {
1689      scaleX *= -1;
1690      skewX += rotation <= 0 ? 180 : -180;
1691      rotation += rotation <= 0 ? 180 : -180;
1692    } else {
1693      scaleY *= -1;
1694      skewX += skewX <= 0 ? 180 : -180;
1695    }
1696  }
1697
1698  cache.x = x - ((cache.xPercent = x && (cache.xPercent || (Math.round(target.offsetWidth / 2) === Math.round(-x) ? -50 : 0))) ? target.offsetWidth * cache.xPercent / 100 : 0) + px;
1699  cache.y = y - ((cache.yPercent = y && (cache.yPercent || (Math.round(target.offsetHeight / 2) === Math.round(-y) ? -50 : 0))) ? target.offsetHeight * cache.yPercent / 100 : 0) + px;
1700  cache.z = z + px;
1701  cache.scaleX = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_round"])(scaleX);
1702  cache.scaleY = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_round"])(scaleY);
1703  cache.rotation = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_round"])(rotation) + deg;
1704  cache.rotationX = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_round"])(rotationX) + deg;
1705  cache.rotationY = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_round"])(rotationY) + deg;
1706  cache.skewX = skewX + deg;
1707  cache.skewY = skewY + deg;
1708  cache.transformPerspective = perspective + px;
1709
1710  if (cache.zOrigin = parseFloat(origin.split(" ")[2]) || 0) {
1711    style[_transformOriginProp] = _firstTwoOnly(origin);
1712  }
1713
1714  cache.xOffset = cache.yOffset = 0;
1715  cache.force3D = _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_config"].force3D;
1716  cache.renderTransform = cache.svg ? _renderSVGTransforms : _supports3D ? _renderCSSTransforms : _renderNon3DTransforms;
1717  cache.uncache = 0;
1718  return cache;
1719},
1720    _firstTwoOnly = function _firstTwoOnly(value) {
1721  return (value = value.split(" "))[0] + " " + value[1];
1722},
1723    //for handling transformOrigin values, stripping out the 3rd dimension
1724_addPxTranslate = function _addPxTranslate(target, start, value) {
1725  var unit = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["getUnit"])(start);
1726  return Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_round"])(parseFloat(start) + parseFloat(_convertToUnit(target, "x", value + "px", unit))) + unit;
1727},
1728    _renderNon3DTransforms = function _renderNon3DTransforms(ratio, cache) {
1729  cache.z = "0px";
1730  cache.rotationY = cache.rotationX = "0deg";
1731  cache.force3D = 0;
1732
1733  _renderCSSTransforms(ratio, cache);
1734},
1735    _zeroDeg = "0deg",
1736    _zeroPx = "0px",
1737    _endParenthesis = ") ",
1738    _renderCSSTransforms = function _renderCSSTransforms(ratio, cache) {
1739  var _ref = cache || this,
1740      xPercent = _ref.xPercent,
1741      yPercent = _ref.yPercent,
1742      x = _ref.x,
1743      y = _ref.y,
1744      z = _ref.z,
1745      rotation = _ref.rotation,
1746      rotationY = _ref.rotationY,
1747      rotationX = _ref.rotationX,
1748      skewX = _ref.skewX,
1749      skewY = _ref.skewY,
1750      scaleX = _ref.scaleX,
1751      scaleY = _ref.scaleY,
1752      transformPerspective = _ref.transformPerspective,
1753      force3D = _ref.force3D,
1754      target = _ref.target,
1755      zOrigin = _ref.zOrigin,
1756      transforms = "",
1757      use3D = force3D === "auto" && ratio && ratio !== 1 || force3D === true; // Safari has a bug that causes it not to render 3D transform-origin values properly, so we force the z origin to 0, record it in the cache, and then do the math here to offset the translate values accordingly (basically do the 3D transform-origin part manually)
1758
1759
1760  if (zOrigin && (rotationX !== _zeroDeg || rotationY !== _zeroDeg)) {
1761    var angle = parseFloat(rotationY) * _DEG2RAD,
1762        a13 = Math.sin(angle),
1763        a33 = Math.cos(angle),
1764        cos;
1765
1766    angle = parseFloat(rotationX) * _DEG2RAD;
1767    cos = Math.cos(angle);
1768    x = _addPxTranslate(target, x, a13 * cos * -zOrigin);
1769    y = _addPxTranslate(target, y, -Math.sin(angle) * -zOrigin);
1770    z = _addPxTranslate(target, z, a33 * cos * -zOrigin + zOrigin);
1771  }
1772
1773  if (transformPerspective !== _zeroPx) {
1774    transforms += "perspective(" + transformPerspective + _endParenthesis;
1775  }
1776
1777  if (xPercent || yPercent) {
1778    transforms += "translate(" + xPercent + "%, " + yPercent + "%) ";
1779  }
1780
1781  if (use3D || x !== _zeroPx || y !== _zeroPx || z !== _zeroPx) {
1782    transforms += z !== _zeroPx || use3D ? "translate3d(" + x + ", " + y + ", " + z + ") " : "translate(" + x + ", " + y + _endParenthesis;
1783  }
1784
1785  if (rotation !== _zeroDeg) {
1786    transforms += "rotate(" + rotation + _endParenthesis;
1787  }
1788
1789  if (rotationY !== _zeroDeg) {
1790    transforms += "rotateY(" + rotationY + _endParenthesis;
1791  }
1792
1793  if (rotationX !== _zeroDeg) {
1794    transforms += "rotateX(" + rotationX + _endParenthesis;
1795  }
1796
1797  if (skewX !== _zeroDeg || skewY !== _zeroDeg) {
1798    transforms += "skew(" + skewX + ", " + skewY + _endParenthesis;
1799  }
1800
1801  if (scaleX !== 1 || scaleY !== 1) {
1802    transforms += "scale(" + scaleX + ", " + scaleY + _endParenthesis;
1803  }
1804
1805  target.style[_transformProp] = transforms || "translate(0, 0)";
1806},
1807    _renderSVGTransforms = function _renderSVGTransforms(ratio, cache) {
1808  var _ref2 = cache || this,
1809      xPercent = _ref2.xPercent,
1810      yPercent = _ref2.yPercent,
1811      x = _ref2.x,
1812      y = _ref2.y,
1813      rotation = _ref2.rotation,
1814      skewX = _ref2.skewX,
1815      skewY = _ref2.skewY,
1816      scaleX = _ref2.scaleX,
1817      scaleY = _ref2.scaleY,
1818      target = _ref2.target,
1819      xOrigin = _ref2.xOrigin,
1820      yOrigin = _ref2.yOrigin,
1821      xOffset = _ref2.xOffset,
1822      yOffset = _ref2.yOffset,
1823      forceCSS = _ref2.forceCSS,
1824      tx = parseFloat(x),
1825      ty = parseFloat(y),
1826      a11,
1827      a21,
1828      a12,
1829      a22,
1830      temp;
1831
1832  rotation = parseFloat(rotation);
1833  skewX = parseFloat(skewX);
1834  skewY = parseFloat(skewY);
1835
1836  if (skewY) {
1837    //for performance reasons, we combine all skewing into the skewX and rotation values. Remember, a skewY of 10 degrees looks the same as a rotation of 10 degrees plus a skewX of 10 degrees.
1838    skewY = parseFloat(skewY);
1839    skewX += skewY;
1840    rotation += skewY;
1841  }
1842
1843  if (rotation || skewX) {
1844    rotation *= _DEG2RAD;
1845    skewX *= _DEG2RAD;
1846    a11 = Math.cos(rotation) * scaleX;
1847    a21 = Math.sin(rotation) * scaleX;
1848    a12 = Math.sin(rotation - skewX) * -scaleY;
1849    a22 = Math.cos(rotation - skewX) * scaleY;
1850
1851    if (skewX) {
1852      skewY *= _DEG2RAD;
1853      temp = Math.tan(skewX - skewY);
1854      temp = Math.sqrt(1 + temp * temp);
1855      a12 *= temp;
1856      a22 *= temp;
1857
1858      if (skewY) {
1859        temp = Math.tan(skewY);
1860        temp = Math.sqrt(1 + temp * temp);
1861        a11 *= temp;
1862        a21 *= temp;
1863      }
1864    }
1865
1866    a11 = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_round"])(a11);
1867    a21 = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_round"])(a21);
1868    a12 = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_round"])(a12);
1869    a22 = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_round"])(a22);
1870  } else {
1871    a11 = scaleX;
1872    a22 = scaleY;
1873    a21 = a12 = 0;
1874  }
1875
1876  if (tx && !~(x + "").indexOf("px") || ty && !~(y + "").indexOf("px")) {
1877    tx = _convertToUnit(target, "x", x, "px");
1878    ty = _convertToUnit(target, "y", y, "px");
1879  }
1880
1881  if (xOrigin || yOrigin || xOffset || yOffset) {
1882    tx = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_round"])(tx + xOrigin - (xOrigin * a11 + yOrigin * a12) + xOffset);
1883    ty = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_round"])(ty + yOrigin - (xOrigin * a21 + yOrigin * a22) + yOffset);
1884  }
1885
1886  if (xPercent || yPercent) {
1887    //The SVG spec doesn't support percentage-based translation in the "transform" attribute, so we merge it into the translation to simulate it.
1888    temp = target.getBBox();
1889    tx = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_round"])(tx + xPercent / 100 * temp.width);
1890    ty = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_round"])(ty + yPercent / 100 * temp.height);
1891  }
1892
1893  temp = "matrix(" + a11 + "," + a21 + "," + a12 + "," + a22 + "," + tx + "," + ty + ")";
1894  target.setAttribute("transform", temp);
1895  forceCSS && (target.style[_transformProp] = temp); //some browsers prioritize CSS transforms over the transform attribute. When we sense that the user has CSS transforms applied, we must overwrite them this way (otherwise some browser simply won't render the  transform attribute changes!)
1896},
1897    _addRotationalPropTween = function _addRotationalPropTween(plugin, target, property, startNum, endValue, relative) {
1898  var cap = 360,
1899      isString = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_isString"])(endValue),
1900      endNum = parseFloat(endValue) * (isString && ~endValue.indexOf("rad") ? _RAD2DEG : 1),
1901      change = relative ? endNum * relative : endNum - startNum,
1902      finalValue = startNum + change + "deg",
1903      direction,
1904      pt;
1905
1906  if (isString) {
1907    direction = endValue.split("_")[1];
1908
1909    if (direction === "short") {
1910      change %= cap;
1911
1912      if (change !== change % (cap / 2)) {
1913        change += change < 0 ? cap : -cap;
1914      }
1915    }
1916
1917    if (direction === "cw" && change < 0) {
1918      change = (change + cap * _bigNum) % cap - ~~(change / cap) * cap;
1919    } else if (direction === "ccw" && change > 0) {
1920      change = (change - cap * _bigNum) % cap - ~~(change / cap) * cap;
1921    }
1922  }
1923
1924  plugin._pt = pt = new _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["PropTween"](plugin._pt, target, property, startNum, change, _renderPropWithEnd);
1925  pt.e = finalValue;
1926  pt.u = "deg";
1927
1928  plugin._props.push(property);
1929
1930  return pt;
1931},
1932    _assign = function _assign(target, source) {
1933  // Internet Explorer doesn't have Object.assign(), so we recreate it here.
1934  for (var p in source) {
1935    target[p] = source[p];
1936  }
1937
1938  return target;
1939},
1940    _addRawTransformPTs = function _addRawTransformPTs(plugin, transforms, target) {
1941  //for handling cases where someone passes in a whole transform string, like transform: "scale(2, 3) rotate(20deg) translateY(30em)"
1942  var startCache = _assign({}, target._gsap),
1943      exclude = "perspective,force3D,transformOrigin,svgOrigin",
1944      style = target.style,
1945      endCache,
1946      p,
1947      startValue,
1948      endValue,
1949      startNum,
1950      endNum,
1951      startUnit,
1952      endUnit;
1953
1954  if (startCache.svg) {
1955    startValue = target.getAttribute("transform");
1956    target.setAttribute("transform", "");
1957    style[_transformProp] = transforms;
1958    endCache = _parseTransform(target, 1);
1959
1960    _removeProperty(target, _transformProp);
1961
1962    target.setAttribute("transform", startValue);
1963  } else {
1964    startValue = getComputedStyle(target)[_transformProp];
1965    style[_transformProp] = transforms;
1966    endCache = _parseTransform(target, 1);
1967    style[_transformProp] = startValue;
1968  }
1969
1970  for (p in _transformProps) {
1971    startValue = startCache[p];
1972    endValue = endCache[p];
1973
1974    if (startValue !== endValue && exclude.indexOf(p) < 0) {
1975      //tweening to no perspective gives very unintuitive results - just keep the same perspective in that case.
1976      startUnit = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["getUnit"])(startValue);
1977      endUnit = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["getUnit"])(endValue);
1978      startNum = startUnit !== endUnit ? _convertToUnit(target, p, startValue, endUnit) : parseFloat(startValue);
1979      endNum = parseFloat(endValue);
1980      plugin._pt = new _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["PropTween"](plugin._pt, endCache, p, startNum, endNum - startNum, _renderCSSProp);
1981      plugin._pt.u = endUnit || 0;
1982
1983      plugin._props.push(p);
1984    }
1985  }
1986
1987  _assign(endCache, startCache);
1988}; // handle splitting apart padding, margin, borderWidth, and borderRadius into their 4 components. Firefox, for example, won't report borderRadius correctly - it will only do borderTopLeftRadius and the other corners. We also want to handle paddingTop, marginLeft, borderRightWidth, etc.
1989
1990
1991Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_forEachName"])("padding,margin,Width,Radius", function (name, index) {
1992  var t = "Top",
1993      r = "Right",
1994      b = "Bottom",
1995      l = "Left",
1996      props = (index < 3 ? [t, r, b, l] : [t + l, t + r, b + r, b + l]).map(function (side) {
1997    return index < 2 ? name + side : "border" + side + name;
1998  });
1999
2000  _specialProps[index > 1 ? "border" + name : name] = function (plugin, target, property, endValue, tween) {
2001    var a, vars;
2002
2003    if (arguments.length < 4) {
2004      // getter, passed target, property, and unit (from _get())
2005      a = props.map(function (prop) {
2006        return _get(plugin, prop, property);
2007      });
2008      vars = a.join(" ");
2009      return vars.split(a[0]).length === 5 ? a[0] : vars;
2010    }
2011
2012    a = (endValue + "").split(" ");
2013    vars = {};
2014    props.forEach(function (prop, i) {
2015      return vars[prop] = a[i] = a[i] || a[(i - 1) / 2 | 0];
2016    });
2017    plugin.init(target, vars, tween);
2018  };
2019});
2020
2021var CSSPlugin = {
2022  name: "css",
2023  register: _initCore,
2024  targetTest: function targetTest(target) {
2025    return target.style && target.nodeType;
2026  },
2027  init: function init(target, vars, tween, index, targets) {
2028    var props = this._props,
2029        style = target.style,
2030        startAt = tween.vars.startAt,
2031        startValue,
2032        endValue,
2033        endNum,
2034        startNum,
2035        type,
2036        specialProp,
2037        p,
2038        startUnit,
2039        endUnit,
2040        relative,
2041        isTransformRelated,
2042        transformPropTween,
2043        cache,
2044        smooth,
2045        hasPriority;
2046    _pluginInitted || _initCore();
2047
2048    for (p in vars) {
2049      if (p === "autoRound") {
2050        continue;
2051      }
2052
2053      endValue = vars[p];
2054
2055      if (_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_plugins"][p] && Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_checkPlugin"])(p, vars, tween, index, target, targets)) {
2056        // plugins
2057        continue;
2058      }
2059
2060      type = typeof endValue;
2061      specialProp = _specialProps[p];
2062
2063      if (type === "function") {
2064        endValue = endValue.call(tween, index, target, targets);
2065        type = typeof endValue;
2066      }
2067
2068      if (type === "string" && ~endValue.indexOf("random(")) {
2069        endValue = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_replaceRandom"])(endValue);
2070      }
2071
2072      if (specialProp) {
2073        specialProp(this, target, p, endValue, tween) && (hasPriority = 1);
2074      } else if (p.substr(0, 2) === "--") {
2075        //CSS variable
2076        startValue = (getComputedStyle(target).getPropertyValue(p) + "").trim();
2077        endValue += "";
2078        _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_colorExp"].lastIndex = 0;
2079
2080        if (!_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_colorExp"].test(startValue)) {
2081          // colors don't have units
2082          startUnit = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["getUnit"])(startValue);
2083          endUnit = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["getUnit"])(endValue);
2084        }
2085
2086        endUnit ? startUnit !== endUnit && (startValue = _convertToUnit(target, p, startValue, endUnit) + endUnit) : startUnit && (endValue += startUnit);
2087        this.add(style, "setProperty", startValue, endValue, index, targets, 0, 0, p);
2088      } else if (type !== "undefined") {
2089        if (startAt && p in startAt) {
2090          // in case someone hard-codes a complex value as the start, like top: "calc(2vh / 2)". Without this, it'd use the computed value (always in px)
2091          startValue = typeof startAt[p] === "function" ? startAt[p].call(tween, index, target, targets) : startAt[p];
2092          p in _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_config"].units && !Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["getUnit"])(startValue) && (startValue += _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_config"].units[p]); // for cases when someone passes in a unitless value like {x: 100}; if we try setting translate(100, 0px) it won't work.
2093
2094          (startValue + "").charAt(1) === "=" && (startValue = _get(target, p)); // can't work with relative values
2095        } else {
2096          startValue = _get(target, p);
2097        }
2098
2099        startNum = parseFloat(startValue);
2100        relative = type === "string" && endValue.charAt(1) === "=" ? +(endValue.charAt(0) + "1") : 0;
2101        relative && (endValue = endValue.substr(2));
2102        endNum = parseFloat(endValue);
2103
2104        if (p in _propertyAliases) {
2105          if (p === "autoAlpha") {
2106            //special case where we control the visibility along with opacity. We still allow the opacity value to pass through and get tweened.
2107            if (startNum === 1 && _get(target, "visibility") === "hidden" && endNum) {
2108              //if visibility is initially set to "hidden", we should interpret that as intent to make opacity 0 (a convenience)
2109              startNum = 0;
2110            }
2111
2112            _addNonTweeningPT(this, style, "visibility", startNum ? "inherit" : "hidden", endNum ? "inherit" : "hidden", !endNum);
2113          }
2114
2115          if (p !== "scale" && p !== "transform") {
2116            p = _propertyAliases[p];
2117            ~p.indexOf(",") && (p = p.split(",")[0]);
2118          }
2119        }
2120
2121        isTransformRelated = p in _transformProps; //--- TRANSFORM-RELATED ---
2122
2123        if (isTransformRelated) {
2124          if (!transformPropTween) {
2125            cache = target._gsap;
2126            cache.renderTransform && !vars.parseTransform || _parseTransform(target, vars.parseTransform); // if, for example, gsap.set(... {transform:"translateX(50vw)"}), the _get() call doesn't parse the transform, thus cache.renderTransform won't be set yet so force the parsing of the transform here.
2127
2128            smooth = vars.smoothOrigin !== false && cache.smooth;
2129            transformPropTween = this._pt = new _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["PropTween"](this._pt, style, _transformProp, 0, 1, cache.renderTransform, cache, 0, -1); //the first time through, create the rendering PropTween so that it runs LAST (in the linked list, we keep adding to the beginning)
2130
2131            transformPropTween.dep = 1; //flag it as dependent so that if things get killed/overwritten and this is the only PropTween left, we can safely kill the whole tween.
2132          }
2133
2134          if (p === "scale") {
2135            this._pt = new _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["PropTween"](this._pt, cache, "scaleY", cache.scaleY, relative ? relative * endNum : endNum - cache.scaleY);
2136            props.push("scaleY", p);
2137            p += "X";
2138          } else if (p === "transformOrigin") {
2139            endValue = _convertKeywordsToPercentages(endValue); //in case something like "left top" or "bottom right" is passed in. Convert to percentages.
2140
2141            if (cache.svg) {
2142              _applySVGOrigin(target, endValue, 0, smooth, 0, this);
2143            } else {
2144              endUnit = parseFloat(endValue.split(" ")[2]) || 0; //handle the zOrigin separately!
2145
2146              endUnit !== cache.zOrigin && _addNonTweeningPT(this, cache, "zOrigin", cache.zOrigin, endUnit);
2147
2148              _addNonTweeningPT(this, style, p, _firstTwoOnly(startValue), _firstTwoOnly(endValue));
2149            }
2150
2151            continue;
2152          } else if (p === "svgOrigin") {
2153            _applySVGOrigin(target, endValue, 1, smooth, 0, this);
2154
2155            continue;
2156          } else if (p in _rotationalProperties) {
2157            _addRotationalPropTween(this, cache, p, startNum, endValue, relative);
2158
2159            continue;
2160          } else if (p === "smoothOrigin") {
2161            _addNonTweeningPT(this, cache, "smooth", cache.smooth, endValue);
2162
2163            continue;
2164          } else if (p === "force3D") {
2165            cache[p] = endValue;
2166            continue;
2167          } else if (p === "transform") {
2168            _addRawTransformPTs(this, endValue, target);
2169
2170            continue;
2171          }
2172        } else if (!(p in style)) {
2173          p = _checkPropPrefix(p) || p;
2174        }
2175
2176        if (isTransformRelated || (endNum || endNum === 0) && (startNum || startNum === 0) && !_complexExp.test(endValue) && p in style) {
2177          startUnit = (startValue + "").substr((startNum + "").length);
2178          endNum || (endNum = 0); // protect against NaN
2179
2180          endUnit = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["getUnit"])(endValue) || (p in _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_config"].units ? _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_config"].units[p] : startUnit);
2181          startUnit !== endUnit && (startNum = _convertToUnit(target, p, startValue, endUnit));
2182          this._pt = new _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["PropTween"](this._pt, isTransformRelated ? cache : style, p, startNum, relative ? relative * endNum : endNum - startNum, !isTransformRelated && (endUnit === "px" || p === "zIndex") && vars.autoRound !== false ? _renderRoundedCSSProp : _renderCSSProp);
2183          this._pt.u = endUnit || 0;
2184
2185          if (startUnit !== endUnit) {
2186            //when the tween goes all the way back to the beginning, we need to revert it to the OLD/ORIGINAL value (with those units). We record that as a "b" (beginning) property and point to a render method that handles that. (performance optimization)
2187            this._pt.b = startValue;
2188            this._pt.r = _renderCSSPropWithBeginning;
2189          }
2190        } else if (!(p in style)) {
2191          if (p in target) {
2192            //maybe it's not a style - it could be a property added directly to an element in which case we'll try to animate that.
2193            this.add(target, p, target[p], endValue, index, targets);
2194          } else {
2195            Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_missingPlugin"])(p, endValue);
2196
2197            continue;
2198          }
2199        } else {
2200          _tweenComplexCSSString.call(this, target, p, startValue, endValue);
2201        }
2202
2203        props.push(p);
2204      }
2205    }
2206
2207    hasPriority && Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_sortPropTweensByPriority"])(this);
2208  },
2209  get: _get,
2210  aliases: _propertyAliases,
2211  getSetter: function getSetter(target, property, plugin) {
2212    //returns a setter function that accepts target, property, value and applies it accordingly. Remember, properties like "x" aren't as simple as target.style.property = value because they've got to be applied to a proxy object and then merged into a transform string in a renderer.
2213    var p = _propertyAliases[property];
2214    p && p.indexOf(",") < 0 && (property = p);
2215    return property in _transformProps && property !== _transformOriginProp && (target._gsap.x || _get(target, "x")) ? plugin && _recentSetterPlugin === plugin ? property === "scale" ? _setterScale : _setterTransform : (_recentSetterPlugin = plugin || {}) && (property === "scale" ? _setterScaleWithRender : _setterTransformWithRender) : target.style && !Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_isUndefined"])(target.style[property]) ? _setterCSSStyle : ~property.indexOf("-") ? _setterCSSProp : Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_getSetter"])(target, property);
2216  },
2217  core: {
2218    _removeProperty: _removeProperty,
2219    _getMatrix: _getMatrix
2220  }
2221};
2222_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["gsap"].utils.checkPrefix = _checkPropPrefix;
2223
2224(function (positionAndScale, rotation, others, aliases) {
2225  var all = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_forEachName"])(positionAndScale + "," + rotation + "," + others, function (name) {
2226    _transformProps[name] = 1;
2227  });
2228
2229  Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_forEachName"])(rotation, function (name) {
2230    _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_config"].units[name] = "deg";
2231    _rotationalProperties[name] = 1;
2232  });
2233
2234  _propertyAliases[all[13]] = positionAndScale + "," + rotation;
2235
2236  Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_forEachName"])(aliases, function (name) {
2237    var split = name.split(":");
2238    _propertyAliases[split[1]] = all[split[0]];
2239  });
2240})("x,y,z,scale,scaleX,scaleY,xPercent,yPercent", "rotation,rotationX,rotationY,skewX,skewY", "transform,transformOrigin,svgOrigin,force3D,smoothOrigin,transformPerspective", "0:translateX,1:translateY,2:translateZ,8:rotate,8:rotationZ,8:rotateZ,9:rotateX,10:rotateY");
2241
2242Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_forEachName"])("x,y,z,top,right,bottom,left,width,height,fontSize,padding,margin,perspective", function (name) {
2243  _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_config"].units[name] = "px";
2244});
2245
2246_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["gsap"].registerPlugin(CSSPlugin);
2247
2248
2249
2250/***/ }),
2251
vendor: 151,606 bytes, lines 2252-6168
2252/***/ "./node_modules/gsap/gsap-core.js":
2253/*!****************************************!*\
2254  !*** ./node_modules/gsap/gsap-core.js ***!
2255  \****************************************/
2256/*! exports provided: GSCache, Animation, Timeline, Tween, PropTween, gsap, Power0, Power1, Power2, Power3, Power4, Linear, Quad, Cubic, Quart, Quint, Strong, Elastic, Back, SteppedEase, Bounce, Sine, Expo, Circ, TweenMax, TweenLite, TimelineMax, TimelineLite, default, wrap, wrapYoyo, distribute, random, snap, normalize, getUnit, clamp, splitColor, toArray, mapRange, pipe, unitize, interpolate, shuffle, _getProperty, _numExp, _numWithUnitExp, _isString, _isUndefined, _renderComplexString, _relExp, _setDefaults, _removeLinkedListItem, _forEachName, _sortPropTweensByPriority, _colorStringFilter, _replaceRandom, _checkPlugin, _plugins, _ticker, _config, _roundModifier, _round, _missingPlugin, _getSetter, _getCache, _colorExp */
2257/***/ (function(module, __webpack_exports__, __webpack_require__) {
2258
2259"use strict";
2260__webpack_require__.r(__webpack_exports__);
2261/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "GSCache", function() { return GSCache; });
2262/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Animation", function() { return Animation; });
2263/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Timeline", function() { return Timeline; });
2264/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Tween", function() { return Tween; });
2265/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PropTween", function() { return PropTween; });
2266/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "gsap", function() { return gsap; });
2267/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Power0", function() { return Power0; });
2268/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Power1", function() { return Power1; });
2269/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Power2", function() { return Power2; });
2270/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Power3", function() { return Power3; });
2271/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Power4", function() { return Power4; });
2272/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Linear", function() { return Linear; });
2273/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Quad", function() { return Quad; });
2274/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Cubic", function() { return Cubic; });
2275/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Quart", function() { return Quart; });
2276/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Quint", function() { return Quint; });
2277/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Strong", function() { return Strong; });
2278/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Elastic", function() { return Elastic; });
2279/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Back", function() { return Back; });
2280/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SteppedEase", function() { return SteppedEase; });
2281/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Bounce", function() { return Bounce; });
2282/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Sine", function() { return Sine; });
2283/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Expo", function() { return Expo; });
2284/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Circ", function() { return Circ; });
2285/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TweenMax", function() { return Tween; });
2286/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TweenLite", function() { return Tween; });
2287/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TimelineMax", function() { return Timeline; });
2288/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TimelineLite", function() { return Timeline; });
2289/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return gsap; });
2290/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "wrap", function() { return wrap; });
2291/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "wrapYoyo", function() { return wrapYoyo; });
2292/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "distribute", function() { return distribute; });
2293/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "random", function() { return random; });
2294/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "snap", function() { return snap; });
2295/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "normalize", function() { return normalize; });
2296/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getUnit", function() { return getUnit; });
2297/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "clamp", function() { return clamp; });
2298/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "splitColor", function() { return splitColor; });
2299/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "toArray", function() { return toArray; });
2300/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mapRange", function() { return mapRange; });
2301/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "pipe", function() { return pipe; });
2302/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "unitize", function() { return unitize; });
2303/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "interpolate", function() { return interpolate; });
2304/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "shuffle", function() { return shuffle; });
2305/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_getProperty", function() { return _getProperty; });
2306/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_numExp", function() { return _numExp; });
2307/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_numWithUnitExp", function() { return _numWithUnitExp; });
2308/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_isString", function() { return _isString; });
2309/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_isUndefined", function() { return _isUndefined; });
2310/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_renderComplexString", function() { return _renderComplexString; });
2311/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_relExp", function() { return _relExp; });
2312/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_setDefaults", function() { return _setDefaults; });
2313/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_removeLinkedListItem", function() { return _removeLinkedListItem; });
2314/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_forEachName", function() { return _forEachName; });
2315/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_sortPropTweensByPriority", function() { return _sortPropTweensByPriority; });
2316/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_colorStringFilter", function() { return _colorStringFilter; });
2317/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_replaceRandom", function() { return _replaceRandom; });
2318/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_checkPlugin", function() { return _checkPlugin; });
2319/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_plugins", function() { return _plugins; });
2320/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_ticker", function() { return _ticker; });
2321/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_config", function() { return _config; });
2322/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_roundModifier", function() { return _roundModifier; });
2323/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_round", function() { return _round; });
2324/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_missingPlugin", function() { return _missingPlugin; });
2325/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_getSetter", function() { return _getSetter; });
2326/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_getCache", function() { return _getCache; });
2327/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_colorExp", function() { return _colorExp; });
2328/*** IMPORTS FROM imports-loader ***/
2329var define = false;
2330
2331function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
2332
2333function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }
2334
2335/*!
2336 * GSAP 3.6.1
2337 * https://greensock.com
2338 *
2339 * @license Copyright 2008-2021, GreenSock. All rights reserved.
2340 * Subject to the terms at https://greensock.com/standard-license or for
2341 * Club GreenSock members, the agreement issued with that membership.
2342 * @author: Jack Doyle, [email protected]
2343*/
2344
2345/* eslint-disable */
2346var _config = {
2347  autoSleep: 120,
2348  force3D: "auto",
2349  nullTargetWarn: 1,
2350  units: {
2351    lineHeight: ""
2352  }
2353},
2354    _defaults = {
2355  duration: .5,
2356  overwrite: false,
2357  delay: 0
2358},
2359    _suppressOverwrites,
2360    _bigNum = 1e8,
2361    _tinyNum = 1 / _bigNum,
2362    _2PI = Math.PI * 2,
2363    _HALF_PI = _2PI / 4,
2364    _gsID = 0,
2365    _sqrt = Math.sqrt,
2366    _cos = Math.cos,
2367    _sin = Math.sin,
2368    _isString = function _isString(value) {
2369  return typeof value === "string";
2370},
2371    _isFunction = function _isFunction(value) {
2372  return typeof value === "function";
2373},
2374    _isNumber = function _isNumber(value) {
2375  return typeof value === "number";
2376},
2377    _isUndefined = function _isUndefined(value) {
2378  return typeof value === "undefined";
2379},
2380    _isObject = function _isObject(value) {
2381  return typeof value === "object";
2382},
2383    _isNotFalse = function _isNotFalse(value) {
2384  return value !== false;
2385},
2386    _windowExists = function _windowExists() {
2387  return typeof window !== "undefined";
2388},
2389    _isFuncOrString = function _isFuncOrString(value) {
2390  return _isFunction(value) || _isString(value);
2391},
2392    _isTypedArray = typeof ArrayBuffer === "function" && ArrayBuffer.isView || function () {},
2393    // note: IE10 has ArrayBuffer, but NOT ArrayBuffer.isView().
2394_isArray = Array.isArray,
2395    _strictNumExp = /(?:-?\.?\d|\.)+/gi,
2396    //only numbers (including negatives and decimals) but NOT relative values.
2397_numExp = /[-+=.]*\d+[.e\-+]*\d*[e\-+]*\d*/g,
2398    //finds any numbers, including ones that start with += or -=, negative numbers, and ones in scientific notation like 1e-8.
2399_numWithUnitExp = /[-+=.]*\d+[.e-]*\d*[a-z%]*/g,
2400    _complexStringNumExp = /[-+=.]*\d+\.?\d*(?:e-|e\+)?\d*/gi,
2401    //duplicate so that while we're looping through matches from exec(), it doesn't contaminate the lastIndex of _numExp which we use to search for colors too.
2402_relExp = /[+-]=-?[.\d]+/,
2403    _delimitedValueExp = /[#\-+.]*\b[a-z\d-=+%.]+/gi,
2404    _unitExp = /[\d.+\-=]+(?:e[-+]\d*)*/i,
2405    _globalTimeline,
2406    _win,
2407    _coreInitted,
2408    _doc,
2409    _globals = {},
2410    _installScope = {},
2411    _coreReady,
2412    _install = function _install(scope) {
2413  return (_installScope = _merge(scope, _globals)) && gsap;
2414},
2415    _missingPlugin = function _missingPlugin(property, value) {
2416  return console.warn("Invalid property", property, "set to", value, "Missing plugin? gsap.registerPlugin()");
2417},
2418    _warn = function _warn(message, suppress) {
2419  return !suppress && console.warn(message);
2420},
2421    _addGlobal = function _addGlobal(name, obj) {
2422  return name && (_globals[name] = obj) && _installScope && (_installScope[name] = obj) || _globals;
2423},
2424    _emptyFunc = function _emptyFunc() {
2425  return 0;
2426},
2427    _reservedProps = {},
2428    _lazyTweens = [],
2429    _lazyLookup = {},
2430    _lastRenderedFrame,
2431    _plugins = {},
2432    _effects = {},
2433    _nextGCFrame = 30,
2434    _harnessPlugins = [],
2435    _callbackNames = "",
2436    _harness = function _harness(targets) {
2437  var target = targets[0],
2438      harnessPlugin,
2439      i;
2440  _isObject(target) || _isFunction(target) || (targets = [targets]);
2441
2442  if (!(harnessPlugin = (target._gsap || {}).harness)) {
2443    // find the first target with a harness. We assume targets passed into an animation will be of similar type, meaning the same kind of harness can be used for them all (performance optimization)
2444    i = _harnessPlugins.length;
2445
2446    while (i-- && !_harnessPlugins[i].targetTest(target)) {}
2447
2448    harnessPlugin = _harnessPlugins[i];
2449  }
2450
2451  i = targets.length;
2452
2453  while (i--) {
2454    targets[i] && (targets[i]._gsap || (targets[i]._gsap = new GSCache(targets[i], harnessPlugin))) || targets.splice(i, 1);
2455  }
2456
2457  return targets;
2458},
2459    _getCache = function _getCache(target) {
2460  return target._gsap || _harness(toArray(target))[0]._gsap;
2461},
2462    _getProperty = function _getProperty(target, property, v) {
2463  return (v = target[property]) && _isFunction(v) ? target[property]() : _isUndefined(v) && target.getAttribute && target.getAttribute(property) || v;
2464},
2465    _forEachName = function _forEachName(names, func) {
2466  return (names = names.split(",")).forEach(func) || names;
2467},
2468    //split a comma-delimited list of names into an array, then run a forEach() function and return the split array (this is just a way to consolidate/shorten some code).
2469_round = function _round(value) {
2470  return Math.round(value * 100000) / 100000 || 0;
2471},
2472    _arrayContainsAny = function _arrayContainsAny(toSearch, toFind) {
2473  //searches one array to find matches for any of the items in the toFind array. As soon as one is found, it returns true. It does NOT return all the matches; it's simply a boolean search.
2474  var l = toFind.length,
2475      i = 0;
2476
2477  for (; toSearch.indexOf(toFind[i]) < 0 && ++i < l;) {}
2478
2479  return i < l;
2480},
2481    _parseVars = function _parseVars(params, type, parent) {
2482  //reads the arguments passed to one of the key methods and figures out if the user is defining things with the OLD/legacy syntax where the duration is the 2nd parameter, and then it adjusts things accordingly and spits back the corrected vars object (with the duration added if necessary, as well as runBackwards or startAt or immediateRender). type 0 = to()/staggerTo(), 1 = from()/staggerFrom(), 2 = fromTo()/staggerFromTo()
2483  var isLegacy = _isNumber(params[1]),
2484      varsIndex = (isLegacy ? 2 : 1) + (type < 2 ? 0 : 1),
2485      vars = params[varsIndex],
2486      irVars;
2487
2488  isLegacy && (vars.duration = params[1]);
2489  vars.parent = parent;
2490
2491  if (type) {
2492    irVars = vars;
2493
2494    while (parent && !("immediateRender" in irVars)) {
2495      // inheritance hasn't happened yet, but someone may have set a default in an ancestor timeline. We could do vars.immediateRender = _isNotFalse(_inheritDefaults(vars).immediateRender) but that'd exact a slight performance penalty because _inheritDefaults() also runs in the Tween constructor. We're paying a small kb price here to gain speed.
2496      irVars = parent.vars.defaults || {};
2497      parent = _isNotFalse(parent.vars.inherit) && parent.parent;
2498    }
2499
2500    vars.immediateRender = _isNotFalse(irVars.immediateRender);
2501    type < 2 ? vars.runBackwards = 1 : vars.startAt = params[varsIndex - 1]; // "from" vars
2502  }
2503
2504  return vars;
2505},
2506    _lazyRender = function _lazyRender() {
2507  var l = _lazyTweens.length,
2508      a = _lazyTweens.slice(0),
2509      i,
2510      tween;
2511
2512  _lazyLookup = {};
2513  _lazyTweens.length = 0;
2514
2515  for (i = 0; i < l; i++) {
2516    tween = a[i];
2517    tween && tween._lazy && (tween.render(tween._lazy[0], tween._lazy[1], true)._lazy = 0);
2518  }
2519},
2520    _lazySafeRender = function _lazySafeRender(animation, time, suppressEvents, force) {
2521  _lazyTweens.length && _lazyRender();
2522  animation.render(time, suppressEvents, force);
2523  _lazyTweens.length && _lazyRender(); //in case rendering caused any tweens to lazy-init, we should render them because typically when someone calls seek() or time() or progress(), they expect an immediate render.
2524},
2525    _numericIfPossible = function _numericIfPossible(value) {
2526  var n = parseFloat(value);
2527  return (n || n === 0) && (value + "").match(_delimitedValueExp).length < 2 ? n : _isString(value) ? value.trim() : value;
2528},
2529    _passThrough = function _passThrough(p) {
2530  return p;
2531},
2532    _setDefaults = function _setDefaults(obj, defaults) {
2533  for (var p in defaults) {
2534    p in obj || (obj[p] = defaults[p]);
2535  }
2536
2537  return obj;
2538},
2539    _setKeyframeDefaults = function _setKeyframeDefaults(obj, defaults) {
2540  for (var p in defaults) {
2541    p in obj || p === "duration" || p === "ease" || (obj[p] = defaults[p]);
2542  }
2543},
2544    _merge = function _merge(base, toMerge) {
2545  for (var p in toMerge) {
2546    base[p] = toMerge[p];
2547  }
2548
2549  return base;
2550},
2551    _mergeDeep = function _mergeDeep(base, toMerge) {
2552  for (var p in toMerge) {
2553    p !== "__proto__" && p !== "constructor" && p !== "prototype" && (base[p] = _isObject(toMerge[p]) ? _mergeDeep(base[p] || (base[p] = {}), toMerge[p]) : toMerge[p]);
2554  }
2555
2556  return base;
2557},
2558    _copyExcluding = function _copyExcluding(obj, excluding) {
2559  var copy = {},
2560      p;
2561
2562  for (p in obj) {
2563    p in excluding || (copy[p] = obj[p]);
2564  }
2565
2566  return copy;
2567},
2568    _inheritDefaults = function _inheritDefaults(vars) {
2569  var parent = vars.parent || _globalTimeline,
2570      func = vars.keyframes ? _setKeyframeDefaults : _setDefaults;
2571
2572  if (_isNotFalse(vars.inherit)) {
2573    while (parent) {
2574      func(vars, parent.vars.defaults);
2575      parent = parent.parent || parent._dp;
2576    }
2577  }
2578
2579  return vars;
2580},
2581    _arraysMatch = function _arraysMatch(a1, a2) {
2582  var i = a1.length,
2583      match = i === a2.length;
2584
2585  while (match && i-- && a1[i] === a2[i]) {}
2586
2587  return i < 0;
2588},
2589    _addLinkedListItem = function _addLinkedListItem(parent, child, firstProp, lastProp, sortBy) {
2590  if (firstProp === void 0) {
2591    firstProp = "_first";
2592  }
2593
2594  if (lastProp === void 0) {
2595    lastProp = "_last";
2596  }
2597
2598  var prev = parent[lastProp],
2599      t;
2600
2601  if (sortBy) {
2602    t = child[sortBy];
2603
2604    while (prev && prev[sortBy] > t) {
2605      prev = prev._prev;
2606    }
2607  }
2608
2609  if (prev) {
2610    child._next = prev._next;
2611    prev._next = child;
2612  } else {
2613    child._next = parent[firstProp];
2614    parent[firstProp] = child;
2615  }
2616
2617  if (child._next) {
2618    child._next._prev = child;
2619  } else {
2620    parent[lastProp] = child;
2621  }
2622
2623  child._prev = prev;
2624  child.parent = child._dp = parent;
2625  return child;
2626},
2627    _removeLinkedListItem = function _removeLinkedListItem(parent, child, firstProp, lastProp) {
2628  if (firstProp === void 0) {
2629    firstProp = "_first";
2630  }
2631
2632  if (lastProp === void 0) {
2633    lastProp = "_last";
2634  }
2635
2636  var prev = child._prev,
2637      next = child._next;
2638
2639  if (prev) {
2640    prev._next = next;
2641  } else if (parent[firstProp] === child) {
2642    parent[firstProp] = next;
2643  }
2644
2645  if (next) {
2646    next._prev = prev;
2647  } else if (parent[lastProp] === child) {
2648    parent[lastProp] = prev;
2649  }
2650
2651  child._next = child._prev = child.parent = null; // don't delete the _dp just so we can revert if necessary. But parent should be null to indicate the item isn't in a linked list.
2652},
2653    _removeFromParent = function _removeFromParent(child, onlyIfParentHasAutoRemove) {
2654  child.parent && (!onlyIfParentHasAutoRemove || child.parent.autoRemoveChildren) && child.parent.remove(child);
2655  child._act = 0;
2656},
2657    _uncache = function _uncache(animation, child) {
2658  if (animation && (!child || child._end > animation._dur || child._start < 0)) {
2659    // performance optimization: if a child animation is passed in we should only uncache if that child EXTENDS the animation (its end time is beyond the end)
2660    var a = animation;
2661
2662    while (a) {
2663      a._dirty = 1;
2664      a = a.parent;
2665    }
2666  }
2667
2668  return animation;
2669},
2670    _recacheAncestors = function _recacheAncestors(animation) {
2671  var parent = animation.parent;
2672
2673  while (parent && parent.parent) {
2674    //sometimes we must force a re-sort of all children and update the duration/totalDuration of all ancestor timelines immediately in case, for example, in the middle of a render loop, one tween alters another tween's timeScale which shoves its startTime before 0, forcing the parent timeline to shift around and shiftChildren() which could affect that next tween's render (startTime). Doesn't matter for the root timeline though.
2675    parent._dirty = 1;
2676    parent.totalDuration();
2677    parent = parent.parent;
2678  }
2679
2680  return animation;
2681},
2682    _hasNoPausedAncestors = function _hasNoPausedAncestors(animation) {
2683  return !animation || animation._ts && _hasNoPausedAncestors(animation.parent);
2684},
2685    _elapsedCycleDuration = function _elapsedCycleDuration(animation) {
2686  return animation._repeat ? _animationCycle(animation._tTime, animation = animation.duration() + animation._rDelay) * animation : 0;
2687},
2688    // feed in the totalTime and cycleDuration and it'll return the cycle (iteration minus 1) and if the playhead is exactly at the very END, it will NOT bump up to the next cycle.
2689_animationCycle = function _animationCycle(tTime, cycleDuration) {
2690  var whole = Math.floor(tTime /= cycleDuration);
2691  return tTime && whole === tTime ? whole - 1 : whole;
2692},
2693    _parentToChildTotalTime = function _parentToChildTotalTime(parentTime, child) {
2694  return (parentTime - child._start) * child._ts + (child._ts >= 0 ? 0 : child._dirty ? child.totalDuration() : child._tDur);
2695},
2696    _setEnd = function _setEnd(animation) {
2697  return animation._end = _round(animation._start + (animation._tDur / Math.abs(animation._ts || animation._rts || _tinyNum) || 0));
2698},
2699    _alignPlayhead = function _alignPlayhead(animation, totalTime) {
2700  // adjusts the animation's _start and _end according to the provided totalTime (only if the parent's smoothChildTiming is true and the animation isn't paused). It doesn't do any rendering or forcing things back into parent timelines, etc. - that's what totalTime() is for.
2701  var parent = animation._dp;
2702
2703  if (parent && parent.smoothChildTiming && animation._ts) {
2704    animation._start = _round(parent._time - (animation._ts > 0 ? totalTime / animation._ts : ((animation._dirty ? animation.totalDuration() : animation._tDur) - totalTime) / -animation._ts));
2705
2706    _setEnd(animation);
2707
2708    parent._dirty || _uncache(parent, animation); //for performance improvement. If the parent's cache is already dirty, it already took care of marking the ancestors as dirty too, so skip the function call here.
2709  }
2710
2711  return animation;
2712},
2713
2714/*
2715_totalTimeToTime = (clampedTotalTime, duration, repeat, repeatDelay, yoyo) => {
2716	let cycleDuration = duration + repeatDelay,
2717		time = _round(clampedTotalTime % cycleDuration);
2718	if (time > duration) {
2719		time = duration;
2720	}
2721	return (yoyo && (~~(clampedTotalTime / cycleDuration) & 1)) ? duration - time : time;
2722},
2723*/
2724_postAddChecks = function _postAddChecks(timeline, child) {
2725  var t;
2726
2727  if (child._time || child._initted && !child._dur) {
2728    //in case, for example, the _start is moved on a tween that has already rendered. Imagine it's at its end state, then the startTime is moved WAY later (after the end of this timeline), it should render at its beginning.
2729    t = _parentToChildTotalTime(timeline.rawTime(), child);
2730
2731    if (!child._dur || _clamp(0, child.totalDuration(), t) - child._tTime > _tinyNum) {
2732      child.render(t, true);
2733    }
2734  } //if the timeline has already ended but the inserted tween/timeline extends the duration, we should enable this timeline again so that it renders properly. We should also align the playhead with the parent timeline's when appropriate.
2735
2736
2737  if (_uncache(timeline, child)._dp && timeline._initted && timeline._time >= timeline._dur && timeline._ts) {
2738    //in case any of the ancestors had completed but should now be enabled...
2739    if (timeline._dur < timeline.duration()) {
2740      t = timeline;
2741
2742      while (t._dp) {
2743        t.rawTime() >= 0 && t.totalTime(t._tTime); //moves the timeline (shifts its startTime) if necessary, and also enables it. If it's currently zero, though, it may not be scheduled to render until later so there's no need to force it to align with the current playhead position. Only move to catch up with the playhead.
2744
2745        t = t._dp;
2746      }
2747    }
2748
2749    timeline._zTime = -_tinyNum; // helps ensure that the next render() will be forced (crossingStart = true in render()), even if the duration hasn't changed (we're adding a child which would need to get rendered). Definitely an edge case. Note: we MUST do this AFTER the loop above where the totalTime() might trigger a render() because this _addToTimeline() method gets called from the Animation constructor, BEFORE tweens even record their targets, etc. so we wouldn't want things to get triggered in the wrong order.
2750  }
2751},
2752    _addToTimeline = function _addToTimeline(timeline, child, position, skipChecks) {
2753  child.parent && _removeFromParent(child);
2754  child._start = _round(position + child._delay);
2755  child._end = _round(child._start + (child.totalDuration() / Math.abs(child.timeScale()) || 0));
2756
2757  _addLinkedListItem(timeline, child, "_first", "_last", timeline._sort ? "_start" : 0);
2758
2759  timeline._recent = child;
2760  skipChecks || _postAddChecks(timeline, child);
2761  return timeline;
2762},
2763    _scrollTrigger = function _scrollTrigger(animation, trigger) {
2764  return (_globals.ScrollTrigger || _missingPlugin("scrollTrigger", trigger)) && _globals.ScrollTrigger.create(trigger, animation);
2765},
2766    _attemptInitTween = function _attemptInitTween(tween, totalTime, force, suppressEvents) {
2767  _initTween(tween, totalTime);
2768
2769  if (!tween._initted) {
2770    return 1;
2771  }
2772
2773  if (!force && tween._pt && (tween._dur && tween.vars.lazy !== false || !tween._dur && tween.vars.lazy) && _lastRenderedFrame !== _ticker.frame) {
2774    _lazyTweens.push(tween);
2775
2776    tween._lazy = [totalTime, suppressEvents];
2777    return 1;
2778  }
2779},
2780    _parentPlayheadIsBeforeStart = function _parentPlayheadIsBeforeStart(_ref) {
2781  var parent = _ref.parent;
2782  return parent && parent._ts && parent._initted && !parent._lock && (parent.rawTime() < 0 || _parentPlayheadIsBeforeStart(parent));
2783},
2784    // check parent's _lock because when a timeline repeats/yoyos and does its artificial wrapping, we shouldn't force the ratio back to 0
2785_renderZeroDurationTween = function _renderZeroDurationTween(tween, totalTime, suppressEvents, force) {
2786  var prevRatio = tween.ratio,
2787      ratio = totalTime < 0 || !totalTime && (!tween._start && _parentPlayheadIsBeforeStart(tween) || (tween._ts < 0 || tween._dp._ts < 0) && tween.data !== "isFromStart" && tween.data !== "isStart") ? 0 : 1,
2788      // if the tween or its parent is reversed and the totalTime is 0, we should go to a ratio of 0.
2789  repeatDelay = tween._rDelay,
2790      tTime = 0,
2791      pt,
2792      iteration,
2793      prevIteration;
2794
2795  if (repeatDelay && tween._repeat) {
2796    // in case there's a zero-duration tween that has a repeat with a repeatDelay
2797    tTime = _clamp(0, tween._tDur, totalTime);
2798    iteration = _animationCycle(tTime, repeatDelay);
2799    prevIteration = _animationCycle(tween._tTime, repeatDelay);
2800    tween._yoyo && iteration & 1 && (ratio = 1 - ratio);
2801
2802    if (iteration !== prevIteration) {
2803      prevRatio = 1 - ratio;
2804      tween.vars.repeatRefresh && tween._initted && tween.invalidate();
2805    }
2806  }
2807
2808  if (ratio !== prevRatio || force || tween._zTime === _tinyNum || !totalTime && tween._zTime) {
2809    if (!tween._initted && _attemptInitTween(tween, totalTime, force, suppressEvents)) {
2810      // if we render the very beginning (time == 0) of a fromTo(), we must force the render (normal tweens wouldn't need to render at a time of 0 when the prevTime was also 0). This is also mandatory to make sure overwriting kicks in immediately.
2811      return;
2812    }
2813
2814    prevIteration = tween._zTime;
2815    tween._zTime = totalTime || (suppressEvents ? _tinyNum : 0); // when the playhead arrives at EXACTLY time 0 (right on top) of a zero-duration tween, we need to discern if events are suppressed so that when the playhead moves again (next time), it'll trigger the callback. If events are NOT suppressed, obviously the callback would be triggered in this render. Basically, the callback should fire either when the playhead ARRIVES or LEAVES this exact spot, not both. Imagine doing a timeline.seek(0) and there's a callback that sits at 0. Since events are suppressed on that seek() by default, nothing will fire, but when the playhead moves off of that position, the callback should fire. This behavior is what people intuitively expect.
2816
2817    suppressEvents || (suppressEvents = totalTime && !prevIteration); // if it was rendered previously at exactly 0 (_zTime) and now the playhead is moving away, DON'T fire callbacks otherwise they'll seem like duplicates.
2818
2819    tween.ratio = ratio;
2820    tween._from && (ratio = 1 - ratio);
2821    tween._time = 0;
2822    tween._tTime = tTime;
2823    pt = tween._pt;
2824
2825    while (pt) {
2826      pt.r(ratio, pt.d);
2827      pt = pt._next;
2828    }
2829
2830    tween._startAt && totalTime < 0 && tween._startAt.render(totalTime, true, true);
2831    tween._onUpdate && !suppressEvents && _callback(tween, "onUpdate");
2832    tTime && tween._repeat && !suppressEvents && tween.parent && _callback(tween, "onRepeat");
2833
2834    if ((totalTime >= tween._tDur || totalTime < 0) && tween.ratio === ratio) {
2835      ratio && _removeFromParent(tween, 1);
2836
2837      if (!suppressEvents) {
2838        _callback(tween, ratio ? "onComplete" : "onReverseComplete", true);
2839
2840        tween._prom && tween._prom();
2841      }
2842    }
2843  } else if (!tween._zTime) {
2844    tween._zTime = totalTime;
2845  }
2846},
2847    _findNextPauseTween = function _findNextPauseTween(animation, prevTime, time) {
2848  var child;
2849
2850  if (time > prevTime) {
2851    child = animation._first;
2852
2853    while (child && child._start <= time) {
2854      if (!child._dur && child.data === "isPause" && child._start > prevTime) {
2855        return child;
2856      }
2857
2858      child = child._next;
2859    }
2860  } else {
2861    child = animation._last;
2862
2863    while (child && child._start >= time) {
2864      if (!child._dur && child.data === "isPause" && child._start < prevTime) {
2865        return child;
2866      }
2867
2868      child = child._prev;
2869    }
2870  }
2871},
2872    _setDuration = function _setDuration(animation, duration, skipUncache, leavePlayhead) {
2873  var repeat = animation._repeat,
2874      dur = _round(duration) || 0,
2875      totalProgress = animation._tTime / animation._tDur;
2876  totalProgress && !leavePlayhead && (animation._time *= dur / animation._dur);
2877  animation._dur = dur;
2878  animation._tDur = !repeat ? dur : repeat < 0 ? 1e10 : _round(dur * (repeat + 1) + animation._rDelay * repeat);
2879  totalProgress && !leavePlayhead ? _alignPlayhead(animation, animation._tTime = animation._tDur * totalProgress) : animation.parent && _setEnd(animation);
2880  skipUncache || _uncache(animation.parent, animation);
2881  return animation;
2882},
2883    _onUpdateTotalDuration = function _onUpdateTotalDuration(animation) {
2884  return animation instanceof Timeline ? _uncache(animation) : _setDuration(animation, animation._dur);
2885},
2886    _zeroPosition = {
2887  _start: 0,
2888  endTime: _emptyFunc
2889},
2890    _parsePosition = function _parsePosition(animation, position) {
2891  var labels = animation.labels,
2892      recent = animation._recent || _zeroPosition,
2893      clippedDuration = animation.duration() >= _bigNum ? recent.endTime(false) : animation._dur,
2894      //in case there's a child that infinitely repeats, users almost never intend for the insertion point of a new child to be based on a SUPER long value like that so we clip it and assume the most recently-added child's endTime should be used instead.
2895  i,
2896      offset;
2897
2898  if (_isString(position) && (isNaN(position) || position in labels)) {
2899    //if the string is a number like "1", check to see if there's a label with that name, otherwise interpret it as a number (absolute value).
2900    i = position.charAt(0);
2901
2902    if (i === "<" || i === ">") {
2903      return (i === "<" ? recent._start : recent.endTime(recent._repeat >= 0)) + (parseFloat(position.substr(1)) || 0);
2904    }
2905
2906    i = position.indexOf("=");
2907
2908    if (i < 0) {
2909      position in labels || (labels[position] = clippedDuration);
2910      return labels[position];
2911    }
2912
2913    offset = +(position.charAt(i - 1) + position.substr(i + 1));
2914    return i > 1 ? _parsePosition(animation, position.substr(0, i - 1)) + offset : clippedDuration + offset;
2915  }
2916
2917  return position == null ? clippedDuration : +position;
2918},
2919    _conditionalReturn = function _conditionalReturn(value, func) {
2920  return value || value === 0 ? func(value) : func;
2921},
2922    _clamp = function _clamp(min, max, value) {
2923  return value < min ? min : value > max ? max : value;
2924},
2925    getUnit = function getUnit(value) {
2926  if (typeof value !== "string") {
2927    return "";
2928  }
2929
2930  var v = _unitExp.exec(value);
2931
2932  return v ? value.substr(v.index + v[0].length) : "";
2933},
2934    // note: protect against padded numbers as strings, like "100.100". That shouldn't return "00" as the unit. If it's numeric, return no unit.
2935clamp = function clamp(min, max, value) {
2936  return _conditionalReturn(value, function (v) {
2937    return _clamp(min, max, v);
2938  });
2939},
2940    _slice = [].slice,
2941    _isArrayLike = function _isArrayLike(value, nonEmpty) {
2942  return value && _isObject(value) && "length" in value && (!nonEmpty && !value.length || value.length - 1 in value && _isObject(value[0])) && !value.nodeType && value !== _win;
2943},
2944    _flatten = function _flatten(ar, leaveStrings, accumulator) {
2945  if (accumulator === void 0) {
2946    accumulator = [];
2947  }
2948
2949  return ar.forEach(function (value) {
2950    var _accumulator;
2951
2952    return _isString(value) && !leaveStrings || _isArrayLike(value, 1) ? (_accumulator = accumulator).push.apply(_accumulator, toArray(value)) : accumulator.push(value);
2953  }) || accumulator;
2954},
2955    //takes any value and returns an array. If it's a string (and leaveStrings isn't true), it'll use document.querySelectorAll() and convert that to an array. It'll also accept iterables like jQuery objects.
2956toArray = function toArray(value, leaveStrings) {
2957  return _isString(value) && !leaveStrings && (_coreInitted || !_wake()) ? _slice.call(_doc.querySelectorAll(value), 0) : _isArray(value) ? _flatten(value, leaveStrings) : _isArrayLike(value) ? _slice.call(value, 0) : value ? [value] : [];
2958},
2959    shuffle = function shuffle(a) {
2960  return a.sort(function () {
2961    return .5 - Math.random();
2962  });
2963},
2964    // alternative that's a bit faster and more reliably diverse but bigger:   for (let j, v, i = a.length; i; j = Math.floor(Math.random() * i), v = a[--i], a[i] = a[j], a[j] = v); return a;
2965//for distributing values across an array. Can accept a number, a function or (most commonly) a function which can contain the following properties: {base, amount, from, ease, grid, axis, length, each}. Returns a function that expects the following parameters: index, target, array. Recognizes the following
2966distribute = function distribute(v) {
2967  if (_isFunction(v)) {
2968    return v;
2969  }
2970
2971  var vars = _isObject(v) ? v : {
2972    each: v
2973  },
2974      //n:1 is just to indicate v was a number; we leverage that later to set v according to the length we get. If a number is passed in, we treat it like the old stagger value where 0.1, for example, would mean that things would be distributed with 0.1 between each element in the array rather than a total "amount" that's chunked out among them all.
2975  ease = _parseEase(vars.ease),
2976      from = vars.from || 0,
2977      base = parseFloat(vars.base) || 0,
2978      cache = {},
2979      isDecimal = from > 0 && from < 1,
2980      ratios = isNaN(from) || isDecimal,
2981      axis = vars.axis,
2982      ratioX = from,
2983      ratioY = from;
2984
2985  if (_isString(from)) {
2986    ratioX = ratioY = {
2987      center: .5,
2988      edges: .5,
2989      end: 1
2990    }[from] || 0;
2991  } else if (!isDecimal && ratios) {
2992    ratioX = from[0];
2993    ratioY = from[1];
2994  }
2995
2996  return function (i, target, a) {
2997    var l = (a || vars).length,
2998        distances = cache[l],
2999        originX,
3000        originY,
3001        x,
3002        y,
3003        d,
3004        j,
3005        max,
3006        min,
3007        wrapAt;
3008
3009    if (!distances) {
3010      wrapAt = vars.grid === "auto" ? 0 : (vars.grid || [1, _bigNum])[1];
3011
3012      if (!wrapAt) {
3013        max = -_bigNum;
3014
3015        while (max < (max = a[wrapAt++].getBoundingClientRect().left) && wrapAt < l) {}
3016
3017        wrapAt--;
3018      }
3019
3020      distances = cache[l] = [];
3021      originX = ratios ? Math.min(wrapAt, l) * ratioX - .5 : from % wrapAt;
3022      originY = ratios ? l * ratioY / wrapAt - .5 : from / wrapAt | 0;
3023      max = 0;
3024      min = _bigNum;
3025
3026      for (j = 0; j < l; j++) {
3027        x = j % wrapAt - originX;
3028        y = originY - (j / wrapAt | 0);
3029        distances[j] = d = !axis ? _sqrt(x * x + y * y) : Math.abs(axis === "y" ? y : x);
3030        d > max && (max = d);
3031        d < min && (min = d);
3032      }
3033
3034      from === "random" && shuffle(distances);
3035      distances.max = max - min;
3036      distances.min = min;
3037      distances.v = l = (parseFloat(vars.amount) || parseFloat(vars.each) * (wrapAt > l ? l - 1 : !axis ? Math.max(wrapAt, l / wrapAt) : axis === "y" ? l / wrapAt : wrapAt) || 0) * (from === "edges" ? -1 : 1);
3038      distances.b = l < 0 ? base - l : base;
3039      distances.u = getUnit(vars.amount || vars.each) || 0; //unit
3040
3041      ease = ease && l < 0 ? _invertEase(ease) : ease;
3042    }
3043
3044    l = (distances[i] - distances.min) / distances.max || 0;
3045    return _round(distances.b + (ease ? ease(l) : l) * distances.v) + distances.u; //round in order to work around floating point errors
3046  };
3047},
3048    _roundModifier = function _roundModifier(v) {
3049  //pass in 0.1 get a function that'll round to the nearest tenth, or 5 to round to the closest 5, or 0.001 to the closest 1000th, etc.
3050  var p = v < 1 ? Math.pow(10, (v + "").length - 2) : 1; //to avoid floating point math errors (like 24 * 0.1 == 2.4000000000000004), we chop off at a specific number of decimal places (much faster than toFixed()
3051
3052  return function (raw) {
3053    var n = Math.round(parseFloat(raw) / v) * v * p;
3054    return (n - n % 1) / p + (_isNumber(raw) ? 0 : getUnit(raw)); // n - n % 1 replaces Math.floor() in order to handle negative values properly. For example, Math.floor(-150.00000000000003) is 151!
3055  };
3056},
3057    snap = function snap(snapTo, value) {
3058  var isArray = _isArray(snapTo),
3059      radius,
3060      is2D;
3061
3062  if (!isArray && _isObject(snapTo)) {
3063    radius = isArray = snapTo.radius || _bigNum;
3064
3065    if (snapTo.values) {
3066      snapTo = toArray(snapTo.values);
3067
3068      if (is2D = !_isNumber(snapTo[0])) {
3069        radius *= radius; //performance optimization so we don't have to Math.sqrt() in the loop.
3070      }
3071    } else {
3072      snapTo = _roundModifier(snapTo.increment);
3073    }
3074  }
3075
3076  return _conditionalReturn(value, !isArray ? _roundModifier(snapTo) : _isFunction(snapTo) ? function (raw) {
3077    is2D = snapTo(raw);
3078    return Math.abs(is2D - raw) <= radius ? is2D : raw;
3079  } : function (raw) {
3080    var x = parseFloat(is2D ? raw.x : raw),
3081        y = parseFloat(is2D ? raw.y : 0),
3082        min = _bigNum,
3083        closest = 0,
3084        i = snapTo.length,
3085        dx,
3086        dy;
3087
3088    while (i--) {
3089      if (is2D) {
3090        dx = snapTo[i].x - x;
3091        dy = snapTo[i].y - y;
3092        dx = dx * dx + dy * dy;
3093      } else {
3094        dx = Math.abs(snapTo[i] - x);
3095      }
3096
3097      if (dx < min) {
3098        min = dx;
3099        closest = i;
3100      }
3101    }
3102
3103    closest = !radius || min <= radius ? snapTo[closest] : raw;
3104    return is2D || closest === raw || _isNumber(raw) ? closest : closest + getUnit(raw);
3105  });
3106},
3107    random = function random(min, max, roundingIncrement, returnFunction) {
3108  return _conditionalReturn(_isArray(min) ? !max : roundingIncrement === true ? !!(roundingIncrement = 0) : !returnFunction, function () {
3109    return _isArray(min) ? min[~~(Math.random() * min.length)] : (roundingIncrement = roundingIncrement || 1e-5) && (returnFunction = roundingIncrement < 1 ? Math.pow(10, (roundingIncrement + "").length - 2) : 1) && Math.floor(Math.round((min - roundingIncrement / 2 + Math.random() * (max - min + roundingIncrement * .99)) / roundingIncrement) * roundingIncrement * returnFunction) / returnFunction;
3110  });
3111},
3112    pipe = function pipe() {
3113  for (var _len = arguments.length, functions = new Array(_len), _key = 0; _key < _len; _key++) {
3114    functions[_key] = arguments[_key];
3115  }
3116
3117  return function (value) {
3118    return functions.reduce(function (v, f) {
3119      return f(v);
3120    }, value);
3121  };
3122},
3123    unitize = function unitize(func, unit) {
3124  return function (value) {
3125    return func(parseFloat(value)) + (unit || getUnit(value));
3126  };
3127},
3128    normalize = function normalize(min, max, value) {
3129  return mapRange(min, max, 0, 1, value);
3130},
3131    _wrapArray = function _wrapArray(a, wrapper, value) {
3132  return _conditionalReturn(value, function (index) {
3133    return a[~~wrapper(index)];
3134  });
3135},
3136    wrap = function wrap(min, max, value) {
3137  // NOTE: wrap() CANNOT be an arrow function! A very odd compiling bug causes problems (unrelated to GSAP).
3138  var range = max - min;
3139  return _isArray(min) ? _wrapArray(min, wrap(0, min.length), max) : _conditionalReturn(value, function (value) {
3140    return (range + (value - min) % range) % range + min;
3141  });
3142},
3143    wrapYoyo = function wrapYoyo(min, max, value) {
3144  var range = max - min,
3145      total = range * 2;
3146  return _isArray(min) ? _wrapArray(min, wrapYoyo(0, min.length - 1), max) : _conditionalReturn(value, function (value) {
3147    value = (total + (value - min) % total) % total || 0;
3148    return min + (value > range ? total - value : value);
3149  });
3150},
3151    _replaceRandom = function _replaceRandom(value) {
3152  //replaces all occurrences of random(...) in a string with the calculated random value. can be a range like random(-100, 100, 5) or an array like random([0, 100, 500])
3153  var prev = 0,
3154      s = "",
3155      i,
3156      nums,
3157      end,
3158      isArray;
3159
3160  while (~(i = value.indexOf("random(", prev))) {
3161    end = value.indexOf(")", i);
3162    isArray = value.charAt(i + 7) === "[";
3163    nums = value.substr(i + 7, end - i - 7).match(isArray ? _delimitedValueExp : _strictNumExp);
3164    s += value.substr(prev, i - prev) + random(isArray ? nums : +nums[0], isArray ? 0 : +nums[1], +nums[2] || 1e-5);
3165    prev = end + 1;
3166  }
3167
3168  return s + value.substr(prev, value.length - prev);
3169},
3170    mapRange = function mapRange(inMin, inMax, outMin, outMax, value) {
3171  var inRange = inMax - inMin,
3172      outRange = outMax - outMin;
3173  return _conditionalReturn(value, function (value) {
3174    return outMin + ((value - inMin) / inRange * outRange || 0);
3175  });
3176},
3177    interpolate = function interpolate(start, end, progress, mutate) {
3178  var func = isNaN(start + end) ? 0 : function (p) {
3179    return (1 - p) * start + p * end;
3180  };
3181
3182  if (!func) {
3183    var isString = _isString(start),
3184        master = {},
3185        p,
3186        i,
3187        interpolators,
3188        l,
3189        il;
3190
3191    progress === true && (mutate = 1) && (progress = null);
3192
3193    if (isString) {
3194      start = {
3195        p: start
3196      };
3197      end = {
3198        p: end
3199      };
3200    } else if (_isArray(start) && !_isArray(end)) {
3201      interpolators = [];
3202      l = start.length;
3203      il = l - 2;
3204
3205      for (i = 1; i < l; i++) {
3206        interpolators.push(interpolate(start[i - 1], start[i])); //build the interpolators up front as a performance optimization so that when the function is called many times, it can just reuse them.
3207      }
3208
3209      l--;
3210
3211      func = function func(p) {
3212        p *= l;
3213        var i = Math.min(il, ~~p);
3214        return interpolators[i](p - i);
3215      };
3216
3217      progress = end;
3218    } else if (!mutate) {
3219      start = _merge(_isArray(start) ? [] : {}, start);
3220    }
3221
3222    if (!interpolators) {
3223      for (p in end) {
3224        _addPropTween.call(master, start, p, "get", end[p]);
3225      }
3226
3227      func = function func(p) {
3228        return _renderPropTweens(p, master) || (isString ? start.p : start);
3229      };
3230    }
3231  }
3232
3233  return _conditionalReturn(progress, func);
3234},
3235    _getLabelInDirection = function _getLabelInDirection(timeline, fromTime, backward) {
3236  //used for nextLabel() and previousLabel()
3237  var labels = timeline.labels,
3238      min = _bigNum,
3239      p,
3240      distance,
3241      label;
3242
3243  for (p in labels) {
3244    distance = labels[p] - fromTime;
3245
3246    if (distance < 0 === !!backward && distance && min > (distance = Math.abs(distance))) {
3247      label = p;
3248      min = distance;
3249    }
3250  }
3251
3252  return label;
3253},
3254    _callback = function _callback(animation, type, executeLazyFirst) {
3255  var v = animation.vars,
3256      callback = v[type],
3257      params,
3258      scope;
3259
3260  if (!callback) {
3261    return;
3262  }
3263
3264  params = v[type + "Params"];
3265  scope = v.callbackScope || animation;
3266  executeLazyFirst && _lazyTweens.length && _lazyRender(); //in case rendering caused any tweens to lazy-init, we should render them because typically when a timeline finishes, users expect things to have rendered fully. Imagine an onUpdate on a timeline that reports/checks tweened values.
3267
3268  return params ? callback.apply(scope, params) : callback.call(scope);
3269},
3270    _interrupt = function _interrupt(animation) {
3271  _removeFromParent(animation);
3272
3273  animation.scrollTrigger && animation.scrollTrigger.kill(false);
3274  animation.progress() < 1 && _callback(animation, "onInterrupt");
3275  return animation;
3276},
3277    _quickTween,
3278    _createPlugin = function _createPlugin(config) {
3279  config = !config.name && config["default"] || config; //UMD packaging wraps things oddly, so for example MotionPathHelper becomes {MotionPathHelper:MotionPathHelper, default:MotionPathHelper}.
3280
3281  var name = config.name,
3282      isFunc = _isFunction(config),
3283      Plugin = name && !isFunc && config.init ? function () {
3284    this._props = [];
3285  } : config,
3286      //in case someone passes in an object that's not a plugin, like CustomEase
3287  instanceDefaults = {
3288    init: _emptyFunc,
3289    render: _renderPropTweens,
3290    add: _addPropTween,
3291    kill: _killPropTweensOf,
3292    modifier: _addPluginModifier,
3293    rawVars: 0
3294  },
3295      statics = {
3296    targetTest: 0,
3297    get: 0,
3298    getSetter: _getSetter,
3299    aliases: {},
3300    register: 0
3301  };
3302
3303  _wake();
3304
3305  if (config !== Plugin) {
3306    if (_plugins[name]) {
3307      return;
3308    }
3309
3310    _setDefaults(Plugin, _setDefaults(_copyExcluding(config, instanceDefaults), statics)); //static methods
3311
3312
3313    _merge(Plugin.prototype, _merge(instanceDefaults, _copyExcluding(config, statics))); //instance methods
3314
3315
3316    _plugins[Plugin.prop = name] = Plugin;
3317
3318    if (config.targetTest) {
3319      _harnessPlugins.push(Plugin);
3320
3321      _reservedProps[name] = 1;
3322    }
3323
3324    name = (name === "css" ? "CSS" : name.charAt(0).toUpperCase() + name.substr(1)) + "Plugin"; //for the global name. "motionPath" should become MotionPathPlugin
3325  }
3326
3327  _addGlobal(name, Plugin);
3328
3329  config.register && config.register(gsap, Plugin, PropTween);
3330},
3331
3332/*
3333 * --------------------------------------------------------------------------------------
3334 * COLORS
3335 * --------------------------------------------------------------------------------------
3336 */
3337_255 = 255,
3338    _colorLookup = {
3339  aqua: [0, _255, _255],
3340  lime: [0, _255, 0],
3341  silver: [192, 192, 192],
3342  black: [0, 0, 0],
3343  maroon: [128, 0, 0],
3344  teal: [0, 128, 128],
3345  blue: [0, 0, _255],
3346  navy: [0, 0, 128],
3347  white: [_255, _255, _255],
3348  olive: [128, 128, 0],
3349  yellow: [_255, _255, 0],
3350  orange: [_255, 165, 0],
3351  gray: [128, 128, 128],
3352  purple: [128, 0, 128],
3353  green: [0, 128, 0],
3354  red: [_255, 0, 0],
3355  pink: [_255, 192, 203],
3356  cyan: [0, _255, _255],
3357  transparent: [_255, _255, _255, 0]
3358},
3359    _hue = function _hue(h, m1, m2) {
3360  h = h < 0 ? h + 1 : h > 1 ? h - 1 : h;
3361  return (h * 6 < 1 ? m1 + (m2 - m1) * h * 6 : h < .5 ? m2 : h * 3 < 2 ? m1 + (m2 - m1) * (2 / 3 - h) * 6 : m1) * _255 + .5 | 0;
3362},
3363    splitColor = function splitColor(v, toHSL, forceAlpha) {
3364  var a = !v ? _colorLookup.black : _isNumber(v) ? [v >> 16, v >> 8 & _255, v & _255] : 0,
3365      r,
3366      g,
3367      b,
3368      h,
3369      s,
3370      l,
3371      max,
3372      min,
3373      d,
3374      wasHSL;
3375
3376  if (!a) {
3377    if (v.substr(-1) === ",") {
3378      //sometimes a trailing comma is included and we should chop it off (typically from a comma-delimited list of values like a textShadow:"2px 2px 2px blue, 5px 5px 5px rgb(255,0,0)" - in this example "blue," has a trailing comma. We could strip it out inside parseComplex() but we'd need to do it to the beginning and ending values plus it wouldn't provide protection from other potential scenarios like if the user passes in a similar value.
3379      v = v.substr(0, v.length - 1);
3380    }
3381
3382    if (_colorLookup[v]) {
3383      a = _colorLookup[v];
3384    } else if (v.charAt(0) === "#") {
3385      if (v.length < 6) {
3386        //for shorthand like #9F0 or #9F0F (could have alpha)
3387        r = v.charAt(1);
3388        g = v.charAt(2);
3389        b = v.charAt(3);
3390        v = "#" + r + r + g + g + b + b + (v.length === 5 ? v.charAt(4) + v.charAt(4) : "");
3391      }
3392
3393      if (v.length === 9) {
3394        // hex with alpha, like #fd5e53ff
3395        a = parseInt(v.substr(1, 6), 16);
3396        return [a >> 16, a >> 8 & _255, a & _255, parseInt(v.substr(7), 16) / 255];
3397      }
3398
3399      v = parseInt(v.substr(1), 16);
3400      a = [v >> 16, v >> 8 & _255, v & _255];
3401    } else if (v.substr(0, 3) === "hsl") {
3402      a = wasHSL = v.match(_strictNumExp);
3403
3404      if (!toHSL) {
3405        h = +a[0] % 360 / 360;
3406        s = +a[1] / 100;
3407        l = +a[2] / 100;
3408        g = l <= .5 ? l * (s + 1) : l + s - l * s;
3409        r = l * 2 - g;
3410        a.length > 3 && (a[3] *= 1); //cast as number
3411
3412        a[0] = _hue(h + 1 / 3, r, g);
3413        a[1] = _hue(h, r, g);
3414        a[2] = _hue(h - 1 / 3, r, g);
3415      } else if (~v.indexOf("=")) {
3416        //if relative values are found, just return the raw strings with the relative prefixes in place.
3417        a = v.match(_numExp);
3418        forceAlpha && a.length < 4 && (a[3] = 1);
3419        return a;
3420      }
3421    } else {
3422      a = v.match(_strictNumExp) || _colorLookup.transparent;
3423    }
3424
3425    a = a.map(Number);
3426  }
3427
3428  if (toHSL && !wasHSL) {
3429    r = a[0] / _255;
3430    g = a[1] / _255;
3431    b = a[2] / _255;
3432    max = Math.max(r, g, b);
3433    min = Math.min(r, g, b);
3434    l = (max + min) / 2;
3435
3436    if (max === min) {
3437      h = s = 0;
3438    } else {
3439      d = max - min;
3440      s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
3441      h = max === r ? (g - b) / d + (g < b ? 6 : 0) : max === g ? (b - r) / d + 2 : (r - g) / d + 4;
3442      h *= 60;
3443    }
3444
3445    a[0] = ~~(h + .5);
3446    a[1] = ~~(s * 100 + .5);
3447    a[2] = ~~(l * 100 + .5);
3448  }
3449
3450  forceAlpha && a.length < 4 && (a[3] = 1);
3451  return a;
3452},
3453    _colorOrderData = function _colorOrderData(v) {
3454  // strips out the colors from the string, finds all the numeric slots (with units) and returns an array of those. The Array also has a "c" property which is an Array of the index values where the colors belong. This is to help work around issues where there's a mis-matched order of color/numeric data like drop-shadow(#f00 0px 1px 2px) and drop-shadow(0x 1px 2px #f00). This is basically a helper function used in _formatColors()
3455  var values = [],
3456      c = [],
3457      i = -1;
3458  v.split(_colorExp).forEach(function (v) {
3459    var a = v.match(_numWithUnitExp) || [];
3460    values.push.apply(values, a);
3461    c.push(i += a.length + 1);
3462  });
3463  values.c = c;
3464  return values;
3465},
3466    _formatColors = function _formatColors(s, toHSL, orderMatchData) {
3467  var result = "",
3468      colors = (s + result).match(_colorExp),
3469      type = toHSL ? "hsla(" : "rgba(",
3470      i = 0,
3471      c,
3472      shell,
3473      d,
3474      l;
3475
3476  if (!colors) {
3477    return s;
3478  }
3479
3480  colors = colors.map(function (color) {
3481    return (color = splitColor(color, toHSL, 1)) && type + (toHSL ? color[0] + "," + color[1] + "%," + color[2] + "%," + color[3] : color.join(",")) + ")";
3482  });
3483
3484  if (orderMatchData) {
3485    d = _colorOrderData(s);
3486    c = orderMatchData.c;
3487
3488    if (c.join(result) !== d.c.join(result)) {
3489      shell = s.replace(_colorExp, "1").split(_numWithUnitExp);
3490      l = shell.length - 1;
3491
3492      for (; i < l; i++) {
3493        result += shell[i] + (~c.indexOf(i) ? colors.shift() || type + "0,0,0,0)" : (d.length ? d : colors.length ? colors : orderMatchData).shift());
3494      }
3495    }
3496  }
3497
3498  if (!shell) {
3499    shell = s.split(_colorExp);
3500    l = shell.length - 1;
3501
3502    for (; i < l; i++) {
3503      result += shell[i] + colors[i];
3504    }
3505  }
3506
3507  return result + shell[l];
3508},
3509    _colorExp = function () {
3510  var s = "(?:\\b(?:(?:rgb|rgba|hsl|hsla)\\(.+?\\))|\\B#(?:[0-9a-f]{3,4}){1,2}\\b",
3511      //we'll dynamically build this Regular Expression to conserve file size. After building it, it will be able to find rgb(), rgba(), # (hexadecimal), and named color values like red, blue, purple, etc.,
3512  p;
3513
3514  for (p in _colorLookup) {
3515    s += "|" + p + "\\b";
3516  }
3517
3518  return new RegExp(s + ")", "gi");
3519}(),
3520    _hslExp = /hsl[a]?\(/,
3521    _colorStringFilter = function _colorStringFilter(a) {
3522  var combined = a.join(" "),
3523      toHSL;
3524  _colorExp.lastIndex = 0;
3525
3526  if (_colorExp.test(combined)) {
3527    toHSL = _hslExp.test(combined);
3528    a[1] = _formatColors(a[1], toHSL);
3529    a[0] = _formatColors(a[0], toHSL, _colorOrderData(a[1])); // make sure the order of numbers/colors match with the END value.
3530
3531    return true;
3532  }
3533},
3534
3535/*
3536 * --------------------------------------------------------------------------------------
3537 * TICKER
3538 * --------------------------------------------------------------------------------------
3539 */
3540_tickerActive,
3541    _ticker = function () {
3542  var _getTime = Date.now,
3543      _lagThreshold = 500,
3544      _adjustedLag = 33,
3545      _startTime = _getTime(),
3546      _lastUpdate = _startTime,
3547      _gap = 1000 / 240,
3548      _nextTime = _gap,
3549      _listeners = [],
3550      _id,
3551      _req,
3552      _raf,
3553      _self,
3554      _delta,
3555      _i,
3556      _tick = function _tick(v) {
3557    var elapsed = _getTime() - _lastUpdate,
3558        manual = v === true,
3559        overlap,
3560        dispatch,
3561        time,
3562        frame;
3563
3564    elapsed > _lagThreshold && (_startTime += elapsed - _adjustedLag);
3565    _lastUpdate += elapsed;
3566    time = _lastUpdate - _startTime;
3567    overlap = time - _nextTime;
3568
3569    if (overlap > 0 || manual) {
3570      frame = ++_self.frame;
3571      _delta = time - _self.time * 1000;
3572      _self.time = time = time / 1000;
3573      _nextTime += overlap + (overlap >= _gap ? 4 : _gap - overlap);
3574      dispatch = 1;
3575    }
3576
3577    manual || (_id = _req(_tick)); //make sure the request is made before we dispatch the "tick" event so that timing is maintained. Otherwise, if processing the "tick" requires a bunch of time (like 15ms) and we're using a setTimeout() that's based on 16.7ms, it'd technically take 31.7ms between frames otherwise.
3578
3579    if (dispatch) {
3580      for (_i = 0; _i < _listeners.length; _i++) {
3581        // use _i and check _listeners.length instead of a variable because a listener could get removed during the loop, and if that happens to an element less than the current index, it'd throw things off in the loop.
3582        _listeners[_i](time, _delta, frame, v);
3583      }
3584    }
3585  };
3586
3587  _self = {
3588    time: 0,
3589    frame: 0,
3590    tick: function tick() {
3591      _tick(true);
3592    },
3593    deltaRatio: function deltaRatio(fps) {
3594      return _delta / (1000 / (fps || 60));
3595    },
3596    wake: function wake() {
3597      if (_coreReady) {
3598        if (!_coreInitted && _windowExists()) {
3599          _win = _coreInitted = window;
3600          _doc = _win.document || {};
3601          _globals.gsap = gsap;
3602          (_win.gsapVersions || (_win.gsapVersions = [])).push(gsap.version);
3603
3604          _install(_installScope || _win.GreenSockGlobals || !_win.gsap && _win || {});
3605
3606          _raf = _win.requestAnimationFrame;
3607        }
3608
3609        _id && _self.sleep();
3610
3611        _req = _raf || function (f) {
3612          return setTimeout(f, _nextTime - _self.time * 1000 + 1 | 0);
3613        };
3614
3615        _tickerActive = 1;
3616
3617        _tick(2);
3618      }
3619    },
3620    sleep: function sleep() {
3621      (_raf ? _win.cancelAnimationFrame : clearTimeout)(_id);
3622      _tickerActive = 0;
3623      _req = _emptyFunc;
3624    },
3625    lagSmoothing: function lagSmoothing(threshold, adjustedLag) {
3626      _lagThreshold = threshold || 1 / _tinyNum; //zero should be interpreted as basically unlimited
3627
3628      _adjustedLag = Math.min(adjustedLag, _lagThreshold, 0);
3629    },
3630    fps: function fps(_fps) {
3631      _gap = 1000 / (_fps || 240);
3632      _nextTime = _self.time * 1000 + _gap;
3633    },
3634    add: function add(callback) {
3635      _listeners.indexOf(callback) < 0 && _listeners.push(callback);
3636
3637      _wake();
3638    },
3639    remove: function remove(callback) {
3640      var i;
3641      ~(i = _listeners.indexOf(callback)) && _listeners.splice(i, 1) && _i >= i && _i--;
3642    },
3643    _listeners: _listeners
3644  };
3645  return _self;
3646}(),
3647    _wake = function _wake() {
3648  return !_tickerActive && _ticker.wake();
3649},
3650    //also ensures the core classes are initialized.
3651
3652/*
3653* -------------------------------------------------
3654* EASING
3655* -------------------------------------------------
3656*/
3657_easeMap = {},
3658    _customEaseExp = /^[\d.\-M][\d.\-,\s]/,
3659    _quotesExp = /["']/g,
3660    _parseObjectInString = function _parseObjectInString(value) {
3661  //takes a string like "{wiggles:10, type:anticipate})" and turns it into a real object. Notice it ends in ")" and includes the {} wrappers. This is because we only use this function for parsing ease configs and prioritized optimization rather than reusability.
3662  var obj = {},
3663      split = value.substr(1, value.length - 3).split(":"),
3664      key = split[0],
3665      i = 1,
3666      l = split.length,
3667      index,
3668      val,
3669      parsedVal;
3670
3671  for (; i < l; i++) {
3672    val = split[i];
3673    index = i !== l - 1 ? val.lastIndexOf(",") : val.length;
3674    parsedVal = val.substr(0, index);
3675    obj[key] = isNaN(parsedVal) ? parsedVal.replace(_quotesExp, "").trim() : +parsedVal;
3676    key = val.substr(index + 1).trim();
3677  }
3678
3679  return obj;
3680},
3681    _valueInParentheses = function _valueInParentheses(value) {
3682  var open = value.indexOf("(") + 1,
3683      close = value.indexOf(")"),
3684      nested = value.indexOf("(", open);
3685  return value.substring(open, ~nested && nested < close ? value.indexOf(")", close + 1) : close);
3686},
3687    _configEaseFromString = function _configEaseFromString(name) {
3688  //name can be a string like "elastic.out(1,0.5)", and pass in _easeMap as obj and it'll parse it out and call the actual function like _easeMap.Elastic.easeOut.config(1,0.5). It will also parse custom ease strings as long as CustomEase is loaded and registered (internally as _easeMap._CE).
3689  var split = (name + "").split("("),
3690      ease = _easeMap[split[0]];
3691  return ease && split.length > 1 && ease.config ? ease.config.apply(null, ~name.indexOf("{") ? [_parseObjectInString(split[1])] : _valueInParentheses(name).split(",").map(_numericIfPossible)) : _easeMap._CE && _customEaseExp.test(name) ? _easeMap._CE("", name) : ease;
3692},
3693    _invertEase = function _invertEase(ease) {
3694  return function (p) {
3695    return 1 - ease(1 - p);
3696  };
3697},
3698    // allow yoyoEase to be set in children and have those affected when the parent/ancestor timeline yoyos.
3699_propagateYoyoEase = function _propagateYoyoEase(timeline, isYoyo) {
3700  var child = timeline._first,
3701      ease;
3702
3703  while (child) {
3704    if (child instanceof Timeline) {
3705      _propagateYoyoEase(child, isYoyo);
3706    } else if (child.vars.yoyoEase && (!child._yoyo || !child._repeat) && child._yoyo !== isYoyo) {
3707      if (child.timeline) {
3708        _propagateYoyoEase(child.timeline, isYoyo);
3709      } else {
3710        ease = child._ease;
3711        child._ease = child._yEase;
3712        child._yEase = ease;
3713        child._yoyo = isYoyo;
3714      }
3715    }
3716
3717    child = child._next;
3718  }
3719},
3720    _parseEase = function _parseEase(ease, defaultEase) {
3721  return !ease ? defaultEase : (_isFunction(ease) ? ease : _easeMap[ease] || _configEaseFromString(ease)) || defaultEase;
3722},
3723    _insertEase = function _insertEase(names, easeIn, easeOut, easeInOut) {
3724  if (easeOut === void 0) {
3725    easeOut = function easeOut(p) {
3726      return 1 - easeIn(1 - p);
3727    };
3728  }
3729
3730  if (easeInOut === void 0) {
3731    easeInOut = function easeInOut(p) {
3732      return p < .5 ? easeIn(p * 2) / 2 : 1 - easeIn((1 - p) * 2) / 2;
3733    };
3734  }
3735
3736  var ease = {
3737    easeIn: easeIn,
3738    easeOut: easeOut,
3739    easeInOut: easeInOut
3740  },
3741      lowercaseName;
3742
3743  _forEachName(names, function (name) {
3744    _easeMap[name] = _globals[name] = ease;
3745    _easeMap[lowercaseName = name.toLowerCase()] = easeOut;
3746
3747    for (var p in ease) {
3748      _easeMap[lowercaseName + (p === "easeIn" ? ".in" : p === "easeOut" ? ".out" : ".inOut")] = _easeMap[name + "." + p] = ease[p];
3749    }
3750  });
3751
3752  return ease;
3753},
3754    _easeInOutFromOut = function _easeInOutFromOut(easeOut) {
3755  return function (p) {
3756    return p < .5 ? (1 - easeOut(1 - p * 2)) / 2 : .5 + easeOut((p - .5) * 2) / 2;
3757  };
3758},
3759    _configElastic = function _configElastic(type, amplitude, period) {
3760  var p1 = amplitude >= 1 ? amplitude : 1,
3761      //note: if amplitude is < 1, we simply adjust the period for a more natural feel. Otherwise the math doesn't work right and the curve starts at 1.
3762  p2 = (period || (type ? .3 : .45)) / (amplitude < 1 ? amplitude : 1),
3763      p3 = p2 / _2PI * (Math.asin(1 / p1) || 0),
3764      easeOut = function easeOut(p) {
3765    return p === 1 ? 1 : p1 * Math.pow(2, -10 * p) * _sin((p - p3) * p2) + 1;
3766  },
3767      ease = type === "out" ? easeOut : type === "in" ? function (p) {
3768    return 1 - easeOut(1 - p);
3769  } : _easeInOutFromOut(easeOut);
3770
3771  p2 = _2PI / p2; //precalculate to optimize
3772
3773  ease.config = function (amplitude, period) {
3774    return _configElastic(type, amplitude, period);
3775  };
3776
3777  return ease;
3778},
3779    _configBack = function _configBack(type, overshoot) {
3780  if (overshoot === void 0) {
3781    overshoot = 1.70158;
3782  }
3783
3784  var easeOut = function easeOut(p) {
3785    return p ? --p * p * ((overshoot + 1) * p + overshoot) + 1 : 0;
3786  },
3787      ease = type === "out" ? easeOut : type === "in" ? function (p) {
3788    return 1 - easeOut(1 - p);
3789  } : _easeInOutFromOut(easeOut);
3790
3791  ease.config = function (overshoot) {
3792    return _configBack(type, overshoot);
3793  };
3794
3795  return ease;
3796}; // a cheaper (kb and cpu) but more mild way to get a parameterized weighted ease by feeding in a value between -1 (easeIn) and 1 (easeOut) where 0 is linear.
3797// _weightedEase = ratio => {
3798// 	let y = 0.5 + ratio / 2;
3799// 	return p => (2 * (1 - p) * p * y + p * p);
3800// },
3801// a stronger (but more expensive kb/cpu) parameterized weighted ease that lets you feed in a value between -1 (easeIn) and 1 (easeOut) where 0 is linear.
3802// _weightedEaseStrong = ratio => {
3803// 	ratio = .5 + ratio / 2;
3804// 	let o = 1 / 3 * (ratio < .5 ? ratio : 1 - ratio),
3805// 		b = ratio - o,
3806// 		c = ratio + o;
3807// 	return p => p === 1 ? p : 3 * b * (1 - p) * (1 - p) * p + 3 * c * (1 - p) * p * p + p * p * p;
3808// };
3809
3810
3811_forEachName("Linear,Quad,Cubic,Quart,Quint,Strong", function (name, i) {
3812  var power = i < 5 ? i + 1 : i;
3813
3814  _insertEase(name + ",Power" + (power - 1), i ? function (p) {
3815    return Math.pow(p, power);
3816  } : function (p) {
3817    return p;
3818  }, function (p) {
3819    return 1 - Math.pow(1 - p, power);
3820  }, function (p) {
3821    return p < .5 ? Math.pow(p * 2, power) / 2 : 1 - Math.pow((1 - p) * 2, power) / 2;
3822  });
3823});
3824
3825_easeMap.Linear.easeNone = _easeMap.none = _easeMap.Linear.easeIn;
3826
3827_insertEase("Elastic", _configElastic("in"), _configElastic("out"), _configElastic());
3828
3829(function (n, c) {
3830  var n1 = 1 / c,
3831      n2 = 2 * n1,
3832      n3 = 2.5 * n1,
3833      easeOut = function easeOut(p) {
3834    return p < n1 ? n * p * p : p < n2 ? n * Math.pow(p - 1.5 / c, 2) + .75 : p < n3 ? n * (p -= 2.25 / c) * p + .9375 : n * Math.pow(p - 2.625 / c, 2) + .984375;
3835  };
3836
3837  _insertEase("Bounce", function (p) {
3838    return 1 - easeOut(1 - p);
3839  }, easeOut);
3840})(7.5625, 2.75);
3841
3842_insertEase("Expo", function (p) {
3843  return p ? Math.pow(2, 10 * (p - 1)) : 0;
3844});
3845
3846_insertEase("Circ", function (p) {
3847  return -(_sqrt(1 - p * p) - 1);
3848});
3849
3850_insertEase("Sine", function (p) {
3851  return p === 1 ? 1 : -_cos(p * _HALF_PI) + 1;
3852});
3853
3854_insertEase("Back", _configBack("in"), _configBack("out"), _configBack());
3855
3856_easeMap.SteppedEase = _easeMap.steps = _globals.SteppedEase = {
3857  config: function config(steps, immediateStart) {
3858    if (steps === void 0) {
3859      steps = 1;
3860    }
3861
3862    var p1 = 1 / steps,
3863        p2 = steps + (immediateStart ? 0 : 1),
3864        p3 = immediateStart ? 1 : 0,
3865        max = 1 - _tinyNum;
3866    return function (p) {
3867      return ((p2 * _clamp(0, max, p) | 0) + p3) * p1;
3868    };
3869  }
3870};
3871_defaults.ease = _easeMap["quad.out"];
3872
3873_forEachName("onComplete,onUpdate,onStart,onRepeat,onReverseComplete,onInterrupt", function (name) {
3874  return _callbackNames += name + "," + name + "Params,";
3875});
3876/*
3877 * --------------------------------------------------------------------------------------
3878 * CACHE
3879 * --------------------------------------------------------------------------------------
3880 */
3881
3882
3883var GSCache = function GSCache(target, harness) {
3884  this.id = _gsID++;
3885  target._gsap = this;
3886  this.target = target;
3887  this.harness = harness;
3888  this.get = harness ? harness.get : _getProperty;
3889  this.set = harness ? harness.getSetter : _getSetter;
3890};
3891/*
3892 * --------------------------------------------------------------------------------------
3893 * ANIMATION
3894 * --------------------------------------------------------------------------------------
3895 */
3896
3897var Animation = /*#__PURE__*/function () {
3898  function Animation(vars, time) {
3899    var parent = vars.parent || _globalTimeline;
3900    this.vars = vars;
3901    this._delay = +vars.delay || 0;
3902
3903    if (this._repeat = vars.repeat === Infinity ? -2 : vars.repeat || 0) {
3904      // TODO: repeat: Infinity on a timeline's children must flag that timeline internally and affect its totalDuration, otherwise it'll stop in the negative direction when reaching the start.
3905      this._rDelay = vars.repeatDelay || 0;
3906      this._yoyo = !!vars.yoyo || !!vars.yoyoEase;
3907    }
3908
3909    this._ts = 1;
3910
3911    _setDuration(this, +vars.duration, 1, 1);
3912
3913    this.data = vars.data;
3914    _tickerActive || _ticker.wake();
3915    parent && _addToTimeline(parent, this, time || time === 0 ? time : parent._time, 1);
3916    vars.reversed && this.reverse();
3917    vars.paused && this.paused(true);
3918  }
3919
3920  var _proto = Animation.prototype;
3921
3922  _proto.delay = function delay(value) {
3923    if (value || value === 0) {
3924      this.parent && this.parent.smoothChildTiming && this.startTime(this._start + value - this._delay);
3925      this._delay = value;
3926      return this;
3927    }
3928
3929    return this._delay;
3930  };
3931
3932  _proto.duration = function duration(value) {
3933    return arguments.length ? this.totalDuration(this._repeat > 0 ? value + (value + this._rDelay) * this._repeat : value) : this.totalDuration() && this._dur;
3934  };
3935
3936  _proto.totalDuration = function totalDuration(value) {
3937    if (!arguments.length) {
3938      return this._tDur;
3939    }
3940
3941    this._dirty = 0;
3942    return _setDuration(this, this._repeat < 0 ? value : (value - this._repeat * this._rDelay) / (this._repeat + 1));
3943  };
3944
3945  _proto.totalTime = function totalTime(_totalTime, suppressEvents) {
3946    _wake();
3947
3948    if (!arguments.length) {
3949      return this._tTime;
3950    }
3951
3952    var parent = this._dp;
3953
3954    if (parent && parent.smoothChildTiming && this._ts) {
3955      _alignPlayhead(this, _totalTime);
3956
3957      !parent._dp || parent.parent || _postAddChecks(parent, this); // edge case: if this is a child of a timeline that already completed, for example, we must re-activate the parent.
3958      //in case any of the ancestor timelines had completed but should now be enabled, we should reset their totalTime() which will also ensure that they're lined up properly and enabled. Skip for animations that are on the root (wasteful). Example: a TimelineLite.exportRoot() is performed when there's a paused tween on the root, the export will not complete until that tween is unpaused, but imagine a child gets restarted later, after all [unpaused] tweens have completed. The start of that child would get pushed out, but one of the ancestors may have completed.
3959
3960      while (parent.parent) {
3961        if (parent.parent._time !== parent._start + (parent._ts >= 0 ? parent._tTime / parent._ts : (parent.totalDuration() - parent._tTime) / -parent._ts)) {
3962          parent.totalTime(parent._tTime, true);
3963        }
3964
3965        parent = parent.parent;
3966      }
3967
3968      if (!this.parent && this._dp.autoRemoveChildren && (this._ts > 0 && _totalTime < this._tDur || this._ts < 0 && _totalTime > 0 || !this._tDur && !_totalTime)) {
3969        //if the animation doesn't have a parent, put it back into its last parent (recorded as _dp for exactly cases like this). Limit to parents with autoRemoveChildren (like globalTimeline) so that if the user manually removes an animation from a timeline and then alters its playhead, it doesn't get added back in.
3970        _addToTimeline(this._dp, this, this._start - this._delay);
3971      }
3972    }
3973
3974    if (this._tTime !== _totalTime || !this._dur && !suppressEvents || this._initted && Math.abs(this._zTime) === _tinyNum || !_totalTime && !this._initted && (this.add || this._ptLookup)) {
3975      // check for _ptLookup on a Tween instance to ensure it has actually finished being instantiated, otherwise if this.reverse() gets called in the Animation constructor, it could trigger a render() here even though the _targets weren't populated, thus when _init() is called there won't be any PropTweens (it'll act like the tween is non-functional)
3976      this._ts || (this._pTime = _totalTime); // otherwise, if an animation is paused, then the playhead is moved back to zero, then resumed, it'd revert back to the original time at the pause
3977      //if (!this._lock) { // avoid endless recursion (not sure we need this yet or if it's worth the performance hit)
3978      //   this._lock = 1;
3979
3980      _lazySafeRender(this, _totalTime, suppressEvents); //   this._lock = 0;
3981      //}
3982
3983    }
3984
3985    return this;
3986  };
3987
3988  _proto.time = function time(value, suppressEvents) {
3989    return arguments.length ? this.totalTime(Math.min(this.totalDuration(), value + _elapsedCycleDuration(this)) % this._dur || (value ? this._dur : 0), suppressEvents) : this._time; // note: if the modulus results in 0, the playhead could be exactly at the end or the beginning, and we always defer to the END with a non-zero value, otherwise if you set the time() to the very end (duration()), it would render at the START!
3990  };
3991
3992  _proto.totalProgress = function totalProgress(value, suppressEvents) {
3993    return arguments.length ? this.totalTime(this.totalDuration() * value, suppressEvents) : this.totalDuration() ? Math.min(1, this._tTime / this._tDur) : this.ratio;
3994  };
3995
3996  _proto.progress = function progress(value, suppressEvents) {
3997    return arguments.length ? this.totalTime(this.duration() * (this._yoyo && !(this.iteration() & 1) ? 1 - value : value) + _elapsedCycleDuration(this), suppressEvents) : this.duration() ? Math.min(1, this._time / this._dur) : this.ratio;
3998  };
3999
4000  _proto.iteration = function iteration(value, suppressEvents) {
4001    var cycleDuration = this.duration() + this._rDelay;
4002
4003    return arguments.length ? this.totalTime(this._time + (value - 1) * cycleDuration, suppressEvents) : this._repeat ? _animationCycle(this._tTime, cycleDuration) + 1 : 1;
4004  } // potential future addition:
4005  // isPlayingBackwards() {
4006  // 	let animation = this,
4007  // 		orientation = 1; // 1 = forward, -1 = backward
4008  // 	while (animation) {
4009  // 		orientation *= animation.reversed() || (animation.repeat() && !(animation.iteration() & 1)) ? -1 : 1;
4010  // 		animation = animation.parent;
4011  // 	}
4012  // 	return orientation < 0;
4013  // }
4014  ;
4015
4016  _proto.timeScale = function timeScale(value) {
4017    if (!arguments.length) {
4018      return this._rts === -_tinyNum ? 0 : this._rts; // recorded timeScale. Special case: if someone calls reverse() on an animation with timeScale of 0, we assign it -_tinyNum to remember it's reversed.
4019    }
4020
4021    if (this._rts === value) {
4022      return this;
4023    }
4024
4025    var tTime = this.parent && this._ts ? _parentToChildTotalTime(this.parent._time, this) : this._tTime; // make sure to do the parentToChildTotalTime() BEFORE setting the new _ts because the old one must be used in that calculation.
4026    // prioritize rendering where the parent's playhead lines up instead of this._tTime because there could be a tween that's animating another tween's timeScale in the same rendering loop (same parent), thus if the timeScale tween renders first, it would alter _start BEFORE _tTime was set on that tick (in the rendering loop), effectively freezing it until the timeScale tween finishes.
4027
4028    this._rts = +value || 0;
4029    this._ts = this._ps || value === -_tinyNum ? 0 : this._rts; // _ts is the functional timeScale which would be 0 if the animation is paused.
4030
4031    return _recacheAncestors(this.totalTime(_clamp(-this._delay, this._tDur, tTime), true));
4032  };
4033
4034  _proto.paused = function paused(value) {
4035    if (!arguments.length) {
4036      return this._ps;
4037    }
4038
4039    if (this._ps !== value) {
4040      this._ps = value;
4041
4042      if (value) {
4043        this._pTime = this._tTime || Math.max(-this._delay, this.rawTime()); // if the pause occurs during the delay phase, make sure that's factored in when resuming.
4044
4045        this._ts = this._act = 0; // _ts is the functional timeScale, so a paused tween would effectively have a timeScale of 0. We record the "real" timeScale as _rts (recorded time scale)
4046      } else {
4047        _wake();
4048
4049        this._ts = this._rts; //only defer to _pTime (pauseTime) if tTime is zero. Remember, someone could pause() an animation, then scrub the playhead and resume(). If the parent doesn't have smoothChildTiming, we render at the rawTime() because the startTime won't get updated.
4050
4051        this.totalTime(this.parent && !this.parent.smoothChildTiming ? this.rawTime() : this._tTime || this._pTime, this.progress() === 1 && (this._tTime -= _tinyNum) && Math.abs(this._zTime) !== _tinyNum); // edge case: animation.progress(1).pause().play() wouldn't render again because the playhead is already at the end, but the call to totalTime() below will add it back to its parent...and not remove it again (since removing only happens upon rendering at a new time). Offsetting the _tTime slightly is done simply to cause the final render in totalTime() that'll pop it off its timeline (if autoRemoveChildren is true, of course). Check to make sure _zTime isn't -_tinyNum to avoid an edge case where the playhead is pushed to the end but INSIDE a tween/callback, the timeline itself is paused thus halting rendering and leaving a few unrendered. When resuming, it wouldn't render those otherwise.
4052      }
4053    }
4054
4055    return this;
4056  };
4057
4058  _proto.startTime = function startTime(value) {
4059    if (arguments.length) {
4060      this._start = value;
4061      var parent = this.parent || this._dp;
4062      parent && (parent._sort || !this.parent) && _addToTimeline(parent, this, value - this._delay);
4063      return this;
4064    }
4065
4066    return this._start;
4067  };
4068
4069  _proto.endTime = function endTime(includeRepeats) {
4070    return this._start + (_isNotFalse(includeRepeats) ? this.totalDuration() : this.duration()) / Math.abs(this._ts);
4071  };
4072
4073  _proto.rawTime = function rawTime(wrapRepeats) {
4074    var parent = this.parent || this._dp; // _dp = detatched parent
4075
4076    return !parent ? this._tTime : wrapRepeats && (!this._ts || this._repeat && this._time && this.totalProgress() < 1) ? this._tTime % (this._dur + this._rDelay) : !this._ts ? this._tTime : _parentToChildTotalTime(parent.rawTime(wrapRepeats), this);
4077  };
4078
4079  _proto.globalTime = function globalTime(rawTime) {
4080    var animation = this,
4081        time = arguments.length ? rawTime : animation.rawTime();
4082
4083    while (animation) {
4084      time = animation._start + time / (animation._ts || 1);
4085      animation = animation._dp;
4086    }
4087
4088    return time;
4089  };
4090
4091  _proto.repeat = function repeat(value) {
4092    if (arguments.length) {
4093      this._repeat = value === Infinity ? -2 : value;
4094      return _onUpdateTotalDuration(this);
4095    }
4096
4097    return this._repeat === -2 ? Infinity : this._repeat;
4098  };
4099
4100  _proto.repeatDelay = function repeatDelay(value) {
4101    if (arguments.length) {
4102      this._rDelay = value;
4103      return _onUpdateTotalDuration(this);
4104    }
4105
4106    return this._rDelay;
4107  };
4108
4109  _proto.yoyo = function yoyo(value) {
4110    if (arguments.length) {
4111      this._yoyo = value;
4112      return this;
4113    }
4114
4115    return this._yoyo;
4116  };
4117
4118  _proto.seek = function seek(position, suppressEvents) {
4119    return this.totalTime(_parsePosition(this, position), _isNotFalse(suppressEvents));
4120  };
4121
4122  _proto.restart = function restart(includeDelay, suppressEvents) {
4123    return this.play().totalTime(includeDelay ? -this._delay : 0, _isNotFalse(suppressEvents));
4124  };
4125
4126  _proto.play = function play(from, suppressEvents) {
4127    from != null && this.seek(from, suppressEvents);
4128    return this.reversed(false).paused(false);
4129  };
4130
4131  _proto.reverse = function reverse(from, suppressEvents) {
4132    from != null && this.seek(from || this.totalDuration(), suppressEvents);
4133    return this.reversed(true).paused(false);
4134  };
4135
4136  _proto.pause = function pause(atTime, suppressEvents) {
4137    atTime != null && this.seek(atTime, suppressEvents);
4138    return this.paused(true);
4139  };
4140
4141  _proto.resume = function resume() {
4142    return this.paused(false);
4143  };
4144
4145  _proto.reversed = function reversed(value) {
4146    if (arguments.length) {
4147      !!value !== this.reversed() && this.timeScale(-this._rts || (value ? -_tinyNum : 0)); // in case timeScale is zero, reversing would have no effect so we use _tinyNum.
4148
4149      return this;
4150    }
4151
4152    return this._rts < 0;
4153  };
4154
4155  _proto.invalidate = function invalidate() {
4156    this._initted = this._act = 0;
4157    this._zTime = -_tinyNum;
4158    return this;
4159  };
4160
4161  _proto.isActive = function isActive() {
4162    var parent = this.parent || this._dp,
4163        start = this._start,
4164        rawTime;
4165    return !!(!parent || this._ts && this._initted && parent.isActive() && (rawTime = parent.rawTime(true)) >= start && rawTime < this.endTime(true) - _tinyNum);
4166  };
4167
4168  _proto.eventCallback = function eventCallback(type, callback, params) {
4169    var vars = this.vars;
4170
4171    if (arguments.length > 1) {
4172      if (!callback) {
4173        delete vars[type];
4174      } else {
4175        vars[type] = callback;
4176        params && (vars[type + "Params"] = params);
4177        type === "onUpdate" && (this._onUpdate = callback);
4178      }
4179
4180      return this;
4181    }
4182
4183    return vars[type];
4184  };
4185
4186  _proto.then = function then(onFulfilled) {
4187    var self = this;
4188    return new Promise(function (resolve) {
4189      var f = _isFunction(onFulfilled) ? onFulfilled : _passThrough,
4190          _resolve = function _resolve() {
4191        var _then = self.then;
4192        self.then = null; // temporarily null the then() method to avoid an infinite loop (see https://github.com/greensock/GSAP/issues/322)
4193
4194        _isFunction(f) && (f = f(self)) && (f.then || f === self) && (self.then = _then);
4195        resolve(f);
4196        self.then = _then;
4197      };
4198
4199      if (self._initted && self.totalProgress() === 1 && self._ts >= 0 || !self._tTime && self._ts < 0) {
4200        _resolve();
4201      } else {
4202        self._prom = _resolve;
4203      }
4204    });
4205  };
4206
4207  _proto.kill = function kill() {
4208    _interrupt(this);
4209  };
4210
4211  return Animation;
4212}();
4213
4214_setDefaults(Animation.prototype, {
4215  _time: 0,
4216  _start: 0,
4217  _end: 0,
4218  _tTime: 0,
4219  _tDur: 0,
4220  _dirty: 0,
4221  _repeat: 0,
4222  _yoyo: false,
4223  parent: null,
4224  _initted: false,
4225  _rDelay: 0,
4226  _ts: 1,
4227  _dp: 0,
4228  ratio: 0,
4229  _zTime: -_tinyNum,
4230  _prom: 0,
4231  _ps: false,
4232  _rts: 1
4233});
4234/*
4235 * -------------------------------------------------
4236 * TIMELINE
4237 * -------------------------------------------------
4238 */
4239
4240
4241var Timeline = /*#__PURE__*/function (_Animation) {
4242  _inheritsLoose(Timeline, _Animation);
4243
4244  function Timeline(vars, time) {
4245    var _this;
4246
4247    if (vars === void 0) {
4248      vars = {};
4249    }
4250
4251    _this = _Animation.call(this, vars, time) || this;
4252    _this.labels = {};
4253    _this.smoothChildTiming = !!vars.smoothChildTiming;
4254    _this.autoRemoveChildren = !!vars.autoRemoveChildren;
4255    _this._sort = _isNotFalse(vars.sortChildren);
4256    _this.parent && _postAddChecks(_this.parent, _assertThisInitialized(_this));
4257    vars.scrollTrigger && _scrollTrigger(_assertThisInitialized(_this), vars.scrollTrigger);
4258    return _this;
4259  }
4260
4261  var _proto2 = Timeline.prototype;
4262
4263  _proto2.to = function to(targets, vars, position) {
4264    new Tween(targets, _parseVars(arguments, 0, this), _parsePosition(this, _isNumber(vars) ? arguments[3] : position));
4265    return this;
4266  };
4267
4268  _proto2.from = function from(targets, vars, position) {
4269    new Tween(targets, _parseVars(arguments, 1, this), _parsePosition(this, _isNumber(vars) ? arguments[3] : position));
4270    return this;
4271  };
4272
4273  _proto2.fromTo = function fromTo(targets, fromVars, toVars, position) {
4274    new Tween(targets, _parseVars(arguments, 2, this), _parsePosition(this, _isNumber(fromVars) ? arguments[4] : position));
4275    return this;
4276  };
4277
4278  _proto2.set = function set(targets, vars, position) {
4279    vars.duration = 0;
4280    vars.parent = this;
4281    _inheritDefaults(vars).repeatDelay || (vars.repeat = 0);
4282    vars.immediateRender = !!vars.immediateRender;
4283    new Tween(targets, vars, _parsePosition(this, position), 1);
4284    return this;
4285  };
4286
4287  _proto2.call = function call(callback, params, position) {
4288    return _addToTimeline(this, Tween.delayedCall(0, callback, params), _parsePosition(this, position));
4289  } //ONLY for backward compatibility! Maybe delete?
4290  ;
4291
4292  _proto2.staggerTo = function staggerTo(targets, duration, vars, stagger, position, onCompleteAll, onCompleteAllParams) {
4293    vars.duration = duration;
4294    vars.stagger = vars.stagger || stagger;
4295    vars.onComplete = onCompleteAll;
4296    vars.onCompleteParams = onCompleteAllParams;
4297    vars.parent = this;
4298    new Tween(targets, vars, _parsePosition(this, position));
4299    return this;
4300  };
4301
4302  _proto2.staggerFrom = function staggerFrom(targets, duration, vars, stagger, position, onCompleteAll, onCompleteAllParams) {
4303    vars.runBackwards = 1;
4304    _inheritDefaults(vars).immediateRender = _isNotFalse(vars.immediateRender);
4305    return this.staggerTo(targets, duration, vars, stagger, position, onCompleteAll, onCompleteAllParams);
4306  };
4307
4308  _proto2.staggerFromTo = function staggerFromTo(targets, duration, fromVars, toVars, stagger, position, onCompleteAll, onCompleteAllParams) {
4309    toVars.startAt = fromVars;
4310    _inheritDefaults(toVars).immediateRender = _isNotFalse(toVars.immediateRender);
4311    return this.staggerTo(targets, duration, toVars, stagger, position, onCompleteAll, onCompleteAllParams);
4312  };
4313
4314  _proto2.render = function render(totalTime, suppressEvents, force) {
4315    var prevTime = this._time,
4316        tDur = this._dirty ? this.totalDuration() : this._tDur,
4317        dur = this._dur,
4318        tTime = this !== _globalTimeline && totalTime > tDur - _tinyNum && totalTime >= 0 ? tDur : totalTime < _tinyNum ? 0 : totalTime,
4319        crossingStart = this._zTime < 0 !== totalTime < 0 && (this._initted || !dur),
4320        time,
4321        child,
4322        next,
4323        iteration,
4324        cycleDuration,
4325        prevPaused,
4326        pauseTween,
4327        timeScale,
4328        prevStart,
4329        prevIteration,
4330        yoyo,
4331        isYoyo;
4332
4333    if (tTime !== this._tTime || force || crossingStart) {
4334      if (prevTime !== this._time && dur) {
4335        //if totalDuration() finds a child with a negative startTime and smoothChildTiming is true, things get shifted around internally so we need to adjust the time accordingly. For example, if a tween starts at -30 we must shift EVERYTHING forward 30 seconds and move this timeline's startTime backward by 30 seconds so that things align with the playhead (no jump).
4336        tTime += this._time - prevTime;
4337        totalTime += this._time - prevTime;
4338      }
4339
4340      time = tTime;
4341      prevStart = this._start;
4342      timeScale = this._ts;
4343      prevPaused = !timeScale;
4344
4345      if (crossingStart) {
4346        dur || (prevTime = this._zTime); //when the playhead arrives at EXACTLY time 0 (right on top) of a zero-duration timeline, we need to discern if events are suppressed so that when the playhead moves again (next time), it'll trigger the callback. If events are NOT suppressed, obviously the callback would be triggered in this render. Basically, the callback should fire either when the playhead ARRIVES or LEAVES this exact spot, not both. Imagine doing a timeline.seek(0) and there's a callback that sits at 0. Since events are suppressed on that seek() by default, nothing will fire, but when the playhead moves off of that position, the callback should fire. This behavior is what people intuitively expect.
4347
4348        (totalTime || !suppressEvents) && (this._zTime = totalTime);
4349      }
4350
4351      if (this._repeat) {
4352        //adjust the time for repeats and yoyos
4353        yoyo = this._yoyo;
4354        cycleDuration = dur + this._rDelay;
4355
4356        if (this._repeat < -1 && totalTime < 0) {
4357          return this.totalTime(cycleDuration * 100 + totalTime, suppressEvents, force);
4358        }
4359
4360        time = _round(tTime % cycleDuration); //round to avoid floating point errors. (4 % 0.8 should be 0 but some browsers report it as 0.79999999!)
4361
4362        if (tTime === tDur) {
4363          // the tDur === tTime is for edge cases where there's a lengthy decimal on the duration and it may reach the very end but the time is rendered as not-quite-there (remember, tDur is rounded to 4 decimals whereas dur isn't)
4364          iteration = this._repeat;
4365          time = dur;
4366        } else {
4367          iteration = ~~(tTime / cycleDuration);
4368
4369          if (iteration && iteration === tTime / cycleDuration) {
4370            time = dur;
4371            iteration--;
4372          }
4373
4374          time > dur && (time = dur);
4375        }
4376
4377        prevIteration = _animationCycle(this._tTime, cycleDuration);
4378        !prevTime && this._tTime && prevIteration !== iteration && (prevIteration = iteration); // edge case - if someone does addPause() at the very beginning of a repeating timeline, that pause is technically at the same spot as the end which causes this._time to get set to 0 when the totalTime would normally place the playhead at the end. See https://greensock.com/forums/topic/23823-closing-nav-animation-not-working-on-ie-and-iphone-6-maybe-other-older-browser/?tab=comments#comment-113005
4379
4380        if (yoyo && iteration & 1) {
4381          time = dur - time;
4382          isYoyo = 1;
4383        }
4384        /*
4385        make sure children at the end/beginning of the timeline are rendered properly. If, for example,
4386        a 3-second long timeline rendered at 2.9 seconds previously, and now renders at 3.2 seconds (which
4387        would get translated to 2.8 seconds if the timeline yoyos or 0.2 seconds if it just repeats), there
4388        could be a callback or a short tween that's at 2.95 or 3 seconds in which wouldn't render. So
4389        we need to push the timeline to the end (and/or beginning depending on its yoyo value). Also we must
4390        ensure that zero-duration tweens at the very beginning or end of the Timeline work.
4391        */
4392
4393
4394        if (iteration !== prevIteration && !this._lock) {
4395          var rewinding = yoyo && prevIteration & 1,
4396              doesWrap = rewinding === (yoyo && iteration & 1);
4397          iteration < prevIteration && (rewinding = !rewinding);
4398          prevTime = rewinding ? 0 : dur;
4399          this._lock = 1;
4400          this.render(prevTime || (isYoyo ? 0 : _round(iteration * cycleDuration)), suppressEvents, !dur)._lock = 0;
4401          !suppressEvents && this.parent && _callback(this, "onRepeat");
4402          this.vars.repeatRefresh && !isYoyo && (this.invalidate()._lock = 1);
4403
4404          if (prevTime && prevTime !== this._time || prevPaused !== !this._ts || this.vars.onRepeat && !this.parent && !this._act) {
4405            // if prevTime is 0 and we render at the very end, _time will be the end, thus won't match. So in this edge case, prevTime won't match _time but that's okay. If it gets killed in the onRepeat, eject as well.
4406            return this;
4407          }
4408
4409          dur = this._dur; // in case the duration changed in the onRepeat
4410
4411          tDur = this._tDur;
4412
4413          if (doesWrap) {
4414            this._lock = 2;
4415            prevTime = rewinding ? dur : -0.0001;
4416            this.render(prevTime, true);
4417          }
4418
4419          this._lock = 0;
4420
4421          if (!this._ts && !prevPaused) {
4422            return this;
4423          } //in order for yoyoEase to work properly when there's a stagger, we must swap out the ease in each sub-tween.
4424
4425
4426          _propagateYoyoEase(this, isYoyo);
4427        }
4428      }
4429
4430      if (this._hasPause && !this._forcing && this._lock < 2) {
4431        pauseTween = _findNextPauseTween(this, _round(prevTime), _round(time));
4432
4433        if (pauseTween) {
4434          tTime -= time - (time = pauseTween._start);
4435        }
4436      }
4437
4438      this._tTime = tTime;
4439      this._time = time;
4440      this._act = !timeScale; //as long as it's not paused, force it to be active so that if the user renders independent of the parent timeline, it'll be forced to re-render on the next tick.
4441
4442      if (!this._initted) {
4443        this._onUpdate = this.vars.onUpdate;
4444        this._initted = 1;
4445        this._zTime = totalTime;
4446        prevTime = 0; // upon init, the playhead should always go forward; someone could invalidate() a completed timeline and then if they restart(), that would make child tweens render in reverse order which could lock in the wrong starting values if they build on each other, like tl.to(obj, {x: 100}).to(obj, {x: 0}).
4447      }
4448
4449      !prevTime && time && !suppressEvents && _callback(this, "onStart");
4450
4451      if (time >= prevTime && totalTime >= 0) {
4452        child = this._first;
4453
4454        while (child) {
4455          next = child._next;
4456
4457          if ((child._act || time >= child._start) && child._ts && pauseTween !== child) {
4458            if (child.parent !== this) {
4459              // an extreme edge case - the child's render could do something like kill() the "next" one in the linked list, or reparent it. In that case we must re-initiate the whole render to be safe.
4460              return this.render(totalTime, suppressEvents, force);
4461            }
4462
4463            child.render(child._ts > 0 ? (time - child._start) * child._ts : (child._dirty ? child.totalDuration() : child._tDur) + (time - child._start) * child._ts, suppressEvents, force);
4464
4465            if (time !== this._time || !this._ts && !prevPaused) {
4466              //in case a tween pauses or seeks the timeline when rendering, like inside of an onUpdate/onComplete
4467              pauseTween = 0;
4468              next && (tTime += this._zTime = -_tinyNum); // it didn't finish rendering, so flag zTime as negative so that so that the next time render() is called it'll be forced (to render any remaining children)
4469
4470              break;
4471            }
4472          }
4473
4474          child = next;
4475        }
4476      } else {
4477        child = this._last;
4478        var adjustedTime = totalTime < 0 ? totalTime : time; //when the playhead goes backward beyond the start of this timeline, we must pass that information down to the child animations so that zero-duration tweens know whether to render their starting or ending values.
4479
4480        while (child) {
4481          next = child._prev;
4482
4483          if ((child._act || adjustedTime <= child._end) && child._ts && pauseTween !== child) {
4484            if (child.parent !== this) {
4485              // an extreme edge case - the child's render could do something like kill() the "next" one in the linked list, or reparent it. In that case we must re-initiate the whole render to be safe.
4486              return this.render(totalTime, suppressEvents, force);
4487            }
4488
4489            child.render(child._ts > 0 ? (adjustedTime - child._start) * child._ts : (child._dirty ? child.totalDuration() : child._tDur) + (adjustedTime - child._start) * child._ts, suppressEvents, force);
4490
4491            if (time !== this._time || !this._ts && !prevPaused) {
4492              //in case a tween pauses or seeks the timeline when rendering, like inside of an onUpdate/onComplete
4493              pauseTween = 0;
4494              next && (tTime += this._zTime = adjustedTime ? -_tinyNum : _tinyNum); // it didn't finish rendering, so adjust zTime so that so that the next time render() is called it'll be forced (to render any remaining children)
4495
4496              break;
4497            }
4498          }
4499
4500          child = next;
4501        }
4502      }
4503
4504      if (pauseTween && !suppressEvents) {
4505        this.pause();
4506        pauseTween.render(time >= prevTime ? 0 : -_tinyNum)._zTime = time >= prevTime ? 1 : -1;
4507
4508        if (this._ts) {
4509          //the callback resumed playback! So since we may have held back the playhead due to where the pause is positioned, go ahead and jump to where it's SUPPOSED to be (if no pause happened).
4510          this._start = prevStart; //if the pause was at an earlier time and the user resumed in the callback, it could reposition the timeline (changing its startTime), throwing things off slightly, so we make sure the _start doesn't shift.
4511
4512          _setEnd(this);
4513
4514          return this.render(totalTime, suppressEvents, force);
4515        }
4516      }
4517
4518      this._onUpdate && !suppressEvents && _callback(this, "onUpdate", true);
4519      if (tTime === tDur && tDur >= this.totalDuration() || !tTime && prevTime) if (prevStart === this._start || Math.abs(timeScale) !== Math.abs(this._ts)) if (!this._lock) {
4520        (totalTime || !dur) && (tTime === tDur && this._ts > 0 || !tTime && this._ts < 0) && _removeFromParent(this, 1); // don't remove if the timeline is reversed and the playhead isn't at 0, otherwise tl.progress(1).reverse() won't work. Only remove if the playhead is at the end and timeScale is positive, or if the playhead is at 0 and the timeScale is negative.
4521
4522        if (!suppressEvents && !(totalTime < 0 && !prevTime) && (tTime || prevTime)) {
4523          _callback(this, tTime === tDur ? "onComplete" : "onReverseComplete", true);
4524
4525          this._prom && !(tTime < tDur && this.timeScale() > 0) && this._prom();
4526        }
4527      }
4528    }
4529
4530    return this;
4531  };
4532
4533  _proto2.add = function add(child, position) {
4534    var _this2 = this;
4535
4536    _isNumber(position) || (position = _parsePosition(this, position));
4537
4538    if (!(child instanceof Animation)) {
4539      if (_isArray(child)) {
4540        child.forEach(function (obj) {
4541          return _this2.add(obj, position);
4542        });
4543        return this;
4544      }
4545
4546      if (_isString(child)) {
4547        return this.addLabel(child, position);
4548      }
4549
4550      if (_isFunction(child)) {
4551        child = Tween.delayedCall(0, child);
4552      } else {
4553        return this;
4554      }
4555    }
4556
4557    return this !== child ? _addToTimeline(this, child, position) : this; //don't allow a timeline to be added to itself as a child!
4558  };
4559
4560  _proto2.getChildren = function getChildren(nested, tweens, timelines, ignoreBeforeTime) {
4561    if (nested === void 0) {
4562      nested = true;
4563    }
4564
4565    if (tweens === void 0) {
4566      tweens = true;
4567    }
4568
4569    if (timelines === void 0) {
4570      timelines = true;
4571    }
4572
4573    if (ignoreBeforeTime === void 0) {
4574      ignoreBeforeTime = -_bigNum;
4575    }
4576
4577    var a = [],
4578        child = this._first;
4579
4580    while (child) {
4581      if (child._start >= ignoreBeforeTime) {
4582        if (child instanceof Tween) {
4583          tweens && a.push(child);
4584        } else {
4585          timelines && a.push(child);
4586          nested && a.push.apply(a, child.getChildren(true, tweens, timelines));
4587        }
4588      }
4589
4590      child = child._next;
4591    }
4592
4593    return a;
4594  };
4595
4596  _proto2.getById = function getById(id) {
4597    var animations = this.getChildren(1, 1, 1),
4598        i = animations.length;
4599
4600    while (i--) {
4601      if (animations[i].vars.id === id) {
4602        return animations[i];
4603      }
4604    }
4605  };
4606
4607  _proto2.remove = function remove(child) {
4608    if (_isString(child)) {
4609      return this.removeLabel(child);
4610    }
4611
4612    if (_isFunction(child)) {
4613      return this.killTweensOf(child);
4614    }
4615
4616    _removeLinkedListItem(this, child);
4617
4618    if (child === this._recent) {
4619      this._recent = this._last;
4620    }
4621
4622    return _uncache(this);
4623  };
4624
4625  _proto2.totalTime = function totalTime(_totalTime2, suppressEvents) {
4626    if (!arguments.length) {
4627      return this._tTime;
4628    }
4629
4630    this._forcing = 1;
4631
4632    if (!this._dp && this._ts) {
4633      //special case for the global timeline (or any other that has no parent or detached parent).
4634      this._start = _round(_ticker.time - (this._ts > 0 ? _totalTime2 / this._ts : (this.totalDuration() - _totalTime2) / -this._ts));
4635    }
4636
4637    _Animation.prototype.totalTime.call(this, _totalTime2, suppressEvents);
4638
4639    this._forcing = 0;
4640    return this;
4641  };
4642
4643  _proto2.addLabel = function addLabel(label, position) {
4644    this.labels[label] = _parsePosition(this, position);
4645    return this;
4646  };
4647
4648  _proto2.removeLabel = function removeLabel(label) {
4649    delete this.labels[label];
4650    return this;
4651  };
4652
4653  _proto2.addPause = function addPause(position, callback, params) {
4654    var t = Tween.delayedCall(0, callback || _emptyFunc, params);
4655    t.data = "isPause";
4656    this._hasPause = 1;
4657    return _addToTimeline(this, t, _parsePosition(this, position));
4658  };
4659
4660  _proto2.removePause = function removePause(position) {
4661    var child = this._first;
4662    position = _parsePosition(this, position);
4663
4664    while (child) {
4665      if (child._start === position && child.data === "isPause") {
4666        _removeFromParent(child);
4667      }
4668
4669      child = child._next;
4670    }
4671  };
4672
4673  _proto2.killTweensOf = function killTweensOf(targets, props, onlyActive) {
4674    var tweens = this.getTweensOf(targets, onlyActive),
4675        i = tweens.length;
4676
4677    while (i--) {
4678      _overwritingTween !== tweens[i] && tweens[i].kill(targets, props);
4679    }
4680
4681    return this;
4682  };
4683
4684  _proto2.getTweensOf = function getTweensOf(targets, onlyActive) {
4685    var a = [],
4686        parsedTargets = toArray(targets),
4687        child = this._first,
4688        isGlobalTime = _isNumber(onlyActive),
4689        // a number is interpreted as a global time. If the animation spans
4690    children;
4691
4692    while (child) {
4693      if (child instanceof Tween) {
4694        if (_arrayContainsAny(child._targets, parsedTargets) && (isGlobalTime ? (!_overwritingTween || child._initted && child._ts) && child.globalTime(0) <= onlyActive && child.globalTime(child.totalDuration()) > onlyActive : !onlyActive || child.isActive())) {
4695          // note: if this is for overwriting, it should only be for tweens that aren't paused and are initted.
4696          a.push(child);
4697        }
4698      } else if ((children = child.getTweensOf(parsedTargets, onlyActive)).length) {
4699        a.push.apply(a, children);
4700      }
4701
4702      child = child._next;
4703    }
4704
4705    return a;
4706  } // potential future feature - targets() on timelines
4707  // targets() {
4708  // 	let result = [];
4709  // 	this.getChildren(true, true, false).forEach(t => result.push(...t.targets()));
4710  // 	return result;
4711  // }
4712  ;
4713
4714  _proto2.tweenTo = function tweenTo(position, vars) {
4715    vars = vars || {};
4716
4717    var tl = this,
4718        endTime = _parsePosition(tl, position),
4719        _vars = vars,
4720        startAt = _vars.startAt,
4721        _onStart = _vars.onStart,
4722        onStartParams = _vars.onStartParams,
4723        immediateRender = _vars.immediateRender,
4724        tween = Tween.to(tl, _setDefaults({
4725      ease: vars.ease || "none",
4726      lazy: false,
4727      immediateRender: false,
4728      time: endTime,
4729      overwrite: "auto",
4730      duration: vars.duration || Math.abs((endTime - (startAt && "time" in startAt ? startAt.time : tl._time)) / tl.timeScale()) || _tinyNum,
4731      onStart: function onStart() {
4732        tl.pause();
4733        var duration = vars.duration || Math.abs((endTime - tl._time) / tl.timeScale());
4734        tween._dur !== duration && _setDuration(tween, duration, 0, 1).render(tween._time, true, true);
4735        _onStart && _onStart.apply(tween, onStartParams || []); //in case the user had an onStart in the vars - we don't want to overwrite it.
4736      }
4737    }, vars));
4738
4739    return immediateRender ? tween.render(0) : tween;
4740  };
4741
4742  _proto2.tweenFromTo = function tweenFromTo(fromPosition, toPosition, vars) {
4743    return this.tweenTo(toPosition, _setDefaults({
4744      startAt: {
4745        time: _parsePosition(this, fromPosition)
4746      }
4747    }, vars));
4748  };
4749
4750  _proto2.recent = function recent() {
4751    return this._recent;
4752  };
4753
4754  _proto2.nextLabel = function nextLabel(afterTime) {
4755    if (afterTime === void 0) {
4756      afterTime = this._time;
4757    }
4758
4759    return _getLabelInDirection(this, _parsePosition(this, afterTime));
4760  };
4761
4762  _proto2.previousLabel = function previousLabel(beforeTime) {
4763    if (beforeTime === void 0) {
4764      beforeTime = this._time;
4765    }
4766
4767    return _getLabelInDirection(this, _parsePosition(this, beforeTime), 1);
4768  };
4769
4770  _proto2.currentLabel = function currentLabel(value) {
4771    return arguments.length ? this.seek(value, true) : this.previousLabel(this._time + _tinyNum);
4772  };
4773
4774  _proto2.shiftChildren = function shiftChildren(amount, adjustLabels, ignoreBeforeTime) {
4775    if (ignoreBeforeTime === void 0) {
4776      ignoreBeforeTime = 0;
4777    }
4778
4779    var child = this._first,
4780        labels = this.labels,
4781        p;
4782
4783    while (child) {
4784      if (child._start >= ignoreBeforeTime) {
4785        child._start += amount;
4786        child._end += amount;
4787      }
4788
4789      child = child._next;
4790    }
4791
4792    if (adjustLabels) {
4793      for (p in labels) {
4794        if (labels[p] >= ignoreBeforeTime) {
4795          labels[p] += amount;
4796        }
4797      }
4798    }
4799
4800    return _uncache(this);
4801  };
4802
4803  _proto2.invalidate = function invalidate() {
4804    var child = this._first;
4805    this._lock = 0;
4806
4807    while (child) {
4808      child.invalidate();
4809      child = child._next;
4810    }
4811
4812    return _Animation.prototype.invalidate.call(this);
4813  };
4814
4815  _proto2.clear = function clear(includeLabels) {
4816    if (includeLabels === void 0) {
4817      includeLabels = true;
4818    }
4819
4820    var child = this._first,
4821        next;
4822
4823    while (child) {
4824      next = child._next;
4825      this.remove(child);
4826      child = next;
4827    }
4828
4829    this._dp && (this._time = this._tTime = this._pTime = 0);
4830    includeLabels && (this.labels = {});
4831    return _uncache(this);
4832  };
4833
4834  _proto2.totalDuration = function totalDuration(value) {
4835    var max = 0,
4836        self = this,
4837        child = self._last,
4838        prevStart = _bigNum,
4839        prev,
4840        start,
4841        parent;
4842
4843    if (arguments.length) {
4844      return self.timeScale((self._repeat < 0 ? self.duration() : self.totalDuration()) / (self.reversed() ? -value : value));
4845    }
4846
4847    if (self._dirty) {
4848      parent = self.parent;
4849
4850      while (child) {
4851        prev = child._prev; //record it here in case the tween changes position in the sequence...
4852
4853        child._dirty && child.totalDuration(); //could change the tween._startTime, so make sure the animation's cache is clean before analyzing it.
4854
4855        start = child._start;
4856
4857        if (start > prevStart && self._sort && child._ts && !self._lock) {
4858          //in case one of the tweens shifted out of order, it needs to be re-inserted into the correct position in the sequence
4859          self._lock = 1; //prevent endless recursive calls - there are methods that get triggered that check duration/totalDuration when we add().
4860
4861          _addToTimeline(self, child, start - child._delay, 1)._lock = 0;
4862        } else {
4863          prevStart = start;
4864        }
4865
4866        if (start < 0 && child._ts) {
4867          //children aren't allowed to have negative startTimes unless smoothChildTiming is true, so adjust here if one is found.
4868          max -= start;
4869
4870          if (!parent && !self._dp || parent && parent.smoothChildTiming) {
4871            self._start += start / self._ts;
4872            self._time -= start;
4873            self._tTime -= start;
4874          }
4875
4876          self.shiftChildren(-start, false, -1e999);
4877          prevStart = 0;
4878        }
4879
4880        child._end > max && child._ts && (max = child._end);
4881        child = prev;
4882      }
4883
4884      _setDuration(self, self === _globalTimeline && self._time > max ? self._time : max, 1, 1);
4885
4886      self._dirty = 0;
4887    }
4888
4889    return self._tDur;
4890  };
4891
4892  Timeline.updateRoot = function updateRoot(time) {
4893    if (_globalTimeline._ts) {
4894      _lazySafeRender(_globalTimeline, _parentToChildTotalTime(time, _globalTimeline));
4895
4896      _lastRenderedFrame = _ticker.frame;
4897    }
4898
4899    if (_ticker.frame >= _nextGCFrame) {
4900      _nextGCFrame += _config.autoSleep || 120;
4901      var child = _globalTimeline._first;
4902      if (!child || !child._ts) if (_config.autoSleep && _ticker._listeners.length < 2) {
4903        while (child && !child._ts) {
4904          child = child._next;
4905        }
4906
4907        child || _ticker.sleep();
4908      }
4909    }
4910  };
4911
4912  return Timeline;
4913}(Animation);
4914
4915_setDefaults(Timeline.prototype, {
4916  _lock: 0,
4917  _hasPause: 0,
4918  _forcing: 0
4919});
4920
4921var _addComplexStringPropTween = function _addComplexStringPropTween(target, prop, start, end, setter, stringFilter, funcParam) {
4922  //note: we call _addComplexStringPropTween.call(tweenInstance...) to ensure that it's scoped properly. We may call it from within a plugin too, thus "this" would refer to the plugin.
4923  var pt = new PropTween(this._pt, target, prop, 0, 1, _renderComplexString, null, setter),
4924      index = 0,
4925      matchIndex = 0,
4926      result,
4927      startNums,
4928      color,
4929      endNum,
4930      chunk,
4931      startNum,
4932      hasRandom,
4933      a;
4934  pt.b = start;
4935  pt.e = end;
4936  start += ""; //ensure values are strings
4937
4938  end += "";
4939
4940  if (hasRandom = ~end.indexOf("random(")) {
4941    end = _replaceRandom(end);
4942  }
4943
4944  if (stringFilter) {
4945    a = [start, end];
4946    stringFilter(a, target, prop); //pass an array with the starting and ending values and let the filter do whatever it needs to the values.
4947
4948    start = a[0];
4949    end = a[1];
4950  }
4951
4952  startNums = start.match(_complexStringNumExp) || [];
4953
4954  while (result = _complexStringNumExp.exec(end)) {
4955    endNum = result[0];
4956    chunk = end.substring(index, result.index);
4957
4958    if (color) {
4959      color = (color + 1) % 5;
4960    } else if (chunk.substr(-5) === "rgba(") {
4961      color = 1;
4962    }
4963
4964    if (endNum !== startNums[matchIndex++]) {
4965      startNum = parseFloat(startNums[matchIndex - 1]) || 0; //these nested PropTweens are handled in a special way - we'll never actually call a render or setter method on them. We'll just loop through them in the parent complex string PropTween's render method.
4966
4967      pt._pt = {
4968        _next: pt._pt,
4969        p: chunk || matchIndex === 1 ? chunk : ",",
4970        //note: SVG spec allows omission of comma/space when a negative sign is wedged between two numbers, like 2.5-5.3 instead of 2.5,-5.3 but when tweening, the negative value may switch to positive, so we insert the comma just in case.
4971        s: startNum,
4972        c: endNum.charAt(1) === "=" ? parseFloat(endNum.substr(2)) * (endNum.charAt(0) === "-" ? -1 : 1) : parseFloat(endNum) - startNum,
4973        m: color && color < 4 ? Math.round : 0
4974      };
4975      index = _complexStringNumExp.lastIndex;
4976    }
4977  }
4978
4979  pt.c = index < end.length ? end.substring(index, end.length) : ""; //we use the "c" of the PropTween to store the final part of the string (after the last number)
4980
4981  pt.fp = funcParam;
4982
4983  if (_relExp.test(end) || hasRandom) {
4984    pt.e = 0; //if the end string contains relative values or dynamic random(...) values, delete the end it so that on the final render we don't actually set it to the string with += or -= characters (forces it to use the calculated value).
4985  }
4986
4987  this._pt = pt; //start the linked list with this new PropTween. Remember, we call _addComplexStringPropTween.call(tweenInstance...) to ensure that it's scoped properly. We may call it from within a plugin too, thus "this" would refer to the plugin.
4988
4989  return pt;
4990},
4991    _addPropTween = function _addPropTween(target, prop, start, end, index, targets, modifier, stringFilter, funcParam) {
4992  _isFunction(end) && (end = end(index || 0, target, targets));
4993  var currentValue = target[prop],
4994      parsedStart = start !== "get" ? start : !_isFunction(currentValue) ? currentValue : funcParam ? target[prop.indexOf("set") || !_isFunction(target["get" + prop.substr(3)]) ? prop : "get" + prop.substr(3)](funcParam) : target[prop](),
4995      setter = !_isFunction(currentValue) ? _setterPlain : funcParam ? _setterFuncWithParam : _setterFunc,
4996      pt;
4997
4998  if (_isString(end)) {
4999    if (~end.indexOf("random(")) {
5000      end = _replaceRandom(end);
5001    }
5002
5003    if (end.charAt(1) === "=") {
5004      end = parseFloat(parsedStart) + parseFloat(end.substr(2)) * (end.charAt(0) === "-" ? -1 : 1) + (getUnit(parsedStart) || 0);
5005    }
5006  }
5007
5008  if (parsedStart !== end) {
5009    if (!isNaN(parsedStart * end)) {
5010      pt = new PropTween(this._pt, target, prop, +parsedStart || 0, end - (parsedStart || 0), typeof currentValue === "boolean" ? _renderBoolean : _renderPlain, 0, setter);
5011      funcParam && (pt.fp = funcParam);
5012      modifier && pt.modifier(modifier, this, target);
5013      return this._pt = pt;
5014    }
5015
5016    !currentValue && !(prop in target) && _missingPlugin(prop, end);
5017    return _addComplexStringPropTween.call(this, target, prop, parsedStart, end, setter, stringFilter || _config.stringFilter, funcParam);
5018  }
5019},
5020    //creates a copy of the vars object and processes any function-based values (putting the resulting values directly into the copy) as well as strings with "random()" in them. It does NOT process relative values.
5021_processVars = function _processVars(vars, index, target, targets, tween) {
5022  _isFunction(vars) && (vars = _parseFuncOrString(vars, tween, index, target, targets));
5023
5024  if (!_isObject(vars) || vars.style && vars.nodeType || _isArray(vars) || _isTypedArray(vars)) {
5025    return _isString(vars) ? _parseFuncOrString(vars, tween, index, target, targets) : vars;
5026  }
5027
5028  var copy = {},
5029      p;
5030
5031  for (p in vars) {
5032    copy[p] = _parseFuncOrString(vars[p], tween, index, target, targets);
5033  }
5034
5035  return copy;
5036},
5037    _checkPlugin = function _checkPlugin(property, vars, tween, index, target, targets) {
5038  var plugin, pt, ptLookup, i;
5039
5040  if (_plugins[property] && (plugin = new _plugins[property]()).init(target, plugin.rawVars ? vars[property] : _processVars(vars[property], index, target, targets, tween), tween, index, targets) !== false) {
5041    tween._pt = pt = new PropTween(tween._pt, target, property, 0, 1, plugin.render, plugin, 0, plugin.priority);
5042
5043    if (tween !== _quickTween) {
5044      ptLookup = tween._ptLookup[tween._targets.indexOf(target)]; //note: we can't use tween._ptLookup[index] because for staggered tweens, the index from the fullTargets array won't match what it is in each individual tween that spawns from the stagger.
5045
5046      i = plugin._props.length;
5047
5048      while (i--) {
5049        ptLookup[plugin._props[i]] = pt;
5050      }
5051    }
5052  }
5053
5054  return plugin;
5055},
5056    _overwritingTween,
5057    //store a reference temporarily so we can avoid overwriting itself.
5058_initTween = function _initTween(tween, time) {
5059  var vars = tween.vars,
5060      ease = vars.ease,
5061      startAt = vars.startAt,
5062      immediateRender = vars.immediateRender,
5063      lazy = vars.lazy,
5064      onUpdate = vars.onUpdate,
5065      onUpdateParams = vars.onUpdateParams,
5066      callbackScope = vars.callbackScope,
5067      runBackwards = vars.runBackwards,
5068      yoyoEase = vars.yoyoEase,
5069      keyframes = vars.keyframes,
5070      autoRevert = vars.autoRevert,
5071      dur = tween._dur,
5072      prevStartAt = tween._startAt,
5073      targets = tween._targets,
5074      parent = tween.parent,
5075      fullTargets = parent && parent.data === "nested" ? parent.parent._targets : targets,
5076      autoOverwrite = tween._overwrite === "auto" && !_suppressOverwrites,
5077      tl = tween.timeline,
5078      cleanVars,
5079      i,
5080      p,
5081      pt,
5082      target,
5083      hasPriority,
5084      gsData,
5085      harness,
5086      plugin,
5087      ptLookup,
5088      index,
5089      harnessVars,
5090      overwritten;
5091  tl && (!keyframes || !ease) && (ease = "none");
5092  tween._ease = _parseEase(ease, _defaults.ease);
5093  tween._yEase = yoyoEase ? _invertEase(_parseEase(yoyoEase === true ? ease : yoyoEase, _defaults.ease)) : 0;
5094
5095  if (yoyoEase && tween._yoyo && !tween._repeat) {
5096    //there must have been a parent timeline with yoyo:true that is currently in its yoyo phase, so flip the eases.
5097    yoyoEase = tween._yEase;
5098    tween._yEase = tween._ease;
5099    tween._ease = yoyoEase;
5100  }
5101
5102  if (!tl) {
5103    //if there's an internal timeline, skip all the parsing because we passed that task down the chain.
5104    harness = targets[0] ? _getCache(targets[0]).harness : 0;
5105    harnessVars = harness && vars[harness.prop]; //someone may need to specify CSS-specific values AND non-CSS values, like if the element has an "x" property plus it's a standard DOM element. We allow people to distinguish by wrapping plugin-specific stuff in a css:{} object for example.
5106
5107    cleanVars = _copyExcluding(vars, _reservedProps);
5108    prevStartAt && prevStartAt.render(-1, true).kill();
5109
5110    if (startAt) {
5111      _removeFromParent(tween._startAt = Tween.set(targets, _setDefaults({
5112        data: "isStart",
5113        overwrite: false,
5114        parent: parent,
5115        immediateRender: true,
5116        lazy: _isNotFalse(lazy),
5117        startAt: null,
5118        delay: 0,
5119        onUpdate: onUpdate,
5120        onUpdateParams: onUpdateParams,
5121        callbackScope: callbackScope,
5122        stagger: 0
5123      }, startAt))); //copy the properties/values into a new object to avoid collisions, like var to = {x:0}, from = {x:500}; timeline.fromTo(e, from, to).fromTo(e, to, from);
5124
5125
5126      if (immediateRender) {
5127        if (time > 0) {
5128          autoRevert || (tween._startAt = 0); //tweens that render immediately (like most from() and fromTo() tweens) shouldn't revert when their parent timeline's playhead goes backward past the startTime because the initial render could have happened anytime and it shouldn't be directly correlated to this tween's startTime. Imagine setting up a complex animation where the beginning states of various objects are rendered immediately but the tween doesn't happen for quite some time - if we revert to the starting values as soon as the playhead goes backward past the tween's startTime, it will throw things off visually. Reversion should only happen in Timeline instances where immediateRender was false or when autoRevert is explicitly set to true.
5129        } else if (dur && !(time < 0 && prevStartAt)) {
5130          time && (tween._zTime = time);
5131          return; //we skip initialization here so that overwriting doesn't occur until the tween actually begins. Otherwise, if you create several immediateRender:true tweens of the same target/properties to drop into a Timeline, the last one created would overwrite the first ones because they didn't get placed into the timeline yet before the first render occurs and kicks in overwriting.
5132        }
5133      } else if (autoRevert === false) {
5134        tween._startAt = 0;
5135      }
5136    } else if (runBackwards && dur) {
5137      //from() tweens must be handled uniquely: their beginning values must be rendered but we don't want overwriting to occur yet (when time is still 0). Wait until the tween actually begins before doing all the routines like overwriting. At that time, we should render at the END of the tween to ensure that things initialize correctly (remember, from() tweens go backwards)
5138      if (prevStartAt) {
5139        !autoRevert && (tween._startAt = 0);
5140      } else {
5141        time && (immediateRender = false); //in rare cases (like if a from() tween runs and then is invalidate()-ed), immediateRender could be true but the initial forced-render gets skipped, so there's no need to force the render in this context when the _time is greater than 0
5142
5143        p = _setDefaults({
5144          overwrite: false,
5145          data: "isFromStart",
5146          //we tag the tween with as "isFromStart" so that if [inside a plugin] we need to only do something at the very END of a tween, we have a way of identifying this tween as merely the one that's setting the beginning values for a "from()" tween. For example, clearProps in CSSPlugin should only get applied at the very END of a tween and without this tag, from(...{height:100, clearProps:"height", delay:1}) would wipe the height at the beginning of the tween and after 1 second, it'd kick back in.
5147          lazy: immediateRender && _isNotFalse(lazy),
5148          immediateRender: immediateRender,
5149          //zero-duration tweens render immediately by default, but if we're not specifically instructed to render this tween immediately, we should skip this and merely _init() to record the starting values (rendering them immediately would push them to completion which is wasteful in that case - we'd have to render(-1) immediately after)
5150          stagger: 0,
5151          parent: parent //ensures that nested tweens that had a stagger are handled properly, like gsap.from(".class", {y:gsap.utils.wrap([-100,100])})
5152
5153        }, cleanVars);
5154        harnessVars && (p[harness.prop] = harnessVars); // in case someone does something like .from(..., {css:{}})
5155
5156        _removeFromParent(tween._startAt = Tween.set(targets, p));
5157
5158        if (!immediateRender) {
5159          _initTween(tween._startAt, _tinyNum); //ensures that the initial values are recorded
5160
5161        } else if (!time) {
5162          return;
5163        }
5164      }
5165    }
5166
5167    tween._pt = 0;
5168    lazy = dur && _isNotFalse(lazy) || lazy && !dur;
5169
5170    for (i = 0; i < targets.length; i++) {
5171      target = targets[i];
5172      gsData = target._gsap || _harness(targets)[i]._gsap;
5173      tween._ptLookup[i] = ptLookup = {};
5174      _lazyLookup[gsData.id] && _lazyTweens.length && _lazyRender(); //if other tweens of the same target have recently initted but haven't rendered yet, we've got to force the render so that the starting values are correct (imagine populating a timeline with a bunch of sequential tweens and then jumping to the end)
5175
5176      index = fullTargets === targets ? i : fullTargets.indexOf(target);
5177
5178      if (harness && (plugin = new harness()).init(target, harnessVars || cleanVars, tween, index, fullTargets) !== false) {
5179        tween._pt = pt = new PropTween(tween._pt, target, plugin.name, 0, 1, plugin.render, plugin, 0, plugin.priority);
5180
5181        plugin._props.forEach(function (name) {
5182          ptLookup[name] = pt;
5183        });
5184
5185        plugin.priority && (hasPriority = 1);
5186      }
5187
5188      if (!harness || harnessVars) {
5189        for (p in cleanVars) {
5190          if (_plugins[p] && (plugin = _checkPlugin(p, cleanVars, tween, index, target, fullTargets))) {
5191            plugin.priority && (hasPriority = 1);
5192          } else {
5193            ptLookup[p] = pt = _addPropTween.call(tween, target, p, "get", cleanVars[p], index, fullTargets, 0, vars.stringFilter);
5194          }
5195        }
5196      }
5197
5198      tween._op && tween._op[i] && tween.kill(target, tween._op[i]);
5199
5200      if (autoOverwrite && tween._pt) {
5201        _overwritingTween = tween;
5202
5203        _globalTimeline.killTweensOf(target, ptLookup, tween.globalTime(0)); //Also make sure the overwriting doesn't overwrite THIS tween!!!
5204
5205
5206        overwritten = !tween.parent;
5207        _overwritingTween = 0;
5208      }
5209
5210      tween._pt && lazy && (_lazyLookup[gsData.id] = 1);
5211    }
5212
5213    hasPriority && _sortPropTweensByPriority(tween);
5214    tween._onInit && tween._onInit(tween); //plugins like RoundProps must wait until ALL of the PropTweens are instantiated. In the plugin's init() function, it sets the _onInit on the tween instance. May not be pretty/intuitive, but it's fast and keeps file size down.
5215  }
5216
5217  tween._from = !tl && !!vars.runBackwards; //nested timelines should never run backwards - the backwards-ness is in the child tweens.
5218
5219  tween._onUpdate = onUpdate;
5220  tween._initted = (!tween._op || tween._pt) && !overwritten; // if overwrittenProps resulted in the entire tween being killed, do NOT flag it as initted or else it may render for one tick.
5221},
5222    _addAliasesToVars = function _addAliasesToVars(targets, vars) {
5223  var harness = targets[0] ? _getCache(targets[0]).harness : 0,
5224      propertyAliases = harness && harness.aliases,
5225      copy,
5226      p,
5227      i,
5228      aliases;
5229
5230  if (!propertyAliases) {
5231    return vars;
5232  }
5233
5234  copy = _merge({}, vars);
5235
5236  for (p in propertyAliases) {
5237    if (p in copy) {
5238      aliases = propertyAliases[p].split(",");
5239      i = aliases.length;
5240
5241      while (i--) {
5242        copy[aliases[i]] = copy[p];
5243      }
5244    }
5245  }
5246
5247  return copy;
5248},
5249    _parseFuncOrString = function _parseFuncOrString(value, tween, i, target, targets) {
5250  return _isFunction(value) ? value.call(tween, i, target, targets) : _isString(value) && ~value.indexOf("random(") ? _replaceRandom(value) : value;
5251},
5252    _staggerTweenProps = _callbackNames + "repeat,repeatDelay,yoyo,repeatRefresh,yoyoEase",
5253    _staggerPropsToSkip = (_staggerTweenProps + ",id,stagger,delay,duration,paused,scrollTrigger").split(",");
5254/*
5255 * --------------------------------------------------------------------------------------
5256 * TWEEN
5257 * --------------------------------------------------------------------------------------
5258 */
5259
5260
5261var Tween = /*#__PURE__*/function (_Animation2) {
5262  _inheritsLoose(Tween, _Animation2);
5263
5264  function Tween(targets, vars, time, skipInherit) {
5265    var _this3;
5266
5267    if (typeof vars === "number") {
5268      time.duration = vars;
5269      vars = time;
5270      time = null;
5271    }
5272
5273    _this3 = _Animation2.call(this, skipInherit ? vars : _inheritDefaults(vars), time) || this;
5274    var _this3$vars = _this3.vars,
5275        duration = _this3$vars.duration,
5276        delay = _this3$vars.delay,
5277        immediateRender = _this3$vars.immediateRender,
5278        stagger = _this3$vars.stagger,
5279        overwrite = _this3$vars.overwrite,
5280        keyframes = _this3$vars.keyframes,
5281        defaults = _this3$vars.defaults,
5282        scrollTrigger = _this3$vars.scrollTrigger,
5283        yoyoEase = _this3$vars.yoyoEase,
5284        parent = _this3.parent,
5285        parsedTargets = (_isArray(targets) || _isTypedArray(targets) ? _isNumber(targets[0]) : "length" in vars) ? [targets] : toArray(targets),
5286        tl,
5287        i,
5288        copy,
5289        l,
5290        p,
5291        curTarget,
5292        staggerFunc,
5293        staggerVarsToMerge;
5294    _this3._targets = parsedTargets.length ? _harness(parsedTargets) : _warn("GSAP target " + targets + " not found. https://greensock.com", !_config.nullTargetWarn) || [];
5295    _this3._ptLookup = []; //PropTween lookup. An array containing an object for each target, having keys for each tweening property
5296
5297    _this3._overwrite = overwrite;
5298
5299    if (keyframes || stagger || _isFuncOrString(duration) || _isFuncOrString(delay)) {
5300      vars = _this3.vars;
5301      tl = _this3.timeline = new Timeline({
5302        data: "nested",
5303        defaults: defaults || {}
5304      });
5305      tl.kill();
5306      tl.parent = tl._dp = _assertThisInitialized(_this3);
5307      tl._start = 0;
5308
5309      if (keyframes) {
5310        _setDefaults(tl.vars.defaults, {
5311          ease: "none"
5312        });
5313
5314        keyframes.forEach(function (frame) {
5315          return tl.to(parsedTargets, frame, ">");
5316        });
5317      } else {
5318        l = parsedTargets.length;
5319        staggerFunc = stagger ? distribute(stagger) : _emptyFunc;
5320
5321        if (_isObject(stagger)) {
5322          //users can pass in callbacks like onStart/onComplete in the stagger object. These should fire with each individual tween.
5323          for (p in stagger) {
5324            if (~_staggerTweenProps.indexOf(p)) {
5325              staggerVarsToMerge || (staggerVarsToMerge = {});
5326              staggerVarsToMerge[p] = stagger[p];
5327            }
5328          }
5329        }
5330
5331        for (i = 0; i < l; i++) {
5332          copy = {};
5333
5334          for (p in vars) {
5335            if (_staggerPropsToSkip.indexOf(p) < 0) {
5336              copy[p] = vars[p];
5337            }
5338          }
5339
5340          copy.stagger = 0;
5341          yoyoEase && (copy.yoyoEase = yoyoEase);
5342          staggerVarsToMerge && _merge(copy, staggerVarsToMerge);
5343          curTarget = parsedTargets[i]; //don't just copy duration or delay because if they're a string or function, we'd end up in an infinite loop because _isFuncOrString() would evaluate as true in the child tweens, entering this loop, etc. So we parse the value straight from vars and default to 0.
5344
5345          copy.duration = +_parseFuncOrString(duration, _assertThisInitialized(_this3), i, curTarget, parsedTargets);
5346          copy.delay = (+_parseFuncOrString(delay, _assertThisInitialized(_this3), i, curTarget, parsedTargets) || 0) - _this3._delay;
5347
5348          if (!stagger && l === 1 && copy.delay) {
5349            // if someone does delay:"random(1, 5)", repeat:-1, for example, the delay shouldn't be inside the repeat.
5350            _this3._delay = delay = copy.delay;
5351            _this3._start += delay;
5352            copy.delay = 0;
5353          }
5354
5355          tl.to(curTarget, copy, staggerFunc(i, curTarget, parsedTargets));
5356        }
5357
5358        tl.duration() ? duration = delay = 0 : _this3.timeline = 0; // if the timeline's duration is 0, we don't need a timeline internally!
5359      }
5360
5361      duration || _this3.duration(duration = tl.duration());
5362    } else {
5363      _this3.timeline = 0; //speed optimization, faster lookups (no going up the prototype chain)
5364    }
5365
5366    if (overwrite === true && !_suppressOverwrites) {
5367      _overwritingTween = _assertThisInitialized(_this3);
5368
5369      _globalTimeline.killTweensOf(parsedTargets);
5370
5371      _overwritingTween = 0;
5372    }
5373
5374    parent && _postAddChecks(parent, _assertThisInitialized(_this3));
5375
5376    if (immediateRender || !duration && !keyframes && _this3._start === _round(parent._time) && _isNotFalse(immediateRender) && _hasNoPausedAncestors(_assertThisInitialized(_this3)) && parent.data !== "nested") {
5377      _this3._tTime = -_tinyNum; //forces a render without having to set the render() "force" parameter to true because we want to allow lazying by default (using the "force" parameter always forces an immediate full render)
5378
5379      _this3.render(Math.max(0, -delay)); //in case delay is negative
5380
5381    }
5382
5383    scrollTrigger && _scrollTrigger(_assertThisInitialized(_this3), scrollTrigger);
5384    return _this3;
5385  }
5386
5387  var _proto3 = Tween.prototype;
5388
5389  _proto3.render = function render(totalTime, suppressEvents, force) {
5390    var prevTime = this._time,
5391        tDur = this._tDur,
5392        dur = this._dur,
5393        tTime = totalTime > tDur - _tinyNum && totalTime >= 0 ? tDur : totalTime < _tinyNum ? 0 : totalTime,
5394        time,
5395        pt,
5396        iteration,
5397        cycleDuration,
5398        prevIteration,
5399        isYoyo,
5400        ratio,
5401        timeline,
5402        yoyoEase;
5403
5404    if (!dur) {
5405      _renderZeroDurationTween(this, totalTime, suppressEvents, force);
5406    } else if (tTime !== this._tTime || !totalTime || force || !this._initted && this._tTime || this._startAt && this._zTime < 0 !== totalTime < 0) {
5407      //this senses if we're crossing over the start time, in which case we must record _zTime and force the render, but we do it in this lengthy conditional way for performance reasons (usually we can skip the calculations): this._initted && (this._zTime < 0) !== (totalTime < 0)
5408      time = tTime;
5409      timeline = this.timeline;
5410
5411      if (this._repeat) {
5412        //adjust the time for repeats and yoyos
5413        cycleDuration = dur + this._rDelay;
5414
5415        if (this._repeat < -1 && totalTime < 0) {
5416          return this.totalTime(cycleDuration * 100 + totalTime, suppressEvents, force);
5417        }
5418
5419        time = _round(tTime % cycleDuration); //round to avoid floating point errors. (4 % 0.8 should be 0 but some browsers report it as 0.79999999!)
5420
5421        if (tTime === tDur) {
5422          // the tDur === tTime is for edge cases where there's a lengthy decimal on the duration and it may reach the very end but the time is rendered as not-quite-there (remember, tDur is rounded to 4 decimals whereas dur isn't)
5423          iteration = this._repeat;
5424          time = dur;
5425        } else {
5426          iteration = ~~(tTime / cycleDuration);
5427
5428          if (iteration && iteration === tTime / cycleDuration) {
5429            time = dur;
5430            iteration--;
5431          }
5432
5433          time > dur && (time = dur);
5434        }
5435
5436        isYoyo = this._yoyo && iteration & 1;
5437
5438        if (isYoyo) {
5439          yoyoEase = this._yEase;
5440          time = dur - time;
5441        }
5442
5443        prevIteration = _animationCycle(this._tTime, cycleDuration);
5444
5445        if (time === prevTime && !force && this._initted) {
5446          //could be during the repeatDelay part. No need to render and fire callbacks.
5447          return this;
5448        }
5449
5450        if (iteration !== prevIteration) {
5451          timeline && this._yEase && _propagateYoyoEase(timeline, isYoyo); //repeatRefresh functionality
5452
5453          if (this.vars.repeatRefresh && !isYoyo && !this._lock) {
5454            this._lock = force = 1; //force, otherwise if lazy is true, the _attemptInitTween() will return and we'll jump out and get caught bouncing on each tick.
5455
5456            this.render(_round(cycleDuration * iteration), true).invalidate()._lock = 0;
5457          }
5458        }
5459      }
5460
5461      if (!this._initted) {
5462        if (_attemptInitTween(this, totalTime < 0 ? totalTime : time, force, suppressEvents)) {
5463          this._tTime = 0; // in constructor if immediateRender is true, we set _tTime to -_tinyNum to have the playhead cross the starting point but we can't leave _tTime as a negative number.
5464
5465          return this;
5466        }
5467
5468        if (dur !== this._dur) {
5469          // while initting, a plugin like InertiaPlugin might alter the duration, so rerun from the start to ensure everything renders as it should.
5470          return this.render(totalTime, suppressEvents, force);
5471        }
5472      }
5473
5474      this._tTime = tTime;
5475      this._time = time;
5476
5477      if (!this._act && this._ts) {
5478        this._act = 1; //as long as it's not paused, force it to be active so that if the user renders independent of the parent timeline, it'll be forced to re-render on the next tick.
5479
5480        this._lazy = 0;
5481      }
5482
5483      this.ratio = ratio = (yoyoEase || this._ease)(time / dur);
5484
5485      if (this._from) {
5486        this.ratio = ratio = 1 - ratio;
5487      }
5488
5489      time && !prevTime && !suppressEvents && _callback(this, "onStart");
5490      pt = this._pt;
5491
5492      while (pt) {
5493        pt.r(ratio, pt.d);
5494        pt = pt._next;
5495      }
5496
5497      timeline && timeline.render(totalTime < 0 ? totalTime : !time && isYoyo ? -_tinyNum : timeline._dur * ratio, suppressEvents, force) || this._startAt && (this._zTime = totalTime);
5498
5499      if (this._onUpdate && !suppressEvents) {
5500        totalTime < 0 && this._startAt && this._startAt.render(totalTime, true, force); //note: for performance reasons, we tuck this conditional logic inside less traveled areas (most tweens don't have an onUpdate). We'd just have it at the end before the onComplete, but the values should be updated before any onUpdate is called, so we ALSO put it here and then if it's not called, we do so later near the onComplete.
5501
5502        _callback(this, "onUpdate");
5503      }
5504
5505      this._repeat && iteration !== prevIteration && this.vars.onRepeat && !suppressEvents && this.parent && _callback(this, "onRepeat");
5506
5507      if ((tTime === this._tDur || !tTime) && this._tTime === tTime) {
5508        totalTime < 0 && this._startAt && !this._onUpdate && this._startAt.render(totalTime, true, true);
5509        (totalTime || !dur) && (tTime === this._tDur && this._ts > 0 || !tTime && this._ts < 0) && _removeFromParent(this, 1); // don't remove if we're rendering at exactly a time of 0, as there could be autoRevert values that should get set on the next tick (if the playhead goes backward beyond the startTime, negative totalTime). Don't remove if the timeline is reversed and the playhead isn't at 0, otherwise tl.progress(1).reverse() won't work. Only remove if the playhead is at the end and timeScale is positive, or if the playhead is at 0 and the timeScale is negative.
5510
5511        if (!suppressEvents && !(totalTime < 0 && !prevTime) && (tTime || prevTime)) {
5512          // if prevTime and tTime are zero, we shouldn't fire the onReverseComplete. This could happen if you gsap.to(... {paused:true}).play();
5513          _callback(this, tTime === tDur ? "onComplete" : "onReverseComplete", true);
5514
5515          this._prom && !(tTime < tDur && this.timeScale() > 0) && this._prom();
5516        }
5517      }
5518    }
5519
5520    return this;
5521  };
5522
5523  _proto3.targets = function targets() {
5524    return this._targets;
5525  };
5526
5527  _proto3.invalidate = function invalidate() {
5528    this._pt = this._op = this._startAt = this._onUpdate = this._lazy = this.ratio = 0;
5529    this._ptLookup = [];
5530    this.timeline && this.timeline.invalidate();
5531    return _Animation2.prototype.invalidate.call(this);
5532  };
5533
5534  _proto3.kill = function kill(targets, vars) {
5535    if (vars === void 0) {
5536      vars = "all";
5537    }
5538
5539    if (!targets && (!vars || vars === "all")) {
5540      this._lazy = this._pt = 0;
5541      return this.parent ? _interrupt(this) : this;
5542    }
5543
5544    if (this.timeline) {
5545      var tDur = this.timeline.totalDuration();
5546      this.timeline.killTweensOf(targets, vars, _overwritingTween && _overwritingTween.vars.overwrite !== true)._first || _interrupt(this); // if nothing is left tweening, interrupt.
5547
5548      this.parent && tDur !== this.timeline.totalDuration() && _setDuration(this, this._dur * this.timeline._tDur / tDur, 0, 1); // if a nested tween is killed that changes the duration, it should affect this tween's duration. We must use the ratio, though, because sometimes the internal timeline is stretched like for keyframes where they don't all add up to whatever the parent tween's duration was set to.
5549
5550      return this;
5551    }
5552
5553    var parsedTargets = this._targets,
5554        killingTargets = targets ? toArray(targets) : parsedTargets,
5555        propTweenLookup = this._ptLookup,
5556        firstPT = this._pt,
5557        overwrittenProps,
5558        curLookup,
5559        curOverwriteProps,
5560        props,
5561        p,
5562        pt,
5563        i;
5564
5565    if ((!vars || vars === "all") && _arraysMatch(parsedTargets, killingTargets)) {
5566      vars === "all" && (this._pt = 0);
5567      return _interrupt(this);
5568    }
5569
5570    overwrittenProps = this._op = this._op || [];
5571
5572    if (vars !== "all") {
5573      //so people can pass in a comma-delimited list of property names
5574      if (_isString(vars)) {
5575        p = {};
5576
5577        _forEachName(vars, function (name) {
5578          return p[name] = 1;
5579        });
5580
5581        vars = p;
5582      }
5583
5584      vars = _addAliasesToVars(parsedTargets, vars);
5585    }
5586
5587    i = parsedTargets.length;
5588
5589    while (i--) {
5590      if (~killingTargets.indexOf(parsedTargets[i])) {
5591        curLookup = propTweenLookup[i];
5592
5593        if (vars === "all") {
5594          overwrittenProps[i] = vars;
5595          props = curLookup;
5596          curOverwriteProps = {};
5597        } else {
5598          curOverwriteProps = overwrittenProps[i] = overwrittenProps[i] || {};
5599          props = vars;
5600        }
5601
5602        for (p in props) {
5603          pt = curLookup && curLookup[p];
5604
5605          if (pt) {
5606            if (!("kill" in pt.d) || pt.d.kill(p) === true) {
5607              _removeLinkedListItem(this, pt, "_pt");
5608            }
5609
5610            delete curLookup[p];
5611          }
5612
5613          if (curOverwriteProps !== "all") {
5614            curOverwriteProps[p] = 1;
5615          }
5616        }
5617      }
5618    }
5619
5620    this._initted && !this._pt && firstPT && _interrupt(this); //if all tweening properties are killed, kill the tween. Without this line, if there's a tween with multiple targets and then you killTweensOf() each target individually, the tween would technically still remain active and fire its onComplete even though there aren't any more properties tweening.
5621
5622    return this;
5623  };
5624
5625  Tween.to = function to(targets, vars) {
5626    return new Tween(targets, vars, arguments[2]);
5627  };
5628
5629  Tween.from = function from(targets, vars) {
5630    return new Tween(targets, _parseVars(arguments, 1));
5631  };
5632
5633  Tween.delayedCall = function delayedCall(delay, callback, params, scope) {
5634    return new Tween(callback, 0, {
5635      immediateRender: false,
5636      lazy: false,
5637      overwrite: false,
5638      delay: delay,
5639      onComplete: callback,
5640      onReverseComplete: callback,
5641      onCompleteParams: params,
5642      onReverseCompleteParams: params,
5643      callbackScope: scope
5644    });
5645  };
5646
5647  Tween.fromTo = function fromTo(targets, fromVars, toVars) {
5648    return new Tween(targets, _parseVars(arguments, 2));
5649  };
5650
5651  Tween.set = function set(targets, vars) {
5652    vars.duration = 0;
5653    vars.repeatDelay || (vars.repeat = 0);
5654    return new Tween(targets, vars);
5655  };
5656
5657  Tween.killTweensOf = function killTweensOf(targets, props, onlyActive) {
5658    return _globalTimeline.killTweensOf(targets, props, onlyActive);
5659  };
5660
5661  return Tween;
5662}(Animation);
5663
5664_setDefaults(Tween.prototype, {
5665  _targets: [],
5666  _lazy: 0,
5667  _startAt: 0,
5668  _op: 0,
5669  _onInit: 0
5670}); //add the pertinent timeline methods to Tween instances so that users can chain conveniently and create a timeline automatically. (removed due to concerns that it'd ultimately add to more confusion especially for beginners)
5671// _forEachName("to,from,fromTo,set,call,add,addLabel,addPause", name => {
5672// 	Tween.prototype[name] = function() {
5673// 		let tl = new Timeline();
5674// 		return _addToTimeline(tl, this)[name].apply(tl, toArray(arguments));
5675// 	}
5676// });
5677//for backward compatibility. Leverage the timeline calls.
5678
5679
5680_forEachName("staggerTo,staggerFrom,staggerFromTo", function (name) {
5681  Tween[name] = function () {
5682    var tl = new Timeline(),
5683        params = _slice.call(arguments, 0);
5684
5685    params.splice(name === "staggerFromTo" ? 5 : 4, 0, 0);
5686    return tl[name].apply(tl, params);
5687  };
5688});
5689/*
5690 * --------------------------------------------------------------------------------------
5691 * PROPTWEEN
5692 * --------------------------------------------------------------------------------------
5693 */
5694
5695
5696var _setterPlain = function _setterPlain(target, property, value) {
5697  return target[property] = value;
5698},
5699    _setterFunc = function _setterFunc(target, property, value) {
5700  return target[property](value);
5701},
5702    _setterFuncWithParam = function _setterFuncWithParam(target, property, value, data) {
5703  return target[property](data.fp, value);
5704},
5705    _setterAttribute = function _setterAttribute(target, property, value) {
5706  return target.setAttribute(property, value);
5707},
5708    _getSetter = function _getSetter(target, property) {
5709  return _isFunction(target[property]) ? _setterFunc : _isUndefined(target[property]) && target.setAttribute ? _setterAttribute : _setterPlain;
5710},
5711    _renderPlain = function _renderPlain(ratio, data) {
5712  return data.set(data.t, data.p, Math.round((data.s + data.c * ratio) * 10000) / 10000, data);
5713},
5714    _renderBoolean = function _renderBoolean(ratio, data) {
5715  return data.set(data.t, data.p, !!(data.s + data.c * ratio), data);
5716},
5717    _renderComplexString = function _renderComplexString(ratio, data) {
5718  var pt = data._pt,
5719      s = "";
5720
5721  if (!ratio && data.b) {
5722    //b = beginning string
5723    s = data.b;
5724  } else if (ratio === 1 && data.e) {
5725    //e = ending string
5726    s = data.e;
5727  } else {
5728    while (pt) {
5729      s = pt.p + (pt.m ? pt.m(pt.s + pt.c * ratio) : Math.round((pt.s + pt.c * ratio) * 10000) / 10000) + s; //we use the "p" property for the text inbetween (like a suffix). And in the context of a complex string, the modifier (m) is typically just Math.round(), like for RGB colors.
5730
5731      pt = pt._next;
5732    }
5733
5734    s += data.c; //we use the "c" of the PropTween to store the final chunk of non-numeric text.
5735  }
5736
5737  data.set(data.t, data.p, s, data);
5738},
5739    _renderPropTweens = function _renderPropTweens(ratio, data) {
5740  var pt = data._pt;
5741
5742  while (pt) {
5743    pt.r(ratio, pt.d);
5744    pt = pt._next;
5745  }
5746},
5747    _addPluginModifier = function _addPluginModifier(modifier, tween, target, property) {
5748  var pt = this._pt,
5749      next;
5750
5751  while (pt) {
5752    next = pt._next;
5753    pt.p === property && pt.modifier(modifier, tween, target);
5754    pt = next;
5755  }
5756},
5757    _killPropTweensOf = function _killPropTweensOf(property) {
5758  var pt = this._pt,
5759      hasNonDependentRemaining,
5760      next;
5761
5762  while (pt) {
5763    next = pt._next;
5764
5765    if (pt.p === property && !pt.op || pt.op === property) {
5766      _removeLinkedListItem(this, pt, "_pt");
5767    } else if (!pt.dep) {
5768      hasNonDependentRemaining = 1;
5769    }
5770
5771    pt = next;
5772  }
5773
5774  return !hasNonDependentRemaining;
5775},
5776    _setterWithModifier = function _setterWithModifier(target, property, value, data) {
5777  data.mSet(target, property, data.m.call(data.tween, value, data.mt), data);
5778},
5779    _sortPropTweensByPriority = function _sortPropTweensByPriority(parent) {
5780  var pt = parent._pt,
5781      next,
5782      pt2,
5783      first,
5784      last; //sorts the PropTween linked list in order of priority because some plugins need to do their work after ALL of the PropTweens were created (like RoundPropsPlugin and ModifiersPlugin)
5785
5786  while (pt) {
5787    next = pt._next;
5788    pt2 = first;
5789
5790    while (pt2 && pt2.pr > pt.pr) {
5791      pt2 = pt2._next;
5792    }
5793
5794    if (pt._prev = pt2 ? pt2._prev : last) {
5795      pt._prev._next = pt;
5796    } else {
5797      first = pt;
5798    }
5799
5800    if (pt._next = pt2) {
5801      pt2._prev = pt;
5802    } else {
5803      last = pt;
5804    }
5805
5806    pt = next;
5807  }
5808
5809  parent._pt = first;
5810}; //PropTween key: t = target, p = prop, r = renderer, d = data, s = start, c = change, op = overwriteProperty (ONLY populated when it's different than p), pr = priority, _next/_prev for the linked list siblings, set = setter, m = modifier, mSet = modifierSetter (the original setter, before a modifier was added)
5811
5812
5813var PropTween = /*#__PURE__*/function () {
5814  function PropTween(next, target, prop, start, change, renderer, data, setter, priority) {
5815    this.t = target;
5816    this.s = start;
5817    this.c = change;
5818    this.p = prop;
5819    this.r = renderer || _renderPlain;
5820    this.d = data || this;
5821    this.set = setter || _setterPlain;
5822    this.pr = priority || 0;
5823    this._next = next;
5824
5825    if (next) {
5826      next._prev = this;
5827    }
5828  }
5829
5830  var _proto4 = PropTween.prototype;
5831
5832  _proto4.modifier = function modifier(func, tween, target) {
5833    this.mSet = this.mSet || this.set; //in case it was already set (a PropTween can only have one modifier)
5834
5835    this.set = _setterWithModifier;
5836    this.m = func;
5837    this.mt = target; //modifier target
5838
5839    this.tween = tween;
5840  };
5841
5842  return PropTween;
5843}(); //Initialization tasks
5844
5845_forEachName(_callbackNames + "parent,duration,ease,delay,overwrite,runBackwards,startAt,yoyo,immediateRender,repeat,repeatDelay,data,paused,reversed,lazy,callbackScope,stringFilter,id,yoyoEase,stagger,inherit,repeatRefresh,keyframes,autoRevert,scrollTrigger", function (name) {
5846  return _reservedProps[name] = 1;
5847});
5848
5849_globals.TweenMax = _globals.TweenLite = Tween;
5850_globals.TimelineLite = _globals.TimelineMax = Timeline;
5851_globalTimeline = new Timeline({
5852  sortChildren: false,
5853  defaults: _defaults,
5854  autoRemoveChildren: true,
5855  id: "root",
5856  smoothChildTiming: true
5857});
5858_config.stringFilter = _colorStringFilter;
5859/*
5860 * --------------------------------------------------------------------------------------
5861 * GSAP
5862 * --------------------------------------------------------------------------------------
5863 */
5864
5865var _gsap = {
5866  registerPlugin: function registerPlugin() {
5867    for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
5868      args[_key2] = arguments[_key2];
5869    }
5870
5871    args.forEach(function (config) {
5872      return _createPlugin(config);
5873    });
5874  },
5875  timeline: function timeline(vars) {
5876    return new Timeline(vars);
5877  },
5878  getTweensOf: function getTweensOf(targets, onlyActive) {
5879    return _globalTimeline.getTweensOf(targets, onlyActive);
5880  },
5881  getProperty: function getProperty(target, property, unit, uncache) {
5882    _isString(target) && (target = toArray(target)[0]); //in case selector text or an array is passed in
5883
5884    var getter = _getCache(target || {}).get,
5885        format = unit ? _passThrough : _numericIfPossible;
5886
5887    unit === "native" && (unit = "");
5888    return !target ? target : !property ? function (property, unit, uncache) {
5889      return format((_plugins[property] && _plugins[property].get || getter)(target, property, unit, uncache));
5890    } : format((_plugins[property] && _plugins[property].get || getter)(target, property, unit, uncache));
5891  },
5892  quickSetter: function quickSetter(target, property, unit) {
5893    target = toArray(target);
5894
5895    if (target.length > 1) {
5896      var setters = target.map(function (t) {
5897        return gsap.quickSetter(t, property, unit);
5898      }),
5899          l = setters.length;
5900      return function (value) {
5901        var i = l;
5902
5903        while (i--) {
5904          setters[i](value);
5905        }
5906      };
5907    }
5908
5909    target = target[0] || {};
5910
5911    var Plugin = _plugins[property],
5912        cache = _getCache(target),
5913        p = cache.harness && (cache.harness.aliases || {})[property] || property,
5914        // in case it's an alias, like "rotate" for "rotation".
5915    setter = Plugin ? function (value) {
5916      var p = new Plugin();
5917      _quickTween._pt = 0;
5918      p.init(target, unit ? value + unit : value, _quickTween, 0, [target]);
5919      p.render(1, p);
5920      _quickTween._pt && _renderPropTweens(1, _quickTween);
5921    } : cache.set(target, p);
5922
5923    return Plugin ? setter : function (value) {
5924      return setter(target, p, unit ? value + unit : value, cache, 1);
5925    };
5926  },
5927  isTweening: function isTweening(targets) {
5928    return _globalTimeline.getTweensOf(targets, true).length > 0;
5929  },
5930  defaults: function defaults(value) {
5931    value && value.ease && (value.ease = _parseEase(value.ease, _defaults.ease));
5932    return _mergeDeep(_defaults, value || {});
5933  },
5934  config: function config(value) {
5935    return _mergeDeep(_config, value || {});
5936  },
5937  registerEffect: function registerEffect(_ref2) {
5938    var name = _ref2.name,
5939        effect = _ref2.effect,
5940        plugins = _ref2.plugins,
5941        defaults = _ref2.defaults,
5942        extendTimeline = _ref2.extendTimeline;
5943    (plugins || "").split(",").forEach(function (pluginName) {
5944      return pluginName && !_plugins[pluginName] && !_globals[pluginName] && _warn(name + " effect requires " + pluginName + " plugin.");
5945    });
5946
5947    _effects[name] = function (targets, vars, tl) {
5948      return effect(toArray(targets), _setDefaults(vars || {}, defaults), tl);
5949    };
5950
5951    if (extendTimeline) {
5952      Timeline.prototype[name] = function (targets, vars, position) {
5953        return this.add(_effects[name](targets, _isObject(vars) ? vars : (position = vars) && {}, this), position);
5954      };
5955    }
5956  },
5957  registerEase: function registerEase(name, ease) {
5958    _easeMap[name] = _parseEase(ease);
5959  },
5960  parseEase: function parseEase(ease, defaultEase) {
5961    return arguments.length ? _parseEase(ease, defaultEase) : _easeMap;
5962  },
5963  getById: function getById(id) {
5964    return _globalTimeline.getById(id);
5965  },
5966  exportRoot: function exportRoot(vars, includeDelayedCalls) {
5967    if (vars === void 0) {
5968      vars = {};
5969    }
5970
5971    var tl = new Timeline(vars),
5972        child,
5973        next;
5974    tl.smoothChildTiming = _isNotFalse(vars.smoothChildTiming);
5975
5976    _globalTimeline.remove(tl);
5977
5978    tl._dp = 0; //otherwise it'll get re-activated when adding children and be re-introduced into _globalTimeline's linked list (then added to itself).
5979
5980    tl._time = tl._tTime = _globalTimeline._time;
5981    child = _globalTimeline._first;
5982
5983    while (child) {
5984      next = child._next;
5985
5986      if (includeDelayedCalls || !(!child._dur && child instanceof Tween && child.vars.onComplete === child._targets[0])) {
5987        _addToTimeline(tl, child, child._start - child._delay);
5988      }
5989
5990      child = next;
5991    }
5992
5993    _addToTimeline(_globalTimeline, tl, 0);
5994
5995    return tl;
5996  },
5997  utils: {
5998    wrap: wrap,
5999    wrapYoyo: wrapYoyo,
6000    distribute: distribute,
6001    random: random,
6002    snap: snap,
6003    normalize: normalize,
6004    getUnit: getUnit,
6005    clamp: clamp,
6006    splitColor: splitColor,
6007    toArray: toArray,
6008    mapRange: mapRange,
6009    pipe: pipe,
6010    unitize: unitize,
6011    interpolate: interpolate,
6012    shuffle: shuffle
6013  },
6014  install: _install,
6015  effects: _effects,
6016  ticker: _ticker,
6017  updateRoot: Timeline.updateRoot,
6018  plugins: _plugins,
6019  globalTimeline: _globalTimeline,
6020  core: {
6021    PropTween: PropTween,
6022    globals: _addGlobal,
6023    Tween: Tween,
6024    Timeline: Timeline,
6025    Animation: Animation,
6026    getCache: _getCache,
6027    _removeLinkedListItem: _removeLinkedListItem,
6028    suppressOverwrites: function suppressOverwrites(value) {
6029      return _suppressOverwrites = value;
6030    }
6031  }
6032};
6033
6034_forEachName("to,from,fromTo,delayedCall,set,killTweensOf", function (name) {
6035  return _gsap[name] = Tween[name];
6036});
6037
6038_ticker.add(Timeline.updateRoot);
6039
6040_quickTween = _gsap.to({}, {
6041  duration: 0
6042}); // ---- EXTRA PLUGINS --------------------------------------------------------
6043
6044var _getPluginPropTween = function _getPluginPropTween(plugin, prop) {
6045  var pt = plugin._pt;
6046
6047  while (pt && pt.p !== prop && pt.op !== prop && pt.fp !== prop) {
6048    pt = pt._next;
6049  }
6050
6051  return pt;
6052},
6053    _addModifiers = function _addModifiers(tween, modifiers) {
6054  var targets = tween._targets,
6055      p,
6056      i,
6057      pt;
6058
6059  for (p in modifiers) {
6060    i = targets.length;
6061
6062    while (i--) {
6063      pt = tween._ptLookup[i][p];
6064
6065      if (pt && (pt = pt.d)) {
6066        if (pt._pt) {
6067          // is a plugin
6068          pt = _getPluginPropTween(pt, p);
6069        }
6070
6071        pt && pt.modifier && pt.modifier(modifiers[p], tween, targets[i], p);
6072      }
6073    }
6074  }
6075},
6076    _buildModifierPlugin = function _buildModifierPlugin(name, modifier) {
6077  return {
6078    name: name,
6079    rawVars: 1,
6080    //don't pre-process function-based values or "random()" strings.
6081    init: function init(target, vars, tween) {
6082      tween._onInit = function (tween) {
6083        var temp, p;
6084
6085        if (_isString(vars)) {
6086          temp = {};
6087
6088          _forEachName(vars, function (name) {
6089            return temp[name] = 1;
6090          }); //if the user passes in a comma-delimited list of property names to roundProps, like "x,y", we round to whole numbers.
6091
6092
6093          vars = temp;
6094        }
6095
6096        if (modifier) {
6097          temp = {};
6098
6099          for (p in vars) {
6100            temp[p] = modifier(vars[p]);
6101          }
6102
6103          vars = temp;
6104        }
6105
6106        _addModifiers(tween, vars);
6107      };
6108    }
6109  };
6110}; //register core plugins
6111
6112
6113var gsap = _gsap.registerPlugin({
6114  name: "attr",
6115  init: function init(target, vars, tween, index, targets) {
6116    var p, pt;
6117
6118    for (p in vars) {
6119      pt = this.add(target, "setAttribute", (target.getAttribute(p) || 0) + "", vars[p], index, targets, 0, 0, p);
6120      pt && (pt.op = p);
6121
6122      this._props.push(p);
6123    }
6124  }
6125}, {
6126  name: "endArray",
6127  init: function init(target, value) {
6128    var i = value.length;
6129
6130    while (i--) {
6131      this.add(target, i, target[i] || 0, value[i]);
6132    }
6133  }
6134}, _buildModifierPlugin("roundProps", _roundModifier), _buildModifierPlugin("modifiers"), _buildModifierPlugin("snap", snap)) || _gsap; //to prevent the core plugins from being dropped via aggressive tree shaking, we must include them in the variable declaration in this way.
6135
6136Tween.version = Timeline.version = gsap.version = "3.6.1";
6137_coreReady = 1;
6138
6139if (_windowExists()) {
6140  _wake();
6141}
6142
6143var Power0 = _easeMap.Power0,
6144    Power1 = _easeMap.Power1,
6145    Power2 = _easeMap.Power2,
6146    Power3 = _easeMap.Power3,
6147    Power4 = _easeMap.Power4,
6148    Linear = _easeMap.Linear,
6149    Quad = _easeMap.Quad,
6150    Cubic = _easeMap.Cubic,
6151    Quart = _easeMap.Quart,
6152    Quint = _easeMap.Quint,
6153    Strong = _easeMap.Strong,
6154    Elastic = _easeMap.Elastic,
6155    Back = _easeMap.Back,
6156    SteppedEase = _easeMap.SteppedEase,
6157    Bounce = _easeMap.Bounce,
6158    Sine = _easeMap.Sine,
6159    Expo = _easeMap.Expo,
6160    Circ = _easeMap.Circ;
6161
6162 //export some internal methods/orojects for use in CSSPlugin so that we can externalize that file and allow custom builds that exclude it.
6163
6164
6165
6166
6167/***/ }),
6168
vendor: 5,124 bytes, lines 6169-6239
6169/***/ "./node_modules/gsap/index.js":
6170/*!************************************!*\
6171  !*** ./node_modules/gsap/index.js ***!
6172  \************************************/
6173/*! exports provided: gsap, default, CSSPlugin, TweenMax, TweenLite, TimelineMax, TimelineLite, Power0, Power1, Power2, Power3, Power4, Linear, Quad, Cubic, Quart, Quint, Strong, Elastic, Back, SteppedEase, Bounce, Sine, Expo, Circ */
6174/***/ (function(module, __webpack_exports__, __webpack_require__) {
6175
6176"use strict";
6177__webpack_require__.r(__webpack_exports__);
6178/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "gsap", function() { return gsapWithCSS; });
6179/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return gsapWithCSS; });
6180/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TweenMax", function() { return TweenMaxWithCSS; });
6181/* harmony import */ var _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./gsap-core.js */ "./node_modules/gsap/gsap-core.js");
6182/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "TweenLite", function() { return _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["TweenLite"]; });
6183
6184/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "TimelineMax", function() { return _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["TimelineMax"]; });
6185
6186/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "TimelineLite", function() { return _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["TimelineLite"]; });
6187
6188/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Power0", function() { return _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["Power0"]; });
6189
6190/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Power1", function() { return _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["Power1"]; });
6191
6192/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Power2", function() { return _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["Power2"]; });
6193
6194/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Power3", function() { return _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["Power3"]; });
6195
6196/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Power4", function() { return _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["Power4"]; });
6197
6198/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Linear", function() { return _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["Linear"]; });
6199
6200/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Quad", function() { return _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["Quad"]; });
6201
6202/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Cubic", function() { return _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["Cubic"]; });
6203
6204/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Quart", function() { return _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["Quart"]; });
6205
6206/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Quint", function() { return _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["Quint"]; });
6207
6208/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Strong", function() { return _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["Strong"]; });
6209
6210/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Elastic", function() { return _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["Elastic"]; });
6211
6212/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Back", function() { return _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["Back"]; });
6213
6214/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "SteppedEase", function() { return _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["SteppedEase"]; });
6215
6216/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Bounce", function() { return _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["Bounce"]; });
6217
6218/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Sine", function() { return _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["Sine"]; });
6219
6220/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Expo", function() { return _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["Expo"]; });
6221
6222/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Circ", function() { return _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["Circ"]; });
6223
6224/* harmony import */ var _CSSPlugin_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./CSSPlugin.js */ "./node_modules/gsap/CSSPlugin.js");
6225/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "CSSPlugin", function() { return _CSSPlugin_js__WEBPACK_IMPORTED_MODULE_1__["CSSPlugin"]; });
6226
6227/*** IMPORTS FROM imports-loader ***/
6228var define = false;
6229
6230
6231
6232var gsapWithCSS = _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["gsap"].registerPlugin(_CSSPlugin_js__WEBPACK_IMPORTED_MODULE_1__["CSSPlugin"]) || _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["gsap"],
6233    // to protect from tree shaking
6234TweenMaxWithCSS = gsapWithCSS.core.Tween;
6235
6236
6237
6238/***/ }),
6239
vendor: 288,915 bytes, lines 6240-17135
6240/***/ "./node_modules/jquery/dist/jquery.js":
6241/*!********************************************!*\
6242  !*** ./node_modules/jquery/dist/jquery.js ***!
6243  \********************************************/
6244/*! no static exports found */
6245/***/ (function(module, exports, __webpack_require__) {
6246
6247/*** IMPORTS FROM imports-loader ***/
6248var define = false;
6249
6250/*!
6251 * jQuery JavaScript Library v3.6.0
6252 * https://jquery.com/
6253 *
6254 * Includes Sizzle.js
6255 * https://sizzlejs.com/
6256 *
6257 * Copyright OpenJS Foundation and other contributors
6258 * Released under the MIT license
6259 * https://jquery.org/license
6260 *
6261 * Date: 2021-03-02T17:08Z
6262 */
6263( function( global, factory ) {
6264
6265	"use strict";
6266
6267	if (  true && typeof module.exports === "object" ) {
6268
6269		// For CommonJS and CommonJS-like environments where a proper `window`
6270		// is present, execute the factory and get jQuery.
6271		// For environments that do not have a `window` with a `document`
6272		// (such as Node.js), expose a factory as module.exports.
6273		// This accentuates the need for the creation of a real `window`.
6274		// e.g. var jQuery = require("jquery")(window);
6275		// See ticket #14549 for more info.
6276		module.exports = global.document ?
6277			factory( global, true ) :
6278			function( w ) {
6279				if ( !w.document ) {
6280					throw new Error( "jQuery requires a window with a document" );
6281				}
6282				return factory( w );
6283			};
6284	} else {
6285		factory( global );
6286	}
6287
6288// Pass this if window is not defined yet
6289} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
6290
6291// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1
6292// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode
6293// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common
6294// enough that all such attempts are guarded in a try block.
6295"use strict";
6296
6297var arr = [];
6298
6299var getProto = Object.getPrototypeOf;
6300
6301var slice = arr.slice;
6302
6303var flat = arr.flat ? function( array ) {
6304	return arr.flat.call( array );
6305} : function( array ) {
6306	return arr.concat.apply( [], array );
6307};
6308
6309
6310var push = arr.push;
6311
6312var indexOf = arr.indexOf;
6313
6314var class2type = {};
6315
6316var toString = class2type.toString;
6317
6318var hasOwn = class2type.hasOwnProperty;
6319
6320var fnToString = hasOwn.toString;
6321
6322var ObjectFunctionString = fnToString.call( Object );
6323
6324var support = {};
6325
6326var isFunction = function isFunction( obj ) {
6327
6328		// Support: Chrome <=57, Firefox <=52
6329		// In some browsers, typeof returns "function" for HTML <object> elements
6330		// (i.e., `typeof document.createElement( "object" ) === "function"`).
6331		// We don't want to classify *any* DOM node as a function.
6332		// Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5
6333		// Plus for old WebKit, typeof returns "function" for HTML collections
6334		// (e.g., `typeof document.getElementsByTagName("div") === "function"`). (gh-4756)
6335		return typeof obj === "function" && typeof obj.nodeType !== "number" &&
6336			typeof obj.item !== "function";
6337	};
6338
6339
6340var isWindow = function isWindow( obj ) {
6341		return obj != null && obj === obj.window;
6342	};
6343
6344
6345var document = window.document;
6346
6347
6348
6349	var preservedScriptAttributes = {
6350		type: true,
6351		src: true,
6352		nonce: true,
6353		noModule: true
6354	};
6355
6356	function DOMEval( code, node, doc ) {
6357		doc = doc || document;
6358
6359		var i, val,
6360			script = doc.createElement( "script" );
6361
6362		script.text = code;
6363		if ( node ) {
6364			for ( i in preservedScriptAttributes ) {
6365
6366				// Support: Firefox 64+, Edge 18+
6367				// Some browsers don't support the "nonce" property on scripts.
6368				// On the other hand, just using `getAttribute` is not enough as
6369				// the `nonce` attribute is reset to an empty string whenever it
6370				// becomes browsing-context connected.
6371				// See https://github.com/whatwg/html/issues/2369
6372				// See https://html.spec.whatwg.org/#nonce-attributes
6373				// The `node.getAttribute` check was added for the sake of
6374				// `jQuery.globalEval` so that it can fake a nonce-containing node
6375				// via an object.
6376				val = node[ i ] || node.getAttribute && node.getAttribute( i );
6377				if ( val ) {
6378					script.setAttribute( i, val );
6379				}
6380			}
6381		}
6382		doc.head.appendChild( script ).parentNode.removeChild( script );
6383	}
6384
6385
6386function toType( obj ) {
6387	if ( obj == null ) {
6388		return obj + "";
6389	}
6390
6391	// Support: Android <=2.3 only (functionish RegExp)
6392	return typeof obj === "object" || typeof obj === "function" ?
6393		class2type[ toString.call( obj ) ] || "object" :
6394		typeof obj;
6395}
6396/* global Symbol */
6397// Defining this global in .eslintrc.json would create a danger of using the global
6398// unguarded in another place, it seems safer to define global only for this module
6399
6400
6401
6402var
6403	version = "3.6.0",
6404
6405	// Define a local copy of jQuery
6406	jQuery = function( selector, context ) {
6407
6408		// The jQuery object is actually just the init constructor 'enhanced'
6409		// Need init if jQuery is called (just allow error to be thrown if not included)
6410		return new jQuery.fn.init( selector, context );
6411	};
6412
6413jQuery.fn = jQuery.prototype = {
6414
6415	// The current version of jQuery being used
6416	jquery: version,
6417
6418	constructor: jQuery,
6419
6420	// The default length of a jQuery object is 0
6421	length: 0,
6422
6423	toArray: function() {
6424		return slice.call( this );
6425	},
6426
6427	// Get the Nth element in the matched element set OR
6428	// Get the whole matched element set as a clean array
6429	get: function( num ) {
6430
6431		// Return all the elements in a clean array
6432		if ( num == null ) {
6433			return slice.call( this );
6434		}
6435
6436		// Return just the one element from the set
6437		return num < 0 ? this[ num + this.length ] : this[ num ];
6438	},
6439
6440	// Take an array of elements and push it onto the stack
6441	// (returning the new matched element set)
6442	pushStack: function( elems ) {
6443
6444		// Build a new jQuery matched element set
6445		var ret = jQuery.merge( this.constructor(), elems );
6446
6447		// Add the old object onto the stack (as a reference)
6448		ret.prevObject = this;
6449
6450		// Return the newly-formed element set
6451		return ret;
6452	},
6453
6454	// Execute a callback for every element in the matched set.
6455	each: function( callback ) {
6456		return jQuery.each( this, callback );
6457	},
6458
6459	map: function( callback ) {
6460		return this.pushStack( jQuery.map( this, function( elem, i ) {
6461			return callback.call( elem, i, elem );
6462		} ) );
6463	},
6464
6465	slice: function() {
6466		return this.pushStack( slice.apply( this, arguments ) );
6467	},
6468
6469	first: function() {
6470		return this.eq( 0 );
6471	},
6472
6473	last: function() {
6474		return this.eq( -1 );
6475	},
6476
6477	even: function() {
6478		return this.pushStack( jQuery.grep( this, function( _elem, i ) {
6479			return ( i + 1 ) % 2;
6480		} ) );
6481	},
6482
6483	odd: function() {
6484		return this.pushStack( jQuery.grep( this, function( _elem, i ) {
6485			return i % 2;
6486		} ) );
6487	},
6488
6489	eq: function( i ) {
6490		var len = this.length,
6491			j = +i + ( i < 0 ? len : 0 );
6492		return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );
6493	},
6494
6495	end: function() {
6496		return this.prevObject || this.constructor();
6497	},
6498
6499	// For internal use only.
6500	// Behaves like an Array's method, not like a jQuery method.
6501	push: push,
6502	sort: arr.sort,
6503	splice: arr.splice
6504};
6505
6506jQuery.extend = jQuery.fn.extend = function() {
6507	var options, name, src, copy, copyIsArray, clone,
6508		target = arguments[ 0 ] || {},
6509		i = 1,
6510		length = arguments.length,
6511		deep = false;
6512
6513	// Handle a deep copy situation
6514	if ( typeof target === "boolean" ) {
6515		deep = target;
6516
6517		// Skip the boolean and the target
6518		target = arguments[ i ] || {};
6519		i++;
6520	}
6521
6522	// Handle case when target is a string or something (possible in deep copy)
6523	if ( typeof target !== "object" && !isFunction( target ) ) {
6524		target = {};
6525	}
6526
6527	// Extend jQuery itself if only one argument is passed
6528	if ( i === length ) {
6529		target = this;
6530		i--;
6531	}
6532
6533	for ( ; i < length; i++ ) {
6534
6535		// Only deal with non-null/undefined values
6536		if ( ( options = arguments[ i ] ) != null ) {
6537
6538			// Extend the base object
6539			for ( name in options ) {
6540				copy = options[ name ];
6541
6542				// Prevent Object.prototype pollution
6543				// Prevent never-ending loop
6544				if ( name === "__proto__" || target === copy ) {
6545					continue;
6546				}
6547
6548				// Recurse if we're merging plain objects or arrays
6549				if ( deep && copy && ( jQuery.isPlainObject( copy ) ||
6550					( copyIsArray = Array.isArray( copy ) ) ) ) {
6551					src = target[ name ];
6552
6553					// Ensure proper type for the source value
6554					if ( copyIsArray && !Array.isArray( src ) ) {
6555						clone = [];
6556					} else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) {
6557						clone = {};
6558					} else {
6559						clone = src;
6560					}
6561					copyIsArray = false;
6562
6563					// Never move original objects, clone them
6564					target[ name ] = jQuery.extend( deep, clone, copy );
6565
6566				// Don't bring in undefined values
6567				} else if ( copy !== undefined ) {
6568					target[ name ] = copy;
6569				}
6570			}
6571		}
6572	}
6573
6574	// Return the modified object
6575	return target;
6576};
6577
6578jQuery.extend( {
6579
6580	// Unique for each copy of jQuery on the page
6581	expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
6582
6583	// Assume jQuery is ready without the ready module
6584	isReady: true,
6585
6586	error: function( msg ) {
6587		throw new Error( msg );
6588	},
6589
6590	noop: function() {},
6591
6592	isPlainObject: function( obj ) {
6593		var proto, Ctor;
6594
6595		// Detect obvious negatives
6596		// Use toString instead of jQuery.type to catch host objects
6597		if ( !obj || toString.call( obj ) !== "[object Object]" ) {
6598			return false;
6599		}
6600
6601		proto = getProto( obj );
6602
6603		// Objects with no prototype (e.g., `Object.create( null )`) are plain
6604		if ( !proto ) {
6605			return true;
6606		}
6607
6608		// Objects with prototype are plain iff they were constructed by a global Object function
6609		Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor;
6610		return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString;
6611	},
6612
6613	isEmptyObject: function( obj ) {
6614		var name;
6615
6616		for ( name in obj ) {
6617			return false;
6618		}
6619		return true;
6620	},
6621
6622	// Evaluates a script in a provided context; falls back to the global one
6623	// if not specified.
6624	globalEval: function( code, options, doc ) {
6625		DOMEval( code, { nonce: options && options.nonce }, doc );
6626	},
6627
6628	each: function( obj, callback ) {
6629		var length, i = 0;
6630
6631		if ( isArrayLike( obj ) ) {
6632			length = obj.length;
6633			for ( ; i < length; i++ ) {
6634				if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
6635					break;
6636				}
6637			}
6638		} else {
6639			for ( i in obj ) {
6640				if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
6641					break;
6642				}
6643			}
6644		}
6645
6646		return obj;
6647	},
6648
6649	// results is for internal usage only
6650	makeArray: function( arr, results ) {
6651		var ret = results || [];
6652
6653		if ( arr != null ) {
6654			if ( isArrayLike( Object( arr ) ) ) {
6655				jQuery.merge( ret,
6656					typeof arr === "string" ?
6657						[ arr ] : arr
6658				);
6659			} else {
6660				push.call( ret, arr );
6661			}
6662		}
6663
6664		return ret;
6665	},
6666
6667	inArray: function( elem, arr, i ) {
6668		return arr == null ? -1 : indexOf.call( arr, elem, i );
6669	},
6670
6671	// Support: Android <=4.0 only, PhantomJS 1 only
6672	// push.apply(_, arraylike) throws on ancient WebKit
6673	merge: function( first, second ) {
6674		var len = +second.length,
6675			j = 0,
6676			i = first.length;
6677
6678		for ( ; j < len; j++ ) {
6679			first[ i++ ] = second[ j ];
6680		}
6681
6682		first.length = i;
6683
6684		return first;
6685	},
6686
6687	grep: function( elems, callback, invert ) {
6688		var callbackInverse,
6689			matches = [],
6690			i = 0,
6691			length = elems.length,
6692			callbackExpect = !invert;
6693
6694		// Go through the array, only saving the items
6695		// that pass the validator function
6696		for ( ; i < length; i++ ) {
6697			callbackInverse = !callback( elems[ i ], i );
6698			if ( callbackInverse !== callbackExpect ) {
6699				matches.push( elems[ i ] );
6700			}
6701		}
6702
6703		return matches;
6704	},
6705
6706	// arg is for internal usage only
6707	map: function( elems, callback, arg ) {
6708		var length, value,
6709			i = 0,
6710			ret = [];
6711
6712		// Go through the array, translating each of the items to their new values
6713		if ( isArrayLike( elems ) ) {
6714			length = elems.length;
6715			for ( ; i < length; i++ ) {
6716				value = callback( elems[ i ], i, arg );
6717
6718				if ( value != null ) {
6719					ret.push( value );
6720				}
6721			}
6722
6723		// Go through every key on the object,
6724		} else {
6725			for ( i in elems ) {
6726				value = callback( elems[ i ], i, arg );
6727
6728				if ( value != null ) {
6729					ret.push( value );
6730				}
6731			}
6732		}
6733
6734		// Flatten any nested arrays
6735		return flat( ret );
6736	},
6737
6738	// A global GUID counter for objects
6739	guid: 1,
6740
6741	// jQuery.support is not used in Core but other projects attach their
6742	// properties to it so it needs to exist.
6743	support: support
6744} );
6745
6746if ( typeof Symbol === "function" ) {
6747	jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];
6748}
6749
6750// Populate the class2type map
6751jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
6752	function( _i, name ) {
6753		class2type[ "[object " + name + "]" ] = name.toLowerCase();
6754	} );
6755
6756function isArrayLike( obj ) {
6757
6758	// Support: real iOS 8.2 only (not reproducible in simulator)
6759	// `in` check used to prevent JIT error (gh-2145)
6760	// hasOwn isn't used here due to false negatives
6761	// regarding Nodelist length in IE
6762	var length = !!obj && "length" in obj && obj.length,
6763		type = toType( obj );
6764
6765	if ( isFunction( obj ) || isWindow( obj ) ) {
6766		return false;
6767	}
6768
6769	return type === "array" || length === 0 ||
6770		typeof length === "number" && length > 0 && ( length - 1 ) in obj;
6771}
6772var Sizzle =
6773/*!
6774 * Sizzle CSS Selector Engine v2.3.6
6775 * https://sizzlejs.com/
6776 *
6777 * Copyright JS Foundation and other contributors
6778 * Released under the MIT license
6779 * https://js.foundation/
6780 *
6781 * Date: 2021-02-16
6782 */
6783( function( window ) {
6784var i,
6785	support,
6786	Expr,
6787	getText,
6788	isXML,
6789	tokenize,
6790	compile,
6791	select,
6792	outermostContext,
6793	sortInput,
6794	hasDuplicate,
6795
6796	// Local document vars
6797	setDocument,
6798	document,
6799	docElem,
6800	documentIsHTML,
6801	rbuggyQSA,
6802	rbuggyMatches,
6803	matches,
6804	contains,
6805
6806	// Instance-specific data
6807	expando = "sizzle" + 1 * new Date(),
6808	preferredDoc = window.document,
6809	dirruns = 0,
6810	done = 0,
6811	classCache = createCache(),
6812	tokenCache = createCache(),
6813	compilerCache = createCache(),
6814	nonnativeSelectorCache = createCache(),
6815	sortOrder = function( a, b ) {
6816		if ( a === b ) {
6817			hasDuplicate = true;
6818		}
6819		return 0;
6820	},
6821
6822	// Instance methods
6823	hasOwn = ( {} ).hasOwnProperty,
6824	arr = [],
6825	pop = arr.pop,
6826	pushNative = arr.push,
6827	push = arr.push,
6828	slice = arr.slice,
6829
6830	// Use a stripped-down indexOf as it's faster than native
6831	// https://jsperf.com/thor-indexof-vs-for/5
6832	indexOf = function( list, elem ) {
6833		var i = 0,
6834			len = list.length;
6835		for ( ; i < len; i++ ) {
6836			if ( list[ i ] === elem ) {
6837				return i;
6838			}
6839		}
6840		return -1;
6841	},
6842
6843	booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|" +
6844		"ismap|loop|multiple|open|readonly|required|scoped",
6845
6846	// Regular expressions
6847
6848	// http://www.w3.org/TR/css3-selectors/#whitespace
6849	whitespace = "[\\x20\\t\\r\\n\\f]",
6850
6851	// https://www.w3.org/TR/css-syntax-3/#ident-token-diagram
6852	identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace +
6853		"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",
6854
6855	// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
6856	attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
6857
6858		// Operator (capture 2)
6859		"*([*^$|!~]?=)" + whitespace +
6860
6861		// "Attribute values must be CSS identifiers [capture 5]
6862		// or strings [capture 3 or capture 4]"
6863		"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" +
6864		whitespace + "*\\]",
6865
6866	pseudos = ":(" + identifier + ")(?:\\((" +
6867
6868		// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
6869		// 1. quoted (capture 3; capture 4 or capture 5)
6870		"('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
6871
6872		// 2. simple (capture 6)
6873		"((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
6874
6875		// 3. anything else (capture 2)
6876		".*" +
6877		")\\)|)",
6878
6879	// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
6880	rwhitespace = new RegExp( whitespace + "+", "g" ),
6881	rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" +
6882		whitespace + "+$", "g" ),
6883
6884	rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
6885	rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace +
6886		"*" ),
6887	rdescend = new RegExp( whitespace + "|>" ),
6888
6889	rpseudo = new RegExp( pseudos ),
6890	ridentifier = new RegExp( "^" + identifier + "$" ),
6891
6892	matchExpr = {
6893		"ID": new RegExp( "^#(" + identifier + ")" ),
6894		"CLASS": new RegExp( "^\\.(" + identifier + ")" ),
6895		"TAG": new RegExp( "^(" + identifier + "|[*])" ),
6896		"ATTR": new RegExp( "^" + attributes ),
6897		"PSEUDO": new RegExp( "^" + pseudos ),
6898		"CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" +
6899			whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" +
6900			whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
6901		"bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
6902
6903		// For use in libraries implementing .is()
6904		// We use this for POS matching in `select`
6905		"needsContext": new RegExp( "^" + whitespace +
6906			"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace +
6907			"*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
6908	},
6909
6910	rhtml = /HTML$/i,
6911	rinputs = /^(?:input|select|textarea|button)$/i,
6912	rheader = /^h\d$/i,
6913
6914	rnative = /^[^{]+\{\s*\[native \w/,
6915
6916	// Easily-parseable/retrievable ID or TAG or CLASS selectors
6917	rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
6918
6919	rsibling = /[+~]/,
6920
6921	// CSS escapes
6922	// http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
6923	runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g" ),
6924	funescape = function( escape, nonHex ) {
6925		var high = "0x" + escape.slice( 1 ) - 0x10000;
6926
6927		return nonHex ?
6928
6929			// Strip the backslash prefix from a non-hex escape sequence
6930			nonHex :
6931
6932			// Replace a hexadecimal escape sequence with the encoded Unicode code point
6933			// Support: IE <=11+
6934			// For values outside the Basic Multilingual Plane (BMP), manually construct a
6935			// surrogate pair
6936			high < 0 ?
6937				String.fromCharCode( high + 0x10000 ) :
6938				String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
6939	},
6940
6941	// CSS string/identifier serialization
6942	// https://drafts.csswg.org/cssom/#common-serializing-idioms
6943	rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,
6944	fcssescape = function( ch, asCodePoint ) {
6945		if ( asCodePoint ) {
6946
6947			// U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER
6948			if ( ch === "\0" ) {
6949				return "\uFFFD";
6950			}
6951
6952			// Control characters and (dependent upon position) numbers get escaped as code points
6953			return ch.slice( 0, -1 ) + "\\" +
6954				ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " ";
6955		}
6956
6957		// Other potentially-special ASCII characters get backslash-escaped
6958		return "\\" + ch;
6959	},
6960
6961	// Used for iframes
6962	// See setDocument()
6963	// Removing the function wrapper causes a "Permission Denied"
6964	// error in IE
6965	unloadHandler = function() {
6966		setDocument();
6967	},
6968
6969	inDisabledFieldset = addCombinator(
6970		function( elem ) {
6971			return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset";
6972		},
6973		{ dir: "parentNode", next: "legend" }
6974	);
6975
6976// Optimize for push.apply( _, NodeList )
6977try {
6978	push.apply(
6979		( arr = slice.call( preferredDoc.childNodes ) ),
6980		preferredDoc.childNodes
6981	);
6982
6983	// Support: Android<4.0
6984	// Detect silently failing push.apply
6985	// eslint-disable-next-line no-unused-expressions
6986	arr[ preferredDoc.childNodes.length ].nodeType;
6987} catch ( e ) {
6988	push = { apply: arr.length ?
6989
6990		// Leverage slice if possible
6991		function( target, els ) {
6992			pushNative.apply( target, slice.call( els ) );
6993		} :
6994
6995		// Support: IE<9
6996		// Otherwise append directly
6997		function( target, els ) {
6998			var j = target.length,
6999				i = 0;
7000
7001			// Can't trust NodeList.length
7002			while ( ( target[ j++ ] = els[ i++ ] ) ) {}
7003			target.length = j - 1;
7004		}
7005	};
7006}
7007
7008function Sizzle( selector, context, results, seed ) {
7009	var m, i, elem, nid, match, groups, newSelector,
7010		newContext = context && context.ownerDocument,
7011
7012		// nodeType defaults to 9, since context defaults to document
7013		nodeType = context ? context.nodeType : 9;
7014
7015	results = results || [];
7016
7017	// Return early from calls with invalid selector or context
7018	if ( typeof selector !== "string" || !selector ||
7019		nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {
7020
7021		return results;
7022	}
7023
7024	// Try to shortcut find operations (as opposed to filters) in HTML documents
7025	if ( !seed ) {
7026		setDocument( context );
7027		context = context || document;
7028
7029		if ( documentIsHTML ) {
7030
7031			// If the selector is sufficiently simple, try using a "get*By*" DOM method
7032			// (excepting DocumentFragment context, where the methods don't exist)
7033			if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) {
7034
7035				// ID selector
7036				if ( ( m = match[ 1 ] ) ) {
7037
7038					// Document context
7039					if ( nodeType === 9 ) {
7040						if ( ( elem = context.getElementById( m ) ) ) {
7041
7042							// Support: IE, Opera, Webkit
7043							// TODO: identify versions
7044							// getElementById can match elements by name instead of ID
7045							if ( elem.id === m ) {
7046								results.push( elem );
7047								return results;
7048							}
7049						} else {
7050							return results;
7051						}
7052
7053					// Element context
7054					} else {
7055
7056						// Support: IE, Opera, Webkit
7057						// TODO: identify versions
7058						// getElementById can match elements by name instead of ID
7059						if ( newContext && ( elem = newContext.getElementById( m ) ) &&
7060							contains( context, elem ) &&
7061							elem.id === m ) {
7062
7063							results.push( elem );
7064							return results;
7065						}
7066					}
7067
7068				// Type selector
7069				} else if ( match[ 2 ] ) {
7070					push.apply( results, context.getElementsByTagName( selector ) );
7071					return results;
7072
7073				// Class selector
7074				} else if ( ( m = match[ 3 ] ) && support.getElementsByClassName &&
7075					context.getElementsByClassName ) {
7076
7077					push.apply( results, context.getElementsByClassName( m ) );
7078					return results;
7079				}
7080			}
7081
7082			// Take advantage of querySelectorAll
7083			if ( support.qsa &&
7084				!nonnativeSelectorCache[ selector + " " ] &&
7085				( !rbuggyQSA || !rbuggyQSA.test( selector ) ) &&
7086
7087				// Support: IE 8 only
7088				// Exclude object elements
7089				( nodeType !== 1 || context.nodeName.toLowerCase() !== "object" ) ) {
7090
7091				newSelector = selector;
7092				newContext = context;
7093
7094				// qSA considers elements outside a scoping root when evaluating child or
7095				// descendant combinators, which is not what we want.
7096				// In such cases, we work around the behavior by prefixing every selector in the
7097				// list with an ID selector referencing the scope context.
7098				// The technique has to be used as well when a leading combinator is used
7099				// as such selectors are not recognized by querySelectorAll.
7100				// Thanks to Andrew Dupont for this technique.
7101				if ( nodeType === 1 &&
7102					( rdescend.test( selector ) || rcombinators.test( selector ) ) ) {
7103
7104					// Expand context for sibling selectors
7105					newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
7106						context;
7107
7108					// We can use :scope instead of the ID hack if the browser
7109					// supports it & if we're not changing the context.
7110					if ( newContext !== context || !support.scope ) {
7111
7112						// Capture the context ID, setting it first if necessary
7113						if ( ( nid = context.getAttribute( "id" ) ) ) {
7114							nid = nid.replace( rcssescape, fcssescape );
7115						} else {
7116							context.setAttribute( "id", ( nid = expando ) );
7117						}
7118					}
7119
7120					// Prefix every selector in the list
7121					groups = tokenize( selector );
7122					i = groups.length;
7123					while ( i-- ) {
7124						groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " +
7125							toSelector( groups[ i ] );
7126					}
7127					newSelector = groups.join( "," );
7128				}
7129
7130				try {
7131					push.apply( results,
7132						newContext.querySelectorAll( newSelector )
7133					);
7134					return results;
7135				} catch ( qsaError ) {
7136					nonnativeSelectorCache( selector, true );
7137				} finally {
7138					if ( nid === expando ) {
7139						context.removeAttribute( "id" );
7140					}
7141				}
7142			}
7143		}
7144	}
7145
7146	// All others
7147	return select( selector.replace( rtrim, "$1" ), context, results, seed );
7148}
7149
7150/**
7151 * Create key-value caches of limited size
7152 * @returns {function(string, object)} Returns the Object data after storing it on itself with
7153 *	property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
7154 *	deleting the oldest entry
7155 */
7156function createCache() {
7157	var keys = [];
7158
7159	function cache( key, value ) {
7160
7161		// Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
7162		if ( keys.push( key + " " ) > Expr.cacheLength ) {
7163
7164			// Only keep the most recent entries
7165			delete cache[ keys.shift() ];
7166		}
7167		return ( cache[ key + " " ] = value );
7168	}
7169	return cache;
7170}
7171
7172/**
7173 * Mark a function for special use by Sizzle
7174 * @param {Function} fn The function to mark
7175 */
7176function markFunction( fn ) {
7177	fn[ expando ] = true;
7178	return fn;
7179}
7180
7181/**
7182 * Support testing using an element
7183 * @param {Function} fn Passed the created element and returns a boolean result
7184 */
7185function assert( fn ) {
7186	var el = document.createElement( "fieldset" );
7187
7188	try {
7189		return !!fn( el );
7190	} catch ( e ) {
7191		return false;
7192	} finally {
7193
7194		// Remove from its parent by default
7195		if ( el.parentNode ) {
7196			el.parentNode.removeChild( el );
7197		}
7198
7199		// release memory in IE
7200		el = null;
7201	}
7202}
7203
7204/**
7205 * Adds the same handler for all of the specified attrs
7206 * @param {String} attrs Pipe-separated list of attributes
7207 * @param {Function} handler The method that will be applied
7208 */
7209function addHandle( attrs, handler ) {
7210	var arr = attrs.split( "|" ),
7211		i = arr.length;
7212
7213	while ( i-- ) {
7214		Expr.attrHandle[ arr[ i ] ] = handler;
7215	}
7216}
7217
7218/**
7219 * Checks document order of two siblings
7220 * @param {Element} a
7221 * @param {Element} b
7222 * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
7223 */
7224function siblingCheck( a, b ) {
7225	var cur = b && a,
7226		diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
7227			a.sourceIndex - b.sourceIndex;
7228
7229	// Use IE sourceIndex if available on both nodes
7230	if ( diff ) {
7231		return diff;
7232	}
7233
7234	// Check if b follows a
7235	if ( cur ) {
7236		while ( ( cur = cur.nextSibling ) ) {
7237			if ( cur === b ) {
7238				return -1;
7239			}
7240		}
7241	}
7242
7243	return a ? 1 : -1;
7244}
7245
7246/**
7247 * Returns a function to use in pseudos for input types
7248 * @param {String} type
7249 */
7250function createInputPseudo( type ) {
7251	return function( elem ) {
7252		var name = elem.nodeName.toLowerCase();
7253		return name === "input" && elem.type === type;
7254	};
7255}
7256
7257/**
7258 * Returns a function to use in pseudos for buttons
7259 * @param {String} type
7260 */
7261function createButtonPseudo( type ) {
7262	return function( elem ) {
7263		var name = elem.nodeName.toLowerCase();
7264		return ( name === "input" || name === "button" ) && elem.type === type;
7265	};
7266}
7267
7268/**
7269 * Returns a function to use in pseudos for :enabled/:disabled
7270 * @param {Boolean} disabled true for :disabled; false for :enabled
7271 */
7272function createDisabledPseudo( disabled ) {
7273
7274	// Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable
7275	return function( elem ) {
7276
7277		// Only certain elements can match :enabled or :disabled
7278		// https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled
7279		// https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled
7280		if ( "form" in elem ) {
7281
7282			// Check for inherited disabledness on relevant non-disabled elements:
7283			// * listed form-associated elements in a disabled fieldset
7284			//   https://html.spec.whatwg.org/multipage/forms.html#category-listed
7285			//   https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled
7286			// * option elements in a disabled optgroup
7287			//   https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled
7288			// All such elements have a "form" property.
7289			if ( elem.parentNode && elem.disabled === false ) {
7290
7291				// Option elements defer to a parent optgroup if present
7292				if ( "label" in elem ) {
7293					if ( "label" in elem.parentNode ) {
7294						return elem.parentNode.disabled === disabled;
7295					} else {
7296						return elem.disabled === disabled;
7297					}
7298				}
7299
7300				// Support: IE 6 - 11
7301				// Use the isDisabled shortcut property to check for disabled fieldset ancestors
7302				return elem.isDisabled === disabled ||
7303
7304					// Where there is no isDisabled, check manually
7305					/* jshint -W018 */
7306					elem.isDisabled !== !disabled &&
7307					inDisabledFieldset( elem ) === disabled;
7308			}
7309
7310			return elem.disabled === disabled;
7311
7312		// Try to winnow out elements that can't be disabled before trusting the disabled property.
7313		// Some victims get caught in our net (label, legend, menu, track), but it shouldn't
7314		// even exist on them, let alone have a boolean value.
7315		} else if ( "label" in elem ) {
7316			return elem.disabled === disabled;
7317		}
7318
7319		// Remaining elements are neither :enabled nor :disabled
7320		return false;
7321	};
7322}
7323
7324/**
7325 * Returns a function to use in pseudos for positionals
7326 * @param {Function} fn
7327 */
7328function createPositionalPseudo( fn ) {
7329	return markFunction( function( argument ) {
7330		argument = +argument;
7331		return markFunction( function( seed, matches ) {
7332			var j,
7333				matchIndexes = fn( [], seed.length, argument ),
7334				i = matchIndexes.length;
7335
7336			// Match elements found at the specified indexes
7337			while ( i-- ) {
7338				if ( seed[ ( j = matchIndexes[ i ] ) ] ) {
7339					seed[ j ] = !( matches[ j ] = seed[ j ] );
7340				}
7341			}
7342		} );
7343	} );
7344}
7345
7346/**
7347 * Checks a node for validity as a Sizzle context
7348 * @param {Element|Object=} context
7349 * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
7350 */
7351function testContext( context ) {
7352	return context && typeof context.getElementsByTagName !== "undefined" && context;
7353}
7354
7355// Expose support vars for convenience
7356support = Sizzle.support = {};
7357
7358/**
7359 * Detects XML nodes
7360 * @param {Element|Object} elem An element or a document
7361 * @returns {Boolean} True iff elem is a non-HTML XML node
7362 */
7363isXML = Sizzle.isXML = function( elem ) {
7364	var namespace = elem && elem.namespaceURI,
7365		docElem = elem && ( elem.ownerDocument || elem ).documentElement;
7366
7367	// Support: IE <=8
7368	// Assume HTML when documentElement doesn't yet exist, such as inside loading iframes
7369	// https://bugs.jquery.com/ticket/4833
7370	return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" );
7371};
7372
7373/**
7374 * Sets document-related variables once based on the current document
7375 * @param {Element|Object} [doc] An element or document object to use to set the document
7376 * @returns {Object} Returns the current document
7377 */
7378setDocument = Sizzle.setDocument = function( node ) {
7379	var hasCompare, subWindow,
7380		doc = node ? node.ownerDocument || node : preferredDoc;
7381
7382	// Return early if doc is invalid or already selected
7383	// Support: IE 11+, Edge 17 - 18+
7384	// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
7385	// two documents; shallow comparisons work.
7386	// eslint-disable-next-line eqeqeq
7387	if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) {
7388		return document;
7389	}
7390
7391	// Update global variables
7392	document = doc;
7393	docElem = document.documentElement;
7394	documentIsHTML = !isXML( document );
7395
7396	// Support: IE 9 - 11+, Edge 12 - 18+
7397	// Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
7398	// Support: IE 11+, Edge 17 - 18+
7399	// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
7400	// two documents; shallow comparisons work.
7401	// eslint-disable-next-line eqeqeq
7402	if ( preferredDoc != document &&
7403		( subWindow = document.defaultView ) && subWindow.top !== subWindow ) {
7404
7405		// Support: IE 11, Edge
7406		if ( subWindow.addEventListener ) {
7407			subWindow.addEventListener( "unload", unloadHandler, false );
7408
7409		// Support: IE 9 - 10 only
7410		} else if ( subWindow.attachEvent ) {
7411			subWindow.attachEvent( "onunload", unloadHandler );
7412		}
7413	}
7414
7415	// Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only,
7416	// Safari 4 - 5 only, Opera <=11.6 - 12.x only
7417	// IE/Edge & older browsers don't support the :scope pseudo-class.
7418	// Support: Safari 6.0 only
7419	// Safari 6.0 supports :scope but it's an alias of :root there.
7420	support.scope = assert( function( el ) {
7421		docElem.appendChild( el ).appendChild( document.createElement( "div" ) );
7422		return typeof el.querySelectorAll !== "undefined" &&
7423			!el.querySelectorAll( ":scope fieldset div" ).length;
7424	} );
7425
7426	/* Attributes
7427	---------------------------------------------------------------------- */
7428
7429	// Support: IE<8
7430	// Verify that getAttribute really returns attributes and not properties
7431	// (excepting IE8 booleans)
7432	support.attributes = assert( function( el ) {
7433		el.className = "i";
7434		return !el.getAttribute( "className" );
7435	} );
7436
7437	/* getElement(s)By*
7438	---------------------------------------------------------------------- */
7439
7440	// Check if getElementsByTagName("*") returns only elements
7441	support.getElementsByTagName = assert( function( el ) {
7442		el.appendChild( document.createComment( "" ) );
7443		return !el.getElementsByTagName( "*" ).length;
7444	} );
7445
7446	// Support: IE<9
7447	support.getElementsByClassName = rnative.test( document.getElementsByClassName );
7448
7449	// Support: IE<10
7450	// Check if getElementById returns elements by name
7451	// The broken getElementById methods don't pick up programmatically-set names,
7452	// so use a roundabout getElementsByName test
7453	support.getById = assert( function( el ) {
7454		docElem.appendChild( el ).id = expando;
7455		return !document.getElementsByName || !document.getElementsByName( expando ).length;
7456	} );
7457
7458	// ID filter and find
7459	if ( support.getById ) {
7460		Expr.filter[ "ID" ] = function( id ) {
7461			var attrId = id.replace( runescape, funescape );
7462			return function( elem ) {
7463				return elem.getAttribute( "id" ) === attrId;
7464			};
7465		};
7466		Expr.find[ "ID" ] = function( id, context ) {
7467			if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
7468				var elem = context.getElementById( id );
7469				return elem ? [ elem ] : [];
7470			}
7471		};
7472	} else {
7473		Expr.filter[ "ID" ] =  function( id ) {
7474			var attrId = id.replace( runescape, funescape );
7475			return function( elem ) {
7476				var node = typeof elem.getAttributeNode !== "undefined" &&
7477					elem.getAttributeNode( "id" );
7478				return node && node.value === attrId;
7479			};
7480		};
7481
7482		// Support: IE 6 - 7 only
7483		// getElementById is not reliable as a find shortcut
7484		Expr.find[ "ID" ] = function( id, context ) {
7485			if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
7486				var node, i, elems,
7487					elem = context.getElementById( id );
7488
7489				if ( elem ) {
7490
7491					// Verify the id attribute
7492					node = elem.getAttributeNode( "id" );
7493					if ( node && node.value === id ) {
7494						return [ elem ];
7495					}
7496
7497					// Fall back on getElementsByName
7498					elems = context.getElementsByName( id );
7499					i = 0;
7500					while ( ( elem = elems[ i++ ] ) ) {
7501						node = elem.getAttributeNode( "id" );
7502						if ( node && node.value === id ) {
7503							return [ elem ];
7504						}
7505					}
7506				}
7507
7508				return [];
7509			}
7510		};
7511	}
7512
7513	// Tag
7514	Expr.find[ "TAG" ] = support.getElementsByTagName ?
7515		function( tag, context ) {
7516			if ( typeof context.getElementsByTagName !== "undefined" ) {
7517				return context.getElementsByTagName( tag );
7518
7519			// DocumentFragment nodes don't have gEBTN
7520			} else if ( support.qsa ) {
7521				return context.querySelectorAll( tag );
7522			}
7523		} :
7524
7525		function( tag, context ) {
7526			var elem,
7527				tmp = [],
7528				i = 0,
7529
7530				// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
7531				results = context.getElementsByTagName( tag );
7532
7533			// Filter out possible comments
7534			if ( tag === "*" ) {
7535				while ( ( elem = results[ i++ ] ) ) {
7536					if ( elem.nodeType === 1 ) {
7537						tmp.push( elem );
7538					}
7539				}
7540
7541				return tmp;
7542			}
7543			return results;
7544		};
7545
7546	// Class
7547	Expr.find[ "CLASS" ] = support.getElementsByClassName && function( className, context ) {
7548		if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) {
7549			return context.getElementsByClassName( className );
7550		}
7551	};
7552
7553	/* QSA/matchesSelector
7554	---------------------------------------------------------------------- */
7555
7556	// QSA and matchesSelector support
7557
7558	// matchesSelector(:active) reports false when true (IE9/Opera 11.5)
7559	rbuggyMatches = [];
7560
7561	// qSa(:focus) reports false when true (Chrome 21)
7562	// We allow this because of a bug in IE8/9 that throws an error
7563	// whenever `document.activeElement` is accessed on an iframe
7564	// So, we allow :focus to pass through QSA all the time to avoid the IE error
7565	// See https://bugs.jquery.com/ticket/13378
7566	rbuggyQSA = [];
7567
7568	if ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) {
7569
7570		// Build QSA regex
7571		// Regex strategy adopted from Diego Perini
7572		assert( function( el ) {
7573
7574			var input;
7575
7576			// Select is set to empty string on purpose
7577			// This is to test IE's treatment of not explicitly
7578			// setting a boolean content attribute,
7579			// since its presence should be enough
7580			// https://bugs.jquery.com/ticket/12359
7581			docElem.appendChild( el ).innerHTML = "<a id='" + expando + "'></a>" +
7582				"<select id='" + expando + "-\r\\' msallowcapture=''>" +
7583				"<option selected=''></option></select>";
7584
7585			// Support: IE8, Opera 11-12.16
7586			// Nothing should be selected when empty strings follow ^= or $= or *=
7587			// The test attribute must be unknown in Opera but "safe" for WinRT
7588			// https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
7589			if ( el.querySelectorAll( "[msallowcapture^='']" ).length ) {
7590				rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
7591			}
7592
7593			// Support: IE8
7594			// Boolean attributes and "value" are not treated correctly
7595			if ( !el.querySelectorAll( "[selected]" ).length ) {
7596				rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
7597			}
7598
7599			// Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+
7600			if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
7601				rbuggyQSA.push( "~=" );
7602			}
7603
7604			// Support: IE 11+, Edge 15 - 18+
7605			// IE 11/Edge don't find elements on a `[name='']` query in some cases.
7606			// Adding a temporary attribute to the document before the selection works
7607			// around the issue.
7608			// Interestingly, IE 10 & older don't seem to have the issue.
7609			input = document.createElement( "input" );
7610			input.setAttribute( "name", "" );
7611			el.appendChild( input );
7612			if ( !el.querySelectorAll( "[name='']" ).length ) {
7613				rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" +
7614					whitespace + "*(?:''|\"\")" );
7615			}
7616
7617			// Webkit/Opera - :checked should return selected option elements
7618			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
7619			// IE8 throws error here and will not see later tests
7620			if ( !el.querySelectorAll( ":checked" ).length ) {
7621				rbuggyQSA.push( ":checked" );
7622			}
7623
7624			// Support: Safari 8+, iOS 8+
7625			// https://bugs.webkit.org/show_bug.cgi?id=136851
7626			// In-page `selector#id sibling-combinator selector` fails
7627			if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) {
7628				rbuggyQSA.push( ".#.+[+~]" );
7629			}
7630
7631			// Support: Firefox <=3.6 - 5 only
7632			// Old Firefox doesn't throw on a badly-escaped identifier.
7633			el.querySelectorAll( "\\\f" );
7634			rbuggyQSA.push( "[\\r\\n\\f]" );
7635		} );
7636
7637		assert( function( el ) {
7638			el.innerHTML = "<a href='' disabled='disabled'></a>" +
7639				"<select disabled='disabled'><option/></select>";
7640
7641			// Support: Windows 8 Native Apps
7642			// The type and name attributes are restricted during .innerHTML assignment
7643			var input = document.createElement( "input" );
7644			input.setAttribute( "type", "hidden" );
7645			el.appendChild( input ).setAttribute( "name", "D" );
7646
7647			// Support: IE8
7648			// Enforce case-sensitivity of name attribute
7649			if ( el.querySelectorAll( "[name=d]" ).length ) {
7650				rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
7651			}
7652
7653			// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
7654			// IE8 throws error here and will not see later tests
7655			if ( el.querySelectorAll( ":enabled" ).length !== 2 ) {
7656				rbuggyQSA.push( ":enabled", ":disabled" );
7657			}
7658
7659			// Support: IE9-11+
7660			// IE's :disabled selector does not pick up the children of disabled fieldsets
7661			docElem.appendChild( el ).disabled = true;
7662			if ( el.querySelectorAll( ":disabled" ).length !== 2 ) {
7663				rbuggyQSA.push( ":enabled", ":disabled" );
7664			}
7665
7666			// Support: Opera 10 - 11 only
7667			// Opera 10-11 does not throw on post-comma invalid pseudos
7668			el.querySelectorAll( "*,:x" );
7669			rbuggyQSA.push( ",.*:" );
7670		} );
7671	}
7672
7673	if ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches ||
7674		docElem.webkitMatchesSelector ||
7675		docElem.mozMatchesSelector ||
7676		docElem.oMatchesSelector ||
7677		docElem.msMatchesSelector ) ) ) ) {
7678
7679		assert( function( el ) {
7680
7681			// Check to see if it's possible to do matchesSelector
7682			// on a disconnected node (IE 9)
7683			support.disconnectedMatch = matches.call( el, "*" );
7684
7685			// This should fail with an exception
7686			// Gecko does not error, returns false instead
7687			matches.call( el, "[s!='']:x" );
7688			rbuggyMatches.push( "!=", pseudos );
7689		} );
7690	}
7691
7692	rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) );
7693	rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( "|" ) );
7694
7695	/* Contains
7696	---------------------------------------------------------------------- */
7697	hasCompare = rnative.test( docElem.compareDocumentPosition );
7698
7699	// Element contains another
7700	// Purposefully self-exclusive
7701	// As in, an element does not contain itself
7702	contains = hasCompare || rnative.test( docElem.contains ) ?
7703		function( a, b ) {
7704			var adown = a.nodeType === 9 ? a.documentElement : a,
7705				bup = b && b.parentNode;
7706			return a === bup || !!( bup && bup.nodeType === 1 && (
7707				adown.contains ?
7708					adown.contains( bup ) :
7709					a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
7710			) );
7711		} :
7712		function( a, b ) {
7713			if ( b ) {
7714				while ( ( b = b.parentNode ) ) {
7715					if ( b === a ) {
7716						return true;
7717					}
7718				}
7719			}
7720			return false;
7721		};
7722
7723	/* Sorting
7724	---------------------------------------------------------------------- */
7725
7726	// Document order sorting
7727	sortOrder = hasCompare ?
7728	function( a, b ) {
7729
7730		// Flag for duplicate removal
7731		if ( a === b ) {
7732			hasDuplicate = true;
7733			return 0;
7734		}
7735
7736		// Sort on method existence if only one input has compareDocumentPosition
7737		var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
7738		if ( compare ) {
7739			return compare;
7740		}
7741
7742		// Calculate position if both inputs belong to the same document
7743		// Support: IE 11+, Edge 17 - 18+
7744		// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
7745		// two documents; shallow comparisons work.
7746		// eslint-disable-next-line eqeqeq
7747		compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ?
7748			a.compareDocumentPosition( b ) :
7749
7750			// Otherwise we know they are disconnected
7751			1;
7752
7753		// Disconnected nodes
7754		if ( compare & 1 ||
7755			( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) {
7756
7757			// Choose the first element that is related to our preferred document
7758			// Support: IE 11+, Edge 17 - 18+
7759			// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
7760			// two documents; shallow comparisons work.
7761			// eslint-disable-next-line eqeqeq
7762			if ( a == document || a.ownerDocument == preferredDoc &&
7763				contains( preferredDoc, a ) ) {
7764				return -1;
7765			}
7766
7767			// Support: IE 11+, Edge 17 - 18+
7768			// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
7769			// two documents; shallow comparisons work.
7770			// eslint-disable-next-line eqeqeq
7771			if ( b == document || b.ownerDocument == preferredDoc &&
7772				contains( preferredDoc, b ) ) {
7773				return 1;
7774			}
7775
7776			// Maintain original order
7777			return sortInput ?
7778				( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
7779				0;
7780		}
7781
7782		return compare & 4 ? -1 : 1;
7783	} :
7784	function( a, b ) {
7785
7786		// Exit early if the nodes are identical
7787		if ( a === b ) {
7788			hasDuplicate = true;
7789			return 0;
7790		}
7791
7792		var cur,
7793			i = 0,
7794			aup = a.parentNode,
7795			bup = b.parentNode,
7796			ap = [ a ],
7797			bp = [ b ];
7798
7799		// Parentless nodes are either documents or disconnected
7800		if ( !aup || !bup ) {
7801
7802			// Support: IE 11+, Edge 17 - 18+
7803			// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
7804			// two documents; shallow comparisons work.
7805			/* eslint-disable eqeqeq */
7806			return a == document ? -1 :
7807				b == document ? 1 :
7808				/* eslint-enable eqeqeq */
7809				aup ? -1 :
7810				bup ? 1 :
7811				sortInput ?
7812				( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
7813				0;
7814
7815		// If the nodes are siblings, we can do a quick check
7816		} else if ( aup === bup ) {
7817			return siblingCheck( a, b );
7818		}
7819
7820		// Otherwise we need full lists of their ancestors for comparison
7821		cur = a;
7822		while ( ( cur = cur.parentNode ) ) {
7823			ap.unshift( cur );
7824		}
7825		cur = b;
7826		while ( ( cur = cur.parentNode ) ) {
7827			bp.unshift( cur );
7828		}
7829
7830		// Walk down the tree looking for a discrepancy
7831		while ( ap[ i ] === bp[ i ] ) {
7832			i++;
7833		}
7834
7835		return i ?
7836
7837			// Do a sibling check if the nodes have a common ancestor
7838			siblingCheck( ap[ i ], bp[ i ] ) :
7839
7840			// Otherwise nodes in our document sort first
7841			// Support: IE 11+, Edge 17 - 18+
7842			// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
7843			// two documents; shallow comparisons work.
7844			/* eslint-disable eqeqeq */
7845			ap[ i ] == preferredDoc ? -1 :
7846			bp[ i ] == preferredDoc ? 1 :
7847			/* eslint-enable eqeqeq */
7848			0;
7849	};
7850
7851	return document;
7852};
7853
7854Sizzle.matches = function( expr, elements ) {
7855	return Sizzle( expr, null, null, elements );
7856};
7857
7858Sizzle.matchesSelector = function( elem, expr ) {
7859	setDocument( elem );
7860
7861	if ( support.matchesSelector && documentIsHTML &&
7862		!nonnativeSelectorCache[ expr + " " ] &&
7863		( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
7864		( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {
7865
7866		try {
7867			var ret = matches.call( elem, expr );
7868
7869			// IE 9's matchesSelector returns false on disconnected nodes
7870			if ( ret || support.disconnectedMatch ||
7871
7872				// As well, disconnected nodes are said to be in a document
7873				// fragment in IE 9
7874				elem.document && elem.document.nodeType !== 11 ) {
7875				return ret;
7876			}
7877		} catch ( e ) {
7878			nonnativeSelectorCache( expr, true );
7879		}
7880	}
7881
7882	return Sizzle( expr, document, null, [ elem ] ).length > 0;
7883};
7884
7885Sizzle.contains = function( context, elem ) {
7886
7887	// Set document vars if needed
7888	// Support: IE 11+, Edge 17 - 18+
7889	// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
7890	// two documents; shallow comparisons work.
7891	// eslint-disable-next-line eqeqeq
7892	if ( ( context.ownerDocument || context ) != document ) {
7893		setDocument( context );
7894	}
7895	return contains( context, elem );
7896};
7897
7898Sizzle.attr = function( elem, name ) {
7899
7900	// Set document vars if needed
7901	// Support: IE 11+, Edge 17 - 18+
7902	// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
7903	// two documents; shallow comparisons work.
7904	// eslint-disable-next-line eqeqeq
7905	if ( ( elem.ownerDocument || elem ) != document ) {
7906		setDocument( elem );
7907	}
7908
7909	var fn = Expr.attrHandle[ name.toLowerCase() ],
7910
7911		// Don't get fooled by Object.prototype properties (jQuery #13807)
7912		val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
7913			fn( elem, name, !documentIsHTML ) :
7914			undefined;
7915
7916	return val !== undefined ?
7917		val :
7918		support.attributes || !documentIsHTML ?
7919			elem.getAttribute( name ) :
7920			( val = elem.getAttributeNode( name ) ) && val.specified ?
7921				val.value :
7922				null;
7923};
7924
7925Sizzle.escape = function( sel ) {
7926	return ( sel + "" ).replace( rcssescape, fcssescape );
7927};
7928
7929Sizzle.error = function( msg ) {
7930	throw new Error( "Syntax error, unrecognized expression: " + msg );
7931};
7932
7933/**
7934 * Document sorting and removing duplicates
7935 * @param {ArrayLike} results
7936 */
7937Sizzle.uniqueSort = function( results ) {
7938	var elem,
7939		duplicates = [],
7940		j = 0,
7941		i = 0;
7942
7943	// Unless we *know* we can detect duplicates, assume their presence
7944	hasDuplicate = !support.detectDuplicates;
7945	sortInput = !support.sortStable && results.slice( 0 );
7946	results.sort( sortOrder );
7947
7948	if ( hasDuplicate ) {
7949		while ( ( elem = results[ i++ ] ) ) {
7950			if ( elem === results[ i ] ) {
7951				j = duplicates.push( i );
7952			}
7953		}
7954		while ( j-- ) {
7955			results.splice( duplicates[ j ], 1 );
7956		}
7957	}
7958
7959	// Clear input after sorting to release objects
7960	// See https://github.com/jquery/sizzle/pull/225
7961	sortInput = null;
7962
7963	return results;
7964};
7965
7966/**
7967 * Utility function for retrieving the text value of an array of DOM nodes
7968 * @param {Array|Element} elem
7969 */
7970getText = Sizzle.getText = function( elem ) {
7971	var node,
7972		ret = "",
7973		i = 0,
7974		nodeType = elem.nodeType;
7975
7976	if ( !nodeType ) {
7977
7978		// If no nodeType, this is expected to be an array
7979		while ( ( node = elem[ i++ ] ) ) {
7980
7981			// Do not traverse comment nodes
7982			ret += getText( node );
7983		}
7984	} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
7985
7986		// Use textContent for elements
7987		// innerText usage removed for consistency of new lines (jQuery #11153)
7988		if ( typeof elem.textContent === "string" ) {
7989			return elem.textContent;
7990		} else {
7991
7992			// Traverse its children
7993			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
7994				ret += getText( elem );
7995			}
7996		}
7997	} else if ( nodeType === 3 || nodeType === 4 ) {
7998		return elem.nodeValue;
7999	}
8000
8001	// Do not include comment or processing instruction nodes
8002
8003	return ret;
8004};
8005
8006Expr = Sizzle.selectors = {
8007
8008	// Can be adjusted by the user
8009	cacheLength: 50,
8010
8011	createPseudo: markFunction,
8012
8013	match: matchExpr,
8014
8015	attrHandle: {},
8016
8017	find: {},
8018
8019	relative: {
8020		">": { dir: "parentNode", first: true },
8021		" ": { dir: "parentNode" },
8022		"+": { dir: "previousSibling", first: true },
8023		"~": { dir: "previousSibling" }
8024	},
8025
8026	preFilter: {
8027		"ATTR": function( match ) {
8028			match[ 1 ] = match[ 1 ].replace( runescape, funescape );
8029
8030			// Move the given value to match[3] whether quoted or unquoted
8031			match[ 3 ] = ( match[ 3 ] || match[ 4 ] ||
8032				match[ 5 ] || "" ).replace( runescape, funescape );
8033
8034			if ( match[ 2 ] === "~=" ) {
8035				match[ 3 ] = " " + match[ 3 ] + " ";
8036			}
8037
8038			return match.slice( 0, 4 );
8039		},
8040
8041		"CHILD": function( match ) {
8042
8043			/* matches from matchExpr["CHILD"]
8044				1 type (only|nth|...)
8045				2 what (child|of-type)
8046				3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
8047				4 xn-component of xn+y argument ([+-]?\d*n|)
8048				5 sign of xn-component
8049				6 x of xn-component
8050				7 sign of y-component
8051				8 y of y-component
8052			*/
8053			match[ 1 ] = match[ 1 ].toLowerCase();
8054
8055			if ( match[ 1 ].slice( 0, 3 ) === "nth" ) {
8056
8057				// nth-* requires argument
8058				if ( !match[ 3 ] ) {
8059					Sizzle.error( match[ 0 ] );
8060				}
8061
8062				// numeric x and y parameters for Expr.filter.CHILD
8063				// remember that false/true cast respectively to 0/1
8064				match[ 4 ] = +( match[ 4 ] ?
8065					match[ 5 ] + ( match[ 6 ] || 1 ) :
8066					2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) );
8067				match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" );
8068
8069				// other types prohibit arguments
8070			} else if ( match[ 3 ] ) {
8071				Sizzle.error( match[ 0 ] );
8072			}
8073
8074			return match;
8075		},
8076
8077		"PSEUDO": function( match ) {
8078			var excess,
8079				unquoted = !match[ 6 ] && match[ 2 ];
8080
8081			if ( matchExpr[ "CHILD" ].test( match[ 0 ] ) ) {
8082				return null;
8083			}
8084
8085			// Accept quoted arguments as-is
8086			if ( match[ 3 ] ) {
8087				match[ 2 ] = match[ 4 ] || match[ 5 ] || "";
8088
8089			// Strip excess characters from unquoted arguments
8090			} else if ( unquoted && rpseudo.test( unquoted ) &&
8091
8092				// Get excess from tokenize (recursively)
8093				( excess = tokenize( unquoted, true ) ) &&
8094
8095				// advance to the next closing parenthesis
8096				( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) {
8097
8098				// excess is a negative index
8099				match[ 0 ] = match[ 0 ].slice( 0, excess );
8100				match[ 2 ] = unquoted.slice( 0, excess );
8101			}
8102
8103			// Return only captures needed by the pseudo filter method (type and argument)
8104			return match.slice( 0, 3 );
8105		}
8106	},
8107
8108	filter: {
8109
8110		"TAG": function( nodeNameSelector ) {
8111			var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
8112			return nodeNameSelector === "*" ?
8113				function() {
8114					return true;
8115				} :
8116				function( elem ) {
8117					return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
8118				};
8119		},
8120
8121		"CLASS": function( className ) {
8122			var pattern = classCache[ className + " " ];
8123
8124			return pattern ||
8125				( pattern = new RegExp( "(^|" + whitespace +
8126					")" + className + "(" + whitespace + "|$)" ) ) && classCache(
8127						className, function( elem ) {
8128							return pattern.test(
8129								typeof elem.className === "string" && elem.className ||
8130								typeof elem.getAttribute !== "undefined" &&
8131									elem.getAttribute( "class" ) ||
8132								""
8133							);
8134				} );
8135		},
8136
8137		"ATTR": function( name, operator, check ) {
8138			return function( elem ) {
8139				var result = Sizzle.attr( elem, name );
8140
8141				if ( result == null ) {
8142					return operator === "!=";
8143				}
8144				if ( !operator ) {
8145					return true;
8146				}
8147
8148				result += "";
8149
8150				/* eslint-disable max-len */
8151
8152				return operator === "=" ? result === check :
8153					operator === "!=" ? result !== check :
8154					operator === "^=" ? check && result.indexOf( check ) === 0 :
8155					operator === "*=" ? check && result.indexOf( check ) > -1 :
8156					operator === "$=" ? check && result.slice( -check.length ) === check :
8157					operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
8158					operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
8159					false;
8160				/* eslint-enable max-len */
8161
8162			};
8163		},
8164
8165		"CHILD": function( type, what, _argument, first, last ) {
8166			var simple = type.slice( 0, 3 ) !== "nth",
8167				forward = type.slice( -4 ) !== "last",
8168				ofType = what === "of-type";
8169
8170			return first === 1 && last === 0 ?
8171
8172				// Shortcut for :nth-*(n)
8173				function( elem ) {
8174					return !!elem.parentNode;
8175				} :
8176
8177				function( elem, _context, xml ) {
8178					var cache, uniqueCache, outerCache, node, nodeIndex, start,
8179						dir = simple !== forward ? "nextSibling" : "previousSibling",
8180						parent = elem.parentNode,
8181						name = ofType && elem.nodeName.toLowerCase(),
8182						useCache = !xml && !ofType,
8183						diff = false;
8184
8185					if ( parent ) {
8186
8187						// :(first|last|only)-(child|of-type)
8188						if ( simple ) {
8189							while ( dir ) {
8190								node = elem;
8191								while ( ( node = node[ dir ] ) ) {
8192									if ( ofType ?
8193										node.nodeName.toLowerCase() === name :
8194										node.nodeType === 1 ) {
8195
8196										return false;
8197									}
8198								}
8199
8200								// Reverse direction for :only-* (if we haven't yet done so)
8201								start = dir = type === "only" && !start && "nextSibling";
8202							}
8203							return true;
8204						}
8205
8206						start = [ forward ? parent.firstChild : parent.lastChild ];
8207
8208						// non-xml :nth-child(...) stores cache data on `parent`
8209						if ( forward && useCache ) {
8210
8211							// Seek `elem` from a previously-cached index
8212
8213							// ...in a gzip-friendly way
8214							node = parent;
8215							outerCache = node[ expando ] || ( node[ expando ] = {} );
8216
8217							// Support: IE <9 only
8218							// Defend against cloned attroperties (jQuery gh-1709)
8219							uniqueCache = outerCache[ node.uniqueID ] ||
8220								( outerCache[ node.uniqueID ] = {} );
8221
8222							cache = uniqueCache[ type ] || [];
8223							nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
8224							diff = nodeIndex && cache[ 2 ];
8225							node = nodeIndex && parent.childNodes[ nodeIndex ];
8226
8227							while ( ( node = ++nodeIndex && node && node[ dir ] ||
8228
8229								// Fallback to seeking `elem` from the start
8230								( diff = nodeIndex = 0 ) || start.pop() ) ) {
8231
8232								// When found, cache indexes on `parent` and break
8233								if ( node.nodeType === 1 && ++diff && node === elem ) {
8234									uniqueCache[ type ] = [ dirruns, nodeIndex, diff ];
8235									break;
8236								}
8237							}
8238
8239						} else {
8240
8241							// Use previously-cached element index if available
8242							if ( useCache ) {
8243
8244								// ...in a gzip-friendly way
8245								node = elem;
8246								outerCache = node[ expando ] || ( node[ expando ] = {} );
8247
8248								// Support: IE <9 only
8249								// Defend against cloned attroperties (jQuery gh-1709)
8250								uniqueCache = outerCache[ node.uniqueID ] ||
8251									( outerCache[ node.uniqueID ] = {} );
8252
8253								cache = uniqueCache[ type ] || [];
8254								nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
8255								diff = nodeIndex;
8256							}
8257
8258							// xml :nth-child(...)
8259							// or :nth-last-child(...) or :nth(-last)?-of-type(...)
8260							if ( diff === false ) {
8261
8262								// Use the same loop as above to seek `elem` from the start
8263								while ( ( node = ++nodeIndex && node && node[ dir ] ||
8264									( diff = nodeIndex = 0 ) || start.pop() ) ) {
8265
8266									if ( ( ofType ?
8267										node.nodeName.toLowerCase() === name :
8268										node.nodeType === 1 ) &&
8269										++diff ) {
8270
8271										// Cache the index of each encountered element
8272										if ( useCache ) {
8273											outerCache = node[ expando ] ||
8274												( node[ expando ] = {} );
8275
8276											// Support: IE <9 only
8277											// Defend against cloned attroperties (jQuery gh-1709)
8278											uniqueCache = outerCache[ node.uniqueID ] ||
8279												( outerCache[ node.uniqueID ] = {} );
8280
8281											uniqueCache[ type ] = [ dirruns, diff ];
8282										}
8283
8284										if ( node === elem ) {
8285											break;
8286										}
8287									}
8288								}
8289							}
8290						}
8291
8292						// Incorporate the offset, then check against cycle size
8293						diff -= last;
8294						return diff === first || ( diff % first === 0 && diff / first >= 0 );
8295					}
8296				};
8297		},
8298
8299		"PSEUDO": function( pseudo, argument ) {
8300
8301			// pseudo-class names are case-insensitive
8302			// http://www.w3.org/TR/selectors/#pseudo-classes
8303			// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
8304			// Remember that setFilters inherits from pseudos
8305			var args,
8306				fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
8307					Sizzle.error( "unsupported pseudo: " + pseudo );
8308
8309			// The user may use createPseudo to indicate that
8310			// arguments are needed to create the filter function
8311			// just as Sizzle does
8312			if ( fn[ expando ] ) {
8313				return fn( argument );
8314			}
8315
8316			// But maintain support for old signatures
8317			if ( fn.length > 1 ) {
8318				args = [ pseudo, pseudo, "", argument ];
8319				return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
8320					markFunction( function( seed, matches ) {
8321						var idx,
8322							matched = fn( seed, argument ),
8323							i = matched.length;
8324						while ( i-- ) {
8325							idx = indexOf( seed, matched[ i ] );
8326							seed[ idx ] = !( matches[ idx ] = matched[ i ] );
8327						}
8328					} ) :
8329					function( elem ) {
8330						return fn( elem, 0, args );
8331					};
8332			}
8333
8334			return fn;
8335		}
8336	},
8337
8338	pseudos: {
8339
8340		// Potentially complex pseudos
8341		"not": markFunction( function( selector ) {
8342
8343			// Trim the selector passed to compile
8344			// to avoid treating leading and trailing
8345			// spaces as combinators
8346			var input = [],
8347				results = [],
8348				matcher = compile( selector.replace( rtrim, "$1" ) );
8349
8350			return matcher[ expando ] ?
8351				markFunction( function( seed, matches, _context, xml ) {
8352					var elem,
8353						unmatched = matcher( seed, null, xml, [] ),
8354						i = seed.length;
8355
8356					// Match elements unmatched by `matcher`
8357					while ( i-- ) {
8358						if ( ( elem = unmatched[ i ] ) ) {
8359							seed[ i ] = !( matches[ i ] = elem );
8360						}
8361					}
8362				} ) :
8363				function( elem, _context, xml ) {
8364					input[ 0 ] = elem;
8365					matcher( input, null, xml, results );
8366
8367					// Don't keep the element (issue #299)
8368					input[ 0 ] = null;
8369					return !results.pop();
8370				};
8371		} ),
8372
8373		"has": markFunction( function( selector ) {
8374			return function( elem ) {
8375				return Sizzle( selector, elem ).length > 0;
8376			};
8377		} ),
8378
8379		"contains": markFunction( function( text ) {
8380			text = text.replace( runescape, funescape );
8381			return function( elem ) {
8382				return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1;
8383			};
8384		} ),
8385
8386		// "Whether an element is represented by a :lang() selector
8387		// is based solely on the element's language value
8388		// being equal to the identifier C,
8389		// or beginning with the identifier C immediately followed by "-".
8390		// The matching of C against the element's language value is performed case-insensitively.
8391		// The identifier C does not have to be a valid language name."
8392		// http://www.w3.org/TR/selectors/#lang-pseudo
8393		"lang": markFunction( function( lang ) {
8394
8395			// lang value must be a valid identifier
8396			if ( !ridentifier.test( lang || "" ) ) {
8397				Sizzle.error( "unsupported lang: " + lang );
8398			}
8399			lang = lang.replace( runescape, funescape ).toLowerCase();
8400			return function( elem ) {
8401				var elemLang;
8402				do {
8403					if ( ( elemLang = documentIsHTML ?
8404						elem.lang :
8405						elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) {
8406
8407						elemLang = elemLang.toLowerCase();
8408						return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
8409					}
8410				} while ( ( elem = elem.parentNode ) && elem.nodeType === 1 );
8411				return false;
8412			};
8413		} ),
8414
8415		// Miscellaneous
8416		"target": function( elem ) {
8417			var hash = window.location && window.location.hash;
8418			return hash && hash.slice( 1 ) === elem.id;
8419		},
8420
8421		"root": function( elem ) {
8422			return elem === docElem;
8423		},
8424
8425		"focus": function( elem ) {
8426			return elem === document.activeElement &&
8427				( !document.hasFocus || document.hasFocus() ) &&
8428				!!( elem.type || elem.href || ~elem.tabIndex );
8429		},
8430
8431		// Boolean properties
8432		"enabled": createDisabledPseudo( false ),
8433		"disabled": createDisabledPseudo( true ),
8434
8435		"checked": function( elem ) {
8436
8437			// In CSS3, :checked should return both checked and selected elements
8438			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
8439			var nodeName = elem.nodeName.toLowerCase();
8440			return ( nodeName === "input" && !!elem.checked ) ||
8441				( nodeName === "option" && !!elem.selected );
8442		},
8443
8444		"selected": function( elem ) {
8445
8446			// Accessing this property makes selected-by-default
8447			// options in Safari work properly
8448			if ( elem.parentNode ) {
8449				// eslint-disable-next-line no-unused-expressions
8450				elem.parentNode.selectedIndex;
8451			}
8452
8453			return elem.selected === true;
8454		},
8455
8456		// Contents
8457		"empty": function( elem ) {
8458
8459			// http://www.w3.org/TR/selectors/#empty-pseudo
8460			// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
8461			//   but not by others (comment: 8; processing instruction: 7; etc.)
8462			// nodeType < 6 works because attributes (2) do not appear as children
8463			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
8464				if ( elem.nodeType < 6 ) {
8465					return false;
8466				}
8467			}
8468			return true;
8469		},
8470
8471		"parent": function( elem ) {
8472			return !Expr.pseudos[ "empty" ]( elem );
8473		},
8474
8475		// Element/input types
8476		"header": function( elem ) {
8477			return rheader.test( elem.nodeName );
8478		},
8479
8480		"input": function( elem ) {
8481			return rinputs.test( elem.nodeName );
8482		},
8483
8484		"button": function( elem ) {
8485			var name = elem.nodeName.toLowerCase();
8486			return name === "input" && elem.type === "button" || name === "button";
8487		},
8488
8489		"text": function( elem ) {
8490			var attr;
8491			return elem.nodeName.toLowerCase() === "input" &&
8492				elem.type === "text" &&
8493
8494				// Support: IE<8
8495				// New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
8496				( ( attr = elem.getAttribute( "type" ) ) == null ||
8497					attr.toLowerCase() === "text" );
8498		},
8499
8500		// Position-in-collection
8501		"first": createPositionalPseudo( function() {
8502			return [ 0 ];
8503		} ),
8504
8505		"last": createPositionalPseudo( function( _matchIndexes, length ) {
8506			return [ length - 1 ];
8507		} ),
8508
8509		"eq": createPositionalPseudo( function( _matchIndexes, length, argument ) {
8510			return [ argument < 0 ? argument + length : argument ];
8511		} ),
8512
8513		"even": createPositionalPseudo( function( matchIndexes, length ) {
8514			var i = 0;
8515			for ( ; i < length; i += 2 ) {
8516				matchIndexes.push( i );
8517			}
8518			return matchIndexes;
8519		} ),
8520
8521		"odd": createPositionalPseudo( function( matchIndexes, length ) {
8522			var i = 1;
8523			for ( ; i < length; i += 2 ) {
8524				matchIndexes.push( i );
8525			}
8526			return matchIndexes;
8527		} ),
8528
8529		"lt": createPositionalPseudo( function( matchIndexes, length, argument ) {
8530			var i = argument < 0 ?
8531				argument + length :
8532				argument > length ?
8533					length :
8534					argument;
8535			for ( ; --i >= 0; ) {
8536				matchIndexes.push( i );
8537			}
8538			return matchIndexes;
8539		} ),
8540
8541		"gt": createPositionalPseudo( function( matchIndexes, length, argument ) {
8542			var i = argument < 0 ? argument + length : argument;
8543			for ( ; ++i < length; ) {
8544				matchIndexes.push( i );
8545			}
8546			return matchIndexes;
8547		} )
8548	}
8549};
8550
8551Expr.pseudos[ "nth" ] = Expr.pseudos[ "eq" ];
8552
8553// Add button/input type pseudos
8554for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
8555	Expr.pseudos[ i ] = createInputPseudo( i );
8556}
8557for ( i in { submit: true, reset: true } ) {
8558	Expr.pseudos[ i ] = createButtonPseudo( i );
8559}
8560
8561// Easy API for creating new setFilters
8562function setFilters() {}
8563setFilters.prototype = Expr.filters = Expr.pseudos;
8564Expr.setFilters = new setFilters();
8565
8566tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
8567	var matched, match, tokens, type,
8568		soFar, groups, preFilters,
8569		cached = tokenCache[ selector + " " ];
8570
8571	if ( cached ) {
8572		return parseOnly ? 0 : cached.slice( 0 );
8573	}
8574
8575	soFar = selector;
8576	groups = [];
8577	preFilters = Expr.preFilter;
8578
8579	while ( soFar ) {
8580
8581		// Comma and first run
8582		if ( !matched || ( match = rcomma.exec( soFar ) ) ) {
8583			if ( match ) {
8584
8585				// Don't consume trailing commas as valid
8586				soFar = soFar.slice( match[ 0 ].length ) || soFar;
8587			}
8588			groups.push( ( tokens = [] ) );
8589		}
8590
8591		matched = false;
8592
8593		// Combinators
8594		if ( ( match = rcombinators.exec( soFar ) ) ) {
8595			matched = match.shift();
8596			tokens.push( {
8597				value: matched,
8598
8599				// Cast descendant combinators to space
8600				type: match[ 0 ].replace( rtrim, " " )
8601			} );
8602			soFar = soFar.slice( matched.length );
8603		}
8604
8605		// Filters
8606		for ( type in Expr.filter ) {
8607			if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] ||
8608				( match = preFilters[ type ]( match ) ) ) ) {
8609				matched = match.shift();
8610				tokens.push( {
8611					value: matched,
8612					type: type,
8613					matches: match
8614				} );
8615				soFar = soFar.slice( matched.length );
8616			}
8617		}
8618
8619		if ( !matched ) {
8620			break;
8621		}
8622	}
8623
8624	// Return the length of the invalid excess
8625	// if we're just parsing
8626	// Otherwise, throw an error or return tokens
8627	return parseOnly ?
8628		soFar.length :
8629		soFar ?
8630			Sizzle.error( selector ) :
8631
8632			// Cache the tokens
8633			tokenCache( selector, groups ).slice( 0 );
8634};
8635
8636function toSelector( tokens ) {
8637	var i = 0,
8638		len = tokens.length,
8639		selector = "";
8640	for ( ; i < len; i++ ) {
8641		selector += tokens[ i ].value;
8642	}
8643	return selector;
8644}
8645
8646function addCombinator( matcher, combinator, base ) {
8647	var dir = combinator.dir,
8648		skip = combinator.next,
8649		key = skip || dir,
8650		checkNonElements = base && key === "parentNode",
8651		doneName = done++;
8652
8653	return combinator.first ?
8654
8655		// Check against closest ancestor/preceding element
8656		function( elem, context, xml ) {
8657			while ( ( elem = elem[ dir ] ) ) {
8658				if ( elem.nodeType === 1 || checkNonElements ) {
8659					return matcher( elem, context, xml );
8660				}
8661			}
8662			return false;
8663		} :
8664
8665		// Check against all ancestor/preceding elements
8666		function( elem, context, xml ) {
8667			var oldCache, uniqueCache, outerCache,
8668				newCache = [ dirruns, doneName ];
8669
8670			// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
8671			if ( xml ) {
8672				while ( ( elem = elem[ dir ] ) ) {
8673					if ( elem.nodeType === 1 || checkNonElements ) {
8674						if ( matcher( elem, context, xml ) ) {
8675							return true;
8676						}
8677					}
8678				}
8679			} else {
8680				while ( ( elem = elem[ dir ] ) ) {
8681					if ( elem.nodeType === 1 || checkNonElements ) {
8682						outerCache = elem[ expando ] || ( elem[ expando ] = {} );
8683
8684						// Support: IE <9 only
8685						// Defend against cloned attroperties (jQuery gh-1709)
8686						uniqueCache = outerCache[ elem.uniqueID ] ||
8687							( outerCache[ elem.uniqueID ] = {} );
8688
8689						if ( skip && skip === elem.nodeName.toLowerCase() ) {
8690							elem = elem[ dir ] || elem;
8691						} else if ( ( oldCache = uniqueCache[ key ] ) &&
8692							oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
8693
8694							// Assign to newCache so results back-propagate to previous elements
8695							return ( newCache[ 2 ] = oldCache[ 2 ] );
8696						} else {
8697
8698							// Reuse newcache so results back-propagate to previous elements
8699							uniqueCache[ key ] = newCache;
8700
8701							// A match means we're done; a fail means we have to keep checking
8702							if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) {
8703								return true;
8704							}
8705						}
8706					}
8707				}
8708			}
8709			return false;
8710		};
8711}
8712
8713function elementMatcher( matchers ) {
8714	return matchers.length > 1 ?
8715		function( elem, context, xml ) {
8716			var i = matchers.length;
8717			while ( i-- ) {
8718				if ( !matchers[ i ]( elem, context, xml ) ) {
8719					return false;
8720				}
8721			}
8722			return true;
8723		} :
8724		matchers[ 0 ];
8725}
8726
8727function multipleContexts( selector, contexts, results ) {
8728	var i = 0,
8729		len = contexts.length;
8730	for ( ; i < len; i++ ) {
8731		Sizzle( selector, contexts[ i ], results );
8732	}
8733	return results;
8734}
8735
8736function condense( unmatched, map, filter, context, xml ) {
8737	var elem,
8738		newUnmatched = [],
8739		i = 0,
8740		len = unmatched.length,
8741		mapped = map != null;
8742
8743	for ( ; i < len; i++ ) {
8744		if ( ( elem = unmatched[ i ] ) ) {
8745			if ( !filter || filter( elem, context, xml ) ) {
8746				newUnmatched.push( elem );
8747				if ( mapped ) {
8748					map.push( i );
8749				}
8750			}
8751		}
8752	}
8753
8754	return newUnmatched;
8755}
8756
8757function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
8758	if ( postFilter && !postFilter[ expando ] ) {
8759		postFilter = setMatcher( postFilter );
8760	}
8761	if ( postFinder && !postFinder[ expando ] ) {
8762		postFinder = setMatcher( postFinder, postSelector );
8763	}
8764	return markFunction( function( seed, results, context, xml ) {
8765		var temp, i, elem,
8766			preMap = [],
8767			postMap = [],
8768			preexisting = results.length,
8769
8770			// Get initial elements from seed or context
8771			elems = seed || multipleContexts(
8772				selector || "*",
8773				context.nodeType ? [ context ] : context,
8774				[]
8775			),
8776
8777			// Prefilter to get matcher input, preserving a map for seed-results synchronization
8778			matcherIn = preFilter && ( seed || !selector ) ?
8779				condense( elems, preMap, preFilter, context, xml ) :
8780				elems,
8781
8782			matcherOut = matcher ?
8783
8784				// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
8785				postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
8786
8787					// ...intermediate processing is necessary
8788					[] :
8789
8790					// ...otherwise use results directly
8791					results :
8792				matcherIn;
8793
8794		// Find primary matches
8795		if ( matcher ) {
8796			matcher( matcherIn, matcherOut, context, xml );
8797		}
8798
8799		// Apply postFilter
8800		if ( postFilter ) {
8801			temp = condense( matcherOut, postMap );
8802			postFilter( temp, [], context, xml );
8803
8804			// Un-match failing elements by moving them back to matcherIn
8805			i = temp.length;
8806			while ( i-- ) {
8807				if ( ( elem = temp[ i ] ) ) {
8808					matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem );
8809				}
8810			}
8811		}
8812
8813		if ( seed ) {
8814			if ( postFinder || preFilter ) {
8815				if ( postFinder ) {
8816
8817					// Get the final matcherOut by condensing this intermediate into postFinder contexts
8818					temp = [];
8819					i = matcherOut.length;
8820					while ( i-- ) {
8821						if ( ( elem = matcherOut[ i ] ) ) {
8822
8823							// Restore matcherIn since elem is not yet a final match
8824							temp.push( ( matcherIn[ i ] = elem ) );
8825						}
8826					}
8827					postFinder( null, ( matcherOut = [] ), temp, xml );
8828				}
8829
8830				// Move matched elements from seed to results to keep them synchronized
8831				i = matcherOut.length;
8832				while ( i-- ) {
8833					if ( ( elem = matcherOut[ i ] ) &&
8834						( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) {
8835
8836						seed[ temp ] = !( results[ temp ] = elem );
8837					}
8838				}
8839			}
8840
8841		// Add elements to results, through postFinder if defined
8842		} else {
8843			matcherOut = condense(
8844				matcherOut === results ?
8845					matcherOut.splice( preexisting, matcherOut.length ) :
8846					matcherOut
8847			);
8848			if ( postFinder ) {
8849				postFinder( null, results, matcherOut, xml );
8850			} else {
8851				push.apply( results, matcherOut );
8852			}
8853		}
8854	} );
8855}
8856
8857function matcherFromTokens( tokens ) {
8858	var checkContext, matcher, j,
8859		len = tokens.length,
8860		leadingRelative = Expr.relative[ tokens[ 0 ].type ],
8861		implicitRelative = leadingRelative || Expr.relative[ " " ],
8862		i = leadingRelative ? 1 : 0,
8863
8864		// The foundational matcher ensures that elements are reachable from top-level context(s)
8865		matchContext = addCombinator( function( elem ) {
8866			return elem === checkContext;
8867		}, implicitRelative, true ),
8868		matchAnyContext = addCombinator( function( elem ) {
8869			return indexOf( checkContext, elem ) > -1;
8870		}, implicitRelative, true ),
8871		matchers = [ function( elem, context, xml ) {
8872			var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
8873				( checkContext = context ).nodeType ?
8874					matchContext( elem, context, xml ) :
8875					matchAnyContext( elem, context, xml ) );
8876
8877			// Avoid hanging onto element (issue #299)
8878			checkContext = null;
8879			return ret;
8880		} ];
8881
8882	for ( ; i < len; i++ ) {
8883		if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) {
8884			matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ];
8885		} else {
8886			matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches );
8887
8888			// Return special upon seeing a positional matcher
8889			if ( matcher[ expando ] ) {
8890
8891				// Find the next relative operator (if any) for proper handling
8892				j = ++i;
8893				for ( ; j < len; j++ ) {
8894					if ( Expr.relative[ tokens[ j ].type ] ) {
8895						break;
8896					}
8897				}
8898				return setMatcher(
8899					i > 1 && elementMatcher( matchers ),
8900					i > 1 && toSelector(
8901
8902					// If the preceding token was a descendant combinator, insert an implicit any-element `*`
8903					tokens
8904						.slice( 0, i - 1 )
8905						.concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } )
8906					).replace( rtrim, "$1" ),
8907					matcher,
8908					i < j && matcherFromTokens( tokens.slice( i, j ) ),
8909					j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ),
8910					j < len && toSelector( tokens )
8911				);
8912			}
8913			matchers.push( matcher );
8914		}
8915	}
8916
8917	return elementMatcher( matchers );
8918}
8919
8920function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
8921	var bySet = setMatchers.length > 0,
8922		byElement = elementMatchers.length > 0,
8923		superMatcher = function( seed, context, xml, results, outermost ) {
8924			var elem, j, matcher,
8925				matchedCount = 0,
8926				i = "0",
8927				unmatched = seed && [],
8928				setMatched = [],
8929				contextBackup = outermostContext,
8930
8931				// We must always have either seed elements or outermost context
8932				elems = seed || byElement && Expr.find[ "TAG" ]( "*", outermost ),
8933
8934				// Use integer dirruns iff this is the outermost matcher
8935				dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ),
8936				len = elems.length;
8937
8938			if ( outermost ) {
8939
8940				// Support: IE 11+, Edge 17 - 18+
8941				// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
8942				// two documents; shallow comparisons work.
8943				// eslint-disable-next-line eqeqeq
8944				outermostContext = context == document || context || outermost;
8945			}
8946
8947			// Add elements passing elementMatchers directly to results
8948			// Support: IE<9, Safari
8949			// Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
8950			for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) {
8951				if ( byElement && elem ) {
8952					j = 0;
8953
8954					// Support: IE 11+, Edge 17 - 18+
8955					// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
8956					// two documents; shallow comparisons work.
8957					// eslint-disable-next-line eqeqeq
8958					if ( !context && elem.ownerDocument != document ) {
8959						setDocument( elem );
8960						xml = !documentIsHTML;
8961					}
8962					while ( ( matcher = elementMatchers[ j++ ] ) ) {
8963						if ( matcher( elem, context || document, xml ) ) {
8964							results.push( elem );
8965							break;
8966						}
8967					}
8968					if ( outermost ) {
8969						dirruns = dirrunsUnique;
8970					}
8971				}
8972
8973				// Track unmatched elements for set filters
8974				if ( bySet ) {
8975
8976					// They will have gone through all possible matchers
8977					if ( ( elem = !matcher && elem ) ) {
8978						matchedCount--;
8979					}
8980
8981					// Lengthen the array for every element, matched or not
8982					if ( seed ) {
8983						unmatched.push( elem );
8984					}
8985				}
8986			}
8987
8988			// `i` is now the count of elements visited above, and adding it to `matchedCount`
8989			// makes the latter nonnegative.
8990			matchedCount += i;
8991
8992			// Apply set filters to unmatched elements
8993			// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`
8994			// equals `i`), unless we didn't visit _any_ elements in the above loop because we have
8995			// no element matchers and no seed.
8996			// Incrementing an initially-string "0" `i` allows `i` to remain a string only in that
8997			// case, which will result in a "00" `matchedCount` that differs from `i` but is also
8998			// numerically zero.
8999			if ( bySet && i !== matchedCount ) {
9000				j = 0;
9001				while ( ( matcher = setMatchers[ j++ ] ) ) {
9002					matcher( unmatched, setMatched, context, xml );
9003				}
9004
9005				if ( seed ) {
9006
9007					// Reintegrate element matches to eliminate the need for sorting
9008					if ( matchedCount > 0 ) {
9009						while ( i-- ) {
9010							if ( !( unmatched[ i ] || setMatched[ i ] ) ) {
9011								setMatched[ i ] = pop.call( results );
9012							}
9013						}
9014					}
9015
9016					// Discard index placeholder values to get only actual matches
9017					setMatched = condense( setMatched );
9018				}
9019
9020				// Add matches to results
9021				push.apply( results, setMatched );
9022
9023				// Seedless set matches succeeding multiple successful matchers stipulate sorting
9024				if ( outermost && !seed && setMatched.length > 0 &&
9025					( matchedCount + setMatchers.length ) > 1 ) {
9026
9027					Sizzle.uniqueSort( results );
9028				}
9029			}
9030
9031			// Override manipulation of globals by nested matchers
9032			if ( outermost ) {
9033				dirruns = dirrunsUnique;
9034				outermostContext = contextBackup;
9035			}
9036
9037			return unmatched;
9038		};
9039
9040	return bySet ?
9041		markFunction( superMatcher ) :
9042		superMatcher;
9043}
9044
9045compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
9046	var i,
9047		setMatchers = [],
9048		elementMatchers = [],
9049		cached = compilerCache[ selector + " " ];
9050
9051	if ( !cached ) {
9052
9053		// Generate a function of recursive functions that can be used to check each element
9054		if ( !match ) {
9055			match = tokenize( selector );
9056		}
9057		i = match.length;
9058		while ( i-- ) {
9059			cached = matcherFromTokens( match[ i ] );
9060			if ( cached[ expando ] ) {
9061				setMatchers.push( cached );
9062			} else {
9063				elementMatchers.push( cached );
9064			}
9065		}
9066
9067		// Cache the compiled function
9068		cached = compilerCache(
9069			selector,
9070			matcherFromGroupMatchers( elementMatchers, setMatchers )
9071		);
9072
9073		// Save selector and tokenization
9074		cached.selector = selector;
9075	}
9076	return cached;
9077};
9078
9079/**
9080 * A low-level selection function that works with Sizzle's compiled
9081 *  selector functions
9082 * @param {String|Function} selector A selector or a pre-compiled
9083 *  selector function built with Sizzle.compile
9084 * @param {Element} context
9085 * @param {Array} [results]
9086 * @param {Array} [seed] A set of elements to match against
9087 */
9088select = Sizzle.select = function( selector, context, results, seed ) {
9089	var i, tokens, token, type, find,
9090		compiled = typeof selector === "function" && selector,
9091		match = !seed && tokenize( ( selector = compiled.selector || selector ) );
9092
9093	results = results || [];
9094
9095	// Try to minimize operations if there is only one selector in the list and no seed
9096	// (the latter of which guarantees us context)
9097	if ( match.length === 1 ) {
9098
9099		// Reduce context if the leading compound selector is an ID
9100		tokens = match[ 0 ] = match[ 0 ].slice( 0 );
9101		if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" &&
9102			context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) {
9103
9104			context = ( Expr.find[ "ID" ]( token.matches[ 0 ]
9105				.replace( runescape, funescape ), context ) || [] )[ 0 ];
9106			if ( !context ) {
9107				return results;
9108
9109			// Precompiled matchers will still verify ancestry, so step up a level
9110			} else if ( compiled ) {
9111				context = context.parentNode;
9112			}
9113
9114			selector = selector.slice( tokens.shift().value.length );
9115		}
9116
9117		// Fetch a seed set for right-to-left matching
9118		i = matchExpr[ "needsContext" ].test( selector ) ? 0 : tokens.length;
9119		while ( i-- ) {
9120			token = tokens[ i ];
9121
9122			// Abort if we hit a combinator
9123			if ( Expr.relative[ ( type = token.type ) ] ) {
9124				break;
9125			}
9126			if ( ( find = Expr.find[ type ] ) ) {
9127
9128				// Search, expanding context for leading sibling combinators
9129				if ( ( seed = find(
9130					token.matches[ 0 ].replace( runescape, funescape ),
9131					rsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) ||
9132						context
9133				) ) ) {
9134
9135					// If seed is empty or no tokens remain, we can return early
9136					tokens.splice( i, 1 );
9137					selector = seed.length && toSelector( tokens );
9138					if ( !selector ) {
9139						push.apply( results, seed );
9140						return results;
9141					}
9142
9143					break;
9144				}
9145			}
9146		}
9147	}
9148
9149	// Compile and execute a filtering function if one is not provided
9150	// Provide `match` to avoid retokenization if we modified the selector above
9151	( compiled || compile( selector, match ) )(
9152		seed,
9153		context,
9154		!documentIsHTML,
9155		results,
9156		!context || rsibling.test( selector ) && testContext( context.parentNode ) || context
9157	);
9158	return results;
9159};
9160
9161// One-time assignments
9162
9163// Sort stability
9164support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando;
9165
9166// Support: Chrome 14-35+
9167// Always assume duplicates if they aren't passed to the comparison function
9168support.detectDuplicates = !!hasDuplicate;
9169
9170// Initialize against the default document
9171setDocument();
9172
9173// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
9174// Detached nodes confoundingly follow *each other*
9175support.sortDetached = assert( function( el ) {
9176
9177	// Should return 1, but returns 4 (following)
9178	return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1;
9179} );
9180
9181// Support: IE<8
9182// Prevent attribute/property "interpolation"
9183// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
9184if ( !assert( function( el ) {
9185	el.innerHTML = "<a href='#'></a>";
9186	return el.firstChild.getAttribute( "href" ) === "#";
9187} ) ) {
9188	addHandle( "type|href|height|width", function( elem, name, isXML ) {
9189		if ( !isXML ) {
9190			return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
9191		}
9192	} );
9193}
9194
9195// Support: IE<9
9196// Use defaultValue in place of getAttribute("value")
9197if ( !support.attributes || !assert( function( el ) {
9198	el.innerHTML = "<input/>";
9199	el.firstChild.setAttribute( "value", "" );
9200	return el.firstChild.getAttribute( "value" ) === "";
9201} ) ) {
9202	addHandle( "value", function( elem, _name, isXML ) {
9203		if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
9204			return elem.defaultValue;
9205		}
9206	} );
9207}
9208
9209// Support: IE<9
9210// Use getAttributeNode to fetch booleans when getAttribute lies
9211if ( !assert( function( el ) {
9212	return el.getAttribute( "disabled" ) == null;
9213} ) ) {
9214	addHandle( booleans, function( elem, name, isXML ) {
9215		var val;
9216		if ( !isXML ) {
9217			return elem[ name ] === true ? name.toLowerCase() :
9218				( val = elem.getAttributeNode( name ) ) && val.specified ?
9219					val.value :
9220					null;
9221		}
9222	} );
9223}
9224
9225return Sizzle;
9226
9227} )( window );
9228
9229
9230
9231jQuery.find = Sizzle;
9232jQuery.expr = Sizzle.selectors;
9233
9234// Deprecated
9235jQuery.expr[ ":" ] = jQuery.expr.pseudos;
9236jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
9237jQuery.text = Sizzle.getText;
9238jQuery.isXMLDoc = Sizzle.isXML;
9239jQuery.contains = Sizzle.contains;
9240jQuery.escapeSelector = Sizzle.escape;
9241
9242
9243
9244
9245var dir = function( elem, dir, until ) {
9246	var matched = [],
9247		truncate = until !== undefined;
9248
9249	while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {
9250		if ( elem.nodeType === 1 ) {
9251			if ( truncate && jQuery( elem ).is( until ) ) {
9252				break;
9253			}
9254			matched.push( elem );
9255		}
9256	}
9257	return matched;
9258};
9259
9260
9261var siblings = function( n, elem ) {
9262	var matched = [];
9263
9264	for ( ; n; n = n.nextSibling ) {
9265		if ( n.nodeType === 1 && n !== elem ) {
9266			matched.push( n );
9267		}
9268	}
9269
9270	return matched;
9271};
9272
9273
9274var rneedsContext = jQuery.expr.match.needsContext;
9275
9276
9277
9278function nodeName( elem, name ) {
9279
9280	return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
9281
9282}
9283var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i );
9284
9285
9286
9287// Implement the identical functionality for filter and not
9288function winnow( elements, qualifier, not ) {
9289	if ( isFunction( qualifier ) ) {
9290		return jQuery.grep( elements, function( elem, i ) {
9291			return !!qualifier.call( elem, i, elem ) !== not;
9292		} );
9293	}
9294
9295	// Single element
9296	if ( qualifier.nodeType ) {
9297		return jQuery.grep( elements, function( elem ) {
9298			return ( elem === qualifier ) !== not;
9299		} );
9300	}
9301
9302	// Arraylike of elements (jQuery, arguments, Array)
9303	if ( typeof qualifier !== "string" ) {
9304		return jQuery.grep( elements, function( elem ) {
9305			return ( indexOf.call( qualifier, elem ) > -1 ) !== not;
9306		} );
9307	}
9308
9309	// Filtered directly for both simple and complex selectors
9310	return jQuery.filter( qualifier, elements, not );
9311}
9312
9313jQuery.filter = function( expr, elems, not ) {
9314	var elem = elems[ 0 ];
9315
9316	if ( not ) {
9317		expr = ":not(" + expr + ")";
9318	}
9319
9320	if ( elems.length === 1 && elem.nodeType === 1 ) {
9321		return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];
9322	}
9323
9324	return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
9325		return elem.nodeType === 1;
9326	} ) );
9327};
9328
9329jQuery.fn.extend( {
9330	find: function( selector ) {
9331		var i, ret,
9332			len = this.length,
9333			self = this;
9334
9335		if ( typeof selector !== "string" ) {
9336			return this.pushStack( jQuery( selector ).filter( function() {
9337				for ( i = 0; i < len; i++ ) {
9338					if ( jQuery.contains( self[ i ], this ) ) {
9339						return true;
9340					}
9341				}
9342			} ) );
9343		}
9344
9345		ret = this.pushStack( [] );
9346
9347		for ( i = 0; i < len; i++ ) {
9348			jQuery.find( selector, self[ i ], ret );
9349		}
9350
9351		return len > 1 ? jQuery.uniqueSort( ret ) : ret;
9352	},
9353	filter: function( selector ) {
9354		return this.pushStack( winnow( this, selector || [], false ) );
9355	},
9356	not: function( selector ) {
9357		return this.pushStack( winnow( this, selector || [], true ) );
9358	},
9359	is: function( selector ) {
9360		return !!winnow(
9361			this,
9362
9363			// If this is a positional/relative selector, check membership in the returned set
9364			// so $("p:first").is("p:last") won't return true for a doc with two "p".
9365			typeof selector === "string" && rneedsContext.test( selector ) ?
9366				jQuery( selector ) :
9367				selector || [],
9368			false
9369		).length;
9370	}
9371} );
9372
9373
9374// Initialize a jQuery object
9375
9376
9377// A central reference to the root jQuery(document)
9378var rootjQuery,
9379
9380	// A simple way to check for HTML strings
9381	// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
9382	// Strict HTML recognition (#11290: must start with <)
9383	// Shortcut simple #id case for speed
9384	rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,
9385
9386	init = jQuery.fn.init = function( selector, context, root ) {
9387		var match, elem;
9388
9389		// HANDLE: $(""), $(null), $(undefined), $(false)
9390		if ( !selector ) {
9391			return this;
9392		}
9393
9394		// Method init() accepts an alternate rootjQuery
9395		// so migrate can support jQuery.sub (gh-2101)
9396		root = root || rootjQuery;
9397
9398		// Handle HTML strings
9399		if ( typeof selector === "string" ) {
9400			if ( selector[ 0 ] === "<" &&
9401				selector[ selector.length - 1 ] === ">" &&
9402				selector.length >= 3 ) {
9403
9404				// Assume that strings that start and end with <> are HTML and skip the regex check
9405				match = [ null, selector, null ];
9406
9407			} else {
9408				match = rquickExpr.exec( selector );
9409			}
9410
9411			// Match html or make sure no context is specified for #id
9412			if ( match && ( match[ 1 ] || !context ) ) {
9413
9414				// HANDLE: $(html) -> $(array)
9415				if ( match[ 1 ] ) {
9416					context = context instanceof jQuery ? context[ 0 ] : context;
9417
9418					// Option to run scripts is true for back-compat
9419					// Intentionally let the error be thrown if parseHTML is not present
9420					jQuery.merge( this, jQuery.parseHTML(
9421						match[ 1 ],
9422						context && context.nodeType ? context.ownerDocument || context : document,
9423						true
9424					) );
9425
9426					// HANDLE: $(html, props)
9427					if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {
9428						for ( match in context ) {
9429
9430							// Properties of context are called as methods if possible
9431							if ( isFunction( this[ match ] ) ) {
9432								this[ match ]( context[ match ] );
9433
9434							// ...and otherwise set as attributes
9435							} else {
9436								this.attr( match, context[ match ] );
9437							}
9438						}
9439					}
9440
9441					return this;
9442
9443				// HANDLE: $(#id)
9444				} else {
9445					elem = document.getElementById( match[ 2 ] );
9446
9447					if ( elem ) {
9448
9449						// Inject the element directly into the jQuery object
9450						this[ 0 ] = elem;
9451						this.length = 1;
9452					}
9453					return this;
9454				}
9455
9456			// HANDLE: $(expr, $(...))
9457			} else if ( !context || context.jquery ) {
9458				return ( context || root ).find( selector );
9459
9460			// HANDLE: $(expr, context)
9461			// (which is just equivalent to: $(context).find(expr)
9462			} else {
9463				return this.constructor( context ).find( selector );
9464			}
9465
9466		// HANDLE: $(DOMElement)
9467		} else if ( selector.nodeType ) {
9468			this[ 0 ] = selector;
9469			this.length = 1;
9470			return this;
9471
9472		// HANDLE: $(function)
9473		// Shortcut for document ready
9474		} else if ( isFunction( selector ) ) {
9475			return root.ready !== undefined ?
9476				root.ready( selector ) :
9477
9478				// Execute immediately if ready is not present
9479				selector( jQuery );
9480		}
9481
9482		return jQuery.makeArray( selector, this );
9483	};
9484
9485// Give the init function the jQuery prototype for later instantiation
9486init.prototype = jQuery.fn;
9487
9488// Initialize central reference
9489rootjQuery = jQuery( document );
9490
9491
9492var rparentsprev = /^(?:parents|prev(?:Until|All))/,
9493
9494	// Methods guaranteed to produce a unique set when starting from a unique set
9495	guaranteedUnique = {
9496		children: true,
9497		contents: true,
9498		next: true,
9499		prev: true
9500	};
9501
9502jQuery.fn.extend( {
9503	has: function( target ) {
9504		var targets = jQuery( target, this ),
9505			l = targets.length;
9506
9507		return this.filter( function() {
9508			var i = 0;
9509			for ( ; i < l; i++ ) {
9510				if ( jQuery.contains( this, targets[ i ] ) ) {
9511					return true;
9512				}
9513			}
9514		} );
9515	},
9516
9517	closest: function( selectors, context ) {
9518		var cur,
9519			i = 0,
9520			l = this.length,
9521			matched = [],
9522			targets = typeof selectors !== "string" && jQuery( selectors );
9523
9524		// Positional selectors never match, since there's no _selection_ context
9525		if ( !rneedsContext.test( selectors ) ) {
9526			for ( ; i < l; i++ ) {
9527				for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {
9528
9529					// Always skip document fragments
9530					if ( cur.nodeType < 11 && ( targets ?
9531						targets.index( cur ) > -1 :
9532
9533						// Don't pass non-elements to Sizzle
9534						cur.nodeType === 1 &&
9535							jQuery.find.matchesSelector( cur, selectors ) ) ) {
9536
9537						matched.push( cur );
9538						break;
9539					}
9540				}
9541			}
9542		}
9543
9544		return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );
9545	},
9546
9547	// Determine the position of an element within the set
9548	index: function( elem ) {
9549
9550		// No argument, return index in parent
9551		if ( !elem ) {
9552			return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
9553		}
9554
9555		// Index in selector
9556		if ( typeof elem === "string" ) {
9557			return indexOf.call( jQuery( elem ), this[ 0 ] );
9558		}
9559
9560		// Locate the position of the desired element
9561		return indexOf.call( this,
9562
9563			// If it receives a jQuery object, the first element is used
9564			elem.jquery ? elem[ 0 ] : elem
9565		);
9566	},
9567
9568	add: function( selector, context ) {
9569		return this.pushStack(
9570			jQuery.uniqueSort(
9571				jQuery.merge( this.get(), jQuery( selector, context ) )
9572			)
9573		);
9574	},
9575
9576	addBack: function( selector ) {
9577		return this.add( selector == null ?
9578			this.prevObject : this.prevObject.filter( selector )
9579		);
9580	}
9581} );
9582
9583function sibling( cur, dir ) {
9584	while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}
9585	return cur;
9586}
9587
9588jQuery.each( {
9589	parent: function( elem ) {
9590		var parent = elem.parentNode;
9591		return parent && parent.nodeType !== 11 ? parent : null;
9592	},
9593	parents: function( elem ) {
9594		return dir( elem, "parentNode" );
9595	},
9596	parentsUntil: function( elem, _i, until ) {
9597		return dir( elem, "parentNode", until );
9598	},
9599	next: function( elem ) {
9600		return sibling( elem, "nextSibling" );
9601	},
9602	prev: function( elem ) {
9603		return sibling( elem, "previousSibling" );
9604	},
9605	nextAll: function( elem ) {
9606		return dir( elem, "nextSibling" );
9607	},
9608	prevAll: function( elem ) {
9609		return dir( elem, "previousSibling" );
9610	},
9611	nextUntil: function( elem, _i, until ) {
9612		return dir( elem, "nextSibling", until );
9613	},
9614	prevUntil: function( elem, _i, until ) {
9615		return dir( elem, "previousSibling", until );
9616	},
9617	siblings: function( elem ) {
9618		return siblings( ( elem.parentNode || {} ).firstChild, elem );
9619	},
9620	children: function( elem ) {
9621		return siblings( elem.firstChild );
9622	},
9623	contents: function( elem ) {
9624		if ( elem.contentDocument != null &&
9625
9626			// Support: IE 11+
9627			// <object> elements with no `data` attribute has an object
9628			// `contentDocument` with a `null` prototype.
9629			getProto( elem.contentDocument ) ) {
9630
9631			return elem.contentDocument;
9632		}
9633
9634		// Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only
9635		// Treat the template element as a regular one in browsers that
9636		// don't support it.
9637		if ( nodeName( elem, "template" ) ) {
9638			elem = elem.content || elem;
9639		}
9640
9641		return jQuery.merge( [], elem.childNodes );
9642	}
9643}, function( name, fn ) {
9644	jQuery.fn[ name ] = function( until, selector ) {
9645		var matched = jQuery.map( this, fn, until );
9646
9647		if ( name.slice( -5 ) !== "Until" ) {
9648			selector = until;
9649		}
9650
9651		if ( selector && typeof selector === "string" ) {
9652			matched = jQuery.filter( selector, matched );
9653		}
9654
9655		if ( this.length > 1 ) {
9656
9657			// Remove duplicates
9658			if ( !guaranteedUnique[ name ] ) {
9659				jQuery.uniqueSort( matched );
9660			}
9661
9662			// Reverse order for parents* and prev-derivatives
9663			if ( rparentsprev.test( name ) ) {
9664				matched.reverse();
9665			}
9666		}
9667
9668		return this.pushStack( matched );
9669	};
9670} );
9671var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g );
9672
9673
9674
9675// Convert String-formatted options into Object-formatted ones
9676function createOptions( options ) {
9677	var object = {};
9678	jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {
9679		object[ flag ] = true;
9680	} );
9681	return object;
9682}
9683
9684/*
9685 * Create a callback list using the following parameters:
9686 *
9687 *	options: an optional list of space-separated options that will change how
9688 *			the callback list behaves or a more traditional option object
9689 *
9690 * By default a callback list will act like an event callback list and can be
9691 * "fired" multiple times.
9692 *
9693 * Possible options:
9694 *
9695 *	once:			will ensure the callback list can only be fired once (like a Deferred)
9696 *
9697 *	memory:			will keep track of previous values and will call any callback added
9698 *					after the list has been fired right away with the latest "memorized"
9699 *					values (like a Deferred)
9700 *
9701 *	unique:			will ensure a callback can only be added once (no duplicate in the list)
9702 *
9703 *	stopOnFalse:	interrupt callings when a callback returns false
9704 *
9705 */
9706jQuery.Callbacks = function( options ) {
9707
9708	// Convert options from String-formatted to Object-formatted if needed
9709	// (we check in cache first)
9710	options = typeof options === "string" ?
9711		createOptions( options ) :
9712		jQuery.extend( {}, options );
9713
9714	var // Flag to know if list is currently firing
9715		firing,
9716
9717		// Last fire value for non-forgettable lists
9718		memory,
9719
9720		// Flag to know if list was already fired
9721		fired,
9722
9723		// Flag to prevent firing
9724		locked,
9725
9726		// Actual callback list
9727		list = [],
9728
9729		// Queue of execution data for repeatable lists
9730		queue = [],
9731
9732		// Index of currently firing callback (modified by add/remove as needed)
9733		firingIndex = -1,
9734
9735		// Fire callbacks
9736		fire = function() {
9737
9738			// Enforce single-firing
9739			locked = locked || options.once;
9740
9741			// Execute callbacks for all pending executions,
9742			// respecting firingIndex overrides and runtime changes
9743			fired = firing = true;
9744			for ( ; queue.length; firingIndex = -1 ) {
9745				memory = queue.shift();
9746				while ( ++firingIndex < list.length ) {
9747
9748					// Run callback and check for early termination
9749					if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&
9750						options.stopOnFalse ) {
9751
9752						// Jump to end and forget the data so .add doesn't re-fire
9753						firingIndex = list.length;
9754						memory = false;
9755					}
9756				}
9757			}
9758
9759			// Forget the data if we're done with it
9760			if ( !options.memory ) {
9761				memory = false;
9762			}
9763
9764			firing = false;
9765
9766			// Clean up if we're done firing for good
9767			if ( locked ) {
9768
9769				// Keep an empty list if we have data for future add calls
9770				if ( memory ) {
9771					list = [];
9772
9773				// Otherwise, this object is spent
9774				} else {
9775					list = "";
9776				}
9777			}
9778		},
9779
9780		// Actual Callbacks object
9781		self = {
9782
9783			// Add a callback or a collection of callbacks to the list
9784			add: function() {
9785				if ( list ) {
9786
9787					// If we have memory from a past run, we should fire after adding
9788					if ( memory && !firing ) {
9789						firingIndex = list.length - 1;
9790						queue.push( memory );
9791					}
9792
9793					( function add( args ) {
9794						jQuery.each( args, function( _, arg ) {
9795							if ( isFunction( arg ) ) {
9796								if ( !options.unique || !self.has( arg ) ) {
9797									list.push( arg );
9798								}
9799							} else if ( arg && arg.length && toType( arg ) !== "string" ) {
9800
9801								// Inspect recursively
9802								add( arg );
9803							}
9804						} );
9805					} )( arguments );
9806
9807					if ( memory && !firing ) {
9808						fire();
9809					}
9810				}
9811				return this;
9812			},
9813
9814			// Remove a callback from the list
9815			remove: function() {
9816				jQuery.each( arguments, function( _, arg ) {
9817					var index;
9818					while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
9819						list.splice( index, 1 );
9820
9821						// Handle firing indexes
9822						if ( index <= firingIndex ) {
9823							firingIndex--;
9824						}
9825					}
9826				} );
9827				return this;
9828			},
9829
9830			// Check if a given callback is in the list.
9831			// If no argument is given, return whether or not list has callbacks attached.
9832			has: function( fn ) {
9833				return fn ?
9834					jQuery.inArray( fn, list ) > -1 :
9835					list.length > 0;
9836			},
9837
9838			// Remove all callbacks from the list
9839			empty: function() {
9840				if ( list ) {
9841					list = [];
9842				}
9843				return this;
9844			},
9845
9846			// Disable .fire and .add
9847			// Abort any current/pending executions
9848			// Clear all callbacks and values
9849			disable: function() {
9850				locked = queue = [];
9851				list = memory = "";
9852				return this;
9853			},
9854			disabled: function() {
9855				return !list;
9856			},
9857
9858			// Disable .fire
9859			// Also disable .add unless we have memory (since it would have no effect)
9860			// Abort any pending executions
9861			lock: function() {
9862				locked = queue = [];
9863				if ( !memory && !firing ) {
9864					list = memory = "";
9865				}
9866				return this;
9867			},
9868			locked: function() {
9869				return !!locked;
9870			},
9871
9872			// Call all callbacks with the given context and arguments
9873			fireWith: function( context, args ) {
9874				if ( !locked ) {
9875					args = args || [];
9876					args = [ context, args.slice ? args.slice() : args ];
9877					queue.push( args );
9878					if ( !firing ) {
9879						fire();
9880					}
9881				}
9882				return this;
9883			},
9884
9885			// Call all the callbacks with the given arguments
9886			fire: function() {
9887				self.fireWith( this, arguments );
9888				return this;
9889			},
9890
9891			// To know if the callbacks have already been called at least once
9892			fired: function() {
9893				return !!fired;
9894			}
9895		};
9896
9897	return self;
9898};
9899
9900
9901function Identity( v ) {
9902	return v;
9903}
9904function Thrower( ex ) {
9905	throw ex;
9906}
9907
9908function adoptValue( value, resolve, reject, noValue ) {
9909	var method;
9910
9911	try {
9912
9913		// Check for promise aspect first to privilege synchronous behavior
9914		if ( value && isFunction( ( method = value.promise ) ) ) {
9915			method.call( value ).done( resolve ).fail( reject );
9916
9917		// Other thenables
9918		} else if ( value && isFunction( ( method = value.then ) ) ) {
9919			method.call( value, resolve, reject );
9920
9921		// Other non-thenables
9922		} else {
9923
9924			// Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:
9925			// * false: [ value ].slice( 0 ) => resolve( value )
9926			// * true: [ value ].slice( 1 ) => resolve()
9927			resolve.apply( undefined, [ value ].slice( noValue ) );
9928		}
9929
9930	// For Promises/A+, convert exceptions into rejections
9931	// Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in
9932	// Deferred#then to conditionally suppress rejection.
9933	} catch ( value ) {
9934
9935		// Support: Android 4.0 only
9936		// Strict mode functions invoked without .call/.apply get global-object context
9937		reject.apply( undefined, [ value ] );
9938	}
9939}
9940
9941jQuery.extend( {
9942
9943	Deferred: function( func ) {
9944		var tuples = [
9945
9946				// action, add listener, callbacks,
9947				// ... .then handlers, argument index, [final state]
9948				[ "notify", "progress", jQuery.Callbacks( "memory" ),
9949					jQuery.Callbacks( "memory" ), 2 ],
9950				[ "resolve", "done", jQuery.Callbacks( "once memory" ),
9951					jQuery.Callbacks( "once memory" ), 0, "resolved" ],
9952				[ "reject", "fail", jQuery.Callbacks( "once memory" ),
9953					jQuery.Callbacks( "once memory" ), 1, "rejected" ]
9954			],
9955			state = "pending",
9956			promise = {
9957				state: function() {
9958					return state;
9959				},
9960				always: function() {
9961					deferred.done( arguments ).fail( arguments );
9962					return this;
9963				},
9964				"catch": function( fn ) {
9965					return promise.then( null, fn );
9966				},
9967
9968				// Keep pipe for back-compat
9969				pipe: function( /* fnDone, fnFail, fnProgress */ ) {
9970					var fns = arguments;
9971
9972					return jQuery.Deferred( function( newDefer ) {
9973						jQuery.each( tuples, function( _i, tuple ) {
9974
9975							// Map tuples (progress, done, fail) to arguments (done, fail, progress)
9976							var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];
9977
9978							// deferred.progress(function() { bind to newDefer or newDefer.notify })
9979							// deferred.done(function() { bind to newDefer or newDefer.resolve })
9980							// deferred.fail(function() { bind to newDefer or newDefer.reject })
9981							deferred[ tuple[ 1 ] ]( function() {
9982								var returned = fn && fn.apply( this, arguments );
9983								if ( returned && isFunction( returned.promise ) ) {
9984									returned.promise()
9985										.progress( newDefer.notify )
9986										.done( newDefer.resolve )
9987										.fail( newDefer.reject );
9988								} else {
9989									newDefer[ tuple[ 0 ] + "With" ](
9990										this,
9991										fn ? [ returned ] : arguments
9992									);
9993								}
9994							} );
9995						} );
9996						fns = null;
9997					} ).promise();
9998				},
9999				then: function( onFulfilled, onRejected, onProgress ) {
10000					var maxDepth = 0;
10001					function resolve( depth, deferred, handler, special ) {
10002						return function() {
10003							var that = this,
10004								args = arguments,
10005								mightThrow = function() {
10006									var returned, then;
10007
10008									// Support: Promises/A+ section 2.3.3.3.3
10009									// https://promisesaplus.com/#point-59
10010									// Ignore double-resolution attempts
10011									if ( depth < maxDepth ) {
10012										return;
10013									}
10014
10015									returned = handler.apply( that, args );
10016
10017									// Support: Promises/A+ section 2.3.1
10018									// https://promisesaplus.com/#point-48
10019									if ( returned === deferred.promise() ) {
10020										throw new TypeError( "Thenable self-resolution" );
10021									}
10022
10023									// Support: Promises/A+ sections 2.3.3.1, 3.5
10024									// https://promisesaplus.com/#point-54
10025									// https://promisesaplus.com/#point-75
10026									// Retrieve `then` only once
10027									then = returned &&
10028
10029										// Support: Promises/A+ section 2.3.4
10030										// https://promisesaplus.com/#point-64
10031										// Only check objects and functions for thenability
10032										( typeof returned === "object" ||
10033											typeof returned === "function" ) &&
10034										returned.then;
10035
10036									// Handle a returned thenable
10037									if ( isFunction( then ) ) {
10038
10039										// Special processors (notify) just wait for resolution
10040										if ( special ) {
10041											then.call(
10042												returned,
10043												resolve( maxDepth, deferred, Identity, special ),
10044												resolve( maxDepth, deferred, Thrower, special )
10045											);
10046
10047										// Normal processors (resolve) also hook into progress
10048										} else {
10049
10050											// ...and disregard older resolution values
10051											maxDepth++;
10052
10053											then.call(
10054												returned,
10055												resolve( maxDepth, deferred, Identity, special ),
10056												resolve( maxDepth, deferred, Thrower, special ),
10057												resolve( maxDepth, deferred, Identity,
10058													deferred.notifyWith )
10059											);
10060										}
10061
10062									// Handle all other returned values
10063									} else {
10064
10065										// Only substitute handlers pass on context
10066										// and multiple values (non-spec behavior)
10067										if ( handler !== Identity ) {
10068											that = undefined;
10069											args = [ returned ];
10070										}
10071
10072										// Process the value(s)
10073										// Default process is resolve
10074										( special || deferred.resolveWith )( that, args );
10075									}
10076								},
10077
10078								// Only normal processors (resolve) catch and reject exceptions
10079								process = special ?
10080									mightThrow :
10081									function() {
10082										try {
10083											mightThrow();
10084										} catch ( e ) {
10085
10086											if ( jQuery.Deferred.exceptionHook ) {
10087												jQuery.Deferred.exceptionHook( e,
10088													process.stackTrace );
10089											}
10090
10091											// Support: Promises/A+ section 2.3.3.3.4.1
10092											// https://promisesaplus.com/#point-61
10093											// Ignore post-resolution exceptions
10094											if ( depth + 1 >= maxDepth ) {
10095
10096												// Only substitute handlers pass on context
10097												// and multiple values (non-spec behavior)
10098												if ( handler !== Thrower ) {
10099													that = undefined;
10100													args = [ e ];
10101												}
10102
10103												deferred.rejectWith( that, args );
10104											}
10105										}
10106									};
10107
10108							// Support: Promises/A+ section 2.3.3.3.1
10109							// https://promisesaplus.com/#point-57
10110							// Re-resolve promises immediately to dodge false rejection from
10111							// subsequent errors
10112							if ( depth ) {
10113								process();
10114							} else {
10115
10116								// Call an optional hook to record the stack, in case of exception
10117								// since it's otherwise lost when execution goes async
10118								if ( jQuery.Deferred.getStackHook ) {
10119									process.stackTrace = jQuery.Deferred.getStackHook();
10120								}
10121								window.setTimeout( process );
10122							}
10123						};
10124					}
10125
10126					return jQuery.Deferred( function( newDefer ) {
10127
10128						// progress_handlers.add( ... )
10129						tuples[ 0 ][ 3 ].add(
10130							resolve(
10131								0,
10132								newDefer,
10133								isFunction( onProgress ) ?
10134									onProgress :
10135									Identity,
10136								newDefer.notifyWith
10137							)
10138						);
10139
10140						// fulfilled_handlers.add( ... )
10141						tuples[ 1 ][ 3 ].add(
10142							resolve(
10143								0,
10144								newDefer,
10145								isFunction( onFulfilled ) ?
10146									onFulfilled :
10147									Identity
10148							)
10149						);
10150
10151						// rejected_handlers.add( ... )
10152						tuples[ 2 ][ 3 ].add(
10153							resolve(
10154								0,
10155								newDefer,
10156								isFunction( onRejected ) ?
10157									onRejected :
10158									Thrower
10159							)
10160						);
10161					} ).promise();
10162				},
10163
10164				// Get a promise for this deferred
10165				// If obj is provided, the promise aspect is added to the object
10166				promise: function( obj ) {
10167					return obj != null ? jQuery.extend( obj, promise ) : promise;
10168				}
10169			},
10170			deferred = {};
10171
10172		// Add list-specific methods
10173		jQuery.each( tuples, function( i, tuple ) {
10174			var list = tuple[ 2 ],
10175				stateString = tuple[ 5 ];
10176
10177			// promise.progress = list.add
10178			// promise.done = list.add
10179			// promise.fail = list.add
10180			promise[ tuple[ 1 ] ] = list.add;
10181
10182			// Handle state
10183			if ( stateString ) {
10184				list.add(
10185					function() {
10186
10187						// state = "resolved" (i.e., fulfilled)
10188						// state = "rejected"
10189						state = stateString;
10190					},
10191
10192					// rejected_callbacks.disable
10193					// fulfilled_callbacks.disable
10194					tuples[ 3 - i ][ 2 ].disable,
10195
10196					// rejected_handlers.disable
10197					// fulfilled_handlers.disable
10198					tuples[ 3 - i ][ 3 ].disable,
10199
10200					// progress_callbacks.lock
10201					tuples[ 0 ][ 2 ].lock,
10202
10203					// progress_handlers.lock
10204					tuples[ 0 ][ 3 ].lock
10205				);
10206			}
10207
10208			// progress_handlers.fire
10209			// fulfilled_handlers.fire
10210			// rejected_handlers.fire
10211			list.add( tuple[ 3 ].fire );
10212
10213			// deferred.notify = function() { deferred.notifyWith(...) }
10214			// deferred.resolve = function() { deferred.resolveWith(...) }
10215			// deferred.reject = function() { deferred.rejectWith(...) }
10216			deferred[ tuple[ 0 ] ] = function() {
10217				deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments );
10218				return this;
10219			};
10220
10221			// deferred.notifyWith = list.fireWith
10222			// deferred.resolveWith = list.fireWith
10223			// deferred.rejectWith = list.fireWith
10224			deferred[ tuple[ 0 ] + "With" ] = list.fireWith;
10225		} );
10226
10227		// Make the deferred a promise
10228		promise.promise( deferred );
10229
10230		// Call given func if any
10231		if ( func ) {
10232			func.call( deferred, deferred );
10233		}
10234
10235		// All done!
10236		return deferred;
10237	},
10238
10239	// Deferred helper
10240	when: function( singleValue ) {
10241		var
10242
10243			// count of uncompleted subordinates
10244			remaining = arguments.length,
10245
10246			// count of unprocessed arguments
10247			i = remaining,
10248
10249			// subordinate fulfillment data
10250			resolveContexts = Array( i ),
10251			resolveValues = slice.call( arguments ),
10252
10253			// the primary Deferred
10254			primary = jQuery.Deferred(),
10255
10256			// subordinate callback factory
10257			updateFunc = function( i ) {
10258				return function( value ) {
10259					resolveContexts[ i ] = this;
10260					resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
10261					if ( !( --remaining ) ) {
10262						primary.resolveWith( resolveContexts, resolveValues );
10263					}
10264				};
10265			};
10266
10267		// Single- and empty arguments are adopted like Promise.resolve
10268		if ( remaining <= 1 ) {
10269			adoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject,
10270				!remaining );
10271
10272			// Use .then() to unwrap secondary thenables (cf. gh-3000)
10273			if ( primary.state() === "pending" ||
10274				isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {
10275
10276				return primary.then();
10277			}
10278		}
10279
10280		// Multiple arguments are aggregated like Promise.all array elements
10281		while ( i-- ) {
10282			adoptValue( resolveValues[ i ], updateFunc( i ), primary.reject );
10283		}
10284
10285		return primary.promise();
10286	}
10287} );
10288
10289
10290// These usually indicate a programmer mistake during development,
10291// warn about them ASAP rather than swallowing them by default.
10292var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;
10293
10294jQuery.Deferred.exceptionHook = function( error, stack ) {
10295
10296	// Support: IE 8 - 9 only
10297	// Console exists when dev tools are open, which can happen at any time
10298	if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {
10299		window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack );
10300	}
10301};
10302
10303
10304
10305
10306jQuery.readyException = function( error ) {
10307	window.setTimeout( function() {
10308		throw error;
10309	} );
10310};
10311
10312
10313
10314
10315// The deferred used on DOM ready
10316var readyList = jQuery.Deferred();
10317
10318jQuery.fn.ready = function( fn ) {
10319
10320	readyList
10321		.then( fn )
10322
10323		// Wrap jQuery.readyException in a function so that the lookup
10324		// happens at the time of error handling instead of callback
10325		// registration.
10326		.catch( function( error ) {
10327			jQuery.readyException( error );
10328		} );
10329
10330	return this;
10331};
10332
10333jQuery.extend( {
10334
10335	// Is the DOM ready to be used? Set to true once it occurs.
10336	isReady: false,
10337
10338	// A counter to track how many items to wait for before
10339	// the ready event fires. See #6781
10340	readyWait: 1,
10341
10342	// Handle when the DOM is ready
10343	ready: function( wait ) {
10344
10345		// Abort if there are pending holds or we're already ready
10346		if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
10347			return;
10348		}
10349
10350		// Remember that the DOM is ready
10351		jQuery.isReady = true;
10352
10353		// If a normal DOM Ready event fired, decrement, and wait if need be
10354		if ( wait !== true && --jQuery.readyWait > 0 ) {
10355			return;
10356		}
10357
10358		// If there are functions bound, to execute
10359		readyList.resolveWith( document, [ jQuery ] );
10360	}
10361} );
10362
10363jQuery.ready.then = readyList.then;
10364
10365// The ready event handler and self cleanup method
10366function completed() {
10367	document.removeEventListener( "DOMContentLoaded", completed );
10368	window.removeEventListener( "load", completed );
10369	jQuery.ready();
10370}
10371
10372// Catch cases where $(document).ready() is called
10373// after the browser event has already occurred.
10374// Support: IE <=9 - 10 only
10375// Older IE sometimes signals "interactive" too soon
10376if ( document.readyState === "complete" ||
10377	( document.readyState !== "loading" && !document.documentElement.doScroll ) ) {
10378
10379	// Handle it asynchronously to allow scripts the opportunity to delay ready
10380	window.setTimeout( jQuery.ready );
10381
10382} else {
10383
10384	// Use the handy event callback
10385	document.addEventListener( "DOMContentLoaded", completed );
10386
10387	// A fallback to window.onload, that will always work
10388	window.addEventListener( "load", completed );
10389}
10390
10391
10392
10393
10394// Multifunctional method to get and set values of a collection
10395// The value/s can optionally be executed if it's a function
10396var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
10397	var i = 0,
10398		len = elems.length,
10399		bulk = key == null;
10400
10401	// Sets many values
10402	if ( toType( key ) === "object" ) {
10403		chainable = true;
10404		for ( i in key ) {
10405			access( elems, fn, i, key[ i ], true, emptyGet, raw );
10406		}
10407
10408	// Sets one value
10409	} else if ( value !== undefined ) {
10410		chainable = true;
10411
10412		if ( !isFunction( value ) ) {
10413			raw = true;
10414		}
10415
10416		if ( bulk ) {
10417
10418			// Bulk operations run against the entire set
10419			if ( raw ) {
10420				fn.call( elems, value );
10421				fn = null;
10422
10423			// ...except when executing function values
10424			} else {
10425				bulk = fn;
10426				fn = function( elem, _key, value ) {
10427					return bulk.call( jQuery( elem ), value );
10428				};
10429			}
10430		}
10431
10432		if ( fn ) {
10433			for ( ; i < len; i++ ) {
10434				fn(
10435					elems[ i ], key, raw ?
10436						value :
10437						value.call( elems[ i ], i, fn( elems[ i ], key ) )
10438				);
10439			}
10440		}
10441	}
10442
10443	if ( chainable ) {
10444		return elems;
10445	}
10446
10447	// Gets
10448	if ( bulk ) {
10449		return fn.call( elems );
10450	}
10451
10452	return len ? fn( elems[ 0 ], key ) : emptyGet;
10453};
10454
10455
10456// Matches dashed string for camelizing
10457var rmsPrefix = /^-ms-/,
10458	rdashAlpha = /-([a-z])/g;
10459
10460// Used by camelCase as callback to replace()
10461function fcamelCase( _all, letter ) {
10462	return letter.toUpperCase();
10463}
10464
10465// Convert dashed to camelCase; used by the css and data modules
10466// Support: IE <=9 - 11, Edge 12 - 15
10467// Microsoft forgot to hump their vendor prefix (#9572)
10468function camelCase( string ) {
10469	return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
10470}
10471var acceptData = function( owner ) {
10472
10473	// Accepts only:
10474	//  - Node
10475	//    - Node.ELEMENT_NODE
10476	//    - Node.DOCUMENT_NODE
10477	//  - Object
10478	//    - Any
10479	return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );
10480};
10481
10482
10483
10484
10485function Data() {
10486	this.expando = jQuery.expando + Data.uid++;
10487}
10488
10489Data.uid = 1;
10490
10491Data.prototype = {
10492
10493	cache: function( owner ) {
10494
10495		// Check if the owner object already has a cache
10496		var value = owner[ this.expando ];
10497
10498		// If not, create one
10499		if ( !value ) {
10500			value = {};
10501
10502			// We can accept data for non-element nodes in modern browsers,
10503			// but we should not, see #8335.
10504			// Always return an empty object.
10505			if ( acceptData( owner ) ) {
10506
10507				// If it is a node unlikely to be stringify-ed or looped over
10508				// use plain assignment
10509				if ( owner.nodeType ) {
10510					owner[ this.expando ] = value;
10511
10512				// Otherwise secure it in a non-enumerable property
10513				// configurable must be true to allow the property to be
10514				// deleted when data is removed
10515				} else {
10516					Object.defineProperty( owner, this.expando, {
10517						value: value,
10518						configurable: true
10519					} );
10520				}
10521			}
10522		}
10523
10524		return value;
10525	},
10526	set: function( owner, data, value ) {
10527		var prop,
10528			cache = this.cache( owner );
10529
10530		// Handle: [ owner, key, value ] args
10531		// Always use camelCase key (gh-2257)
10532		if ( typeof data === "string" ) {
10533			cache[ camelCase( data ) ] = value;
10534
10535		// Handle: [ owner, { properties } ] args
10536		} else {
10537
10538			// Copy the properties one-by-one to the cache object
10539			for ( prop in data ) {
10540				cache[ camelCase( prop ) ] = data[ prop ];
10541			}
10542		}
10543		return cache;
10544	},
10545	get: function( owner, key ) {
10546		return key === undefined ?
10547			this.cache( owner ) :
10548
10549			// Always use camelCase key (gh-2257)
10550			owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ];
10551	},
10552	access: function( owner, key, value ) {
10553
10554		// In cases where either:
10555		//
10556		//   1. No key was specified
10557		//   2. A string key was specified, but no value provided
10558		//
10559		// Take the "read" path and allow the get method to determine
10560		// which value to return, respectively either:
10561		//
10562		//   1. The entire cache object
10563		//   2. The data stored at the key
10564		//
10565		if ( key === undefined ||
10566				( ( key && typeof key === "string" ) && value === undefined ) ) {
10567
10568			return this.get( owner, key );
10569		}
10570
10571		// When the key is not a string, or both a key and value
10572		// are specified, set or extend (existing objects) with either:
10573		//
10574		//   1. An object of properties
10575		//   2. A key and value
10576		//
10577		this.set( owner, key, value );
10578
10579		// Since the "set" path can have two possible entry points
10580		// return the expected data based on which path was taken[*]
10581		return value !== undefined ? value : key;
10582	},
10583	remove: function( owner, key ) {
10584		var i,
10585			cache = owner[ this.expando ];
10586
10587		if ( cache === undefined ) {
10588			return;
10589		}
10590
10591		if ( key !== undefined ) {
10592
10593			// Support array or space separated string of keys
10594			if ( Array.isArray( key ) ) {
10595
10596				// If key is an array of keys...
10597				// We always set camelCase keys, so remove that.
10598				key = key.map( camelCase );
10599			} else {
10600				key = camelCase( key );
10601
10602				// If a key with the spaces exists, use it.
10603				// Otherwise, create an array by matching non-whitespace
10604				key = key in cache ?
10605					[ key ] :
10606					( key.match( rnothtmlwhite ) || [] );
10607			}
10608
10609			i = key.length;
10610
10611			while ( i-- ) {
10612				delete cache[ key[ i ] ];
10613			}
10614		}
10615
10616		// Remove the expando if there's no more data
10617		if ( key === undefined || jQuery.isEmptyObject( cache ) ) {
10618
10619			// Support: Chrome <=35 - 45
10620			// Webkit & Blink performance suffers when deleting properties
10621			// from DOM nodes, so set to undefined instead
10622			// https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)
10623			if ( owner.nodeType ) {
10624				owner[ this.expando ] = undefined;
10625			} else {
10626				delete owner[ this.expando ];
10627			}
10628		}
10629	},
10630	hasData: function( owner ) {
10631		var cache = owner[ this.expando ];
10632		return cache !== undefined && !jQuery.isEmptyObject( cache );
10633	}
10634};
10635var dataPriv = new Data();
10636
10637var dataUser = new Data();
10638
10639
10640
10641//	Implementation Summary
10642//
10643//	1. Enforce API surface and semantic compatibility with 1.9.x branch
10644//	2. Improve the module's maintainability by reducing the storage
10645//		paths to a single mechanism.
10646//	3. Use the same single mechanism to support "private" and "user" data.
10647//	4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
10648//	5. Avoid exposing implementation details on user objects (eg. expando properties)
10649//	6. Provide a clear path for implementation upgrade to WeakMap in 2014
10650
10651var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
10652	rmultiDash = /[A-Z]/g;
10653
10654function getData( data ) {
10655	if ( data === "true" ) {
10656		return true;
10657	}
10658
10659	if ( data === "false" ) {
10660		return false;
10661	}
10662
10663	if ( data === "null" ) {
10664		return null;
10665	}
10666
10667	// Only convert to a number if it doesn't change the string
10668	if ( data === +data + "" ) {
10669		return +data;
10670	}
10671
10672	if ( rbrace.test( data ) ) {
10673		return JSON.parse( data );
10674	}
10675
10676	return data;
10677}
10678
10679function dataAttr( elem, key, data ) {
10680	var name;
10681
10682	// If nothing was found internally, try to fetch any
10683	// data from the HTML5 data-* attribute
10684	if ( data === undefined && elem.nodeType === 1 ) {
10685		name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase();
10686		data = elem.getAttribute( name );
10687
10688		if ( typeof data === "string" ) {
10689			try {
10690				data = getData( data );
10691			} catch ( e ) {}
10692
10693			// Make sure we set the data so it isn't changed later
10694			dataUser.set( elem, key, data );
10695		} else {
10696			data = undefined;
10697		}
10698	}
10699	return data;
10700}
10701
10702jQuery.extend( {
10703	hasData: function( elem ) {
10704		return dataUser.hasData( elem ) || dataPriv.hasData( elem );
10705	},
10706
10707	data: function( elem, name, data ) {
10708		return dataUser.access( elem, name, data );
10709	},
10710
10711	removeData: function( elem, name ) {
10712		dataUser.remove( elem, name );
10713	},
10714
10715	// TODO: Now that all calls to _data and _removeData have been replaced
10716	// with direct calls to dataPriv methods, these can be deprecated.
10717	_data: function( elem, name, data ) {
10718		return dataPriv.access( elem, name, data );
10719	},
10720
10721	_removeData: function( elem, name ) {
10722		dataPriv.remove( elem, name );
10723	}
10724} );
10725
10726jQuery.fn.extend( {
10727	data: function( key, value ) {
10728		var i, name, data,
10729			elem = this[ 0 ],
10730			attrs = elem && elem.attributes;
10731
10732		// Gets all values
10733		if ( key === undefined ) {
10734			if ( this.length ) {
10735				data = dataUser.get( elem );
10736
10737				if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) {
10738					i = attrs.length;
10739					while ( i-- ) {
10740
10741						// Support: IE 11 only
10742						// The attrs elements can be null (#14894)
10743						if ( attrs[ i ] ) {
10744							name = attrs[ i ].name;
10745							if ( name.indexOf( "data-" ) === 0 ) {
10746								name = camelCase( name.slice( 5 ) );
10747								dataAttr( elem, name, data[ name ] );
10748							}
10749						}
10750					}
10751					dataPriv.set( elem, "hasDataAttrs", true );
10752				}
10753			}
10754
10755			return data;
10756		}
10757
10758		// Sets multiple values
10759		if ( typeof key === "object" ) {
10760			return this.each( function() {
10761				dataUser.set( this, key );
10762			} );
10763		}
10764
10765		return access( this, function( value ) {
10766			var data;
10767
10768			// The calling jQuery object (element matches) is not empty
10769			// (and therefore has an element appears at this[ 0 ]) and the
10770			// `value` parameter was not undefined. An empty jQuery object
10771			// will result in `undefined` for elem = this[ 0 ] which will
10772			// throw an exception if an attempt to read a data cache is made.
10773			if ( elem && value === undefined ) {
10774
10775				// Attempt to get data from the cache
10776				// The key will always be camelCased in Data
10777				data = dataUser.get( elem, key );
10778				if ( data !== undefined ) {
10779					return data;
10780				}
10781
10782				// Attempt to "discover" the data in
10783				// HTML5 custom data-* attrs
10784				data = dataAttr( elem, key );
10785				if ( data !== undefined ) {
10786					return data;
10787				}
10788
10789				// We tried really hard, but the data doesn't exist.
10790				return;
10791			}
10792
10793			// Set the data...
10794			this.each( function() {
10795
10796				// We always store the camelCased key
10797				dataUser.set( this, key, value );
10798			} );
10799		}, null, value, arguments.length > 1, null, true );
10800	},
10801
10802	removeData: function( key ) {
10803		return this.each( function() {
10804			dataUser.remove( this, key );
10805		} );
10806	}
10807} );
10808
10809
10810jQuery.extend( {
10811	queue: function( elem, type, data ) {
10812		var queue;
10813
10814		if ( elem ) {
10815			type = ( type || "fx" ) + "queue";
10816			queue = dataPriv.get( elem, type );
10817
10818			// Speed up dequeue by getting out quickly if this is just a lookup
10819			if ( data ) {
10820				if ( !queue || Array.isArray( data ) ) {
10821					queue = dataPriv.access( elem, type, jQuery.makeArray( data ) );
10822				} else {
10823					queue.push( data );
10824				}
10825			}
10826			return queue || [];
10827		}
10828	},
10829
10830	dequeue: function( elem, type ) {
10831		type = type || "fx";
10832
10833		var queue = jQuery.queue( elem, type ),
10834			startLength = queue.length,
10835			fn = queue.shift(),
10836			hooks = jQuery._queueHooks( elem, type ),
10837			next = function() {
10838				jQuery.dequeue( elem, type );
10839			};
10840
10841		// If the fx queue is dequeued, always remove the progress sentinel
10842		if ( fn === "inprogress" ) {
10843			fn = queue.shift();
10844			startLength--;
10845		}
10846
10847		if ( fn ) {
10848
10849			// Add a progress sentinel to prevent the fx queue from being
10850			// automatically dequeued
10851			if ( type === "fx" ) {
10852				queue.unshift( "inprogress" );
10853			}
10854
10855			// Clear up the last queue stop function
10856			delete hooks.stop;
10857			fn.call( elem, next, hooks );
10858		}
10859
10860		if ( !startLength && hooks ) {
10861			hooks.empty.fire();
10862		}
10863	},
10864
10865	// Not public - generate a queueHooks object, or return the current one
10866	_queueHooks: function( elem, type ) {
10867		var key = type + "queueHooks";
10868		return dataPriv.get( elem, key ) || dataPriv.access( elem, key, {
10869			empty: jQuery.Callbacks( "once memory" ).add( function() {
10870				dataPriv.remove( elem, [ type + "queue", key ] );
10871			} )
10872		} );
10873	}
10874} );
10875
10876jQuery.fn.extend( {
10877	queue: function( type, data ) {
10878		var setter = 2;
10879
10880		if ( typeof type !== "string" ) {
10881			data = type;
10882			type = "fx";
10883			setter--;
10884		}
10885
10886		if ( arguments.length < setter ) {
10887			return jQuery.queue( this[ 0 ], type );
10888		}
10889
10890		return data === undefined ?
10891			this :
10892			this.each( function() {
10893				var queue = jQuery.queue( this, type, data );
10894
10895				// Ensure a hooks for this queue
10896				jQuery._queueHooks( this, type );
10897
10898				if ( type === "fx" && queue[ 0 ] !== "inprogress" ) {
10899					jQuery.dequeue( this, type );
10900				}
10901			} );
10902	},
10903	dequeue: function( type ) {
10904		return this.each( function() {
10905			jQuery.dequeue( this, type );
10906		} );
10907	},
10908	clearQueue: function( type ) {
10909		return this.queue( type || "fx", [] );
10910	},
10911
10912	// Get a promise resolved when queues of a certain type
10913	// are emptied (fx is the type by default)
10914	promise: function( type, obj ) {
10915		var tmp,
10916			count = 1,
10917			defer = jQuery.Deferred(),
10918			elements = this,
10919			i = this.length,
10920			resolve = function() {
10921				if ( !( --count ) ) {
10922					defer.resolveWith( elements, [ elements ] );
10923				}
10924			};
10925
10926		if ( typeof type !== "string" ) {
10927			obj = type;
10928			type = undefined;
10929		}
10930		type = type || "fx";
10931
10932		while ( i-- ) {
10933			tmp = dataPriv.get( elements[ i ], type + "queueHooks" );
10934			if ( tmp && tmp.empty ) {
10935				count++;
10936				tmp.empty.add( resolve );
10937			}
10938		}
10939		resolve();
10940		return defer.promise( obj );
10941	}
10942} );
10943var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source;
10944
10945var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" );
10946
10947
10948var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
10949
10950var documentElement = document.documentElement;
10951
10952
10953
10954	var isAttached = function( elem ) {
10955			return jQuery.contains( elem.ownerDocument, elem );
10956		},
10957		composed = { composed: true };
10958
10959	// Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only
10960	// Check attachment across shadow DOM boundaries when possible (gh-3504)
10961	// Support: iOS 10.0-10.2 only
10962	// Early iOS 10 versions support `attachShadow` but not `getRootNode`,
10963	// leading to errors. We need to check for `getRootNode`.
10964	if ( documentElement.getRootNode ) {
10965		isAttached = function( elem ) {
10966			return jQuery.contains( elem.ownerDocument, elem ) ||
10967				elem.getRootNode( composed ) === elem.ownerDocument;
10968		};
10969	}
10970var isHiddenWithinTree = function( elem, el ) {
10971
10972		// isHiddenWithinTree might be called from jQuery#filter function;
10973		// in that case, element will be second argument
10974		elem = el || elem;
10975
10976		// Inline style trumps all
10977		return elem.style.display === "none" ||
10978			elem.style.display === "" &&
10979
10980			// Otherwise, check computed style
10981			// Support: Firefox <=43 - 45
10982			// Disconnected elements can have computed display: none, so first confirm that elem is
10983			// in the document.
10984			isAttached( elem ) &&
10985
10986			jQuery.css( elem, "display" ) === "none";
10987	};
10988
10989
10990
10991function adjustCSS( elem, prop, valueParts, tween ) {
10992	var adjusted, scale,
10993		maxIterations = 20,
10994		currentValue = tween ?
10995			function() {
10996				return tween.cur();
10997			} :
10998			function() {
10999				return jQuery.css( elem, prop, "" );
11000			},
11001		initial = currentValue(),
11002		unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
11003
11004		// Starting value computation is required for potential unit mismatches
11005		initialInUnit = elem.nodeType &&
11006			( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) &&
11007			rcssNum.exec( jQuery.css( elem, prop ) );
11008
11009	if ( initialInUnit && initialInUnit[ 3 ] !== unit ) {
11010
11011		// Support: Firefox <=54
11012		// Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144)
11013		initial = initial / 2;
11014
11015		// Trust units reported by jQuery.css
11016		unit = unit || initialInUnit[ 3 ];
11017
11018		// Iteratively approximate from a nonzero starting point
11019		initialInUnit = +initial || 1;
11020
11021		while ( maxIterations-- ) {
11022
11023			// Evaluate and update our best guess (doubling guesses that zero out).
11024			// Finish if the scale equals or crosses 1 (making the old*new product non-positive).
11025			jQuery.style( elem, prop, initialInUnit + unit );
11026			if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) {
11027				maxIterations = 0;
11028			}
11029			initialInUnit = initialInUnit / scale;
11030
11031		}
11032
11033		initialInUnit = initialInUnit * 2;
11034		jQuery.style( elem, prop, initialInUnit + unit );
11035
11036		// Make sure we update the tween properties later on
11037		valueParts = valueParts || [];
11038	}
11039
11040	if ( valueParts ) {
11041		initialInUnit = +initialInUnit || +initial || 0;
11042
11043		// Apply relative offset (+=/-=) if specified
11044		adjusted = valueParts[ 1 ] ?
11045			initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :
11046			+valueParts[ 2 ];
11047		if ( tween ) {
11048			tween.unit = unit;
11049			tween.start = initialInUnit;
11050			tween.end = adjusted;
11051		}
11052	}
11053	return adjusted;
11054}
11055
11056
11057var defaultDisplayMap = {};
11058
11059function getDefaultDisplay( elem ) {
11060	var temp,
11061		doc = elem.ownerDocument,
11062		nodeName = elem.nodeName,
11063		display = defaultDisplayMap[ nodeName ];
11064
11065	if ( display ) {
11066		return display;
11067	}
11068
11069	temp = doc.body.appendChild( doc.createElement( nodeName ) );
11070	display = jQuery.css( temp, "display" );
11071
11072	temp.parentNode.removeChild( temp );
11073
11074	if ( display === "none" ) {
11075		display = "block";
11076	}
11077	defaultDisplayMap[ nodeName ] = display;
11078
11079	return display;
11080}
11081
11082function showHide( elements, show ) {
11083	var display, elem,
11084		values = [],
11085		index = 0,
11086		length = elements.length;
11087
11088	// Determine new display value for elements that need to change
11089	for ( ; index < length; index++ ) {
11090		elem = elements[ index ];
11091		if ( !elem.style ) {
11092			continue;
11093		}
11094
11095		display = elem.style.display;
11096		if ( show ) {
11097
11098			// Since we force visibility upon cascade-hidden elements, an immediate (and slow)
11099			// check is required in this first loop unless we have a nonempty display value (either
11100			// inline or about-to-be-restored)
11101			if ( display === "none" ) {
11102				values[ index ] = dataPriv.get( elem, "display" ) || null;
11103				if ( !values[ index ] ) {
11104					elem.style.display = "";
11105				}
11106			}
11107			if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) {
11108				values[ index ] = getDefaultDisplay( elem );
11109			}
11110		} else {
11111			if ( display !== "none" ) {
11112				values[ index ] = "none";
11113
11114				// Remember what we're overwriting
11115				dataPriv.set( elem, "display", display );
11116			}
11117		}
11118	}
11119
11120	// Set the display of the elements in a second loop to avoid constant reflow
11121	for ( index = 0; index < length; index++ ) {
11122		if ( values[ index ] != null ) {
11123			elements[ index ].style.display = values[ index ];
11124		}
11125	}
11126
11127	return elements;
11128}
11129
11130jQuery.fn.extend( {
11131	show: function() {
11132		return showHide( this, true );
11133	},
11134	hide: function() {
11135		return showHide( this );
11136	},
11137	toggle: function( state ) {
11138		if ( typeof state === "boolean" ) {
11139			return state ? this.show() : this.hide();
11140		}
11141
11142		return this.each( function() {
11143			if ( isHiddenWithinTree( this ) ) {
11144				jQuery( this ).show();
11145			} else {
11146				jQuery( this ).hide();
11147			}
11148		} );
11149	}
11150} );
11151var rcheckableType = ( /^(?:checkbox|radio)$/i );
11152
11153var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i );
11154
11155var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i );
11156
11157
11158
11159( function() {
11160	var fragment = document.createDocumentFragment(),
11161		div = fragment.appendChild( document.createElement( "div" ) ),
11162		input = document.createElement( "input" );
11163
11164	// Support: Android 4.0 - 4.3 only
11165	// Check state lost if the name is set (#11217)
11166	// Support: Windows Web Apps (WWA)
11167	// `name` and `type` must use .setAttribute for WWA (#14901)
11168	input.setAttribute( "type", "radio" );
11169	input.setAttribute( "checked", "checked" );
11170	input.setAttribute( "name", "t" );
11171
11172	div.appendChild( input );
11173
11174	// Support: Android <=4.1 only
11175	// Older WebKit doesn't clone checked state correctly in fragments
11176	support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
11177
11178	// Support: IE <=11 only
11179	// Make sure textarea (and checkbox) defaultValue is properly cloned
11180	div.innerHTML = "<textarea>x</textarea>";
11181	support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
11182
11183	// Support: IE <=9 only
11184	// IE <=9 replaces <option> tags with their contents when inserted outside of
11185	// the select element.
11186	div.innerHTML = "<option></option>";
11187	support.option = !!div.lastChild;
11188} )();
11189
11190
11191// We have to close these tags to support XHTML (#13200)
11192var wrapMap = {
11193
11194	// XHTML parsers do not magically insert elements in the
11195	// same way that tag soup parsers do. So we cannot shorten
11196	// this by omitting <tbody> or other required elements.
11197	thead: [ 1, "<table>", "</table>" ],
11198	col: [ 2, "<table><colgroup>", "</colgroup></table>" ],
11199	tr: [ 2, "<table><tbody>", "</tbody></table>" ],
11200	td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
11201
11202	_default: [ 0, "", "" ]
11203};
11204
11205wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
11206wrapMap.th = wrapMap.td;
11207
11208// Support: IE <=9 only
11209if ( !support.option ) {
11210	wrapMap.optgroup = wrapMap.option = [ 1, "<select multiple='multiple'>", "</select>" ];
11211}
11212
11213
11214function getAll( context, tag ) {
11215
11216	// Support: IE <=9 - 11 only
11217	// Use typeof to avoid zero-argument method invocation on host objects (#15151)
11218	var ret;
11219
11220	if ( typeof context.getElementsByTagName !== "undefined" ) {
11221		ret = context.getElementsByTagName( tag || "*" );
11222
11223	} else if ( typeof context.querySelectorAll !== "undefined" ) {
11224		ret = context.querySelectorAll( tag || "*" );
11225
11226	} else {
11227		ret = [];
11228	}
11229
11230	if ( tag === undefined || tag && nodeName( context, tag ) ) {
11231		return jQuery.merge( [ context ], ret );
11232	}
11233
11234	return ret;
11235}
11236
11237
11238// Mark scripts as having already been evaluated
11239function setGlobalEval( elems, refElements ) {
11240	var i = 0,
11241		l = elems.length;
11242
11243	for ( ; i < l; i++ ) {
11244		dataPriv.set(
11245			elems[ i ],
11246			"globalEval",
11247			!refElements || dataPriv.get( refElements[ i ], "globalEval" )
11248		);
11249	}
11250}
11251
11252
11253var rhtml = /<|&#?\w+;/;
11254
11255function buildFragment( elems, context, scripts, selection, ignored ) {
11256	var elem, tmp, tag, wrap, attached, j,
11257		fragment = context.createDocumentFragment(),
11258		nodes = [],
11259		i = 0,
11260		l = elems.length;
11261
11262	for ( ; i < l; i++ ) {
11263		elem = elems[ i ];
11264
11265		if ( elem || elem === 0 ) {
11266
11267			// Add nodes directly
11268			if ( toType( elem ) === "object" ) {
11269
11270				// Support: Android <=4.0 only, PhantomJS 1 only
11271				// push.apply(_, arraylike) throws on ancient WebKit
11272				jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
11273
11274			// Convert non-html into a text node
11275			} else if ( !rhtml.test( elem ) ) {
11276				nodes.push( context.createTextNode( elem ) );
11277
11278			// Convert html into DOM nodes
11279			} else {
11280				tmp = tmp || fragment.appendChild( context.createElement( "div" ) );
11281
11282				// Deserialize a standard representation
11283				tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
11284				wrap = wrapMap[ tag ] || wrapMap._default;
11285				tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];
11286
11287				// Descend through wrappers to the right content
11288				j = wrap[ 0 ];
11289				while ( j-- ) {
11290					tmp = tmp.lastChild;
11291				}
11292
11293				// Support: Android <=4.0 only, PhantomJS 1 only
11294				// push.apply(_, arraylike) throws on ancient WebKit
11295				jQuery.merge( nodes, tmp.childNodes );
11296
11297				// Remember the top-level container
11298				tmp = fragment.firstChild;
11299
11300				// Ensure the created nodes are orphaned (#12392)
11301				tmp.textContent = "";
11302			}
11303		}
11304	}
11305
11306	// Remove wrapper from fragment
11307	fragment.textContent = "";
11308
11309	i = 0;
11310	while ( ( elem = nodes[ i++ ] ) ) {
11311
11312		// Skip elements already in the context collection (trac-4087)
11313		if ( selection && jQuery.inArray( elem, selection ) > -1 ) {
11314			if ( ignored ) {
11315				ignored.push( elem );
11316			}
11317			continue;
11318		}
11319
11320		attached = isAttached( elem );
11321
11322		// Append to fragment
11323		tmp = getAll( fragment.appendChild( elem ), "script" );
11324
11325		// Preserve script evaluation history
11326		if ( attached ) {
11327			setGlobalEval( tmp );
11328		}
11329
11330		// Capture executables
11331		if ( scripts ) {
11332			j = 0;
11333			while ( ( elem = tmp[ j++ ] ) ) {
11334				if ( rscriptType.test( elem.type || "" ) ) {
11335					scripts.push( elem );
11336				}
11337			}
11338		}
11339	}
11340
11341	return fragment;
11342}
11343
11344
11345var rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
11346
11347function returnTrue() {
11348	return true;
11349}
11350
11351function returnFalse() {
11352	return false;
11353}
11354
11355// Support: IE <=9 - 11+
11356// focus() and blur() are asynchronous, except when they are no-op.
11357// So expect focus to be synchronous when the element is already active,
11358// and blur to be synchronous when the element is not already active.
11359// (focus and blur are always synchronous in other supported browsers,
11360// this just defines when we can count on it).
11361function expectSync( elem, type ) {
11362	return ( elem === safeActiveElement() ) === ( type === "focus" );
11363}
11364
11365// Support: IE <=9 only
11366// Accessing document.activeElement can throw unexpectedly
11367// https://bugs.jquery.com/ticket/13393
11368function safeActiveElement() {
11369	try {
11370		return document.activeElement;
11371	} catch ( err ) { }
11372}
11373
11374function on( elem, types, selector, data, fn, one ) {
11375	var origFn, type;
11376
11377	// Types can be a map of types/handlers
11378	if ( typeof types === "object" ) {
11379
11380		// ( types-Object, selector, data )
11381		if ( typeof selector !== "string" ) {
11382
11383			// ( types-Object, data )
11384			data = data || selector;
11385			selector = undefined;
11386		}
11387		for ( type in types ) {
11388			on( elem, type, selector, data, types[ type ], one );
11389		}
11390		return elem;
11391	}
11392
11393	if ( data == null && fn == null ) {
11394
11395		// ( types, fn )
11396		fn = selector;
11397		data = selector = undefined;
11398	} else if ( fn == null ) {
11399		if ( typeof selector === "string" ) {
11400
11401			// ( types, selector, fn )
11402			fn = data;
11403			data = undefined;
11404		} else {
11405
11406			// ( types, data, fn )
11407			fn = data;
11408			data = selector;
11409			selector = undefined;
11410		}
11411	}
11412	if ( fn === false ) {
11413		fn = returnFalse;
11414	} else if ( !fn ) {
11415		return elem;
11416	}
11417
11418	if ( one === 1 ) {
11419		origFn = fn;
11420		fn = function( event ) {
11421
11422			// Can use an empty set, since event contains the info
11423			jQuery().off( event );
11424			return origFn.apply( this, arguments );
11425		};
11426
11427		// Use same guid so caller can remove using origFn
11428		fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
11429	}
11430	return elem.each( function() {
11431		jQuery.event.add( this, types, fn, data, selector );
11432	} );
11433}
11434
11435/*
11436 * Helper functions for managing events -- not part of the public interface.
11437 * Props to Dean Edwards' addEvent library for many of the ideas.
11438 */
11439jQuery.event = {
11440
11441	global: {},
11442
11443	add: function( elem, types, handler, data, selector ) {
11444
11445		var handleObjIn, eventHandle, tmp,
11446			events, t, handleObj,
11447			special, handlers, type, namespaces, origType,
11448			elemData = dataPriv.get( elem );
11449
11450		// Only attach events to objects that accept data
11451		if ( !acceptData( elem ) ) {
11452			return;
11453		}
11454
11455		// Caller can pass in an object of custom data in lieu of the handler
11456		if ( handler.handler ) {
11457			handleObjIn = handler;
11458			handler = handleObjIn.handler;
11459			selector = handleObjIn.selector;
11460		}
11461
11462		// Ensure that invalid selectors throw exceptions at attach time
11463		// Evaluate against documentElement in case elem is a non-element node (e.g., document)
11464		if ( selector ) {
11465			jQuery.find.matchesSelector( documentElement, selector );
11466		}
11467
11468		// Make sure that the handler has a unique ID, used to find/remove it later
11469		if ( !handler.guid ) {
11470			handler.guid = jQuery.guid++;
11471		}
11472
11473		// Init the element's event structure and main handler, if this is the first
11474		if ( !( events = elemData.events ) ) {
11475			events = elemData.events = Object.create( null );
11476		}
11477		if ( !( eventHandle = elemData.handle ) ) {
11478			eventHandle = elemData.handle = function( e ) {
11479
11480				// Discard the second event of a jQuery.event.trigger() and
11481				// when an event is called after a page has unloaded
11482				return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ?
11483					jQuery.event.dispatch.apply( elem, arguments ) : undefined;
11484			};
11485		}
11486
11487		// Handle multiple events separated by a space
11488		types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
11489		t = types.length;
11490		while ( t-- ) {
11491			tmp = rtypenamespace.exec( types[ t ] ) || [];
11492			type = origType = tmp[ 1 ];
11493			namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
11494
11495			// There *must* be a type, no attaching namespace-only handlers
11496			if ( !type ) {
11497				continue;
11498			}
11499
11500			// If event changes its type, use the special event handlers for the changed type
11501			special = jQuery.event.special[ type ] || {};
11502
11503			// If selector defined, determine special event api type, otherwise given type
11504			type = ( selector ? special.delegateType : special.bindType ) || type;
11505
11506			// Update special based on newly reset type
11507			special = jQuery.event.special[ type ] || {};
11508
11509			// handleObj is passed to all event handlers
11510			handleObj = jQuery.extend( {
11511				type: type,
11512				origType: origType,
11513				data: data,
11514				handler: handler,
11515				guid: handler.guid,
11516				selector: selector,
11517				needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
11518				namespace: namespaces.join( "." )
11519			}, handleObjIn );
11520
11521			// Init the event handler queue if we're the first
11522			if ( !( handlers = events[ type ] ) ) {
11523				handlers = events[ type ] = [];
11524				handlers.delegateCount = 0;
11525
11526				// Only use addEventListener if the special events handler returns false
11527				if ( !special.setup ||
11528					special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
11529
11530					if ( elem.addEventListener ) {
11531						elem.addEventListener( type, eventHandle );
11532					}
11533				}
11534			}
11535
11536			if ( special.add ) {
11537				special.add.call( elem, handleObj );
11538
11539				if ( !handleObj.handler.guid ) {
11540					handleObj.handler.guid = handler.guid;
11541				}
11542			}
11543
11544			// Add to the element's handler list, delegates in front
11545			if ( selector ) {
11546				handlers.splice( handlers.delegateCount++, 0, handleObj );
11547			} else {
11548				handlers.push( handleObj );
11549			}
11550
11551			// Keep track of which events have ever been used, for event optimization
11552			jQuery.event.global[ type ] = true;
11553		}
11554
11555	},
11556
11557	// Detach an event or set of events from an element
11558	remove: function( elem, types, handler, selector, mappedTypes ) {
11559
11560		var j, origCount, tmp,
11561			events, t, handleObj,
11562			special, handlers, type, namespaces, origType,
11563			elemData = dataPriv.hasData( elem ) && dataPriv.get( elem );
11564
11565		if ( !elemData || !( events = elemData.events ) ) {
11566			return;
11567		}
11568
11569		// Once for each type.namespace in types; type may be omitted
11570		types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
11571		t = types.length;
11572		while ( t-- ) {
11573			tmp = rtypenamespace.exec( types[ t ] ) || [];
11574			type = origType = tmp[ 1 ];
11575			namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
11576
11577			// Unbind all events (on this namespace, if provided) for the element
11578			if ( !type ) {
11579				for ( type in events ) {
11580					jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
11581				}
11582				continue;
11583			}
11584
11585			special = jQuery.event.special[ type ] || {};
11586			type = ( selector ? special.delegateType : special.bindType ) || type;
11587			handlers = events[ type ] || [];
11588			tmp = tmp[ 2 ] &&
11589				new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" );
11590
11591			// Remove matching events
11592			origCount = j = handlers.length;
11593			while ( j-- ) {
11594				handleObj = handlers[ j ];
11595
11596				if ( ( mappedTypes || origType === handleObj.origType ) &&
11597					( !handler || handler.guid === handleObj.guid ) &&
11598					( !tmp || tmp.test( handleObj.namespace ) ) &&
11599					( !selector || selector === handleObj.selector ||
11600						selector === "**" && handleObj.selector ) ) {
11601					handlers.splice( j, 1 );
11602
11603					if ( handleObj.selector ) {
11604						handlers.delegateCount--;
11605					}
11606					if ( special.remove ) {
11607						special.remove.call( elem, handleObj );
11608					}
11609				}
11610			}
11611
11612			// Remove generic event handler if we removed something and no more handlers exist
11613			// (avoids potential for endless recursion during removal of special event handlers)
11614			if ( origCount && !handlers.length ) {
11615				if ( !special.teardown ||
11616					special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
11617
11618					jQuery.removeEvent( elem, type, elemData.handle );
11619				}
11620
11621				delete events[ type ];
11622			}
11623		}
11624
11625		// Remove data and the expando if it's no longer used
11626		if ( jQuery.isEmptyObject( events ) ) {
11627			dataPriv.remove( elem, "handle events" );
11628		}
11629	},
11630
11631	dispatch: function( nativeEvent ) {
11632
11633		var i, j, ret, matched, handleObj, handlerQueue,
11634			args = new Array( arguments.length ),
11635
11636			// Make a writable jQuery.Event from the native event object
11637			event = jQuery.event.fix( nativeEvent ),
11638
11639			handlers = (
11640				dataPriv.get( this, "events" ) || Object.create( null )
11641			)[ event.type ] || [],
11642			special = jQuery.event.special[ event.type ] || {};
11643
11644		// Use the fix-ed jQuery.Event rather than the (read-only) native event
11645		args[ 0 ] = event;
11646
11647		for ( i = 1; i < arguments.length; i++ ) {
11648			args[ i ] = arguments[ i ];
11649		}
11650
11651		event.delegateTarget = this;
11652
11653		// Call the preDispatch hook for the mapped type, and let it bail if desired
11654		if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
11655			return;
11656		}
11657
11658		// Determine handlers
11659		handlerQueue = jQuery.event.handlers.call( this, event, handlers );
11660
11661		// Run delegates first; they may want to stop propagation beneath us
11662		i = 0;
11663		while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {
11664			event.currentTarget = matched.elem;
11665
11666			j = 0;
11667			while ( ( handleObj = matched.handlers[ j++ ] ) &&
11668				!event.isImmediatePropagationStopped() ) {
11669
11670				// If the event is namespaced, then each handler is only invoked if it is
11671				// specially universal or its namespaces are a superset of the event's.
11672				if ( !event.rnamespace || handleObj.namespace === false ||
11673					event.rnamespace.test( handleObj.namespace ) ) {
11674
11675					event.handleObj = handleObj;
11676					event.data = handleObj.data;
11677
11678					ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||
11679						handleObj.handler ).apply( matched.elem, args );
11680
11681					if ( ret !== undefined ) {
11682						if ( ( event.result = ret ) === false ) {
11683							event.preventDefault();
11684							event.stopPropagation();
11685						}
11686					}
11687				}
11688			}
11689		}
11690
11691		// Call the postDispatch hook for the mapped type
11692		if ( special.postDispatch ) {
11693			special.postDispatch.call( this, event );
11694		}
11695
11696		return event.result;
11697	},
11698
11699	handlers: function( event, handlers ) {
11700		var i, handleObj, sel, matchedHandlers, matchedSelectors,
11701			handlerQueue = [],
11702			delegateCount = handlers.delegateCount,
11703			cur = event.target;
11704
11705		// Find delegate handlers
11706		if ( delegateCount &&
11707
11708			// Support: IE <=9
11709			// Black-hole SVG <use> instance trees (trac-13180)
11710			cur.nodeType &&
11711
11712			// Support: Firefox <=42
11713			// Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)
11714			// https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click
11715			// Support: IE 11 only
11716			// ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343)
11717			!( event.type === "click" && event.button >= 1 ) ) {
11718
11719			for ( ; cur !== this; cur = cur.parentNode || this ) {
11720
11721				// Don't check non-elements (#13208)
11722				// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
11723				if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) {
11724					matchedHandlers = [];
11725					matchedSelectors = {};
11726					for ( i = 0; i < delegateCount; i++ ) {
11727						handleObj = handlers[ i ];
11728
11729						// Don't conflict with Object.prototype properties (#13203)
11730						sel = handleObj.selector + " ";
11731
11732						if ( matchedSelectors[ sel ] === undefined ) {
11733							matchedSelectors[ sel ] = handleObj.needsContext ?
11734								jQuery( sel, this ).index( cur ) > -1 :
11735								jQuery.find( sel, this, null, [ cur ] ).length;
11736						}
11737						if ( matchedSelectors[ sel ] ) {
11738							matchedHandlers.push( handleObj );
11739						}
11740					}
11741					if ( matchedHandlers.length ) {
11742						handlerQueue.push( { elem: cur, handlers: matchedHandlers } );
11743					}
11744				}
11745			}
11746		}
11747
11748		// Add the remaining (directly-bound) handlers
11749		cur = this;
11750		if ( delegateCount < handlers.length ) {
11751			handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );
11752		}
11753
11754		return handlerQueue;
11755	},
11756
11757	addProp: function( name, hook ) {
11758		Object.defineProperty( jQuery.Event.prototype, name, {
11759			enumerable: true,
11760			configurable: true,
11761
11762			get: isFunction( hook ) ?
11763				function() {
11764					if ( this.originalEvent ) {
11765						return hook( this.originalEvent );
11766					}
11767				} :
11768				function() {
11769					if ( this.originalEvent ) {
11770						return this.originalEvent[ name ];
11771					}
11772				},
11773
11774			set: function( value ) {
11775				Object.defineProperty( this, name, {
11776					enumerable: true,
11777					configurable: true,
11778					writable: true,
11779					value: value
11780				} );
11781			}
11782		} );
11783	},
11784
11785	fix: function( originalEvent ) {
11786		return originalEvent[ jQuery.expando ] ?
11787			originalEvent :
11788			new jQuery.Event( originalEvent );
11789	},
11790
11791	special: {
11792		load: {
11793
11794			// Prevent triggered image.load events from bubbling to window.load
11795			noBubble: true
11796		},
11797		click: {
11798
11799			// Utilize native event to ensure correct state for checkable inputs
11800			setup: function( data ) {
11801
11802				// For mutual compressibility with _default, replace `this` access with a local var.
11803				// `|| data` is dead code meant only to preserve the variable through minification.
11804				var el = this || data;
11805
11806				// Claim the first handler
11807				if ( rcheckableType.test( el.type ) &&
11808					el.click && nodeName( el, "input" ) ) {
11809
11810					// dataPriv.set( el, "click", ... )
11811					leverageNative( el, "click", returnTrue );
11812				}
11813
11814				// Return false to allow normal processing in the caller
11815				return false;
11816			},
11817			trigger: function( data ) {
11818
11819				// For mutual compressibility with _default, replace `this` access with a local var.
11820				// `|| data` is dead code meant only to preserve the variable through minification.
11821				var el = this || data;
11822
11823				// Force setup before triggering a click
11824				if ( rcheckableType.test( el.type ) &&
11825					el.click && nodeName( el, "input" ) ) {
11826
11827					leverageNative( el, "click" );
11828				}
11829
11830				// Return non-false to allow normal event-path propagation
11831				return true;
11832			},
11833
11834			// For cross-browser consistency, suppress native .click() on links
11835			// Also prevent it if we're currently inside a leveraged native-event stack
11836			_default: function( event ) {
11837				var target = event.target;
11838				return rcheckableType.test( target.type ) &&
11839					target.click && nodeName( target, "input" ) &&
11840					dataPriv.get( target, "click" ) ||
11841					nodeName( target, "a" );
11842			}
11843		},
11844
11845		beforeunload: {
11846			postDispatch: function( event ) {
11847
11848				// Support: Firefox 20+
11849				// Firefox doesn't alert if the returnValue field is not set.
11850				if ( event.result !== undefined && event.originalEvent ) {
11851					event.originalEvent.returnValue = event.result;
11852				}
11853			}
11854		}
11855	}
11856};
11857
11858// Ensure the presence of an event listener that handles manually-triggered
11859// synthetic events by interrupting progress until reinvoked in response to
11860// *native* events that it fires directly, ensuring that state changes have
11861// already occurred before other listeners are invoked.
11862function leverageNative( el, type, expectSync ) {
11863
11864	// Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add
11865	if ( !expectSync ) {
11866		if ( dataPriv.get( el, type ) === undefined ) {
11867			jQuery.event.add( el, type, returnTrue );
11868		}
11869		return;
11870	}
11871
11872	// Register the controller as a special universal handler for all event namespaces
11873	dataPriv.set( el, type, false );
11874	jQuery.event.add( el, type, {
11875		namespace: false,
11876		handler: function( event ) {
11877			var notAsync, result,
11878				saved = dataPriv.get( this, type );
11879
11880			if ( ( event.isTrigger & 1 ) && this[ type ] ) {
11881
11882				// Interrupt processing of the outer synthetic .trigger()ed event
11883				// Saved data should be false in such cases, but might be a leftover capture object
11884				// from an async native handler (gh-4350)
11885				if ( !saved.length ) {
11886
11887					// Store arguments for use when handling the inner native event
11888					// There will always be at least one argument (an event object), so this array
11889					// will not be confused with a leftover capture object.
11890					saved = slice.call( arguments );
11891					dataPriv.set( this, type, saved );
11892
11893					// Trigger the native event and capture its result
11894					// Support: IE <=9 - 11+
11895					// focus() and blur() are asynchronous
11896					notAsync = expectSync( this, type );
11897					this[ type ]();
11898					result = dataPriv.get( this, type );
11899					if ( saved !== result || notAsync ) {
11900						dataPriv.set( this, type, false );
11901					} else {
11902						result = {};
11903					}
11904					if ( saved !== result ) {
11905
11906						// Cancel the outer synthetic event
11907						event.stopImmediatePropagation();
11908						event.preventDefault();
11909
11910						// Support: Chrome 86+
11911						// In Chrome, if an element having a focusout handler is blurred by
11912						// clicking outside of it, it invokes the handler synchronously. If
11913						// that handler calls `.remove()` on the element, the data is cleared,
11914						// leaving `result` undefined. We need to guard against this.
11915						return result && result.value;
11916					}
11917
11918				// If this is an inner synthetic event for an event with a bubbling surrogate
11919				// (focus or blur), assume that the surrogate already propagated from triggering the
11920				// native event and prevent that from happening again here.
11921				// This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the
11922				// bubbling surrogate propagates *after* the non-bubbling base), but that seems
11923				// less bad than duplication.
11924				} else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) {
11925					event.stopPropagation();
11926				}
11927
11928			// If this is a native event triggered above, everything is now in order
11929			// Fire an inner synthetic event with the original arguments
11930			} else if ( saved.length ) {
11931
11932				// ...and capture the result
11933				dataPriv.set( this, type, {
11934					value: jQuery.event.trigger(
11935
11936						// Support: IE <=9 - 11+
11937						// Extend with the prototype to reset the above stopImmediatePropagation()
11938						jQuery.extend( saved[ 0 ], jQuery.Event.prototype ),
11939						saved.slice( 1 ),
11940						this
11941					)
11942				} );
11943
11944				// Abort handling of the native event
11945				event.stopImmediatePropagation();
11946			}
11947		}
11948	} );
11949}
11950
11951jQuery.removeEvent = function( elem, type, handle ) {
11952
11953	// This "if" is needed for plain objects
11954	if ( elem.removeEventListener ) {
11955		elem.removeEventListener( type, handle );
11956	}
11957};
11958
11959jQuery.Event = function( src, props ) {
11960
11961	// Allow instantiation without the 'new' keyword
11962	if ( !( this instanceof jQuery.Event ) ) {
11963		return new jQuery.Event( src, props );
11964	}
11965
11966	// Event object
11967	if ( src && src.type ) {
11968		this.originalEvent = src;
11969		this.type = src.type;
11970
11971		// Events bubbling up the document may have been marked as prevented
11972		// by a handler lower down the tree; reflect the correct value.
11973		this.isDefaultPrevented = src.defaultPrevented ||
11974				src.defaultPrevented === undefined &&
11975
11976				// Support: Android <=2.3 only
11977				src.returnValue === false ?
11978			returnTrue :
11979			returnFalse;
11980
11981		// Create target properties
11982		// Support: Safari <=6 - 7 only
11983		// Target should not be a text node (#504, #13143)
11984		this.target = ( src.target && src.target.nodeType === 3 ) ?
11985			src.target.parentNode :
11986			src.target;
11987
11988		this.currentTarget = src.currentTarget;
11989		this.relatedTarget = src.relatedTarget;
11990
11991	// Event type
11992	} else {
11993		this.type = src;
11994	}
11995
11996	// Put explicitly provided properties onto the event object
11997	if ( props ) {
11998		jQuery.extend( this, props );
11999	}
12000
12001	// Create a timestamp if incoming event doesn't have one
12002	this.timeStamp = src && src.timeStamp || Date.now();
12003
12004	// Mark it as fixed
12005	this[ jQuery.expando ] = true;
12006};
12007
12008// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
12009// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
12010jQuery.Event.prototype = {
12011	constructor: jQuery.Event,
12012	isDefaultPrevented: returnFalse,
12013	isPropagationStopped: returnFalse,
12014	isImmediatePropagationStopped: returnFalse,
12015	isSimulated: false,
12016
12017	preventDefault: function() {
12018		var e = this.originalEvent;
12019
12020		this.isDefaultPrevented = returnTrue;
12021
12022		if ( e && !this.isSimulated ) {
12023			e.preventDefault();
12024		}
12025	},
12026	stopPropagation: function() {
12027		var e = this.originalEvent;
12028
12029		this.isPropagationStopped = returnTrue;
12030
12031		if ( e && !this.isSimulated ) {
12032			e.stopPropagation();
12033		}
12034	},
12035	stopImmediatePropagation: function() {
12036		var e = this.originalEvent;
12037
12038		this.isImmediatePropagationStopped = returnTrue;
12039
12040		if ( e && !this.isSimulated ) {
12041			e.stopImmediatePropagation();
12042		}
12043
12044		this.stopPropagation();
12045	}
12046};
12047
12048// Includes all common event props including KeyEvent and MouseEvent specific props
12049jQuery.each( {
12050	altKey: true,
12051	bubbles: true,
12052	cancelable: true,
12053	changedTouches: true,
12054	ctrlKey: true,
12055	detail: true,
12056	eventPhase: true,
12057	metaKey: true,
12058	pageX: true,
12059	pageY: true,
12060	shiftKey: true,
12061	view: true,
12062	"char": true,
12063	code: true,
12064	charCode: true,
12065	key: true,
12066	keyCode: true,
12067	button: true,
12068	buttons: true,
12069	clientX: true,
12070	clientY: true,
12071	offsetX: true,
12072	offsetY: true,
12073	pointerId: true,
12074	pointerType: true,
12075	screenX: true,
12076	screenY: true,
12077	targetTouches: true,
12078	toElement: true,
12079	touches: true,
12080	which: true
12081}, jQuery.event.addProp );
12082
12083jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) {
12084	jQuery.event.special[ type ] = {
12085
12086		// Utilize native event if possible so blur/focus sequence is correct
12087		setup: function() {
12088
12089			// Claim the first handler
12090			// dataPriv.set( this, "focus", ... )
12091			// dataPriv.set( this, "blur", ... )
12092			leverageNative( this, type, expectSync );
12093
12094			// Return false to allow normal processing in the caller
12095			return false;
12096		},
12097		trigger: function() {
12098
12099			// Force setup before trigger
12100			leverageNative( this, type );
12101
12102			// Return non-false to allow normal event-path propagation
12103			return true;
12104		},
12105
12106		// Suppress native focus or blur as it's already being fired
12107		// in leverageNative.
12108		_default: function() {
12109			return true;
12110		},
12111
12112		delegateType: delegateType
12113	};
12114} );
12115
12116// Create mouseenter/leave events using mouseover/out and event-time checks
12117// so that event delegation works in jQuery.
12118// Do the same for pointerenter/pointerleave and pointerover/pointerout
12119//
12120// Support: Safari 7 only
12121// Safari sends mouseenter too often; see:
12122// https://bugs.chromium.org/p/chromium/issues/detail?id=470258
12123// for the description of the bug (it existed in older Chrome versions as well).
12124jQuery.each( {
12125	mouseenter: "mouseover",
12126	mouseleave: "mouseout",
12127	pointerenter: "pointerover",
12128	pointerleave: "pointerout"
12129}, function( orig, fix ) {
12130	jQuery.event.special[ orig ] = {
12131		delegateType: fix,
12132		bindType: fix,
12133
12134		handle: function( event ) {
12135			var ret,
12136				target = this,
12137				related = event.relatedTarget,
12138				handleObj = event.handleObj;
12139
12140			// For mouseenter/leave call the handler if related is outside the target.
12141			// NB: No relatedTarget if the mouse left/entered the browser window
12142			if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {
12143				event.type = handleObj.origType;
12144				ret = handleObj.handler.apply( this, arguments );
12145				event.type = fix;
12146			}
12147			return ret;
12148		}
12149	};
12150} );
12151
12152jQuery.fn.extend( {
12153
12154	on: function( types, selector, data, fn ) {
12155		return on( this, types, selector, data, fn );
12156	},
12157	one: function( types, selector, data, fn ) {
12158		return on( this, types, selector, data, fn, 1 );
12159	},
12160	off: function( types, selector, fn ) {
12161		var handleObj, type;
12162		if ( types && types.preventDefault && types.handleObj ) {
12163
12164			// ( event )  dispatched jQuery.Event
12165			handleObj = types.handleObj;
12166			jQuery( types.delegateTarget ).off(
12167				handleObj.namespace ?
12168					handleObj.origType + "." + handleObj.namespace :
12169					handleObj.origType,
12170				handleObj.selector,
12171				handleObj.handler
12172			);
12173			return this;
12174		}
12175		if ( typeof types === "object" ) {
12176
12177			// ( types-object [, selector] )
12178			for ( type in types ) {
12179				this.off( type, selector, types[ type ] );
12180			}
12181			return this;
12182		}
12183		if ( selector === false || typeof selector === "function" ) {
12184
12185			// ( types [, fn] )
12186			fn = selector;
12187			selector = undefined;
12188		}
12189		if ( fn === false ) {
12190			fn = returnFalse;
12191		}
12192		return this.each( function() {
12193			jQuery.event.remove( this, types, fn, selector );
12194		} );
12195	}
12196} );
12197
12198
12199var
12200
12201	// Support: IE <=10 - 11, Edge 12 - 13 only
12202	// In IE/Edge using regex groups here causes severe slowdowns.
12203	// See https://connect.microsoft.com/IE/feedback/details/1736512/
12204	rnoInnerhtml = /<script|<style|<link/i,
12205
12206	// checked="checked" or checked
12207	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
12208	rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;
12209
12210// Prefer a tbody over its parent table for containing new rows
12211function manipulationTarget( elem, content ) {
12212	if ( nodeName( elem, "table" ) &&
12213		nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) {
12214
12215		return jQuery( elem ).children( "tbody" )[ 0 ] || elem;
12216	}
12217
12218	return elem;
12219}
12220
12221// Replace/restore the type attribute of script elements for safe DOM manipulation
12222function disableScript( elem ) {
12223	elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type;
12224	return elem;
12225}
12226function restoreScript( elem ) {
12227	if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) {
12228		elem.type = elem.type.slice( 5 );
12229	} else {
12230		elem.removeAttribute( "type" );
12231	}
12232
12233	return elem;
12234}
12235
12236function cloneCopyEvent( src, dest ) {
12237	var i, l, type, pdataOld, udataOld, udataCur, events;
12238
12239	if ( dest.nodeType !== 1 ) {
12240		return;
12241	}
12242
12243	// 1. Copy private data: events, handlers, etc.
12244	if ( dataPriv.hasData( src ) ) {
12245		pdataOld = dataPriv.get( src );
12246		events = pdataOld.events;
12247
12248		if ( events ) {
12249			dataPriv.remove( dest, "handle events" );
12250
12251			for ( type in events ) {
12252				for ( i = 0, l = events[ type ].length; i < l; i++ ) {
12253					jQuery.event.add( dest, type, events[ type ][ i ] );
12254				}
12255			}
12256		}
12257	}
12258
12259	// 2. Copy user data
12260	if ( dataUser.hasData( src ) ) {
12261		udataOld = dataUser.access( src );
12262		udataCur = jQuery.extend( {}, udataOld );
12263
12264		dataUser.set( dest, udataCur );
12265	}
12266}
12267
12268// Fix IE bugs, see support tests
12269function fixInput( src, dest ) {
12270	var nodeName = dest.nodeName.toLowerCase();
12271
12272	// Fails to persist the checked state of a cloned checkbox or radio button.
12273	if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
12274		dest.checked = src.checked;
12275
12276	// Fails to return the selected option to the default selected state when cloning options
12277	} else if ( nodeName === "input" || nodeName === "textarea" ) {
12278		dest.defaultValue = src.defaultValue;
12279	}
12280}
12281
12282function domManip( collection, args, callback, ignored ) {
12283
12284	// Flatten any nested arrays
12285	args = flat( args );
12286
12287	var fragment, first, scripts, hasScripts, node, doc,
12288		i = 0,
12289		l = collection.length,
12290		iNoClone = l - 1,
12291		value = args[ 0 ],
12292		valueIsFunction = isFunction( value );
12293
12294	// We can't cloneNode fragments that contain checked, in WebKit
12295	if ( valueIsFunction ||
12296			( l > 1 && typeof value === "string" &&
12297				!support.checkClone && rchecked.test( value ) ) ) {
12298		return collection.each( function( index ) {
12299			var self = collection.eq( index );
12300			if ( valueIsFunction ) {
12301				args[ 0 ] = value.call( this, index, self.html() );
12302			}
12303			domManip( self, args, callback, ignored );
12304		} );
12305	}
12306
12307	if ( l ) {
12308		fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );
12309		first = fragment.firstChild;
12310
12311		if ( fragment.childNodes.length === 1 ) {
12312			fragment = first;
12313		}
12314
12315		// Require either new content or an interest in ignored elements to invoke the callback
12316		if ( first || ignored ) {
12317			scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
12318			hasScripts = scripts.length;
12319
12320			// Use the original fragment for the last item
12321			// instead of the first because it can end up
12322			// being emptied incorrectly in certain situations (#8070).
12323			for ( ; i < l; i++ ) {
12324				node = fragment;
12325
12326				if ( i !== iNoClone ) {
12327					node = jQuery.clone( node, true, true );
12328
12329					// Keep references to cloned scripts for later restoration
12330					if ( hasScripts ) {
12331
12332						// Support: Android <=4.0 only, PhantomJS 1 only
12333						// push.apply(_, arraylike) throws on ancient WebKit
12334						jQuery.merge( scripts, getAll( node, "script" ) );
12335					}
12336				}
12337
12338				callback.call( collection[ i ], node, i );
12339			}
12340
12341			if ( hasScripts ) {
12342				doc = scripts[ scripts.length - 1 ].ownerDocument;
12343
12344				// Reenable scripts
12345				jQuery.map( scripts, restoreScript );
12346
12347				// Evaluate executable scripts on first document insertion
12348				for ( i = 0; i < hasScripts; i++ ) {
12349					node = scripts[ i ];
12350					if ( rscriptType.test( node.type || "" ) &&
12351						!dataPriv.access( node, "globalEval" ) &&
12352						jQuery.contains( doc, node ) ) {
12353
12354						if ( node.src && ( node.type || "" ).toLowerCase()  !== "module" ) {
12355
12356							// Optional AJAX dependency, but won't run scripts if not present
12357							if ( jQuery._evalUrl && !node.noModule ) {
12358								jQuery._evalUrl( node.src, {
12359									nonce: node.nonce || node.getAttribute( "nonce" )
12360								}, doc );
12361							}
12362						} else {
12363							DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc );
12364						}
12365					}
12366				}
12367			}
12368		}
12369	}
12370
12371	return collection;
12372}
12373
12374function remove( elem, selector, keepData ) {
12375	var node,
12376		nodes = selector ? jQuery.filter( selector, elem ) : elem,
12377		i = 0;
12378
12379	for ( ; ( node = nodes[ i ] ) != null; i++ ) {
12380		if ( !keepData && node.nodeType === 1 ) {
12381			jQuery.cleanData( getAll( node ) );
12382		}
12383
12384		if ( node.parentNode ) {
12385			if ( keepData && isAttached( node ) ) {
12386				setGlobalEval( getAll( node, "script" ) );
12387			}
12388			node.parentNode.removeChild( node );
12389		}
12390	}
12391
12392	return elem;
12393}
12394
12395jQuery.extend( {
12396	htmlPrefilter: function( html ) {
12397		return html;
12398	},
12399
12400	clone: function( elem, dataAndEvents, deepDataAndEvents ) {
12401		var i, l, srcElements, destElements,
12402			clone = elem.cloneNode( true ),
12403			inPage = isAttached( elem );
12404
12405		// Fix IE cloning issues
12406		if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&
12407				!jQuery.isXMLDoc( elem ) ) {
12408
12409			// We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2
12410			destElements = getAll( clone );
12411			srcElements = getAll( elem );
12412
12413			for ( i = 0, l = srcElements.length; i < l; i++ ) {
12414				fixInput( srcElements[ i ], destElements[ i ] );
12415			}
12416		}
12417
12418		// Copy the events from the original to the clone
12419		if ( dataAndEvents ) {
12420			if ( deepDataAndEvents ) {
12421				srcElements = srcElements || getAll( elem );
12422				destElements = destElements || getAll( clone );
12423
12424				for ( i = 0, l = srcElements.length; i < l; i++ ) {
12425					cloneCopyEvent( srcElements[ i ], destElements[ i ] );
12426				}
12427			} else {
12428				cloneCopyEvent( elem, clone );
12429			}
12430		}
12431
12432		// Preserve script evaluation history
12433		destElements = getAll( clone, "script" );
12434		if ( destElements.length > 0 ) {
12435			setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
12436		}
12437
12438		// Return the cloned set
12439		return clone;
12440	},
12441
12442	cleanData: function( elems ) {
12443		var data, elem, type,
12444			special = jQuery.event.special,
12445			i = 0;
12446
12447		for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {
12448			if ( acceptData( elem ) ) {
12449				if ( ( data = elem[ dataPriv.expando ] ) ) {
12450					if ( data.events ) {
12451						for ( type in data.events ) {
12452							if ( special[ type ] ) {
12453								jQuery.event.remove( elem, type );
12454
12455							// This is a shortcut to avoid jQuery.event.remove's overhead
12456							} else {
12457								jQuery.removeEvent( elem, type, data.handle );
12458							}
12459						}
12460					}
12461
12462					// Support: Chrome <=35 - 45+
12463					// Assign undefined instead of using delete, see Data#remove
12464					elem[ dataPriv.expando ] = undefined;
12465				}
12466				if ( elem[ dataUser.expando ] ) {
12467
12468					// Support: Chrome <=35 - 45+
12469					// Assign undefined instead of using delete, see Data#remove
12470					elem[ dataUser.expando ] = undefined;
12471				}
12472			}
12473		}
12474	}
12475} );
12476
12477jQuery.fn.extend( {
12478	detach: function( selector ) {
12479		return remove( this, selector, true );
12480	},
12481
12482	remove: function( selector ) {
12483		return remove( this, selector );
12484	},
12485
12486	text: function( value ) {
12487		return access( this, function( value ) {
12488			return value === undefined ?
12489				jQuery.text( this ) :
12490				this.empty().each( function() {
12491					if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
12492						this.textContent = value;
12493					}
12494				} );
12495		}, null, value, arguments.length );
12496	},
12497
12498	append: function() {
12499		return domManip( this, arguments, function( elem ) {
12500			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
12501				var target = manipulationTarget( this, elem );
12502				target.appendChild( elem );
12503			}
12504		} );
12505	},
12506
12507	prepend: function() {
12508		return domManip( this, arguments, function( elem ) {
12509			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
12510				var target = manipulationTarget( this, elem );
12511				target.insertBefore( elem, target.firstChild );
12512			}
12513		} );
12514	},
12515
12516	before: function() {
12517		return domManip( this, arguments, function( elem ) {
12518			if ( this.parentNode ) {
12519				this.parentNode.insertBefore( elem, this );
12520			}
12521		} );
12522	},
12523
12524	after: function() {
12525		return domManip( this, arguments, function( elem ) {
12526			if ( this.parentNode ) {
12527				this.parentNode.insertBefore( elem, this.nextSibling );
12528			}
12529		} );
12530	},
12531
12532	empty: function() {
12533		var elem,
12534			i = 0;
12535
12536		for ( ; ( elem = this[ i ] ) != null; i++ ) {
12537			if ( elem.nodeType === 1 ) {
12538
12539				// Prevent memory leaks
12540				jQuery.cleanData( getAll( elem, false ) );
12541
12542				// Remove any remaining nodes
12543				elem.textContent = "";
12544			}
12545		}
12546
12547		return this;
12548	},
12549
12550	clone: function( dataAndEvents, deepDataAndEvents ) {
12551		dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
12552		deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
12553
12554		return this.map( function() {
12555			return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
12556		} );
12557	},
12558
12559	html: function( value ) {
12560		return access( this, function( value ) {
12561			var elem = this[ 0 ] || {},
12562				i = 0,
12563				l = this.length;
12564
12565			if ( value === undefined && elem.nodeType === 1 ) {
12566				return elem.innerHTML;
12567			}
12568
12569			// See if we can take a shortcut and just use innerHTML
12570			if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
12571				!wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) {
12572
12573				value = jQuery.htmlPrefilter( value );
12574
12575				try {
12576					for ( ; i < l; i++ ) {
12577						elem = this[ i ] || {};
12578
12579						// Remove element nodes and prevent memory leaks
12580						if ( elem.nodeType === 1 ) {
12581							jQuery.cleanData( getAll( elem, false ) );
12582							elem.innerHTML = value;
12583						}
12584					}
12585
12586					elem = 0;
12587
12588				// If using innerHTML throws an exception, use the fallback method
12589				} catch ( e ) {}
12590			}
12591
12592			if ( elem ) {
12593				this.empty().append( value );
12594			}
12595		}, null, value, arguments.length );
12596	},
12597
12598	replaceWith: function() {
12599		var ignored = [];
12600
12601		// Make the changes, replacing each non-ignored context element with the new content
12602		return domManip( this, arguments, function( elem ) {
12603			var parent = this.parentNode;
12604
12605			if ( jQuery.inArray( this, ignored ) < 0 ) {
12606				jQuery.cleanData( getAll( this ) );
12607				if ( parent ) {
12608					parent.replaceChild( elem, this );
12609				}
12610			}
12611
12612		// Force callback invocation
12613		}, ignored );
12614	}
12615} );
12616
12617jQuery.each( {
12618	appendTo: "append",
12619	prependTo: "prepend",
12620	insertBefore: "before",
12621	insertAfter: "after",
12622	replaceAll: "replaceWith"
12623}, function( name, original ) {
12624	jQuery.fn[ name ] = function( selector ) {
12625		var elems,
12626			ret = [],
12627			insert = jQuery( selector ),
12628			last = insert.length - 1,
12629			i = 0;
12630
12631		for ( ; i <= last; i++ ) {
12632			elems = i === last ? this : this.clone( true );
12633			jQuery( insert[ i ] )[ original ]( elems );
12634
12635			// Support: Android <=4.0 only, PhantomJS 1 only
12636			// .get() because push.apply(_, arraylike) throws on ancient WebKit
12637			push.apply( ret, elems.get() );
12638		}
12639
12640		return this.pushStack( ret );
12641	};
12642} );
12643var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
12644
12645var getStyles = function( elem ) {
12646
12647		// Support: IE <=11 only, Firefox <=30 (#15098, #14150)
12648		// IE throws on elements created in popups
12649		// FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
12650		var view = elem.ownerDocument.defaultView;
12651
12652		if ( !view || !view.opener ) {
12653			view = window;
12654		}
12655
12656		return view.getComputedStyle( elem );
12657	};
12658
12659var swap = function( elem, options, callback ) {
12660	var ret, name,
12661		old = {};
12662
12663	// Remember the old values, and insert the new ones
12664	for ( name in options ) {
12665		old[ name ] = elem.style[ name ];
12666		elem.style[ name ] = options[ name ];
12667	}
12668
12669	ret = callback.call( elem );
12670
12671	// Revert the old values
12672	for ( name in options ) {
12673		elem.style[ name ] = old[ name ];
12674	}
12675
12676	return ret;
12677};
12678
12679
12680var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
12681
12682
12683
12684( function() {
12685
12686	// Executing both pixelPosition & boxSizingReliable tests require only one layout
12687	// so they're executed at the same time to save the second computation.
12688	function computeStyleTests() {
12689
12690		// This is a singleton, we need to execute it only once
12691		if ( !div ) {
12692			return;
12693		}
12694
12695		container.style.cssText = "position:absolute;left:-11111px;width:60px;" +
12696			"margin-top:1px;padding:0;border:0";
12697		div.style.cssText =
12698			"position:relative;display:block;box-sizing:border-box;overflow:scroll;" +
12699			"margin:auto;border:1px;padding:1px;" +
12700			"width:60%;top:1%";
12701		documentElement.appendChild( container ).appendChild( div );
12702
12703		var divStyle = window.getComputedStyle( div );
12704		pixelPositionVal = divStyle.top !== "1%";
12705
12706		// Support: Android 4.0 - 4.3 only, Firefox <=3 - 44
12707		reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12;
12708
12709		// Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3
12710		// Some styles come back with percentage values, even though they shouldn't
12711		div.style.right = "60%";
12712		pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36;
12713
12714		// Support: IE 9 - 11 only
12715		// Detect misreporting of content dimensions for box-sizing:border-box elements
12716		boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36;
12717
12718		// Support: IE 9 only
12719		// Detect overflow:scroll screwiness (gh-3699)
12720		// Support: Chrome <=64
12721		// Don't get tricked when zoom affects offsetWidth (gh-4029)
12722		div.style.position = "absolute";
12723		scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12;
12724
12725		documentElement.removeChild( container );
12726
12727		// Nullify the div so it wouldn't be stored in the memory and
12728		// it will also be a sign that checks already performed
12729		div = null;
12730	}
12731
12732	function roundPixelMeasures( measure ) {
12733		return Math.round( parseFloat( measure ) );
12734	}
12735
12736	var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal,
12737		reliableTrDimensionsVal, reliableMarginLeftVal,
12738		container = document.createElement( "div" ),
12739		div = document.createElement( "div" );
12740
12741	// Finish early in limited (non-browser) environments
12742	if ( !div.style ) {
12743		return;
12744	}
12745
12746	// Support: IE <=9 - 11 only
12747	// Style of cloned element affects source element cloned (#8908)
12748	div.style.backgroundClip = "content-box";
12749	div.cloneNode( true ).style.backgroundClip = "";
12750	support.clearCloneStyle = div.style.backgroundClip === "content-box";
12751
12752	jQuery.extend( support, {
12753		boxSizingReliable: function() {
12754			computeStyleTests();
12755			return boxSizingReliableVal;
12756		},
12757		pixelBoxStyles: function() {
12758			computeStyleTests();
12759			return pixelBoxStylesVal;
12760		},
12761		pixelPosition: function() {
12762			computeStyleTests();
12763			return pixelPositionVal;
12764		},
12765		reliableMarginLeft: function() {
12766			computeStyleTests();
12767			return reliableMarginLeftVal;
12768		},
12769		scrollboxSize: function() {
12770			computeStyleTests();
12771			return scrollboxSizeVal;
12772		},
12773
12774		// Support: IE 9 - 11+, Edge 15 - 18+
12775		// IE/Edge misreport `getComputedStyle` of table rows with width/height
12776		// set in CSS while `offset*` properties report correct values.
12777		// Behavior in IE 9 is more subtle than in newer versions & it passes
12778		// some versions of this test; make sure not to make it pass there!
12779		//
12780		// Support: Firefox 70+
12781		// Only Firefox includes border widths
12782		// in computed dimensions. (gh-4529)
12783		reliableTrDimensions: function() {
12784			var table, tr, trChild, trStyle;
12785			if ( reliableTrDimensionsVal == null ) {
12786				table = document.createElement( "table" );
12787				tr = document.createElement( "tr" );
12788				trChild = document.createElement( "div" );
12789
12790				table.style.cssText = "position:absolute;left:-11111px;border-collapse:separate";
12791				tr.style.cssText = "border:1px solid";
12792
12793				// Support: Chrome 86+
12794				// Height set through cssText does not get applied.
12795				// Computed height then comes back as 0.
12796				tr.style.height = "1px";
12797				trChild.style.height = "9px";
12798
12799				// Support: Android 8 Chrome 86+
12800				// In our bodyBackground.html iframe,
12801				// display for all div elements is set to "inline",
12802				// which causes a problem only in Android 8 Chrome 86.
12803				// Ensuring the div is display: block
12804				// gets around this issue.
12805				trChild.style.display = "block";
12806
12807				documentElement
12808					.appendChild( table )
12809					.appendChild( tr )
12810					.appendChild( trChild );
12811
12812				trStyle = window.getComputedStyle( tr );
12813				reliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) +
12814					parseInt( trStyle.borderTopWidth, 10 ) +
12815					parseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight;
12816
12817				documentElement.removeChild( table );
12818			}
12819			return reliableTrDimensionsVal;
12820		}
12821	} );
12822} )();
12823
12824
12825function curCSS( elem, name, computed ) {
12826	var width, minWidth, maxWidth, ret,
12827
12828		// Support: Firefox 51+
12829		// Retrieving style before computed somehow
12830		// fixes an issue with getting wrong values
12831		// on detached elements
12832		style = elem.style;
12833
12834	computed = computed || getStyles( elem );
12835
12836	// getPropertyValue is needed for:
12837	//   .css('filter') (IE 9 only, #12537)
12838	//   .css('--customProperty) (#3144)
12839	if ( computed ) {
12840		ret = computed.getPropertyValue( name ) || computed[ name ];
12841
12842		if ( ret === "" && !isAttached( elem ) ) {
12843			ret = jQuery.style( elem, name );
12844		}
12845
12846		// A tribute to the "awesome hack by Dean Edwards"
12847		// Android Browser returns percentage for some values,
12848		// but width seems to be reliably pixels.
12849		// This is against the CSSOM draft spec:
12850		// https://drafts.csswg.org/cssom/#resolved-values
12851		if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) {
12852
12853			// Remember the original values
12854			width = style.width;
12855			minWidth = style.minWidth;
12856			maxWidth = style.maxWidth;
12857
12858			// Put in the new values to get a computed value out
12859			style.minWidth = style.maxWidth = style.width = ret;
12860			ret = computed.width;
12861
12862			// Revert the changed values
12863			style.width = width;
12864			style.minWidth = minWidth;
12865			style.maxWidth = maxWidth;
12866		}
12867	}
12868
12869	return ret !== undefined ?
12870
12871		// Support: IE <=9 - 11 only
12872		// IE returns zIndex value as an integer.
12873		ret + "" :
12874		ret;
12875}
12876
12877
12878function addGetHookIf( conditionFn, hookFn ) {
12879
12880	// Define the hook, we'll check on the first run if it's really needed.
12881	return {
12882		get: function() {
12883			if ( conditionFn() ) {
12884
12885				// Hook not needed (or it's not possible to use it due
12886				// to missing dependency), remove it.
12887				delete this.get;
12888				return;
12889			}
12890
12891			// Hook needed; redefine it so that the support test is not executed again.
12892			return ( this.get = hookFn ).apply( this, arguments );
12893		}
12894	};
12895}
12896
12897
12898var cssPrefixes = [ "Webkit", "Moz", "ms" ],
12899	emptyStyle = document.createElement( "div" ).style,
12900	vendorProps = {};
12901
12902// Return a vendor-prefixed property or undefined
12903function vendorPropName( name ) {
12904
12905	// Check for vendor prefixed names
12906	var capName = name[ 0 ].toUpperCase() + name.slice( 1 ),
12907		i = cssPrefixes.length;
12908
12909	while ( i-- ) {
12910		name = cssPrefixes[ i ] + capName;
12911		if ( name in emptyStyle ) {
12912			return name;
12913		}
12914	}
12915}
12916
12917// Return a potentially-mapped jQuery.cssProps or vendor prefixed property
12918function finalPropName( name ) {
12919	var final = jQuery.cssProps[ name ] || vendorProps[ name ];
12920
12921	if ( final ) {
12922		return final;
12923	}
12924	if ( name in emptyStyle ) {
12925		return name;
12926	}
12927	return vendorProps[ name ] = vendorPropName( name ) || name;
12928}
12929
12930
12931var
12932
12933	// Swappable if display is none or starts with table
12934	// except "table", "table-cell", or "table-caption"
12935	// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
12936	rdisplayswap = /^(none|table(?!-c[ea]).+)/,
12937	rcustomProp = /^--/,
12938	cssShow = { position: "absolute", visibility: "hidden", display: "block" },
12939	cssNormalTransform = {
12940		letterSpacing: "0",
12941		fontWeight: "400"
12942	};
12943
12944function setPositiveNumber( _elem, value, subtract ) {
12945
12946	// Any relative (+/-) values have already been
12947	// normalized at this point
12948	var matches = rcssNum.exec( value );
12949	return matches ?
12950
12951		// Guard against undefined "subtract", e.g., when used as in cssHooks
12952		Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) :
12953		value;
12954}
12955
12956function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) {
12957	var i = dimension === "width" ? 1 : 0,
12958		extra = 0,
12959		delta = 0;
12960
12961	// Adjustment may not be necessary
12962	if ( box === ( isBorderBox ? "border" : "content" ) ) {
12963		return 0;
12964	}
12965
12966	for ( ; i < 4; i += 2 ) {
12967
12968		// Both box models exclude margin
12969		if ( box === "margin" ) {
12970			delta += jQuery.css( elem, box + cssExpand[ i ], true, styles );
12971		}
12972
12973		// If we get here with a content-box, we're seeking "padding" or "border" or "margin"
12974		if ( !isBorderBox ) {
12975
12976			// Add padding
12977			delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
12978
12979			// For "border" or "margin", add border
12980			if ( box !== "padding" ) {
12981				delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
12982
12983			// But still keep track of it otherwise
12984			} else {
12985				extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
12986			}
12987
12988		// If we get here with a border-box (content + padding + border), we're seeking "content" or
12989		// "padding" or "margin"
12990		} else {
12991
12992			// For "content", subtract padding
12993			if ( box === "content" ) {
12994				delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
12995			}
12996
12997			// For "content" or "padding", subtract border
12998			if ( box !== "margin" ) {
12999				delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
13000			}
13001		}
13002	}
13003
13004	// Account for positive content-box scroll gutter when requested by providing computedVal
13005	if ( !isBorderBox && computedVal >= 0 ) {
13006
13007		// offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border
13008		// Assuming integer scroll gutter, subtract the rest and round down
13009		delta += Math.max( 0, Math.ceil(
13010			elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -
13011			computedVal -
13012			delta -
13013			extra -
13014			0.5
13015
13016		// If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter
13017		// Use an explicit zero to avoid NaN (gh-3964)
13018		) ) || 0;
13019	}
13020
13021	return delta;
13022}
13023
13024function getWidthOrHeight( elem, dimension, extra ) {
13025
13026	// Start with computed style
13027	var styles = getStyles( elem ),
13028
13029		// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322).
13030		// Fake content-box until we know it's needed to know the true value.
13031		boxSizingNeeded = !support.boxSizingReliable() || extra,
13032		isBorderBox = boxSizingNeeded &&
13033			jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
13034		valueIsBorderBox = isBorderBox,
13035
13036		val = curCSS( elem, dimension, styles ),
13037		offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 );
13038
13039	// Support: Firefox <=54
13040	// Return a confounding non-pixel value or feign ignorance, as appropriate.
13041	if ( rnumnonpx.test( val ) ) {
13042		if ( !extra ) {
13043			return val;
13044		}
13045		val = "auto";
13046	}
13047
13048
13049	// Support: IE 9 - 11 only
13050	// Use offsetWidth/offsetHeight for when box sizing is unreliable.
13051	// In those cases, the computed value can be trusted to be border-box.
13052	if ( ( !support.boxSizingReliable() && isBorderBox ||
13053
13054		// Support: IE 10 - 11+, Edge 15 - 18+
13055		// IE/Edge misreport `getComputedStyle` of table rows with width/height
13056		// set in CSS while `offset*` properties report correct values.
13057		// Interestingly, in some cases IE 9 doesn't suffer from this issue.
13058		!support.reliableTrDimensions() && nodeName( elem, "tr" ) ||
13059
13060		// Fall back to offsetWidth/offsetHeight when value is "auto"
13061		// This happens for inline elements with no explicit setting (gh-3571)
13062		val === "auto" ||
13063
13064		// Support: Android <=4.1 - 4.3 only
13065		// Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)
13066		!parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) &&
13067
13068		// Make sure the element is visible & connected
13069		elem.getClientRects().length ) {
13070
13071		isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
13072
13073		// Where available, offsetWidth/offsetHeight approximate border box dimensions.
13074		// Where not available (e.g., SVG), assume unreliable box-sizing and interpret the
13075		// retrieved value as a content box dimension.
13076		valueIsBorderBox = offsetProp in elem;
13077		if ( valueIsBorderBox ) {
13078			val = elem[ offsetProp ];
13079		}
13080	}
13081
13082	// Normalize "" and auto
13083	val = parseFloat( val ) || 0;
13084
13085	// Adjust for the element's box model
13086	return ( val +
13087		boxModelAdjustment(
13088			elem,
13089			dimension,
13090			extra || ( isBorderBox ? "border" : "content" ),
13091			valueIsBorderBox,
13092			styles,
13093
13094			// Provide the current computed size to request scroll gutter calculation (gh-3589)
13095			val
13096		)
13097	) + "px";
13098}
13099
13100jQuery.extend( {
13101
13102	// Add in style property hooks for overriding the default
13103	// behavior of getting and setting a style property
13104	cssHooks: {
13105		opacity: {
13106			get: function( elem, computed ) {
13107				if ( computed ) {
13108
13109					// We should always get a number back from opacity
13110					var ret = curCSS( elem, "opacity" );
13111					return ret === "" ? "1" : ret;
13112				}
13113			}
13114		}
13115	},
13116
13117	// Don't automatically add "px" to these possibly-unitless properties
13118	cssNumber: {
13119		"animationIterationCount": true,
13120		"columnCount": true,
13121		"fillOpacity": true,
13122		"flexGrow": true,
13123		"flexShrink": true,
13124		"fontWeight": true,
13125		"gridArea": true,
13126		"gridColumn": true,
13127		"gridColumnEnd": true,
13128		"gridColumnStart": true,
13129		"gridRow": true,
13130		"gridRowEnd": true,
13131		"gridRowStart": true,
13132		"lineHeight": true,
13133		"opacity": true,
13134		"order": true,
13135		"orphans": true,
13136		"widows": true,
13137		"zIndex": true,
13138		"zoom": true
13139	},
13140
13141	// Add in properties whose names you wish to fix before
13142	// setting or getting the value
13143	cssProps: {},
13144
13145	// Get and set the style property on a DOM Node
13146	style: function( elem, name, value, extra ) {
13147
13148		// Don't set styles on text and comment nodes
13149		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
13150			return;
13151		}
13152
13153		// Make sure that we're working with the right name
13154		var ret, type, hooks,
13155			origName = camelCase( name ),
13156			isCustomProp = rcustomProp.test( name ),
13157			style = elem.style;
13158
13159		// Make sure that we're working with the right name. We don't
13160		// want to query the value if it is a CSS custom property
13161		// since they are user-defined.
13162		if ( !isCustomProp ) {
13163			name = finalPropName( origName );
13164		}
13165
13166		// Gets hook for the prefixed version, then unprefixed version
13167		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
13168
13169		// Check if we're setting a value
13170		if ( value !== undefined ) {
13171			type = typeof value;
13172
13173			// Convert "+=" or "-=" to relative numbers (#7345)
13174			if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {
13175				value = adjustCSS( elem, name, ret );
13176
13177				// Fixes bug #9237
13178				type = "number";
13179			}
13180
13181			// Make sure that null and NaN values aren't set (#7116)
13182			if ( value == null || value !== value ) {
13183				return;
13184			}
13185
13186			// If a number was passed in, add the unit (except for certain CSS properties)
13187			// The isCustomProp check can be removed in jQuery 4.0 when we only auto-append
13188			// "px" to a few hardcoded values.
13189			if ( type === "number" && !isCustomProp ) {
13190				value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" );
13191			}
13192
13193			// background-* props affect original clone's values
13194			if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) {
13195				style[ name ] = "inherit";
13196			}
13197
13198			// If a hook was provided, use that value, otherwise just set the specified value
13199			if ( !hooks || !( "set" in hooks ) ||
13200				( value = hooks.set( elem, value, extra ) ) !== undefined ) {
13201
13202				if ( isCustomProp ) {
13203					style.setProperty( name, value );
13204				} else {
13205					style[ name ] = value;
13206				}
13207			}
13208
13209		} else {
13210
13211			// If a hook was provided get the non-computed value from there
13212			if ( hooks && "get" in hooks &&
13213				( ret = hooks.get( elem, false, extra ) ) !== undefined ) {
13214
13215				return ret;
13216			}
13217
13218			// Otherwise just get the value from the style object
13219			return style[ name ];
13220		}
13221	},
13222
13223	css: function( elem, name, extra, styles ) {
13224		var val, num, hooks,
13225			origName = camelCase( name ),
13226			isCustomProp = rcustomProp.test( name );
13227
13228		// Make sure that we're working with the right name. We don't
13229		// want to modify the value if it is a CSS custom property
13230		// since they are user-defined.
13231		if ( !isCustomProp ) {
13232			name = finalPropName( origName );
13233		}
13234
13235		// Try prefixed name followed by the unprefixed name
13236		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
13237
13238		// If a hook was provided get the computed value from there
13239		if ( hooks && "get" in hooks ) {
13240			val = hooks.get( elem, true, extra );
13241		}
13242
13243		// Otherwise, if a way to get the computed value exists, use that
13244		if ( val === undefined ) {
13245			val = curCSS( elem, name, styles );
13246		}
13247
13248		// Convert "normal" to computed value
13249		if ( val === "normal" && name in cssNormalTransform ) {
13250			val = cssNormalTransform[ name ];
13251		}
13252
13253		// Make numeric if forced or a qualifier was provided and val looks numeric
13254		if ( extra === "" || extra ) {
13255			num = parseFloat( val );
13256			return extra === true || isFinite( num ) ? num || 0 : val;
13257		}
13258
13259		return val;
13260	}
13261} );
13262
13263jQuery.each( [ "height", "width" ], function( _i, dimension ) {
13264	jQuery.cssHooks[ dimension ] = {
13265		get: function( elem, computed, extra ) {
13266			if ( computed ) {
13267
13268				// Certain elements can have dimension info if we invisibly show them
13269				// but it must have a current display style that would benefit
13270				return rdisplayswap.test( jQuery.css( elem, "display" ) ) &&
13271
13272					// Support: Safari 8+
13273					// Table columns in Safari have non-zero offsetWidth & zero
13274					// getBoundingClientRect().width unless display is changed.
13275					// Support: IE <=11 only
13276					// Running getBoundingClientRect on a disconnected node
13277					// in IE throws an error.
13278					( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?
13279					swap( elem, cssShow, function() {
13280						return getWidthOrHeight( elem, dimension, extra );
13281					} ) :
13282					getWidthOrHeight( elem, dimension, extra );
13283			}
13284		},
13285
13286		set: function( elem, value, extra ) {
13287			var matches,
13288				styles = getStyles( elem ),
13289
13290				// Only read styles.position if the test has a chance to fail
13291				// to avoid forcing a reflow.
13292				scrollboxSizeBuggy = !support.scrollboxSize() &&
13293					styles.position === "absolute",
13294
13295				// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991)
13296				boxSizingNeeded = scrollboxSizeBuggy || extra,
13297				isBorderBox = boxSizingNeeded &&
13298					jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
13299				subtract = extra ?
13300					boxModelAdjustment(
13301						elem,
13302						dimension,
13303						extra,
13304						isBorderBox,
13305						styles
13306					) :
13307					0;
13308
13309			// Account for unreliable border-box dimensions by comparing offset* to computed and
13310			// faking a content-box to get border and padding (gh-3699)
13311			if ( isBorderBox && scrollboxSizeBuggy ) {
13312				subtract -= Math.ceil(
13313					elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -
13314					parseFloat( styles[ dimension ] ) -
13315					boxModelAdjustment( elem, dimension, "border", false, styles ) -
13316					0.5
13317				);
13318			}
13319
13320			// Convert to pixels if value adjustment is needed
13321			if ( subtract && ( matches = rcssNum.exec( value ) ) &&
13322				( matches[ 3 ] || "px" ) !== "px" ) {
13323
13324				elem.style[ dimension ] = value;
13325				value = jQuery.css( elem, dimension );
13326			}
13327
13328			return setPositiveNumber( elem, value, subtract );
13329		}
13330	};
13331} );
13332
13333jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,
13334	function( elem, computed ) {
13335		if ( computed ) {
13336			return ( parseFloat( curCSS( elem, "marginLeft" ) ) ||
13337				elem.getBoundingClientRect().left -
13338					swap( elem, { marginLeft: 0 }, function() {
13339						return elem.getBoundingClientRect().left;
13340					} )
13341			) + "px";
13342		}
13343	}
13344);
13345
13346// These hooks are used by animate to expand properties
13347jQuery.each( {
13348	margin: "",
13349	padding: "",
13350	border: "Width"
13351}, function( prefix, suffix ) {
13352	jQuery.cssHooks[ prefix + suffix ] = {
13353		expand: function( value ) {
13354			var i = 0,
13355				expanded = {},
13356
13357				// Assumes a single number if not a string
13358				parts = typeof value === "string" ? value.split( " " ) : [ value ];
13359
13360			for ( ; i < 4; i++ ) {
13361				expanded[ prefix + cssExpand[ i ] + suffix ] =
13362					parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
13363			}
13364
13365			return expanded;
13366		}
13367	};
13368
13369	if ( prefix !== "margin" ) {
13370		jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
13371	}
13372} );
13373
13374jQuery.fn.extend( {
13375	css: function( name, value ) {
13376		return access( this, function( elem, name, value ) {
13377			var styles, len,
13378				map = {},
13379				i = 0;
13380
13381			if ( Array.isArray( name ) ) {
13382				styles = getStyles( elem );
13383				len = name.length;
13384
13385				for ( ; i < len; i++ ) {
13386					map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
13387				}
13388
13389				return map;
13390			}
13391
13392			return value !== undefined ?
13393				jQuery.style( elem, name, value ) :
13394				jQuery.css( elem, name );
13395		}, name, value, arguments.length > 1 );
13396	}
13397} );
13398
13399
13400function Tween( elem, options, prop, end, easing ) {
13401	return new Tween.prototype.init( elem, options, prop, end, easing );
13402}
13403jQuery.Tween = Tween;
13404
13405Tween.prototype = {
13406	constructor: Tween,
13407	init: function( elem, options, prop, end, easing, unit ) {
13408		this.elem = elem;
13409		this.prop = prop;
13410		this.easing = easing || jQuery.easing._default;
13411		this.options = options;
13412		this.start = this.now = this.cur();
13413		this.end = end;
13414		this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
13415	},
13416	cur: function() {
13417		var hooks = Tween.propHooks[ this.prop ];
13418
13419		return hooks && hooks.get ?
13420			hooks.get( this ) :
13421			Tween.propHooks._default.get( this );
13422	},
13423	run: function( percent ) {
13424		var eased,
13425			hooks = Tween.propHooks[ this.prop ];
13426
13427		if ( this.options.duration ) {
13428			this.pos = eased = jQuery.easing[ this.easing ](
13429				percent, this.options.duration * percent, 0, 1, this.options.duration
13430			);
13431		} else {
13432			this.pos = eased = percent;
13433		}
13434		this.now = ( this.end - this.start ) * eased + this.start;
13435
13436		if ( this.options.step ) {
13437			this.options.step.call( this.elem, this.now, this );
13438		}
13439
13440		if ( hooks && hooks.set ) {
13441			hooks.set( this );
13442		} else {
13443			Tween.propHooks._default.set( this );
13444		}
13445		return this;
13446	}
13447};
13448
13449Tween.prototype.init.prototype = Tween.prototype;
13450
13451Tween.propHooks = {
13452	_default: {
13453		get: function( tween ) {
13454			var result;
13455
13456			// Use a property on the element directly when it is not a DOM element,
13457			// or when there is no matching style property that exists.
13458			if ( tween.elem.nodeType !== 1 ||
13459				tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {
13460				return tween.elem[ tween.prop ];
13461			}
13462
13463			// Passing an empty string as a 3rd parameter to .css will automatically
13464			// attempt a parseFloat and fallback to a string if the parse fails.
13465			// Simple values such as "10px" are parsed to Float;
13466			// complex values such as "rotate(1rad)" are returned as-is.
13467			result = jQuery.css( tween.elem, tween.prop, "" );
13468
13469			// Empty strings, null, undefined and "auto" are converted to 0.
13470			return !result || result === "auto" ? 0 : result;
13471		},
13472		set: function( tween ) {
13473
13474			// Use step hook for back compat.
13475			// Use cssHook if its there.
13476			// Use .style if available and use plain properties where available.
13477			if ( jQuery.fx.step[ tween.prop ] ) {
13478				jQuery.fx.step[ tween.prop ]( tween );
13479			} else if ( tween.elem.nodeType === 1 && (
13480				jQuery.cssHooks[ tween.prop ] ||
13481					tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) {
13482				jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
13483			} else {
13484				tween.elem[ tween.prop ] = tween.now;
13485			}
13486		}
13487	}
13488};
13489
13490// Support: IE <=9 only
13491// Panic based approach to setting things on disconnected nodes
13492Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
13493	set: function( tween ) {
13494		if ( tween.elem.nodeType && tween.elem.parentNode ) {
13495			tween.elem[ tween.prop ] = tween.now;
13496		}
13497	}
13498};
13499
13500jQuery.easing = {
13501	linear: function( p ) {
13502		return p;
13503	},
13504	swing: function( p ) {
13505		return 0.5 - Math.cos( p * Math.PI ) / 2;
13506	},
13507	_default: "swing"
13508};
13509
13510jQuery.fx = Tween.prototype.init;
13511
13512// Back compat <1.8 extension point
13513jQuery.fx.step = {};
13514
13515
13516
13517
13518var
13519	fxNow, inProgress,
13520	rfxtypes = /^(?:toggle|show|hide)$/,
13521	rrun = /queueHooks$/;
13522
13523function schedule() {
13524	if ( inProgress ) {
13525		if ( document.hidden === false && window.requestAnimationFrame ) {
13526			window.requestAnimationFrame( schedule );
13527		} else {
13528			window.setTimeout( schedule, jQuery.fx.interval );
13529		}
13530
13531		jQuery.fx.tick();
13532	}
13533}
13534
13535// Animations created synchronously will run synchronously
13536function createFxNow() {
13537	window.setTimeout( function() {
13538		fxNow = undefined;
13539	} );
13540	return ( fxNow = Date.now() );
13541}
13542
13543// Generate parameters to create a standard animation
13544function genFx( type, includeWidth ) {
13545	var which,
13546		i = 0,
13547		attrs = { height: type };
13548
13549	// If we include width, step value is 1 to do all cssExpand values,
13550	// otherwise step value is 2 to skip over Left and Right
13551	includeWidth = includeWidth ? 1 : 0;
13552	for ( ; i < 4; i += 2 - includeWidth ) {
13553		which = cssExpand[ i ];
13554		attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
13555	}
13556
13557	if ( includeWidth ) {
13558		attrs.opacity = attrs.width = type;
13559	}
13560
13561	return attrs;
13562}
13563
13564function createTween( value, prop, animation ) {
13565	var tween,
13566		collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ),
13567		index = 0,
13568		length = collection.length;
13569	for ( ; index < length; index++ ) {
13570		if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {
13571
13572			// We're done with this property
13573			return tween;
13574		}
13575	}
13576}
13577
13578function defaultPrefilter( elem, props, opts ) {
13579	var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,
13580		isBox = "width" in props || "height" in props,
13581		anim = this,
13582		orig = {},
13583		style = elem.style,
13584		hidden = elem.nodeType && isHiddenWithinTree( elem ),
13585		dataShow = dataPriv.get( elem, "fxshow" );
13586
13587	// Queue-skipping animations hijack the fx hooks
13588	if ( !opts.queue ) {
13589		hooks = jQuery._queueHooks( elem, "fx" );
13590		if ( hooks.unqueued == null ) {
13591			hooks.unqueued = 0;
13592			oldfire = hooks.empty.fire;
13593			hooks.empty.fire = function() {
13594				if ( !hooks.unqueued ) {
13595					oldfire();
13596				}
13597			};
13598		}
13599		hooks.unqueued++;
13600
13601		anim.always( function() {
13602
13603			// Ensure the complete handler is called before this completes
13604			anim.always( function() {
13605				hooks.unqueued--;
13606				if ( !jQuery.queue( elem, "fx" ).length ) {
13607					hooks.empty.fire();
13608				}
13609			} );
13610		} );
13611	}
13612
13613	// Detect show/hide animations
13614	for ( prop in props ) {
13615		value = props[ prop ];
13616		if ( rfxtypes.test( value ) ) {
13617			delete props[ prop ];
13618			toggle = toggle || value === "toggle";
13619			if ( value === ( hidden ? "hide" : "show" ) ) {
13620
13621				// Pretend to be hidden if this is a "show" and
13622				// there is still data from a stopped show/hide
13623				if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) {
13624					hidden = true;
13625
13626				// Ignore all other no-op show/hide data
13627				} else {
13628					continue;
13629				}
13630			}
13631			orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
13632		}
13633	}
13634
13635	// Bail out if this is a no-op like .hide().hide()
13636	propTween = !jQuery.isEmptyObject( props );
13637	if ( !propTween && jQuery.isEmptyObject( orig ) ) {
13638		return;
13639	}
13640
13641	// Restrict "overflow" and "display" styles during box animations
13642	if ( isBox && elem.nodeType === 1 ) {
13643
13644		// Support: IE <=9 - 11, Edge 12 - 15
13645		// Record all 3 overflow attributes because IE does not infer the shorthand
13646		// from identically-valued overflowX and overflowY and Edge just mirrors
13647		// the overflowX value there.
13648		opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
13649
13650		// Identify a display type, preferring old show/hide data over the CSS cascade
13651		restoreDisplay = dataShow && dataShow.display;
13652		if ( restoreDisplay == null ) {
13653			restoreDisplay = dataPriv.get( elem, "display" );
13654		}
13655		display = jQuery.css( elem, "display" );
13656		if ( display === "none" ) {
13657			if ( restoreDisplay ) {
13658				display = restoreDisplay;
13659			} else {
13660
13661				// Get nonempty value(s) by temporarily forcing visibility
13662				showHide( [ elem ], true );
13663				restoreDisplay = elem.style.display || restoreDisplay;
13664				display = jQuery.css( elem, "display" );
13665				showHide( [ elem ] );
13666			}
13667		}
13668
13669		// Animate inline elements as inline-block
13670		if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) {
13671			if ( jQuery.css( elem, "float" ) === "none" ) {
13672
13673				// Restore the original display value at the end of pure show/hide animations
13674				if ( !propTween ) {
13675					anim.done( function() {
13676						style.display = restoreDisplay;
13677					} );
13678					if ( restoreDisplay == null ) {
13679						display = style.display;
13680						restoreDisplay = display === "none" ? "" : display;
13681					}
13682				}
13683				style.display = "inline-block";
13684			}
13685		}
13686	}
13687
13688	if ( opts.overflow ) {
13689		style.overflow = "hidden";
13690		anim.always( function() {
13691			style.overflow = opts.overflow[ 0 ];
13692			style.overflowX = opts.overflow[ 1 ];
13693			style.overflowY = opts.overflow[ 2 ];
13694		} );
13695	}
13696
13697	// Implement show/hide animations
13698	propTween = false;
13699	for ( prop in orig ) {
13700
13701		// General show/hide setup for this element animation
13702		if ( !propTween ) {
13703			if ( dataShow ) {
13704				if ( "hidden" in dataShow ) {
13705					hidden = dataShow.hidden;
13706				}
13707			} else {
13708				dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } );
13709			}
13710
13711			// Store hidden/visible for toggle so `.stop().toggle()` "reverses"
13712			if ( toggle ) {
13713				dataShow.hidden = !hidden;
13714			}
13715
13716			// Show elements before animating them
13717			if ( hidden ) {
13718				showHide( [ elem ], true );
13719			}
13720
13721			/* eslint-disable no-loop-func */
13722
13723			anim.done( function() {
13724
13725				/* eslint-enable no-loop-func */
13726
13727				// The final step of a "hide" animation is actually hiding the element
13728				if ( !hidden ) {
13729					showHide( [ elem ] );
13730				}
13731				dataPriv.remove( elem, "fxshow" );
13732				for ( prop in orig ) {
13733					jQuery.style( elem, prop, orig[ prop ] );
13734				}
13735			} );
13736		}
13737
13738		// Per-property setup
13739		propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
13740		if ( !( prop in dataShow ) ) {
13741			dataShow[ prop ] = propTween.start;
13742			if ( hidden ) {
13743				propTween.end = propTween.start;
13744				propTween.start = 0;
13745			}
13746		}
13747	}
13748}
13749
13750function propFilter( props, specialEasing ) {
13751	var index, name, easing, value, hooks;
13752
13753	// camelCase, specialEasing and expand cssHook pass
13754	for ( index in props ) {
13755		name = camelCase( index );
13756		easing = specialEasing[ name ];
13757		value = props[ index ];
13758		if ( Array.isArray( value ) ) {
13759			easing = value[ 1 ];
13760			value = props[ index ] = value[ 0 ];
13761		}
13762
13763		if ( index !== name ) {
13764			props[ name ] = value;
13765			delete props[ index ];
13766		}
13767
13768		hooks = jQuery.cssHooks[ name ];
13769		if ( hooks && "expand" in hooks ) {
13770			value = hooks.expand( value );
13771			delete props[ name ];
13772
13773			// Not quite $.extend, this won't overwrite existing keys.
13774			// Reusing 'index' because we have the correct "name"
13775			for ( index in value ) {
13776				if ( !( index in props ) ) {
13777					props[ index ] = value[ index ];
13778					specialEasing[ index ] = easing;
13779				}
13780			}
13781		} else {
13782			specialEasing[ name ] = easing;
13783		}
13784	}
13785}
13786
13787function Animation( elem, properties, options ) {
13788	var result,
13789		stopped,
13790		index = 0,
13791		length = Animation.prefilters.length,
13792		deferred = jQuery.Deferred().always( function() {
13793
13794			// Don't match elem in the :animated selector
13795			delete tick.elem;
13796		} ),
13797		tick = function() {
13798			if ( stopped ) {
13799				return false;
13800			}
13801			var currentTime = fxNow || createFxNow(),
13802				remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
13803
13804				// Support: Android 2.3 only
13805				// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)
13806				temp = remaining / animation.duration || 0,
13807				percent = 1 - temp,
13808				index = 0,
13809				length = animation.tweens.length;
13810
13811			for ( ; index < length; index++ ) {
13812				animation.tweens[ index ].run( percent );
13813			}
13814
13815			deferred.notifyWith( elem, [ animation, percent, remaining ] );
13816
13817			// If there's more to do, yield
13818			if ( percent < 1 && length ) {
13819				return remaining;
13820			}
13821
13822			// If this was an empty animation, synthesize a final progress notification
13823			if ( !length ) {
13824				deferred.notifyWith( elem, [ animation, 1, 0 ] );
13825			}
13826
13827			// Resolve the animation and report its conclusion
13828			deferred.resolveWith( elem, [ animation ] );
13829			return false;
13830		},
13831		animation = deferred.promise( {
13832			elem: elem,
13833			props: jQuery.extend( {}, properties ),
13834			opts: jQuery.extend( true, {
13835				specialEasing: {},
13836				easing: jQuery.easing._default
13837			}, options ),
13838			originalProperties: properties,
13839			originalOptions: options,
13840			startTime: fxNow || createFxNow(),
13841			duration: options.duration,
13842			tweens: [],
13843			createTween: function( prop, end ) {
13844				var tween = jQuery.Tween( elem, animation.opts, prop, end,
13845					animation.opts.specialEasing[ prop ] || animation.opts.easing );
13846				animation.tweens.push( tween );
13847				return tween;
13848			},
13849			stop: function( gotoEnd ) {
13850				var index = 0,
13851
13852					// If we are going to the end, we want to run all the tweens
13853					// otherwise we skip this part
13854					length = gotoEnd ? animation.tweens.length : 0;
13855				if ( stopped ) {
13856					return this;
13857				}
13858				stopped = true;
13859				for ( ; index < length; index++ ) {
13860					animation.tweens[ index ].run( 1 );
13861				}
13862
13863				// Resolve when we played the last frame; otherwise, reject
13864				if ( gotoEnd ) {
13865					deferred.notifyWith( elem, [ animation, 1, 0 ] );
13866					deferred.resolveWith( elem, [ animation, gotoEnd ] );
13867				} else {
13868					deferred.rejectWith( elem, [ animation, gotoEnd ] );
13869				}
13870				return this;
13871			}
13872		} ),
13873		props = animation.props;
13874
13875	propFilter( props, animation.opts.specialEasing );
13876
13877	for ( ; index < length; index++ ) {
13878		result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );
13879		if ( result ) {
13880			if ( isFunction( result.stop ) ) {
13881				jQuery._queueHooks( animation.elem, animation.opts.queue ).stop =
13882					result.stop.bind( result );
13883			}
13884			return result;
13885		}
13886	}
13887
13888	jQuery.map( props, createTween, animation );
13889
13890	if ( isFunction( animation.opts.start ) ) {
13891		animation.opts.start.call( elem, animation );
13892	}
13893
13894	// Attach callbacks from options
13895	animation
13896		.progress( animation.opts.progress )
13897		.done( animation.opts.done, animation.opts.complete )
13898		.fail( animation.opts.fail )
13899		.always( animation.opts.always );
13900
13901	jQuery.fx.timer(
13902		jQuery.extend( tick, {
13903			elem: elem,
13904			anim: animation,
13905			queue: animation.opts.queue
13906		} )
13907	);
13908
13909	return animation;
13910}
13911
13912jQuery.Animation = jQuery.extend( Animation, {
13913
13914	tweeners: {
13915		"*": [ function( prop, value ) {
13916			var tween = this.createTween( prop, value );
13917			adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );
13918			return tween;
13919		} ]
13920	},
13921
13922	tweener: function( props, callback ) {
13923		if ( isFunction( props ) ) {
13924			callback = props;
13925			props = [ "*" ];
13926		} else {
13927			props = props.match( rnothtmlwhite );
13928		}
13929
13930		var prop,
13931			index = 0,
13932			length = props.length;
13933
13934		for ( ; index < length; index++ ) {
13935			prop = props[ index ];
13936			Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];
13937			Animation.tweeners[ prop ].unshift( callback );
13938		}
13939	},
13940
13941	prefilters: [ defaultPrefilter ],
13942
13943	prefilter: function( callback, prepend ) {
13944		if ( prepend ) {
13945			Animation.prefilters.unshift( callback );
13946		} else {
13947			Animation.prefilters.push( callback );
13948		}
13949	}
13950} );
13951
13952jQuery.speed = function( speed, easing, fn ) {
13953	var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
13954		complete: fn || !fn && easing ||
13955			isFunction( speed ) && speed,
13956		duration: speed,
13957		easing: fn && easing || easing && !isFunction( easing ) && easing
13958	};
13959
13960	// Go to the end state if fx are off
13961	if ( jQuery.fx.off ) {
13962		opt.duration = 0;
13963
13964	} else {
13965		if ( typeof opt.duration !== "number" ) {
13966			if ( opt.duration in jQuery.fx.speeds ) {
13967				opt.duration = jQuery.fx.speeds[ opt.duration ];
13968
13969			} else {
13970				opt.duration = jQuery.fx.speeds._default;
13971			}
13972		}
13973	}
13974
13975	// Normalize opt.queue - true/undefined/null -> "fx"
13976	if ( opt.queue == null || opt.queue === true ) {
13977		opt.queue = "fx";
13978	}
13979
13980	// Queueing
13981	opt.old = opt.complete;
13982
13983	opt.complete = function() {
13984		if ( isFunction( opt.old ) ) {
13985			opt.old.call( this );
13986		}
13987
13988		if ( opt.queue ) {
13989			jQuery.dequeue( this, opt.queue );
13990		}
13991	};
13992
13993	return opt;
13994};
13995
13996jQuery.fn.extend( {
13997	fadeTo: function( speed, to, easing, callback ) {
13998
13999		// Show any hidden elements after setting opacity to 0
14000		return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show()
14001
14002			// Animate to the value specified
14003			.end().animate( { opacity: to }, speed, easing, callback );
14004	},
14005	animate: function( prop, speed, easing, callback ) {
14006		var empty = jQuery.isEmptyObject( prop ),
14007			optall = jQuery.speed( speed, easing, callback ),
14008			doAnimation = function() {
14009
14010				// Operate on a copy of prop so per-property easing won't be lost
14011				var anim = Animation( this, jQuery.extend( {}, prop ), optall );
14012
14013				// Empty animations, or finishing resolves immediately
14014				if ( empty || dataPriv.get( this, "finish" ) ) {
14015					anim.stop( true );
14016				}
14017			};
14018
14019		doAnimation.finish = doAnimation;
14020
14021		return empty || optall.queue === false ?
14022			this.each( doAnimation ) :
14023			this.queue( optall.queue, doAnimation );
14024	},
14025	stop: function( type, clearQueue, gotoEnd ) {
14026		var stopQueue = function( hooks ) {
14027			var stop = hooks.stop;
14028			delete hooks.stop;
14029			stop( gotoEnd );
14030		};
14031
14032		if ( typeof type !== "string" ) {
14033			gotoEnd = clearQueue;
14034			clearQueue = type;
14035			type = undefined;
14036		}
14037		if ( clearQueue ) {
14038			this.queue( type || "fx", [] );
14039		}
14040
14041		return this.each( function() {
14042			var dequeue = true,
14043				index = type != null && type + "queueHooks",
14044				timers = jQuery.timers,
14045				data = dataPriv.get( this );
14046
14047			if ( index ) {
14048				if ( data[ index ] && data[ index ].stop ) {
14049					stopQueue( data[ index ] );
14050				}
14051			} else {
14052				for ( index in data ) {
14053					if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
14054						stopQueue( data[ index ] );
14055					}
14056				}
14057			}
14058
14059			for ( index = timers.length; index--; ) {
14060				if ( timers[ index ].elem === this &&
14061					( type == null || timers[ index ].queue === type ) ) {
14062
14063					timers[ index ].anim.stop( gotoEnd );
14064					dequeue = false;
14065					timers.splice( index, 1 );
14066				}
14067			}
14068
14069			// Start the next in the queue if the last step wasn't forced.
14070			// Timers currently will call their complete callbacks, which
14071			// will dequeue but only if they were gotoEnd.
14072			if ( dequeue || !gotoEnd ) {
14073				jQuery.dequeue( this, type );
14074			}
14075		} );
14076	},
14077	finish: function( type ) {
14078		if ( type !== false ) {
14079			type = type || "fx";
14080		}
14081		return this.each( function() {
14082			var index,
14083				data = dataPriv.get( this ),
14084				queue = data[ type + "queue" ],
14085				hooks = data[ type + "queueHooks" ],
14086				timers = jQuery.timers,
14087				length = queue ? queue.length : 0;
14088
14089			// Enable finishing flag on private data
14090			data.finish = true;
14091
14092			// Empty the queue first
14093			jQuery.queue( this, type, [] );
14094
14095			if ( hooks && hooks.stop ) {
14096				hooks.stop.call( this, true );
14097			}
14098
14099			// Look for any active animations, and finish them
14100			for ( index = timers.length; index--; ) {
14101				if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
14102					timers[ index ].anim.stop( true );
14103					timers.splice( index, 1 );
14104				}
14105			}
14106
14107			// Look for any animations in the old queue and finish them
14108			for ( index = 0; index < length; index++ ) {
14109				if ( queue[ index ] && queue[ index ].finish ) {
14110					queue[ index ].finish.call( this );
14111				}
14112			}
14113
14114			// Turn off finishing flag
14115			delete data.finish;
14116		} );
14117	}
14118} );
14119
14120jQuery.each( [ "toggle", "show", "hide" ], function( _i, name ) {
14121	var cssFn = jQuery.fn[ name ];
14122	jQuery.fn[ name ] = function( speed, easing, callback ) {
14123		return speed == null || typeof speed === "boolean" ?
14124			cssFn.apply( this, arguments ) :
14125			this.animate( genFx( name, true ), speed, easing, callback );
14126	};
14127} );
14128
14129// Generate shortcuts for custom animations
14130jQuery.each( {
14131	slideDown: genFx( "show" ),
14132	slideUp: genFx( "hide" ),
14133	slideToggle: genFx( "toggle" ),
14134	fadeIn: { opacity: "show" },
14135	fadeOut: { opacity: "hide" },
14136	fadeToggle: { opacity: "toggle" }
14137}, function( name, props ) {
14138	jQuery.fn[ name ] = function( speed, easing, callback ) {
14139		return this.animate( props, speed, easing, callback );
14140	};
14141} );
14142
14143jQuery.timers = [];
14144jQuery.fx.tick = function() {
14145	var timer,
14146		i = 0,
14147		timers = jQuery.timers;
14148
14149	fxNow = Date.now();
14150
14151	for ( ; i < timers.length; i++ ) {
14152		timer = timers[ i ];
14153
14154		// Run the timer and safely remove it when done (allowing for external removal)
14155		if ( !timer() && timers[ i ] === timer ) {
14156			timers.splice( i--, 1 );
14157		}
14158	}
14159
14160	if ( !timers.length ) {
14161		jQuery.fx.stop();
14162	}
14163	fxNow = undefined;
14164};
14165
14166jQuery.fx.timer = function( timer ) {
14167	jQuery.timers.push( timer );
14168	jQuery.fx.start();
14169};
14170
14171jQuery.fx.interval = 13;
14172jQuery.fx.start = function() {
14173	if ( inProgress ) {
14174		return;
14175	}
14176
14177	inProgress = true;
14178	schedule();
14179};
14180
14181jQuery.fx.stop = function() {
14182	inProgress = null;
14183};
14184
14185jQuery.fx.speeds = {
14186	slow: 600,
14187	fast: 200,
14188
14189	// Default speed
14190	_default: 400
14191};
14192
14193
14194// Based off of the plugin by Clint Helfers, with permission.
14195// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/
14196jQuery.fn.delay = function( time, type ) {
14197	time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
14198	type = type || "fx";
14199
14200	return this.queue( type, function( next, hooks ) {
14201		var timeout = window.setTimeout( next, time );
14202		hooks.stop = function() {
14203			window.clearTimeout( timeout );
14204		};
14205	} );
14206};
14207
14208
14209( function() {
14210	var input = document.createElement( "input" ),
14211		select = document.createElement( "select" ),
14212		opt = select.appendChild( document.createElement( "option" ) );
14213
14214	input.type = "checkbox";
14215
14216	// Support: Android <=4.3 only
14217	// Default value for a checkbox should be "on"
14218	support.checkOn = input.value !== "";
14219
14220	// Support: IE <=11 only
14221	// Must access selectedIndex to make default options select
14222	support.optSelected = opt.selected;
14223
14224	// Support: IE <=11 only
14225	// An input loses its value after becoming a radio
14226	input = document.createElement( "input" );
14227	input.value = "t";
14228	input.type = "radio";
14229	support.radioValue = input.value === "t";
14230} )();
14231
14232
14233var boolHook,
14234	attrHandle = jQuery.expr.attrHandle;
14235
14236jQuery.fn.extend( {
14237	attr: function( name, value ) {
14238		return access( this, jQuery.attr, name, value, arguments.length > 1 );
14239	},
14240
14241	removeAttr: function( name ) {
14242		return this.each( function() {
14243			jQuery.removeAttr( this, name );
14244		} );
14245	}
14246} );
14247
14248jQuery.extend( {
14249	attr: function( elem, name, value ) {
14250		var ret, hooks,
14251			nType = elem.nodeType;
14252
14253		// Don't get/set attributes on text, comment and attribute nodes
14254		if ( nType === 3 || nType === 8 || nType === 2 ) {
14255			return;
14256		}
14257
14258		// Fallback to prop when attributes are not supported
14259		if ( typeof elem.getAttribute === "undefined" ) {
14260			return jQuery.prop( elem, name, value );
14261		}
14262
14263		// Attribute hooks are determined by the lowercase version
14264		// Grab necessary hook if one is defined
14265		if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
14266			hooks = jQuery.attrHooks[ name.toLowerCase() ] ||
14267				( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );
14268		}
14269
14270		if ( value !== undefined ) {
14271			if ( value === null ) {
14272				jQuery.removeAttr( elem, name );
14273				return;
14274			}
14275
14276			if ( hooks && "set" in hooks &&
14277				( ret = hooks.set( elem, value, name ) ) !== undefined ) {
14278				return ret;
14279			}
14280
14281			elem.setAttribute( name, value + "" );
14282			return value;
14283		}
14284
14285		if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
14286			return ret;
14287		}
14288
14289		ret = jQuery.find.attr( elem, name );
14290
14291		// Non-existent attributes return null, we normalize to undefined
14292		return ret == null ? undefined : ret;
14293	},
14294
14295	attrHooks: {
14296		type: {
14297			set: function( elem, value ) {
14298				if ( !support.radioValue && value === "radio" &&
14299					nodeName( elem, "input" ) ) {
14300					var val = elem.value;
14301					elem.setAttribute( "type", value );
14302					if ( val ) {
14303						elem.value = val;
14304					}
14305					return value;
14306				}
14307			}
14308		}
14309	},
14310
14311	removeAttr: function( elem, value ) {
14312		var name,
14313			i = 0,
14314
14315			// Attribute names can contain non-HTML whitespace characters
14316			// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2
14317			attrNames = value && value.match( rnothtmlwhite );
14318
14319		if ( attrNames && elem.nodeType === 1 ) {
14320			while ( ( name = attrNames[ i++ ] ) ) {
14321				elem.removeAttribute( name );
14322			}
14323		}
14324	}
14325} );
14326
14327// Hooks for boolean attributes
14328boolHook = {
14329	set: function( elem, value, name ) {
14330		if ( value === false ) {
14331
14332			// Remove boolean attributes when set to false
14333			jQuery.removeAttr( elem, name );
14334		} else {
14335			elem.setAttribute( name, name );
14336		}
14337		return name;
14338	}
14339};
14340
14341jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) {
14342	var getter = attrHandle[ name ] || jQuery.find.attr;
14343
14344	attrHandle[ name ] = function( elem, name, isXML ) {
14345		var ret, handle,
14346			lowercaseName = name.toLowerCase();
14347
14348		if ( !isXML ) {
14349
14350			// Avoid an infinite loop by temporarily removing this function from the getter
14351			handle = attrHandle[ lowercaseName ];
14352			attrHandle[ lowercaseName ] = ret;
14353			ret = getter( elem, name, isXML ) != null ?
14354				lowercaseName :
14355				null;
14356			attrHandle[ lowercaseName ] = handle;
14357		}
14358		return ret;
14359	};
14360} );
14361
14362
14363
14364
14365var rfocusable = /^(?:input|select|textarea|button)$/i,
14366	rclickable = /^(?:a|area)$/i;
14367
14368jQuery.fn.extend( {
14369	prop: function( name, value ) {
14370		return access( this, jQuery.prop, name, value, arguments.length > 1 );
14371	},
14372
14373	removeProp: function( name ) {
14374		return this.each( function() {
14375			delete this[ jQuery.propFix[ name ] || name ];
14376		} );
14377	}
14378} );
14379
14380jQuery.extend( {
14381	prop: function( elem, name, value ) {
14382		var ret, hooks,
14383			nType = elem.nodeType;
14384
14385		// Don't get/set properties on text, comment and attribute nodes
14386		if ( nType === 3 || nType === 8 || nType === 2 ) {
14387			return;
14388		}
14389
14390		if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
14391
14392			// Fix name and attach hooks
14393			name = jQuery.propFix[ name ] || name;
14394			hooks = jQuery.propHooks[ name ];
14395		}
14396
14397		if ( value !== undefined ) {
14398			if ( hooks && "set" in hooks &&
14399				( ret = hooks.set( elem, value, name ) ) !== undefined ) {
14400				return ret;
14401			}
14402
14403			return ( elem[ name ] = value );
14404		}
14405
14406		if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
14407			return ret;
14408		}
14409
14410		return elem[ name ];
14411	},
14412
14413	propHooks: {
14414		tabIndex: {
14415			get: function( elem ) {
14416
14417				// Support: IE <=9 - 11 only
14418				// elem.tabIndex doesn't always return the
14419				// correct value when it hasn't been explicitly set
14420				// https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
14421				// Use proper attribute retrieval(#12072)
14422				var tabindex = jQuery.find.attr( elem, "tabindex" );
14423
14424				if ( tabindex ) {
14425					return parseInt( tabindex, 10 );
14426				}
14427
14428				if (
14429					rfocusable.test( elem.nodeName ) ||
14430					rclickable.test( elem.nodeName ) &&
14431					elem.href
14432				) {
14433					return 0;
14434				}
14435
14436				return -1;
14437			}
14438		}
14439	},
14440
14441	propFix: {
14442		"for": "htmlFor",
14443		"class": "className"
14444	}
14445} );
14446
14447// Support: IE <=11 only
14448// Accessing the selectedIndex property
14449// forces the browser to respect setting selected
14450// on the option
14451// The getter ensures a default option is selected
14452// when in an optgroup
14453// eslint rule "no-unused-expressions" is disabled for this code
14454// since it considers such accessions noop
14455if ( !support.optSelected ) {
14456	jQuery.propHooks.selected = {
14457		get: function( elem ) {
14458
14459			/* eslint no-unused-expressions: "off" */
14460
14461			var parent = elem.parentNode;
14462			if ( parent && parent.parentNode ) {
14463				parent.parentNode.selectedIndex;
14464			}
14465			return null;
14466		},
14467		set: function( elem ) {
14468
14469			/* eslint no-unused-expressions: "off" */
14470
14471			var parent = elem.parentNode;
14472			if ( parent ) {
14473				parent.selectedIndex;
14474
14475				if ( parent.parentNode ) {
14476					parent.parentNode.selectedIndex;
14477				}
14478			}
14479		}
14480	};
14481}
14482
14483jQuery.each( [
14484	"tabIndex",
14485	"readOnly",
14486	"maxLength",
14487	"cellSpacing",
14488	"cellPadding",
14489	"rowSpan",
14490	"colSpan",
14491	"useMap",
14492	"frameBorder",
14493	"contentEditable"
14494], function() {
14495	jQuery.propFix[ this.toLowerCase() ] = this;
14496} );
14497
14498
14499
14500
14501	// Strip and collapse whitespace according to HTML spec
14502	// https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace
14503	function stripAndCollapse( value ) {
14504		var tokens = value.match( rnothtmlwhite ) || [];
14505		return tokens.join( " " );
14506	}
14507
14508
14509function getClass( elem ) {
14510	return elem.getAttribute && elem.getAttribute( "class" ) || "";
14511}
14512
14513function classesToArray( value ) {
14514	if ( Array.isArray( value ) ) {
14515		return value;
14516	}
14517	if ( typeof value === "string" ) {
14518		return value.match( rnothtmlwhite ) || [];
14519	}
14520	return [];
14521}
14522
14523jQuery.fn.extend( {
14524	addClass: function( value ) {
14525		var classes, elem, cur, curValue, clazz, j, finalValue,
14526			i = 0;
14527
14528		if ( isFunction( value ) ) {
14529			return this.each( function( j ) {
14530				jQuery( this ).addClass( value.call( this, j, getClass( this ) ) );
14531			} );
14532		}
14533
14534		classes = classesToArray( value );
14535
14536		if ( classes.length ) {
14537			while ( ( elem = this[ i++ ] ) ) {
14538				curValue = getClass( elem );
14539				cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
14540
14541				if ( cur ) {
14542					j = 0;
14543					while ( ( clazz = classes[ j++ ] ) ) {
14544						if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
14545							cur += clazz + " ";
14546						}
14547					}
14548
14549					// Only assign if different to avoid unneeded rendering.
14550					finalValue = stripAndCollapse( cur );
14551					if ( curValue !== finalValue ) {
14552						elem.setAttribute( "class", finalValue );
14553					}
14554				}
14555			}
14556		}
14557
14558		return this;
14559	},
14560
14561	removeClass: function( value ) {
14562		var classes, elem, cur, curValue, clazz, j, finalValue,
14563			i = 0;
14564
14565		if ( isFunction( value ) ) {
14566			return this.each( function( j ) {
14567				jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );
14568			} );
14569		}
14570
14571		if ( !arguments.length ) {
14572			return this.attr( "class", "" );
14573		}
14574
14575		classes = classesToArray( value );
14576
14577		if ( classes.length ) {
14578			while ( ( elem = this[ i++ ] ) ) {
14579				curValue = getClass( elem );
14580
14581				// This expression is here for better compressibility (see addClass)
14582				cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
14583
14584				if ( cur ) {
14585					j = 0;
14586					while ( ( clazz = classes[ j++ ] ) ) {
14587
14588						// Remove *all* instances
14589						while ( cur.indexOf( " " + clazz + " " ) > -1 ) {
14590							cur = cur.replace( " " + clazz + " ", " " );
14591						}
14592					}
14593
14594					// Only assign if different to avoid unneeded rendering.
14595					finalValue = stripAndCollapse( cur );
14596					if ( curValue !== finalValue ) {
14597						elem.setAttribute( "class", finalValue );
14598					}
14599				}
14600			}
14601		}
14602
14603		return this;
14604	},
14605
14606	toggleClass: function( value, stateVal ) {
14607		var type = typeof value,
14608			isValidValue = type === "string" || Array.isArray( value );
14609
14610		if ( typeof stateVal === "boolean" && isValidValue ) {
14611			return stateVal ? this.addClass( value ) : this.removeClass( value );
14612		}
14613
14614		if ( isFunction( value ) ) {
14615			return this.each( function( i ) {
14616				jQuery( this ).toggleClass(
14617					value.call( this, i, getClass( this ), stateVal ),
14618					stateVal
14619				);
14620			} );
14621		}
14622
14623		return this.each( function() {
14624			var className, i, self, classNames;
14625
14626			if ( isValidValue ) {
14627
14628				// Toggle individual class names
14629				i = 0;
14630				self = jQuery( this );
14631				classNames = classesToArray( value );
14632
14633				while ( ( className = classNames[ i++ ] ) ) {
14634
14635					// Check each className given, space separated list
14636					if ( self.hasClass( className ) ) {
14637						self.removeClass( className );
14638					} else {
14639						self.addClass( className );
14640					}
14641				}
14642
14643			// Toggle whole class name
14644			} else if ( value === undefined || type === "boolean" ) {
14645				className = getClass( this );
14646				if ( className ) {
14647
14648					// Store className if set
14649					dataPriv.set( this, "__className__", className );
14650				}
14651
14652				// If the element has a class name or if we're passed `false`,
14653				// then remove the whole classname (if there was one, the above saved it).
14654				// Otherwise bring back whatever was previously saved (if anything),
14655				// falling back to the empty string if nothing was stored.
14656				if ( this.setAttribute ) {
14657					this.setAttribute( "class",
14658						className || value === false ?
14659							"" :
14660							dataPriv.get( this, "__className__" ) || ""
14661					);
14662				}
14663			}
14664		} );
14665	},
14666
14667	hasClass: function( selector ) {
14668		var className, elem,
14669			i = 0;
14670
14671		className = " " + selector + " ";
14672		while ( ( elem = this[ i++ ] ) ) {
14673			if ( elem.nodeType === 1 &&
14674				( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) {
14675				return true;
14676			}
14677		}
14678
14679		return false;
14680	}
14681} );
14682
14683
14684
14685
14686var rreturn = /\r/g;
14687
14688jQuery.fn.extend( {
14689	val: function( value ) {
14690		var hooks, ret, valueIsFunction,
14691			elem = this[ 0 ];
14692
14693		if ( !arguments.length ) {
14694			if ( elem ) {
14695				hooks = jQuery.valHooks[ elem.type ] ||
14696					jQuery.valHooks[ elem.nodeName.toLowerCase() ];
14697
14698				if ( hooks &&
14699					"get" in hooks &&
14700					( ret = hooks.get( elem, "value" ) ) !== undefined
14701				) {
14702					return ret;
14703				}
14704
14705				ret = elem.value;
14706
14707				// Handle most common string cases
14708				if ( typeof ret === "string" ) {
14709					return ret.replace( rreturn, "" );
14710				}
14711
14712				// Handle cases where value is null/undef or number
14713				return ret == null ? "" : ret;
14714			}
14715
14716			return;
14717		}
14718
14719		valueIsFunction = isFunction( value );
14720
14721		return this.each( function( i ) {
14722			var val;
14723
14724			if ( this.nodeType !== 1 ) {
14725				return;
14726			}
14727
14728			if ( valueIsFunction ) {
14729				val = value.call( this, i, jQuery( this ).val() );
14730			} else {
14731				val = value;
14732			}
14733
14734			// Treat null/undefined as ""; convert numbers to string
14735			if ( val == null ) {
14736				val = "";
14737
14738			} else if ( typeof val === "number" ) {
14739				val += "";
14740
14741			} else if ( Array.isArray( val ) ) {
14742				val = jQuery.map( val, function( value ) {
14743					return value == null ? "" : value + "";
14744				} );
14745			}
14746
14747			hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
14748
14749			// If set returns undefined, fall back to normal setting
14750			if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) {
14751				this.value = val;
14752			}
14753		} );
14754	}
14755} );
14756
14757jQuery.extend( {
14758	valHooks: {
14759		option: {
14760			get: function( elem ) {
14761
14762				var val = jQuery.find.attr( elem, "value" );
14763				return val != null ?
14764					val :
14765
14766					// Support: IE <=10 - 11 only
14767					// option.text throws exceptions (#14686, #14858)
14768					// Strip and collapse whitespace
14769					// https://html.spec.whatwg.org/#strip-and-collapse-whitespace
14770					stripAndCollapse( jQuery.text( elem ) );
14771			}
14772		},
14773		select: {
14774			get: function( elem ) {
14775				var value, option, i,
14776					options = elem.options,
14777					index = elem.selectedIndex,
14778					one = elem.type === "select-one",
14779					values = one ? null : [],
14780					max = one ? index + 1 : options.length;
14781
14782				if ( index < 0 ) {
14783					i = max;
14784
14785				} else {
14786					i = one ? index : 0;
14787				}
14788
14789				// Loop through all the selected options
14790				for ( ; i < max; i++ ) {
14791					option = options[ i ];
14792
14793					// Support: IE <=9 only
14794					// IE8-9 doesn't update selected after form reset (#2551)
14795					if ( ( option.selected || i === index ) &&
14796
14797							// Don't return options that are disabled or in a disabled optgroup
14798							!option.disabled &&
14799							( !option.parentNode.disabled ||
14800								!nodeName( option.parentNode, "optgroup" ) ) ) {
14801
14802						// Get the specific value for the option
14803						value = jQuery( option ).val();
14804
14805						// We don't need an array for one selects
14806						if ( one ) {
14807							return value;
14808						}
14809
14810						// Multi-Selects return an array
14811						values.push( value );
14812					}
14813				}
14814
14815				return values;
14816			},
14817
14818			set: function( elem, value ) {
14819				var optionSet, option,
14820					options = elem.options,
14821					values = jQuery.makeArray( value ),
14822					i = options.length;
14823
14824				while ( i-- ) {
14825					option = options[ i ];
14826
14827					/* eslint-disable no-cond-assign */
14828
14829					if ( option.selected =
14830						jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1
14831					) {
14832						optionSet = true;
14833					}
14834
14835					/* eslint-enable no-cond-assign */
14836				}
14837
14838				// Force browsers to behave consistently when non-matching value is set
14839				if ( !optionSet ) {
14840					elem.selectedIndex = -1;
14841				}
14842				return values;
14843			}
14844		}
14845	}
14846} );
14847
14848// Radios and checkboxes getter/setter
14849jQuery.each( [ "radio", "checkbox" ], function() {
14850	jQuery.valHooks[ this ] = {
14851		set: function( elem, value ) {
14852			if ( Array.isArray( value ) ) {
14853				return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );
14854			}
14855		}
14856	};
14857	if ( !support.checkOn ) {
14858		jQuery.valHooks[ this ].get = function( elem ) {
14859			return elem.getAttribute( "value" ) === null ? "on" : elem.value;
14860		};
14861	}
14862} );
14863
14864
14865
14866
14867// Return jQuery for attributes-only inclusion
14868
14869
14870support.focusin = "onfocusin" in window;
14871
14872
14873var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
14874	stopPropagationCallback = function( e ) {
14875		e.stopPropagation();
14876	};
14877
14878jQuery.extend( jQuery.event, {
14879
14880	trigger: function( event, data, elem, onlyHandlers ) {
14881
14882		var i, cur, tmp, bubbleType, ontype, handle, special, lastElement,
14883			eventPath = [ elem || document ],
14884			type = hasOwn.call( event, "type" ) ? event.type : event,
14885			namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : [];
14886
14887		cur = lastElement = tmp = elem = elem || document;
14888
14889		// Don't do events on text and comment nodes
14890		if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
14891			return;
14892		}
14893
14894		// focus/blur morphs to focusin/out; ensure we're not firing them right now
14895		if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
14896			return;
14897		}
14898
14899		if ( type.indexOf( "." ) > -1 ) {
14900
14901			// Namespaced trigger; create a regexp to match event type in handle()
14902			namespaces = type.split( "." );
14903			type = namespaces.shift();
14904			namespaces.sort();
14905		}
14906		ontype = type.indexOf( ":" ) < 0 && "on" + type;
14907
14908		// Caller can pass in a jQuery.Event object, Object, or just an event type string
14909		event = event[ jQuery.expando ] ?
14910			event :
14911			new jQuery.Event( type, typeof event === "object" && event );
14912
14913		// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
14914		event.isTrigger = onlyHandlers ? 2 : 3;
14915		event.namespace = namespaces.join( "." );
14916		event.rnamespace = event.namespace ?
14917			new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) :
14918			null;
14919
14920		// Clean up the event in case it is being reused
14921		event.result = undefined;
14922		if ( !event.target ) {
14923			event.target = elem;
14924		}
14925
14926		// Clone any incoming data and prepend the event, creating the handler arg list
14927		data = data == null ?
14928			[ event ] :
14929			jQuery.makeArray( data, [ event ] );
14930
14931		// Allow special events to draw outside the lines
14932		special = jQuery.event.special[ type ] || {};
14933		if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
14934			return;
14935		}
14936
14937		// Determine event propagation path in advance, per W3C events spec (#9951)
14938		// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
14939		if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) {
14940
14941			bubbleType = special.delegateType || type;
14942			if ( !rfocusMorph.test( bubbleType + type ) ) {
14943				cur = cur.parentNode;
14944			}
14945			for ( ; cur; cur = cur.parentNode ) {
14946				eventPath.push( cur );
14947				tmp = cur;
14948			}
14949
14950			// Only add window if we got to document (e.g., not plain obj or detached DOM)
14951			if ( tmp === ( elem.ownerDocument || document ) ) {
14952				eventPath.push( tmp.defaultView || tmp.parentWindow || window );
14953			}
14954		}
14955
14956		// Fire handlers on the event path
14957		i = 0;
14958		while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {
14959			lastElement = cur;
14960			event.type = i > 1 ?
14961				bubbleType :
14962				special.bindType || type;
14963
14964			// jQuery handler
14965			handle = ( dataPriv.get( cur, "events" ) || Object.create( null ) )[ event.type ] &&
14966				dataPriv.get( cur, "handle" );
14967			if ( handle ) {
14968				handle.apply( cur, data );
14969			}
14970
14971			// Native handler
14972			handle = ontype && cur[ ontype ];
14973			if ( handle && handle.apply && acceptData( cur ) ) {
14974				event.result = handle.apply( cur, data );
14975				if ( event.result === false ) {
14976					event.preventDefault();
14977				}
14978			}
14979		}
14980		event.type = type;
14981
14982		// If nobody prevented the default action, do it now
14983		if ( !onlyHandlers && !event.isDefaultPrevented() ) {
14984
14985			if ( ( !special._default ||
14986				special._default.apply( eventPath.pop(), data ) === false ) &&
14987				acceptData( elem ) ) {
14988
14989				// Call a native DOM method on the target with the same name as the event.
14990				// Don't do default actions on window, that's where global variables be (#6170)
14991				if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) {
14992
14993					// Don't re-trigger an onFOO event when we call its FOO() method
14994					tmp = elem[ ontype ];
14995
14996					if ( tmp ) {
14997						elem[ ontype ] = null;
14998					}
14999
15000					// Prevent re-triggering of the same event, since we already bubbled it above
15001					jQuery.event.triggered = type;
15002
15003					if ( event.isPropagationStopped() ) {
15004						lastElement.addEventListener( type, stopPropagationCallback );
15005					}
15006
15007					elem[ type ]();
15008
15009					if ( event.isPropagationStopped() ) {
15010						lastElement.removeEventListener( type, stopPropagationCallback );
15011					}
15012
15013					jQuery.event.triggered = undefined;
15014
15015					if ( tmp ) {
15016						elem[ ontype ] = tmp;
15017					}
15018				}
15019			}
15020		}
15021
15022		return event.result;
15023	},
15024
15025	// Piggyback on a donor event to simulate a different one
15026	// Used only for `focus(in | out)` events
15027	simulate: function( type, elem, event ) {
15028		var e = jQuery.extend(
15029			new jQuery.Event(),
15030			event,
15031			{
15032				type: type,
15033				isSimulated: true
15034			}
15035		);
15036
15037		jQuery.event.trigger( e, null, elem );
15038	}
15039
15040} );
15041
15042jQuery.fn.extend( {
15043
15044	trigger: function( type, data ) {
15045		return this.each( function() {
15046			jQuery.event.trigger( type, data, this );
15047		} );
15048	},
15049	triggerHandler: function( type, data ) {
15050		var elem = this[ 0 ];
15051		if ( elem ) {
15052			return jQuery.event.trigger( type, data, elem, true );
15053		}
15054	}
15055} );
15056
15057
15058// Support: Firefox <=44
15059// Firefox doesn't have focus(in | out) events
15060// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787
15061//
15062// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1
15063// focus(in | out) events fire after focus & blur events,
15064// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order
15065// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857
15066if ( !support.focusin ) {
15067	jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) {
15068
15069		// Attach a single capturing handler on the document while someone wants focusin/focusout
15070		var handler = function( event ) {
15071			jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );
15072		};
15073
15074		jQuery.event.special[ fix ] = {
15075			setup: function() {
15076
15077				// Handle: regular nodes (via `this.ownerDocument`), window
15078				// (via `this.document`) & document (via `this`).
15079				var doc = this.ownerDocument || this.document || this,
15080					attaches = dataPriv.access( doc, fix );
15081
15082				if ( !attaches ) {
15083					doc.addEventListener( orig, handler, true );
15084				}
15085				dataPriv.access( doc, fix, ( attaches || 0 ) + 1 );
15086			},
15087			teardown: function() {
15088				var doc = this.ownerDocument || this.document || this,
15089					attaches = dataPriv.access( doc, fix ) - 1;
15090
15091				if ( !attaches ) {
15092					doc.removeEventListener( orig, handler, true );
15093					dataPriv.remove( doc, fix );
15094
15095				} else {
15096					dataPriv.access( doc, fix, attaches );
15097				}
15098			}
15099		};
15100	} );
15101}
15102var location = window.location;
15103
15104var nonce = { guid: Date.now() };
15105
15106var rquery = ( /\?/ );
15107
15108
15109
15110// Cross-browser xml parsing
15111jQuery.parseXML = function( data ) {
15112	var xml, parserErrorElem;
15113	if ( !data || typeof data !== "string" ) {
15114		return null;
15115	}
15116
15117	// Support: IE 9 - 11 only
15118	// IE throws on parseFromString with invalid input.
15119	try {
15120		xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" );
15121	} catch ( e ) {}
15122
15123	parserErrorElem = xml && xml.getElementsByTagName( "parsererror" )[ 0 ];
15124	if ( !xml || parserErrorElem ) {
15125		jQuery.error( "Invalid XML: " + (
15126			parserErrorElem ?
15127				jQuery.map( parserErrorElem.childNodes, function( el ) {
15128					return el.textContent;
15129				} ).join( "\n" ) :
15130				data
15131		) );
15132	}
15133	return xml;
15134};
15135
15136
15137var
15138	rbracket = /\[\]$/,
15139	rCRLF = /\r?\n/g,
15140	rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
15141	rsubmittable = /^(?:input|select|textarea|keygen)/i;
15142
15143function buildParams( prefix, obj, traditional, add ) {
15144	var name;
15145
15146	if ( Array.isArray( obj ) ) {
15147
15148		// Serialize array item.
15149		jQuery.each( obj, function( i, v ) {
15150			if ( traditional || rbracket.test( prefix ) ) {
15151
15152				// Treat each array item as a scalar.
15153				add( prefix, v );
15154
15155			} else {
15156
15157				// Item is non-scalar (array or object), encode its numeric index.
15158				buildParams(
15159					prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]",
15160					v,
15161					traditional,
15162					add
15163				);
15164			}
15165		} );
15166
15167	} else if ( !traditional && toType( obj ) === "object" ) {
15168
15169		// Serialize object item.
15170		for ( name in obj ) {
15171			buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
15172		}
15173
15174	} else {
15175
15176		// Serialize scalar item.
15177		add( prefix, obj );
15178	}
15179}
15180
15181// Serialize an array of form elements or a set of
15182// key/values into a query string
15183jQuery.param = function( a, traditional ) {
15184	var prefix,
15185		s = [],
15186		add = function( key, valueOrFunction ) {
15187
15188			// If value is a function, invoke it and use its return value
15189			var value = isFunction( valueOrFunction ) ?
15190				valueOrFunction() :
15191				valueOrFunction;
15192
15193			s[ s.length ] = encodeURIComponent( key ) + "=" +
15194				encodeURIComponent( value == null ? "" : value );
15195		};
15196
15197	if ( a == null ) {
15198		return "";
15199	}
15200
15201	// If an array was passed in, assume that it is an array of form elements.
15202	if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
15203
15204		// Serialize the form elements
15205		jQuery.each( a, function() {
15206			add( this.name, this.value );
15207		} );
15208
15209	} else {
15210
15211		// If traditional, encode the "old" way (the way 1.3.2 or older
15212		// did it), otherwise encode params recursively.
15213		for ( prefix in a ) {
15214			buildParams( prefix, a[ prefix ], traditional, add );
15215		}
15216	}
15217
15218	// Return the resulting serialization
15219	return s.join( "&" );
15220};
15221
15222jQuery.fn.extend( {
15223	serialize: function() {
15224		return jQuery.param( this.serializeArray() );
15225	},
15226	serializeArray: function() {
15227		return this.map( function() {
15228
15229			// Can add propHook for "elements" to filter or add form elements
15230			var elements = jQuery.prop( this, "elements" );
15231			return elements ? jQuery.makeArray( elements ) : this;
15232		} ).filter( function() {
15233			var type = this.type;
15234
15235			// Use .is( ":disabled" ) so that fieldset[disabled] works
15236			return this.name && !jQuery( this ).is( ":disabled" ) &&
15237				rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
15238				( this.checked || !rcheckableType.test( type ) );
15239		} ).map( function( _i, elem ) {
15240			var val = jQuery( this ).val();
15241
15242			if ( val == null ) {
15243				return null;
15244			}
15245
15246			if ( Array.isArray( val ) ) {
15247				return jQuery.map( val, function( val ) {
15248					return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
15249				} );
15250			}
15251
15252			return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
15253		} ).get();
15254	}
15255} );
15256
15257
15258var
15259	r20 = /%20/g,
15260	rhash = /#.*$/,
15261	rantiCache = /([?&])_=[^&]*/,
15262	rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,
15263
15264	// #7653, #8125, #8152: local protocol detection
15265	rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
15266	rnoContent = /^(?:GET|HEAD)$/,
15267	rprotocol = /^\/\//,
15268
15269	/* Prefilters
15270	 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
15271	 * 2) These are called:
15272	 *    - BEFORE asking for a transport
15273	 *    - AFTER param serialization (s.data is a string if s.processData is true)
15274	 * 3) key is the dataType
15275	 * 4) the catchall symbol "*" can be used
15276	 * 5) execution will start with transport dataType and THEN continue down to "*" if needed
15277	 */
15278	prefilters = {},
15279
15280	/* Transports bindings
15281	 * 1) key is the dataType
15282	 * 2) the catchall symbol "*" can be used
15283	 * 3) selection will start with transport dataType and THEN go to "*" if needed
15284	 */
15285	transports = {},
15286
15287	// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
15288	allTypes = "*/".concat( "*" ),
15289
15290	// Anchor tag for parsing the document origin
15291	originAnchor = document.createElement( "a" );
15292
15293originAnchor.href = location.href;
15294
15295// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
15296function addToPrefiltersOrTransports( structure ) {
15297
15298	// dataTypeExpression is optional and defaults to "*"
15299	return function( dataTypeExpression, func ) {
15300
15301		if ( typeof dataTypeExpression !== "string" ) {
15302			func = dataTypeExpression;
15303			dataTypeExpression = "*";
15304		}
15305
15306		var dataType,
15307			i = 0,
15308			dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];
15309
15310		if ( isFunction( func ) ) {
15311
15312			// For each dataType in the dataTypeExpression
15313			while ( ( dataType = dataTypes[ i++ ] ) ) {
15314
15315				// Prepend if requested
15316				if ( dataType[ 0 ] === "+" ) {
15317					dataType = dataType.slice( 1 ) || "*";
15318					( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );
15319
15320				// Otherwise append
15321				} else {
15322					( structure[ dataType ] = structure[ dataType ] || [] ).push( func );
15323				}
15324			}
15325		}
15326	};
15327}
15328
15329// Base inspection function for prefilters and transports
15330function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
15331
15332	var inspected = {},
15333		seekingTransport = ( structure === transports );
15334
15335	function inspect( dataType ) {
15336		var selected;
15337		inspected[ dataType ] = true;
15338		jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
15339			var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
15340			if ( typeof dataTypeOrTransport === "string" &&
15341				!seekingTransport && !inspected[ dataTypeOrTransport ] ) {
15342
15343				options.dataTypes.unshift( dataTypeOrTransport );
15344				inspect( dataTypeOrTransport );
15345				return false;
15346			} else if ( seekingTransport ) {
15347				return !( selected = dataTypeOrTransport );
15348			}
15349		} );
15350		return selected;
15351	}
15352
15353	return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
15354}
15355
15356// A special extend for ajax options
15357// that takes "flat" options (not to be deep extended)
15358// Fixes #9887
15359function ajaxExtend( target, src ) {
15360	var key, deep,
15361		flatOptions = jQuery.ajaxSettings.flatOptions || {};
15362
15363	for ( key in src ) {
15364		if ( src[ key ] !== undefined ) {
15365			( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
15366		}
15367	}
15368	if ( deep ) {
15369		jQuery.extend( true, target, deep );
15370	}
15371
15372	return target;
15373}
15374
15375/* Handles responses to an ajax request:
15376 * - finds the right dataType (mediates between content-type and expected dataType)
15377 * - returns the corresponding response
15378 */
15379function ajaxHandleResponses( s, jqXHR, responses ) {
15380
15381	var ct, type, finalDataType, firstDataType,
15382		contents = s.contents,
15383		dataTypes = s.dataTypes;
15384
15385	// Remove auto dataType and get content-type in the process
15386	while ( dataTypes[ 0 ] === "*" ) {
15387		dataTypes.shift();
15388		if ( ct === undefined ) {
15389			ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" );
15390		}
15391	}
15392
15393	// Check if we're dealing with a known content-type
15394	if ( ct ) {
15395		for ( type in contents ) {
15396			if ( contents[ type ] && contents[ type ].test( ct ) ) {
15397				dataTypes.unshift( type );
15398				break;
15399			}
15400		}
15401	}
15402
15403	// Check to see if we have a response for the expected dataType
15404	if ( dataTypes[ 0 ] in responses ) {
15405		finalDataType = dataTypes[ 0 ];
15406	} else {
15407
15408		// Try convertible dataTypes
15409		for ( type in responses ) {
15410			if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) {
15411				finalDataType = type;
15412				break;
15413			}
15414			if ( !firstDataType ) {
15415				firstDataType = type;
15416			}
15417		}
15418
15419		// Or just use first one
15420		finalDataType = finalDataType || firstDataType;
15421	}
15422
15423	// If we found a dataType
15424	// We add the dataType to the list if needed
15425	// and return the corresponding response
15426	if ( finalDataType ) {
15427		if ( finalDataType !== dataTypes[ 0 ] ) {
15428			dataTypes.unshift( finalDataType );
15429		}
15430		return responses[ finalDataType ];
15431	}
15432}
15433
15434/* Chain conversions given the request and the original response
15435 * Also sets the responseXXX fields on the jqXHR instance
15436 */
15437function ajaxConvert( s, response, jqXHR, isSuccess ) {
15438	var conv2, current, conv, tmp, prev,
15439		converters = {},
15440
15441		// Work with a copy of dataTypes in case we need to modify it for conversion
15442		dataTypes = s.dataTypes.slice();
15443
15444	// Create converters map with lowercased keys
15445	if ( dataTypes[ 1 ] ) {
15446		for ( conv in s.converters ) {
15447			converters[ conv.toLowerCase() ] = s.converters[ conv ];
15448		}
15449	}
15450
15451	current = dataTypes.shift();
15452
15453	// Convert to each sequential dataType
15454	while ( current ) {
15455
15456		if ( s.responseFields[ current ] ) {
15457			jqXHR[ s.responseFields[ current ] ] = response;
15458		}
15459
15460		// Apply the dataFilter if provided
15461		if ( !prev && isSuccess && s.dataFilter ) {
15462			response = s.dataFilter( response, s.dataType );
15463		}
15464
15465		prev = current;
15466		current = dataTypes.shift();
15467
15468		if ( current ) {
15469
15470			// There's only work to do if current dataType is non-auto
15471			if ( current === "*" ) {
15472
15473				current = prev;
15474
15475			// Convert response if prev dataType is non-auto and differs from current
15476			} else if ( prev !== "*" && prev !== current ) {
15477
15478				// Seek a direct converter
15479				conv = converters[ prev + " " + current ] || converters[ "* " + current ];
15480
15481				// If none found, seek a pair
15482				if ( !conv ) {
15483					for ( conv2 in converters ) {
15484
15485						// If conv2 outputs current
15486						tmp = conv2.split( " " );
15487						if ( tmp[ 1 ] === current ) {
15488
15489							// If prev can be converted to accepted input
15490							conv = converters[ prev + " " + tmp[ 0 ] ] ||
15491								converters[ "* " + tmp[ 0 ] ];
15492							if ( conv ) {
15493
15494								// Condense equivalence converters
15495								if ( conv === true ) {
15496									conv = converters[ conv2 ];
15497
15498								// Otherwise, insert the intermediate dataType
15499								} else if ( converters[ conv2 ] !== true ) {
15500									current = tmp[ 0 ];
15501									dataTypes.unshift( tmp[ 1 ] );
15502								}
15503								break;
15504							}
15505						}
15506					}
15507				}
15508
15509				// Apply converter (if not an equivalence)
15510				if ( conv !== true ) {
15511
15512					// Unless errors are allowed to bubble, catch and return them
15513					if ( conv && s.throws ) {
15514						response = conv( response );
15515					} else {
15516						try {
15517							response = conv( response );
15518						} catch ( e ) {
15519							return {
15520								state: "parsererror",
15521								error: conv ? e : "No conversion from " + prev + " to " + current
15522							};
15523						}
15524					}
15525				}
15526			}
15527		}
15528	}
15529
15530	return { state: "success", data: response };
15531}
15532
15533jQuery.extend( {
15534
15535	// Counter for holding the number of active queries
15536	active: 0,
15537
15538	// Last-Modified header cache for next request
15539	lastModified: {},
15540	etag: {},
15541
15542	ajaxSettings: {
15543		url: location.href,
15544		type: "GET",
15545		isLocal: rlocalProtocol.test( location.protocol ),
15546		global: true,
15547		processData: true,
15548		async: true,
15549		contentType: "application/x-www-form-urlencoded; charset=UTF-8",
15550
15551		/*
15552		timeout: 0,
15553		data: null,
15554		dataType: null,
15555		username: null,
15556		password: null,
15557		cache: null,
15558		throws: false,
15559		traditional: false,
15560		headers: {},
15561		*/
15562
15563		accepts: {
15564			"*": allTypes,
15565			text: "text/plain",
15566			html: "text/html",
15567			xml: "application/xml, text/xml",
15568			json: "application/json, text/javascript"
15569		},
15570
15571		contents: {
15572			xml: /\bxml\b/,
15573			html: /\bhtml/,
15574			json: /\bjson\b/
15575		},
15576
15577		responseFields: {
15578			xml: "responseXML",
15579			text: "responseText",
15580			json: "responseJSON"
15581		},
15582
15583		// Data converters
15584		// Keys separate source (or catchall "*") and destination types with a single space
15585		converters: {
15586
15587			// Convert anything to text
15588			"* text": String,
15589
15590			// Text to html (true = no transformation)
15591			"text html": true,
15592
15593			// Evaluate text as a json expression
15594			"text json": JSON.parse,
15595
15596			// Parse text as xml
15597			"text xml": jQuery.parseXML
15598		},
15599
15600		// For options that shouldn't be deep extended:
15601		// you can add your own custom options here if
15602		// and when you create one that shouldn't be
15603		// deep extended (see ajaxExtend)
15604		flatOptions: {
15605			url: true,
15606			context: true
15607		}
15608	},
15609
15610	// Creates a full fledged settings object into target
15611	// with both ajaxSettings and settings fields.
15612	// If target is omitted, writes into ajaxSettings.
15613	ajaxSetup: function( target, settings ) {
15614		return settings ?
15615
15616			// Building a settings object
15617			ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
15618
15619			// Extending ajaxSettings
15620			ajaxExtend( jQuery.ajaxSettings, target );
15621	},
15622
15623	ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
15624	ajaxTransport: addToPrefiltersOrTransports( transports ),
15625
15626	// Main method
15627	ajax: function( url, options ) {
15628
15629		// If url is an object, simulate pre-1.5 signature
15630		if ( typeof url === "object" ) {
15631			options = url;
15632			url = undefined;
15633		}
15634
15635		// Force options to be an object
15636		options = options || {};
15637
15638		var transport,
15639
15640			// URL without anti-cache param
15641			cacheURL,
15642
15643			// Response headers
15644			responseHeadersString,
15645			responseHeaders,
15646
15647			// timeout handle
15648			timeoutTimer,
15649
15650			// Url cleanup var
15651			urlAnchor,
15652
15653			// Request state (becomes false upon send and true upon completion)
15654			completed,
15655
15656			// To know if global events are to be dispatched
15657			fireGlobals,
15658
15659			// Loop variable
15660			i,
15661
15662			// uncached part of the url
15663			uncached,
15664
15665			// Create the final options object
15666			s = jQuery.ajaxSetup( {}, options ),
15667
15668			// Callbacks context
15669			callbackContext = s.context || s,
15670
15671			// Context for global events is callbackContext if it is a DOM node or jQuery collection
15672			globalEventContext = s.context &&
15673				( callbackContext.nodeType || callbackContext.jquery ) ?
15674				jQuery( callbackContext ) :
15675				jQuery.event,
15676
15677			// Deferreds
15678			deferred = jQuery.Deferred(),
15679			completeDeferred = jQuery.Callbacks( "once memory" ),
15680
15681			// Status-dependent callbacks
15682			statusCode = s.statusCode || {},
15683
15684			// Headers (they are sent all at once)
15685			requestHeaders = {},
15686			requestHeadersNames = {},
15687
15688			// Default abort message
15689			strAbort = "canceled",
15690
15691			// Fake xhr
15692			jqXHR = {
15693				readyState: 0,
15694
15695				// Builds headers hashtable if needed
15696				getResponseHeader: function( key ) {
15697					var match;
15698					if ( completed ) {
15699						if ( !responseHeaders ) {
15700							responseHeaders = {};
15701							while ( ( match = rheaders.exec( responseHeadersString ) ) ) {
15702								responseHeaders[ match[ 1 ].toLowerCase() + " " ] =
15703									( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] )
15704										.concat( match[ 2 ] );
15705							}
15706						}
15707						match = responseHeaders[ key.toLowerCase() + " " ];
15708					}
15709					return match == null ? null : match.join( ", " );
15710				},
15711
15712				// Raw string
15713				getAllResponseHeaders: function() {
15714					return completed ? responseHeadersString : null;
15715				},
15716
15717				// Caches the header
15718				setRequestHeader: function( name, value ) {
15719					if ( completed == null ) {
15720						name = requestHeadersNames[ name.toLowerCase() ] =
15721							requestHeadersNames[ name.toLowerCase() ] || name;
15722						requestHeaders[ name ] = value;
15723					}
15724					return this;
15725				},
15726
15727				// Overrides response content-type header
15728				overrideMimeType: function( type ) {
15729					if ( completed == null ) {
15730						s.mimeType = type;
15731					}
15732					return this;
15733				},
15734
15735				// Status-dependent callbacks
15736				statusCode: function( map ) {
15737					var code;
15738					if ( map ) {
15739						if ( completed ) {
15740
15741							// Execute the appropriate callbacks
15742							jqXHR.always( map[ jqXHR.status ] );
15743						} else {
15744
15745							// Lazy-add the new callbacks in a way that preserves old ones
15746							for ( code in map ) {
15747								statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
15748							}
15749						}
15750					}
15751					return this;
15752				},
15753
15754				// Cancel the request
15755				abort: function( statusText ) {
15756					var finalText = statusText || strAbort;
15757					if ( transport ) {
15758						transport.abort( finalText );
15759					}
15760					done( 0, finalText );
15761					return this;
15762				}
15763			};
15764
15765		// Attach deferreds
15766		deferred.promise( jqXHR );
15767
15768		// Add protocol if not provided (prefilters might expect it)
15769		// Handle falsy url in the settings object (#10093: consistency with old signature)
15770		// We also use the url parameter if available
15771		s.url = ( ( url || s.url || location.href ) + "" )
15772			.replace( rprotocol, location.protocol + "//" );
15773
15774		// Alias method option to type as per ticket #12004
15775		s.type = options.method || options.type || s.method || s.type;
15776
15777		// Extract dataTypes list
15778		s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ];
15779
15780		// A cross-domain request is in order when the origin doesn't match the current origin.
15781		if ( s.crossDomain == null ) {
15782			urlAnchor = document.createElement( "a" );
15783
15784			// Support: IE <=8 - 11, Edge 12 - 15
15785			// IE throws exception on accessing the href property if url is malformed,
15786			// e.g. http://example.com:80x/
15787			try {
15788				urlAnchor.href = s.url;
15789
15790				// Support: IE <=8 - 11 only
15791				// Anchor's host property isn't correctly set when s.url is relative
15792				urlAnchor.href = urlAnchor.href;
15793				s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !==
15794					urlAnchor.protocol + "//" + urlAnchor.host;
15795			} catch ( e ) {
15796
15797				// If there is an error parsing the URL, assume it is crossDomain,
15798				// it can be rejected by the transport if it is invalid
15799				s.crossDomain = true;
15800			}
15801		}
15802
15803		// Convert data if not already a string
15804		if ( s.data && s.processData && typeof s.data !== "string" ) {
15805			s.data = jQuery.param( s.data, s.traditional );
15806		}
15807
15808		// Apply prefilters
15809		inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
15810
15811		// If request was aborted inside a prefilter, stop there
15812		if ( completed ) {
15813			return jqXHR;
15814		}
15815
15816		// We can fire global events as of now if asked to
15817		// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)
15818		fireGlobals = jQuery.event && s.global;
15819
15820		// Watch for a new set of requests
15821		if ( fireGlobals && jQuery.active++ === 0 ) {
15822			jQuery.event.trigger( "ajaxStart" );
15823		}
15824
15825		// Uppercase the type
15826		s.type = s.type.toUpperCase();
15827
15828		// Determine if request has content
15829		s.hasContent = !rnoContent.test( s.type );
15830
15831		// Save the URL in case we're toying with the If-Modified-Since
15832		// and/or If-None-Match header later on
15833		// Remove hash to simplify url manipulation
15834		cacheURL = s.url.replace( rhash, "" );
15835
15836		// More options handling for requests with no content
15837		if ( !s.hasContent ) {
15838
15839			// Remember the hash so we can put it back
15840			uncached = s.url.slice( cacheURL.length );
15841
15842			// If data is available and should be processed, append data to url
15843			if ( s.data && ( s.processData || typeof s.data === "string" ) ) {
15844				cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data;
15845
15846				// #9682: remove data so that it's not used in an eventual retry
15847				delete s.data;
15848			}
15849
15850			// Add or update anti-cache param if needed
15851			if ( s.cache === false ) {
15852				cacheURL = cacheURL.replace( rantiCache, "$1" );
15853				uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) +
15854					uncached;
15855			}
15856
15857			// Put hash and anti-cache on the URL that will be requested (gh-1732)
15858			s.url = cacheURL + uncached;
15859
15860		// Change '%20' to '+' if this is encoded form body content (gh-2658)
15861		} else if ( s.data && s.processData &&
15862			( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) {
15863			s.data = s.data.replace( r20, "+" );
15864		}
15865
15866		// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
15867		if ( s.ifModified ) {
15868			if ( jQuery.lastModified[ cacheURL ] ) {
15869				jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
15870			}
15871			if ( jQuery.etag[ cacheURL ] ) {
15872				jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
15873			}
15874		}
15875
15876		// Set the correct header, if data is being sent
15877		if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
15878			jqXHR.setRequestHeader( "Content-Type", s.contentType );
15879		}
15880
15881		// Set the Accepts header for the server, depending on the dataType
15882		jqXHR.setRequestHeader(
15883			"Accept",
15884			s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?
15885				s.accepts[ s.dataTypes[ 0 ] ] +
15886					( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
15887				s.accepts[ "*" ]
15888		);
15889
15890		// Check for headers option
15891		for ( i in s.headers ) {
15892			jqXHR.setRequestHeader( i, s.headers[ i ] );
15893		}
15894
15895		// Allow custom headers/mimetypes and early abort
15896		if ( s.beforeSend &&
15897			( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {
15898
15899			// Abort if not done already and return
15900			return jqXHR.abort();
15901		}
15902
15903		// Aborting is no longer a cancellation
15904		strAbort = "abort";
15905
15906		// Install callbacks on deferreds
15907		completeDeferred.add( s.complete );
15908		jqXHR.done( s.success );
15909		jqXHR.fail( s.error );
15910
15911		// Get transport
15912		transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
15913
15914		// If no transport, we auto-abort
15915		if ( !transport ) {
15916			done( -1, "No Transport" );
15917		} else {
15918			jqXHR.readyState = 1;
15919
15920			// Send global event
15921			if ( fireGlobals ) {
15922				globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
15923			}
15924
15925			// If request was aborted inside ajaxSend, stop there
15926			if ( completed ) {
15927				return jqXHR;
15928			}
15929
15930			// Timeout
15931			if ( s.async && s.timeout > 0 ) {
15932				timeoutTimer = window.setTimeout( function() {
15933					jqXHR.abort( "timeout" );
15934				}, s.timeout );
15935			}
15936
15937			try {
15938				completed = false;
15939				transport.send( requestHeaders, done );
15940			} catch ( e ) {
15941
15942				// Rethrow post-completion exceptions
15943				if ( completed ) {
15944					throw e;
15945				}
15946
15947				// Propagate others as results
15948				done( -1, e );
15949			}
15950		}
15951
15952		// Callback for when everything is done
15953		function done( status, nativeStatusText, responses, headers ) {
15954			var isSuccess, success, error, response, modified,
15955				statusText = nativeStatusText;
15956
15957			// Ignore repeat invocations
15958			if ( completed ) {
15959				return;
15960			}
15961
15962			completed = true;
15963
15964			// Clear timeout if it exists
15965			if ( timeoutTimer ) {
15966				window.clearTimeout( timeoutTimer );
15967			}
15968
15969			// Dereference transport for early garbage collection
15970			// (no matter how long the jqXHR object will be used)
15971			transport = undefined;
15972
15973			// Cache response headers
15974			responseHeadersString = headers || "";
15975
15976			// Set readyState
15977			jqXHR.readyState = status > 0 ? 4 : 0;
15978
15979			// Determine if successful
15980			isSuccess = status >= 200 && status < 300 || status === 304;
15981
15982			// Get response data
15983			if ( responses ) {
15984				response = ajaxHandleResponses( s, jqXHR, responses );
15985			}
15986
15987			// Use a noop converter for missing script but not if jsonp
15988			if ( !isSuccess &&
15989				jQuery.inArray( "script", s.dataTypes ) > -1 &&
15990				jQuery.inArray( "json", s.dataTypes ) < 0 ) {
15991				s.converters[ "text script" ] = function() {};
15992			}
15993
15994			// Convert no matter what (that way responseXXX fields are always set)
15995			response = ajaxConvert( s, response, jqXHR, isSuccess );
15996
15997			// If successful, handle type chaining
15998			if ( isSuccess ) {
15999
16000				// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
16001				if ( s.ifModified ) {
16002					modified = jqXHR.getResponseHeader( "Last-Modified" );
16003					if ( modified ) {
16004						jQuery.lastModified[ cacheURL ] = modified;
16005					}
16006					modified = jqXHR.getResponseHeader( "etag" );
16007					if ( modified ) {
16008						jQuery.etag[ cacheURL ] = modified;
16009					}
16010				}
16011
16012				// if no content
16013				if ( status === 204 || s.type === "HEAD" ) {
16014					statusText = "nocontent";
16015
16016				// if not modified
16017				} else if ( status === 304 ) {
16018					statusText = "notmodified";
16019
16020				// If we have data, let's convert it
16021				} else {
16022					statusText = response.state;
16023					success = response.data;
16024					error = response.error;
16025					isSuccess = !error;
16026				}
16027			} else {
16028
16029				// Extract error from statusText and normalize for non-aborts
16030				error = statusText;
16031				if ( status || !statusText ) {
16032					statusText = "error";
16033					if ( status < 0 ) {
16034						status = 0;
16035					}
16036				}
16037			}
16038
16039			// Set data for the fake xhr object
16040			jqXHR.status = status;
16041			jqXHR.statusText = ( nativeStatusText || statusText ) + "";
16042
16043			// Success/Error
16044			if ( isSuccess ) {
16045				deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
16046			} else {
16047				deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
16048			}
16049
16050			// Status-dependent callbacks
16051			jqXHR.statusCode( statusCode );
16052			statusCode = undefined;
16053
16054			if ( fireGlobals ) {
16055				globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
16056					[ jqXHR, s, isSuccess ? success : error ] );
16057			}
16058
16059			// Complete
16060			completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
16061
16062			if ( fireGlobals ) {
16063				globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
16064
16065				// Handle the global AJAX counter
16066				if ( !( --jQuery.active ) ) {
16067					jQuery.event.trigger( "ajaxStop" );
16068				}
16069			}
16070		}
16071
16072		return jqXHR;
16073	},
16074
16075	getJSON: function( url, data, callback ) {
16076		return jQuery.get( url, data, callback, "json" );
16077	},
16078
16079	getScript: function( url, callback ) {
16080		return jQuery.get( url, undefined, callback, "script" );
16081	}
16082} );
16083
16084jQuery.each( [ "get", "post" ], function( _i, method ) {
16085	jQuery[ method ] = function( url, data, callback, type ) {
16086
16087		// Shift arguments if data argument was omitted
16088		if ( isFunction( data ) ) {
16089			type = type || callback;
16090			callback = data;
16091			data = undefined;
16092		}
16093
16094		// The url can be an options object (which then must have .url)
16095		return jQuery.ajax( jQuery.extend( {
16096			url: url,
16097			type: method,
16098			dataType: type,
16099			data: data,
16100			success: callback
16101		}, jQuery.isPlainObject( url ) && url ) );
16102	};
16103} );
16104
16105jQuery.ajaxPrefilter( function( s ) {
16106	var i;
16107	for ( i in s.headers ) {
16108		if ( i.toLowerCase() === "content-type" ) {
16109			s.contentType = s.headers[ i ] || "";
16110		}
16111	}
16112} );
16113
16114
16115jQuery._evalUrl = function( url, options, doc ) {
16116	return jQuery.ajax( {
16117		url: url,
16118
16119		// Make this explicit, since user can override this through ajaxSetup (#11264)
16120		type: "GET",
16121		dataType: "script",
16122		cache: true,
16123		async: false,
16124		global: false,
16125
16126		// Only evaluate the response if it is successful (gh-4126)
16127		// dataFilter is not invoked for failure responses, so using it instead
16128		// of the default converter is kludgy but it works.
16129		converters: {
16130			"text script": function() {}
16131		},
16132		dataFilter: function( response ) {
16133			jQuery.globalEval( response, options, doc );
16134		}
16135	} );
16136};
16137
16138
16139jQuery.fn.extend( {
16140	wrapAll: function( html ) {
16141		var wrap;
16142
16143		if ( this[ 0 ] ) {
16144			if ( isFunction( html ) ) {
16145				html = html.call( this[ 0 ] );
16146			}
16147
16148			// The elements to wrap the target around
16149			wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );
16150
16151			if ( this[ 0 ].parentNode ) {
16152				wrap.insertBefore( this[ 0 ] );
16153			}
16154
16155			wrap.map( function() {
16156				var elem = this;
16157
16158				while ( elem.firstElementChild ) {
16159					elem = elem.firstElementChild;
16160				}
16161
16162				return elem;
16163			} ).append( this );
16164		}
16165
16166		return this;
16167	},
16168
16169	wrapInner: function( html ) {
16170		if ( isFunction( html ) ) {
16171			return this.each( function( i ) {
16172				jQuery( this ).wrapInner( html.call( this, i ) );
16173			} );
16174		}
16175
16176		return this.each( function() {
16177			var self = jQuery( this ),
16178				contents = self.contents();
16179
16180			if ( contents.length ) {
16181				contents.wrapAll( html );
16182
16183			} else {
16184				self.append( html );
16185			}
16186		} );
16187	},
16188
16189	wrap: function( html ) {
16190		var htmlIsFunction = isFunction( html );
16191
16192		return this.each( function( i ) {
16193			jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html );
16194		} );
16195	},
16196
16197	unwrap: function( selector ) {
16198		this.parent( selector ).not( "body" ).each( function() {
16199			jQuery( this ).replaceWith( this.childNodes );
16200		} );
16201		return this;
16202	}
16203} );
16204
16205
16206jQuery.expr.pseudos.hidden = function( elem ) {
16207	return !jQuery.expr.pseudos.visible( elem );
16208};
16209jQuery.expr.pseudos.visible = function( elem ) {
16210	return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );
16211};
16212
16213
16214
16215
16216jQuery.ajaxSettings.xhr = function() {
16217	try {
16218		return new window.XMLHttpRequest();
16219	} catch ( e ) {}
16220};
16221
16222var xhrSuccessStatus = {
16223
16224		// File protocol always yields status code 0, assume 200
16225		0: 200,
16226
16227		// Support: IE <=9 only
16228		// #1450: sometimes IE returns 1223 when it should be 204
16229		1223: 204
16230	},
16231	xhrSupported = jQuery.ajaxSettings.xhr();
16232
16233support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
16234support.ajax = xhrSupported = !!xhrSupported;
16235
16236jQuery.ajaxTransport( function( options ) {
16237	var callback, errorCallback;
16238
16239	// Cross domain only allowed if supported through XMLHttpRequest
16240	if ( support.cors || xhrSupported && !options.crossDomain ) {
16241		return {
16242			send: function( headers, complete ) {
16243				var i,
16244					xhr = options.xhr();
16245
16246				xhr.open(
16247					options.type,
16248					options.url,
16249					options.async,
16250					options.username,
16251					options.password
16252				);
16253
16254				// Apply custom fields if provided
16255				if ( options.xhrFields ) {
16256					for ( i in options.xhrFields ) {
16257						xhr[ i ] = options.xhrFields[ i ];
16258					}
16259				}
16260
16261				// Override mime type if needed
16262				if ( options.mimeType && xhr.overrideMimeType ) {
16263					xhr.overrideMimeType( options.mimeType );
16264				}
16265
16266				// X-Requested-With header
16267				// For cross-domain requests, seeing as conditions for a preflight are
16268				// akin to a jigsaw puzzle, we simply never set it to be sure.
16269				// (it can always be set on a per-request basis or even using ajaxSetup)
16270				// For same-domain requests, won't change header if already provided.
16271				if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) {
16272					headers[ "X-Requested-With" ] = "XMLHttpRequest";
16273				}
16274
16275				// Set headers
16276				for ( i in headers ) {
16277					xhr.setRequestHeader( i, headers[ i ] );
16278				}
16279
16280				// Callback
16281				callback = function( type ) {
16282					return function() {
16283						if ( callback ) {
16284							callback = errorCallback = xhr.onload =
16285								xhr.onerror = xhr.onabort = xhr.ontimeout =
16286									xhr.onreadystatechange = null;
16287
16288							if ( type === "abort" ) {
16289								xhr.abort();
16290							} else if ( type === "error" ) {
16291
16292								// Support: IE <=9 only
16293								// On a manual native abort, IE9 throws
16294								// errors on any property access that is not readyState
16295								if ( typeof xhr.status !== "number" ) {
16296									complete( 0, "error" );
16297								} else {
16298									complete(
16299
16300										// File: protocol always yields status 0; see #8605, #14207
16301										xhr.status,
16302										xhr.statusText
16303									);
16304								}
16305							} else {
16306								complete(
16307									xhrSuccessStatus[ xhr.status ] || xhr.status,
16308									xhr.statusText,
16309
16310									// Support: IE <=9 only
16311									// IE9 has no XHR2 but throws on binary (trac-11426)
16312									// For XHR2 non-text, let the caller handle it (gh-2498)
16313									( xhr.responseType || "text" ) !== "text"  ||
16314									typeof xhr.responseText !== "string" ?
16315										{ binary: xhr.response } :
16316										{ text: xhr.responseText },
16317									xhr.getAllResponseHeaders()
16318								);
16319							}
16320						}
16321					};
16322				};
16323
16324				// Listen to events
16325				xhr.onload = callback();
16326				errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" );
16327
16328				// Support: IE 9 only
16329				// Use onreadystatechange to replace onabort
16330				// to handle uncaught aborts
16331				if ( xhr.onabort !== undefined ) {
16332					xhr.onabort = errorCallback;
16333				} else {
16334					xhr.onreadystatechange = function() {
16335
16336						// Check readyState before timeout as it changes
16337						if ( xhr.readyState === 4 ) {
16338
16339							// Allow onerror to be called first,
16340							// but that will not handle a native abort
16341							// Also, save errorCallback to a variable
16342							// as xhr.onerror cannot be accessed
16343							window.setTimeout( function() {
16344								if ( callback ) {
16345									errorCallback();
16346								}
16347							} );
16348						}
16349					};
16350				}
16351
16352				// Create the abort callback
16353				callback = callback( "abort" );
16354
16355				try {
16356
16357					// Do send the request (this may raise an exception)
16358					xhr.send( options.hasContent && options.data || null );
16359				} catch ( e ) {
16360
16361					// #14683: Only rethrow if this hasn't been notified as an error yet
16362					if ( callback ) {
16363						throw e;
16364					}
16365				}
16366			},
16367
16368			abort: function() {
16369				if ( callback ) {
16370					callback();
16371				}
16372			}
16373		};
16374	}
16375} );
16376
16377
16378
16379
16380// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)
16381jQuery.ajaxPrefilter( function( s ) {
16382	if ( s.crossDomain ) {
16383		s.contents.script = false;
16384	}
16385} );
16386
16387// Install script dataType
16388jQuery.ajaxSetup( {
16389	accepts: {
16390		script: "text/javascript, application/javascript, " +
16391			"application/ecmascript, application/x-ecmascript"
16392	},
16393	contents: {
16394		script: /\b(?:java|ecma)script\b/
16395	},
16396	converters: {
16397		"text script": function( text ) {
16398			jQuery.globalEval( text );
16399			return text;
16400		}
16401	}
16402} );
16403
16404// Handle cache's special case and crossDomain
16405jQuery.ajaxPrefilter( "script", function( s ) {
16406	if ( s.cache === undefined ) {
16407		s.cache = false;
16408	}
16409	if ( s.crossDomain ) {
16410		s.type = "GET";
16411	}
16412} );
16413
16414// Bind script tag hack transport
16415jQuery.ajaxTransport( "script", function( s ) {
16416
16417	// This transport only deals with cross domain or forced-by-attrs requests
16418	if ( s.crossDomain || s.scriptAttrs ) {
16419		var script, callback;
16420		return {
16421			send: function( _, complete ) {
16422				script = jQuery( "<script>" )
16423					.attr( s.scriptAttrs || {} )
16424					.prop( { charset: s.scriptCharset, src: s.url } )
16425					.on( "load error", callback = function( evt ) {
16426						script.remove();
16427						callback = null;
16428						if ( evt ) {
16429							complete( evt.type === "error" ? 404 : 200, evt.type );
16430						}
16431					} );
16432
16433				// Use native DOM manipulation to avoid our domManip AJAX trickery
16434				document.head.appendChild( script[ 0 ] );
16435			},
16436			abort: function() {
16437				if ( callback ) {
16438					callback();
16439				}
16440			}
16441		};
16442	}
16443} );
16444
16445
16446
16447
16448var oldCallbacks = [],
16449	rjsonp = /(=)\?(?=&|$)|\?\?/;
16450
16451// Default jsonp settings
16452jQuery.ajaxSetup( {
16453	jsonp: "callback",
16454	jsonpCallback: function() {
16455		var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce.guid++ ) );
16456		this[ callback ] = true;
16457		return callback;
16458	}
16459} );
16460
16461// Detect, normalize options and install callbacks for jsonp requests
16462jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
16463
16464	var callbackName, overwritten, responseContainer,
16465		jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
16466			"url" :
16467			typeof s.data === "string" &&
16468				( s.contentType || "" )
16469					.indexOf( "application/x-www-form-urlencoded" ) === 0 &&
16470				rjsonp.test( s.data ) && "data"
16471		);
16472
16473	// Handle iff the expected data type is "jsonp" or we have a parameter to set
16474	if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
16475
16476		// Get callback name, remembering preexisting value associated with it
16477		callbackName = s.jsonpCallback = isFunction( s.jsonpCallback ) ?
16478			s.jsonpCallback() :
16479			s.jsonpCallback;
16480
16481		// Insert callback into url or form data
16482		if ( jsonProp ) {
16483			s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
16484		} else if ( s.jsonp !== false ) {
16485			s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
16486		}
16487
16488		// Use data converter to retrieve json after script execution
16489		s.converters[ "script json" ] = function() {
16490			if ( !responseContainer ) {
16491				jQuery.error( callbackName + " was not called" );
16492			}
16493			return responseContainer[ 0 ];
16494		};
16495
16496		// Force json dataType
16497		s.dataTypes[ 0 ] = "json";
16498
16499		// Install callback
16500		overwritten = window[ callbackName ];
16501		window[ callbackName ] = function() {
16502			responseContainer = arguments;
16503		};
16504
16505		// Clean-up function (fires after converters)
16506		jqXHR.always( function() {
16507
16508			// If previous value didn't exist - remove it
16509			if ( overwritten === undefined ) {
16510				jQuery( window ).removeProp( callbackName );
16511
16512			// Otherwise restore preexisting value
16513			} else {
16514				window[ callbackName ] = overwritten;
16515			}
16516
16517			// Save back as free
16518			if ( s[ callbackName ] ) {
16519
16520				// Make sure that re-using the options doesn't screw things around
16521				s.jsonpCallback = originalSettings.jsonpCallback;
16522
16523				// Save the callback name for future use
16524				oldCallbacks.push( callbackName );
16525			}
16526
16527			// Call if it was a function and we have a response
16528			if ( responseContainer && isFunction( overwritten ) ) {
16529				overwritten( responseContainer[ 0 ] );
16530			}
16531
16532			responseContainer = overwritten = undefined;
16533		} );
16534
16535		// Delegate to script
16536		return "script";
16537	}
16538} );
16539
16540
16541
16542
16543// Support: Safari 8 only
16544// In Safari 8 documents created via document.implementation.createHTMLDocument
16545// collapse sibling forms: the second one becomes a child of the first one.
16546// Because of that, this security measure has to be disabled in Safari 8.
16547// https://bugs.webkit.org/show_bug.cgi?id=137337
16548support.createHTMLDocument = ( function() {
16549	var body = document.implementation.createHTMLDocument( "" ).body;
16550	body.innerHTML = "<form></form><form></form>";
16551	return body.childNodes.length === 2;
16552} )();
16553
16554
16555// Argument "data" should be string of html
16556// context (optional): If specified, the fragment will be created in this context,
16557// defaults to document
16558// keepScripts (optional): If true, will include scripts passed in the html string
16559jQuery.parseHTML = function( data, context, keepScripts ) {
16560	if ( typeof data !== "string" ) {
16561		return [];
16562	}
16563	if ( typeof context === "boolean" ) {
16564		keepScripts = context;
16565		context = false;
16566	}
16567
16568	var base, parsed, scripts;
16569
16570	if ( !context ) {
16571
16572		// Stop scripts or inline event handlers from being executed immediately
16573		// by using document.implementation
16574		if ( support.createHTMLDocument ) {
16575			context = document.implementation.createHTMLDocument( "" );
16576
16577			// Set the base href for the created document
16578			// so any parsed elements with URLs
16579			// are based on the document's URL (gh-2965)
16580			base = context.createElement( "base" );
16581			base.href = document.location.href;
16582			context.head.appendChild( base );
16583		} else {
16584			context = document;
16585		}
16586	}
16587
16588	parsed = rsingleTag.exec( data );
16589	scripts = !keepScripts && [];
16590
16591	// Single tag
16592	if ( parsed ) {
16593		return [ context.createElement( parsed[ 1 ] ) ];
16594	}
16595
16596	parsed = buildFragment( [ data ], context, scripts );
16597
16598	if ( scripts && scripts.length ) {
16599		jQuery( scripts ).remove();
16600	}
16601
16602	return jQuery.merge( [], parsed.childNodes );
16603};
16604
16605
16606/**
16607 * Load a url into a page
16608 */
16609jQuery.fn.load = function( url, params, callback ) {
16610	var selector, type, response,
16611		self = this,
16612		off = url.indexOf( " " );
16613
16614	if ( off > -1 ) {
16615		selector = stripAndCollapse( url.slice( off ) );
16616		url = url.slice( 0, off );
16617	}
16618
16619	// If it's a function
16620	if ( isFunction( params ) ) {
16621
16622		// We assume that it's the callback
16623		callback = params;
16624		params = undefined;
16625
16626	// Otherwise, build a param string
16627	} else if ( params && typeof params === "object" ) {
16628		type = "POST";
16629	}
16630
16631	// If we have elements to modify, make the request
16632	if ( self.length > 0 ) {
16633		jQuery.ajax( {
16634			url: url,
16635
16636			// If "type" variable is undefined, then "GET" method will be used.
16637			// Make value of this field explicit since
16638			// user can override it through ajaxSetup method
16639			type: type || "GET",
16640			dataType: "html",
16641			data: params
16642		} ).done( function( responseText ) {
16643
16644			// Save response for use in complete callback
16645			response = arguments;
16646
16647			self.html( selector ?
16648
16649				// If a selector was specified, locate the right elements in a dummy div
16650				// Exclude scripts to avoid IE 'Permission Denied' errors
16651				jQuery( "<div>" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :
16652
16653				// Otherwise use the full result
16654				responseText );
16655
16656		// If the request succeeds, this function gets "data", "status", "jqXHR"
16657		// but they are ignored because response was set above.
16658		// If it fails, this function gets "jqXHR", "status", "error"
16659		} ).always( callback && function( jqXHR, status ) {
16660			self.each( function() {
16661				callback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );
16662			} );
16663		} );
16664	}
16665
16666	return this;
16667};
16668
16669
16670
16671
16672jQuery.expr.pseudos.animated = function( elem ) {
16673	return jQuery.grep( jQuery.timers, function( fn ) {
16674		return elem === fn.elem;
16675	} ).length;
16676};
16677
16678
16679
16680
16681jQuery.offset = {
16682	setOffset: function( elem, options, i ) {
16683		var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
16684			position = jQuery.css( elem, "position" ),
16685			curElem = jQuery( elem ),
16686			props = {};
16687
16688		// Set position first, in-case top/left are set even on static elem
16689		if ( position === "static" ) {
16690			elem.style.position = "relative";
16691		}
16692
16693		curOffset = curElem.offset();
16694		curCSSTop = jQuery.css( elem, "top" );
16695		curCSSLeft = jQuery.css( elem, "left" );
16696		calculatePosition = ( position === "absolute" || position === "fixed" ) &&
16697			( curCSSTop + curCSSLeft ).indexOf( "auto" ) > -1;
16698
16699		// Need to be able to calculate position if either
16700		// top or left is auto and position is either absolute or fixed
16701		if ( calculatePosition ) {
16702			curPosition = curElem.position();
16703			curTop = curPosition.top;
16704			curLeft = curPosition.left;
16705
16706		} else {
16707			curTop = parseFloat( curCSSTop ) || 0;
16708			curLeft = parseFloat( curCSSLeft ) || 0;
16709		}
16710
16711		if ( isFunction( options ) ) {
16712
16713			// Use jQuery.extend here to allow modification of coordinates argument (gh-1848)
16714			options = options.call( elem, i, jQuery.extend( {}, curOffset ) );
16715		}
16716
16717		if ( options.top != null ) {
16718			props.top = ( options.top - curOffset.top ) + curTop;
16719		}
16720		if ( options.left != null ) {
16721			props.left = ( options.left - curOffset.left ) + curLeft;
16722		}
16723
16724		if ( "using" in options ) {
16725			options.using.call( elem, props );
16726
16727		} else {
16728			curElem.css( props );
16729		}
16730	}
16731};
16732
16733jQuery.fn.extend( {
16734
16735	// offset() relates an element's border box to the document origin
16736	offset: function( options ) {
16737
16738		// Preserve chaining for setter
16739		if ( arguments.length ) {
16740			return options === undefined ?
16741				this :
16742				this.each( function( i ) {
16743					jQuery.offset.setOffset( this, options, i );
16744				} );
16745		}
16746
16747		var rect, win,
16748			elem = this[ 0 ];
16749
16750		if ( !elem ) {
16751			return;
16752		}
16753
16754		// Return zeros for disconnected and hidden (display: none) elements (gh-2310)
16755		// Support: IE <=11 only
16756		// Running getBoundingClientRect on a
16757		// disconnected node in IE throws an error
16758		if ( !elem.getClientRects().length ) {
16759			return { top: 0, left: 0 };
16760		}
16761
16762		// Get document-relative position by adding viewport scroll to viewport-relative gBCR
16763		rect = elem.getBoundingClientRect();
16764		win = elem.ownerDocument.defaultView;
16765		return {
16766			top: rect.top + win.pageYOffset,
16767			left: rect.left + win.pageXOffset
16768		};
16769	},
16770
16771	// position() relates an element's margin box to its offset parent's padding box
16772	// This corresponds to the behavior of CSS absolute positioning
16773	position: function() {
16774		if ( !this[ 0 ] ) {
16775			return;
16776		}
16777
16778		var offsetParent, offset, doc,
16779			elem = this[ 0 ],
16780			parentOffset = { top: 0, left: 0 };
16781
16782		// position:fixed elements are offset from the viewport, which itself always has zero offset
16783		if ( jQuery.css( elem, "position" ) === "fixed" ) {
16784
16785			// Assume position:fixed implies availability of getBoundingClientRect
16786			offset = elem.getBoundingClientRect();
16787
16788		} else {
16789			offset = this.offset();
16790
16791			// Account for the *real* offset parent, which can be the document or its root element
16792			// when a statically positioned element is identified
16793			doc = elem.ownerDocument;
16794			offsetParent = elem.offsetParent || doc.documentElement;
16795			while ( offsetParent &&
16796				( offsetParent === doc.body || offsetParent === doc.documentElement ) &&
16797				jQuery.css( offsetParent, "position" ) === "static" ) {
16798
16799				offsetParent = offsetParent.parentNode;
16800			}
16801			if ( offsetParent && offsetParent !== elem && offsetParent.nodeType === 1 ) {
16802
16803				// Incorporate borders into its offset, since they are outside its content origin
16804				parentOffset = jQuery( offsetParent ).offset();
16805				parentOffset.top += jQuery.css( offsetParent, "borderTopWidth", true );
16806				parentOffset.left += jQuery.css( offsetParent, "borderLeftWidth", true );
16807			}
16808		}
16809
16810		// Subtract parent offsets and element margins
16811		return {
16812			top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ),
16813			left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true )
16814		};
16815	},
16816
16817	// This method will return documentElement in the following cases:
16818	// 1) For the element inside the iframe without offsetParent, this method will return
16819	//    documentElement of the parent window
16820	// 2) For the hidden or detached element
16821	// 3) For body or html element, i.e. in case of the html node - it will return itself
16822	//
16823	// but those exceptions were never presented as a real life use-cases
16824	// and might be considered as more preferable results.
16825	//
16826	// This logic, however, is not guaranteed and can change at any point in the future
16827	offsetParent: function() {
16828		return this.map( function() {
16829			var offsetParent = this.offsetParent;
16830
16831			while ( offsetParent && jQuery.css( offsetParent, "position" ) === "static" ) {
16832				offsetParent = offsetParent.offsetParent;
16833			}
16834
16835			return offsetParent || documentElement;
16836		} );
16837	}
16838} );
16839
16840// Create scrollLeft and scrollTop methods
16841jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) {
16842	var top = "pageYOffset" === prop;
16843
16844	jQuery.fn[ method ] = function( val ) {
16845		return access( this, function( elem, method, val ) {
16846
16847			// Coalesce documents and windows
16848			var win;
16849			if ( isWindow( elem ) ) {
16850				win = elem;
16851			} else if ( elem.nodeType === 9 ) {
16852				win = elem.defaultView;
16853			}
16854
16855			if ( val === undefined ) {
16856				return win ? win[ prop ] : elem[ method ];
16857			}
16858
16859			if ( win ) {
16860				win.scrollTo(
16861					!top ? val : win.pageXOffset,
16862					top ? val : win.pageYOffset
16863				);
16864
16865			} else {
16866				elem[ method ] = val;
16867			}
16868		}, method, val, arguments.length );
16869	};
16870} );
16871
16872// Support: Safari <=7 - 9.1, Chrome <=37 - 49
16873// Add the top/left cssHooks using jQuery.fn.position
16874// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
16875// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347
16876// getComputedStyle returns percent when specified for top/left/bottom/right;
16877// rather than make the css module depend on the offset module, just check for it here
16878jQuery.each( [ "top", "left" ], function( _i, prop ) {
16879	jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
16880		function( elem, computed ) {
16881			if ( computed ) {
16882				computed = curCSS( elem, prop );
16883
16884				// If curCSS returns percentage, fallback to offset
16885				return rnumnonpx.test( computed ) ?
16886					jQuery( elem ).position()[ prop ] + "px" :
16887					computed;
16888			}
16889		}
16890	);
16891} );
16892
16893
16894// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
16895jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
16896	jQuery.each( {
16897		padding: "inner" + name,
16898		content: type,
16899		"": "outer" + name
16900	}, function( defaultExtra, funcName ) {
16901
16902		// Margin is only for outerHeight, outerWidth
16903		jQuery.fn[ funcName ] = function( margin, value ) {
16904			var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
16905				extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
16906
16907			return access( this, function( elem, type, value ) {
16908				var doc;
16909
16910				if ( isWindow( elem ) ) {
16911
16912					// $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)
16913					return funcName.indexOf( "outer" ) === 0 ?
16914						elem[ "inner" + name ] :
16915						elem.document.documentElement[ "client" + name ];
16916				}
16917
16918				// Get document width or height
16919				if ( elem.nodeType === 9 ) {
16920					doc = elem.documentElement;
16921
16922					// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
16923					// whichever is greatest
16924					return Math.max(
16925						elem.body[ "scroll" + name ], doc[ "scroll" + name ],
16926						elem.body[ "offset" + name ], doc[ "offset" + name ],
16927						doc[ "client" + name ]
16928					);
16929				}
16930
16931				return value === undefined ?
16932
16933					// Get width or height on the element, requesting but not forcing parseFloat
16934					jQuery.css( elem, type, extra ) :
16935
16936					// Set width or height on the element
16937					jQuery.style( elem, type, value, extra );
16938			}, type, chainable ? margin : undefined, chainable );
16939		};
16940	} );
16941} );
16942
16943
16944jQuery.each( [
16945	"ajaxStart",
16946	"ajaxStop",
16947	"ajaxComplete",
16948	"ajaxError",
16949	"ajaxSuccess",
16950	"ajaxSend"
16951], function( _i, type ) {
16952	jQuery.fn[ type ] = function( fn ) {
16953		return this.on( type, fn );
16954	};
16955} );
16956
16957
16958
16959
16960jQuery.fn.extend( {
16961
16962	bind: function( types, data, fn ) {
16963		return this.on( types, null, data, fn );
16964	},
16965	unbind: function( types, fn ) {
16966		return this.off( types, null, fn );
16967	},
16968
16969	delegate: function( selector, types, data, fn ) {
16970		return this.on( types, selector, data, fn );
16971	},
16972	undelegate: function( selector, types, fn ) {
16973
16974		// ( namespace ) or ( selector, types [, fn] )
16975		return arguments.length === 1 ?
16976			this.off( selector, "**" ) :
16977			this.off( types, selector || "**", fn );
16978	},
16979
16980	hover: function( fnOver, fnOut ) {
16981		return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
16982	}
16983} );
16984
16985jQuery.each(
16986	( "blur focus focusin focusout resize scroll click dblclick " +
16987	"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
16988	"change select submit keydown keypress keyup contextmenu" ).split( " " ),
16989	function( _i, name ) {
16990
16991		// Handle event binding
16992		jQuery.fn[ name ] = function( data, fn ) {
16993			return arguments.length > 0 ?
16994				this.on( name, null, data, fn ) :
16995				this.trigger( name );
16996		};
16997	}
16998);
16999
17000
17001
17002
17003// Support: Android <=4.0 only
17004// Make sure we trim BOM and NBSP
17005var rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;
17006
17007// Bind a function to a context, optionally partially applying any
17008// arguments.
17009// jQuery.proxy is deprecated to promote standards (specifically Function#bind)
17010// However, it is not slated for removal any time soon
17011jQuery.proxy = function( fn, context ) {
17012	var tmp, args, proxy;
17013
17014	if ( typeof context === "string" ) {
17015		tmp = fn[ context ];
17016		context = fn;
17017		fn = tmp;
17018	}
17019
17020	// Quick check to determine if target is callable, in the spec
17021	// this throws a TypeError, but we will just return undefined.
17022	if ( !isFunction( fn ) ) {
17023		return undefined;
17024	}
17025
17026	// Simulated bind
17027	args = slice.call( arguments, 2 );
17028	proxy = function() {
17029		return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
17030	};
17031
17032	// Set the guid of unique handler to the same of original handler, so it can be removed
17033	proxy.guid = fn.guid = fn.guid || jQuery.guid++;
17034
17035	return proxy;
17036};
17037
17038jQuery.holdReady = function( hold ) {
17039	if ( hold ) {
17040		jQuery.readyWait++;
17041	} else {
17042		jQuery.ready( true );
17043	}
17044};
17045jQuery.isArray = Array.isArray;
17046jQuery.parseJSON = JSON.parse;
17047jQuery.nodeName = nodeName;
17048jQuery.isFunction = isFunction;
17049jQuery.isWindow = isWindow;
17050jQuery.camelCase = camelCase;
17051jQuery.type = toType;
17052
17053jQuery.now = Date.now;
17054
17055jQuery.isNumeric = function( obj ) {
17056
17057	// As of jQuery 3.0, isNumeric is limited to
17058	// strings and numbers (primitives or objects)
17059	// that can be coerced to finite numbers (gh-2662)
17060	var type = jQuery.type( obj );
17061	return ( type === "number" || type === "string" ) &&
17062
17063		// parseFloat NaNs numeric-cast false positives ("")
17064		// ...but misinterprets leading-number strings, particularly hex literals ("0x...")
17065		// subtraction forces infinities to NaN
17066		!isNaN( obj - parseFloat( obj ) );
17067};
17068
17069jQuery.trim = function( text ) {
17070	return text == null ?
17071		"" :
17072		( text + "" ).replace( rtrim, "" );
17073};
17074
17075
17076
17077// Register as a named AMD module, since jQuery can be concatenated with other
17078// files that may use define, but not via a proper concatenation script that
17079// understands anonymous AMD modules. A named AMD is safest and most robust
17080// way to register. Lowercase jquery is used because AMD module names are
17081// derived from file names, and jQuery is normally delivered in a lowercase
17082// file name. Do this after creating the global so that if an AMD module wants
17083// to call noConflict to hide this version of jQuery, it will work.
17084
17085// Note that for maximum portability, libraries that are not jQuery should
17086// declare themselves as anonymous modules, and avoid setting a global if an
17087// AMD loader is present. jQuery is a special case. For more information, see
17088// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon
17089
17090if ( typeof define === "function" && define.amd ) {
17091	define( "jquery", [], function() {
17092		return jQuery;
17093	} );
17094}
17095
17096
17097
17098
17099var
17100
17101	// Map over jQuery in case of overwrite
17102	_jQuery = window.jQuery,
17103
17104	// Map over the $ in case of overwrite
17105	_$ = window.$;
17106
17107jQuery.noConflict = function( deep ) {
17108	if ( window.$ === jQuery ) {
17109		window.$ = _$;
17110	}
17111
17112	if ( deep && window.jQuery === jQuery ) {
17113		window.jQuery = _jQuery;
17114	}
17115
17116	return jQuery;
17117};
17118
17119// Expose jQuery and $ identifiers, even in AMD
17120// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
17121// and CommonJS for browser emulators (#13566)
17122if ( typeof noGlobal === "undefined" ) {
17123	window.jQuery = window.$ = jQuery;
17124}
17125
17126
17127
17128
17129return jQuery;
17130} );
17131
17132
17133
17134/***/ }),
17135
17136/***/ "./src/js/cursor.js":
17137/*!**************************!*\
17138  !*** ./src/js/cursor.js ***!
17139  \**************************/
17140/*! exports provided: default */
17141/***/ (function(module, __webpack_exports__, __webpack_require__) {
17142
17143"use strict";
17144__webpack_require__.r(__webpack_exports__);
17145/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Cursor; });
17146/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js");
17147/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);
17148/* harmony import */ var gsap__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! gsap */ "./node_modules/gsap/index.js");
17149function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function");}}function _defineProperties(target,props){for(var i=0;i<props.length;i++){var descriptor=props[i];descriptor.enumerable=descriptor.enumerable||false;descriptor.configurable=true;if("value"in descriptor)descriptor.writable=true;Object.defineProperty(target,descriptor.key,descriptor);}}function _createClass(Constructor,protoProps,staticProps){if(protoProps)_defineProperties(Constructor.prototype,protoProps);if(staticProps)_defineProperties(Constructor,staticProps);return Constructor;}/*** IMPORTS FROM imports-loader ***/var define=false;var Cursor=/*#__PURE__*/function(){function Cursor(options){_classCallCheck(this,Cursor);this.options=jquery__WEBPACK_IMPORTED_MODULE_0___default.a.extend(true,{container:"body",speed:0.7,ease:"expo.out",visibleTimeout:300},options);this.body=jquery__WEBPACK_IMPORTED_MODULE_0___default()(this.options.container);this.el=jquery__WEBPACK_IMPORTED_MODULE_0___default()('<div class="cb-cursor"></div>');this.text=jquery__WEBPACK_IMPORTED_MODULE_0___default()('<div class="cb-cursor-text"></div>');this.init();}_createClass(Cursor,[{key:"init",value:function init(){this.el.append(this.text);this.body.append(this.el);this.bind();this.move(-window.innerWidth,-window.innerHeight,0);}},{key:"bind",value:function bind(){var _this=this;var self=this;this.body.on('mouseleave',function(){self.hide();}).on('mouseenter',function(){self.show();}).on('mousemove',function(e){_this.pos={x:_this.stick?_this.stick.x-(_this.stick.x-e.clientX)*0.15:e.clientX,y:_this.stick?_this.stick.y-(_this.stick.y-e.clientY)*0.15:e.clientY};_this.update();}).on('mousedown',function(){self.setState('-active');}).on('mouseup',function(){self.removeState('-active');}).on('mouseenter','a,input,textarea,button',function(){self.setState('-pointer');}).on('mouseleave','a,input,textarea,button',function(){self.removeState('-pointer');}).on('mouseenter','iframe',function(){self.hide();}).on('mouseleave','iframe',function(){self.show();}).on('mouseenter','[data-cursor]',function(){self.setState(this.dataset.cursor);}).on('mouseleave','[data-cursor]',function(){self.removeState(this.dataset.cursor);}).on('mouseenter','[data-cursor-text]',function(){self.setText(this.dataset.cursorText);}).on('mouseleave','[data-cursor-text]',function(){self.removeText();}).on('mouseenter','[data-cursor-stick]',function(){self.setStick(this.dataset.cursorStick);}).on('mouseleave','[data-cursor-stick]',function(){self.removeStick();});}},{key:"setState",value:function setState(state){this.el.addClass(state);}},{key:"removeState",value:function removeState(state){this.el.removeClass(state);}},{key:"toggleState",value:function toggleState(state){this.el.toggleClass(state);}},{key:"setText",value:function setText(text){this.text.html(text);this.el.addClass('-text');}},{key:"removeText",value:function removeText(){this.el.removeClass('-text');}},{key:"setStick",value:function setStick(el){var target=jquery__WEBPACK_IMPORTED_MODULE_0___default()(el);var bound=target.get(0).getBoundingClientRect();this.stick={y:bound.top+target.height()/2,x:bound.left+target.width()/2};this.move(this.stick.x,this.stick.y,5);}},{key:"removeStick",value:function removeStick(){this.stick=false;}}
17149,{key:"update",value:function update(){this.move();this.show();}},{key:"move",value:function move(x,y,duration){gsap__WEBPACK_IMPORTED_MODULE_1__["default"].to(this.el,{x:x||this.pos.x,y:y||this.pos.y,force3D:true,overwrite:true,ease:this.options.ease,duration:this.visible?duration||this.options.speed:0});}},{key:"show",value:function show(){var _this2=this;if(this.visible)return;clearInterval(this.visibleInt);this.el.addClass('-visible');this.visibleInt=setTimeout(function(){return _this2.visible=true;});}},{key:"hide",value:function hide(){var _this3=this;clearInterval(this.visibleInt);this.el.removeClass('-visible');this.visibleInt=setTimeout(function(){return _this3.visible=false;},this.options.visibleTimeout);}}]);return Cursor;}();
17150
17151/***/ }),
17152
17153/***/ "./src/js/index.js":
17154/*!*************************!*\
17155  !*** ./src/js/index.js ***!
17156  \*************************/
17157/*! no exports provided */
17158/***/ (function(module, __webpack_exports__, __webpack_require__) {
17159
17160"use strict";
17161__webpack_require__.r(__webpack_exports__);
17162/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js");
17163/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);
17164/* harmony import */ var cursor__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! cursor */ "./src/js/cursor.js");
17165/* harmony import */ var magnetic__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! magnetic */ "./src/js/magnetic.js");
17166/*** IMPORTS FROM imports-loader ***/var define=false;// Init cursor
17167var cursor=new cursor__WEBPACK_IMPORTED_MODULE_1__["default"]();// Init magnetic
17168jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-magnetic]').each(function(){new magnetic__WEBPACK_IMPORTED_MODULE_2__["default"](this);});
17169
17170/***/ }),
17171
17172/***/ "./src/js/magnetic.js":
17173/*!****************************!*\
17174  !*** ./src/js/magnetic.js ***!
17175  \****************************/
17176/*! exports provided: default */
17177/***/ (function(module, __webpack_exports__, __webpack_require__) {
17178
17179"use strict";
17180__webpack_require__.r(__webpack_exports__);
17181/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Magnetic; });
17182/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js");
17183/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);
17184/* harmony import */ var gsap__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! gsap */ "./node_modules/gsap/index.js");
17185function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function");}}function _defineProperties(target,props){for(var i=0;i<props.length;i++){var descriptor=props[i];descriptor.enumerable=descriptor.enumerable||false;descriptor.configurable=true;if("value"in descriptor)descriptor.writable=true;Object.defineProperty(target,descriptor.key,descriptor);}}function _createClass(Constructor,protoProps,staticProps){if(protoProps)_defineProperties(Constructor.prototype,protoProps);if(staticProps)_defineProperties(Constructor,staticProps);return Constructor;}/*** IMPORTS FROM imports-loader ***/var define=false;var Magnetic=/*#__PURE__*/function(){function Magnetic(el){var options=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};_classCallCheck(this,Magnetic);this.el=jquery__WEBPACK_IMPORTED_MODULE_0___default()(el);this.options=jquery__WEBPACK_IMPORTED_MODULE_0___default.a.extend(true,{y:0.2,x:0.2,s:0.2,rs:0.7},this.el.data('magnetic')||options);this.y=0;this.x=0;this.width=0;this.height=0;if(this.el.data('magnetic-init'))return;this.el.data('magnetic-init',true);this.bind();}_createClass(Magnetic,[{key:"bind",value:function bind(){var _this=this;this.el.on('mouseenter',function(){_this.y=_this.el.offset().top-window.pageYOffset;_this.x=_this.el.offset().left-window.pageXOffset;_this.width=_this.el.outerWidth();_this.height=_this.el.outerHeight();});this.el.on('mousemove',function(e){var y=(e.clientY-_this.y-_this.height/2)*_this.options.y;var x=(e.clientX-_this.x-_this.width/2)*_this.options.x;_this.move(x,y,_this.options.s);});this.el.on('mouseleave',function(e){_this.move(0,0,_this.options.rs);});}},{key:"move",value:function move(x,y,speed){gsap__WEBPACK_IMPORTED_MODULE_1__["default"].to(this.el,{y:y,x:x,force3D:true,overwrite:true,duration:speed});}}]);return Magnetic;}();
17186
17187/***/ })
17187
17188
17189/******/ });
17190//# sourceMappingURL=bundle.js.map
17191$(function(){
17192    if (typeof(EC_SHOP_MULTISHOP_SHIPPING) != "undefined") {
17193        var sShippingCountryCode4Cookie = 'shippingCountryCode';
17194        var bShippingCountryProc = false;
17195
17196        // 배송국가 선택 설정이 사용안함이면 숨김
17197        if (EC_SHOP_MULTISHOP_SHIPPING.bMultishopShippingCountrySelection === false) {
17198            $('.xans-layout-multishopshipping .xans-layout-multishopshippingcountrylist').hide();
17199            $('.xans-layout-multishoplist .xans-layout-multishoplistmultioption .xans-layout-multishoplistmultioptioncountry').hide();
17200        } else {
17201            $('.thumb .xans-layout-multishoplistitem').hide();
17202            var aShippingCountryCode = document.cookie.match('(^|;) ?'+sShippingCountryCode4Cookie+'=([^;]*)(;|$)');
17203            if (typeof(aShippingCountryCode) != 'undefined' && aShippingCountryCode != null && aShippingCountryCode.length > 2) {
17204                var sShippingCountryValue = aShippingCountryCode[2];
17205            }
17206
17207            // query string으로 넘어 온 배송국가 값이 있다면, 그 값을 적용함
17208            var aHrefCountryValue = decodeURIComponent(location.href).split("/?country=");
17209
17210            if (aHrefCountryValue.length == 2) {
17211                var sShippingCountryValue = aHrefCountryValue[1];
17212            }
17213
17214            // 메인 페이지에서 국가선택을 안한 경우, 그 외의 페이지에서 셋팅된 값이 안 나오는 현상 처리
17215            if (location.href.split("/").length != 4 && $(".xans-layout-multishopshipping .xans-layout-multishopshippingcountrylist").val()) {
17216                $(".xans-layout-multishoplist .xans-layout-multishoplistmultioption a .ship span").text(" : "+$(".xans-layout-multishopshipping .xans-layout-multishopshippingcountrylist option:selected").text().split("SHIPPING TO : ").join(""));
17217
17218                if ($("#f_country").length > 0 && location.href.indexOf("orderform.html") > -1) {
17219                    $("#f_country").val($(".xans-layout-multishopshipping .xans-layout-multishopshippingcountrylist").val());
17220                }
17221            }
17222            if (typeof(sShippingCountryValue) != "undefined" && sShippingCountryValue != "" && sShippingCountryValue != null) {
17223                sShippingCountryValue = sShippingCountryValue.split("#")[0];
17224                var bShippingCountryProc = true;
17225
17226                $(".xans-layout-multishopshipping .xans-layout-multishopshippingcountrylist").val(sShippingCountryValue);
17227                $(".xans-layout-multishoplist .xans-layout-multishoplistmultioption a .ship span").text(" : "+$(".xans-layout-multishopshipping .xans-layout-multishopshippingcountrylist option:selected").text().split("SHIPPING TO : ").join(""));
17228                var expires = new Date();
17229                expires.setTime(expires.getTime() + (30 * 24 * 60 * 60 * 1000)); // 30일간 쿠키 유지
17230                document.cookie = sShippingCountryCode4Cookie+'=' + $(".xans-layout-multishopshipping .xans-layout-multishopshippingcountrylist").val() +';path=/'+ ';expires=' + expires.toUTCString();
17231                if ($("#f_country").length > 0 && location.href.indexOf("orderform.html") > -1) {
17232                    $("#f_country").val(sShippingCountryValue).change();
17233                }
17234            }
17235        }
17236        // 언어선택 설정이 사용안함이면 숨김
17237        if (EC_SHOP_MULTISHOP_SHIPPING.bMultishopShippingLanguageSelection === false) {
17238            $('.xans-layout-multishopshipping .xans-layout-multishopshippinglanguagelist').hide();
17239            $('.xans-layout-multishoplist .xans-layout-multishoplistmultioption .xans-layout-multishoplistmultioptionlanguage').hide();
17240        } else {
17241            $('.thumb .xans-layout-multishoplistitem').hide();
17242        }
17243
17244        // 배송국가 및 언어 설정이 둘 다 사용안함이면 숨김
17245        if (EC_SHOP_MULTISHOP_SHIPPING.bMultishopShipping === false) {
17246            $(".xans-layout-multishopshipping").hide();
17247            $('.xans-layout-multishoplist .xans-layout-multishoplistmultioption').hide();
17248        } else if (bShippingCountryProc === false && location.href.split("/").length == 4) { // 배송국가 값
17248을 처리한 적이 없고, 메인화면일 때만 선택 레이어를 띄움
17249            var sShippingCountryValue = $(".xans-layout-multishopshipping .xans-layout-multishopshippingcountrylist").val();
17250            $(".xans-layout-multishopshipping .xans-layout-multishopshippingcountrylist").val(sShippingCountryValue);
17251            $(".xans-layout-multishoplist .xans-layout-multishoplistmultioption a .ship span").text(" : "+$(".xans-layout-multishopshipping .xans-layout-multishopshippingcountrylist option:selected").text().split("SHIPPING TO : ").join(""));
17252            // 배송국가 선택을 사용해야 레이어를 보이게 함
17253            if (EC_SHOP_MULTISHOP_SHIPPING.bMultishopShippingCountrySelection === true) {
17254                $(".xans-layout-multishopshipping").show();
17255            }
17256        }
17257
17258        $(".xans-layout-multishopshipping .close").on("click", function() {
17259            $(".xans-layout-multishopshipping").hide();
17260        });
17261
17262        $(".xans-layout-multishopshipping .ec-base-button a").on("click", function() {
17263            var expires = new Date();
17264            expires.setTime(expires.getTime() + (30 * 24 * 60 * 60 * 1000)); // 30일간 쿠키 유지
17265            document.cookie = sShippingCountryCode4Cookie+'=' + $(".xans-layout-multishopshipping .xans-layout-multishopshippingcountrylist").val() +';path=/'+ ';expires=' + expires.toUTCString();
17266
17267            // 도메인 문제로 쿠키로 배송국가 설정이 안 되는 경우를 위해 query string으로 배송국가 값을 넘김
17268            var sQuerySting = (EC_SHOP_MULTISHOP_SHIPPING.bMultishopShippingCountrySelection === false) ? "" : "/?country="+encodeURIComponent($(".xans-layout-multishopshipping .xans-layout-multishopshippingcountrylist").val());
17269
17270            location.href = '//'+$(".xans-layout-multishopshipping .xans-layout-multishopshippinglanguagelist").val()+sQuerySting;
17271        });
17272        $(".xans-layout-multishoplist .xans-layout-multishoplistmultioption a").on("click", function() {
17273            $(".xans-layout-multishopshipping").show();
17274        });
17275    }
17276});

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.