ARVE Advanced Responsive Video Embedder (YouTube, Vimeo, HTML5 Video …) - Version 9.2.0

Version Description

Download this release

Release Info

Developer nico23
Plugin Icon 128x128 ARVE Advanced Responsive Video Embedder (YouTube, Vimeo, HTML5 Video …)
Version 9.2.0
Comparing to
See all releases

Code changes from version 9.1.3 to 9.2.0

Files changed (42) hide show
  1. advanced-responsive-video-embedder.php +6 -28
  2. build/common/settings.asset.php +1 -1
  3. build/common/settings.css +1 -1
  4. build/common/settings.js +1 -1
  5. build/main.asset.php +1 -1
  6. build/main.js +1 -1
  7. changelog.md +1201 -0
  8. php/Admin/functions-admin.php +47 -44
  9. php/Admin/functions-settings-page.php +12 -68
  10. php/Admin/partials/debug-info.php +0 -18
  11. php/Admin/partials/pro-ad.html +7 -4
  12. php/Admin/partials/pro-ad.md +0 -11
  13. php/Admin/partials/settings-sidebar-amp.html +2 -4
  14. php/Admin/partials/settings-sidebar-pro.html +27 -28
  15. php/Admin/partials/settings-sidebar-pro.md +0 -33
  16. php/Admin/partials/settings-sidebar-random-video.html +10 -9
  17. php/Admin/partials/settings-sidebar-rate.html +4 -6
  18. php/Common/Admin/functions-debug.php +56 -0
  19. php/Common/Admin/functions-settings.php +9 -11
  20. php/Common/Admin/partials/debug-info.php +21 -0
  21. php/Common/Settings.php +175 -60
  22. php/Common/functions-assets.php +27 -16
  23. php/Common/functions-compat.php +30 -0
  24. php/Common/functions-deprecated.php +14 -0
  25. php/Common/functions-license.php +21 -0
  26. php/Common/functions-misc.php +6 -6
  27. php/Common/functions-settings.php +19 -7
  28. php/Common/functions-string.php +36 -27
  29. php/Common/init.php +4 -0
  30. php/EmbedChecker.php +2 -2
  31. php/ShortcodeArgs.php +427 -0
  32. php/functions-assets.php +2 -2
  33. php/functions-host-properties.php +5 -5
  34. php/functions-html-output.php +3 -1
  35. php/functions-misc.php +29 -36
  36. php/functions-oembed.php +8 -8
  37. php/functions-settings.php +204 -146
  38. php/functions-shortcode-filters.php +103 -501
  39. php/functions-shortcodes.php +46 -28
  40. php/functions-url-handlers.php +0 -2
  41. php/functions-validation.php +1 -105
  42. readme.txt +171 -148
advanced-responsive-video-embedder.php CHANGED
@@ -3,7 +3,7 @@
3
  * Plugin Name: ARVE Advanced Responsive Video Embedder
4
  * Plugin URI: https://nextgenthemes.com/plugins/arve-pro/
5
  * Description: Easy responsive video embeds via URL (like WordPress) or Shortcodes. Supports almost anything you can imagine.
6
- * Version: 9.1.3
7
  * Author: Nicolas Jonas
8
  * Author URI: https://nextgenthemes.com
9
  * License: GPL-3.0
@@ -21,17 +21,17 @@
21
 
22
  namespace Nextgenthemes\ARVE;
23
 
24
- const VERSION = '9.1.3';
25
- const PRO_VERSION_REQUIRED = '5.0.0-beta5';
26
  const NUM_TRACKS = 3;
27
  const PLUGIN_FILE = __FILE__;
28
  const PLUGIN_DIR = __DIR__;
29
  const VIDEO_FILE_EXTENSIONS = [ 'av1mp4', 'mp4', 'm4v', 'webm', 'ogv' ];
30
  const DEFAULT_MAXWIDTH = 900;
31
 
32
- init();
33
 
34
- function init() {
35
 
36
  add_option( 'arve_install_date', time() );
37
 
@@ -42,6 +42,7 @@ function init() {
42
 
43
  require_once PLUGIN_DIR . '/php/Common/init.php';
44
  require_once PLUGIN_DIR . '/php/EmbedChecker.php';
 
45
  require_once PLUGIN_DIR . '/php/functions-deprecated.php';
46
  require_once PLUGIN_DIR . '/php/functions-assets.php';
47
  require_once PLUGIN_DIR . '/php/functions-html-output.php';
@@ -72,30 +73,7 @@ function init() {
72
  add_filter( 'oembed_ttl', __NAMESPACE__ . '\trigger_cache_rebuild', 10, 4 );
73
  add_filter( 'embed_oembed_discover', __NAMESPACE__ . '\reenable_oembed_cache' );
74
 
75
- foreach ( [
76
- 'missing_attribute_check' => -100,
77
- 'validate' => -99,
78
- 'detect_html5' => -35,
79
- 'detect_provider_and_id_from_url' => -30,
80
- 'aspect_ratio' => -10,
81
- 'thumbnail' => 10,
82
- 'video' => 10,
83
- 'liveleak_id_fix' => 10,
84
- 'maxwidth' => 10,
85
- 'dimensions' => 12,
86
- 'mode' => 14,
87
- 'autoplay' => 15,
88
- 'iframe_src' => 20,
89
- // Maybe validate_again ?
90
- 'set_uid' => 90,
91
- ] as $filter => $priority ) {
92
- add_filter( 'shortcode_atts_arve', __NAMESPACE__ . "\\sc_filter_{$filter}", $priority );
93
- };
94
- unset( $filter );
95
- unset( $priority );
96
-
97
  // Admin Hooks
98
- add_action( 'nextgenthemes/arve/admin/settings_header', __NAMESPACE__ . '\Admin\settings_header' );
99
  add_action( 'nextgenthemes/arve/admin/settings_sidebar', __NAMESPACE__ . '\Admin\settings_sidebar' );
100
 
101
  add_action( 'admin_bar_menu', __NAMESPACE__ . '\Admin\action_admin_bar_menu', 100 );
3
  * Plugin Name: ARVE Advanced Responsive Video Embedder
4
  * Plugin URI: https://nextgenthemes.com/plugins/arve-pro/
5
  * Description: Easy responsive video embeds via URL (like WordPress) or Shortcodes. Supports almost anything you can imagine.
6
+ * Version: 9.2.0
7
  * Author: Nicolas Jonas
8
  * Author URI: https://nextgenthemes.com
9
  * License: GPL-3.0
21
 
22
  namespace Nextgenthemes\ARVE;
23
 
24
+ const VERSION = '9.2.0';
25
+ const PRO_VERSION_REQUIRED = '5.1.5';
26
  const NUM_TRACKS = 3;
27
  const PLUGIN_FILE = __FILE__;
28
  const PLUGIN_DIR = __DIR__;
29
  const VIDEO_FILE_EXTENSIONS = [ 'av1mp4', 'mp4', 'm4v', 'webm', 'ogv' ];
30
  const DEFAULT_MAXWIDTH = 900;
31
 
32
+ init_920();
33
 
34
+ function init_920() {
35
 
36
  add_option( 'arve_install_date', time() );
37
 
42
 
43
  require_once PLUGIN_DIR . '/php/Common/init.php';
44
  require_once PLUGIN_DIR . '/php/EmbedChecker.php';
45
+ require_once PLUGIN_DIR . '/php/ShortcodeArgs.php';
46
  require_once PLUGIN_DIR . '/php/functions-deprecated.php';
47
  require_once PLUGIN_DIR . '/php/functions-assets.php';
48
  require_once PLUGIN_DIR . '/php/functions-html-output.php';
73
  add_filter( 'oembed_ttl', __NAMESPACE__ . '\trigger_cache_rebuild', 10, 4 );
74
  add_filter( 'embed_oembed_discover', __NAMESPACE__ . '\reenable_oembed_cache' );
75
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
76
  // Admin Hooks
 
77
  add_action( 'nextgenthemes/arve/admin/settings_sidebar', __NAMESPACE__ . '\Admin\settings_sidebar' );
78
 
79
  add_action( 'admin_bar_menu', __NAMESPACE__ . '\Admin\action_admin_bar_menu', 100 );
build/common/settings.asset.php CHANGED
@@ -1 +1 @@
1
- <?php return array('dependencies' => array('wp-polyfill'), 'version' => 'fcff83a3c51f5fa82f303a3a53d1fe9e');
1
+ <?php return array('dependencies' => array('wp-polyfill'), 'version' => 'efb1c945ba2b23ad5d22c0a781fa80c7');
build/common/settings.css CHANGED
@@ -1 +1 @@
1
- .wrap--nextgenthemes{max-width:1100px;margin-right:auto;margin-left:auto}.wp-core-ui .button-primary--ngt-small{height:18px;padding-right:5px;padding-left:5px;line-height:12px}.nextgenthemes-label-text{display:block;margin-bottom:3px;font-weight:600}[type=checkbox]+.nextgenthemes-label-text{display:inline}.wrap--nextgenthemes__loading-indicator{width:16px;height:16px}.ngt-settings-grid{display:-ms-grid;display:grid;grid-column-gap:1rem;grid-template-areas:"content" "sidebar"}@media(min-width: 750px){.ngt-settings-grid{grid-column-gap:2rem;grid-template-areas:"content sidebar";-ms-grid-columns:1fr 2rem 300px;grid-template-columns:1fr 300px}}@media(min-width: 1200px){.ngt-settings-grid{grid-column-gap:3rem;-ms-grid-columns:1fr 420px;grid-template-columns:1fr 420px}}.ngt-settings-grid__content{-ms-grid-row:1;-ms-grid-column:1;grid-area:content}.ngt-settings-grid__sidebar{-ms-grid-row:2;-ms-grid-column:1;grid-area:sidebar}@media (min-width: 750px){.ngt-settings-grid__content{-ms-grid-row:1;-ms-grid-column:1}.ngt-settings-grid__sidebar{-ms-grid-row:1;-ms-grid-column:3}}.ngt-sidebar-box{background:#fff;border-left:4px solid #46b450;box-shadow:0 1px 1px 0 rgba(0,0,0,.1);margin-bottom:1rem;padding:1rem}.ngt-sidebar-box h3:first-child{margin-top:0}.ngt-sidebar-box ul{list-style:square;padding-left:1em}.ngt-sidebar-box li{padding-left:.7em;margin-bottom:1em}@media(min-width: 1200px){.ngt-sidebar-box{padding:3rem}}
1
+ .wrap--nextgenthemes{max-width:1100px;margin-right:auto;margin-left:auto}.wrap--nextgenthemes .nav-tab{cursor:pointer}.wrap--nextgenthemes .nav-tab:not(.nav-tab--ngt-highlight){font-weight:400}.wrap--nextgenthemes a{text-decoration:none}.wp-core-ui .button-primary--ngt-small{height:18px;padding-right:5px;padding-left:5px;line-height:12px}.nextgenthemes-label-text{display:block;margin-bottom:3px;font-weight:600}.nextgenthemes-label-text span{opacity:.5}[type=checkbox]+.nextgenthemes-label-text{display:inline}.wrap--nextgenthemes__loading-indicator{width:16px;height:16px}.ngt-settings-grid{display:-ms-grid;display:grid;grid-column-gap:1rem;grid-template-areas:"content" "sidebar"}@media(min-width: 750px){.ngt-settings-grid{grid-column-gap:2rem;grid-template-areas:"content sidebar";-ms-grid-columns:1fr 2rem 300px;grid-template-columns:1fr 300px}}@media(min-width: 1200px){.ngt-settings-grid{grid-column-gap:3rem;-ms-grid-columns:1fr 420px;grid-template-columns:1fr 420px}}.ngt-settings-grid__content{-ms-grid-row:1;-ms-grid-column:1;grid-area:content}.ngt-settings-grid__sidebar{-ms-grid-row:2;-ms-grid-column:1;grid-area:sidebar}@media (min-width: 750px){.ngt-settings-grid__content{-ms-grid-row:1;-ms-grid-column:1}.ngt-settings-grid__sidebar{-ms-grid-row:1;-ms-grid-column:3}}.ngt-sidebar-box{padding:1rem;margin-top:1rem;margin-bottom:1rem;background:#fff;border-left:4px solid #46b450;box-shadow:0 1px 1px 0 rgba(0,0,0,.1)}.ngt-sidebar-box h3:first-child{margin-top:0}.ngt-sidebar-box ul{padding-left:1em;list-style:square}.ngt-sidebar-box li{padding-left:.7em;margin-bottom:1em}@media(min-width: 1200px){.ngt-sidebar-box{padding:3rem}}
build/common/settings.js CHANGED
@@ -1 +1 @@
1
- !function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=13)}([,,,,function(e,t){var n;n=function(){return this}();try{n=n||new Function("return this")()}catch(e){"object"==typeof window&&(n=window)}e.exports=n},,function(e,t,n){(function(t,n){var r;r=function(){"use strict";var e=Object.freeze({});function r(e){return null==e}function o(e){return null!=e}function i(e){return!0===e}function a(e){return"string"==typeof e||"number"==typeof e||"symbol"==typeof e||"boolean"==typeof e}function s(e){return null!==e&&"object"==typeof e}var c=Object.prototype.toString;function l(e){return c.call(e).slice(8,-1)}function u(e){return"[object Object]"===c.call(e)}function f(e){return"[object RegExp]"===c.call(e)}function d(e){var t=parseFloat(String(e));return t>=0&&Math.floor(t)===t&&isFinite(e)}function p(e){return o(e)&&"function"==typeof e.then&&"function"==typeof e.catch}function v(e){return null==e?"":Array.isArray(e)||u(e)&&e.toString===c?JSON.stringify(e,null,2):String(e)}function h(e){var t=parseFloat(e);return isNaN(t)?e:t}function m(e,t){for(var n=Object.create(null),r=e.split(","),o=0;o<r.length;o++)n[r[o]]=!0;return t?function(e){return n[e.toLowerCase()]}:function(e){return n[e]}}var g=m("slot,component",!0),y=m("key,ref,slot,slot-scope,is");function b(e,t){if(e.length){var n=e.indexOf(t);if(n>-1)return e.splice(n,1)}}var _=Object.prototype.hasOwnProperty;function w(e,t){return _.call(e,t)}function $(e){var t=Object.create(null);return function(n){return t[n]||(t[n]=e(n))}}var x=/-(\w)/g,A=$((function(e){return e.replace(x,(function(e,t){return t?t.toUpperCase():""}))})),k=$((function(e){return e.charAt(0).toUpperCase()+e.slice(1)})),C=/\B([A-Z])/g,S=$((function(e){return e.replace(C,"-$1").toLowerCase()})),O=Function.prototype.bind?function(e,t){return e.bind(t)}:function(e,t){function n(n){var r=arguments.length;return r?r>1?e.apply(t,arguments):e.call(t,n):e.call(t)}return n._length=e.length,n};function T(e,t){t=t||0;for(var n=e.length-t,r=new Array(n);n--;)r[n]=e[n+t];return r}function M(e,t){for(var n in t)e[n]=t[n];return e}function j(e){for(var t={},n=0;n<e.length;n++)e[n]&&M(t,e[n]);return t}function I(e,t,n){}var E=function(e,t,n){return!1},N=function(e){return e};function D(e,t){if(e===t)return!0;var n=s(e),r=s(t);if(!n||!r)return!n&&!r&&String(e)===String(t);try{var o=Array.isArray(e),i=Array.isArray(t);if(o&&i)return e.length===t.length&&e.every((function(e,n){return D(e,t[n])}));if(e instanceof Date&&t instanceof Date)return e.getTime()===t.getTime();if(o||i)return!1;var a=Object.keys(e),c=Object.keys(t);return a.length===c.length&&a.every((function(n){return D(e[n],t[n])}))}catch(e){return!1}}function L(e,t){for(var n=0;n<e.length;n++)if(D(e[n],t))return n;return-1}function P(e){var t=!1;return function(){t||(t=!0,e.apply(this,arguments))}}var F=["component","directive","filter"],R=["beforeCreate","created","beforeMount","mounted","beforeUpdate","updated","beforeDestroy","destroyed","activated","deactivated","errorCaptured","serverPrefetch"],H={optionMergeStrategies:Object.create(null),silent:!1,productionTip:!0,devtools:!0,performance:!1,errorHandler:null,warnHandler:null,ignoredElements:[],keyCodes:Object.create(null),isReservedTag:E,isReservedAttr:E,isUnknownElement:E,getTagNamespace:I,parsePlatformTagName:N,mustUseProp:E,async:!0,_lifecycleHooks:R},U=/a-zA-Z\u00B7\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u037D\u037F-\u1FFF\u200C-\u200D\u203F-\u2040\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD/;function V(e){var t=(e+"").charCodeAt(0);return 36===t||95===t}function B(e,t,n,r){Object.defineProperty(e,t,{value:n,enumerable:!!r,writable:!0,configurable:!0})}var z,q=new RegExp("[^"+U.source+".$_\\d]"),J="__proto__"in{},K="undefined"!=typeof window,W="undefined"!=typeof WXEnvironment&&!!WXEnvironment.platform,Z=W&&WXEnvironment.platform.toLowerCase(),G=K&&window.navigator.userAgent.toLowerCase(),Y=G&&/msie|trident/.test(G),X=G&&G.indexOf("msie 9.0")>0,Q=G&&G.indexOf("edge/")>0,ee=(G&&G.indexOf("android"),G&&/iphone|ipad|ipod|ios/.test(G)||"ios"===Z),te=(G&&/chrome\/\d+/.test(G),G&&/phantomjs/.test(G),G&&G.match(/firefox\/(\d+)/)),ne={}.watch,re=!1;if(K)try{var oe={};Object.defineProperty(oe,"passive",{get:function(){re=!0}}),window.addEventListener("test-passive",null,oe)}catch(e){}var ie=function(){return void 0===z&&(z=!K&&!W&&void 0!==t&&t.process&&"server"===t.process.env.VUE_ENV),z},ae=K&&window.__VUE_DEVTOOLS_GLOBAL_HOOK__;function se(e){return"function"==typeof e&&/native code/.test(e.toString())}var ce,le="undefined"!=typeof Symbol&&se(Symbol)&&"undefined"!=typeof Reflect&&se(Reflect.ownKeys);ce="undefined"!=typeof Set&&se(Set)?Set:function(){function e(){this.set=Object.create(null)}return e.prototype.has=function(e){return!0===this.set[e]},e.prototype.add=function(e){this.set[e]=!0},e.prototype.clear=function(){this.set=Object.create(null)},e}();var ue,fe,de,pe=I,ve="undefined"!=typeof console,he=/(?:^|[-_])(\w)/g;ue=function(e,t){var n=t?pe(t):"";H.warnHandler?H.warnHandler.call(null,e,t,n):ve&&!H.silent&&console.error("[Vue warn]: "+e+n)},fe=function(e,t){ve&&!H.silent&&console.warn("[Vue tip]: "+e+(t?pe(t):""))},de=function(e,t){if(e.$root===e)return"<Root>";var n="function"==typeof e&&null!=e.cid?e.options:e._isVue?e.$options||e.constructor.options:e,r=n.name||n._componentTag,o=n.__file;if(!r&&o){var i=o.match(/([^/\\]+)\.vue$/);r=i&&i[1]}return(r?"<"+function(e){return e.replace(he,(function(e){return e.toUpperCase()})).replace(/[-_]/g,"")}(r)+">":"<Anonymous>")+(o&&!1!==t?" at "+o:"")},pe=function(e){if(e._isVue&&e.$parent){for(var t=[],n=0;e;){if(t.length>0){var r=t[t.length-1];if(r.constructor===e.constructor){n++,e=e.$parent;continue}n>0&&(t[t.length-1]=[r,n],n=0)}t.push(e),e=e.$parent}return"\n\nfound in\n\n"+t.map((function(e,t){return""+(0===t?"---\x3e ":function(e,t){for(var n="";t;)t%2==1&&(n+=e),t>1&&(e+=e),t>>=1;return n}(" ",5+2*t))+(Array.isArray(e)?de(e[0])+"... ("+e[1]+" recursive calls)":de(e))})).join("\n")}return"\n\n(found in "+de(e)+")"};var me=0,ge=function(){this.id=me++,this.subs=[]};ge.prototype.addSub=function(e){this.subs.push(e)},ge.prototype.removeSub=function(e){b(this.subs,e)},ge.prototype.depend=function(){ge.target&&ge.target.addDep(this)},ge.prototype.notify=function(){var e=this.subs.slice();H.async||e.sort((function(e,t){return e.id-t.id}));for(var t=0,n=e.length;t<n;t++)e[t].update()},ge.target=null;var ye=[];function be(e){ye.push(e),ge.target=e}function _e(){ye.pop(),ge.target=ye[ye.length-1]}var we=function(e,t,n,r,o,i,a,s){this.tag=e,this.data=t,this.children=n,this.text=r,this.elm=o,this.ns=void 0,this.context=i,this.fnContext=void 0,this.fnOptions=void 0,this.fnScopeId=void 0,this.key=t&&t.key,this.componentOptions=a,this.componentInstance=void 0,this.parent=void 0,this.raw=!1,this.isStatic=!1,this.isRootInsert=!0,this.isComment=!1,this.isCloned=!1,this.isOnce=!1,this.asyncFactory=s,this.asyncMeta=void 0,this.isAsyncPlaceholder=!1},$e={child:{configurable:!0}};$e.child.get=function(){return this.componentInstance},Object.defineProperties(we.prototype,$e);var xe=function(e){void 0===e&&(e="");var t=new we;return t.text=e,t.isComment=!0,t};function Ae(e){return new we(void 0,void 0,void 0,String(e))}function ke(e){var t=new we(e.tag,e.data,e.children&&e.children.slice(),e.text,e.elm,e.context,e.componentOptions,e.asyncFactory);return t.ns=e.ns,t.isStatic=e.isStatic,t.key=e.key,t.isComment=e.isComment,t.fnContext=e.fnContext,t.fnOptions=e.fnOptions,t.fnScopeId=e.fnScopeId,t.asyncMeta=e.asyncMeta,t.isCloned=!0,t}var Ce=Array.prototype,Se=Object.create(Ce);["push","pop","shift","unshift","splice","sort","reverse"].forEach((function(e){var t=Ce[e];B(Se,e,(function(){for(var n=[],r=arguments.length;r--;)n[r]=arguments[r];var o,i=t.apply(this,n),a=this.__ob__;switch(e){case"push":case"unshift":o=n;break;case"splice":o=n.slice(2)}return o&&a.observeArray(o),a.dep.notify(),i}))}));var Oe=Object.getOwnPropertyNames(Se),Te=!0;function Me(e){Te=e}var je=function(e){this.value=e,this.dep=new ge,this.vmCount=0,B(e,"__ob__",this),Array.isArray(e)?(J?function(e,t){e.__proto__=t}(e,Se):function(e,t,n){for(var r=0,o=n.length;r<o;r++){var i=n[r];B(e,i,t[i])}}(e,Se,Oe),this.observeArray(e)):this.walk(e)};function Ie(e,t){var n;if(s(e)&&!(e instanceof we))return w(e,"__ob__")&&e.__ob__ instanceof je?n=e.__ob__:Te&&!ie()&&(Array.isArray(e)||u(e))&&Object.isExtensible(e)&&!e._isVue&&(n=new je(e)),t&&n&&n.vmCount++,n}function Ee(e,t,n,r,o){var i=new ge,a=Object.getOwnPropertyDescriptor(e,t);if(!a||!1!==a.configurable){var s=a&&a.get,c=a&&a.set;s&&!c||2!==arguments.length||(n=e[t]);var l=!o&&Ie(n);Object.defineProperty(e,t,{enumerable:!0,configurable:!0,get:function(){var t=s?s.call(e):n;return ge.target&&(i.depend(),l&&(l.dep.depend(),Array.isArray(t)&&Le(t))),t},set:function(t){var a=s?s.call(e):n;t===a||t!=t&&a!=a||(r&&r(),s&&!c||(c?c.call(e,t):n=t,l=!o&&Ie(t),i.notify()))}})}}function Ne(e,t,n){if((r(e)||a(e))&&ue("Cannot set reactive property on undefined, null, or primitive value: "+e),Array.isArray(e)&&d(t))return e.length=Math.max(e.length,t),e.splice(t,1,n),n;if(t in e&&!(t in Object.prototype))return e[t]=n,n;var o=e.__ob__;return e._isVue||o&&o.vmCount?(ue("Avoid adding reactive properties to a Vue instance or its root $data at runtime - declare it upfront in the data option."),n):o?(Ee(o.value,t,n),o.dep.notify(),n):(e[t]=n,n)}function De(e,t){if((r(e)||a(e))&&ue("Cannot delete reactive property on undefined, null, or primitive value: "+e),Array.isArray(e)&&d(t))e.splice(t,1);else{var n=e.__ob__;e._isVue||n&&n.vmCount?ue("Avoid deleting properties on a Vue instance or its root $data - just set it to null."):w(e,t)&&(delete e[t],n&&n.dep.notify())}}function Le(e){for(var t=void 0,n=0,r=e.length;n<r;n++)(t=e[n])&&t.__ob__&&t.__ob__.dep.depend(),Array.isArray(t)&&Le(t)}je.prototype.walk=function(e){for(var t=Object.keys(e),n=0;n<t.length;n++)Ee(e,t[n])},je.prototype.observeArray=function(e){for(var t=0,n=e.length;t<n;t++)Ie(e[t])};var Pe=H.optionMergeStrategies;function Fe(e,t){if(!t)return e;for(var n,r,o,i=le?Reflect.ownKeys(t):Object.keys(t),a=0;a<i.length;a++)"__ob__"!==(n=i[a])&&(r=e[n],o=t[n],w(e,n)?r!==o&&u(r)&&u(o)&&Fe(r,o):Ne(e,n,o));return e}function Re(e,t,n){return n?function(){var r="function"==typeof t?t.call(n,n):t,o="function"==typeof e?e.call(n,n):e;return r?Fe(r,o):o}:t?e?function(){return Fe("function"==typeof t?t.call(this,this):t,"function"==typeof e?e.call(this,this):e)}:t:e}function He(e,t){var n=t?e?e.concat(t):Array.isArray(t)?t:[t]:e;return n?function(e){for(var t=[],n=0;n<e.length;n++)-1===t.indexOf(e[n])&&t.push(e[n]);return t}(n):n}function Ue(e,t,n,r){var o=Object.create(e||null);return t?(ze(r,t,n),M(o,t)):o}Pe.el=Pe.propsData=function(e,t,n,r){return n||ue('option "'+r+'" can only be used during instance creation with the `new` keyword.'),Ve(e,t)},Pe.data=function(e,t,n){return n?Re(e,t,n):t&&"function"!=typeof t?(ue('The "data" option should be a function that returns a per-instance value in component definitions.',n),e):Re(e,t)},R.forEach((function(e){Pe[e]=He})),F.forEach((function(e){Pe[e+"s"]=Ue})),Pe.watch=function(e,t,n,r){if(e===ne&&(e=void 0),t===ne&&(t=void 0),!t)return Object.create(e||null);if(ze(r,t,n),!e)return t;var o={};for(var i in M(o,e),t){var a=o[i],s=t[i];a&&!Array.isArray(a)&&(a=[a]),o[i]=a?a.concat(s):Array.isArray(s)?s:[s]}return o},Pe.props=Pe.methods=Pe.inject=Pe.computed=function(e,t,n,r){if(t&&ze(r,t,n),!e)return t;var o=Object.create(null);return M(o,e),t&&M(o,t),o},Pe.provide=Re;var Ve=function(e,t){return void 0===t?e:t};function Be(e){new RegExp("^[a-zA-Z][\\-\\.0-9_"+U.source+"]*$").test(e)||ue('Invalid component name: "'+e+'". Component names should conform to valid custom element name in html5 specification.'),(g(e)||H.isReservedTag(e))&&ue("Do not use built-in or reserved HTML elements as component id: "+e)}function ze(e,t,n){u(t)||ue('Invalid value for option "'+e+'": expected an Object, but got '+l(t)+".",n)}function qe(e,t,n){if(function(e){for(var t in e.components)Be(t)}(t),"function"==typeof t&&(t=t.options),function(e,t){var n=e.props;if(n){var r,o,i={};if(Array.isArray(n))for(r=n.length;r--;)"string"==typeof(o=n[r])?i[A(o)]={type:null}:ue("props must be strings when using array syntax.");else if(u(n))for(var a in n)o=n[a],i[A(a)]=u(o)?o:{type:o};else ue('Invalid value for option "props": expected an Array or an Object, but got '+l(n)+".",t);e.props=i}}(t,n),function(e,t){var n=e.inject;if(n){var r=e.inject={};if(Array.isArray(n))for(var o=0;o<n.length;o++)r[n[o]]={from:n[o]};else if(u(n))for(var i in n){var a=n[i];r[i]=u(a)?M({from:i},a):{from:a}}else ue('Invalid value for option "inject": expected an Array or an Object, but got '+l(n)+".",t)}}(t,n),function(e){var t=e.directives;if(t)for(var n in t){var r=t[n];"function"==typeof r&&(t[n]={bind:r,update:r})}}(t),!t._base&&(t.extends&&(e=qe(e,t.extends,n)),t.mixins))for(var r=0,o=t.mixins.length;r<o;r++)e=qe(e,t.mixins[r],n);var i,a={};for(i in e)s(i);for(i in t)w(e,i)||s(i);function s(r){var o=Pe[r]||Ve;a[r]=o(e[r],t[r],n,r)}return a}function Je(e,t,n,r){if("string"==typeof n){var o=e[t];if(w(o,n))return o[n];var i=A(n);if(w(o,i))return o[i];var a=k(i);if(w(o,a))return o[a];var s=o[n]||o[i]||o[a];return r&&!s&&ue("Failed to resolve "+t.slice(0,-1)+": "+n,e),s}}function Ke(e,t,n,r){var o=t[e],i=!w(n,e),a=n[e],c=Xe(Boolean,o.type);if(c>-1)if(i&&!w(o,"default"))a=!1;else if(""===a||a===S(e)){var u=Xe(String,o.type);(u<0||c<u)&&(a=!0)}if(void 0===a){a=function(e,t,n){if(w(t,"default")){var r=t.default;return s(r)&&ue('Invalid default value for prop "'+n+'": Props with type Object/Array must use a factory function to return the default value.',e),e&&e.$options.propsData&&void 0===e.$options.propsData[n]&&void 0!==e._props[n]?e._props[n]:"function"==typeof r&&"Function"!==Ge(t.type)?r.call(e):r}}(r,o,e);var f=Te;Me(!0),Ie(a),Me(f)}return function(e,t,n,r,o){if(e.required&&o)ue('Missing required prop: "'+t+'"',r);else if(null!=n||e.required){var i=e.type,a=!i||!0===i,s=[];if(i){Array.isArray(i)||(i=[i]);for(var c=0;c<i.length&&!a;c++){var u=Ze(n,i[c]);s.push(u.expectedType||""),a=u.valid}}if(a){var f=e.validator;f&&(f(n)||ue('Invalid prop: custom validator check failed for prop "'+t+'".',r))}else ue(function(e,t,n){var r='Invalid prop: type check failed for prop "'+e+'". Expected '+n.map(k).join(", "),o=n[0],i=l(t),a=Qe(t,o),s=Qe(t,i);return 1===n.length&&et(o)&&!function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];return e.some((function(e){return"boolean"===e.toLowerCase()}))}(o,i)&&(r+=" with value "+a),r+=", got "+i+" ",et(i)&&(r+="with value "+s+"."),r}(t,n,s),r)}}(o,e,a,r,i),a}var We=/^(String|Number|Boolean|Function|Symbol)$/;function Ze(e,t){var n,r=Ge(t);if(We.test(r)){var o=typeof e;(n=o===r.toLowerCase())||"object"!==o||(n=e instanceof t)}else n="Object"===r?u(e):"Array"===r?Array.isArray(e):e instanceof t;return{valid:n,expectedType:r}}function Ge(e){var t=e&&e.toString().match(/^\s*function (\w+)/);return t?t[1]:""}function Ye(e,t){return Ge(e)===Ge(t)}function Xe(e,t){if(!Array.isArray(t))return Ye(t,e)?0:-1;for(var n=0,r=t.length;n<r;n++)if(Ye(t[n],e))return n;return-1}function Qe(e,t){return"String"===t?'"'+e+'"':"Number"===t?""+Number(e):""+e}function et(e){return["string","number","boolean"].some((function(t){return e.toLowerCase()===t}))}function tt(e,t,n){be();try{if(t)for(var r=t;r=r.$parent;){var o=r.$options.errorCaptured;if(o)for(var i=0;i<o.length;i++)try{if(!1===o[i].call(r,e,t,n))return}catch(e){rt(e,r,"errorCaptured hook")}}rt(e,t,n)}finally{_e()}}function nt(e,t,n,r,o){var i;try{(i=n?e.apply(t,n):e.call(t))&&!i._isVue&&p(i)&&!i._handled&&(i.catch((function(e){return tt(e,r,o+" (Promise/async)")})),i._handled=!0)}catch(e){tt(e,r,o)}return i}function rt(e,t,n){if(H.errorHandler)try{return H.errorHandler.call(null,e,t,n)}catch(t){t!==e&&ot(t,null,"config.errorHandler")}ot(e,t,n)}function ot(e,t,n){if(ue("Error in "+n+': "'+e.toString()+'"',t),!K&&!W||"undefined"==typeof console)throw e;console.error(e)}var it,at,st,ct=!1,lt=[],ut=!1;function ft(){ut=!1;var e=lt.slice(0);lt.length=0;for(var t=0;t<e.length;t++)e[t]()}if("undefined"!=typeof Promise&&se(Promise)){var dt=Promise.resolve();it=function(){dt.then(ft),ee&&setTimeout(I)},ct=!0}else if(Y||"undefined"==typeof MutationObserver||!se(MutationObserver)&&"[object MutationObserverConstructor]"!==MutationObserver.toString())it=void 0!==n&&se(n)?function(){n(ft)}:function(){setTimeout(ft,0)};else{var pt=1,vt=new MutationObserver(ft),ht=document.createTextNode(String(pt));vt.observe(ht,{characterData:!0}),it=function(){pt=(pt+1)%2,ht.data=String(pt)},ct=!0}function mt(e,t){var n;if(lt.push((function(){if(e)try{e.call(t)}catch(e){tt(e,t,"nextTick")}else n&&n(t)})),ut||(ut=!0,it()),!e&&"undefined"!=typeof Promise)return new Promise((function(e){n=e}))}var gt,yt=K&&window.performance;yt&&yt.mark&&yt.measure&&yt.clearMarks&&yt.clearMeasures&&(at=function(e){return yt.mark(e)},st=function(e,t,n){yt.measure(e,t,n),yt.clearMarks(t),yt.clearMarks(n)});var bt=m("Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,require"),_t=function(e,t){ue('Property or method "'+t+'" is not defined on the instance but referenced during render. Make sure that this property is reactive, either in the data option, or for class-based components, by initializing the property. See: https://vuejs.org/v2/guide/reactivity.html#Declaring-Reactive-Properties.',e)},wt=function(e,t){ue('Property "'+t+'" must be accessed with "$data.'+t+'" because properties starting with "$" or "_" are not proxied in the Vue instance to prevent conflicts with Vue internals. See: https://vuejs.org/v2/api/#data',e)},$t="undefined"!=typeof Proxy&&se(Proxy);if($t){var xt=m("stop,prevent,self,ctrl,shift,alt,meta,exact");H.keyCodes=new Proxy(H.keyCodes,{set:function(e,t,n){return xt(t)?(ue("Avoid overwriting built-in modifier in config.keyCodes: ."+t),!1):(e[t]=n,!0)}})}var At={has:function(e,t){var n=t in e,r=bt(t)||"string"==typeof t&&"_"===t.charAt(0)&&!(t in e.$data);return n||r||(t in e.$data?wt(e,t):_t(e,t)),n||!r}},kt={get:function(e,t){return"string"!=typeof t||t in e||(t in e.$data?wt(e,t):_t(e,t)),e[t]}};gt=function(e){if($t){var t=e.$options,n=t.render&&t.render._withStripped?kt:At;e._renderProxy=new Proxy(e,n)}else e._renderProxy=e};var Ct=new ce;function St(e){!function e(t,n){var r,o,i=Array.isArray(t);if(!(!i&&!s(t)||Object.isFrozen(t)||t instanceof we)){if(t.__ob__){var a=t.__ob__.dep.id;if(n.has(a))return;n.add(a)}if(i)for(r=t.length;r--;)e(t[r],n);else for(r=(o=Object.keys(t)).length;r--;)e(t[o[r]],n)}}(e,Ct),Ct.clear()}var Ot=$((function(e){var t="&"===e.charAt(0),n="~"===(e=t?e.slice(1):e).charAt(0),r="!"===(e=n?e.slice(1):e).charAt(0);return{name:e=r?e.slice(1):e,once:n,capture:r,passive:t}}));function Tt(e,t){function n(){var e=arguments,r=n.fns;if(!Array.isArray(r))return nt(r,null,arguments,t,"v-on handler");for(var o=r.slice(),i=0;i<o.length;i++)nt(o[i],null,e,t,"v-on handler")}return n.fns=e,n}function Mt(e,t,n,o,a,s){var c,l,u,f;for(c in e)l=e[c],u=t[c],f=Ot(c),r(l)?ue('Invalid handler for event "'+f.name+'": got '+String(l),s):r(u)?(r(l.fns)&&(l=e[c]=Tt(l,s)),i(f.once)&&(l=e[c]=a(f.name,l,f.capture)),n(f.name,l,f.capture,f.passive,f.params)):l!==u&&(u.fns=l,e[c]=u);for(c in t)r(e[c])&&o((f=Ot(c)).name,t[c],f.capture)}function jt(e,t,n){var a;e instanceof we&&(e=e.data.hook||(e.data.hook={}));var s=e[t];function c(){n.apply(this,arguments),b(a.fns,c)}r(s)?a=Tt([c]):o(s.fns)&&i(s.merged)?(a=s).fns.push(c):a=Tt([s,c]),a.merged=!0,e[t]=a}function It(e,t,n,r,i){if(o(t)){if(w(t,n))return e[n]=t[n],i||delete t[n],!0;if(w(t,r))return e[n]=t[r],i||delete t[r],!0}return!1}function Et(e){return a(e)?[Ae(e)]:Array.isArray(e)?function e(t,n){var s,c,l,u,f=[];for(s=0;s<t.length;s++)r(c=t[s])||"boolean"==typeof c||(u=f[l=f.length-1],Array.isArray(c)?c.length>0&&(Nt((c=e(c,(n||"")+"_"+s))[0])&&Nt(u)&&(f[l]=Ae(u.text+c[0].text),c.shift()),f.push.apply(f,c)):a(c)?Nt(u)?f[l]=Ae(u.text+c):""!==c&&f.push(Ae(c)):Nt(c)&&Nt(u)?f[l]=Ae(u.text+c.text):(i(t._isVList)&&o(c.tag)&&r(c.key)&&o(n)&&(c.key="__vlist"+n+"_"+s+"__"),f.push(c)));return f}(e):void 0}function Nt(e){return o(e)&&o(e.text)&&!1===e.isComment}function Dt(e,t){if(e){for(var n=Object.create(null),r=le?Reflect.ownKeys(e):Object.keys(e),o=0;o<r.length;o++){var i=r[o];if("__ob__"!==i){for(var a=e[i].from,s=t;s;){if(s._provided&&w(s._provided,a)){n[i]=s._provided[a];break}s=s.$parent}if(!s)if("default"in e[i]){var c=e[i].default;n[i]="function"==typeof c?c.call(t):c}else ue('Injection "'+i+'" not found',t)}}return n}}function Lt(e,t){if(!e||!e.length)return{};for(var n={},r=0,o=e.length;r<o;r++){var i=e[r],a=i.data;if(a&&a.attrs&&a.attrs.slot&&delete a.attrs.slot,i.context!==t&&i.fnContext!==t||!a||null==a.slot)(n.default||(n.default=[])).push(i);else{var s=a.slot,c=n[s]||(n[s]=[]);"template"===i.tag?c.push.apply(c,i.children||[]):c.push(i)}}for(var l in n)n[l].every(Pt)&&delete n[l];return n}function Pt(e){return e.isComment&&!e.asyncFactory||" "===e.text}function Ft(t,n,r){var o,i=Object.keys(n).length>0,a=t?!!t.$stable:!i,s=t&&t.$key;if(t){if(t._normalized)return t._normalized;if(a&&r&&r!==e&&s===r.$key&&!i&&!r.$hasNormal)return r;for(var c in o={},t)t[c]&&"$"!==c[0]&&(o[c]=Rt(n,c,t[c]))}else o={};for(var l in n)l in o||(o[l]=Ht(n,l));return t&&Object.isExtensible(t)&&(t._normalized=o),B(o,"$stable",a),B(o,"$key",s),B(o,"$hasNormal",i),o}function Rt(e,t,n){var r=function(){var e=arguments.length?n.apply(null,arguments):n({});return(e=e&&"object"==typeof e&&!Array.isArray(e)?[e]:Et(e))&&(0===e.length||1===e.length&&e[0].isComment)?void 0:e};return n.proxy&&Object.defineProperty(e,t,{get:r,enumerable:!0,configurable:!0}),r}function Ht(e,t){return function(){return e[t]}}function Ut(e,t){var n,r,i,a,c;if(Array.isArray(e)||"string"==typeof e)for(n=new Array(e.length),r=0,i=e.length;r<i;r++)n[r]=t(e[r],r);else if("number"==typeof e)for(n=new Array(e),r=0;r<e;r++)n[r]=t(r+1,r);else if(s(e))if(le&&e[Symbol.iterator]){n=[];for(var l=e[Symbol.iterator](),u=l.next();!u.done;)n.push(t(u.value,n.length)),u=l.next()}else for(a=Object.keys(e),n=new Array(a.length),r=0,i=a.length;r<i;r++)c=a[r],n[r]=t(e[c],c,r);return o(n)||(n=[]),n._isVList=!0,n}function Vt(e,t,n,r){var o,i=this.$scopedSlots[e];i?(n=n||{},r&&(s(r)||ue("slot v-bind without argument expects an Object",this),n=M(M({},r),n)),o=i(n)||t):o=this.$slots[e]||t;var a=n&&n.slot;return a?this.$createElement("template",{slot:a},o):o}function Bt(e){return Je(this.$options,"filters",e,!0)||N}function zt(e,t){return Array.isArray(e)?-1===e.indexOf(t):e!==t}function qt(e,t,n,r,o){var i=H.keyCodes[t]||n;return o&&r&&!H.keyCodes[t]?zt(o,r):i?zt(i,e):r?S(r)!==t:void 0}function Jt(e,t,n,r,o){if(n)if(s(n)){var i;Array.isArray(n)&&(n=j(n));var a=function(a){if("class"===a||"style"===a||y(a))i=e;else{var s=e.attrs&&e.attrs.type;i=r||H.mustUseProp(t,s,a)?e.domProps||(e.domProps={}):e.attrs||(e.attrs={})}var c=A(a),l=S(a);c in i||l in i||(i[a]=n[a],o&&((e.on||(e.on={}))["update:"+a]=function(e){n[a]=e}))};for(var c in n)a(c)}else ue("v-bind without argument expects an Object or Array value",this);return e}function Kt(e,t){var n=this._staticTrees||(this._staticTrees=[]),r=n[e];return r&&!t||Zt(r=n[e]=this.$options.staticRenderFns[e].call(this._renderProxy,null,this),"__static__"+e,!1),r}function Wt(e,t,n){return Zt(e,"__once__"+t+(n?"_"+n:""),!0),e}function Zt(e,t,n){if(Array.isArray(e))for(var r=0;r<e.length;r++)e[r]&&"string"!=typeof e[r]&&Gt(e[r],t+"_"+r,n);else Gt(e,t,n)}function Gt(e,t,n){e.isStatic=!0,e.key=t,e.isOnce=n}function Yt(e,t){if(t)if(u(t)){var n=e.on=e.on?M({},e.on):{};for(var r in t){var o=n[r],i=t[r];n[r]=o?[].concat(o,i):i}}else ue("v-on without argument expects an Object value",this);return e}function Xt(e,t,n,r){t=t||{$stable:!n};for(var o=0;o<e.length;o++){var i=e[o];Array.isArray(i)?Xt(i,t,n):i&&(i.proxy&&(i.fn.proxy=!0),t[i.key]=i.fn)}return r&&(t.$key=r),t}function Qt(e,t){for(var n=0;n<t.length;n+=2){var r=t[n];"string"==typeof r&&r?e[t[n]]=t[n+1]:""!==r&&null!==r&&ue("Invalid value for dynamic directive argument (expected string or null): "+r,this)}return e}function en(e,t){return"string"==typeof e?t+e:e}function tn(e){e._o=Wt,e._n=h,e._s=v,e._l=Ut,e._t=Vt,e._q=D,e._i=L,e._m=Kt,e._f=Bt,e._k=qt,e._b=Jt,e._v=Ae,e._e=xe,e._u=Xt,e._g=Yt,e._d=Qt,e._p=en}function nn(t,n,r,o,a){var s,c=this,l=a.options;w(o,"_uid")?(s=Object.create(o))._original=o:(s=o,o=o._original);var u=i(l._compiled),f=!u;this.data=t,this.props=n,this.children=r,this.parent=o,this.listeners=t.on||e,this.injections=Dt(l.inject,o),this.slots=function(){return c.$slots||Ft(t.scopedSlots,c.$slots=Lt(r,o)),c.$slots},Object.defineProperty(this,"scopedSlots",{enumerable:!0,get:function(){return Ft(t.scopedSlots,this.slots())}}),u&&(this.$options=l,this.$slots=this.slots(),this.$scopedSlots=Ft(t.scopedSlots,this.$slots)),l._scopeId?this._c=function(e,t,n,r){var i=un(s,e,t,n,r,f);return i&&!Array.isArray(i)&&(i.fnScopeId=l._scopeId,i.fnContext=o),i}:this._c=function(e,t,n,r){return un(s,e,t,n,r,f)}}function rn(e,t,n,r,o){var i=ke(e);return i.fnContext=n,i.fnOptions=r,(i.devtoolsMeta=i.devtoolsMeta||{}).renderContext=o,t.slot&&((i.data||(i.data={})).slot=t.slot),i}function on(e,t){for(var n in t)e[A(n)]=t[n]}tn(nn.prototype);var an={init:function(e,t){if(e.componentInstance&&!e.componentInstance._isDestroyed&&e.data.keepAlive){var n=e;an.prepatch(n,n)}else(e.componentInstance=function(e,t){var n={_isComponent:!0,_parentVnode:e,parent:t},r=e.data.inlineTemplate;return o(r)&&(n.render=r.render,n.staticRenderFns=r.staticRenderFns),new e.componentOptions.Ctor(n)}(e,_n)).$mount(t?e.elm:void 0,t)},prepatch:function(t,n){var r=n.componentOptions;!function(t,n,r,o,i){wn=!0;var a=o.data.scopedSlots,s=t.$scopedSlots,c=!!(a&&!a.$stable||s!==e&&!s.$stable||a&&t.$scopedSlots.$key!==a.$key),l=!!(i||t.$options._renderChildren||c);if(t.$options._parentVnode=o,t.$vnode=o,t._vnode&&(t._vnode.parent=o),t.$options._renderChildren=i,t.$attrs=o.data.attrs||e,t.$listeners=r||e,n&&t.$options.props){Me(!1);for(var u=t._props,f=t.$options._propKeys||[],d=0;d<f.length;d++){var p=f[d],v=t.$options.props;u[p]=Ke(p,v,n,t)}Me(!0),t.$options.propsData=n}r=r||e;var h=t.$options._parentListeners;t.$options._parentListeners=r,bn(t,r,h),l&&(t.$slots=Lt(i,o.context),t.$forceUpdate()),wn=!1}(n.componentInstance=t.componentInstance,r.propsData,r.listeners,n,r.children)},insert:function(e){var t,n=e.context,r=e.componentInstance;r._isMounted||(r._isMounted=!0,kn(r,"mounted")),e.data.keepAlive&&(n._isMounted?((t=r)._inactive=!1,Sn.push(t)):An(r,!0))},destroy:function(e){var t=e.componentInstance;t._isDestroyed||(e.data.keepAlive?function e(t,n){if(!(n&&(t._directInactive=!0,xn(t))||t._inactive)){t._inactive=!0;for(var r=0;r<t.$children.length;r++)e(t.$children[r]);kn(t,"deactivated")}}(t,!0):t.$destroy())}},sn=Object.keys(an);function cn(t,n,a,c,l){if(!r(t)){var u=a.$options._base;if(s(t)&&(t=u.extend(t)),"function"==typeof t){var f;if(r(t.cid)&&void 0===(t=function(e,t){if(i(e.error)&&o(e.errorComp))return e.errorComp;if(o(e.resolved))return e.resolved;var n=dn;if(n&&o(e.owners)&&-1===e.owners.indexOf(n)&&e.owners.push(n),i(e.loading)&&o(e.loadingComp))return e.loadingComp;if(n&&!o(e.owners)){var a=e.owners=[n],c=!0,l=null,u=null;n.$on("hook:destroyed",(function(){return b(a,n)}));var f=function(e){for(var t=0,n=a.length;t<n;t++)a[t].$forceUpdate();e&&(a.length=0,null!==l&&(clearTimeout(l),l=null),null!==u&&(clearTimeout(u),u=null))},d=P((function(n){e.resolved=pn(n,t),c?a.length=0:f(!0)})),v=P((function(t){ue("Failed to resolve async component: "+String(e)+(t?"\nReason: "+t:"")),o(e.errorComp)&&(e.error=!0,f(!0))})),h=e(d,v);return s(h)&&(p(h)?r(e.resolved)&&h.then(d,v):p(h.component)&&(h.component.then(d,v),o(h.error)&&(e.errorComp=pn(h.error,t)),o(h.loading)&&(e.loadingComp=pn(h.loading,t),0===h.delay?e.loading=!0:l=setTimeout((function(){l=null,r(e.resolved)&&r(e.error)&&(e.loading=!0,f(!1))}),h.delay||200)),o(h.timeout)&&(u=setTimeout((function(){u=null,r(e.resolved)&&v("timeout ("+h.timeout+"ms)")}),h.timeout)))),c=!1,e.loading?e.loadingComp:e.resolved}}(f=t,u)))return function(e,t,n,r,o){var i=xe();return i.asyncFactory=e,i.asyncMeta={data:t,context:n,children:r,tag:o},i}(f,n,a,c,l);n=n||{},Kn(t),o(n.model)&&function(e,t){var n=e.model&&e.model.prop||"value",r=e.model&&e.model.event||"input";(t.attrs||(t.attrs={}))[n]=t.model.value;var i=t.on||(t.on={}),a=i[r],s=t.model.callback;o(a)?(Array.isArray(a)?-1===a.indexOf(s):a!==s)&&(i[r]=[s].concat(a)):i[r]=s}(t.options,n);var d=function(e,t,n){var i=t.options.props;if(!r(i)){var a={},s=e.attrs,c=e.props;if(o(s)||o(c))for(var l in i){var u=S(l),f=l.toLowerCase();l!==f&&s&&w(s,f)&&fe('Prop "'+f+'" is passed to component '+de(n||t)+', but the declared prop name is "'+l+'". Note that HTML attributes are case-insensitive and camelCased props need to use their kebab-case equivalents when using in-DOM templates. You should probably use "'+u+'" instead of "'+l+'".'),It(a,c,l,u,!0)||It(a,s,l,u,!1)}return a}}(n,t,l);if(i(t.options.functional))return function(t,n,r,i,a){var s=t.options,c={},l=s.props;if(o(l))for(var u in l)c[u]=Ke(u,l,n||e);else o(r.attrs)&&on(c,r.attrs),o(r.props)&&on(c,r.props);var f=new nn(r,c,a,i,t),d=s.render.call(null,f._c,f);if(d instanceof we)return rn(d,r,f.parent,s,f);if(Array.isArray(d)){for(var p=Et(d)||[],v=new Array(p.length),h=0;h<p.length;h++)v[h]=rn(p[h],r,f.parent,s,f);return v}}(t,d,n,a,c);var v=n.on;if(n.on=n.nativeOn,i(t.options.abstract)){var h=n.slot;n={},h&&(n.slot=h)}!function(e){for(var t=e.hook||(e.hook={}),n=0;n<sn.length;n++){var r=sn[n],o=t[r],i=an[r];o===i||o&&o._merged||(t[r]=o?ln(i,o):i)}}(n);var m=t.options.name||l;return new we("vue-component-"+t.cid+(m?"-"+m:""),n,void 0,void 0,void 0,a,{Ctor:t,propsData:d,listeners:v,tag:l,children:c},f)}ue("Invalid Component definition: "+String(t),a)}}function ln(e,t){var n=function(n,r){e(n,r),t(n,r)};return n._merged=!0,n}function un(e,t,n,c,l,u){return(Array.isArray(n)||a(n))&&(l=c,c=n,n=void 0),i(u)&&(l=2),function(e,t,n,c,l){return o(n)&&o(n.__ob__)?(ue("Avoid using observed data object as vnode data: "+JSON.stringify(n)+"\nAlways create fresh vnode data objects in each render!",e),xe()):(o(n)&&o(n.is)&&(t=n.is),t?(o(n)&&o(n.key)&&!a(n.key)&&ue("Avoid using non-primitive value as key, use string/number value instead.",e),Array.isArray(c)&&"function"==typeof c[0]&&((n=n||{}).scopedSlots={default:c[0]},c.length=0),2===l?c=Et(c):1===l&&(c=function(e){for(var t=0;t<e.length;t++)if(Array.isArray(e[t]))return Array.prototype.concat.apply([],e);return e}(c)),"string"==typeof t?(f=e.$vnode&&e.$vnode.ns||H.getTagNamespace(t),H.isReservedTag(t)?(o(n)&&o(n.nativeOn)&&ue("The .native modifier for v-on is only valid on components but it was used on <"+t+">.",e),u=new we(H.parsePlatformTagName(t),n,c,void 0,void 0,e)):u=n&&n.pre||!o(d=Je(e.$options,"components",t))?new we(t,n,c,void 0,void 0,e):cn(d,n,e,c,t)):u=cn(t,n,e,c),Array.isArray(u)?u:o(u)?(o(f)&&function e(t,n,a){if(t.ns=n,"foreignObject"===t.tag&&(n=void 0,a=!0),o(t.children))for(var s=0,c=t.children.length;s<c;s++){var l=t.children[s];o(l.tag)&&(r(l.ns)||i(a)&&"svg"!==l.tag)&&e(l,n,a)}}(u,f),o(n)&&function(e){s(e.style)&&St(e.style),s(e.class)&&St(e.class)}(n),u):xe()):xe());var u,f,d}(e,t,n,c,l)}var fn,dn=null;function pn(e,t){return(e.__esModule||le&&"Module"===e[Symbol.toStringTag])&&(e=e.default),s(e)?t.extend(e):e}function vn(e){return e.isComment&&e.asyncFactory}function hn(e){if(Array.isArray(e))for(var t=0;t<e.length;t++){var n=e[t];if(o(n)&&(o(n.componentOptions)||vn(n)))return n}}function mn(e,t){fn.$on(e,t)}function gn(e,t){fn.$off(e,t)}function yn(e,t){var n=fn;return function r(){var o=t.apply(null,arguments);null!==o&&n.$off(e,r)}}function bn(e,t,n){fn=e,Mt(t,n||{},mn,gn,yn,e),fn=void 0}var _n=null,wn=!1;function $n(e){var t=_n;return _n=e,function(){_n=t}}function xn(e){for(;e&&(e=e.$parent);)if(e._inactive)return!0;return!1}function An(e,t){if(t){if(e._directInactive=!1,xn(e))return}else if(e._directInactive)return;if(e._inactive||null===e._inactive){e._inactive=!1;for(var n=0;n<e.$children.length;n++)An(e.$children[n]);kn(e,"activated")}}function kn(e,t){be();var n=e.$options[t],r=t+" hook";if(n)for(var o=0,i=n.length;o<i;o++)nt(n[o],e,null,e,r);e._hasHookEvent&&e.$emit("hook:"+t),_e()}var Cn=[],Sn=[],On={},Tn={},Mn=!1,jn=!1,In=0,En=0,Nn=Date.now;if(K&&!Y){var Dn=window.performance;Dn&&"function"==typeof Dn.now&&Nn()>document.createEvent("Event").timeStamp&&(Nn=function(){return Dn.now()})}function Ln(){var e,t;for(En=Nn(),jn=!0,Cn.sort((function(e,t){return e.id-t.id})),In=0;In<Cn.length;In++)if((e=Cn[In]).before&&e.before(),t=e.id,On[t]=null,e.run(),null!=On[t]&&(Tn[t]=(Tn[t]||0)+1,Tn[t]>100)){ue("You may have an infinite update loop "+(e.user?'in watcher with expression "'+e.expression+'"':"in a component render function."),e.vm);break}var n=Sn.slice(),r=Cn.slice();In=Cn.length=Sn.length=0,On={},Tn={},Mn=jn=!1,function(e){for(var t=0;t<e.length;t++)e[t]._inactive=!0,An(e[t],!0)}(n),function(e){for(var t=e.length;t--;){var n=e[t],r=n.vm;r._watcher===n&&r._isMounted&&!r._isDestroyed&&kn(r,"updated")}}(r),ae&&H.devtools&&ae.emit("flush")}var Pn=0,Fn=function(e,t,n,r,o){this.vm=e,o&&(e._watcher=this),e._watchers.push(this),r?(this.deep=!!r.deep,this.user=!!r.user,this.lazy=!!r.lazy,this.sync=!!r.sync,this.before=r.before):this.deep=this.user=this.lazy=this.sync=!1,this.cb=n,this.id=++Pn,this.active=!0,this.dirty=this.lazy,this.deps=[],this.newDeps=[],this.depIds=new ce,this.newDepIds=new ce,this.expression=t.toString(),"function"==typeof t?this.getter=t:(this.getter=function(e){if(!q.test(e)){var t=e.split(".");return function(e){for(var n=0;n<t.length;n++){if(!e)return;e=e[t[n]]}return e}}}(t),this.getter||(this.getter=I,ue('Failed watching path: "'+t+'" Watcher only accepts simple dot-delimited paths. For full control, use a function instead.',e))),this.value=this.lazy?void 0:this.get()};Fn.prototype.get=function(){var e;be(this);var t=this.vm;try{e=this.getter.call(t,t)}catch(e){if(!this.user)throw e;tt(e,t,'getter for watcher "'+this.expression+'"')}finally{this.deep&&St(e),_e(),this.cleanupDeps()}return e},Fn.prototype.addDep=function(e){var t=e.id;this.newDepIds.has(t)||(this.newDepIds.add(t),this.newDeps.push(e),this.depIds.has(t)||e.addSub(this))},Fn.prototype.cleanupDeps=function(){for(var e=this.deps.length;e--;){var t=this.deps[e];this.newDepIds.has(t.id)||t.removeSub(this)}var n=this.depIds;this.depIds=this.newDepIds,this.newDepIds=n,this.newDepIds.clear(),n=this.deps,this.deps=this.newDeps,this.newDeps=n,this.newDeps.length=0},Fn.prototype.update=function(){this.lazy?this.dirty=!0:this.sync?this.run():function(e){var t=e.id;if(null==On[t]){if(On[t]=!0,jn){for(var n=Cn.length-1;n>In&&Cn[n].id>e.id;)n--;Cn.splice(n+1,0,e)}else Cn.push(e);if(!Mn){if(Mn=!0,!H.async)return void Ln();mt(Ln)}}}(this)},Fn.prototype.run=function(){if(this.active){var e=this.get();if(e!==this.value||s(e)||this.deep){var t=this.value;if(this.value=e,this.user)try{this.cb.call(this.vm,e,t)}catch(e){tt(e,this.vm,'callback for watcher "'+this.expression+'"')}else this.cb.call(this.vm,e,t)}}},Fn.prototype.evaluate=function(){this.value=this.get(),this.dirty=!1},Fn.prototype.depend=function(){for(var e=this.deps.length;e--;)this.deps[e].depend()},Fn.prototype.teardown=function(){if(this.active){this.vm._isBeingDestroyed||b(this.vm._watchers,this);for(var e=this.deps.length;e--;)this.deps[e].removeSub(this);this.active=!1}};var Rn={enumerable:!0,configurable:!0,get:I,set:I};function Hn(e,t,n){Rn.get=function(){return this[t][n]},Rn.set=function(e){this[t][n]=e},Object.defineProperty(e,n,Rn)}var Un={lazy:!0};function Vn(e,t,n){var r=!ie();"function"==typeof n?(Rn.get=r?Bn(t):zn(n),Rn.set=I):(Rn.get=n.get?r&&!1!==n.cache?Bn(t):zn(n.get):I,Rn.set=n.set||I),Rn.set===I&&(Rn.set=function(){ue('Computed property "'+t+'" was assigned to but it has no setter.',this)}),Object.defineProperty(e,t,Rn)}function Bn(e){return function(){var t=this._computedWatchers&&this._computedWatchers[e];if(t)return t.dirty&&t.evaluate(),ge.target&&t.depend(),t.value}}function zn(e){return function(){return e.call(this,this)}}function qn(e,t,n,r){return u(n)&&(r=n,n=n.handler),"string"==typeof n&&(n=e[n]),e.$watch(t,n,r)}var Jn=0;function Kn(e){var t=e.options;if(e.super){var n=Kn(e.super);if(n!==e.superOptions){e.superOptions=n;var r=function(e){var t,n=e.options,r=e.sealedOptions;for(var o in n)n[o]!==r[o]&&(t||(t={}),t[o]=n[o]);return t}(e);r&&M(e.extendOptions,r),(t=e.options=qe(n,e.extendOptions)).name&&(t.components[t.name]=e)}}return t}function Wn(e){this instanceof Wn||ue("Vue is a constructor and should be called with the `new` keyword"),this._init(e)}function Zn(e){return e&&(e.Ctor.options.name||e.tag)}function Gn(e,t){return Array.isArray(e)?e.indexOf(t)>-1:"string"==typeof e?e.split(",").indexOf(t)>-1:!!f(e)&&e.test(t)}function Yn(e,t){var n=e.cache,r=e.keys,o=e._vnode;for(var i in n){var a=n[i];if(a){var s=Zn(a.componentOptions);s&&!t(s)&&Xn(n,i,r,o)}}}function Xn(e,t,n,r){var o=e[t];!o||r&&o.tag===r.tag||o.componentInstance.$destroy(),e[t]=null,b(n,t)}!function(t){t.prototype._init=function(t){var n,r,o=this;o._uid=Jn++,H.performance&&at&&(n="vue-perf-start:"+o._uid,r="vue-perf-end:"+o._uid,at(n)),o._isVue=!0,t&&t._isComponent?function(e,t){var n=e.$options=Object.create(e.constructor.options),r=t._parentVnode;n.parent=t.parent,n._parentVnode=r;var o=r.componentOptions;n.propsData=o.propsData,n._parentListeners=o.listeners,n._renderChildren=o.children,n._componentTag=o.tag,t.render&&(n.render=t.render,n.staticRenderFns=t.staticRenderFns)}(o,t):o.$options=qe(Kn(o.constructor),t||{},o),gt(o),o._self=o,function(e){var t=e.$options,n=t.parent;if(n&&!t.abstract){for(;n.$options.abstract&&n.$parent;)n=n.$parent;n.$children.push(e)}e.$parent=n,e.$root=n?n.$root:e,e.$children=[],e.$refs={},e._watcher=null,e._inactive=null,e._directInactive=!1,e._isMounted=!1,e._isDestroyed=!1,e._isBeingDestroyed=!1}(o),function(e){e._events=Object.create(null),e._hasHookEvent=!1;var t=e.$options._parentListeners;t&&bn(e,t)}(o),function(t){t._vnode=null,t._staticTrees=null;var n=t.$options,r=t.$vnode=n._parentVnode,o=r&&r.context;t.$slots=Lt(n._renderChildren,o),t.$scopedSlots=e,t._c=function(e,n,r,o){return un(t,e,n,r,o,!1)},t.$createElement=function(e,n,r,o){return un(t,e,n,r,o,!0)};var i=r&&r.data;Ee(t,"$attrs",i&&i.attrs||e,(function(){!wn&&ue("$attrs is readonly.",t)}),!0),Ee(t,"$listeners",n._parentListeners||e,(function(){!wn&&ue("$listeners is readonly.",t)}),!0)}(o),kn(o,"beforeCreate"),function(e){var t=Dt(e.$options.inject,e);t&&(Me(!1),Object.keys(t).forEach((function(n){Ee(e,n,t[n],(function(){ue('Avoid mutating an injected value directly since the changes will be overwritten whenever the provided component re-renders. injection being mutated: "'+n+'"',e)}))})),Me(!0))}(o),function(e){e._watchers=[];var t=e.$options;t.props&&function(e,t){var n=e.$options.propsData||{},r=e._props={},o=e.$options._propKeys=[],i=!e.$parent;i||Me(!1);var a=function(a){o.push(a);var s=Ke(a,t,n,e),c=S(a);(y(c)||H.isReservedAttr(c))&&ue('"'+c+'" is a reserved attribute and cannot be used as component prop.',e),Ee(r,a,s,(function(){i||wn||ue("Avoid mutating a prop directly since the value will be overwritten whenever the parent component re-renders. Instead, use a data or computed property based on the prop's value. Prop being mutated: \""+a+'"',e)})),a in e||Hn(e,"_props",a)};for(var s in t)a(s);Me(!0)}(e,t.props),t.methods&&function(e,t){var n=e.$options.props;for(var r in t)"function"!=typeof t[r]&&ue('Method "'+r+'" has type "'+typeof t[r]+'" in the component definition. Did you reference the function correctly?',e),n&&w(n,r)&&ue('Method "'+r+'" has already been defined as a prop.',e),r in e&&V(r)&&ue('Method "'+r+'" conflicts with an existing Vue instance method. Avoid defining component methods that start with _ or $.'),e[r]="function"!=typeof t[r]?I:O(t[r],e)}(e,t.methods),t.data?function(e){var t=e.$options.data;u(t=e._data="function"==typeof t?function(e,t){be();try{return e.call(t,t)}catch(e){return tt(e,t,"data()"),{}}finally{_e()}}(t,e):t||{})||(t={},ue("data functions should return an object:\nhttps://vuejs.org/v2/guide/components.html#data-Must-Be-a-Function",e));for(var n=Object.keys(t),r=e.$options.props,o=e.$options.methods,i=n.length;i--;){var a=n[i];o&&w(o,a)&&ue('Method "'+a+'" has already been defined as a data property.',e),r&&w(r,a)?ue('The data property "'+a+'" is already declared as a prop. Use prop default value instead.',e):V(a)||Hn(e,"_data",a)}Ie(t,!0)}(e):Ie(e._data={},!0),t.computed&&function(e,t){var n=e._computedWatchers=Object.create(null),r=ie();for(var o in t){var i=t[o],a="function"==typeof i?i:i.get;null==a&&ue('Getter is missing for computed property "'+o+'".',e),r||(n[o]=new Fn(e,a||I,I,Un)),o in e?o in e.$data?ue('The computed property "'+o+'" is already defined in data.',e):e.$options.props&&o in e.$options.props&&ue('The computed property "'+o+'" is already defined as a prop.',e):Vn(e,o,i)}}(e,t.computed),t.watch&&t.watch!==ne&&function(e,t){for(var n in t){var r=t[n];if(Array.isArray(r))for(var o=0;o<r.length;o++)qn(e,n,r[o]);else qn(e,n,r)}}(e,t.watch)}(o),function(e){var t=e.$options.provide;t&&(e._provided="function"==typeof t?t.call(e):t)}(o),kn(o,"created"),H.performance&&at&&(o._name=de(o,!1),at(r),st("vue "+o._name+" init",n,r)),o.$options.el&&o.$mount(o.$options.el)}}(Wn),function(e){var t={get:function(){return this._data}},n={get:function(){return this._props}};t.set=function(){ue("Avoid replacing instance root $data. Use nested data properties instead.",this)},n.set=function(){ue("$props is readonly.",this)},Object.defineProperty(e.prototype,"$data",t),Object.defineProperty(e.prototype,"$props",n),e.prototype.$set=Ne,e.prototype.$delete=De,e.prototype.$watch=function(e,t,n){if(u(t))return qn(this,e,t,n);(n=n||{}).user=!0;var r=new Fn(this,e,t,n);if(n.immediate)try{t.call(this,r.value)}catch(e){tt(e,this,'callback for immediate watcher "'+r.expression+'"')}return function(){r.teardown()}}}(Wn),function(e){var t=/^hook:/;e.prototype.$on=function(e,n){var r=this;if(Array.isArray(e))for(var o=0,i=e.length;o<i;o++)r.$on(e[o],n);else(r._events[e]||(r._events[e]=[])).push(n),t.test(e)&&(r._hasHookEvent=!0);return r},e.prototype.$once=function(e,t){var n=this;function r(){n.$off(e,r),t.apply(n,arguments)}return r.fn=t,n.$on(e,r),n},e.prototype.$off=function(e,t){var n=this;if(!arguments.length)return n._events=Object.create(null),n;if(Array.isArray(e)){for(var r=0,o=e.length;r<o;r++)n.$off(e[r],t);return n}var i,a=n._events[e];if(!a)return n;if(!t)return n._events[e]=null,n;for(var s=a.length;s--;)if((i=a[s])===t||i.fn===t){a.splice(s,1);break}return n},e.prototype.$emit=function(e){var t=this,n=e.toLowerCase();n!==e&&t._events[n]&&fe('Event "'+n+'" is emitted in component '+de(t)+' but the handler is registered for "'+e+'". Note that HTML attributes are case-insensitive and you cannot use v-on to listen to camelCase events when using in-DOM templates. You should probably use "'+S(e)+'" instead of "'+e+'".');var r=t._events[e];if(r){r=r.length>1?T(r):r;for(var o=T(arguments,1),i='event handler for "'+e+'"',a=0,s=r.length;a<s;a++)nt(r[a],t,o,t,i)}return t}}(Wn),function(e){e.prototype._update=function(e,t){var n=this,r=n.$el,o=n._vnode,i=$n(n);n._vnode=e,n.$el=o?n.__patch__(o,e):n.__patch__(n.$el,e,t,!1),i(),r&&(r.__vue__=null),n.$el&&(n.$el.__vue__=n),n.$vnode&&n.$parent&&n.$vnode===n.$parent._vnode&&(n.$parent.$el=n.$el)},e.prototype.$forceUpdate=function(){this._watcher&&this._watcher.update()},e.prototype.$destroy=function(){var e=this;if(!e._isBeingDestroyed){kn(e,"beforeDestroy"),e._isBeingDestroyed=!0;var t=e.$parent;!t||t._isBeingDestroyed||e.$options.abstract||b(t.$children,e),e._watcher&&e._watcher.teardown();for(var n=e._watchers.length;n--;)e._watchers[n].teardown();e._data.__ob__&&e._data.__ob__.vmCount--,e._isDestroyed=!0,e.__patch__(e._vnode,null),kn(e,"destroyed"),e.$off(),e.$el&&(e.$el.__vue__=null),e.$vnode&&(e.$vnode.parent=null)}}}(Wn),function(e){tn(e.prototype),e.prototype.$nextTick=function(e){return mt(e,this)},e.prototype._render=function(){var e,t=this,n=t.$options,r=n.render,o=n._parentVnode;o&&(t.$scopedSlots=Ft(o.data.scopedSlots,t.$slots,t.$scopedSlots)),t.$vnode=o;try{dn=t,e=r.call(t._renderProxy,t.$createElement)}catch(n){if(tt(n,t,"render"),t.$options.renderError)try{e=t.$options.renderError.call(t._renderProxy,t.$createElement,n)}catch(n){tt(n,t,"renderError"),e=t._vnode}else e=t._vnode}finally{dn=null}return Array.isArray(e)&&1===e.length&&(e=e[0]),e instanceof we||(Array.isArray(e)&&ue("Multiple root nodes returned from render function. Render function should return a single root node.",t),e=xe()),e.parent=o,e}}(Wn);var Qn=[String,RegExp,Array],er={KeepAlive:{name:"keep-alive",abstract:!0,props:{include:Qn,exclude:Qn,max:[String,Number]},created:function(){this.cache=Object.create(null),this.keys=[]},destroyed:function(){for(var e in this.cache)Xn(this.cache,e,this.keys)},mounted:function(){var e=this;this.$watch("include",(function(t){Yn(e,(function(e){return Gn(t,e)}))})),this.$watch("exclude",(function(t){Yn(e,(function(e){return!Gn(t,e)}))}))},render:function(){var e=this.$slots.default,t=hn(e),n=t&&t.componentOptions;if(n){var r=Zn(n),o=this.include,i=this.exclude;if(o&&(!r||!Gn(o,r))||i&&r&&Gn(i,r))return t;var a=this.cache,s=this.keys,c=null==t.key?n.Ctor.cid+(n.tag?"::"+n.tag:""):t.key;a[c]?(t.componentInstance=a[c].componentInstance,b(s,c),s.push(c)):(a[c]=t,s.push(c),this.max&&s.length>parseInt(this.max)&&Xn(a,s[0],s,this._vnode)),t.data.keepAlive=!0}return t||e&&e[0]}}};!function(e){var t={get:function(){return H},set:function(){ue("Do not replace the Vue.config object, set individual fields instead.")}};Object.defineProperty(e,"config",t),e.util={warn:ue,extend:M,mergeOptions:qe,defineReactive:Ee},e.set=Ne,e.delete=De,e.nextTick=mt,e.observable=function(e){return Ie(e),e},e.options=Object.create(null),F.forEach((function(t){e.options[t+"s"]=Object.create(null)})),e.options._base=e,M(e.options.components,er),function(e){e.use=function(e){var t=this._installedPlugins||(this._installedPlugins=[]);if(t.indexOf(e)>-1)return this;var n=T(arguments,1);return n.unshift(this),"function"==typeof e.install?e.install.apply(e,n):"function"==typeof e&&e.apply(null,n),t.push(e),this}}(e),function(e){e.mixin=function(e){return this.options=qe(this.options,e),this}}(e),function(e){e.cid=0;var t=1;e.extend=function(e){e=e||{};var n=this,r=n.cid,o=e._Ctor||(e._Ctor={});if(o[r])return o[r];var i=e.name||n.options.name;i&&Be(i);var a=function(e){this._init(e)};return(a.prototype=Object.create(n.prototype)).constructor=a,a.cid=t++,a.options=qe(n.options,e),a.super=n,a.options.props&&function(e){var t=e.options.props;for(var n in t)Hn(e.prototype,"_props",n)}(a),a.options.computed&&function(e){var t=e.options.computed;for(var n in t)Vn(e.prototype,n,t[n])}(a),a.extend=n.extend,a.mixin=n.mixin,a.use=n.use,F.forEach((function(e){a[e]=n[e]})),i&&(a.options.components[i]=a),a.superOptions=n.options,a.extendOptions=e,a.sealedOptions=M({},a.options),o[r]=a,a}}(e),function(e){F.forEach((function(t){e[t]=function(e,n){return n?("component"===t&&Be(e),"component"===t&&u(n)&&(n.name=n.name||e,n=this.options._base.extend(n)),"directive"===t&&"function"==typeof n&&(n={bind:n,update:n}),this.options[t+"s"][e]=n,n):this.options[t+"s"][e]}}))}(e)}(Wn),Object.defineProperty(Wn.prototype,"$isServer",{get:ie}),Object.defineProperty(Wn.prototype,"$ssrContext",{get:function(){return this.$vnode&&this.$vnode.ssrContext}}),Object.defineProperty(Wn,"FunctionalRenderContext",{value:nn}),Wn.version="2.6.12";var tr=m("style,class"),nr=m("input,textarea,option,select,progress"),rr=function(e,t,n){return"value"===n&&nr(e)&&"button"!==t||"selected"===n&&"option"===e||"checked"===n&&"input"===e||"muted"===n&&"video"===e},or=m("contenteditable,draggable,spellcheck"),ir=m("events,caret,typing,plaintext-only"),ar=m("allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare,default,defaultchecked,defaultmuted,defaultselected,defer,disabled,enabled,formnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple,muted,nohref,noresize,noshade,novalidate,nowrap,open,pauseonexit,readonly,required,reversed,scoped,seamless,selected,sortable,translate,truespeed,typemustmatch,visible"),sr="http://www.w3.org/1999/xlink",cr=function(e){return":"===e.charAt(5)&&"xlink"===e.slice(0,5)},lr=function(e){return cr(e)?e.slice(6,e.length):""},ur=function(e){return null==e||!1===e};function fr(e,t){return{staticClass:dr(e.staticClass,t.staticClass),class:o(e.class)?[e.class,t.class]:t.class}}function dr(e,t){return e?t?e+" "+t:e:t||""}function pr(e){return Array.isArray(e)?function(e){for(var t,n="",r=0,i=e.length;r<i;r++)o(t=pr(e[r]))&&""!==t&&(n&&(n+=" "),n+=t);return n}(e):s(e)?function(e){var t="";for(var n in e)e[n]&&(t&&(t+=" "),t+=n);return t}(e):"string"==typeof e?e:""}var vr={svg:"http://www.w3.org/2000/svg",math:"http://www.w3.org/1998/Math/MathML"},hr=m("html,body,base,head,link,meta,style,title,address,article,aside,footer,header,h1,h2,h3,h4,h5,h6,hgroup,nav,section,div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,rtc,ruby,s,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,output,progress,select,textarea,details,dialog,menu,menuitem,summary,content,element,shadow,template,blockquote,iframe,tfoot"),mr=m("svg,animate,circle,clippath,cursor,defs,desc,ellipse,filter,font-face,foreignObject,g,glyph,image,line,marker,mask,missing-glyph,path,pattern,polygon,polyline,rect,switch,symbol,text,textpath,tspan,use,view",!0),gr=function(e){return hr(e)||mr(e)};function yr(e){return mr(e)?"svg":"math"===e?"math":void 0}var br=Object.create(null),_r=m("text,number,password,search,email,tel,url");function wr(e){return"string"==typeof e?document.querySelector(e)||(ue("Cannot find element: "+e),document.createElement("div")):e}var $r=Object.freeze({createElement:function(e,t){var n=document.createElement(e);return"select"!==e||t.data&&t.data.attrs&&void 0!==t.data.attrs.multiple&&n.setAttribute("multiple","multiple"),n},createElementNS:function(e,t){return document.createElementNS(vr[e],t)},createTextNode:function(e){return document.createTextNode(e)},createComment:function(e){return document.createComment(e)},insertBefore:function(e,t,n){e.insertBefore(t,n)},removeChild:function(e,t){e.removeChild(t)},appendChild:function(e,t){e.appendChild(t)},parentNode:function(e){return e.parentNode},nextSibling:function(e){return e.nextSibling},tagName:function(e){return e.tagName},setTextContent:function(e,t){e.textContent=t},setStyleScope:function(e,t){e.setAttribute(t,"")}}),xr={create:function(e,t){Ar(t)},update:function(e,t){e.data.ref!==t.data.ref&&(Ar(e,!0),Ar(t))},destroy:function(e){Ar(e,!0)}};function Ar(e,t){var n=e.data.ref;if(o(n)){var r=e.context,i=e.componentInstance||e.elm,a=r.$refs;t?Array.isArray(a[n])?b(a[n],i):a[n]===i&&(a[n]=void 0):e.data.refInFor?Array.isArray(a[n])?a[n].indexOf(i)<0&&a[n].push(i):a[n]=[i]:a[n]=i}}var kr=new we("",{},[]),Cr=["create","activate","update","remove","destroy"];function Sr(e,t){return e.key===t.key&&(e.tag===t.tag&&e.isComment===t.isComment&&o(e.data)===o(t.data)&&function(e,t){if("input"!==e.tag)return!0;var n,r=o(n=e.data)&&o(n=n.attrs)&&n.type,i=o(n=t.data)&&o(n=n.attrs)&&n.type;return r===i||_r(r)&&_r(i)}(e,t)||i(e.isAsyncPlaceholder)&&e.asyncFactory===t.asyncFactory&&r(t.asyncFactory.error))}function Or(e,t,n){var r,i,a={};for(r=t;r<=n;++r)o(i=e[r].key)&&(a[i]=r);return a}var Tr={create:Mr,update:Mr,destroy:function(e){Mr(e,kr)}};function Mr(e,t){(e.data.directives||t.data.directives)&&function(e,t){var n,r,o,i=e===kr,a=t===kr,s=Ir(e.data.directives,e.context),c=Ir(t.data.directives,t.context),l=[],u=[];for(n in c)r=s[n],o=c[n],r?(o.oldValue=r.value,o.oldArg=r.arg,Nr(o,"update",t,e),o.def&&o.def.componentUpdated&&u.push(o)):(Nr(o,"bind",t,e),o.def&&o.def.inserted&&l.push(o));if(l.length){var f=function(){for(var n=0;n<l.length;n++)Nr(l[n],"inserted",t,e)};i?jt(t,"insert",f):f()}if(u.length&&jt(t,"postpatch",(function(){for(var n=0;n<u.length;n++)Nr(u[n],"componentUpdated",t,e)})),!i)for(n in s)c[n]||Nr(s[n],"unbind",e,e,a)}(e,t)}var jr=Object.create(null);function Ir(e,t){var n,r,o=Object.create(null);if(!e)return o;for(n=0;n<e.length;n++)(r=e[n]).modifiers||(r.modifiers=jr),o[Er(r)]=r,r.def=Je(t.$options,"directives",r.name,!0);return o}function Er(e){return e.rawName||e.name+"."+Object.keys(e.modifiers||{}).join(".")}function Nr(e,t,n,r,o){var i=e.def&&e.def[t];if(i)try{i(n.elm,e,n,r,o)}catch(r){tt(r,n.context,"directive "+e.name+" "+t+" hook")}}var Dr=[xr,Tr];function Lr(e,t){var n=t.componentOptions;if(!(o(n)&&!1===n.Ctor.options.inheritAttrs||r(e.data.attrs)&&r(t.data.attrs))){var i,a,s=t.elm,c=e.data.attrs||{},l=t.data.attrs||{};for(i in o(l.__ob__)&&(l=t.data.attrs=M({},l)),l)a=l[i],c[i]!==a&&Pr(s,i,a);for(i in(Y||Q)&&l.value!==c.value&&Pr(s,"value",l.value),c)r(l[i])&&(cr(i)?s.removeAttributeNS(sr,lr(i)):or(i)||s.removeAttribute(i))}}function Pr(e,t,n){e.tagName.indexOf("-")>-1?Fr(e,t,n):ar(t)?ur(n)?e.removeAttribute(t):(n="allowfullscreen"===t&&"EMBED"===e.tagName?"true":t,e.setAttribute(t,n)):or(t)?e.setAttribute(t,function(e,t){return ur(t)||"false"===t?"false":"contenteditable"===e&&ir(t)?t:"true"}(t,n)):cr(t)?ur(n)?e.removeAttributeNS(sr,lr(t)):e.setAttributeNS(sr,t,n):Fr(e,t,n)}function Fr(e,t,n){if(ur(n))e.removeAttribute(t);else{if(Y&&!X&&"TEXTAREA"===e.tagName&&"placeholder"===t&&""!==n&&!e.__ieph){var r=function(t){t.stopImmediatePropagation(),e.removeEventListener("input",r)};e.addEventListener("input",r),e.__ieph=!0}e.setAttribute(t,n)}}var Rr={create:Lr,update:Lr};function Hr(e,t){var n=t.elm,i=t.data,a=e.data;if(!(r(i.staticClass)&&r(i.class)&&(r(a)||r(a.staticClass)&&r(a.class)))){var s=function(e){for(var t=e.data,n=e,r=e;o(r.componentInstance);)(r=r.componentInstance._vnode)&&r.data&&(t=fr(r.data,t));for(;o(n=n.parent);)n&&n.data&&(t=fr(t,n.data));return i=t.staticClass,a=t.class,o(i)||o(a)?dr(i,pr(a)):"";var i,a}(t),c=n._transitionClasses;o(c)&&(s=dr(s,pr(c))),s!==n._prevClass&&(n.setAttribute("class",s),n._prevClass=s)}}var Ur,Vr,Br,zr,qr,Jr,Kr,Wr,Zr={create:Hr,update:Hr},Gr=/[\w).+\-_$\]]/;function Yr(e){var t,n,r,o,i,a=!1,s=!1,c=!1,l=!1,u=0,f=0,d=0,p=0;for(r=0;r<e.length;r++)if(n=t,t=e.charCodeAt(r),a)39===t&&92!==n&&(a=!1);else if(s)34===t&&92!==n&&(s=!1);else if(c)96===t&&92!==n&&(c=!1);else if(l)47===t&&92!==n&&(l=!1);else if(124!==t||124===e.charCodeAt(r+1)||124===e.charCodeAt(r-1)||u||f||d){switch(t){case 34:s=!0;break;case 39:a=!0;break;case 96:c=!0;break;case 40:d++;break;case 41:d--;break;case 91:f++;break;case 93:f--;break;case 123:u++;break;case 125:u--}if(47===t){for(var v=r-1,h=void 0;v>=0&&" "===(h=e.charAt(v));v--);h&&Gr.test(h)||(l=!0)}}else void 0===o?(p=r+1,o=e.slice(0,r).trim()):m();function m(){(i||(i=[])).push(e.slice(p,r).trim()),p=r+1}if(void 0===o?o=e.slice(0,r).trim():0!==p&&m(),i)for(r=0;r<i.length;r++)o=Xr(o,i[r]);return o}function Xr(e,t){var n=t.indexOf("(");if(n<0)return'_f("'+t+'")('+e+")";var r=t.slice(0,n),o=t.slice(n+1);return'_f("'+r+'")('+e+(")"!==o?","+o:o)}function Qr(e,t){console.error("[Vue compiler]: "+e)}function eo(e,t){return e?e.map((function(e){return e[t]})).filter((function(e){return e})):[]}function to(e,t,n,r,o){(e.props||(e.props=[])).push(fo({name:t,value:n,dynamic:o},r)),e.plain=!1}function no(e,t,n,r,o){(o?e.dynamicAttrs||(e.dynamicAttrs=[]):e.attrs||(e.attrs=[])).push(fo({name:t,value:n,dynamic:o},r)),e.plain=!1}function ro(e,t,n,r){e.attrsMap[t]=n,e.attrsList.push(fo({name:t,value:n},r))}function oo(e,t,n,r,o,i,a,s){(e.directives||(e.directives=[])).push(fo({name:t,rawName:n,value:r,arg:o,isDynamicArg:i,modifiers:a},s)),e.plain=!1}function io(e,t,n){return n?"_p("+t+',"'+e+'")':e+t}function ao(t,n,r,o,i,a,s,c){var l;o=o||e,a&&o.prevent&&o.passive&&a("passive and prevent can't be used together. Passive handler can't prevent default event.",s),o.right?c?n="("+n+")==='click'?'contextmenu':("+n+")":"click"===n&&(n="contextmenu",delete o.right):o.middle&&(c?n="("+n+")==='click'?'mouseup':("+n+")":"click"===n&&(n="mouseup")),o.capture&&(delete o.capture,n=io("!",n,c)),o.once&&(delete o.once,n=io("~",n,c)),o.passive&&(delete o.passive,n=io("&",n,c)),o.native?(delete o.native,l=t.nativeEvents||(t.nativeEvents={})):l=t.events||(t.events={});var u=fo({value:r.trim(),dynamic:c},s);o!==e&&(u.modifiers=o);var f=l[n];Array.isArray(f)?i?f.unshift(u):f.push(u):l[n]=f?i?[u,f]:[f,u]:u,t.plain=!1}function so(e,t){return e.rawAttrsMap[":"+t]||e.rawAttrsMap["v-bind:"+t]||e.rawAttrsMap[t]}function co(e,t,n){var r=lo(e,":"+t)||lo(e,"v-bind:"+t);if(null!=r)return Yr(r);if(!1!==n){var o=lo(e,t);if(null!=o)return JSON.stringify(o)}}function lo(e,t,n){var r;if(null!=(r=e.attrsMap[t]))for(var o=e.attrsList,i=0,a=o.length;i<a;i++)if(o[i].name===t){o.splice(i,1);break}return n&&delete e.attrsMap[t],r}function uo(e,t){for(var n=e.attrsList,r=0,o=n.length;r<o;r++){var i=n[r];if(t.test(i.name))return n.splice(r,1),i}}function fo(e,t){return t&&(null!=t.start&&(e.start=t.start),null!=t.end&&(e.end=t.end)),e}function po(e,t,n){var r=n||{},o=r.number,i="$$v";r.trim&&(i="(typeof $$v === 'string'? $$v.trim(): $$v)"),o&&(i="_n("+i+")");var a=vo(t,i);e.model={value:"("+t+")",expression:JSON.stringify(t),callback:"function ($$v) {"+a+"}"}}function vo(e,t){var n=function(e){if(e=e.trim(),Ur=e.length,e.indexOf("[")<0||e.lastIndexOf("]")<Ur-1)return(zr=e.lastIndexOf("."))>-1?{exp:e.slice(0,zr),key:'"'+e.slice(zr+1)+'"'}:{exp:e,key:null};for(Vr=e,zr=qr=Jr=0;!mo();)go(Br=ho())?bo(Br):91===Br&&yo(Br);return{exp:e.slice(0,qr),key:e.slice(qr+1,Jr)}}(e);return null===n.key?e+"="+t:"$set("+n.exp+", "+n.key+", "+t+")"}function ho(){return Vr.charCodeAt(++zr)}function mo(){return zr>=Ur}function go(e){return 34===e||39===e}function yo(e){var t=1;for(qr=zr;!mo();)if(go(e=ho()))bo(e);else if(91===e&&t++,93===e&&t--,0===t){Jr=zr;break}}function bo(e){for(var t=e;!mo()&&(e=ho())!==t;);}function _o(e,t,n){var r=Wr;return function o(){var i=t.apply(null,arguments);null!==i&&xo(e,o,n,r)}}var wo=ct&&!(te&&Number(te[1])<=53);function $o(e,t,n,r){if(wo){var o=En,i=t;t=i._wrapper=function(e){if(e.target===e.currentTarget||e.timeStamp>=o||e.timeStamp<=0||e.target.ownerDocument!==document)return i.apply(this,arguments)}}Wr.addEventListener(e,t,re?{capture:n,passive:r}:n)}function xo(e,t,n,r){(r||Wr).removeEventListener(e,t._wrapper||t,n)}function Ao(e,t){if(!r(e.data.on)||!r(t.data.on)){var n=t.data.on||{},i=e.data.on||{};Wr=t.elm,function(e){if(o(e.__r)){var t=Y?"change":"input";e[t]=[].concat(e.__r,e[t]||[]),delete e.__r}o(e.__c)&&(e.change=[].concat(e.__c,e.change||[]),delete e.__c)}(n),Mt(n,i,$o,xo,_o,t.context),Wr=void 0}}var ko,Co={create:Ao,update:Ao};function So(e,t){if(!r(e.data.domProps)||!r(t.data.domProps)){var n,i,a=t.elm,s=e.data.domProps||{},c=t.data.domProps||{};for(n in o(c.__ob__)&&(c=t.data.domProps=M({},c)),s)n in c||(a[n]="");for(n in c){if(i=c[n],"textContent"===n||"innerHTML"===n){if(t.children&&(t.children.length=0),i===s[n])continue;1===a.childNodes.length&&a.removeChild(a.childNodes[0])}if("value"===n&&"PROGRESS"!==a.tagName){a._value=i;var l=r(i)?"":String(i);Oo(a,l)&&(a.value=l)}else if("innerHTML"===n&&mr(a.tagName)&&r(a.innerHTML)){(ko=ko||document.createElement("div")).innerHTML="<svg>"+i+"</svg>";for(var u=ko.firstChild;a.firstChild;)a.removeChild(a.firstChild);for(;u.firstChild;)a.appendChild(u.firstChild)}else if(i!==s[n])try{a[n]=i}catch(e){}}}}function Oo(e,t){return!e.composing&&("OPTION"===e.tagName||function(e,t){var n=!0;try{n=document.activeElement!==e}catch(e){}return n&&e.value!==t}(e,t)||function(e,t){var n=e.value,r=e._vModifiers;if(o(r)){if(r.number)return h(n)!==h(t);if(r.trim)return n.trim()!==t.trim()}return n!==t}(e,t))}var To={create:So,update:So},Mo=$((function(e){var t={},n=/:(.+)/;return e.split(/;(?![^(]*\))/g).forEach((function(e){if(e){var r=e.split(n);r.length>1&&(t[r[0].trim()]=r[1].trim())}})),t}));function jo(e){var t=Io(e.style);return e.staticStyle?M(e.staticStyle,t):t}function Io(e){return Array.isArray(e)?j(e):"string"==typeof e?Mo(e):e}var Eo,No=/^--/,Do=/\s*!important$/,Lo=function(e,t,n){if(No.test(t))e.style.setProperty(t,n);else if(Do.test(n))e.style.setProperty(S(t),n.replace(Do,""),"important");else{var r=Fo(t);if(Array.isArray(n))for(var o=0,i=n.length;o<i;o++)e.style[r]=n[o];else e.style[r]=n}},Po=["Webkit","Moz","ms"],Fo=$((function(e){if(Eo=Eo||document.createElement("div").style,"filter"!==(e=A(e))&&e in Eo)return e;for(var t=e.charAt(0).toUpperCase()+e.slice(1),n=0;n<Po.length;n++){var r=Po[n]+t;if(r in Eo)return r}}));function Ro(e,t){var n=t.data,i=e.data;if(!(r(n.staticStyle)&&r(n.style)&&r(i.staticStyle)&&r(i.style))){var a,s,c=t.elm,l=i.staticStyle,u=i.normalizedStyle||i.style||{},f=l||u,d=Io(t.data.style)||{};t.data.normalizedStyle=o(d.__ob__)?M({},d):d;var p=function(e,t){for(var n,r={},o=e;o.componentInstance;)(o=o.componentInstance._vnode)&&o.data&&(n=jo(o.data))&&M(r,n);(n=jo(e.data))&&M(r,n);for(var i=e;i=i.parent;)i.data&&(n=jo(i.data))&&M(r,n);return r}(t);for(s in f)r(p[s])&&Lo(c,s,"");for(s in p)(a=p[s])!==f[s]&&Lo(c,s,null==a?"":a)}}var Ho={create:Ro,update:Ro},Uo=/\s+/;function Vo(e,t){if(t&&(t=t.trim()))if(e.classList)t.indexOf(" ")>-1?t.split(Uo).forEach((function(t){return e.classList.add(t)})):e.classList.add(t);else{var n=" "+(e.getAttribute("class")||"")+" ";n.indexOf(" "+t+" ")<0&&e.setAttribute("class",(n+t).trim())}}function Bo(e,t){if(t&&(t=t.trim()))if(e.classList)t.indexOf(" ")>-1?t.split(Uo).forEach((function(t){return e.classList.remove(t)})):e.classList.remove(t),e.classList.length||e.removeAttribute("class");else{for(var n=" "+(e.getAttribute("class")||"")+" ",r=" "+t+" ";n.indexOf(r)>=0;)n=n.replace(r," ");(n=n.trim())?e.setAttribute("class",n):e.removeAttribute("class")}}function zo(e){if(e){if("object"==typeof e){var t={};return!1!==e.css&&M(t,qo(e.name||"v")),M(t,e),t}return"string"==typeof e?qo(e):void 0}}var qo=$((function(e){return{enterClass:e+"-enter",enterToClass:e+"-enter-to",enterActiveClass:e+"-enter-active",leaveClass:e+"-leave",leaveToClass:e+"-leave-to",leaveActiveClass:e+"-leave-active"}})),Jo=K&&!X,Ko="transition",Wo="transitionend",Zo="animation",Go="animationend";Jo&&(void 0===window.ontransitionend&&void 0!==window.onwebkittransitionend&&(Ko="WebkitTransition",Wo="webkitTransitionEnd"),void 0===window.onanimationend&&void 0!==window.onwebkitanimationend&&(Zo="WebkitAnimation",Go="webkitAnimationEnd"));var Yo=K?window.requestAnimationFrame?window.requestAnimationFrame.bind(window):setTimeout:function(e){return e()};function Xo(e){Yo((function(){Yo(e)}))}function Qo(e,t){var n=e._transitionClasses||(e._transitionClasses=[]);n.indexOf(t)<0&&(n.push(t),Vo(e,t))}function ei(e,t){e._transitionClasses&&b(e._transitionClasses,t),Bo(e,t)}function ti(e,t,n){var r=ri(e,t),o=r.type,i=r.timeout,a=r.propCount;if(!o)return n();var s="transition"===o?Wo:Go,c=0,l=function(){e.removeEventListener(s,u),n()},u=function(t){t.target===e&&++c>=a&&l()};setTimeout((function(){c<a&&l()}),i+1),e.addEventListener(s,u)}var ni=/\b(transform|all)(,|$)/;function ri(e,t){var n,r=window.getComputedStyle(e),o=(r[Ko+"Delay"]||"").split(", "),i=(r[Ko+"Duration"]||"").split(", "),a=oi(o,i),s=(r[Zo+"Delay"]||"").split(", "),c=(r[Zo+"Duration"]||"").split(", "),l=oi(s,c),u=0,f=0;return"transition"===t?a>0&&(n="transition",u=a,f=i.length):"animation"===t?l>0&&(n="animation",u=l,f=c.length):f=(n=(u=Math.max(a,l))>0?a>l?"transition":"animation":null)?"transition"===n?i.length:c.length:0,{type:n,timeout:u,propCount:f,hasTransform:"transition"===n&&ni.test(r[Ko+"Property"])}}function oi(e,t){for(;e.length<t.length;)e=e.concat(e);return Math.max.apply(null,t.map((function(t,n){return ii(t)+ii(e[n])})))}function ii(e){return 1e3*Number(e.slice(0,-1).replace(",","."))}function ai(e,t){var n=e.elm;o(n._leaveCb)&&(n._leaveCb.cancelled=!0,n._leaveCb());var i=zo(e.data.transition);if(!r(i)&&!o(n._enterCb)&&1===n.nodeType){for(var a=i.css,c=i.type,l=i.enterClass,u=i.enterToClass,f=i.enterActiveClass,d=i.appearClass,p=i.appearToClass,v=i.appearActiveClass,m=i.beforeEnter,g=i.enter,y=i.afterEnter,b=i.enterCancelled,_=i.beforeAppear,w=i.appear,$=i.afterAppear,x=i.appearCancelled,A=i.duration,k=_n,C=_n.$vnode;C&&C.parent;)k=C.context,C=C.parent;var S=!k._isMounted||!e.isRootInsert;if(!S||w||""===w){var O=S&&d?d:l,T=S&&v?v:f,M=S&&p?p:u,j=S&&_||m,I=S&&"function"==typeof w?w:g,E=S&&$||y,N=S&&x||b,D=h(s(A)?A.enter:A);null!=D&&ci(D,"enter",e);var L=!1!==a&&!X,F=ui(I),R=n._enterCb=P((function(){L&&(ei(n,M),ei(n,T)),R.cancelled?(L&&ei(n,O),N&&N(n)):E&&E(n),n._enterCb=null}));e.data.show||jt(e,"insert",(function(){var t=n.parentNode,r=t&&t._pending&&t._pending[e.key];r&&r.tag===e.tag&&r.elm._leaveCb&&r.elm._leaveCb(),I&&I(n,R)})),j&&j(n),L&&(Qo(n,O),Qo(n,T),Xo((function(){ei(n,O),R.cancelled||(Qo(n,M),F||(li(D)?setTimeout(R,D):ti(n,c,R)))}))),e.data.show&&(t&&t(),I&&I(n,R)),L||F||R()}}}function si(e,t){var n=e.elm;o(n._enterCb)&&(n._enterCb.cancelled=!0,n._enterCb());var i=zo(e.data.transition);if(r(i)||1!==n.nodeType)return t();if(!o(n._leaveCb)){var a=i.css,c=i.type,l=i.leaveClass,u=i.leaveToClass,f=i.leaveActiveClass,d=i.beforeLeave,p=i.leave,v=i.afterLeave,m=i.leaveCancelled,g=i.delayLeave,y=i.duration,b=!1!==a&&!X,_=ui(p),w=h(s(y)?y.leave:y);o(w)&&ci(w,"leave",e);var $=n._leaveCb=P((function(){n.parentNode&&n.parentNode._pending&&(n.parentNode._pending[e.key]=null),b&&(ei(n,u),ei(n,f)),$.cancelled?(b&&ei(n,l),m&&m(n)):(t(),v&&v(n)),n._leaveCb=null}));g?g(x):x()}function x(){$.cancelled||(!e.data.show&&n.parentNode&&((n.parentNode._pending||(n.parentNode._pending={}))[e.key]=e),d&&d(n),b&&(Qo(n,l),Qo(n,f),Xo((function(){ei(n,l),$.cancelled||(Qo(n,u),_||(li(w)?setTimeout($,w):ti(n,c,$)))}))),p&&p(n,$),b||_||$())}}function ci(e,t,n){"number"!=typeof e?ue("<transition> explicit "+t+" duration is not a valid number - got "+JSON.stringify(e)+".",n.context):isNaN(e)&&ue("<transition> explicit "+t+" duration is NaN - the duration expression might be incorrect.",n.context)}function li(e){return"number"==typeof e&&!isNaN(e)}function ui(e){if(r(e))return!1;var t=e.fns;return o(t)?ui(Array.isArray(t)?t[0]:t):(e._length||e.length)>1}function fi(e,t){!0!==t.data.show&&ai(t)}var di=function(e){var t,n,s={},c=e.modules,l=e.nodeOps;for(t=0;t<Cr.length;++t)for(s[Cr[t]]=[],n=0;n<c.length;++n)o(c[n][Cr[t]])&&s[Cr[t]].push(c[n][Cr[t]]);function u(e){var t=l.parentNode(e);o(t)&&l.removeChild(t,e)}function d(e,t){return!t&&!e.ns&&!(H.ignoredElements.length&&H.ignoredElements.some((function(t){return f(t)?t.test(e.tag):t===e.tag})))&&H.isUnknownElement(e.tag)}var p=0;function v(e,t,n,r,a,c,u){if(o(e.elm)&&o(c)&&(e=c[u]=ke(e)),e.isRootInsert=!a,!function(e,t,n,r){var a=e.data;if(o(a)){var c=o(e.componentInstance)&&a.keepAlive;if(o(a=a.hook)&&o(a=a.init)&&a(e,!1),o(e.componentInstance))return h(e,t),g(n,e.elm,r),i(c)&&function(e,t,n,r){for(var i,a=e;a.componentInstance;)if(o(i=(a=a.componentInstance._vnode).data)&&o(i=i.transition)){for(i=0;i<s.activate.length;++i)s.activate[i](kr,a);t.push(a);break}g(n,e.elm,r)}(e,t,n,r),!0}}(e,t,n,r)){var f=e.data,v=e.children,m=e.tag;o(m)?(f&&f.pre&&p++,d(e,p)&&ue("Unknown custom element: <"+m+'> - did you register the component correctly? For recursive components, make sure to provide the "name" option.',e.context),e.elm=e.ns?l.createElementNS(e.ns,m):l.createElement(m,e),w(e),y(e,v,t),o(f)&&_(e,t),g(n,e.elm,r),f&&f.pre&&p--):i(e.isComment)?(e.elm=l.createComment(e.text),g(n,e.elm,r)):(e.elm=l.createTextNode(e.text),g(n,e.elm,r))}}function h(e,t){o(e.data.pendingInsert)&&(t.push.apply(t,e.data.pendingInsert),e.data.pendingInsert=null),e.elm=e.componentInstance.$el,b(e)?(_(e,t),w(e)):(Ar(e),t.push(e))}function g(e,t,n){o(e)&&(o(n)?l.parentNode(n)===e&&l.insertBefore(e,t,n):l.appendChild(e,t))}function y(e,t,n){if(Array.isArray(t)){C(t);for(var r=0;r<t.length;++r)v(t[r],n,e.elm,null,!0,t,r)}else a(e.text)&&l.appendChild(e.elm,l.createTextNode(String(e.text)))}function b(e){for(;e.componentInstance;)e=e.componentInstance._vnode;return o(e.tag)}function _(e,n){for(var r=0;r<s.create.length;++r)s.create[r](kr,e);o(t=e.data.hook)&&(o(t.create)&&t.create(kr,e),o(t.insert)&&n.push(e))}function w(e){var t;if(o(t=e.fnScopeId))l.setStyleScope(e.elm,t);else for(var n=e;n;)o(t=n.context)&&o(t=t.$options._scopeId)&&l.setStyleScope(e.elm,t),n=n.parent;o(t=_n)&&t!==e.context&&t!==e.fnContext&&o(t=t.$options._scopeId)&&l.setStyleScope(e.elm,t)}function $(e,t,n,r,o,i){for(;r<=o;++r)v(n[r],i,e,t,!1,n,r)}function x(e){var t,n,r=e.data;if(o(r))for(o(t=r.hook)&&o(t=t.destroy)&&t(e),t=0;t<s.destroy.length;++t)s.destroy[t](e);if(o(t=e.children))for(n=0;n<e.children.length;++n)x(e.children[n])}function A(e,t,n){for(;t<=n;++t){var r=e[t];o(r)&&(o(r.tag)?(k(r),x(r)):u(r.elm))}}function k(e,t){if(o(t)||o(e.data)){var n,r=s.remove.length+1;for(o(t)?t.listeners+=r:t=function(e,t){function n(){0==--n.listeners&&u(e)}return n.listeners=t,n}(e.elm,r),o(n=e.componentInstance)&&o(n=n._vnode)&&o(n.data)&&k(n,t),n=0;n<s.remove.length;++n)s.remove[n](e,t);o(n=e.data.hook)&&o(n=n.remove)?n(e,t):t()}else u(e.elm)}function C(e){for(var t={},n=0;n<e.length;n++){var r=e[n],i=r.key;o(i)&&(t[i]?ue("Duplicate keys detected: '"+i+"'. This may cause an update error.",r.context):t[i]=!0)}}function S(e,t,n,r){for(var i=n;i<r;i++){var a=t[i];if(o(a)&&Sr(e,a))return i}}function O(e,t,n){if(i(n)&&o(e.parent))e.parent.data.pendingInsert=t;else for(var r=0;r<t.length;++r)t[r].data.hook.insert(t[r])}var T=!1,M=m("attrs,class,staticClass,staticStyle,key");function j(e,t,n,r){var a,s=t.tag,c=t.data,l=t.children;if(r=r||c&&c.pre,t.elm=e,i(t.isComment)&&o(t.asyncFactory))return t.isAsyncPlaceholder=!0,!0;if(!function(e,t,n){return o(t.tag)?0===t.tag.indexOf("vue-component")||!d(t,n)&&t.tag.toLowerCase()===(e.tagName&&e.tagName.toLowerCase()):e.nodeType===(t.isComment?8:3)}(e,t,r))return!1;if(o(c)&&(o(a=c.hook)&&o(a=a.init)&&a(t,!0),o(a=t.componentInstance)))return h(t,n),!0;if(o(s)){if(o(l))if(e.hasChildNodes())if(o(a=c)&&o(a=a.domProps)&&o(a=a.innerHTML)){if(a!==e.innerHTML)return"undefined"==typeof console||T||(T=!0,console.warn("Parent: ",e),console.warn("server innerHTML: ",a),console.warn("client innerHTML: ",e.innerHTML)),!1}else{for(var u=!0,f=e.firstChild,p=0;p<l.length;p++){if(!f||!j(f,l[p],n,r)){u=!1;break}f=f.nextSibling}if(!u||f)return"undefined"==typeof console||T||(T=!0,console.warn("Parent: ",e),console.warn("Mismatching childNodes vs. VNodes: ",e.childNodes,l)),!1}else y(t,l,n);if(o(c)){var v=!1;for(var m in c)if(!M(m)){v=!0,_(t,n);break}!v&&c.class&&St(c.class)}}else e.data!==t.text&&(e.data=t.text);return!0}return function(e,t,n,a){if(!r(t)){var c,u=!1,f=[];if(r(e))u=!0,v(t,f);else{var d=o(e.nodeType);if(!d&&Sr(e,t))!function e(t,n,a,c,u,f){if(t!==n){o(n.elm)&&o(c)&&(n=c[u]=ke(n));var d=n.elm=t.elm;if(i(t.isAsyncPlaceholder))o(n.asyncFactory.resolved)?j(t.elm,n,a):n.isAsyncPlaceholder=!0;else if(i(n.isStatic)&&i(t.isStatic)&&n.key===t.key&&(i(n.isCloned)||i(n.isOnce)))n.componentInstance=t.componentInstance;else{var p,h=n.data;o(h)&&o(p=h.hook)&&o(p=p.prepatch)&&p(t,n);var m=t.children,g=n.children;if(o(h)&&b(n)){for(p=0;p<s.update.length;++p)s.update[p](t,n);o(p=h.hook)&&o(p=p.update)&&p(t,n)}r(n.text)?o(m)&&o(g)?m!==g&&function(t,n,i,a,s){var c,u,f,d=0,p=0,h=n.length-1,m=n[0],g=n[h],y=i.length-1,b=i[0],_=i[y],w=!s;for(C(i);d<=h&&p<=y;)r(m)?m=n[++d]:r(g)?g=n[--h]:Sr(m,b)?(e(m,b,a,i,p),m=n[++d],b=i[++p]):Sr(g,_)?(e(g,_,a,i,y),g=n[--h],_=i[--y]):Sr(m,_)?(e(m,_,a,i,y),w&&l.insertBefore(t,m.elm,l.nextSibling(g.elm)),m=n[++d],_=i[--y]):Sr(g,b)?(e(g,b,a,i,p),w&&l.insertBefore(t,g.elm,m.elm),g=n[--h],b=i[++p]):(r(c)&&(c=Or(n,d,h)),r(u=o(b.key)?c[b.key]:S(b,n,d,h))?v(b,a,t,m.elm,!1,i,p):Sr(f=n[u],b)?(e(f,b,a,i,p),n[u]=void 0,w&&l.insertBefore(t,f.elm,m.elm)):v(b,a,t,m.elm,!1,i,p),b=i[++p]);d>h?$(t,r(i[y+1])?null:i[y+1].elm,i,p,y,a):p>y&&A(n,d,h)}(d,m,g,a,f):o(g)?(C(g),o(t.text)&&l.setTextContent(d,""),$(d,null,g,0,g.length-1,a)):o(m)?A(m,0,m.length-1):o(t.text)&&l.setTextContent(d,""):t.text!==n.text&&l.setTextContent(d,n.text),o(h)&&o(p=h.hook)&&o(p=p.postpatch)&&p(t,n)}}}(e,t,f,null,null,a);else{if(d){if(1===e.nodeType&&e.hasAttribute("data-server-rendered")&&(e.removeAttribute("data-server-rendered"),n=!0),i(n)){if(j(e,t,f))return O(t,f,!0),e;ue("The client-side rendered virtual DOM tree is not matching server-rendered content. This is likely caused by incorrect HTML markup, for example nesting block-level elements inside <p>, or missing <tbody>. Bailing hydration and performing full client-side render.")}c=e,e=new we(l.tagName(c).toLowerCase(),{},[],void 0,c)}var p=e.elm,h=l.parentNode(p);if(v(t,f,p._leaveCb?null:h,l.nextSibling(p)),o(t.parent))for(var m=t.parent,g=b(t);m;){for(var y=0;y<s.destroy.length;++y)s.destroy[y](m);if(m.elm=t.elm,g){for(var _=0;_<s.create.length;++_)s.create[_](kr,m);var w=m.data.hook.insert;if(w.merged)for(var k=1;k<w.fns.length;k++)w.fns[k]()}else Ar(m);m=m.parent}o(h)?A([e],0,0):o(e.tag)&&x(e)}}return O(t,f,u),t.elm}o(e)&&x(e)}}({nodeOps:$r,modules:[Rr,Zr,Co,To,Ho,K?{create:fi,activate:fi,remove:function(e,t){!0!==e.data.show?si(e,t):t()}}:{}].concat(Dr)});X&&document.addEventListener("selectionchange",(function(){var e=document.activeElement;e&&e.vmodel&&_i(e,"input")}));var pi={inserted:function(e,t,n,r){"select"===n.tag?(r.elm&&!r.elm._vOptions?jt(n,"postpatch",(function(){pi.componentUpdated(e,t,n)})):vi(e,t,n.context),e._vOptions=[].map.call(e.options,gi)):("textarea"===n.tag||_r(e.type))&&(e._vModifiers=t.modifiers,t.modifiers.lazy||(e.addEventListener("compositionstart",yi),e.addEventListener("compositionend",bi),e.addEventListener("change",bi),X&&(e.vmodel=!0)))},componentUpdated:function(e,t,n){if("select"===n.tag){vi(e,t,n.context);var r=e._vOptions,o=e._vOptions=[].map.call(e.options,gi);o.some((function(e,t){return!D(e,r[t])}))&&(e.multiple?t.value.some((function(e){return mi(e,o)})):t.value!==t.oldValue&&mi(t.value,o))&&_i(e,"change")}}};function vi(e,t,n){hi(e,t,n),(Y||Q)&&setTimeout((function(){hi(e,t,n)}),0)}function hi(e,t,n){var r=t.value,o=e.multiple;if(!o||Array.isArray(r)){for(var i,a,s=0,c=e.options.length;s<c;s++)if(a=e.options[s],o)i=L(r,gi(a))>-1,a.selected!==i&&(a.selected=i);else if(D(gi(a),r))return void(e.selectedIndex!==s&&(e.selectedIndex=s));o||(e.selectedIndex=-1)}else ue('<select multiple v-model="'+t.expression+'"> expects an Array value for its binding, but got '+Object.prototype.toString.call(r).slice(8,-1),n)}function mi(e,t){return t.every((function(t){return!D(t,e)}))}function gi(e){return"_value"in e?e._value:e.value}function yi(e){e.target.composing=!0}function bi(e){e.target.composing&&(e.target.composing=!1,_i(e.target,"input"))}function _i(e,t){var n=document.createEvent("HTMLEvents");n.initEvent(t,!0,!0),e.dispatchEvent(n)}function wi(e){return!e.componentInstance||e.data&&e.data.transition?e:wi(e.componentInstance._vnode)}var $i={model:pi,show:{bind:function(e,t,n){var r=t.value,o=(n=wi(n)).data&&n.data.transition,i=e.__vOriginalDisplay="none"===e.style.display?"":e.style.display;r&&o?(n.data.show=!0,ai(n,(function(){e.style.display=i}))):e.style.display=r?i:"none"},update:function(e,t,n){var r=t.value;!r!=!t.oldValue&&((n=wi(n)).data&&n.data.transition?(n.data.show=!0,r?ai(n,(function(){e.style.display=e.__vOriginalDisplay})):si(n,(function(){e.style.display="none"}))):e.style.display=r?e.__vOriginalDisplay:"none")},unbind:function(e,t,n,r,o){o||(e.style.display=e.__vOriginalDisplay)}}},xi={name:String,appear:Boolean,css:Boolean,mode:String,type:String,enterClass:String,leaveClass:String,enterToClass:String,leaveToClass:String,enterActiveClass:String,leaveActiveClass:String,appearClass:String,appearActiveClass:String,appearToClass:String,duration:[Number,String,Object]};function Ai(e){var t=e&&e.componentOptions;return t&&t.Ctor.options.abstract?Ai(hn(t.children)):e}function ki(e){var t={},n=e.$options;for(var r in n.propsData)t[r]=e[r];var o=n._parentListeners;for(var i in o)t[A(i)]=o[i];return t}function Ci(e,t){if(/\d-keep-alive$/.test(t.tag))return e("keep-alive",{props:t.componentOptions.propsData})}var Si=function(e){return e.tag||vn(e)},Oi=function(e){return"show"===e.name},Ti={name:"transition",props:xi,abstract:!0,render:function(e){var t=this,n=this.$slots.default;if(n&&(n=n.filter(Si)).length){n.length>1&&ue("<transition> can only be used on a single element. Use <transition-group> for lists.",this.$parent);var r=this.mode;r&&"in-out"!==r&&"out-in"!==r&&ue("invalid <transition> mode: "+r,this.$parent);var o=n[0];if(function(e){for(;e=e.parent;)if(e.data.transition)return!0}(this.$vnode))return o;var i=Ai(o);if(!i)return o;if(this._leaving)return Ci(e,o);var s="__transition-"+this._uid+"-";i.key=null==i.key?i.isComment?s+"comment":s+i.tag:a(i.key)?0===String(i.key).indexOf(s)?i.key:s+i.key:i.key;var c=(i.data||(i.data={})).transition=ki(this),l=this._vnode,u=Ai(l);if(i.data.directives&&i.data.directives.some(Oi)&&(i.data.show=!0),u&&u.data&&!function(e,t){return t.key===e.key&&t.tag===e.tag}(i,u)&&!vn(u)&&(!u.componentInstance||!u.componentInstance._vnode.isComment)){var f=u.data.transition=M({},c);if("out-in"===r)return this._leaving=!0,jt(f,"afterLeave",(function(){t._leaving=!1,t.$forceUpdate()})),Ci(e,o);if("in-out"===r){if(vn(i))return l;var d,p=function(){d()};jt(c,"afterEnter",p),jt(c,"enterCancelled",p),jt(f,"delayLeave",(function(e){d=e}))}}return o}}},Mi=M({tag:String,moveClass:String},xi);function ji(e){e.elm._moveCb&&e.elm._moveCb(),e.elm._enterCb&&e.elm._enterCb()}function Ii(e){e.data.newPos=e.elm.getBoundingClientRect()}function Ei(e){var t=e.data.pos,n=e.data.newPos,r=t.left-n.left,o=t.top-n.top;if(r||o){e.data.moved=!0;var i=e.elm.style;i.transform=i.WebkitTransform="translate("+r+"px,"+o+"px)",i.transitionDuration="0s"}}delete Mi.mode;var Ni={Transition:Ti,TransitionGroup:{props:Mi,beforeMount:function(){var e=this,t=this._update;this._update=function(n,r){var o=$n(e);e.__patch__(e._vnode,e.kept,!1,!0),e._vnode=e.kept,o(),t.call(e,n,r)}},render:function(e){for(var t=this.tag||this.$vnode.data.tag||"span",n=Object.create(null),r=this.prevChildren=this.children,o=this.$slots.default||[],i=this.children=[],a=ki(this),s=0;s<o.length;s++){var c=o[s];if(c.tag)if(null!=c.key&&0!==String(c.key).indexOf("__vlist"))i.push(c),n[c.key]=c,(c.data||(c.data={})).transition=a;else{var l=c.componentOptions,u=l?l.Ctor.options.name||l.tag||"":c.tag;ue("<transition-group> children must be keyed: <"+u+">")}}if(r){for(var f=[],d=[],p=0;p<r.length;p++){var v=r[p];v.data.transition=a,v.data.pos=v.elm.getBoundingClientRect(),n[v.key]?f.push(v):d.push(v)}this.kept=e(t,null,f),this.removed=d}return e(t,null,i)},updated:function(){var e=this.prevChildren,t=this.moveClass||(this.name||"v")+"-move";e.length&&this.hasMove(e[0].elm,t)&&(e.forEach(ji),e.forEach(Ii),e.forEach(Ei),this._reflow=document.body.offsetHeight,e.forEach((function(e){if(e.data.moved){var n=e.elm,r=n.style;Qo(n,t),r.transform=r.WebkitTransform=r.transitionDuration="",n.addEventListener(Wo,n._moveCb=function e(r){r&&r.target!==n||r&&!/transform$/.test(r.propertyName)||(n.removeEventListener(Wo,e),n._moveCb=null,ei(n,t))})}})))},methods:{hasMove:function(e,t){if(!Jo)return!1;if(this._hasMove)return this._hasMove;var n=e.cloneNode();e._transitionClasses&&e._transitionClasses.forEach((function(e){Bo(n,e)})),Vo(n,t),n.style.display="none",this.$el.appendChild(n);var r=ri(n);return this.$el.removeChild(n),this._hasMove=r.hasTransform}}}};Wn.config.mustUseProp=rr,Wn.config.isReservedTag=gr,Wn.config.isReservedAttr=tr,Wn.config.getTagNamespace=yr,Wn.config.isUnknownElement=function(e){if(!K)return!0;if(gr(e))return!1;if(e=e.toLowerCase(),null!=br[e])return br[e];var t=document.createElement(e);return e.indexOf("-")>-1?br[e]=t.constructor===window.HTMLUnknownElement||t.constructor===window.HTMLElement:br[e]=/HTMLUnknownElement/.test(t.toString())},M(Wn.options.directives,$i),M(Wn.options.components,Ni),Wn.prototype.__patch__=K?di:I,Wn.prototype.$mount=function(e,t){return function(e,t,n){var r;return e.$el=t,e.$options.render||(e.$options.render=xe,e.$options.template&&"#"!==e.$options.template.charAt(0)||e.$options.el||t?ue("You are using the runtime-only build of Vue where the template compiler is not available. Either pre-compile the templates into render functions, or use the compiler-included build.",e):ue("Failed to mount component: template or render function not defined.",e)),kn(e,"beforeMount"),r=H.performance&&at?function(){var t=e._name,r=e._uid,o="vue-perf-start:"+r,i="vue-perf-end:"+r;at(o);var a=e._render();at(i),st("vue "+t+" render",o,i),at(o),e._update(a,n),at(i),st("vue "+t+" patch",o,i)}:function(){e._update(e._render(),n)},new Fn(e,r,I,{before:function(){e._isMounted&&!e._isDestroyed&&kn(e,"beforeUpdate")}},!0),n=!1,null==e.$vnode&&(e._isMounted=!0,kn(e,"mounted")),e}(this,e=e&&K?wr(e):void 0,t)},K&&setTimeout((function(){H.devtools&&(ae?ae.emit("init",Wn):console[console.info?"info":"log"]("Download the Vue Devtools extension for a better development experience:\nhttps://github.com/vuejs/vue-devtools")),!1!==H.productionTip&&"undefined"!=typeof console&&console[console.info?"info":"log"]("You are running Vue in development mode.\nMake sure to turn on production mode when deploying for production.\nSee more tips at https://vuejs.org/guide/deployment.html")}),0);var Di=/\{\{((?:.|\r?\n)+?)\}\}/g,Li=/[-.*+?^${}()|[\]\/\\]/g,Pi=$((function(e){var t=e[0].replace(Li,"\\$&"),n=e[1].replace(Li,"\\$&");return new RegExp(t+"((?:.|\\n)+?)"+n,"g")}));function Fi(e,t){var n=t?Pi(t):Di;if(n.test(e)){for(var r,o,i,a=[],s=[],c=n.lastIndex=0;r=n.exec(e);){(o=r.index)>c&&(s.push(i=e.slice(c,o)),a.push(JSON.stringify(i)));var l=Yr(r[1].trim());a.push("_s("+l+")"),s.push({"@binding":l}),c=o+r[0].length}return c<e.length&&(s.push(i=e.slice(c)),a.push(JSON.stringify(i))),{expression:a.join("+"),tokens:s}}}var Ri,Hi={staticKeys:["staticClass"],transformNode:function(e,t){var n=t.warn||Qr,r=lo(e,"class");r&&Fi(r,t.delimiters)&&n('class="'+r+'": Interpolation inside attributes has been removed. Use v-bind or the colon shorthand instead. For example, instead of <div class="{{ val }}">, use <div :class="val">.',e.rawAttrsMap.class),r&&(e.staticClass=JSON.stringify(r));var o=co(e,"class",!1);o&&(e.classBinding=o)},genData:function(e){var t="";return e.staticClass&&(t+="staticClass:"+e.staticClass+","),e.classBinding&&(t+="class:"+e.classBinding+","),t}},Ui={staticKeys:["staticStyle"],transformNode:function(e,t){var n=t.warn||Qr,r=lo(e,"style");r&&(Fi(r,t.delimiters)&&n('style="'+r+'": Interpolation inside attributes has been removed. Use v-bind or the colon shorthand instead. For example, instead of <div style="{{ val }}">, use <div :style="val">.',e.rawAttrsMap.style),e.staticStyle=JSON.stringify(Mo(r)));var o=co(e,"style",!1);o&&(e.styleBinding=o)},genData:function(e){var t="";return e.staticStyle&&(t+="staticStyle:"+e.staticStyle+","),e.styleBinding&&(t+="style:("+e.styleBinding+"),"),t}},Vi=m("area,base,br,col,embed,frame,hr,img,input,isindex,keygen,link,meta,param,source,track,wbr"),Bi=m("colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr,source"),zi=m("address,article,aside,base,blockquote,body,caption,col,colgroup,dd,details,dialog,div,dl,dt,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,head,header,hgroup,hr,html,legend,li,menuitem,meta,optgroup,option,param,rp,rt,source,style,summary,tbody,td,tfoot,th,thead,title,tr,track"),qi=/^\s*([^\s"'<>\/=]+)(?:\s*(=)\s*(?:"([^"]*)"+|'([^']*)'+|([^\s"'=<>`]+)))?/,Ji=/^\s*((?:v-[\w-]+:|@|:|#)\[[^=]+\][^\s"'<>\/=]*)(?:\s*(=)\s*(?:"([^"]*)"+|'([^']*)'+|([^\s"'=<>`]+)))?/,Ki="[a-zA-Z_][\\-\\.0-9_a-zA-Z"+U.source+"]*",Wi="((?:"+Ki+"\\:)?"+Ki+")",Zi=new RegExp("^<"+Wi),Gi=/^\s*(\/?)>/,Yi=new RegExp("^<\\/"+Wi+"[^>]*>"),Xi=/^<!DOCTYPE [^>]+>/i,Qi=/^<!\--/,ea=/^<!\[/,ta=m("script,style,textarea",!0),na={},ra={"&lt;":"<","&gt;":">","&quot;":'"',"&amp;":"&","&#10;":"\n","&#9;":"\t","&#39;":"'"},oa=/&(?:lt|gt|quot|amp|#39);/g,ia=/&(?:lt|gt|quot|amp|#39|#10|#9);/g,aa=m("pre,textarea",!0),sa=function(e,t){return e&&aa(e)&&"\n"===t[0]};function ca(e,t){var n=t?ia:oa;return e.replace(n,(function(e){return ra[e]}))}var la,ua,fa,da,pa,va,ha,ma,ga,ya=/^@|^v-on:/,ba=/^v-|^@|^:|^#/,_a=/([\s\S]*?)\s+(?:in|of)\s+([\s\S]*)/,wa=/,([^,\}\]]*)(?:,([^,\}\]]*))?$/,$a=/^\(|\)$/g,xa=/^\[.*\]$/,Aa=/:(.*)$/,ka=/^:|^\.|^v-bind:/,Ca=/\.[^.\]]+(?=[^\]]*$)/g,Sa=/^v-slot(:|$)|^#/,Oa=/[\r\n]/,Ta=/\s+/g,Ma=/[\s"'<>\/=]/,ja=$((function(e){return(Ri=Ri||document.createElement("div")).innerHTML=e,Ri.textContent}));function Ia(e,t,n){return{type:1,tag:e,attrsList:t,attrsMap:Fa(t),rawAttrsMap:{},parent:n,children:[]}}function Ea(e,t){var n;!function(e){var t=co(e,"key");if(t){if("template"===e.tag&&la("<template> cannot be keyed. Place the key on real elements instead.",so(e,"key")),e.for){var n=e.iterator2||e.iterator1,r=e.parent;n&&n===t&&r&&"transition-group"===r.tag&&la("Do not use v-for index as key on <transition-group> children, this is the same as not using keys.",so(e,"key"),!0)}e.key=t}}(e),e.plain=!e.key&&!e.scopedSlots&&!e.attrsList.length,function(e){var t=co(e,"ref");t&&(e.ref=t,e.refInFor=function(e){for(var t=e;t;){if(void 0!==t.for)return!0;t=t.parent}return!1}(e))}(e),function(e){var t;"template"===e.tag?((t=lo(e,"scope"))&&la('the "scope" attribute for scoped slots have been deprecated and replaced by "slot-scope" since 2.5. The new "slot-scope" attribute can also be used on plain elements in addition to <template> to denote scoped slots.',e.rawAttrsMap.scope,!0),e.slotScope=t||lo(e,"slot-scope")):(t=lo(e,"slot-scope"))&&(e.attrsMap["v-for"]&&la("Ambiguous combined usage of slot-scope and v-for on <"+e.tag+"> (v-for takes higher priority). Use a wrapper <template> for the scoped slot to make it clearer.",e.rawAttrsMap["slot-scope"],!0),e.slotScope=t);var n=co(e,"slot");if(n&&(e.slotTarget='""'===n?'"default"':n,e.slotTargetDynamic=!(!e.attrsMap[":slot"]&&!e.attrsMap["v-bind:slot"]),"template"===e.tag||e.slotScope||no(e,"slot",n,so(e,"slot"))),"template"===e.tag){var r=uo(e,Sa);if(r){(e.slotTarget||e.slotScope)&&la("Unexpected mixed usage of different slot syntaxes.",e),e.parent&&!ga(e.parent)&&la("<template v-slot> can only appear at the root level inside the receiving component",e);var o=La(r),i=o.name,a=o.dynamic;e.slotTarget=i,e.slotTargetDynamic=a,e.slotScope=r.value||"_empty_"}}else{var s=uo(e,Sa);if(s){ga(e)||la("v-slot can only be used on components or <template>.",s),(e.slotScope||e.slotTarget)&&la("Unexpected mixed usage of different slot syntaxes.",e),e.scopedSlots&&la("To avoid scope ambiguity, the default slot should also use <template> syntax when there are other named slots.",s);var c=e.scopedSlots||(e.scopedSlots={}),l=La(s),u=l.name,f=l.dynamic,d=c[u]=Ia("template",[],e);d.slotTarget=u,d.slotTargetDynamic=f,d.children=e.children.filter((function(e){if(!e.slotScope)return e.parent=d,!0})),d.slotScope=s.value||"_empty_",e.children=[],e.plain=!1}}}(e),"slot"===(n=e).tag&&(n.slotName=co(n,"name"),n.key&&la("`key` does not work on <slot> because slots are abstract outlets and can possibly expand into multiple elements. Use the key on a wrapping element instead.",so(n,"key"))),function(e){var t;(t=co(e,"is"))&&(e.component=t),null!=lo(e,"inline-template")&&(e.inlineTemplate=!0)}(e);for(var r=0;r<fa.length;r++)e=fa[r](e,t)||e;return function(e){var t,n,r,o,i,a,s,c,l=e.attrsList;for(t=0,n=l.length;t<n;t++)if(r=o=l[t].name,i=l[t].value,ba.test(r))if(e.hasBindings=!0,(a=Pa(r.replace(ba,"")))&&(r=r.replace(Ca,"")),ka.test(r))r=r.replace(ka,""),i=Yr(i),(c=xa.test(r))&&(r=r.slice(1,-1)),0===i.trim().length&&la('The value for a v-bind expression cannot be empty. Found in "v-bind:'+r+'"'),a&&(a.prop&&!c&&"innerHtml"===(r=A(r))&&(r="innerHTML"),a.camel&&!c&&(r=A(r)),a.sync&&(s=vo(i,"$event"),c?ao(e,'"update:"+('+r+")",s,null,!1,la,l[t],!0):(ao(e,"update:"+A(r),s,null,!1,la,l[t]),S(r)!==A(r)&&ao(e,"update:"+S(r),s,null,!1,la,l[t])))),a&&a.prop||!e.component&&ha(e.tag,e.attrsMap.type,r)?to(e,r,i,l[t],c):no(e,r,i,l[t],c);else if(ya.test(r))r=r.replace(ya,""),(c=xa.test(r))&&(r=r.slice(1,-1)),ao(e,r,i,a,!1,la,l[t],c);else{var u=(r=r.replace(ba,"")).match(Aa),f=u&&u[1];c=!1,f&&(r=r.slice(0,-(f.length+1)),xa.test(f)&&(f=f.slice(1,-1),c=!0)),oo(e,r,o,i,f,c,a,l[t]),"model"===r&&Ua(e,i)}else Fi(i,ua)&&la(r+'="'+i+'": Interpolation inside attributes has been removed. Use v-bind or the colon shorthand instead. For example, instead of <div id="{{ val }}">, use <div :id="val">.',l[t]),no(e,r,JSON.stringify(i),l[t]),!e.component&&"muted"===r&&ha(e.tag,e.attrsMap.type,r)&&to(e,r,"true",l[t])}(e),e}function Na(e){var t;if(t=lo(e,"v-for")){var n=function(e){var t=e.match(_a);if(t){var n={};n.for=t[2].trim();var r=t[1].trim().replace($a,""),o=r.match(wa);return o?(n.alias=r.replace(wa,"").trim(),n.iterator1=o[1].trim(),o[2]&&(n.iterator2=o[2].trim())):n.alias=r,n}}(t);n?M(e,n):la("Invalid v-for expression: "+t,e.rawAttrsMap["v-for"])}}function Da(e,t){e.ifConditions||(e.ifConditions=[]),e.ifConditions.push(t)}function La(e){var t=e.name.replace(Sa,"");return t||("#"!==e.name[0]?t="default":la("v-slot shorthand syntax requires a slot name.",e)),xa.test(t)?{name:t.slice(1,-1),dynamic:!0}:{name:'"'+t+'"',dynamic:!1}}function Pa(e){var t=e.match(Ca);if(t){var n={};return t.forEach((function(e){n[e.slice(1)]=!0})),n}}function Fa(e){for(var t={},n=0,r=e.length;n<r;n++)!t[e[n].name]||Y||Q||la("duplicate attribute: "+e[n].name,e[n]),t[e[n].name]=e[n].value;return t}var Ra=/^xmlns:NS\d+/,Ha=/^NS\d+:/;function Ua(e,t){for(var n=e;n;)n.for&&n.alias===t&&la("<"+e.tag+' v-model="'+t+'">: You are binding v-model directly to a v-for iteration alias. This will not be able to modify the v-for source array because writing to the alias is like modifying a function local variable. Consider using an array of objects and use v-model on an object property instead.',e.rawAttrsMap["v-model"]),n=n.parent}function Va(e){return Ia(e.tag,e.attrsList.slice(),e.parent)}var Ba,za,qa,Ja=[Hi,Ui,{preTransformNode:function(e,t){if("input"===e.tag){var n,r=e.attrsMap;if(!r["v-model"])return;if((r[":type"]||r["v-bind:type"])&&(n=co(e,"type")),r.type||n||!r["v-bind"]||(n="("+r["v-bind"]+").type"),n){var o=lo(e,"v-if",!0),i=o?"&&("+o+")":"",a=null!=lo(e,"v-else",!0),s=lo(e,"v-else-if",!0),c=Va(e);Na(c),ro(c,"type","checkbox"),Ea(c,t),c.processed=!0,c.if="("+n+")==='checkbox'"+i,Da(c,{exp:c.if,block:c});var l=Va(e);lo(l,"v-for",!0),ro(l,"type","radio"),Ea(l,t),Da(c,{exp:"("+n+")==='radio'"+i,block:l});var u=Va(e);return lo(u,"v-for",!0),ro(u,":type",n),Ea(u,t),Da(c,{exp:o,block:u}),a?c.else=!0:s&&(c.elseif=s),c}}}}],Ka={expectHTML:!0,modules:Ja,directives:{model:function(e,t,n){Kr=n;var r=t.value,o=t.modifiers,i=e.tag,a=e.attrsMap.type;if("input"===i&&"file"===a&&Kr("<"+e.tag+' v-model="'+r+'" type="file">:\nFile inputs are read only. Use a v-on:change listener instead.',e.rawAttrsMap["v-model"]),e.component)return po(e,r,o),!1;if("select"===i)!function(e,t,n){var r='var $$selectedVal = Array.prototype.filter.call($event.target.options,function(o){return o.selected}).map(function(o){var val = "_value" in o ? o._value : o.value;return '+(n&&n.number?"_n(val)":"val")+"});";ao(e,"change",r=r+" "+vo(t,"$event.target.multiple ? $$selectedVal : $$selectedVal[0]"),null,!0)}(e,r,o);else if("input"===i&&"checkbox"===a)!function(e,t,n){var r=n&&n.number,o=co(e,"value")||"null",i=co(e,"true-value")||"true",a=co(e,"false-value")||"false";to(e,"checked","Array.isArray("+t+")?_i("+t+","+o+")>-1"+("true"===i?":("+t+")":":_q("+t+","+i+")")),ao(e,"change","var $$a="+t+",$$el=$event.target,$$c=$$el.checked?("+i+"):("+a+");if(Array.isArray($$a)){var $$v="+(r?"_n("+o+")":o)+",$$i=_i($$a,$$v);if($$el.checked){$$i<0&&("+vo(t,"$$a.concat([$$v])")+")}else{$$i>-1&&("+vo(t,"$$a.slice(0,$$i).concat($$a.slice($$i+1))")+")}}else{"+vo(t,"$$c")+"}",null,!0)}(e,r,o);else if("input"===i&&"radio"===a)!function(e,t,n){var r=n&&n.number,o=co(e,"value")||"null";to(e,"checked","_q("+t+","+(o=r?"_n("+o+")":o)+")"),ao(e,"change",vo(t,o),null,!0)}(e,r,o);else if("input"===i||"textarea"===i)!function(e,t,n){var r=e.attrsMap.type,o=e.attrsMap["v-bind:value"]||e.attrsMap[":value"],i=e.attrsMap["v-bind:type"]||e.attrsMap[":type"];if(o&&!i){var a=e.attrsMap["v-bind:value"]?"v-bind:value":":value";Kr(a+'="'+o+'" conflicts with v-model on the same element because the latter already expands to a value binding internally',e.rawAttrsMap[a])}var s=n||{},c=s.lazy,l=s.number,u=s.trim,f=!c&&"range"!==r,d=c?"change":"range"===r?"__r":"input",p="$event.target.value";u&&(p="$event.target.value.trim()"),l&&(p="_n("+p+")");var v=vo(t,p);f&&(v="if($event.target.composing)return;"+v),to(e,"value","("+t+")"),ao(e,d,v,null,!0),(u||l)&&ao(e,"blur","$forceUpdate()")}(e,r,o);else{if(!H.isReservedTag(i))return po(e,r,o),!1;Kr("<"+e.tag+' v-model="'+r+"\">: v-model is not supported on this element type. If you are working with contenteditable, it's recommended to wrap a library dedicated for that purpose inside a custom component.",e.rawAttrsMap["v-model"])}return!0},text:function(e,t){t.value&&to(e,"textContent","_s("+t.value+")",t)},html:function(e,t){t.value&&to(e,"innerHTML","_s("+t.value+")",t)}},isPreTag:function(e){return"pre"===e},isUnaryTag:Vi,mustUseProp:rr,canBeLeftOpenTag:Bi,isReservedTag:gr,getTagNamespace:yr,staticKeys:(qa=Ja,qa.reduce((function(e,t){return e.concat(t.staticKeys||[])}),[]).join(","))},Wa=$((function(e){return m("type,tag,attrsList,attrsMap,plain,parent,children,attrs,start,end,rawAttrsMap"+(e?","+e:""))}));var Za=/^([\w$_]+|\([^)]*?\))\s*=>|^function(?:\s+[\w$]+)?\s*\(/,Ga=/\([^)]*?\);*$/,Ya=/^[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*|\['[^']*?']|\["[^"]*?"]|\[\d+]|\[[A-Za-z_$][\w$]*])*$/,Xa={esc:27,tab:9,enter:13,space:32,up:38,left:37,right:39,down:40,delete:[8,46]},Qa={esc:["Esc","Escape"],tab:"Tab",enter:"Enter",space:[" ","Spacebar"],up:["Up","ArrowUp"],left:["Left","ArrowLeft"],right:["Right","ArrowRight"],down:["Down","ArrowDown"],delete:["Backspace","Delete","Del"]},es=function(e){return"if("+e+")return null;"},ts={stop:"$event.stopPropagation();",prevent:"$event.preventDefault();",self:es("$event.target !== $event.currentTarget"),ctrl:es("!$event.ctrlKey"),shift:es("!$event.shiftKey"),alt:es("!$event.altKey"),meta:es("!$event.metaKey"),left:es("'button' in $event && $event.button !== 0"),middle:es("'button' in $event && $event.button !== 1"),right:es("'button' in $event && $event.button !== 2")};function ns(e,t){var n=t?"nativeOn:":"on:",r="",o="";for(var i in e){var a=rs(e[i]);e[i]&&e[i].dynamic?o+=i+","+a+",":r+='"'+i+'":'+a+","}return r="{"+r.slice(0,-1)+"}",o?n+"_d("+r+",["+o.slice(0,-1)+"])":n+r}function rs(e){if(!e)return"function(){}";if(Array.isArray(e))return"["+e.map((function(e){return rs(e)})).join(",")+"]";var t=Ya.test(e.value),n=Za.test(e.value),r=Ya.test(e.value.replace(Ga,""));if(e.modifiers){var o="",i="",a=[];for(var s in e.modifiers)if(ts[s])i+=ts[s],Xa[s]&&a.push(s);else if("exact"===s){var c=e.modifiers;i+=es(["ctrl","shift","alt","meta"].filter((function(e){return!c[e]})).map((function(e){return"$event."+e+"Key"})).join("||"))}else a.push(s);return a.length&&(o+=function(e){return"if(!$event.type.indexOf('key')&&"+e.map(os).join("&&")+")return null;"}(a)),i&&(o+=i),"function($event){"+o+(t?"return "+e.value+"($event)":n?"return ("+e.value+")($event)":r?"return "+e.value:e.value)+"}"}return t||n?e.value:"function($event){"+(r?"return "+e.value:e.value)+"}"}function os(e){var t=parseInt(e,10);if(t)return"$event.keyCode!=="+t;var n=Xa[e],r=Qa[e];return"_k($event.keyCode,"+JSON.stringify(e)+","+JSON.stringify(n)+",$event.key,"+JSON.stringify(r)+")"}var is={on:function(e,t){t.modifiers&&ue("v-on without argument does not support modifiers."),e.wrapListeners=function(e){return"_g("+e+","+t.value+")"}},bind:function(e,t){e.wrapData=function(n){return"_b("+n+",'"+e.tag+"',"+t.value+","+(t.modifiers&&t.modifiers.prop?"true":"false")+(t.modifiers&&t.modifiers.sync?",true":"")+")"}},cloak:I},as=function(e){this.options=e,this.warn=e.warn||Qr,this.transforms=eo(e.modules,"transformCode"),this.dataGenFns=eo(e.modules,"genData"),this.directives=M(M({},is),e.directives);var t=e.isReservedTag||E;this.maybeComponent=function(e){return!!e.component||!t(e.tag)},this.onceId=0,this.staticRenderFns=[],this.pre=!1};function ss(e,t){var n=new as(t);return{render:"with(this){return "+(e?cs(e,n):'_c("div")')+"}",staticRenderFns:n.staticRenderFns}}function cs(e,t){if(e.parent&&(e.pre=e.pre||e.parent.pre),e.staticRoot&&!e.staticProcessed)return ls(e,t);if(e.once&&!e.onceProcessed)return us(e,t);if(e.for&&!e.forProcessed)return ds(e,t);if(e.if&&!e.ifProcessed)return fs(e,t);if("template"!==e.tag||e.slotTarget||t.pre){if("slot"===e.tag)return function(e,t){var n=e.slotName||'"default"',r=ms(e,t),o="_t("+n+(r?","+r:""),i=e.attrs||e.dynamicAttrs?bs((e.attrs||[]).concat(e.dynamicAttrs||[]).map((function(e){return{name:A(e.name),value:e.value,dynamic:e.dynamic}}))):null,a=e.attrsMap["v-bind"];return!i&&!a||r||(o+=",null"),i&&(o+=","+i),a&&(o+=(i?"":",null")+","+a),o+")"}(e,t);var n;if(e.component)n=function(e,t,n){var r=t.inlineTemplate?null:ms(t,n,!0);return"_c("+e+","+ps(t,n)+(r?","+r:"")+")"}(e.component,e,t);else{var r;(!e.plain||e.pre&&t.maybeComponent(e))&&(r=ps(e,t));var o=e.inlineTemplate?null:ms(e,t,!0);n="_c('"+e.tag+"'"+(r?","+r:"")+(o?","+o:"")+")"}for(var i=0;i<t.transforms.length;i++)n=t.transforms[i](e,n);return n}return ms(e,t)||"void 0"}function ls(e,t){e.staticProcessed=!0;var n=t.pre;return e.pre&&(t.pre=e.pre),t.staticRenderFns.push("with(this){return "+cs(e,t)+"}"),t.pre=n,"_m("+(t.staticRenderFns.length-1)+(e.staticInFor?",true":"")+")"}function us(e,t){if(e.onceProcessed=!0,e.if&&!e.ifProcessed)return fs(e,t);if(e.staticInFor){for(var n="",r=e.parent;r;){if(r.for){n=r.key;break}r=r.parent}return n?"_o("+cs(e,t)+","+t.onceId+++","+n+")":(t.warn("v-once can only be used inside v-for that is keyed. ",e.rawAttrsMap["v-once"]),cs(e,t))}return ls(e,t)}function fs(e,t,n,r){return e.ifProcessed=!0,function e(t,n,r,o){if(!t.length)return o||"_e()";var i=t.shift();return i.exp?"("+i.exp+")?"+a(i.block)+":"+e(t,n,r,o):""+a(i.block);function a(e){return r?r(e,n):e.once?us(e,n):cs(e,n)}}(e.ifConditions.slice(),t,n,r)}function ds(e,t,n,r){var o=e.for,i=e.alias,a=e.iterator1?","+e.iterator1:"",s=e.iterator2?","+e.iterator2:"";return t.maybeComponent(e)&&"slot"!==e.tag&&"template"!==e.tag&&!e.key&&t.warn("<"+e.tag+' v-for="'+i+" in "+o+'">: component lists rendered with v-for should have explicit keys. See https://vuejs.org/guide/list.html#key for more info.',e.rawAttrsMap["v-for"],!0),e.forProcessed=!0,(r||"_l")+"(("+o+"),function("+i+a+s+"){return "+(n||cs)(e,t)+"})"}function ps(e,t){var n="{",r=function(e,t){var n=e.directives;if(n){var r,o,i,a,s="directives:[",c=!1;for(r=0,o=n.length;r<o;r++){i=n[r],a=!0;var l=t.directives[i.name];l&&(a=!!l(e,i,t.warn)),a&&(c=!0,s+='{name:"'+i.name+'",rawName:"'+i.rawName+'"'+(i.value?",value:("+i.value+"),expression:"+JSON.stringify(i.value):"")+(i.arg?",arg:"+(i.isDynamicArg?i.arg:'"'+i.arg+'"'):"")+(i.modifiers?",modifiers:"+JSON.stringify(i.modifiers):"")+"},")}return c?s.slice(0,-1)+"]":void 0}}(e,t);r&&(n+=r+","),e.key&&(n+="key:"+e.key+","),e.ref&&(n+="ref:"+e.ref+","),e.refInFor&&(n+="refInFor:true,"),e.pre&&(n+="pre:true,"),e.component&&(n+='tag:"'+e.tag+'",');for(var o=0;o<t.dataGenFns.length;o++)n+=t.dataGenFns[o](e);if(e.attrs&&(n+="attrs:"+bs(e.attrs)+","),e.props&&(n+="domProps:"+bs(e.props)+","),e.events&&(n+=ns(e.events,!1)+","),e.nativeEvents&&(n+=ns(e.nativeEvents,!0)+","),e.slotTarget&&!e.slotScope&&(n+="slot:"+e.slotTarget+","),e.scopedSlots&&(n+=function(e,t,n){var r=e.for||Object.keys(t).some((function(e){var n=t[e];return n.slotTargetDynamic||n.if||n.for||vs(n)})),o=!!e.if;if(!r)for(var i=e.parent;i;){if(i.slotScope&&"_empty_"!==i.slotScope||i.for){r=!0;break}i.if&&(o=!0),i=i.parent}var a=Object.keys(t).map((function(e){return hs(t[e],n)})).join(",");return"scopedSlots:_u(["+a+"]"+(r?",null,true":"")+(!r&&o?",null,false,"+function(e){for(var t=5381,n=e.length;n;)t=33*t^e.charCodeAt(--n);return t>>>0}(a):"")+")"}(e,e.scopedSlots,t)+","),e.model&&(n+="model:{value:"+e.model.value+",callback:"+e.model.callback+",expression:"+e.model.expression+"},"),e.inlineTemplate){var i=function(e,t){var n=e.children[0];if(1===e.children.length&&1===n.type||t.warn("Inline-template components must have exactly one child element.",{start:e.start}),n&&1===n.type){var r=ss(n,t.options);return"inlineTemplate:{render:function(){"+r.render+"},staticRenderFns:["+r.staticRenderFns.map((function(e){return"function(){"+e+"}"})).join(",")+"]}"}}(e,t);i&&(n+=i+",")}return n=n.replace(/,$/,"")+"}",e.dynamicAttrs&&(n="_b("+n+',"'+e.tag+'",'+bs(e.dynamicAttrs)+")"),e.wrapData&&(n=e.wrapData(n)),e.wrapListeners&&(n=e.wrapListeners(n)),n}function vs(e){return 1===e.type&&("slot"===e.tag||e.children.some(vs))}function hs(e,t){var n=e.attrsMap["slot-scope"];if(e.if&&!e.ifProcessed&&!n)return fs(e,t,hs,"null");if(e.for&&!e.forProcessed)return ds(e,t,hs);var r="_empty_"===e.slotScope?"":String(e.slotScope),o="function("+r+"){return "+("template"===e.tag?e.if&&n?"("+e.if+")?"+(ms(e,t)||"undefined")+":undefined":ms(e,t)||"undefined":cs(e,t))+"}",i=r?"":",proxy:true";return"{key:"+(e.slotTarget||'"default"')+",fn:"+o+i+"}"}function ms(e,t,n,r,o){var i=e.children;if(i.length){var a=i[0];if(1===i.length&&a.for&&"template"!==a.tag&&"slot"!==a.tag){var s=n?t.maybeComponent(a)?",1":",0":"";return""+(r||cs)(a,t)+s}var c=n?function(e,t){for(var n=0,r=0;r<e.length;r++){var o=e[r];if(1===o.type){if(gs(o)||o.ifConditions&&o.ifConditions.some((function(e){return gs(e.block)}))){n=2;break}(t(o)||o.ifConditions&&o.ifConditions.some((function(e){return t(e.block)})))&&(n=1)}}return n}(i,t.maybeComponent):0,l=o||ys;return"["+i.map((function(e){return l(e,t)})).join(",")+"]"+(c?","+c:"")}}function gs(e){return void 0!==e.for||"template"===e.tag||"slot"===e.tag}function ys(e,t){return 1===e.type?cs(e,t):3===e.type&&e.isComment?function(e){return"_e("+JSON.stringify(e.text)+")"}(e):"_v("+(2===(n=e).type?n.expression:_s(JSON.stringify(n.text)))+")";var n}function bs(e){for(var t="",n="",r=0;r<e.length;r++){var o=e[r],i=_s(o.value);o.dynamic?n+=o.name+","+i+",":t+='"'+o.name+'":'+i+","}return t="{"+t.slice(0,-1)+"}",n?"_d("+t+",["+n.slice(0,-1)+"])":t}function _s(e){return e.replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029")}var ws=new RegExp("\\b"+"do,if,for,let,new,try,var,case,else,with,await,break,catch,class,const,super,throw,while,yield,delete,export,import,return,switch,default,extends,finally,continue,debugger,function,arguments".split(",").join("\\b|\\b")+"\\b"),$s=new RegExp("\\b"+"delete,typeof,void".split(",").join("\\s*\\([^\\)]*\\)|\\b")+"\\s*\\([^\\)]*\\)"),xs=/'(?:[^'\\]|\\.)*'|"(?:[^"\\]|\\.)*"|`(?:[^`\\]|\\.)*\$\{|\}(?:[^`\\]|\\.)*`|`(?:[^`\\]|\\.)*`/g;function As(e,t,n,r){var o=e.replace(xs,""),i=o.match($s);i&&"$"!==o.charAt(i.index-1)&&n('avoid using JavaScript unary operator as property name: "'+i[0]+'" in expression '+t.trim(),r),Ss(e,t,n,r)}function ks(e,t,n,r){Ss(e.for||"",t,n,r),Cs(e.alias,"v-for alias",t,n,r),Cs(e.iterator1,"v-for iterator",t,n,r),Cs(e.iterator2,"v-for iterator",t,n,r)}function Cs(e,t,n,r,o){if("string"==typeof e)try{new Function("var "+e+"=_")}catch(i){r("invalid "+t+' "'+e+'" in expression: '+n.trim(),o)}}function Ss(e,t,n,r){try{new Function("return "+e)}catch(i){var o=e.replace(xs,"").match(ws);n(o?'avoid using JavaScript keyword as property name: "'+o[0]+'"\n Raw expression: '+t.trim():"invalid expression: "+i.message+" in\n\n "+e+"\n\n Raw expression: "+t.trim()+"\n",r)}}function Os(e,t,n,r){try{new Function(e,"")}catch(o){n("invalid function parameter expression: "+o.message+" in\n\n "+e+"\n\n Raw expression: "+t.trim()+"\n",r)}}function Ts(e,t){var n="";if(t>0)for(;1&t&&(n+=e),!((t>>>=1)<=0);)e+=e;return n}function Ms(e,t){try{return new Function(e)}catch(n){return t.push({err:n,code:e}),I}}function js(e){var t=Object.create(null);return function(n,r,o){var i=(r=M({},r)).warn||ue;delete r.warn;try{new Function("return 1")}catch(e){e.toString().match(/unsafe-eval|CSP/)&&i("It seems you are using the standalone build of Vue.js in an environment with Content Security Policy that prohibits unsafe-eval. The template compiler cannot work in this environment. Consider relaxing the policy to allow unsafe-eval or pre-compiling your templates into render functions.")}var a=r.delimiters?String(r.delimiters)+n:n;if(t[a])return t[a];var s=e(n,r);s.errors&&s.errors.length&&(r.outputSourceRange?s.errors.forEach((function(e){i("Error compiling template:\n\n"+e.msg+"\n\n"+function(e,t,n){void 0===t&&(t=0),void 0===n&&(n=e.length);for(var r=e.split(/\r?\n/),o=0,i=[],a=0;a<r.length;a++)if((o+=r[a].length+1)>=t){for(var s=a-2;s<=a+2||n>o;s++)if(!(s<0||s>=r.length)){i.push(""+(s+1)+Ts(" ",3-String(s+1).length)+"| "+r[s]);var c=r[s].length;if(s===a){var l=t-(o-c)+1,u=n>o?c-l:n-t;i.push(" | "+Ts(" ",l)+Ts("^",u))}else if(s>a){if(n>o){var f=Math.min(n-o,c);i.push(" | "+Ts("^",f))}o+=c+1}}break}return i.join("\n")}(n,e.start,e.end),o)})):i("Error compiling template:\n\n"+n+"\n\n"+s.errors.map((function(e){return"- "+e})).join("\n")+"\n",o)),s.tips&&s.tips.length&&(r.outputSourceRange?s.tips.forEach((function(e){return fe(e.msg,o)})):s.tips.forEach((function(e){return fe(e,o)})));var c={},l=[];return c.render=Ms(s.render,l),c.staticRenderFns=s.staticRenderFns.map((function(e){return Ms(e,l)})),s.errors&&s.errors.length||!l.length||i("Failed to generate render function:\n\n"+l.map((function(e){var t=e.err,n=e.code;return t.toString()+" in\n\n"+n+"\n"})).join("\n"),o),t[a]=c}}var Is,Es,Ns=(Is=function(e,t){var n=function(e,t){la=t.warn||Qr,va=t.isPreTag||E,ha=t.mustUseProp||E,ma=t.getTagNamespace||E;var n=t.isReservedTag||E;ga=function(e){return!!e.component||!n(e.tag)},fa=eo(t.modules,"transformNode"),da=eo(t.modules,"preTransformNode"),pa=eo(t.modules,"postTransformNode"),ua=t.delimiters;var r,o,i=[],a=!1!==t.preserveWhitespace,s=t.whitespace,c=!1,l=!1,u=!1;function f(e,t){u||(u=!0,la(e,t))}function d(e){if(p(e),c||e.processed||(e=Ea(e,t)),i.length||e===r||(r.if&&(e.elseif||e.else)?(v(e),Da(r,{exp:e.elseif,block:e})):f("Component template should contain exactly one root element. If you are using v-if on multiple elements, use v-else-if to chain them instead.",{start:e.start})),o&&!e.forbidden)if(e.elseif||e.else)a=e,(s=function(e){for(var t=e.length;t--;){if(1===e[t].type)return e[t];" "!==e[t].text&&la('text "'+e[t].text.trim()+'" between v-if and v-else(-if) will be ignored.',e[t]),e.pop()}}(o.children))&&s.if?Da(s,{exp:a.elseif,block:a}):la("v-"+(a.elseif?'else-if="'+a.elseif+'"':"else")+" used on element <"+a.tag+"> without corresponding v-if.",a.rawAttrsMap[a.elseif?"v-else-if":"v-else"]);else{if(e.slotScope){var n=e.slotTarget||'"default"';(o.scopedSlots||(o.scopedSlots={}))[n]=e}o.children.push(e),e.parent=o}var a,s;e.children=e.children.filter((function(e){return!e.slotScope})),p(e),e.pre&&(c=!1),va(e.tag)&&(l=!1);for(var u=0;u<pa.length;u++)pa[u](e,t)}function p(e){if(!l)for(var t;(t=e.children[e.children.length-1])&&3===t.type&&" "===t.text;)e.children.pop()}function v(e){"slot"!==e.tag&&"template"!==e.tag||f("Cannot use <"+e.tag+"> as component root element because it may contain multiple nodes.",{start:e.start}),e.attrsMap.hasOwnProperty("v-for")&&f("Cannot use v-for on stateful component root element because it renders multiple elements.",e.rawAttrsMap["v-for"])}return function(e,t){for(var n,r,o=[],i=t.expectHTML,a=t.isUnaryTag||E,s=t.canBeLeftOpenTag||E,c=0;e;){if(n=e,r&&ta(r)){var l=0,u=r.toLowerCase(),f=na[u]||(na[u]=new RegExp("([\\s\\S]*?)(</"+u+"[^>]*>)","i")),d=e.replace(f,(function(e,n,r){return l=r.length,ta(u)||"noscript"===u||(n=n.replace(/<!\--([\s\S]*?)-->/g,"$1").replace(/<!\[CDATA\[([\s\S]*?)]]>/g,"$1")),sa(u,n)&&(n=n.slice(1)),t.chars&&t.chars(n),""}));c+=e.length-d.length,e=d,C(u,c-l,c)}else{var p=e.indexOf("<");if(0===p){if(Qi.test(e)){var v=e.indexOf("--\x3e");if(v>=0){t.shouldKeepComment&&t.comment(e.substring(4,v),c,c+v+3),x(v+3);continue}}if(ea.test(e)){var h=e.indexOf("]>");if(h>=0){x(h+2);continue}}var m=e.match(Xi);if(m){x(m[0].length);continue}var g=e.match(Yi);if(g){var y=c;x(g[0].length),C(g[1],y,c);continue}var b=A();if(b){k(b),sa(b.tagName,e)&&x(1);continue}}var _=void 0,w=void 0,$=void 0;if(p>=0){for(w=e.slice(p);!(Yi.test(w)||Zi.test(w)||Qi.test(w)||ea.test(w)||($=w.indexOf("<",1))<0);)p+=$,w=e.slice(p);_=e.substring(0,p)}p<0&&(_=e),_&&x(_.length),t.chars&&_&&t.chars(_,c-_.length,c)}if(e===n){t.chars&&t.chars(e),!o.length&&t.warn&&t.warn('Mal-formatted tag at end of template: "'+e+'"',{start:c+e.length});break}}function x(t){c+=t,e=e.substring(t)}function A(){var t=e.match(Zi);if(t){var n,r,o={tagName:t[1],attrs:[],start:c};for(x(t[0].length);!(n=e.match(Gi))&&(r=e.match(Ji)||e.match(qi));)r.start=c,x(r[0].length),r.end=c,o.attrs.push(r);if(n)return o.unarySlash=n[1],x(n[0].length),o.end=c,o}}function k(e){var n=e.tagName,c=e.unarySlash;i&&("p"===r&&zi(n)&&C(r),s(n)&&r===n&&C(n));for(var l=a(n)||!!c,u=e.attrs.length,f=new Array(u),d=0;d<u;d++){var p=e.attrs[d],v=p[3]||p[4]||p[5]||"",h="a"===n&&"href"===p[1]?t.shouldDecodeNewlinesForHref:t.shouldDecodeNewlines;f[d]={name:p[1],value:ca(v,h)},t.outputSourceRange&&(f[d].start=p.start+p[0].match(/^\s*/).length,f[d].end=p.end)}l||(o.push({tag:n,lowerCasedTag:n.toLowerCase(),attrs:f,start:e.start,end:e.end}),r=n),t.start&&t.start(n,f,l,e.start,e.end)}function C(e,n,i){var a,s;if(null==n&&(n=c),null==i&&(i=c),e)for(s=e.toLowerCase(),a=o.length-1;a>=0&&o[a].lowerCasedTag!==s;a--);else a=0;if(a>=0){for(var l=o.length-1;l>=a;l--)(l>a||!e&&t.warn)&&t.warn("tag <"+o[l].tag+"> has no matching end tag.",{start:o[l].start,end:o[l].end}),t.end&&t.end(o[l].tag,n,i);o.length=a,r=a&&o[a-1].tag}else"br"===s?t.start&&t.start(e,[],!0,n,i):"p"===s&&(t.start&&t.start(e,[],!1,n,i),t.end&&t.end(e,n,i))}C()}(e,{warn:la,expectHTML:t.expectHTML,isUnaryTag:t.isUnaryTag,canBeLeftOpenTag:t.canBeLeftOpenTag,shouldDecodeNewlines:t.shouldDecodeNewlines,shouldDecodeNewlinesForHref:t.shouldDecodeNewlinesForHref,shouldKeepComment:t.comments,outputSourceRange:t.outputSourceRange,start:function(e,n,a,s,u){var f=o&&o.ns||ma(e);Y&&"svg"===f&&(n=function(e){for(var t=[],n=0;n<e.length;n++){var r=e[n];Ra.test(r.name)||(r.name=r.name.replace(Ha,""),t.push(r))}return t}(n));var p,h=Ia(e,n,o);f&&(h.ns=f),t.outputSourceRange&&(h.start=s,h.end=u,h.rawAttrsMap=h.attrsList.reduce((function(e,t){return e[t.name]=t,e}),{})),n.forEach((function(e){Ma.test(e.name)&&la("Invalid dynamic argument expression: attribute names cannot contain spaces, quotes, <, >, / or =.",{start:e.start+e.name.indexOf("["),end:e.start+e.name.length})})),"style"!==(p=h).tag&&("script"!==p.tag||p.attrsMap.type&&"text/javascript"!==p.attrsMap.type)||ie()||(h.forbidden=!0,la("Templates should only be responsible for mapping the state to the UI. Avoid placing tags with side-effects in your templates, such as <"+e+">, as they will not be parsed.",{start:h.start}));for(var m=0;m<da.length;m++)h=da[m](h,t)||h;c||(function(e){null!=lo(e,"v-pre")&&(e.pre=!0)}(h),h.pre&&(c=!0)),va(h.tag)&&(l=!0),c?function(e){var t=e.attrsList,n=t.length;if(n)for(var r=e.attrs=new Array(n),o=0;o<n;o++)r[o]={name:t[o].name,value:JSON.stringify(t[o].value)},null!=t[o].start&&(r[o].start=t[o].start,r[o].end=t[o].end);else e.pre||(e.plain=!0)}(h):h.processed||(Na(h),function(e){var t=lo(e,"v-if");if(t)e.if=t,Da(e,{exp:t,block:e});else{null!=lo(e,"v-else")&&(e.else=!0);var n=lo(e,"v-else-if");n&&(e.elseif=n)}}(h),function(e){null!=lo(e,"v-once")&&(e.once=!0)}(h)),r||v(r=h),a?d(h):(o=h,i.push(h))},end:function(e,n,r){var a=i[i.length-1];i.length-=1,o=i[i.length-1],t.outputSourceRange&&(a.end=r),d(a)},chars:function(n,r,i){if(o){if(!Y||"textarea"!==o.tag||o.attrsMap.placeholder!==n){var u,d,p,v=o.children;(n=l||n.trim()?"script"===(u=o).tag||"style"===u.tag?n:ja(n):v.length?s?"condense"===s&&Oa.test(n)?"":" ":a?" ":"":"")&&(l||"condense"!==s||(n=n.replace(Ta," ")),!c&&" "!==n&&(d=Fi(n,ua))?p={type:2,expression:d.expression,tokens:d.tokens,text:n}:" "===n&&v.length&&" "===v[v.length-1].text||(p={type:3,text:n}),p&&(t.outputSourceRange&&(p.start=r,p.end=i),v.push(p)))}}else n===e?f("Component template requires a root element, rather than just text.",{start:r}):(n=n.trim())&&f('text "'+n+'" outside root element will be ignored.',{start:r})},comment:function(e,n,r){if(o){var i={type:3,text:e,isComment:!0};t.outputSourceRange&&(i.start=n,i.end=r),o.children.push(i)}}}),r}(e.trim(),t);!1!==t.optimize&&function(e,t){e&&(Ba=Wa(t.staticKeys||""),za=t.isReservedTag||E,function e(t){if(t.static=function(e){return 2!==e.type&&(3===e.type||!(!e.pre&&(e.hasBindings||e.if||e.for||g(e.tag)||!za(e.tag)||function(e){for(;e.parent;){if("template"!==(e=e.parent).tag)return!1;if(e.for)return!0}return!1}(e)||!Object.keys(e).every(Ba))))}(t),1===t.type){if(!za(t.tag)&&"slot"!==t.tag&&null==t.attrsMap["inline-template"])return;for(var n=0,r=t.children.length;n<r;n++){var o=t.children[n];e(o),o.static||(t.static=!1)}if(t.ifConditions)for(var i=1,a=t.ifConditions.length;i<a;i++){var s=t.ifConditions[i].block;e(s),s.static||(t.static=!1)}}}(e),function e(t,n){if(1===t.type){if((t.static||t.once)&&(t.staticInFor=n),t.static&&t.children.length&&(1!==t.children.length||3!==t.children[0].type))return void(t.staticRoot=!0);if(t.staticRoot=!1,t.children)for(var r=0,o=t.children.length;r<o;r++)e(t.children[r],n||!!t.for);if(t.ifConditions)for(var i=1,a=t.ifConditions.length;i<a;i++)e(t.ifConditions[i].block,n)}}(e,!1))}(n,t);var r=ss(n,t);return{ast:n,render:r.render,staticRenderFns:r.staticRenderFns}},function(e){function t(t,n){var r=Object.create(e),o=[],i=[],a=function(e,t,n){(n?i:o).push(e)};if(n){if(n.outputSourceRange){var s=t.match(/^\s*/)[0].length;a=function(e,t,n){var r={msg:e};t&&(null!=t.start&&(r.start=t.start+s),null!=t.end&&(r.end=t.end+s)),(n?i:o).push(r)}}for(var c in n.modules&&(r.modules=(e.modules||[]).concat(n.modules)),n.directives&&(r.directives=M(Object.create(e.directives||null),n.directives)),n)"modules"!==c&&"directives"!==c&&(r[c]=n[c])}r.warn=a;var l=Is(t.trim(),r);return function(e,t){e&&function e(t,n){if(1===t.type){for(var r in t.attrsMap)if(ba.test(r)){var o=t.attrsMap[r];if(o){var i=t.rawAttrsMap[r];"v-for"===r?ks(t,'v-for="'+o+'"',n,i):"v-slot"===r||"#"===r[0]?Os(o,r+'="'+o+'"',n,i):ya.test(r)?As(o,r+'="'+o+'"',n,i):Ss(o,r+'="'+o+'"',n,i)}}if(t.children)for(var a=0;a<t.children.length;a++)e(t.children[a],n)}else 2===t.type&&Ss(t.expression,t.text,n,t)}(e,t)}(l.ast,a),l.errors=o,l.tips=i,l}return{compile:t,compileToFunctions:js(t)}})(Ka),Ds=(Ns.compile,Ns.compileToFunctions);function Ls(e){return(Es=Es||document.createElement("div")).innerHTML=e?'<a href="\n"/>':'<div a="\n"/>',Es.innerHTML.indexOf("&#10;")>0}var Ps=!!K&&Ls(!1),Fs=!!K&&Ls(!0),Rs=$((function(e){var t=wr(e);return t&&t.innerHTML})),Hs=Wn.prototype.$mount;return Wn.prototype.$mount=function(e,t){if((e=e&&wr(e))===document.body||e===document.documentElement)return ue("Do not mount Vue to <html> or <body> - mount to normal elements instead."),this;var n=this.$options;if(!n.render){var r=n.template;if(r)if("string"==typeof r)"#"===r.charAt(0)&&((r=Rs(r))||ue("Template element not found or is empty: "+n.template,this));else{if(!r.nodeType)return ue("invalid template option:"+r,this),this;r=r.innerHTML}else e&&(r=function(e){if(e.outerHTML)return e.outerHTML;var t=document.createElement("div");return t.appendChild(e.cloneNode(!0)),t.innerHTML}(e));if(r){H.performance&&at&&at("compile");var o=Ds(r,{outputSourceRange:!0,shouldDecodeNewlines:Ps,shouldDecodeNewlinesForHref:Fs,delimiters:n.delimiters,comments:n.comments},this),i=o.render,a=o.staticRenderFns;n.render=i,n.staticRenderFns=a,H.performance&&at&&(at("compile end"),st("vue "+this._name+" compile","compile","compile end"))}}return Hs.call(this,e,t)},Wn.compile=Ds,Wn},e.exports=r()}).call(this,n(4),n(15).setImmediate)},,,,,,,function(e,t,n){"use strict";n.r(t);var r=n(6),o=n.n(r);n(14);const i=new URL(window.location.href).searchParams.get("page");if(!i)throw"Need page url arg";const a=window[i],s=a.settings;function c(e,t){Object.keys(e).forEach(n=>{e[n]=t})}new o.a({el:"#nextgenthemes-vue",data:{isSaving:!1,refreshAfterSave:!1,sectionsDisplayed:{main:!0,html5:!0,pro:!0,videojs:!0,randomvideo:!0,debug:!1,urlparams:!1},message:"",vm:a.options},methods:{saveOptions(){this.isSaving=!0,window.jQuery.ajax({url:a.rest_url+"/save",method:"POST",data:this.vm,beforeSend(e){e.setRequestHeader("X-WP-Nonce",a.nonce)},success:()=>{this.message="Options saved",setTimeout(()=>this.message="",1e3)},error:e=>{this.message=e.responseText,this.refreshAfterSave=!1},complete:()=>{this.isSaving=!1,this.refreshAfterSave&&(this.refreshAfterSave=!1,window.location.reload())}})},resetOptions(e="all"){"all"===e?Object.entries(s).forEach(([e,t])=>{this.vm[e]=t.default}):Object.entries(s).forEach(([t,n])=>{e===n.tag&&(this.vm[t]=n.default)}),this.saveOptions()},licenseAPI(e,t,n){this.isSaving=!0,window.jQuery.ajax({url:"https://nextgenthemes.com",method:"POST",crossDomain:!0,data:{edd_action:e+"_license",license:this.vm[n],item_id:t,url:a.home_url},success:e=>{this.message="License API call saved",setTimeout(()=>this.message="",1e3)},error:e=>this.message=e.responseText,complete:()=>this.isSaving=!1})},licenseAPI_native(e,t,n){const r=new XMLHttpRequest;r.onreadystatechange=function(){if(console.log("xhttp.readyState",r.readyState),console.log("xhttp.status",r.status),4===r.readyState&&200===r.status){const e=JSON.parse(r.responseText);console.log("slData",e)}};const o={edd_action:e+"_license",license:this.vm[n],item_id:t,url:a.home_url};r.open("POST","https://nextgenthemes.com",!0),r.setRequestHeader("Content-type","application/json; charset=utf-8"),r.setRequestHeader("Access-Control-Allow-Origin",a.home_url);let i="";for(const e in o)i+=e+"="+a[e]+"&";i=i.substring(0,i.length-1),r.send(i)},showSection(e){c(this.sectionsDisplayed,!1),this.sectionsDisplayed[e]=!0},showAllSectionsButDebug(){c(this.sectionsDisplayed,!0),this.sectionsDisplayed.debug=!1},uploadImage(e){const t=this,n=window.wp.media({title:"Upload Image",multiple:!1}).open().on("select",(function(){const r=n.state().get("selection").first().toJSON().id;t.vm[e]=r}))},action(e,t){this.vm.action=JSON.stringify({action:e,product:t}),this.refreshAfterSave=!0,this.saveOptions()}}})},function(e,t,n){},function(e,t,n){(function(e){var r=void 0!==e&&e||"undefined"!=typeof self&&self||window,o=Function.prototype.apply;function i(e,t){this._id=e,this._clearFn=t}t.setTimeout=function(){return new i(o.call(setTimeout,r,arguments),clearTimeout)},t.setInterval=function(){return new i(o.call(setInterval,r,arguments),clearInterval)},t.clearTimeout=t.clearInterval=function(e){e&&e.close()},i.prototype.unref=i.prototype.ref=function(){},i.prototype.close=function(){this._clearFn.call(r,this._id)},t.enroll=function(e,t){clearTimeout(e._idleTimeoutId),e._idleTimeout=t},t.unenroll=function(e){clearTimeout(e._idleTimeoutId),e._idleTimeout=-1},t._unrefActive=t.active=function(e){clearTimeout(e._idleTimeoutId);var t=e._idleTimeout;t>=0&&(e._idleTimeoutId=setTimeout((function(){e._onTimeout&&e._onTimeout()}),t))},n(16),t.setImmediate="undefined"!=typeof self&&self.setImmediate||void 0!==e&&e.setImmediate||this&&this.setImmediate,t.clearImmediate="undefined"!=typeof self&&self.clearImmediate||void 0!==e&&e.clearImmediate||this&&this.clearImmediate}).call(this,n(4))},function(e,t,n){(function(e,t){!function(e,n){"use strict";if(!e.setImmediate){var r,o,i,a,s,c=1,l={},u=!1,f=e.document,d=Object.getPrototypeOf&&Object.getPrototypeOf(e);d=d&&d.setTimeout?d:e,"[object process]"==={}.toString.call(e.process)?r=function(e){t.nextTick((function(){v(e)}))}:function(){if(e.postMessage&&!e.importScripts){var t=!0,n=e.onmessage;return e.onmessage=function(){t=!1},e.postMessage("","*"),e.onmessage=n,t}}()?(a="setImmediate$"+Math.random()+"$",s=function(t){t.source===e&&"string"==typeof t.data&&0===t.data.indexOf(a)&&v(+t.data.slice(a.length))},e.addEventListener?e.addEventListener("message",s,!1):e.attachEvent("onmessage",s),r=function(t){e.postMessage(a+t,"*")}):e.MessageChannel?((i=new MessageChannel).port1.onmessage=function(e){v(e.data)},r=function(e){i.port2.postMessage(e)}):f&&"onreadystatechange"in f.createElement("script")?(o=f.documentElement,r=function(e){var t=f.createElement("script");t.onreadystatechange=function(){v(e),t.onreadystatechange=null,o.removeChild(t),t=null},o.appendChild(t)}):r=function(e){setTimeout(v,0,e)},d.setImmediate=function(e){"function"!=typeof e&&(e=new Function(""+e));for(var t=new Array(arguments.length-1),n=0;n<t.length;n++)t[n]=arguments[n+1];var o={callback:e,args:t};return l[c]=o,r(c),c++},d.clearImmediate=p}function p(e){delete l[e]}function v(e){if(u)setTimeout(v,0,e);else{var t=l[e];if(t){u=!0;try{!function(e){var t=e.callback,n=e.args;switch(n.length){case 0:t();break;case 1:t(n[0]);break;case 2:t(n[0],n[1]);break;case 3:t(n[0],n[1],n[2]);break;default:t.apply(void 0,n)}}(t)}finally{p(e),u=!1}}}}}("undefined"==typeof self?void 0===e?this:e:self)}).call(this,n(4),n(17))},function(e,t){var n,r,o=e.exports={};function i(){throw new Error("setTimeout has not been defined")}function a(){throw new Error("clearTimeout has not been defined")}function s(e){if(n===setTimeout)return setTimeout(e,0);if((n===i||!n)&&setTimeout)return n=setTimeout,setTimeout(e,0);try{return n(e,0)}catch(t){try{return n.call(null,e,0)}catch(t){return n.call(this,e,0)}}}!function(){try{n="function"==typeof setTimeout?setTimeout:i}catch(e){n=i}try{r="function"==typeof clearTimeout?clearTimeout:a}catch(e){r=a}}();var c,l=[],u=!1,f=-1;function d(){u&&c&&(u=!1,c.length?l=c.concat(l):f=-1,l.length&&p())}function p(){if(!u){var e=s(d);u=!0;for(var t=l.length;t;){for(c=l,l=[];++f<t;)c&&c[f].run();f=-1,t=l.length}c=null,u=!1,function(e){if(r===clearTimeout)return clearTimeout(e);if((r===a||!r)&&clearTimeout)return r=clearTimeout,clearTimeout(e);try{r(e)}catch(t){try{return r.call(null,e)}catch(t){return r.call(this,e)}}}(e)}}function v(e,t){this.fun=e,this.array=t}function h(){}o.nextTick=function(e){var t=new Array(arguments.length-1);if(arguments.length>1)for(var n=1;n<arguments.length;n++)t[n-1]=arguments[n];l.push(new v(e,t)),1!==l.length||u||s(p)},v.prototype.run=function(){this.fun.apply(null,this.array)},o.title="browser",o.browser=!0,o.env={},o.argv=[],o.version="",o.versions={},o.on=h,o.addListener=h,o.once=h,o.off=h,o.removeListener=h,o.removeAllListeners=h,o.emit=h,o.prependListener=h,o.prependOnceListener=h,o.listeners=function(e){return[]},o.binding=function(e){throw new Error("process.binding is not supported")},o.cwd=function(){return"/"},o.chdir=function(e){throw new Error("process.chdir is not supported")},o.umask=function(){return 0}}]);
1
+ !function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=13)}([,,,,function(e,t){var n;n=function(){return this}();try{n=n||new Function("return this")()}catch(e){"object"==typeof window&&(n=window)}e.exports=n},,function(e,t,n){(function(t,n){var r;r=function(){"use strict";var e=Object.freeze({});function r(e){return null==e}function o(e){return null!=e}function i(e){return!0===e}function a(e){return"string"==typeof e||"number"==typeof e||"symbol"==typeof e||"boolean"==typeof e}function s(e){return null!==e&&"object"==typeof e}var c=Object.prototype.toString;function l(e){return c.call(e).slice(8,-1)}function u(e){return"[object Object]"===c.call(e)}function f(e){return"[object RegExp]"===c.call(e)}function d(e){var t=parseFloat(String(e));return t>=0&&Math.floor(t)===t&&isFinite(e)}function p(e){return o(e)&&"function"==typeof e.then&&"function"==typeof e.catch}function v(e){return null==e?"":Array.isArray(e)||u(e)&&e.toString===c?JSON.stringify(e,null,2):String(e)}function h(e){var t=parseFloat(e);return isNaN(t)?e:t}function m(e,t){for(var n=Object.create(null),r=e.split(","),o=0;o<r.length;o++)n[r[o]]=!0;return t?function(e){return n[e.toLowerCase()]}:function(e){return n[e]}}var g=m("slot,component",!0),y=m("key,ref,slot,slot-scope,is");function b(e,t){if(e.length){var n=e.indexOf(t);if(n>-1)return e.splice(n,1)}}var _=Object.prototype.hasOwnProperty;function w(e,t){return _.call(e,t)}function $(e){var t=Object.create(null);return function(n){return t[n]||(t[n]=e(n))}}var x=/-(\w)/g,k=$((function(e){return e.replace(x,(function(e,t){return t?t.toUpperCase():""}))})),A=$((function(e){return e.charAt(0).toUpperCase()+e.slice(1)})),C=/\B([A-Z])/g,S=$((function(e){return e.replace(C,"-$1").toLowerCase()})),O=Function.prototype.bind?function(e,t){return e.bind(t)}:function(e,t){function n(n){var r=arguments.length;return r?r>1?e.apply(t,arguments):e.call(t,n):e.call(t)}return n._length=e.length,n};function T(e,t){t=t||0;for(var n=e.length-t,r=new Array(n);n--;)r[n]=e[n+t];return r}function M(e,t){for(var n in t)e[n]=t[n];return e}function j(e){for(var t={},n=0;n<e.length;n++)e[n]&&M(t,e[n]);return t}function I(e,t,n){}var E=function(e,t,n){return!1},N=function(e){return e};function D(e,t){if(e===t)return!0;var n=s(e),r=s(t);if(!n||!r)return!n&&!r&&String(e)===String(t);try{var o=Array.isArray(e),i=Array.isArray(t);if(o&&i)return e.length===t.length&&e.every((function(e,n){return D(e,t[n])}));if(e instanceof Date&&t instanceof Date)return e.getTime()===t.getTime();if(o||i)return!1;var a=Object.keys(e),c=Object.keys(t);return a.length===c.length&&a.every((function(n){return D(e[n],t[n])}))}catch(e){return!1}}function L(e,t){for(var n=0;n<e.length;n++)if(D(e[n],t))return n;return-1}function P(e){var t=!1;return function(){t||(t=!0,e.apply(this,arguments))}}var F=["component","directive","filter"],R=["beforeCreate","created","beforeMount","mounted","beforeUpdate","updated","beforeDestroy","destroyed","activated","deactivated","errorCaptured","serverPrefetch"],H={optionMergeStrategies:Object.create(null),silent:!1,productionTip:!0,devtools:!0,performance:!1,errorHandler:null,warnHandler:null,ignoredElements:[],keyCodes:Object.create(null),isReservedTag:E,isReservedAttr:E,isUnknownElement:E,getTagNamespace:I,parsePlatformTagName:N,mustUseProp:E,async:!0,_lifecycleHooks:R},U=/a-zA-Z\u00B7\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u037D\u037F-\u1FFF\u200C-\u200D\u203F-\u2040\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD/;function V(e){var t=(e+"").charCodeAt(0);return 36===t||95===t}function B(e,t,n,r){Object.defineProperty(e,t,{value:n,enumerable:!!r,writable:!0,configurable:!0})}var z,q=new RegExp("[^"+U.source+".$_\\d]"),J="__proto__"in{},K="undefined"!=typeof window,W="undefined"!=typeof WXEnvironment&&!!WXEnvironment.platform,Z=W&&WXEnvironment.platform.toLowerCase(),G=K&&window.navigator.userAgent.toLowerCase(),Y=G&&/msie|trident/.test(G),X=G&&G.indexOf("msie 9.0")>0,Q=G&&G.indexOf("edge/")>0,ee=(G&&G.indexOf("android"),G&&/iphone|ipad|ipod|ios/.test(G)||"ios"===Z),te=(G&&/chrome\/\d+/.test(G),G&&/phantomjs/.test(G),G&&G.match(/firefox\/(\d+)/)),ne={}.watch,re=!1;if(K)try{var oe={};Object.defineProperty(oe,"passive",{get:function(){re=!0}}),window.addEventListener("test-passive",null,oe)}catch(e){}var ie=function(){return void 0===z&&(z=!K&&!W&&void 0!==t&&t.process&&"server"===t.process.env.VUE_ENV),z},ae=K&&window.__VUE_DEVTOOLS_GLOBAL_HOOK__;function se(e){return"function"==typeof e&&/native code/.test(e.toString())}var ce,le="undefined"!=typeof Symbol&&se(Symbol)&&"undefined"!=typeof Reflect&&se(Reflect.ownKeys);ce="undefined"!=typeof Set&&se(Set)?Set:function(){function e(){this.set=Object.create(null)}return e.prototype.has=function(e){return!0===this.set[e]},e.prototype.add=function(e){this.set[e]=!0},e.prototype.clear=function(){this.set=Object.create(null)},e}();var ue,fe,de,pe=I,ve="undefined"!=typeof console,he=/(?:^|[-_])(\w)/g;ue=function(e,t){var n=t?pe(t):"";H.warnHandler?H.warnHandler.call(null,e,t,n):ve&&!H.silent&&console.error("[Vue warn]: "+e+n)},fe=function(e,t){ve&&!H.silent&&console.warn("[Vue tip]: "+e+(t?pe(t):""))},de=function(e,t){if(e.$root===e)return"<Root>";var n="function"==typeof e&&null!=e.cid?e.options:e._isVue?e.$options||e.constructor.options:e,r=n.name||n._componentTag,o=n.__file;if(!r&&o){var i=o.match(/([^/\\]+)\.vue$/);r=i&&i[1]}return(r?"<"+function(e){return e.replace(he,(function(e){return e.toUpperCase()})).replace(/[-_]/g,"")}(r)+">":"<Anonymous>")+(o&&!1!==t?" at "+o:"")},pe=function(e){if(e._isVue&&e.$parent){for(var t=[],n=0;e;){if(t.length>0){var r=t[t.length-1];if(r.constructor===e.constructor){n++,e=e.$parent;continue}n>0&&(t[t.length-1]=[r,n],n=0)}t.push(e),e=e.$parent}return"\n\nfound in\n\n"+t.map((function(e,t){return""+(0===t?"---\x3e ":function(e,t){for(var n="";t;)t%2==1&&(n+=e),t>1&&(e+=e),t>>=1;return n}(" ",5+2*t))+(Array.isArray(e)?de(e[0])+"... ("+e[1]+" recursive calls)":de(e))})).join("\n")}return"\n\n(found in "+de(e)+")"};var me=0,ge=function(){this.id=me++,this.subs=[]};ge.prototype.addSub=function(e){this.subs.push(e)},ge.prototype.removeSub=function(e){b(this.subs,e)},ge.prototype.depend=function(){ge.target&&ge.target.addDep(this)},ge.prototype.notify=function(){var e=this.subs.slice();H.async||e.sort((function(e,t){return e.id-t.id}));for(var t=0,n=e.length;t<n;t++)e[t].update()},ge.target=null;var ye=[];function be(e){ye.push(e),ge.target=e}function _e(){ye.pop(),ge.target=ye[ye.length-1]}var we=function(e,t,n,r,o,i,a,s){this.tag=e,this.data=t,this.children=n,this.text=r,this.elm=o,this.ns=void 0,this.context=i,this.fnContext=void 0,this.fnOptions=void 0,this.fnScopeId=void 0,this.key=t&&t.key,this.componentOptions=a,this.componentInstance=void 0,this.parent=void 0,this.raw=!1,this.isStatic=!1,this.isRootInsert=!0,this.isComment=!1,this.isCloned=!1,this.isOnce=!1,this.asyncFactory=s,this.asyncMeta=void 0,this.isAsyncPlaceholder=!1},$e={child:{configurable:!0}};$e.child.get=function(){return this.componentInstance},Object.defineProperties(we.prototype,$e);var xe=function(e){void 0===e&&(e="");var t=new we;return t.text=e,t.isComment=!0,t};function ke(e){return new we(void 0,void 0,void 0,String(e))}function Ae(e){var t=new we(e.tag,e.data,e.children&&e.children.slice(),e.text,e.elm,e.context,e.componentOptions,e.asyncFactory);return t.ns=e.ns,t.isStatic=e.isStatic,t.key=e.key,t.isComment=e.isComment,t.fnContext=e.fnContext,t.fnOptions=e.fnOptions,t.fnScopeId=e.fnScopeId,t.asyncMeta=e.asyncMeta,t.isCloned=!0,t}var Ce=Array.prototype,Se=Object.create(Ce);["push","pop","shift","unshift","splice","sort","reverse"].forEach((function(e){var t=Ce[e];B(Se,e,(function(){for(var n=[],r=arguments.length;r--;)n[r]=arguments[r];var o,i=t.apply(this,n),a=this.__ob__;switch(e){case"push":case"unshift":o=n;break;case"splice":o=n.slice(2)}return o&&a.observeArray(o),a.dep.notify(),i}))}));var Oe=Object.getOwnPropertyNames(Se),Te=!0;function Me(e){Te=e}var je=function(e){this.value=e,this.dep=new ge,this.vmCount=0,B(e,"__ob__",this),Array.isArray(e)?(J?function(e,t){e.__proto__=t}(e,Se):function(e,t,n){for(var r=0,o=n.length;r<o;r++){var i=n[r];B(e,i,t[i])}}(e,Se,Oe),this.observeArray(e)):this.walk(e)};function Ie(e,t){var n;if(s(e)&&!(e instanceof we))return w(e,"__ob__")&&e.__ob__ instanceof je?n=e.__ob__:Te&&!ie()&&(Array.isArray(e)||u(e))&&Object.isExtensible(e)&&!e._isVue&&(n=new je(e)),t&&n&&n.vmCount++,n}function Ee(e,t,n,r,o){var i=new ge,a=Object.getOwnPropertyDescriptor(e,t);if(!a||!1!==a.configurable){var s=a&&a.get,c=a&&a.set;s&&!c||2!==arguments.length||(n=e[t]);var l=!o&&Ie(n);Object.defineProperty(e,t,{enumerable:!0,configurable:!0,get:function(){var t=s?s.call(e):n;return ge.target&&(i.depend(),l&&(l.dep.depend(),Array.isArray(t)&&Le(t))),t},set:function(t){var a=s?s.call(e):n;t===a||t!=t&&a!=a||(r&&r(),s&&!c||(c?c.call(e,t):n=t,l=!o&&Ie(t),i.notify()))}})}}function Ne(e,t,n){if((r(e)||a(e))&&ue("Cannot set reactive property on undefined, null, or primitive value: "+e),Array.isArray(e)&&d(t))return e.length=Math.max(e.length,t),e.splice(t,1,n),n;if(t in e&&!(t in Object.prototype))return e[t]=n,n;var o=e.__ob__;return e._isVue||o&&o.vmCount?(ue("Avoid adding reactive properties to a Vue instance or its root $data at runtime - declare it upfront in the data option."),n):o?(Ee(o.value,t,n),o.dep.notify(),n):(e[t]=n,n)}function De(e,t){if((r(e)||a(e))&&ue("Cannot delete reactive property on undefined, null, or primitive value: "+e),Array.isArray(e)&&d(t))e.splice(t,1);else{var n=e.__ob__;e._isVue||n&&n.vmCount?ue("Avoid deleting properties on a Vue instance or its root $data - just set it to null."):w(e,t)&&(delete e[t],n&&n.dep.notify())}}function Le(e){for(var t=void 0,n=0,r=e.length;n<r;n++)(t=e[n])&&t.__ob__&&t.__ob__.dep.depend(),Array.isArray(t)&&Le(t)}je.prototype.walk=function(e){for(var t=Object.keys(e),n=0;n<t.length;n++)Ee(e,t[n])},je.prototype.observeArray=function(e){for(var t=0,n=e.length;t<n;t++)Ie(e[t])};var Pe=H.optionMergeStrategies;function Fe(e,t){if(!t)return e;for(var n,r,o,i=le?Reflect.ownKeys(t):Object.keys(t),a=0;a<i.length;a++)"__ob__"!==(n=i[a])&&(r=e[n],o=t[n],w(e,n)?r!==o&&u(r)&&u(o)&&Fe(r,o):Ne(e,n,o));return e}function Re(e,t,n){return n?function(){var r="function"==typeof t?t.call(n,n):t,o="function"==typeof e?e.call(n,n):e;return r?Fe(r,o):o}:t?e?function(){return Fe("function"==typeof t?t.call(this,this):t,"function"==typeof e?e.call(this,this):e)}:t:e}function He(e,t){var n=t?e?e.concat(t):Array.isArray(t)?t:[t]:e;return n?function(e){for(var t=[],n=0;n<e.length;n++)-1===t.indexOf(e[n])&&t.push(e[n]);return t}(n):n}function Ue(e,t,n,r){var o=Object.create(e||null);return t?(ze(r,t,n),M(o,t)):o}Pe.el=Pe.propsData=function(e,t,n,r){return n||ue('option "'+r+'" can only be used during instance creation with the `new` keyword.'),Ve(e,t)},Pe.data=function(e,t,n){return n?Re(e,t,n):t&&"function"!=typeof t?(ue('The "data" option should be a function that returns a per-instance value in component definitions.',n),e):Re(e,t)},R.forEach((function(e){Pe[e]=He})),F.forEach((function(e){Pe[e+"s"]=Ue})),Pe.watch=function(e,t,n,r){if(e===ne&&(e=void 0),t===ne&&(t=void 0),!t)return Object.create(e||null);if(ze(r,t,n),!e)return t;var o={};for(var i in M(o,e),t){var a=o[i],s=t[i];a&&!Array.isArray(a)&&(a=[a]),o[i]=a?a.concat(s):Array.isArray(s)?s:[s]}return o},Pe.props=Pe.methods=Pe.inject=Pe.computed=function(e,t,n,r){if(t&&ze(r,t,n),!e)return t;var o=Object.create(null);return M(o,e),t&&M(o,t),o},Pe.provide=Re;var Ve=function(e,t){return void 0===t?e:t};function Be(e){new RegExp("^[a-zA-Z][\\-\\.0-9_"+U.source+"]*$").test(e)||ue('Invalid component name: "'+e+'". Component names should conform to valid custom element name in html5 specification.'),(g(e)||H.isReservedTag(e))&&ue("Do not use built-in or reserved HTML elements as component id: "+e)}function ze(e,t,n){u(t)||ue('Invalid value for option "'+e+'": expected an Object, but got '+l(t)+".",n)}function qe(e,t,n){if(function(e){for(var t in e.components)Be(t)}(t),"function"==typeof t&&(t=t.options),function(e,t){var n=e.props;if(n){var r,o,i={};if(Array.isArray(n))for(r=n.length;r--;)"string"==typeof(o=n[r])?i[k(o)]={type:null}:ue("props must be strings when using array syntax.");else if(u(n))for(var a in n)o=n[a],i[k(a)]=u(o)?o:{type:o};else ue('Invalid value for option "props": expected an Array or an Object, but got '+l(n)+".",t);e.props=i}}(t,n),function(e,t){var n=e.inject;if(n){var r=e.inject={};if(Array.isArray(n))for(var o=0;o<n.length;o++)r[n[o]]={from:n[o]};else if(u(n))for(var i in n){var a=n[i];r[i]=u(a)?M({from:i},a):{from:a}}else ue('Invalid value for option "inject": expected an Array or an Object, but got '+l(n)+".",t)}}(t,n),function(e){var t=e.directives;if(t)for(var n in t){var r=t[n];"function"==typeof r&&(t[n]={bind:r,update:r})}}(t),!t._base&&(t.extends&&(e=qe(e,t.extends,n)),t.mixins))for(var r=0,o=t.mixins.length;r<o;r++)e=qe(e,t.mixins[r],n);var i,a={};for(i in e)s(i);for(i in t)w(e,i)||s(i);function s(r){var o=Pe[r]||Ve;a[r]=o(e[r],t[r],n,r)}return a}function Je(e,t,n,r){if("string"==typeof n){var o=e[t];if(w(o,n))return o[n];var i=k(n);if(w(o,i))return o[i];var a=A(i);if(w(o,a))return o[a];var s=o[n]||o[i]||o[a];return r&&!s&&ue("Failed to resolve "+t.slice(0,-1)+": "+n,e),s}}function Ke(e,t,n,r){var o=t[e],i=!w(n,e),a=n[e],c=Xe(Boolean,o.type);if(c>-1)if(i&&!w(o,"default"))a=!1;else if(""===a||a===S(e)){var u=Xe(String,o.type);(u<0||c<u)&&(a=!0)}if(void 0===a){a=function(e,t,n){if(w(t,"default")){var r=t.default;return s(r)&&ue('Invalid default value for prop "'+n+'": Props with type Object/Array must use a factory function to return the default value.',e),e&&e.$options.propsData&&void 0===e.$options.propsData[n]&&void 0!==e._props[n]?e._props[n]:"function"==typeof r&&"Function"!==Ge(t.type)?r.call(e):r}}(r,o,e);var f=Te;Me(!0),Ie(a),Me(f)}return function(e,t,n,r,o){if(e.required&&o)ue('Missing required prop: "'+t+'"',r);else if(null!=n||e.required){var i=e.type,a=!i||!0===i,s=[];if(i){Array.isArray(i)||(i=[i]);for(var c=0;c<i.length&&!a;c++){var u=Ze(n,i[c]);s.push(u.expectedType||""),a=u.valid}}if(a){var f=e.validator;f&&(f(n)||ue('Invalid prop: custom validator check failed for prop "'+t+'".',r))}else ue(function(e,t,n){var r='Invalid prop: type check failed for prop "'+e+'". Expected '+n.map(A).join(", "),o=n[0],i=l(t),a=Qe(t,o),s=Qe(t,i);return 1===n.length&&et(o)&&!function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];return e.some((function(e){return"boolean"===e.toLowerCase()}))}(o,i)&&(r+=" with value "+a),r+=", got "+i+" ",et(i)&&(r+="with value "+s+"."),r}(t,n,s),r)}}(o,e,a,r,i),a}var We=/^(String|Number|Boolean|Function|Symbol)$/;function Ze(e,t){var n,r=Ge(t);if(We.test(r)){var o=typeof e;(n=o===r.toLowerCase())||"object"!==o||(n=e instanceof t)}else n="Object"===r?u(e):"Array"===r?Array.isArray(e):e instanceof t;return{valid:n,expectedType:r}}function Ge(e){var t=e&&e.toString().match(/^\s*function (\w+)/);return t?t[1]:""}function Ye(e,t){return Ge(e)===Ge(t)}function Xe(e,t){if(!Array.isArray(t))return Ye(t,e)?0:-1;for(var n=0,r=t.length;n<r;n++)if(Ye(t[n],e))return n;return-1}function Qe(e,t){return"String"===t?'"'+e+'"':"Number"===t?""+Number(e):""+e}function et(e){return["string","number","boolean"].some((function(t){return e.toLowerCase()===t}))}function tt(e,t,n){be();try{if(t)for(var r=t;r=r.$parent;){var o=r.$options.errorCaptured;if(o)for(var i=0;i<o.length;i++)try{if(!1===o[i].call(r,e,t,n))return}catch(e){rt(e,r,"errorCaptured hook")}}rt(e,t,n)}finally{_e()}}function nt(e,t,n,r,o){var i;try{(i=n?e.apply(t,n):e.call(t))&&!i._isVue&&p(i)&&!i._handled&&(i.catch((function(e){return tt(e,r,o+" (Promise/async)")})),i._handled=!0)}catch(e){tt(e,r,o)}return i}function rt(e,t,n){if(H.errorHandler)try{return H.errorHandler.call(null,e,t,n)}catch(t){t!==e&&ot(t,null,"config.errorHandler")}ot(e,t,n)}function ot(e,t,n){if(ue("Error in "+n+': "'+e.toString()+'"',t),!K&&!W||"undefined"==typeof console)throw e;console.error(e)}var it,at,st,ct=!1,lt=[],ut=!1;function ft(){ut=!1;var e=lt.slice(0);lt.length=0;for(var t=0;t<e.length;t++)e[t]()}if("undefined"!=typeof Promise&&se(Promise)){var dt=Promise.resolve();it=function(){dt.then(ft),ee&&setTimeout(I)},ct=!0}else if(Y||"undefined"==typeof MutationObserver||!se(MutationObserver)&&"[object MutationObserverConstructor]"!==MutationObserver.toString())it=void 0!==n&&se(n)?function(){n(ft)}:function(){setTimeout(ft,0)};else{var pt=1,vt=new MutationObserver(ft),ht=document.createTextNode(String(pt));vt.observe(ht,{characterData:!0}),it=function(){pt=(pt+1)%2,ht.data=String(pt)},ct=!0}function mt(e,t){var n;if(lt.push((function(){if(e)try{e.call(t)}catch(e){tt(e,t,"nextTick")}else n&&n(t)})),ut||(ut=!0,it()),!e&&"undefined"!=typeof Promise)return new Promise((function(e){n=e}))}var gt,yt=K&&window.performance;yt&&yt.mark&&yt.measure&&yt.clearMarks&&yt.clearMeasures&&(at=function(e){return yt.mark(e)},st=function(e,t,n){yt.measure(e,t,n),yt.clearMarks(t),yt.clearMarks(n)});var bt=m("Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,require"),_t=function(e,t){ue('Property or method "'+t+'" is not defined on the instance but referenced during render. Make sure that this property is reactive, either in the data option, or for class-based components, by initializing the property. See: https://vuejs.org/v2/guide/reactivity.html#Declaring-Reactive-Properties.',e)},wt=function(e,t){ue('Property "'+t+'" must be accessed with "$data.'+t+'" because properties starting with "$" or "_" are not proxied in the Vue instance to prevent conflicts with Vue internals. See: https://vuejs.org/v2/api/#data',e)},$t="undefined"!=typeof Proxy&&se(Proxy);if($t){var xt=m("stop,prevent,self,ctrl,shift,alt,meta,exact");H.keyCodes=new Proxy(H.keyCodes,{set:function(e,t,n){return xt(t)?(ue("Avoid overwriting built-in modifier in config.keyCodes: ."+t),!1):(e[t]=n,!0)}})}var kt={has:function(e,t){var n=t in e,r=bt(t)||"string"==typeof t&&"_"===t.charAt(0)&&!(t in e.$data);return n||r||(t in e.$data?wt(e,t):_t(e,t)),n||!r}},At={get:function(e,t){return"string"!=typeof t||t in e||(t in e.$data?wt(e,t):_t(e,t)),e[t]}};gt=function(e){if($t){var t=e.$options,n=t.render&&t.render._withStripped?At:kt;e._renderProxy=new Proxy(e,n)}else e._renderProxy=e};var Ct=new ce;function St(e){!function e(t,n){var r,o,i=Array.isArray(t);if(!(!i&&!s(t)||Object.isFrozen(t)||t instanceof we)){if(t.__ob__){var a=t.__ob__.dep.id;if(n.has(a))return;n.add(a)}if(i)for(r=t.length;r--;)e(t[r],n);else for(r=(o=Object.keys(t)).length;r--;)e(t[o[r]],n)}}(e,Ct),Ct.clear()}var Ot=$((function(e){var t="&"===e.charAt(0),n="~"===(e=t?e.slice(1):e).charAt(0),r="!"===(e=n?e.slice(1):e).charAt(0);return{name:e=r?e.slice(1):e,once:n,capture:r,passive:t}}));function Tt(e,t){function n(){var e=arguments,r=n.fns;if(!Array.isArray(r))return nt(r,null,arguments,t,"v-on handler");for(var o=r.slice(),i=0;i<o.length;i++)nt(o[i],null,e,t,"v-on handler")}return n.fns=e,n}function Mt(e,t,n,o,a,s){var c,l,u,f;for(c in e)l=e[c],u=t[c],f=Ot(c),r(l)?ue('Invalid handler for event "'+f.name+'": got '+String(l),s):r(u)?(r(l.fns)&&(l=e[c]=Tt(l,s)),i(f.once)&&(l=e[c]=a(f.name,l,f.capture)),n(f.name,l,f.capture,f.passive,f.params)):l!==u&&(u.fns=l,e[c]=u);for(c in t)r(e[c])&&o((f=Ot(c)).name,t[c],f.capture)}function jt(e,t,n){var a;e instanceof we&&(e=e.data.hook||(e.data.hook={}));var s=e[t];function c(){n.apply(this,arguments),b(a.fns,c)}r(s)?a=Tt([c]):o(s.fns)&&i(s.merged)?(a=s).fns.push(c):a=Tt([s,c]),a.merged=!0,e[t]=a}function It(e,t,n,r,i){if(o(t)){if(w(t,n))return e[n]=t[n],i||delete t[n],!0;if(w(t,r))return e[n]=t[r],i||delete t[r],!0}return!1}function Et(e){return a(e)?[ke(e)]:Array.isArray(e)?function e(t,n){var s,c,l,u,f=[];for(s=0;s<t.length;s++)r(c=t[s])||"boolean"==typeof c||(u=f[l=f.length-1],Array.isArray(c)?c.length>0&&(Nt((c=e(c,(n||"")+"_"+s))[0])&&Nt(u)&&(f[l]=ke(u.text+c[0].text),c.shift()),f.push.apply(f,c)):a(c)?Nt(u)?f[l]=ke(u.text+c):""!==c&&f.push(ke(c)):Nt(c)&&Nt(u)?f[l]=ke(u.text+c.text):(i(t._isVList)&&o(c.tag)&&r(c.key)&&o(n)&&(c.key="__vlist"+n+"_"+s+"__"),f.push(c)));return f}(e):void 0}function Nt(e){return o(e)&&o(e.text)&&!1===e.isComment}function Dt(e,t){if(e){for(var n=Object.create(null),r=le?Reflect.ownKeys(e):Object.keys(e),o=0;o<r.length;o++){var i=r[o];if("__ob__"!==i){for(var a=e[i].from,s=t;s;){if(s._provided&&w(s._provided,a)){n[i]=s._provided[a];break}s=s.$parent}if(!s)if("default"in e[i]){var c=e[i].default;n[i]="function"==typeof c?c.call(t):c}else ue('Injection "'+i+'" not found',t)}}return n}}function Lt(e,t){if(!e||!e.length)return{};for(var n={},r=0,o=e.length;r<o;r++){var i=e[r],a=i.data;if(a&&a.attrs&&a.attrs.slot&&delete a.attrs.slot,i.context!==t&&i.fnContext!==t||!a||null==a.slot)(n.default||(n.default=[])).push(i);else{var s=a.slot,c=n[s]||(n[s]=[]);"template"===i.tag?c.push.apply(c,i.children||[]):c.push(i)}}for(var l in n)n[l].every(Pt)&&delete n[l];return n}function Pt(e){return e.isComment&&!e.asyncFactory||" "===e.text}function Ft(t,n,r){var o,i=Object.keys(n).length>0,a=t?!!t.$stable:!i,s=t&&t.$key;if(t){if(t._normalized)return t._normalized;if(a&&r&&r!==e&&s===r.$key&&!i&&!r.$hasNormal)return r;for(var c in o={},t)t[c]&&"$"!==c[0]&&(o[c]=Rt(n,c,t[c]))}else o={};for(var l in n)l in o||(o[l]=Ht(n,l));return t&&Object.isExtensible(t)&&(t._normalized=o),B(o,"$stable",a),B(o,"$key",s),B(o,"$hasNormal",i),o}function Rt(e,t,n){var r=function(){var e=arguments.length?n.apply(null,arguments):n({});return(e=e&&"object"==typeof e&&!Array.isArray(e)?[e]:Et(e))&&(0===e.length||1===e.length&&e[0].isComment)?void 0:e};return n.proxy&&Object.defineProperty(e,t,{get:r,enumerable:!0,configurable:!0}),r}function Ht(e,t){return function(){return e[t]}}function Ut(e,t){var n,r,i,a,c;if(Array.isArray(e)||"string"==typeof e)for(n=new Array(e.length),r=0,i=e.length;r<i;r++)n[r]=t(e[r],r);else if("number"==typeof e)for(n=new Array(e),r=0;r<e;r++)n[r]=t(r+1,r);else if(s(e))if(le&&e[Symbol.iterator]){n=[];for(var l=e[Symbol.iterator](),u=l.next();!u.done;)n.push(t(u.value,n.length)),u=l.next()}else for(a=Object.keys(e),n=new Array(a.length),r=0,i=a.length;r<i;r++)c=a[r],n[r]=t(e[c],c,r);return o(n)||(n=[]),n._isVList=!0,n}function Vt(e,t,n,r){var o,i=this.$scopedSlots[e];i?(n=n||{},r&&(s(r)||ue("slot v-bind without argument expects an Object",this),n=M(M({},r),n)),o=i(n)||t):o=this.$slots[e]||t;var a=n&&n.slot;return a?this.$createElement("template",{slot:a},o):o}function Bt(e){return Je(this.$options,"filters",e,!0)||N}function zt(e,t){return Array.isArray(e)?-1===e.indexOf(t):e!==t}function qt(e,t,n,r,o){var i=H.keyCodes[t]||n;return o&&r&&!H.keyCodes[t]?zt(o,r):i?zt(i,e):r?S(r)!==t:void 0}function Jt(e,t,n,r,o){if(n)if(s(n)){var i;Array.isArray(n)&&(n=j(n));var a=function(a){if("class"===a||"style"===a||y(a))i=e;else{var s=e.attrs&&e.attrs.type;i=r||H.mustUseProp(t,s,a)?e.domProps||(e.domProps={}):e.attrs||(e.attrs={})}var c=k(a),l=S(a);c in i||l in i||(i[a]=n[a],o&&((e.on||(e.on={}))["update:"+a]=function(e){n[a]=e}))};for(var c in n)a(c)}else ue("v-bind without argument expects an Object or Array value",this);return e}function Kt(e,t){var n=this._staticTrees||(this._staticTrees=[]),r=n[e];return r&&!t||Zt(r=n[e]=this.$options.staticRenderFns[e].call(this._renderProxy,null,this),"__static__"+e,!1),r}function Wt(e,t,n){return Zt(e,"__once__"+t+(n?"_"+n:""),!0),e}function Zt(e,t,n){if(Array.isArray(e))for(var r=0;r<e.length;r++)e[r]&&"string"!=typeof e[r]&&Gt(e[r],t+"_"+r,n);else Gt(e,t,n)}function Gt(e,t,n){e.isStatic=!0,e.key=t,e.isOnce=n}function Yt(e,t){if(t)if(u(t)){var n=e.on=e.on?M({},e.on):{};for(var r in t){var o=n[r],i=t[r];n[r]=o?[].concat(o,i):i}}else ue("v-on without argument expects an Object value",this);return e}function Xt(e,t,n,r){t=t||{$stable:!n};for(var o=0;o<e.length;o++){var i=e[o];Array.isArray(i)?Xt(i,t,n):i&&(i.proxy&&(i.fn.proxy=!0),t[i.key]=i.fn)}return r&&(t.$key=r),t}function Qt(e,t){for(var n=0;n<t.length;n+=2){var r=t[n];"string"==typeof r&&r?e[t[n]]=t[n+1]:""!==r&&null!==r&&ue("Invalid value for dynamic directive argument (expected string or null): "+r,this)}return e}function en(e,t){return"string"==typeof e?t+e:e}function tn(e){e._o=Wt,e._n=h,e._s=v,e._l=Ut,e._t=Vt,e._q=D,e._i=L,e._m=Kt,e._f=Bt,e._k=qt,e._b=Jt,e._v=ke,e._e=xe,e._u=Xt,e._g=Yt,e._d=Qt,e._p=en}function nn(t,n,r,o,a){var s,c=this,l=a.options;w(o,"_uid")?(s=Object.create(o))._original=o:(s=o,o=o._original);var u=i(l._compiled),f=!u;this.data=t,this.props=n,this.children=r,this.parent=o,this.listeners=t.on||e,this.injections=Dt(l.inject,o),this.slots=function(){return c.$slots||Ft(t.scopedSlots,c.$slots=Lt(r,o)),c.$slots},Object.defineProperty(this,"scopedSlots",{enumerable:!0,get:function(){return Ft(t.scopedSlots,this.slots())}}),u&&(this.$options=l,this.$slots=this.slots(),this.$scopedSlots=Ft(t.scopedSlots,this.$slots)),l._scopeId?this._c=function(e,t,n,r){var i=un(s,e,t,n,r,f);return i&&!Array.isArray(i)&&(i.fnScopeId=l._scopeId,i.fnContext=o),i}:this._c=function(e,t,n,r){return un(s,e,t,n,r,f)}}function rn(e,t,n,r,o){var i=Ae(e);return i.fnContext=n,i.fnOptions=r,(i.devtoolsMeta=i.devtoolsMeta||{}).renderContext=o,t.slot&&((i.data||(i.data={})).slot=t.slot),i}function on(e,t){for(var n in t)e[k(n)]=t[n]}tn(nn.prototype);var an={init:function(e,t){if(e.componentInstance&&!e.componentInstance._isDestroyed&&e.data.keepAlive){var n=e;an.prepatch(n,n)}else(e.componentInstance=function(e,t){var n={_isComponent:!0,_parentVnode:e,parent:t},r=e.data.inlineTemplate;return o(r)&&(n.render=r.render,n.staticRenderFns=r.staticRenderFns),new e.componentOptions.Ctor(n)}(e,_n)).$mount(t?e.elm:void 0,t)},prepatch:function(t,n){var r=n.componentOptions;!function(t,n,r,o,i){wn=!0;var a=o.data.scopedSlots,s=t.$scopedSlots,c=!!(a&&!a.$stable||s!==e&&!s.$stable||a&&t.$scopedSlots.$key!==a.$key),l=!!(i||t.$options._renderChildren||c);if(t.$options._parentVnode=o,t.$vnode=o,t._vnode&&(t._vnode.parent=o),t.$options._renderChildren=i,t.$attrs=o.data.attrs||e,t.$listeners=r||e,n&&t.$options.props){Me(!1);for(var u=t._props,f=t.$options._propKeys||[],d=0;d<f.length;d++){var p=f[d],v=t.$options.props;u[p]=Ke(p,v,n,t)}Me(!0),t.$options.propsData=n}r=r||e;var h=t.$options._parentListeners;t.$options._parentListeners=r,bn(t,r,h),l&&(t.$slots=Lt(i,o.context),t.$forceUpdate()),wn=!1}(n.componentInstance=t.componentInstance,r.propsData,r.listeners,n,r.children)},insert:function(e){var t,n=e.context,r=e.componentInstance;r._isMounted||(r._isMounted=!0,An(r,"mounted")),e.data.keepAlive&&(n._isMounted?((t=r)._inactive=!1,Sn.push(t)):kn(r,!0))},destroy:function(e){var t=e.componentInstance;t._isDestroyed||(e.data.keepAlive?function e(t,n){if(!(n&&(t._directInactive=!0,xn(t))||t._inactive)){t._inactive=!0;for(var r=0;r<t.$children.length;r++)e(t.$children[r]);An(t,"deactivated")}}(t,!0):t.$destroy())}},sn=Object.keys(an);function cn(t,n,a,c,l){if(!r(t)){var u=a.$options._base;if(s(t)&&(t=u.extend(t)),"function"==typeof t){var f;if(r(t.cid)&&void 0===(t=function(e,t){if(i(e.error)&&o(e.errorComp))return e.errorComp;if(o(e.resolved))return e.resolved;var n=dn;if(n&&o(e.owners)&&-1===e.owners.indexOf(n)&&e.owners.push(n),i(e.loading)&&o(e.loadingComp))return e.loadingComp;if(n&&!o(e.owners)){var a=e.owners=[n],c=!0,l=null,u=null;n.$on("hook:destroyed",(function(){return b(a,n)}));var f=function(e){for(var t=0,n=a.length;t<n;t++)a[t].$forceUpdate();e&&(a.length=0,null!==l&&(clearTimeout(l),l=null),null!==u&&(clearTimeout(u),u=null))},d=P((function(n){e.resolved=pn(n,t),c?a.length=0:f(!0)})),v=P((function(t){ue("Failed to resolve async component: "+String(e)+(t?"\nReason: "+t:"")),o(e.errorComp)&&(e.error=!0,f(!0))})),h=e(d,v);return s(h)&&(p(h)?r(e.resolved)&&h.then(d,v):p(h.component)&&(h.component.then(d,v),o(h.error)&&(e.errorComp=pn(h.error,t)),o(h.loading)&&(e.loadingComp=pn(h.loading,t),0===h.delay?e.loading=!0:l=setTimeout((function(){l=null,r(e.resolved)&&r(e.error)&&(e.loading=!0,f(!1))}),h.delay||200)),o(h.timeout)&&(u=setTimeout((function(){u=null,r(e.resolved)&&v("timeout ("+h.timeout+"ms)")}),h.timeout)))),c=!1,e.loading?e.loadingComp:e.resolved}}(f=t,u)))return function(e,t,n,r,o){var i=xe();return i.asyncFactory=e,i.asyncMeta={data:t,context:n,children:r,tag:o},i}(f,n,a,c,l);n=n||{},Kn(t),o(n.model)&&function(e,t){var n=e.model&&e.model.prop||"value",r=e.model&&e.model.event||"input";(t.attrs||(t.attrs={}))[n]=t.model.value;var i=t.on||(t.on={}),a=i[r],s=t.model.callback;o(a)?(Array.isArray(a)?-1===a.indexOf(s):a!==s)&&(i[r]=[s].concat(a)):i[r]=s}(t.options,n);var d=function(e,t,n){var i=t.options.props;if(!r(i)){var a={},s=e.attrs,c=e.props;if(o(s)||o(c))for(var l in i){var u=S(l),f=l.toLowerCase();l!==f&&s&&w(s,f)&&fe('Prop "'+f+'" is passed to component '+de(n||t)+', but the declared prop name is "'+l+'". Note that HTML attributes are case-insensitive and camelCased props need to use their kebab-case equivalents when using in-DOM templates. You should probably use "'+u+'" instead of "'+l+'".'),It(a,c,l,u,!0)||It(a,s,l,u,!1)}return a}}(n,t,l);if(i(t.options.functional))return function(t,n,r,i,a){var s=t.options,c={},l=s.props;if(o(l))for(var u in l)c[u]=Ke(u,l,n||e);else o(r.attrs)&&on(c,r.attrs),o(r.props)&&on(c,r.props);var f=new nn(r,c,a,i,t),d=s.render.call(null,f._c,f);if(d instanceof we)return rn(d,r,f.parent,s,f);if(Array.isArray(d)){for(var p=Et(d)||[],v=new Array(p.length),h=0;h<p.length;h++)v[h]=rn(p[h],r,f.parent,s,f);return v}}(t,d,n,a,c);var v=n.on;if(n.on=n.nativeOn,i(t.options.abstract)){var h=n.slot;n={},h&&(n.slot=h)}!function(e){for(var t=e.hook||(e.hook={}),n=0;n<sn.length;n++){var r=sn[n],o=t[r],i=an[r];o===i||o&&o._merged||(t[r]=o?ln(i,o):i)}}(n);var m=t.options.name||l;return new we("vue-component-"+t.cid+(m?"-"+m:""),n,void 0,void 0,void 0,a,{Ctor:t,propsData:d,listeners:v,tag:l,children:c},f)}ue("Invalid Component definition: "+String(t),a)}}function ln(e,t){var n=function(n,r){e(n,r),t(n,r)};return n._merged=!0,n}function un(e,t,n,c,l,u){return(Array.isArray(n)||a(n))&&(l=c,c=n,n=void 0),i(u)&&(l=2),function(e,t,n,c,l){return o(n)&&o(n.__ob__)?(ue("Avoid using observed data object as vnode data: "+JSON.stringify(n)+"\nAlways create fresh vnode data objects in each render!",e),xe()):(o(n)&&o(n.is)&&(t=n.is),t?(o(n)&&o(n.key)&&!a(n.key)&&ue("Avoid using non-primitive value as key, use string/number value instead.",e),Array.isArray(c)&&"function"==typeof c[0]&&((n=n||{}).scopedSlots={default:c[0]},c.length=0),2===l?c=Et(c):1===l&&(c=function(e){for(var t=0;t<e.length;t++)if(Array.isArray(e[t]))return Array.prototype.concat.apply([],e);return e}(c)),"string"==typeof t?(f=e.$vnode&&e.$vnode.ns||H.getTagNamespace(t),H.isReservedTag(t)?(o(n)&&o(n.nativeOn)&&ue("The .native modifier for v-on is only valid on components but it was used on <"+t+">.",e),u=new we(H.parsePlatformTagName(t),n,c,void 0,void 0,e)):u=n&&n.pre||!o(d=Je(e.$options,"components",t))?new we(t,n,c,void 0,void 0,e):cn(d,n,e,c,t)):u=cn(t,n,e,c),Array.isArray(u)?u:o(u)?(o(f)&&function e(t,n,a){if(t.ns=n,"foreignObject"===t.tag&&(n=void 0,a=!0),o(t.children))for(var s=0,c=t.children.length;s<c;s++){var l=t.children[s];o(l.tag)&&(r(l.ns)||i(a)&&"svg"!==l.tag)&&e(l,n,a)}}(u,f),o(n)&&function(e){s(e.style)&&St(e.style),s(e.class)&&St(e.class)}(n),u):xe()):xe());var u,f,d}(e,t,n,c,l)}var fn,dn=null;function pn(e,t){return(e.__esModule||le&&"Module"===e[Symbol.toStringTag])&&(e=e.default),s(e)?t.extend(e):e}function vn(e){return e.isComment&&e.asyncFactory}function hn(e){if(Array.isArray(e))for(var t=0;t<e.length;t++){var n=e[t];if(o(n)&&(o(n.componentOptions)||vn(n)))return n}}function mn(e,t){fn.$on(e,t)}function gn(e,t){fn.$off(e,t)}function yn(e,t){var n=fn;return function r(){var o=t.apply(null,arguments);null!==o&&n.$off(e,r)}}function bn(e,t,n){fn=e,Mt(t,n||{},mn,gn,yn,e),fn=void 0}var _n=null,wn=!1;function $n(e){var t=_n;return _n=e,function(){_n=t}}function xn(e){for(;e&&(e=e.$parent);)if(e._inactive)return!0;return!1}function kn(e,t){if(t){if(e._directInactive=!1,xn(e))return}else if(e._directInactive)return;if(e._inactive||null===e._inactive){e._inactive=!1;for(var n=0;n<e.$children.length;n++)kn(e.$children[n]);An(e,"activated")}}function An(e,t){be();var n=e.$options[t],r=t+" hook";if(n)for(var o=0,i=n.length;o<i;o++)nt(n[o],e,null,e,r);e._hasHookEvent&&e.$emit("hook:"+t),_e()}var Cn=[],Sn=[],On={},Tn={},Mn=!1,jn=!1,In=0,En=0,Nn=Date.now;if(K&&!Y){var Dn=window.performance;Dn&&"function"==typeof Dn.now&&Nn()>document.createEvent("Event").timeStamp&&(Nn=function(){return Dn.now()})}function Ln(){var e,t;for(En=Nn(),jn=!0,Cn.sort((function(e,t){return e.id-t.id})),In=0;In<Cn.length;In++)if((e=Cn[In]).before&&e.before(),t=e.id,On[t]=null,e.run(),null!=On[t]&&(Tn[t]=(Tn[t]||0)+1,Tn[t]>100)){ue("You may have an infinite update loop "+(e.user?'in watcher with expression "'+e.expression+'"':"in a component render function."),e.vm);break}var n=Sn.slice(),r=Cn.slice();In=Cn.length=Sn.length=0,On={},Tn={},Mn=jn=!1,function(e){for(var t=0;t<e.length;t++)e[t]._inactive=!0,kn(e[t],!0)}(n),function(e){for(var t=e.length;t--;){var n=e[t],r=n.vm;r._watcher===n&&r._isMounted&&!r._isDestroyed&&An(r,"updated")}}(r),ae&&H.devtools&&ae.emit("flush")}var Pn=0,Fn=function(e,t,n,r,o){this.vm=e,o&&(e._watcher=this),e._watchers.push(this),r?(this.deep=!!r.deep,this.user=!!r.user,this.lazy=!!r.lazy,this.sync=!!r.sync,this.before=r.before):this.deep=this.user=this.lazy=this.sync=!1,this.cb=n,this.id=++Pn,this.active=!0,this.dirty=this.lazy,this.deps=[],this.newDeps=[],this.depIds=new ce,this.newDepIds=new ce,this.expression=t.toString(),"function"==typeof t?this.getter=t:(this.getter=function(e){if(!q.test(e)){var t=e.split(".");return function(e){for(var n=0;n<t.length;n++){if(!e)return;e=e[t[n]]}return e}}}(t),this.getter||(this.getter=I,ue('Failed watching path: "'+t+'" Watcher only accepts simple dot-delimited paths. For full control, use a function instead.',e))),this.value=this.lazy?void 0:this.get()};Fn.prototype.get=function(){var e;be(this);var t=this.vm;try{e=this.getter.call(t,t)}catch(e){if(!this.user)throw e;tt(e,t,'getter for watcher "'+this.expression+'"')}finally{this.deep&&St(e),_e(),this.cleanupDeps()}return e},Fn.prototype.addDep=function(e){var t=e.id;this.newDepIds.has(t)||(this.newDepIds.add(t),this.newDeps.push(e),this.depIds.has(t)||e.addSub(this))},Fn.prototype.cleanupDeps=function(){for(var e=this.deps.length;e--;){var t=this.deps[e];this.newDepIds.has(t.id)||t.removeSub(this)}var n=this.depIds;this.depIds=this.newDepIds,this.newDepIds=n,this.newDepIds.clear(),n=this.deps,this.deps=this.newDeps,this.newDeps=n,this.newDeps.length=0},Fn.prototype.update=function(){this.lazy?this.dirty=!0:this.sync?this.run():function(e){var t=e.id;if(null==On[t]){if(On[t]=!0,jn){for(var n=Cn.length-1;n>In&&Cn[n].id>e.id;)n--;Cn.splice(n+1,0,e)}else Cn.push(e);if(!Mn){if(Mn=!0,!H.async)return void Ln();mt(Ln)}}}(this)},Fn.prototype.run=function(){if(this.active){var e=this.get();if(e!==this.value||s(e)||this.deep){var t=this.value;if(this.value=e,this.user)try{this.cb.call(this.vm,e,t)}catch(e){tt(e,this.vm,'callback for watcher "'+this.expression+'"')}else this.cb.call(this.vm,e,t)}}},Fn.prototype.evaluate=function(){this.value=this.get(),this.dirty=!1},Fn.prototype.depend=function(){for(var e=this.deps.length;e--;)this.deps[e].depend()},Fn.prototype.teardown=function(){if(this.active){this.vm._isBeingDestroyed||b(this.vm._watchers,this);for(var e=this.deps.length;e--;)this.deps[e].removeSub(this);this.active=!1}};var Rn={enumerable:!0,configurable:!0,get:I,set:I};function Hn(e,t,n){Rn.get=function(){return this[t][n]},Rn.set=function(e){this[t][n]=e},Object.defineProperty(e,n,Rn)}var Un={lazy:!0};function Vn(e,t,n){var r=!ie();"function"==typeof n?(Rn.get=r?Bn(t):zn(n),Rn.set=I):(Rn.get=n.get?r&&!1!==n.cache?Bn(t):zn(n.get):I,Rn.set=n.set||I),Rn.set===I&&(Rn.set=function(){ue('Computed property "'+t+'" was assigned to but it has no setter.',this)}),Object.defineProperty(e,t,Rn)}function Bn(e){return function(){var t=this._computedWatchers&&this._computedWatchers[e];if(t)return t.dirty&&t.evaluate(),ge.target&&t.depend(),t.value}}function zn(e){return function(){return e.call(this,this)}}function qn(e,t,n,r){return u(n)&&(r=n,n=n.handler),"string"==typeof n&&(n=e[n]),e.$watch(t,n,r)}var Jn=0;function Kn(e){var t=e.options;if(e.super){var n=Kn(e.super);if(n!==e.superOptions){e.superOptions=n;var r=function(e){var t,n=e.options,r=e.sealedOptions;for(var o in n)n[o]!==r[o]&&(t||(t={}),t[o]=n[o]);return t}(e);r&&M(e.extendOptions,r),(t=e.options=qe(n,e.extendOptions)).name&&(t.components[t.name]=e)}}return t}function Wn(e){this instanceof Wn||ue("Vue is a constructor and should be called with the `new` keyword"),this._init(e)}function Zn(e){return e&&(e.Ctor.options.name||e.tag)}function Gn(e,t){return Array.isArray(e)?e.indexOf(t)>-1:"string"==typeof e?e.split(",").indexOf(t)>-1:!!f(e)&&e.test(t)}function Yn(e,t){var n=e.cache,r=e.keys,o=e._vnode;for(var i in n){var a=n[i];if(a){var s=Zn(a.componentOptions);s&&!t(s)&&Xn(n,i,r,o)}}}function Xn(e,t,n,r){var o=e[t];!o||r&&o.tag===r.tag||o.componentInstance.$destroy(),e[t]=null,b(n,t)}!function(t){t.prototype._init=function(t){var n,r,o=this;o._uid=Jn++,H.performance&&at&&(n="vue-perf-start:"+o._uid,r="vue-perf-end:"+o._uid,at(n)),o._isVue=!0,t&&t._isComponent?function(e,t){var n=e.$options=Object.create(e.constructor.options),r=t._parentVnode;n.parent=t.parent,n._parentVnode=r;var o=r.componentOptions;n.propsData=o.propsData,n._parentListeners=o.listeners,n._renderChildren=o.children,n._componentTag=o.tag,t.render&&(n.render=t.render,n.staticRenderFns=t.staticRenderFns)}(o,t):o.$options=qe(Kn(o.constructor),t||{},o),gt(o),o._self=o,function(e){var t=e.$options,n=t.parent;if(n&&!t.abstract){for(;n.$options.abstract&&n.$parent;)n=n.$parent;n.$children.push(e)}e.$parent=n,e.$root=n?n.$root:e,e.$children=[],e.$refs={},e._watcher=null,e._inactive=null,e._directInactive=!1,e._isMounted=!1,e._isDestroyed=!1,e._isBeingDestroyed=!1}(o),function(e){e._events=Object.create(null),e._hasHookEvent=!1;var t=e.$options._parentListeners;t&&bn(e,t)}(o),function(t){t._vnode=null,t._staticTrees=null;var n=t.$options,r=t.$vnode=n._parentVnode,o=r&&r.context;t.$slots=Lt(n._renderChildren,o),t.$scopedSlots=e,t._c=function(e,n,r,o){return un(t,e,n,r,o,!1)},t.$createElement=function(e,n,r,o){return un(t,e,n,r,o,!0)};var i=r&&r.data;Ee(t,"$attrs",i&&i.attrs||e,(function(){!wn&&ue("$attrs is readonly.",t)}),!0),Ee(t,"$listeners",n._parentListeners||e,(function(){!wn&&ue("$listeners is readonly.",t)}),!0)}(o),An(o,"beforeCreate"),function(e){var t=Dt(e.$options.inject,e);t&&(Me(!1),Object.keys(t).forEach((function(n){Ee(e,n,t[n],(function(){ue('Avoid mutating an injected value directly since the changes will be overwritten whenever the provided component re-renders. injection being mutated: "'+n+'"',e)}))})),Me(!0))}(o),function(e){e._watchers=[];var t=e.$options;t.props&&function(e,t){var n=e.$options.propsData||{},r=e._props={},o=e.$options._propKeys=[],i=!e.$parent;i||Me(!1);var a=function(a){o.push(a);var s=Ke(a,t,n,e),c=S(a);(y(c)||H.isReservedAttr(c))&&ue('"'+c+'" is a reserved attribute and cannot be used as component prop.',e),Ee(r,a,s,(function(){i||wn||ue("Avoid mutating a prop directly since the value will be overwritten whenever the parent component re-renders. Instead, use a data or computed property based on the prop's value. Prop being mutated: \""+a+'"',e)})),a in e||Hn(e,"_props",a)};for(var s in t)a(s);Me(!0)}(e,t.props),t.methods&&function(e,t){var n=e.$options.props;for(var r in t)"function"!=typeof t[r]&&ue('Method "'+r+'" has type "'+typeof t[r]+'" in the component definition. Did you reference the function correctly?',e),n&&w(n,r)&&ue('Method "'+r+'" has already been defined as a prop.',e),r in e&&V(r)&&ue('Method "'+r+'" conflicts with an existing Vue instance method. Avoid defining component methods that start with _ or $.'),e[r]="function"!=typeof t[r]?I:O(t[r],e)}(e,t.methods),t.data?function(e){var t=e.$options.data;u(t=e._data="function"==typeof t?function(e,t){be();try{return e.call(t,t)}catch(e){return tt(e,t,"data()"),{}}finally{_e()}}(t,e):t||{})||(t={},ue("data functions should return an object:\nhttps://vuejs.org/v2/guide/components.html#data-Must-Be-a-Function",e));for(var n=Object.keys(t),r=e.$options.props,o=e.$options.methods,i=n.length;i--;){var a=n[i];o&&w(o,a)&&ue('Method "'+a+'" has already been defined as a data property.',e),r&&w(r,a)?ue('The data property "'+a+'" is already declared as a prop. Use prop default value instead.',e):V(a)||Hn(e,"_data",a)}Ie(t,!0)}(e):Ie(e._data={},!0),t.computed&&function(e,t){var n=e._computedWatchers=Object.create(null),r=ie();for(var o in t){var i=t[o],a="function"==typeof i?i:i.get;null==a&&ue('Getter is missing for computed property "'+o+'".',e),r||(n[o]=new Fn(e,a||I,I,Un)),o in e?o in e.$data?ue('The computed property "'+o+'" is already defined in data.',e):e.$options.props&&o in e.$options.props&&ue('The computed property "'+o+'" is already defined as a prop.',e):Vn(e,o,i)}}(e,t.computed),t.watch&&t.watch!==ne&&function(e,t){for(var n in t){var r=t[n];if(Array.isArray(r))for(var o=0;o<r.length;o++)qn(e,n,r[o]);else qn(e,n,r)}}(e,t.watch)}(o),function(e){var t=e.$options.provide;t&&(e._provided="function"==typeof t?t.call(e):t)}(o),An(o,"created"),H.performance&&at&&(o._name=de(o,!1),at(r),st("vue "+o._name+" init",n,r)),o.$options.el&&o.$mount(o.$options.el)}}(Wn),function(e){var t={get:function(){return this._data}},n={get:function(){return this._props}};t.set=function(){ue("Avoid replacing instance root $data. Use nested data properties instead.",this)},n.set=function(){ue("$props is readonly.",this)},Object.defineProperty(e.prototype,"$data",t),Object.defineProperty(e.prototype,"$props",n),e.prototype.$set=Ne,e.prototype.$delete=De,e.prototype.$watch=function(e,t,n){if(u(t))return qn(this,e,t,n);(n=n||{}).user=!0;var r=new Fn(this,e,t,n);if(n.immediate)try{t.call(this,r.value)}catch(e){tt(e,this,'callback for immediate watcher "'+r.expression+'"')}return function(){r.teardown()}}}(Wn),function(e){var t=/^hook:/;e.prototype.$on=function(e,n){var r=this;if(Array.isArray(e))for(var o=0,i=e.length;o<i;o++)r.$on(e[o],n);else(r._events[e]||(r._events[e]=[])).push(n),t.test(e)&&(r._hasHookEvent=!0);return r},e.prototype.$once=function(e,t){var n=this;function r(){n.$off(e,r),t.apply(n,arguments)}return r.fn=t,n.$on(e,r),n},e.prototype.$off=function(e,t){var n=this;if(!arguments.length)return n._events=Object.create(null),n;if(Array.isArray(e)){for(var r=0,o=e.length;r<o;r++)n.$off(e[r],t);return n}var i,a=n._events[e];if(!a)return n;if(!t)return n._events[e]=null,n;for(var s=a.length;s--;)if((i=a[s])===t||i.fn===t){a.splice(s,1);break}return n},e.prototype.$emit=function(e){var t=this,n=e.toLowerCase();n!==e&&t._events[n]&&fe('Event "'+n+'" is emitted in component '+de(t)+' but the handler is registered for "'+e+'". Note that HTML attributes are case-insensitive and you cannot use v-on to listen to camelCase events when using in-DOM templates. You should probably use "'+S(e)+'" instead of "'+e+'".');var r=t._events[e];if(r){r=r.length>1?T(r):r;for(var o=T(arguments,1),i='event handler for "'+e+'"',a=0,s=r.length;a<s;a++)nt(r[a],t,o,t,i)}return t}}(Wn),function(e){e.prototype._update=function(e,t){var n=this,r=n.$el,o=n._vnode,i=$n(n);n._vnode=e,n.$el=o?n.__patch__(o,e):n.__patch__(n.$el,e,t,!1),i(),r&&(r.__vue__=null),n.$el&&(n.$el.__vue__=n),n.$vnode&&n.$parent&&n.$vnode===n.$parent._vnode&&(n.$parent.$el=n.$el)},e.prototype.$forceUpdate=function(){this._watcher&&this._watcher.update()},e.prototype.$destroy=function(){var e=this;if(!e._isBeingDestroyed){An(e,"beforeDestroy"),e._isBeingDestroyed=!0;var t=e.$parent;!t||t._isBeingDestroyed||e.$options.abstract||b(t.$children,e),e._watcher&&e._watcher.teardown();for(var n=e._watchers.length;n--;)e._watchers[n].teardown();e._data.__ob__&&e._data.__ob__.vmCount--,e._isDestroyed=!0,e.__patch__(e._vnode,null),An(e,"destroyed"),e.$off(),e.$el&&(e.$el.__vue__=null),e.$vnode&&(e.$vnode.parent=null)}}}(Wn),function(e){tn(e.prototype),e.prototype.$nextTick=function(e){return mt(e,this)},e.prototype._render=function(){var e,t=this,n=t.$options,r=n.render,o=n._parentVnode;o&&(t.$scopedSlots=Ft(o.data.scopedSlots,t.$slots,t.$scopedSlots)),t.$vnode=o;try{dn=t,e=r.call(t._renderProxy,t.$createElement)}catch(n){if(tt(n,t,"render"),t.$options.renderError)try{e=t.$options.renderError.call(t._renderProxy,t.$createElement,n)}catch(n){tt(n,t,"renderError"),e=t._vnode}else e=t._vnode}finally{dn=null}return Array.isArray(e)&&1===e.length&&(e=e[0]),e instanceof we||(Array.isArray(e)&&ue("Multiple root nodes returned from render function. Render function should return a single root node.",t),e=xe()),e.parent=o,e}}(Wn);var Qn=[String,RegExp,Array],er={KeepAlive:{name:"keep-alive",abstract:!0,props:{include:Qn,exclude:Qn,max:[String,Number]},created:function(){this.cache=Object.create(null),this.keys=[]},destroyed:function(){for(var e in this.cache)Xn(this.cache,e,this.keys)},mounted:function(){var e=this;this.$watch("include",(function(t){Yn(e,(function(e){return Gn(t,e)}))})),this.$watch("exclude",(function(t){Yn(e,(function(e){return!Gn(t,e)}))}))},render:function(){var e=this.$slots.default,t=hn(e),n=t&&t.componentOptions;if(n){var r=Zn(n),o=this.include,i=this.exclude;if(o&&(!r||!Gn(o,r))||i&&r&&Gn(i,r))return t;var a=this.cache,s=this.keys,c=null==t.key?n.Ctor.cid+(n.tag?"::"+n.tag:""):t.key;a[c]?(t.componentInstance=a[c].componentInstance,b(s,c),s.push(c)):(a[c]=t,s.push(c),this.max&&s.length>parseInt(this.max)&&Xn(a,s[0],s,this._vnode)),t.data.keepAlive=!0}return t||e&&e[0]}}};!function(e){var t={get:function(){return H},set:function(){ue("Do not replace the Vue.config object, set individual fields instead.")}};Object.defineProperty(e,"config",t),e.util={warn:ue,extend:M,mergeOptions:qe,defineReactive:Ee},e.set=Ne,e.delete=De,e.nextTick=mt,e.observable=function(e){return Ie(e),e},e.options=Object.create(null),F.forEach((function(t){e.options[t+"s"]=Object.create(null)})),e.options._base=e,M(e.options.components,er),function(e){e.use=function(e){var t=this._installedPlugins||(this._installedPlugins=[]);if(t.indexOf(e)>-1)return this;var n=T(arguments,1);return n.unshift(this),"function"==typeof e.install?e.install.apply(e,n):"function"==typeof e&&e.apply(null,n),t.push(e),this}}(e),function(e){e.mixin=function(e){return this.options=qe(this.options,e),this}}(e),function(e){e.cid=0;var t=1;e.extend=function(e){e=e||{};var n=this,r=n.cid,o=e._Ctor||(e._Ctor={});if(o[r])return o[r];var i=e.name||n.options.name;i&&Be(i);var a=function(e){this._init(e)};return(a.prototype=Object.create(n.prototype)).constructor=a,a.cid=t++,a.options=qe(n.options,e),a.super=n,a.options.props&&function(e){var t=e.options.props;for(var n in t)Hn(e.prototype,"_props",n)}(a),a.options.computed&&function(e){var t=e.options.computed;for(var n in t)Vn(e.prototype,n,t[n])}(a),a.extend=n.extend,a.mixin=n.mixin,a.use=n.use,F.forEach((function(e){a[e]=n[e]})),i&&(a.options.components[i]=a),a.superOptions=n.options,a.extendOptions=e,a.sealedOptions=M({},a.options),o[r]=a,a}}(e),function(e){F.forEach((function(t){e[t]=function(e,n){return n?("component"===t&&Be(e),"component"===t&&u(n)&&(n.name=n.name||e,n=this.options._base.extend(n)),"directive"===t&&"function"==typeof n&&(n={bind:n,update:n}),this.options[t+"s"][e]=n,n):this.options[t+"s"][e]}}))}(e)}(Wn),Object.defineProperty(Wn.prototype,"$isServer",{get:ie}),Object.defineProperty(Wn.prototype,"$ssrContext",{get:function(){return this.$vnode&&this.$vnode.ssrContext}}),Object.defineProperty(Wn,"FunctionalRenderContext",{value:nn}),Wn.version="2.6.12";var tr=m("style,class"),nr=m("input,textarea,option,select,progress"),rr=function(e,t,n){return"value"===n&&nr(e)&&"button"!==t||"selected"===n&&"option"===e||"checked"===n&&"input"===e||"muted"===n&&"video"===e},or=m("contenteditable,draggable,spellcheck"),ir=m("events,caret,typing,plaintext-only"),ar=m("allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare,default,defaultchecked,defaultmuted,defaultselected,defer,disabled,enabled,formnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple,muted,nohref,noresize,noshade,novalidate,nowrap,open,pauseonexit,readonly,required,reversed,scoped,seamless,selected,sortable,translate,truespeed,typemustmatch,visible"),sr="http://www.w3.org/1999/xlink",cr=function(e){return":"===e.charAt(5)&&"xlink"===e.slice(0,5)},lr=function(e){return cr(e)?e.slice(6,e.length):""},ur=function(e){return null==e||!1===e};function fr(e,t){return{staticClass:dr(e.staticClass,t.staticClass),class:o(e.class)?[e.class,t.class]:t.class}}function dr(e,t){return e?t?e+" "+t:e:t||""}function pr(e){return Array.isArray(e)?function(e){for(var t,n="",r=0,i=e.length;r<i;r++)o(t=pr(e[r]))&&""!==t&&(n&&(n+=" "),n+=t);return n}(e):s(e)?function(e){var t="";for(var n in e)e[n]&&(t&&(t+=" "),t+=n);return t}(e):"string"==typeof e?e:""}var vr={svg:"http://www.w3.org/2000/svg",math:"http://www.w3.org/1998/Math/MathML"},hr=m("html,body,base,head,link,meta,style,title,address,article,aside,footer,header,h1,h2,h3,h4,h5,h6,hgroup,nav,section,div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,rtc,ruby,s,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,output,progress,select,textarea,details,dialog,menu,menuitem,summary,content,element,shadow,template,blockquote,iframe,tfoot"),mr=m("svg,animate,circle,clippath,cursor,defs,desc,ellipse,filter,font-face,foreignObject,g,glyph,image,line,marker,mask,missing-glyph,path,pattern,polygon,polyline,rect,switch,symbol,text,textpath,tspan,use,view",!0),gr=function(e){return hr(e)||mr(e)};function yr(e){return mr(e)?"svg":"math"===e?"math":void 0}var br=Object.create(null),_r=m("text,number,password,search,email,tel,url");function wr(e){return"string"==typeof e?document.querySelector(e)||(ue("Cannot find element: "+e),document.createElement("div")):e}var $r=Object.freeze({createElement:function(e,t){var n=document.createElement(e);return"select"!==e||t.data&&t.data.attrs&&void 0!==t.data.attrs.multiple&&n.setAttribute("multiple","multiple"),n},createElementNS:function(e,t){return document.createElementNS(vr[e],t)},createTextNode:function(e){return document.createTextNode(e)},createComment:function(e){return document.createComment(e)},insertBefore:function(e,t,n){e.insertBefore(t,n)},removeChild:function(e,t){e.removeChild(t)},appendChild:function(e,t){e.appendChild(t)},parentNode:function(e){return e.parentNode},nextSibling:function(e){return e.nextSibling},tagName:function(e){return e.tagName},setTextContent:function(e,t){e.textContent=t},setStyleScope:function(e,t){e.setAttribute(t,"")}}),xr={create:function(e,t){kr(t)},update:function(e,t){e.data.ref!==t.data.ref&&(kr(e,!0),kr(t))},destroy:function(e){kr(e,!0)}};function kr(e,t){var n=e.data.ref;if(o(n)){var r=e.context,i=e.componentInstance||e.elm,a=r.$refs;t?Array.isArray(a[n])?b(a[n],i):a[n]===i&&(a[n]=void 0):e.data.refInFor?Array.isArray(a[n])?a[n].indexOf(i)<0&&a[n].push(i):a[n]=[i]:a[n]=i}}var Ar=new we("",{},[]),Cr=["create","activate","update","remove","destroy"];function Sr(e,t){return e.key===t.key&&(e.tag===t.tag&&e.isComment===t.isComment&&o(e.data)===o(t.data)&&function(e,t){if("input"!==e.tag)return!0;var n,r=o(n=e.data)&&o(n=n.attrs)&&n.type,i=o(n=t.data)&&o(n=n.attrs)&&n.type;return r===i||_r(r)&&_r(i)}(e,t)||i(e.isAsyncPlaceholder)&&e.asyncFactory===t.asyncFactory&&r(t.asyncFactory.error))}function Or(e,t,n){var r,i,a={};for(r=t;r<=n;++r)o(i=e[r].key)&&(a[i]=r);return a}var Tr={create:Mr,update:Mr,destroy:function(e){Mr(e,Ar)}};function Mr(e,t){(e.data.directives||t.data.directives)&&function(e,t){var n,r,o,i=e===Ar,a=t===Ar,s=Ir(e.data.directives,e.context),c=Ir(t.data.directives,t.context),l=[],u=[];for(n in c)r=s[n],o=c[n],r?(o.oldValue=r.value,o.oldArg=r.arg,Nr(o,"update",t,e),o.def&&o.def.componentUpdated&&u.push(o)):(Nr(o,"bind",t,e),o.def&&o.def.inserted&&l.push(o));if(l.length){var f=function(){for(var n=0;n<l.length;n++)Nr(l[n],"inserted",t,e)};i?jt(t,"insert",f):f()}if(u.length&&jt(t,"postpatch",(function(){for(var n=0;n<u.length;n++)Nr(u[n],"componentUpdated",t,e)})),!i)for(n in s)c[n]||Nr(s[n],"unbind",e,e,a)}(e,t)}var jr=Object.create(null);function Ir(e,t){var n,r,o=Object.create(null);if(!e)return o;for(n=0;n<e.length;n++)(r=e[n]).modifiers||(r.modifiers=jr),o[Er(r)]=r,r.def=Je(t.$options,"directives",r.name,!0);return o}function Er(e){return e.rawName||e.name+"."+Object.keys(e.modifiers||{}).join(".")}function Nr(e,t,n,r,o){var i=e.def&&e.def[t];if(i)try{i(n.elm,e,n,r,o)}catch(r){tt(r,n.context,"directive "+e.name+" "+t+" hook")}}var Dr=[xr,Tr];function Lr(e,t){var n=t.componentOptions;if(!(o(n)&&!1===n.Ctor.options.inheritAttrs||r(e.data.attrs)&&r(t.data.attrs))){var i,a,s=t.elm,c=e.data.attrs||{},l=t.data.attrs||{};for(i in o(l.__ob__)&&(l=t.data.attrs=M({},l)),l)a=l[i],c[i]!==a&&Pr(s,i,a);for(i in(Y||Q)&&l.value!==c.value&&Pr(s,"value",l.value),c)r(l[i])&&(cr(i)?s.removeAttributeNS(sr,lr(i)):or(i)||s.removeAttribute(i))}}function Pr(e,t,n){e.tagName.indexOf("-")>-1?Fr(e,t,n):ar(t)?ur(n)?e.removeAttribute(t):(n="allowfullscreen"===t&&"EMBED"===e.tagName?"true":t,e.setAttribute(t,n)):or(t)?e.setAttribute(t,function(e,t){return ur(t)||"false"===t?"false":"contenteditable"===e&&ir(t)?t:"true"}(t,n)):cr(t)?ur(n)?e.removeAttributeNS(sr,lr(t)):e.setAttributeNS(sr,t,n):Fr(e,t,n)}function Fr(e,t,n){if(ur(n))e.removeAttribute(t);else{if(Y&&!X&&"TEXTAREA"===e.tagName&&"placeholder"===t&&""!==n&&!e.__ieph){var r=function(t){t.stopImmediatePropagation(),e.removeEventListener("input",r)};e.addEventListener("input",r),e.__ieph=!0}e.setAttribute(t,n)}}var Rr={create:Lr,update:Lr};function Hr(e,t){var n=t.elm,i=t.data,a=e.data;if(!(r(i.staticClass)&&r(i.class)&&(r(a)||r(a.staticClass)&&r(a.class)))){var s=function(e){for(var t=e.data,n=e,r=e;o(r.componentInstance);)(r=r.componentInstance._vnode)&&r.data&&(t=fr(r.data,t));for(;o(n=n.parent);)n&&n.data&&(t=fr(t,n.data));return i=t.staticClass,a=t.class,o(i)||o(a)?dr(i,pr(a)):"";var i,a}(t),c=n._transitionClasses;o(c)&&(s=dr(s,pr(c))),s!==n._prevClass&&(n.setAttribute("class",s),n._prevClass=s)}}var Ur,Vr,Br,zr,qr,Jr,Kr,Wr,Zr={create:Hr,update:Hr},Gr=/[\w).+\-_$\]]/;function Yr(e){var t,n,r,o,i,a=!1,s=!1,c=!1,l=!1,u=0,f=0,d=0,p=0;for(r=0;r<e.length;r++)if(n=t,t=e.charCodeAt(r),a)39===t&&92!==n&&(a=!1);else if(s)34===t&&92!==n&&(s=!1);else if(c)96===t&&92!==n&&(c=!1);else if(l)47===t&&92!==n&&(l=!1);else if(124!==t||124===e.charCodeAt(r+1)||124===e.charCodeAt(r-1)||u||f||d){switch(t){case 34:s=!0;break;case 39:a=!0;break;case 96:c=!0;break;case 40:d++;break;case 41:d--;break;case 91:f++;break;case 93:f--;break;case 123:u++;break;case 125:u--}if(47===t){for(var v=r-1,h=void 0;v>=0&&" "===(h=e.charAt(v));v--);h&&Gr.test(h)||(l=!0)}}else void 0===o?(p=r+1,o=e.slice(0,r).trim()):m();function m(){(i||(i=[])).push(e.slice(p,r).trim()),p=r+1}if(void 0===o?o=e.slice(0,r).trim():0!==p&&m(),i)for(r=0;r<i.length;r++)o=Xr(o,i[r]);return o}function Xr(e,t){var n=t.indexOf("(");if(n<0)return'_f("'+t+'")('+e+")";var r=t.slice(0,n),o=t.slice(n+1);return'_f("'+r+'")('+e+(")"!==o?","+o:o)}function Qr(e,t){console.error("[Vue compiler]: "+e)}function eo(e,t){return e?e.map((function(e){return e[t]})).filter((function(e){return e})):[]}function to(e,t,n,r,o){(e.props||(e.props=[])).push(fo({name:t,value:n,dynamic:o},r)),e.plain=!1}function no(e,t,n,r,o){(o?e.dynamicAttrs||(e.dynamicAttrs=[]):e.attrs||(e.attrs=[])).push(fo({name:t,value:n,dynamic:o},r)),e.plain=!1}function ro(e,t,n,r){e.attrsMap[t]=n,e.attrsList.push(fo({name:t,value:n},r))}function oo(e,t,n,r,o,i,a,s){(e.directives||(e.directives=[])).push(fo({name:t,rawName:n,value:r,arg:o,isDynamicArg:i,modifiers:a},s)),e.plain=!1}function io(e,t,n){return n?"_p("+t+',"'+e+'")':e+t}function ao(t,n,r,o,i,a,s,c){var l;o=o||e,a&&o.prevent&&o.passive&&a("passive and prevent can't be used together. Passive handler can't prevent default event.",s),o.right?c?n="("+n+")==='click'?'contextmenu':("+n+")":"click"===n&&(n="contextmenu",delete o.right):o.middle&&(c?n="("+n+")==='click'?'mouseup':("+n+")":"click"===n&&(n="mouseup")),o.capture&&(delete o.capture,n=io("!",n,c)),o.once&&(delete o.once,n=io("~",n,c)),o.passive&&(delete o.passive,n=io("&",n,c)),o.native?(delete o.native,l=t.nativeEvents||(t.nativeEvents={})):l=t.events||(t.events={});var u=fo({value:r.trim(),dynamic:c},s);o!==e&&(u.modifiers=o);var f=l[n];Array.isArray(f)?i?f.unshift(u):f.push(u):l[n]=f?i?[u,f]:[f,u]:u,t.plain=!1}function so(e,t){return e.rawAttrsMap[":"+t]||e.rawAttrsMap["v-bind:"+t]||e.rawAttrsMap[t]}function co(e,t,n){var r=lo(e,":"+t)||lo(e,"v-bind:"+t);if(null!=r)return Yr(r);if(!1!==n){var o=lo(e,t);if(null!=o)return JSON.stringify(o)}}function lo(e,t,n){var r;if(null!=(r=e.attrsMap[t]))for(var o=e.attrsList,i=0,a=o.length;i<a;i++)if(o[i].name===t){o.splice(i,1);break}return n&&delete e.attrsMap[t],r}function uo(e,t){for(var n=e.attrsList,r=0,o=n.length;r<o;r++){var i=n[r];if(t.test(i.name))return n.splice(r,1),i}}function fo(e,t){return t&&(null!=t.start&&(e.start=t.start),null!=t.end&&(e.end=t.end)),e}function po(e,t,n){var r=n||{},o=r.number,i="$$v";r.trim&&(i="(typeof $$v === 'string'? $$v.trim(): $$v)"),o&&(i="_n("+i+")");var a=vo(t,i);e.model={value:"("+t+")",expression:JSON.stringify(t),callback:"function ($$v) {"+a+"}"}}function vo(e,t){var n=function(e){if(e=e.trim(),Ur=e.length,e.indexOf("[")<0||e.lastIndexOf("]")<Ur-1)return(zr=e.lastIndexOf("."))>-1?{exp:e.slice(0,zr),key:'"'+e.slice(zr+1)+'"'}:{exp:e,key:null};for(Vr=e,zr=qr=Jr=0;!mo();)go(Br=ho())?bo(Br):91===Br&&yo(Br);return{exp:e.slice(0,qr),key:e.slice(qr+1,Jr)}}(e);return null===n.key?e+"="+t:"$set("+n.exp+", "+n.key+", "+t+")"}function ho(){return Vr.charCodeAt(++zr)}function mo(){return zr>=Ur}function go(e){return 34===e||39===e}function yo(e){var t=1;for(qr=zr;!mo();)if(go(e=ho()))bo(e);else if(91===e&&t++,93===e&&t--,0===t){Jr=zr;break}}function bo(e){for(var t=e;!mo()&&(e=ho())!==t;);}function _o(e,t,n){var r=Wr;return function o(){var i=t.apply(null,arguments);null!==i&&xo(e,o,n,r)}}var wo=ct&&!(te&&Number(te[1])<=53);function $o(e,t,n,r){if(wo){var o=En,i=t;t=i._wrapper=function(e){if(e.target===e.currentTarget||e.timeStamp>=o||e.timeStamp<=0||e.target.ownerDocument!==document)return i.apply(this,arguments)}}Wr.addEventListener(e,t,re?{capture:n,passive:r}:n)}function xo(e,t,n,r){(r||Wr).removeEventListener(e,t._wrapper||t,n)}function ko(e,t){if(!r(e.data.on)||!r(t.data.on)){var n=t.data.on||{},i=e.data.on||{};Wr=t.elm,function(e){if(o(e.__r)){var t=Y?"change":"input";e[t]=[].concat(e.__r,e[t]||[]),delete e.__r}o(e.__c)&&(e.change=[].concat(e.__c,e.change||[]),delete e.__c)}(n),Mt(n,i,$o,xo,_o,t.context),Wr=void 0}}var Ao,Co={create:ko,update:ko};function So(e,t){if(!r(e.data.domProps)||!r(t.data.domProps)){var n,i,a=t.elm,s=e.data.domProps||{},c=t.data.domProps||{};for(n in o(c.__ob__)&&(c=t.data.domProps=M({},c)),s)n in c||(a[n]="");for(n in c){if(i=c[n],"textContent"===n||"innerHTML"===n){if(t.children&&(t.children.length=0),i===s[n])continue;1===a.childNodes.length&&a.removeChild(a.childNodes[0])}if("value"===n&&"PROGRESS"!==a.tagName){a._value=i;var l=r(i)?"":String(i);Oo(a,l)&&(a.value=l)}else if("innerHTML"===n&&mr(a.tagName)&&r(a.innerHTML)){(Ao=Ao||document.createElement("div")).innerHTML="<svg>"+i+"</svg>";for(var u=Ao.firstChild;a.firstChild;)a.removeChild(a.firstChild);for(;u.firstChild;)a.appendChild(u.firstChild)}else if(i!==s[n])try{a[n]=i}catch(e){}}}}function Oo(e,t){return!e.composing&&("OPTION"===e.tagName||function(e,t){var n=!0;try{n=document.activeElement!==e}catch(e){}return n&&e.value!==t}(e,t)||function(e,t){var n=e.value,r=e._vModifiers;if(o(r)){if(r.number)return h(n)!==h(t);if(r.trim)return n.trim()!==t.trim()}return n!==t}(e,t))}var To={create:So,update:So},Mo=$((function(e){var t={},n=/:(.+)/;return e.split(/;(?![^(]*\))/g).forEach((function(e){if(e){var r=e.split(n);r.length>1&&(t[r[0].trim()]=r[1].trim())}})),t}));function jo(e){var t=Io(e.style);return e.staticStyle?M(e.staticStyle,t):t}function Io(e){return Array.isArray(e)?j(e):"string"==typeof e?Mo(e):e}var Eo,No=/^--/,Do=/\s*!important$/,Lo=function(e,t,n){if(No.test(t))e.style.setProperty(t,n);else if(Do.test(n))e.style.setProperty(S(t),n.replace(Do,""),"important");else{var r=Fo(t);if(Array.isArray(n))for(var o=0,i=n.length;o<i;o++)e.style[r]=n[o];else e.style[r]=n}},Po=["Webkit","Moz","ms"],Fo=$((function(e){if(Eo=Eo||document.createElement("div").style,"filter"!==(e=k(e))&&e in Eo)return e;for(var t=e.charAt(0).toUpperCase()+e.slice(1),n=0;n<Po.length;n++){var r=Po[n]+t;if(r in Eo)return r}}));function Ro(e,t){var n=t.data,i=e.data;if(!(r(n.staticStyle)&&r(n.style)&&r(i.staticStyle)&&r(i.style))){var a,s,c=t.elm,l=i.staticStyle,u=i.normalizedStyle||i.style||{},f=l||u,d=Io(t.data.style)||{};t.data.normalizedStyle=o(d.__ob__)?M({},d):d;var p=function(e,t){for(var n,r={},o=e;o.componentInstance;)(o=o.componentInstance._vnode)&&o.data&&(n=jo(o.data))&&M(r,n);(n=jo(e.data))&&M(r,n);for(var i=e;i=i.parent;)i.data&&(n=jo(i.data))&&M(r,n);return r}(t);for(s in f)r(p[s])&&Lo(c,s,"");for(s in p)(a=p[s])!==f[s]&&Lo(c,s,null==a?"":a)}}var Ho={create:Ro,update:Ro},Uo=/\s+/;function Vo(e,t){if(t&&(t=t.trim()))if(e.classList)t.indexOf(" ")>-1?t.split(Uo).forEach((function(t){return e.classList.add(t)})):e.classList.add(t);else{var n=" "+(e.getAttribute("class")||"")+" ";n.indexOf(" "+t+" ")<0&&e.setAttribute("class",(n+t).trim())}}function Bo(e,t){if(t&&(t=t.trim()))if(e.classList)t.indexOf(" ")>-1?t.split(Uo).forEach((function(t){return e.classList.remove(t)})):e.classList.remove(t),e.classList.length||e.removeAttribute("class");else{for(var n=" "+(e.getAttribute("class")||"")+" ",r=" "+t+" ";n.indexOf(r)>=0;)n=n.replace(r," ");(n=n.trim())?e.setAttribute("class",n):e.removeAttribute("class")}}function zo(e){if(e){if("object"==typeof e){var t={};return!1!==e.css&&M(t,qo(e.name||"v")),M(t,e),t}return"string"==typeof e?qo(e):void 0}}var qo=$((function(e){return{enterClass:e+"-enter",enterToClass:e+"-enter-to",enterActiveClass:e+"-enter-active",leaveClass:e+"-leave",leaveToClass:e+"-leave-to",leaveActiveClass:e+"-leave-active"}})),Jo=K&&!X,Ko="transition",Wo="transitionend",Zo="animation",Go="animationend";Jo&&(void 0===window.ontransitionend&&void 0!==window.onwebkittransitionend&&(Ko="WebkitTransition",Wo="webkitTransitionEnd"),void 0===window.onanimationend&&void 0!==window.onwebkitanimationend&&(Zo="WebkitAnimation",Go="webkitAnimationEnd"));var Yo=K?window.requestAnimationFrame?window.requestAnimationFrame.bind(window):setTimeout:function(e){return e()};function Xo(e){Yo((function(){Yo(e)}))}function Qo(e,t){var n=e._transitionClasses||(e._transitionClasses=[]);n.indexOf(t)<0&&(n.push(t),Vo(e,t))}function ei(e,t){e._transitionClasses&&b(e._transitionClasses,t),Bo(e,t)}function ti(e,t,n){var r=ri(e,t),o=r.type,i=r.timeout,a=r.propCount;if(!o)return n();var s="transition"===o?Wo:Go,c=0,l=function(){e.removeEventListener(s,u),n()},u=function(t){t.target===e&&++c>=a&&l()};setTimeout((function(){c<a&&l()}),i+1),e.addEventListener(s,u)}var ni=/\b(transform|all)(,|$)/;function ri(e,t){var n,r=window.getComputedStyle(e),o=(r[Ko+"Delay"]||"").split(", "),i=(r[Ko+"Duration"]||"").split(", "),a=oi(o,i),s=(r[Zo+"Delay"]||"").split(", "),c=(r[Zo+"Duration"]||"").split(", "),l=oi(s,c),u=0,f=0;return"transition"===t?a>0&&(n="transition",u=a,f=i.length):"animation"===t?l>0&&(n="animation",u=l,f=c.length):f=(n=(u=Math.max(a,l))>0?a>l?"transition":"animation":null)?"transition"===n?i.length:c.length:0,{type:n,timeout:u,propCount:f,hasTransform:"transition"===n&&ni.test(r[Ko+"Property"])}}function oi(e,t){for(;e.length<t.length;)e=e.concat(e);return Math.max.apply(null,t.map((function(t,n){return ii(t)+ii(e[n])})))}function ii(e){return 1e3*Number(e.slice(0,-1).replace(",","."))}function ai(e,t){var n=e.elm;o(n._leaveCb)&&(n._leaveCb.cancelled=!0,n._leaveCb());var i=zo(e.data.transition);if(!r(i)&&!o(n._enterCb)&&1===n.nodeType){for(var a=i.css,c=i.type,l=i.enterClass,u=i.enterToClass,f=i.enterActiveClass,d=i.appearClass,p=i.appearToClass,v=i.appearActiveClass,m=i.beforeEnter,g=i.enter,y=i.afterEnter,b=i.enterCancelled,_=i.beforeAppear,w=i.appear,$=i.afterAppear,x=i.appearCancelled,k=i.duration,A=_n,C=_n.$vnode;C&&C.parent;)A=C.context,C=C.parent;var S=!A._isMounted||!e.isRootInsert;if(!S||w||""===w){var O=S&&d?d:l,T=S&&v?v:f,M=S&&p?p:u,j=S&&_||m,I=S&&"function"==typeof w?w:g,E=S&&$||y,N=S&&x||b,D=h(s(k)?k.enter:k);null!=D&&ci(D,"enter",e);var L=!1!==a&&!X,F=ui(I),R=n._enterCb=P((function(){L&&(ei(n,M),ei(n,T)),R.cancelled?(L&&ei(n,O),N&&N(n)):E&&E(n),n._enterCb=null}));e.data.show||jt(e,"insert",(function(){var t=n.parentNode,r=t&&t._pending&&t._pending[e.key];r&&r.tag===e.tag&&r.elm._leaveCb&&r.elm._leaveCb(),I&&I(n,R)})),j&&j(n),L&&(Qo(n,O),Qo(n,T),Xo((function(){ei(n,O),R.cancelled||(Qo(n,M),F||(li(D)?setTimeout(R,D):ti(n,c,R)))}))),e.data.show&&(t&&t(),I&&I(n,R)),L||F||R()}}}function si(e,t){var n=e.elm;o(n._enterCb)&&(n._enterCb.cancelled=!0,n._enterCb());var i=zo(e.data.transition);if(r(i)||1!==n.nodeType)return t();if(!o(n._leaveCb)){var a=i.css,c=i.type,l=i.leaveClass,u=i.leaveToClass,f=i.leaveActiveClass,d=i.beforeLeave,p=i.leave,v=i.afterLeave,m=i.leaveCancelled,g=i.delayLeave,y=i.duration,b=!1!==a&&!X,_=ui(p),w=h(s(y)?y.leave:y);o(w)&&ci(w,"leave",e);var $=n._leaveCb=P((function(){n.parentNode&&n.parentNode._pending&&(n.parentNode._pending[e.key]=null),b&&(ei(n,u),ei(n,f)),$.cancelled?(b&&ei(n,l),m&&m(n)):(t(),v&&v(n)),n._leaveCb=null}));g?g(x):x()}function x(){$.cancelled||(!e.data.show&&n.parentNode&&((n.parentNode._pending||(n.parentNode._pending={}))[e.key]=e),d&&d(n),b&&(Qo(n,l),Qo(n,f),Xo((function(){ei(n,l),$.cancelled||(Qo(n,u),_||(li(w)?setTimeout($,w):ti(n,c,$)))}))),p&&p(n,$),b||_||$())}}function ci(e,t,n){"number"!=typeof e?ue("<transition> explicit "+t+" duration is not a valid number - got "+JSON.stringify(e)+".",n.context):isNaN(e)&&ue("<transition> explicit "+t+" duration is NaN - the duration expression might be incorrect.",n.context)}function li(e){return"number"==typeof e&&!isNaN(e)}function ui(e){if(r(e))return!1;var t=e.fns;return o(t)?ui(Array.isArray(t)?t[0]:t):(e._length||e.length)>1}function fi(e,t){!0!==t.data.show&&ai(t)}var di=function(e){var t,n,s={},c=e.modules,l=e.nodeOps;for(t=0;t<Cr.length;++t)for(s[Cr[t]]=[],n=0;n<c.length;++n)o(c[n][Cr[t]])&&s[Cr[t]].push(c[n][Cr[t]]);function u(e){var t=l.parentNode(e);o(t)&&l.removeChild(t,e)}function d(e,t){return!t&&!e.ns&&!(H.ignoredElements.length&&H.ignoredElements.some((function(t){return f(t)?t.test(e.tag):t===e.tag})))&&H.isUnknownElement(e.tag)}var p=0;function v(e,t,n,r,a,c,u){if(o(e.elm)&&o(c)&&(e=c[u]=Ae(e)),e.isRootInsert=!a,!function(e,t,n,r){var a=e.data;if(o(a)){var c=o(e.componentInstance)&&a.keepAlive;if(o(a=a.hook)&&o(a=a.init)&&a(e,!1),o(e.componentInstance))return h(e,t),g(n,e.elm,r),i(c)&&function(e,t,n,r){for(var i,a=e;a.componentInstance;)if(o(i=(a=a.componentInstance._vnode).data)&&o(i=i.transition)){for(i=0;i<s.activate.length;++i)s.activate[i](Ar,a);t.push(a);break}g(n,e.elm,r)}(e,t,n,r),!0}}(e,t,n,r)){var f=e.data,v=e.children,m=e.tag;o(m)?(f&&f.pre&&p++,d(e,p)&&ue("Unknown custom element: <"+m+'> - did you register the component correctly? For recursive components, make sure to provide the "name" option.',e.context),e.elm=e.ns?l.createElementNS(e.ns,m):l.createElement(m,e),w(e),y(e,v,t),o(f)&&_(e,t),g(n,e.elm,r),f&&f.pre&&p--):i(e.isComment)?(e.elm=l.createComment(e.text),g(n,e.elm,r)):(e.elm=l.createTextNode(e.text),g(n,e.elm,r))}}function h(e,t){o(e.data.pendingInsert)&&(t.push.apply(t,e.data.pendingInsert),e.data.pendingInsert=null),e.elm=e.componentInstance.$el,b(e)?(_(e,t),w(e)):(kr(e),t.push(e))}function g(e,t,n){o(e)&&(o(n)?l.parentNode(n)===e&&l.insertBefore(e,t,n):l.appendChild(e,t))}function y(e,t,n){if(Array.isArray(t)){C(t);for(var r=0;r<t.length;++r)v(t[r],n,e.elm,null,!0,t,r)}else a(e.text)&&l.appendChild(e.elm,l.createTextNode(String(e.text)))}function b(e){for(;e.componentInstance;)e=e.componentInstance._vnode;return o(e.tag)}function _(e,n){for(var r=0;r<s.create.length;++r)s.create[r](Ar,e);o(t=e.data.hook)&&(o(t.create)&&t.create(Ar,e),o(t.insert)&&n.push(e))}function w(e){var t;if(o(t=e.fnScopeId))l.setStyleScope(e.elm,t);else for(var n=e;n;)o(t=n.context)&&o(t=t.$options._scopeId)&&l.setStyleScope(e.elm,t),n=n.parent;o(t=_n)&&t!==e.context&&t!==e.fnContext&&o(t=t.$options._scopeId)&&l.setStyleScope(e.elm,t)}function $(e,t,n,r,o,i){for(;r<=o;++r)v(n[r],i,e,t,!1,n,r)}function x(e){var t,n,r=e.data;if(o(r))for(o(t=r.hook)&&o(t=t.destroy)&&t(e),t=0;t<s.destroy.length;++t)s.destroy[t](e);if(o(t=e.children))for(n=0;n<e.children.length;++n)x(e.children[n])}function k(e,t,n){for(;t<=n;++t){var r=e[t];o(r)&&(o(r.tag)?(A(r),x(r)):u(r.elm))}}function A(e,t){if(o(t)||o(e.data)){var n,r=s.remove.length+1;for(o(t)?t.listeners+=r:t=function(e,t){function n(){0==--n.listeners&&u(e)}return n.listeners=t,n}(e.elm,r),o(n=e.componentInstance)&&o(n=n._vnode)&&o(n.data)&&A(n,t),n=0;n<s.remove.length;++n)s.remove[n](e,t);o(n=e.data.hook)&&o(n=n.remove)?n(e,t):t()}else u(e.elm)}function C(e){for(var t={},n=0;n<e.length;n++){var r=e[n],i=r.key;o(i)&&(t[i]?ue("Duplicate keys detected: '"+i+"'. This may cause an update error.",r.context):t[i]=!0)}}function S(e,t,n,r){for(var i=n;i<r;i++){var a=t[i];if(o(a)&&Sr(e,a))return i}}function O(e,t,n){if(i(n)&&o(e.parent))e.parent.data.pendingInsert=t;else for(var r=0;r<t.length;++r)t[r].data.hook.insert(t[r])}var T=!1,M=m("attrs,class,staticClass,staticStyle,key");function j(e,t,n,r){var a,s=t.tag,c=t.data,l=t.children;if(r=r||c&&c.pre,t.elm=e,i(t.isComment)&&o(t.asyncFactory))return t.isAsyncPlaceholder=!0,!0;if(!function(e,t,n){return o(t.tag)?0===t.tag.indexOf("vue-component")||!d(t,n)&&t.tag.toLowerCase()===(e.tagName&&e.tagName.toLowerCase()):e.nodeType===(t.isComment?8:3)}(e,t,r))return!1;if(o(c)&&(o(a=c.hook)&&o(a=a.init)&&a(t,!0),o(a=t.componentInstance)))return h(t,n),!0;if(o(s)){if(o(l))if(e.hasChildNodes())if(o(a=c)&&o(a=a.domProps)&&o(a=a.innerHTML)){if(a!==e.innerHTML)return"undefined"==typeof console||T||(T=!0,console.warn("Parent: ",e),console.warn("server innerHTML: ",a),console.warn("client innerHTML: ",e.innerHTML)),!1}else{for(var u=!0,f=e.firstChild,p=0;p<l.length;p++){if(!f||!j(f,l[p],n,r)){u=!1;break}f=f.nextSibling}if(!u||f)return"undefined"==typeof console||T||(T=!0,console.warn("Parent: ",e),console.warn("Mismatching childNodes vs. VNodes: ",e.childNodes,l)),!1}else y(t,l,n);if(o(c)){var v=!1;for(var m in c)if(!M(m)){v=!0,_(t,n);break}!v&&c.class&&St(c.class)}}else e.data!==t.text&&(e.data=t.text);return!0}return function(e,t,n,a){if(!r(t)){var c,u=!1,f=[];if(r(e))u=!0,v(t,f);else{var d=o(e.nodeType);if(!d&&Sr(e,t))!function e(t,n,a,c,u,f){if(t!==n){o(n.elm)&&o(c)&&(n=c[u]=Ae(n));var d=n.elm=t.elm;if(i(t.isAsyncPlaceholder))o(n.asyncFactory.resolved)?j(t.elm,n,a):n.isAsyncPlaceholder=!0;else if(i(n.isStatic)&&i(t.isStatic)&&n.key===t.key&&(i(n.isCloned)||i(n.isOnce)))n.componentInstance=t.componentInstance;else{var p,h=n.data;o(h)&&o(p=h.hook)&&o(p=p.prepatch)&&p(t,n);var m=t.children,g=n.children;if(o(h)&&b(n)){for(p=0;p<s.update.length;++p)s.update[p](t,n);o(p=h.hook)&&o(p=p.update)&&p(t,n)}r(n.text)?o(m)&&o(g)?m!==g&&function(t,n,i,a,s){var c,u,f,d=0,p=0,h=n.length-1,m=n[0],g=n[h],y=i.length-1,b=i[0],_=i[y],w=!s;for(C(i);d<=h&&p<=y;)r(m)?m=n[++d]:r(g)?g=n[--h]:Sr(m,b)?(e(m,b,a,i,p),m=n[++d],b=i[++p]):Sr(g,_)?(e(g,_,a,i,y),g=n[--h],_=i[--y]):Sr(m,_)?(e(m,_,a,i,y),w&&l.insertBefore(t,m.elm,l.nextSibling(g.elm)),m=n[++d],_=i[--y]):Sr(g,b)?(e(g,b,a,i,p),w&&l.insertBefore(t,g.elm,m.elm),g=n[--h],b=i[++p]):(r(c)&&(c=Or(n,d,h)),r(u=o(b.key)?c[b.key]:S(b,n,d,h))?v(b,a,t,m.elm,!1,i,p):Sr(f=n[u],b)?(e(f,b,a,i,p),n[u]=void 0,w&&l.insertBefore(t,f.elm,m.elm)):v(b,a,t,m.elm,!1,i,p),b=i[++p]);d>h?$(t,r(i[y+1])?null:i[y+1].elm,i,p,y,a):p>y&&k(n,d,h)}(d,m,g,a,f):o(g)?(C(g),o(t.text)&&l.setTextContent(d,""),$(d,null,g,0,g.length-1,a)):o(m)?k(m,0,m.length-1):o(t.text)&&l.setTextContent(d,""):t.text!==n.text&&l.setTextContent(d,n.text),o(h)&&o(p=h.hook)&&o(p=p.postpatch)&&p(t,n)}}}(e,t,f,null,null,a);else{if(d){if(1===e.nodeType&&e.hasAttribute("data-server-rendered")&&(e.removeAttribute("data-server-rendered"),n=!0),i(n)){if(j(e,t,f))return O(t,f,!0),e;ue("The client-side rendered virtual DOM tree is not matching server-rendered content. This is likely caused by incorrect HTML markup, for example nesting block-level elements inside <p>, or missing <tbody>. Bailing hydration and performing full client-side render.")}c=e,e=new we(l.tagName(c).toLowerCase(),{},[],void 0,c)}var p=e.elm,h=l.parentNode(p);if(v(t,f,p._leaveCb?null:h,l.nextSibling(p)),o(t.parent))for(var m=t.parent,g=b(t);m;){for(var y=0;y<s.destroy.length;++y)s.destroy[y](m);if(m.elm=t.elm,g){for(var _=0;_<s.create.length;++_)s.create[_](Ar,m);var w=m.data.hook.insert;if(w.merged)for(var A=1;A<w.fns.length;A++)w.fns[A]()}else kr(m);m=m.parent}o(h)?k([e],0,0):o(e.tag)&&x(e)}}return O(t,f,u),t.elm}o(e)&&x(e)}}({nodeOps:$r,modules:[Rr,Zr,Co,To,Ho,K?{create:fi,activate:fi,remove:function(e,t){!0!==e.data.show?si(e,t):t()}}:{}].concat(Dr)});X&&document.addEventListener("selectionchange",(function(){var e=document.activeElement;e&&e.vmodel&&_i(e,"input")}));var pi={inserted:function(e,t,n,r){"select"===n.tag?(r.elm&&!r.elm._vOptions?jt(n,"postpatch",(function(){pi.componentUpdated(e,t,n)})):vi(e,t,n.context),e._vOptions=[].map.call(e.options,gi)):("textarea"===n.tag||_r(e.type))&&(e._vModifiers=t.modifiers,t.modifiers.lazy||(e.addEventListener("compositionstart",yi),e.addEventListener("compositionend",bi),e.addEventListener("change",bi),X&&(e.vmodel=!0)))},componentUpdated:function(e,t,n){if("select"===n.tag){vi(e,t,n.context);var r=e._vOptions,o=e._vOptions=[].map.call(e.options,gi);o.some((function(e,t){return!D(e,r[t])}))&&(e.multiple?t.value.some((function(e){return mi(e,o)})):t.value!==t.oldValue&&mi(t.value,o))&&_i(e,"change")}}};function vi(e,t,n){hi(e,t,n),(Y||Q)&&setTimeout((function(){hi(e,t,n)}),0)}function hi(e,t,n){var r=t.value,o=e.multiple;if(!o||Array.isArray(r)){for(var i,a,s=0,c=e.options.length;s<c;s++)if(a=e.options[s],o)i=L(r,gi(a))>-1,a.selected!==i&&(a.selected=i);else if(D(gi(a),r))return void(e.selectedIndex!==s&&(e.selectedIndex=s));o||(e.selectedIndex=-1)}else ue('<select multiple v-model="'+t.expression+'"> expects an Array value for its binding, but got '+Object.prototype.toString.call(r).slice(8,-1),n)}function mi(e,t){return t.every((function(t){return!D(t,e)}))}function gi(e){return"_value"in e?e._value:e.value}function yi(e){e.target.composing=!0}function bi(e){e.target.composing&&(e.target.composing=!1,_i(e.target,"input"))}function _i(e,t){var n=document.createEvent("HTMLEvents");n.initEvent(t,!0,!0),e.dispatchEvent(n)}function wi(e){return!e.componentInstance||e.data&&e.data.transition?e:wi(e.componentInstance._vnode)}var $i={model:pi,show:{bind:function(e,t,n){var r=t.value,o=(n=wi(n)).data&&n.data.transition,i=e.__vOriginalDisplay="none"===e.style.display?"":e.style.display;r&&o?(n.data.show=!0,ai(n,(function(){e.style.display=i}))):e.style.display=r?i:"none"},update:function(e,t,n){var r=t.value;!r!=!t.oldValue&&((n=wi(n)).data&&n.data.transition?(n.data.show=!0,r?ai(n,(function(){e.style.display=e.__vOriginalDisplay})):si(n,(function(){e.style.display="none"}))):e.style.display=r?e.__vOriginalDisplay:"none")},unbind:function(e,t,n,r,o){o||(e.style.display=e.__vOriginalDisplay)}}},xi={name:String,appear:Boolean,css:Boolean,mode:String,type:String,enterClass:String,leaveClass:String,enterToClass:String,leaveToClass:String,enterActiveClass:String,leaveActiveClass:String,appearClass:String,appearActiveClass:String,appearToClass:String,duration:[Number,String,Object]};function ki(e){var t=e&&e.componentOptions;return t&&t.Ctor.options.abstract?ki(hn(t.children)):e}function Ai(e){var t={},n=e.$options;for(var r in n.propsData)t[r]=e[r];var o=n._parentListeners;for(var i in o)t[k(i)]=o[i];return t}function Ci(e,t){if(/\d-keep-alive$/.test(t.tag))return e("keep-alive",{props:t.componentOptions.propsData})}var Si=function(e){return e.tag||vn(e)},Oi=function(e){return"show"===e.name},Ti={name:"transition",props:xi,abstract:!0,render:function(e){var t=this,n=this.$slots.default;if(n&&(n=n.filter(Si)).length){n.length>1&&ue("<transition> can only be used on a single element. Use <transition-group> for lists.",this.$parent);var r=this.mode;r&&"in-out"!==r&&"out-in"!==r&&ue("invalid <transition> mode: "+r,this.$parent);var o=n[0];if(function(e){for(;e=e.parent;)if(e.data.transition)return!0}(this.$vnode))return o;var i=ki(o);if(!i)return o;if(this._leaving)return Ci(e,o);var s="__transition-"+this._uid+"-";i.key=null==i.key?i.isComment?s+"comment":s+i.tag:a(i.key)?0===String(i.key).indexOf(s)?i.key:s+i.key:i.key;var c=(i.data||(i.data={})).transition=Ai(this),l=this._vnode,u=ki(l);if(i.data.directives&&i.data.directives.some(Oi)&&(i.data.show=!0),u&&u.data&&!function(e,t){return t.key===e.key&&t.tag===e.tag}(i,u)&&!vn(u)&&(!u.componentInstance||!u.componentInstance._vnode.isComment)){var f=u.data.transition=M({},c);if("out-in"===r)return this._leaving=!0,jt(f,"afterLeave",(function(){t._leaving=!1,t.$forceUpdate()})),Ci(e,o);if("in-out"===r){if(vn(i))return l;var d,p=function(){d()};jt(c,"afterEnter",p),jt(c,"enterCancelled",p),jt(f,"delayLeave",(function(e){d=e}))}}return o}}},Mi=M({tag:String,moveClass:String},xi);function ji(e){e.elm._moveCb&&e.elm._moveCb(),e.elm._enterCb&&e.elm._enterCb()}function Ii(e){e.data.newPos=e.elm.getBoundingClientRect()}function Ei(e){var t=e.data.pos,n=e.data.newPos,r=t.left-n.left,o=t.top-n.top;if(r||o){e.data.moved=!0;var i=e.elm.style;i.transform=i.WebkitTransform="translate("+r+"px,"+o+"px)",i.transitionDuration="0s"}}delete Mi.mode;var Ni={Transition:Ti,TransitionGroup:{props:Mi,beforeMount:function(){var e=this,t=this._update;this._update=function(n,r){var o=$n(e);e.__patch__(e._vnode,e.kept,!1,!0),e._vnode=e.kept,o(),t.call(e,n,r)}},render:function(e){for(var t=this.tag||this.$vnode.data.tag||"span",n=Object.create(null),r=this.prevChildren=this.children,o=this.$slots.default||[],i=this.children=[],a=Ai(this),s=0;s<o.length;s++){var c=o[s];if(c.tag)if(null!=c.key&&0!==String(c.key).indexOf("__vlist"))i.push(c),n[c.key]=c,(c.data||(c.data={})).transition=a;else{var l=c.componentOptions,u=l?l.Ctor.options.name||l.tag||"":c.tag;ue("<transition-group> children must be keyed: <"+u+">")}}if(r){for(var f=[],d=[],p=0;p<r.length;p++){var v=r[p];v.data.transition=a,v.data.pos=v.elm.getBoundingClientRect(),n[v.key]?f.push(v):d.push(v)}this.kept=e(t,null,f),this.removed=d}return e(t,null,i)},updated:function(){var e=this.prevChildren,t=this.moveClass||(this.name||"v")+"-move";e.length&&this.hasMove(e[0].elm,t)&&(e.forEach(ji),e.forEach(Ii),e.forEach(Ei),this._reflow=document.body.offsetHeight,e.forEach((function(e){if(e.data.moved){var n=e.elm,r=n.style;Qo(n,t),r.transform=r.WebkitTransform=r.transitionDuration="",n.addEventListener(Wo,n._moveCb=function e(r){r&&r.target!==n||r&&!/transform$/.test(r.propertyName)||(n.removeEventListener(Wo,e),n._moveCb=null,ei(n,t))})}})))},methods:{hasMove:function(e,t){if(!Jo)return!1;if(this._hasMove)return this._hasMove;var n=e.cloneNode();e._transitionClasses&&e._transitionClasses.forEach((function(e){Bo(n,e)})),Vo(n,t),n.style.display="none",this.$el.appendChild(n);var r=ri(n);return this.$el.removeChild(n),this._hasMove=r.hasTransform}}}};Wn.config.mustUseProp=rr,Wn.config.isReservedTag=gr,Wn.config.isReservedAttr=tr,Wn.config.getTagNamespace=yr,Wn.config.isUnknownElement=function(e){if(!K)return!0;if(gr(e))return!1;if(e=e.toLowerCase(),null!=br[e])return br[e];var t=document.createElement(e);return e.indexOf("-")>-1?br[e]=t.constructor===window.HTMLUnknownElement||t.constructor===window.HTMLElement:br[e]=/HTMLUnknownElement/.test(t.toString())},M(Wn.options.directives,$i),M(Wn.options.components,Ni),Wn.prototype.__patch__=K?di:I,Wn.prototype.$mount=function(e,t){return function(e,t,n){var r;return e.$el=t,e.$options.render||(e.$options.render=xe,e.$options.template&&"#"!==e.$options.template.charAt(0)||e.$options.el||t?ue("You are using the runtime-only build of Vue where the template compiler is not available. Either pre-compile the templates into render functions, or use the compiler-included build.",e):ue("Failed to mount component: template or render function not defined.",e)),An(e,"beforeMount"),r=H.performance&&at?function(){var t=e._name,r=e._uid,o="vue-perf-start:"+r,i="vue-perf-end:"+r;at(o);var a=e._render();at(i),st("vue "+t+" render",o,i),at(o),e._update(a,n),at(i),st("vue "+t+" patch",o,i)}:function(){e._update(e._render(),n)},new Fn(e,r,I,{before:function(){e._isMounted&&!e._isDestroyed&&An(e,"beforeUpdate")}},!0),n=!1,null==e.$vnode&&(e._isMounted=!0,An(e,"mounted")),e}(this,e=e&&K?wr(e):void 0,t)},K&&setTimeout((function(){H.devtools&&(ae?ae.emit("init",Wn):console[console.info?"info":"log"]("Download the Vue Devtools extension for a better development experience:\nhttps://github.com/vuejs/vue-devtools")),!1!==H.productionTip&&"undefined"!=typeof console&&console[console.info?"info":"log"]("You are running Vue in development mode.\nMake sure to turn on production mode when deploying for production.\nSee more tips at https://vuejs.org/guide/deployment.html")}),0);var Di=/\{\{((?:.|\r?\n)+?)\}\}/g,Li=/[-.*+?^${}()|[\]\/\\]/g,Pi=$((function(e){var t=e[0].replace(Li,"\\$&"),n=e[1].replace(Li,"\\$&");return new RegExp(t+"((?:.|\\n)+?)"+n,"g")}));function Fi(e,t){var n=t?Pi(t):Di;if(n.test(e)){for(var r,o,i,a=[],s=[],c=n.lastIndex=0;r=n.exec(e);){(o=r.index)>c&&(s.push(i=e.slice(c,o)),a.push(JSON.stringify(i)));var l=Yr(r[1].trim());a.push("_s("+l+")"),s.push({"@binding":l}),c=o+r[0].length}return c<e.length&&(s.push(i=e.slice(c)),a.push(JSON.stringify(i))),{expression:a.join("+"),tokens:s}}}var Ri,Hi={staticKeys:["staticClass"],transformNode:function(e,t){var n=t.warn||Qr,r=lo(e,"class");r&&Fi(r,t.delimiters)&&n('class="'+r+'": Interpolation inside attributes has been removed. Use v-bind or the colon shorthand instead. For example, instead of <div class="{{ val }}">, use <div :class="val">.',e.rawAttrsMap.class),r&&(e.staticClass=JSON.stringify(r));var o=co(e,"class",!1);o&&(e.classBinding=o)},genData:function(e){var t="";return e.staticClass&&(t+="staticClass:"+e.staticClass+","),e.classBinding&&(t+="class:"+e.classBinding+","),t}},Ui={staticKeys:["staticStyle"],transformNode:function(e,t){var n=t.warn||Qr,r=lo(e,"style");r&&(Fi(r,t.delimiters)&&n('style="'+r+'": Interpolation inside attributes has been removed. Use v-bind or the colon shorthand instead. For example, instead of <div style="{{ val }}">, use <div :style="val">.',e.rawAttrsMap.style),e.staticStyle=JSON.stringify(Mo(r)));var o=co(e,"style",!1);o&&(e.styleBinding=o)},genData:function(e){var t="";return e.staticStyle&&(t+="staticStyle:"+e.staticStyle+","),e.styleBinding&&(t+="style:("+e.styleBinding+"),"),t}},Vi=m("area,base,br,col,embed,frame,hr,img,input,isindex,keygen,link,meta,param,source,track,wbr"),Bi=m("colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr,source"),zi=m("address,article,aside,base,blockquote,body,caption,col,colgroup,dd,details,dialog,div,dl,dt,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,head,header,hgroup,hr,html,legend,li,menuitem,meta,optgroup,option,param,rp,rt,source,style,summary,tbody,td,tfoot,th,thead,title,tr,track"),qi=/^\s*([^\s"'<>\/=]+)(?:\s*(=)\s*(?:"([^"]*)"+|'([^']*)'+|([^\s"'=<>`]+)))?/,Ji=/^\s*((?:v-[\w-]+:|@|:|#)\[[^=]+\][^\s"'<>\/=]*)(?:\s*(=)\s*(?:"([^"]*)"+|'([^']*)'+|([^\s"'=<>`]+)))?/,Ki="[a-zA-Z_][\\-\\.0-9_a-zA-Z"+U.source+"]*",Wi="((?:"+Ki+"\\:)?"+Ki+")",Zi=new RegExp("^<"+Wi),Gi=/^\s*(\/?)>/,Yi=new RegExp("^<\\/"+Wi+"[^>]*>"),Xi=/^<!DOCTYPE [^>]+>/i,Qi=/^<!\--/,ea=/^<!\[/,ta=m("script,style,textarea",!0),na={},ra={"&lt;":"<","&gt;":">","&quot;":'"',"&amp;":"&","&#10;":"\n","&#9;":"\t","&#39;":"'"},oa=/&(?:lt|gt|quot|amp|#39);/g,ia=/&(?:lt|gt|quot|amp|#39|#10|#9);/g,aa=m("pre,textarea",!0),sa=function(e,t){return e&&aa(e)&&"\n"===t[0]};function ca(e,t){var n=t?ia:oa;return e.replace(n,(function(e){return ra[e]}))}var la,ua,fa,da,pa,va,ha,ma,ga,ya=/^@|^v-on:/,ba=/^v-|^@|^:|^#/,_a=/([\s\S]*?)\s+(?:in|of)\s+([\s\S]*)/,wa=/,([^,\}\]]*)(?:,([^,\}\]]*))?$/,$a=/^\(|\)$/g,xa=/^\[.*\]$/,ka=/:(.*)$/,Aa=/^:|^\.|^v-bind:/,Ca=/\.[^.\]]+(?=[^\]]*$)/g,Sa=/^v-slot(:|$)|^#/,Oa=/[\r\n]/,Ta=/\s+/g,Ma=/[\s"'<>\/=]/,ja=$((function(e){return(Ri=Ri||document.createElement("div")).innerHTML=e,Ri.textContent}));function Ia(e,t,n){return{type:1,tag:e,attrsList:t,attrsMap:Fa(t),rawAttrsMap:{},parent:n,children:[]}}function Ea(e,t){var n;!function(e){var t=co(e,"key");if(t){if("template"===e.tag&&la("<template> cannot be keyed. Place the key on real elements instead.",so(e,"key")),e.for){var n=e.iterator2||e.iterator1,r=e.parent;n&&n===t&&r&&"transition-group"===r.tag&&la("Do not use v-for index as key on <transition-group> children, this is the same as not using keys.",so(e,"key"),!0)}e.key=t}}(e),e.plain=!e.key&&!e.scopedSlots&&!e.attrsList.length,function(e){var t=co(e,"ref");t&&(e.ref=t,e.refInFor=function(e){for(var t=e;t;){if(void 0!==t.for)return!0;t=t.parent}return!1}(e))}(e),function(e){var t;"template"===e.tag?((t=lo(e,"scope"))&&la('the "scope" attribute for scoped slots have been deprecated and replaced by "slot-scope" since 2.5. The new "slot-scope" attribute can also be used on plain elements in addition to <template> to denote scoped slots.',e.rawAttrsMap.scope,!0),e.slotScope=t||lo(e,"slot-scope")):(t=lo(e,"slot-scope"))&&(e.attrsMap["v-for"]&&la("Ambiguous combined usage of slot-scope and v-for on <"+e.tag+"> (v-for takes higher priority). Use a wrapper <template> for the scoped slot to make it clearer.",e.rawAttrsMap["slot-scope"],!0),e.slotScope=t);var n=co(e,"slot");if(n&&(e.slotTarget='""'===n?'"default"':n,e.slotTargetDynamic=!(!e.attrsMap[":slot"]&&!e.attrsMap["v-bind:slot"]),"template"===e.tag||e.slotScope||no(e,"slot",n,so(e,"slot"))),"template"===e.tag){var r=uo(e,Sa);if(r){(e.slotTarget||e.slotScope)&&la("Unexpected mixed usage of different slot syntaxes.",e),e.parent&&!ga(e.parent)&&la("<template v-slot> can only appear at the root level inside the receiving component",e);var o=La(r),i=o.name,a=o.dynamic;e.slotTarget=i,e.slotTargetDynamic=a,e.slotScope=r.value||"_empty_"}}else{var s=uo(e,Sa);if(s){ga(e)||la("v-slot can only be used on components or <template>.",s),(e.slotScope||e.slotTarget)&&la("Unexpected mixed usage of different slot syntaxes.",e),e.scopedSlots&&la("To avoid scope ambiguity, the default slot should also use <template> syntax when there are other named slots.",s);var c=e.scopedSlots||(e.scopedSlots={}),l=La(s),u=l.name,f=l.dynamic,d=c[u]=Ia("template",[],e);d.slotTarget=u,d.slotTargetDynamic=f,d.children=e.children.filter((function(e){if(!e.slotScope)return e.parent=d,!0})),d.slotScope=s.value||"_empty_",e.children=[],e.plain=!1}}}(e),"slot"===(n=e).tag&&(n.slotName=co(n,"name"),n.key&&la("`key` does not work on <slot> because slots are abstract outlets and can possibly expand into multiple elements. Use the key on a wrapping element instead.",so(n,"key"))),function(e){var t;(t=co(e,"is"))&&(e.component=t),null!=lo(e,"inline-template")&&(e.inlineTemplate=!0)}(e);for(var r=0;r<fa.length;r++)e=fa[r](e,t)||e;return function(e){var t,n,r,o,i,a,s,c,l=e.attrsList;for(t=0,n=l.length;t<n;t++)if(r=o=l[t].name,i=l[t].value,ba.test(r))if(e.hasBindings=!0,(a=Pa(r.replace(ba,"")))&&(r=r.replace(Ca,"")),Aa.test(r))r=r.replace(Aa,""),i=Yr(i),(c=xa.test(r))&&(r=r.slice(1,-1)),0===i.trim().length&&la('The value for a v-bind expression cannot be empty. Found in "v-bind:'+r+'"'),a&&(a.prop&&!c&&"innerHtml"===(r=k(r))&&(r="innerHTML"),a.camel&&!c&&(r=k(r)),a.sync&&(s=vo(i,"$event"),c?ao(e,'"update:"+('+r+")",s,null,!1,la,l[t],!0):(ao(e,"update:"+k(r),s,null,!1,la,l[t]),S(r)!==k(r)&&ao(e,"update:"+S(r),s,null,!1,la,l[t])))),a&&a.prop||!e.component&&ha(e.tag,e.attrsMap.type,r)?to(e,r,i,l[t],c):no(e,r,i,l[t],c);else if(ya.test(r))r=r.replace(ya,""),(c=xa.test(r))&&(r=r.slice(1,-1)),ao(e,r,i,a,!1,la,l[t],c);else{var u=(r=r.replace(ba,"")).match(ka),f=u&&u[1];c=!1,f&&(r=r.slice(0,-(f.length+1)),xa.test(f)&&(f=f.slice(1,-1),c=!0)),oo(e,r,o,i,f,c,a,l[t]),"model"===r&&Ua(e,i)}else Fi(i,ua)&&la(r+'="'+i+'": Interpolation inside attributes has been removed. Use v-bind or the colon shorthand instead. For example, instead of <div id="{{ val }}">, use <div :id="val">.',l[t]),no(e,r,JSON.stringify(i),l[t]),!e.component&&"muted"===r&&ha(e.tag,e.attrsMap.type,r)&&to(e,r,"true",l[t])}(e),e}function Na(e){var t;if(t=lo(e,"v-for")){var n=function(e){var t=e.match(_a);if(t){var n={};n.for=t[2].trim();var r=t[1].trim().replace($a,""),o=r.match(wa);return o?(n.alias=r.replace(wa,"").trim(),n.iterator1=o[1].trim(),o[2]&&(n.iterator2=o[2].trim())):n.alias=r,n}}(t);n?M(e,n):la("Invalid v-for expression: "+t,e.rawAttrsMap["v-for"])}}function Da(e,t){e.ifConditions||(e.ifConditions=[]),e.ifConditions.push(t)}function La(e){var t=e.name.replace(Sa,"");return t||("#"!==e.name[0]?t="default":la("v-slot shorthand syntax requires a slot name.",e)),xa.test(t)?{name:t.slice(1,-1),dynamic:!0}:{name:'"'+t+'"',dynamic:!1}}function Pa(e){var t=e.match(Ca);if(t){var n={};return t.forEach((function(e){n[e.slice(1)]=!0})),n}}function Fa(e){for(var t={},n=0,r=e.length;n<r;n++)!t[e[n].name]||Y||Q||la("duplicate attribute: "+e[n].name,e[n]),t[e[n].name]=e[n].value;return t}var Ra=/^xmlns:NS\d+/,Ha=/^NS\d+:/;function Ua(e,t){for(var n=e;n;)n.for&&n.alias===t&&la("<"+e.tag+' v-model="'+t+'">: You are binding v-model directly to a v-for iteration alias. This will not be able to modify the v-for source array because writing to the alias is like modifying a function local variable. Consider using an array of objects and use v-model on an object property instead.',e.rawAttrsMap["v-model"]),n=n.parent}function Va(e){return Ia(e.tag,e.attrsList.slice(),e.parent)}var Ba,za,qa,Ja=[Hi,Ui,{preTransformNode:function(e,t){if("input"===e.tag){var n,r=e.attrsMap;if(!r["v-model"])return;if((r[":type"]||r["v-bind:type"])&&(n=co(e,"type")),r.type||n||!r["v-bind"]||(n="("+r["v-bind"]+").type"),n){var o=lo(e,"v-if",!0),i=o?"&&("+o+")":"",a=null!=lo(e,"v-else",!0),s=lo(e,"v-else-if",!0),c=Va(e);Na(c),ro(c,"type","checkbox"),Ea(c,t),c.processed=!0,c.if="("+n+")==='checkbox'"+i,Da(c,{exp:c.if,block:c});var l=Va(e);lo(l,"v-for",!0),ro(l,"type","radio"),Ea(l,t),Da(c,{exp:"("+n+")==='radio'"+i,block:l});var u=Va(e);return lo(u,"v-for",!0),ro(u,":type",n),Ea(u,t),Da(c,{exp:o,block:u}),a?c.else=!0:s&&(c.elseif=s),c}}}}],Ka={expectHTML:!0,modules:Ja,directives:{model:function(e,t,n){Kr=n;var r=t.value,o=t.modifiers,i=e.tag,a=e.attrsMap.type;if("input"===i&&"file"===a&&Kr("<"+e.tag+' v-model="'+r+'" type="file">:\nFile inputs are read only. Use a v-on:change listener instead.',e.rawAttrsMap["v-model"]),e.component)return po(e,r,o),!1;if("select"===i)!function(e,t,n){var r='var $$selectedVal = Array.prototype.filter.call($event.target.options,function(o){return o.selected}).map(function(o){var val = "_value" in o ? o._value : o.value;return '+(n&&n.number?"_n(val)":"val")+"});";ao(e,"change",r=r+" "+vo(t,"$event.target.multiple ? $$selectedVal : $$selectedVal[0]"),null,!0)}(e,r,o);else if("input"===i&&"checkbox"===a)!function(e,t,n){var r=n&&n.number,o=co(e,"value")||"null",i=co(e,"true-value")||"true",a=co(e,"false-value")||"false";to(e,"checked","Array.isArray("+t+")?_i("+t+","+o+")>-1"+("true"===i?":("+t+")":":_q("+t+","+i+")")),ao(e,"change","var $$a="+t+",$$el=$event.target,$$c=$$el.checked?("+i+"):("+a+");if(Array.isArray($$a)){var $$v="+(r?"_n("+o+")":o)+",$$i=_i($$a,$$v);if($$el.checked){$$i<0&&("+vo(t,"$$a.concat([$$v])")+")}else{$$i>-1&&("+vo(t,"$$a.slice(0,$$i).concat($$a.slice($$i+1))")+")}}else{"+vo(t,"$$c")+"}",null,!0)}(e,r,o);else if("input"===i&&"radio"===a)!function(e,t,n){var r=n&&n.number,o=co(e,"value")||"null";to(e,"checked","_q("+t+","+(o=r?"_n("+o+")":o)+")"),ao(e,"change",vo(t,o),null,!0)}(e,r,o);else if("input"===i||"textarea"===i)!function(e,t,n){var r=e.attrsMap.type,o=e.attrsMap["v-bind:value"]||e.attrsMap[":value"],i=e.attrsMap["v-bind:type"]||e.attrsMap[":type"];if(o&&!i){var a=e.attrsMap["v-bind:value"]?"v-bind:value":":value";Kr(a+'="'+o+'" conflicts with v-model on the same element because the latter already expands to a value binding internally',e.rawAttrsMap[a])}var s=n||{},c=s.lazy,l=s.number,u=s.trim,f=!c&&"range"!==r,d=c?"change":"range"===r?"__r":"input",p="$event.target.value";u&&(p="$event.target.value.trim()"),l&&(p="_n("+p+")");var v=vo(t,p);f&&(v="if($event.target.composing)return;"+v),to(e,"value","("+t+")"),ao(e,d,v,null,!0),(u||l)&&ao(e,"blur","$forceUpdate()")}(e,r,o);else{if(!H.isReservedTag(i))return po(e,r,o),!1;Kr("<"+e.tag+' v-model="'+r+"\">: v-model is not supported on this element type. If you are working with contenteditable, it's recommended to wrap a library dedicated for that purpose inside a custom component.",e.rawAttrsMap["v-model"])}return!0},text:function(e,t){t.value&&to(e,"textContent","_s("+t.value+")",t)},html:function(e,t){t.value&&to(e,"innerHTML","_s("+t.value+")",t)}},isPreTag:function(e){return"pre"===e},isUnaryTag:Vi,mustUseProp:rr,canBeLeftOpenTag:Bi,isReservedTag:gr,getTagNamespace:yr,staticKeys:(qa=Ja,qa.reduce((function(e,t){return e.concat(t.staticKeys||[])}),[]).join(","))},Wa=$((function(e){return m("type,tag,attrsList,attrsMap,plain,parent,children,attrs,start,end,rawAttrsMap"+(e?","+e:""))}));var Za=/^([\w$_]+|\([^)]*?\))\s*=>|^function(?:\s+[\w$]+)?\s*\(/,Ga=/\([^)]*?\);*$/,Ya=/^[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*|\['[^']*?']|\["[^"]*?"]|\[\d+]|\[[A-Za-z_$][\w$]*])*$/,Xa={esc:27,tab:9,enter:13,space:32,up:38,left:37,right:39,down:40,delete:[8,46]},Qa={esc:["Esc","Escape"],tab:"Tab",enter:"Enter",space:[" ","Spacebar"],up:["Up","ArrowUp"],left:["Left","ArrowLeft"],right:["Right","ArrowRight"],down:["Down","ArrowDown"],delete:["Backspace","Delete","Del"]},es=function(e){return"if("+e+")return null;"},ts={stop:"$event.stopPropagation();",prevent:"$event.preventDefault();",self:es("$event.target !== $event.currentTarget"),ctrl:es("!$event.ctrlKey"),shift:es("!$event.shiftKey"),alt:es("!$event.altKey"),meta:es("!$event.metaKey"),left:es("'button' in $event && $event.button !== 0"),middle:es("'button' in $event && $event.button !== 1"),right:es("'button' in $event && $event.button !== 2")};function ns(e,t){var n=t?"nativeOn:":"on:",r="",o="";for(var i in e){var a=rs(e[i]);e[i]&&e[i].dynamic?o+=i+","+a+",":r+='"'+i+'":'+a+","}return r="{"+r.slice(0,-1)+"}",o?n+"_d("+r+",["+o.slice(0,-1)+"])":n+r}function rs(e){if(!e)return"function(){}";if(Array.isArray(e))return"["+e.map((function(e){return rs(e)})).join(",")+"]";var t=Ya.test(e.value),n=Za.test(e.value),r=Ya.test(e.value.replace(Ga,""));if(e.modifiers){var o="",i="",a=[];for(var s in e.modifiers)if(ts[s])i+=ts[s],Xa[s]&&a.push(s);else if("exact"===s){var c=e.modifiers;i+=es(["ctrl","shift","alt","meta"].filter((function(e){return!c[e]})).map((function(e){return"$event."+e+"Key"})).join("||"))}else a.push(s);return a.length&&(o+=function(e){return"if(!$event.type.indexOf('key')&&"+e.map(os).join("&&")+")return null;"}(a)),i&&(o+=i),"function($event){"+o+(t?"return "+e.value+"($event)":n?"return ("+e.value+")($event)":r?"return "+e.value:e.value)+"}"}return t||n?e.value:"function($event){"+(r?"return "+e.value:e.value)+"}"}function os(e){var t=parseInt(e,10);if(t)return"$event.keyCode!=="+t;var n=Xa[e],r=Qa[e];return"_k($event.keyCode,"+JSON.stringify(e)+","+JSON.stringify(n)+",$event.key,"+JSON.stringify(r)+")"}var is={on:function(e,t){t.modifiers&&ue("v-on without argument does not support modifiers."),e.wrapListeners=function(e){return"_g("+e+","+t.value+")"}},bind:function(e,t){e.wrapData=function(n){return"_b("+n+",'"+e.tag+"',"+t.value+","+(t.modifiers&&t.modifiers.prop?"true":"false")+(t.modifiers&&t.modifiers.sync?",true":"")+")"}},cloak:I},as=function(e){this.options=e,this.warn=e.warn||Qr,this.transforms=eo(e.modules,"transformCode"),this.dataGenFns=eo(e.modules,"genData"),this.directives=M(M({},is),e.directives);var t=e.isReservedTag||E;this.maybeComponent=function(e){return!!e.component||!t(e.tag)},this.onceId=0,this.staticRenderFns=[],this.pre=!1};function ss(e,t){var n=new as(t);return{render:"with(this){return "+(e?cs(e,n):'_c("div")')+"}",staticRenderFns:n.staticRenderFns}}function cs(e,t){if(e.parent&&(e.pre=e.pre||e.parent.pre),e.staticRoot&&!e.staticProcessed)return ls(e,t);if(e.once&&!e.onceProcessed)return us(e,t);if(e.for&&!e.forProcessed)return ds(e,t);if(e.if&&!e.ifProcessed)return fs(e,t);if("template"!==e.tag||e.slotTarget||t.pre){if("slot"===e.tag)return function(e,t){var n=e.slotName||'"default"',r=ms(e,t),o="_t("+n+(r?","+r:""),i=e.attrs||e.dynamicAttrs?bs((e.attrs||[]).concat(e.dynamicAttrs||[]).map((function(e){return{name:k(e.name),value:e.value,dynamic:e.dynamic}}))):null,a=e.attrsMap["v-bind"];return!i&&!a||r||(o+=",null"),i&&(o+=","+i),a&&(o+=(i?"":",null")+","+a),o+")"}(e,t);var n;if(e.component)n=function(e,t,n){var r=t.inlineTemplate?null:ms(t,n,!0);return"_c("+e+","+ps(t,n)+(r?","+r:"")+")"}(e.component,e,t);else{var r;(!e.plain||e.pre&&t.maybeComponent(e))&&(r=ps(e,t));var o=e.inlineTemplate?null:ms(e,t,!0);n="_c('"+e.tag+"'"+(r?","+r:"")+(o?","+o:"")+")"}for(var i=0;i<t.transforms.length;i++)n=t.transforms[i](e,n);return n}return ms(e,t)||"void 0"}function ls(e,t){e.staticProcessed=!0;var n=t.pre;return e.pre&&(t.pre=e.pre),t.staticRenderFns.push("with(this){return "+cs(e,t)+"}"),t.pre=n,"_m("+(t.staticRenderFns.length-1)+(e.staticInFor?",true":"")+")"}function us(e,t){if(e.onceProcessed=!0,e.if&&!e.ifProcessed)return fs(e,t);if(e.staticInFor){for(var n="",r=e.parent;r;){if(r.for){n=r.key;break}r=r.parent}return n?"_o("+cs(e,t)+","+t.onceId+++","+n+")":(t.warn("v-once can only be used inside v-for that is keyed. ",e.rawAttrsMap["v-once"]),cs(e,t))}return ls(e,t)}function fs(e,t,n,r){return e.ifProcessed=!0,function e(t,n,r,o){if(!t.length)return o||"_e()";var i=t.shift();return i.exp?"("+i.exp+")?"+a(i.block)+":"+e(t,n,r,o):""+a(i.block);function a(e){return r?r(e,n):e.once?us(e,n):cs(e,n)}}(e.ifConditions.slice(),t,n,r)}function ds(e,t,n,r){var o=e.for,i=e.alias,a=e.iterator1?","+e.iterator1:"",s=e.iterator2?","+e.iterator2:"";return t.maybeComponent(e)&&"slot"!==e.tag&&"template"!==e.tag&&!e.key&&t.warn("<"+e.tag+' v-for="'+i+" in "+o+'">: component lists rendered with v-for should have explicit keys. See https://vuejs.org/guide/list.html#key for more info.',e.rawAttrsMap["v-for"],!0),e.forProcessed=!0,(r||"_l")+"(("+o+"),function("+i+a+s+"){return "+(n||cs)(e,t)+"})"}function ps(e,t){var n="{",r=function(e,t){var n=e.directives;if(n){var r,o,i,a,s="directives:[",c=!1;for(r=0,o=n.length;r<o;r++){i=n[r],a=!0;var l=t.directives[i.name];l&&(a=!!l(e,i,t.warn)),a&&(c=!0,s+='{name:"'+i.name+'",rawName:"'+i.rawName+'"'+(i.value?",value:("+i.value+"),expression:"+JSON.stringify(i.value):"")+(i.arg?",arg:"+(i.isDynamicArg?i.arg:'"'+i.arg+'"'):"")+(i.modifiers?",modifiers:"+JSON.stringify(i.modifiers):"")+"},")}return c?s.slice(0,-1)+"]":void 0}}(e,t);r&&(n+=r+","),e.key&&(n+="key:"+e.key+","),e.ref&&(n+="ref:"+e.ref+","),e.refInFor&&(n+="refInFor:true,"),e.pre&&(n+="pre:true,"),e.component&&(n+='tag:"'+e.tag+'",');for(var o=0;o<t.dataGenFns.length;o++)n+=t.dataGenFns[o](e);if(e.attrs&&(n+="attrs:"+bs(e.attrs)+","),e.props&&(n+="domProps:"+bs(e.props)+","),e.events&&(n+=ns(e.events,!1)+","),e.nativeEvents&&(n+=ns(e.nativeEvents,!0)+","),e.slotTarget&&!e.slotScope&&(n+="slot:"+e.slotTarget+","),e.scopedSlots&&(n+=function(e,t,n){var r=e.for||Object.keys(t).some((function(e){var n=t[e];return n.slotTargetDynamic||n.if||n.for||vs(n)})),o=!!e.if;if(!r)for(var i=e.parent;i;){if(i.slotScope&&"_empty_"!==i.slotScope||i.for){r=!0;break}i.if&&(o=!0),i=i.parent}var a=Object.keys(t).map((function(e){return hs(t[e],n)})).join(",");return"scopedSlots:_u(["+a+"]"+(r?",null,true":"")+(!r&&o?",null,false,"+function(e){for(var t=5381,n=e.length;n;)t=33*t^e.charCodeAt(--n);return t>>>0}(a):"")+")"}(e,e.scopedSlots,t)+","),e.model&&(n+="model:{value:"+e.model.value+",callback:"+e.model.callback+",expression:"+e.model.expression+"},"),e.inlineTemplate){var i=function(e,t){var n=e.children[0];if(1===e.children.length&&1===n.type||t.warn("Inline-template components must have exactly one child element.",{start:e.start}),n&&1===n.type){var r=ss(n,t.options);return"inlineTemplate:{render:function(){"+r.render+"},staticRenderFns:["+r.staticRenderFns.map((function(e){return"function(){"+e+"}"})).join(",")+"]}"}}(e,t);i&&(n+=i+",")}return n=n.replace(/,$/,"")+"}",e.dynamicAttrs&&(n="_b("+n+',"'+e.tag+'",'+bs(e.dynamicAttrs)+")"),e.wrapData&&(n=e.wrapData(n)),e.wrapListeners&&(n=e.wrapListeners(n)),n}function vs(e){return 1===e.type&&("slot"===e.tag||e.children.some(vs))}function hs(e,t){var n=e.attrsMap["slot-scope"];if(e.if&&!e.ifProcessed&&!n)return fs(e,t,hs,"null");if(e.for&&!e.forProcessed)return ds(e,t,hs);var r="_empty_"===e.slotScope?"":String(e.slotScope),o="function("+r+"){return "+("template"===e.tag?e.if&&n?"("+e.if+")?"+(ms(e,t)||"undefined")+":undefined":ms(e,t)||"undefined":cs(e,t))+"}",i=r?"":",proxy:true";return"{key:"+(e.slotTarget||'"default"')+",fn:"+o+i+"}"}function ms(e,t,n,r,o){var i=e.children;if(i.length){var a=i[0];if(1===i.length&&a.for&&"template"!==a.tag&&"slot"!==a.tag){var s=n?t.maybeComponent(a)?",1":",0":"";return""+(r||cs)(a,t)+s}var c=n?function(e,t){for(var n=0,r=0;r<e.length;r++){var o=e[r];if(1===o.type){if(gs(o)||o.ifConditions&&o.ifConditions.some((function(e){return gs(e.block)}))){n=2;break}(t(o)||o.ifConditions&&o.ifConditions.some((function(e){return t(e.block)})))&&(n=1)}}return n}(i,t.maybeComponent):0,l=o||ys;return"["+i.map((function(e){return l(e,t)})).join(",")+"]"+(c?","+c:"")}}function gs(e){return void 0!==e.for||"template"===e.tag||"slot"===e.tag}function ys(e,t){return 1===e.type?cs(e,t):3===e.type&&e.isComment?function(e){return"_e("+JSON.stringify(e.text)+")"}(e):"_v("+(2===(n=e).type?n.expression:_s(JSON.stringify(n.text)))+")";var n}function bs(e){for(var t="",n="",r=0;r<e.length;r++){var o=e[r],i=_s(o.value);o.dynamic?n+=o.name+","+i+",":t+='"'+o.name+'":'+i+","}return t="{"+t.slice(0,-1)+"}",n?"_d("+t+",["+n.slice(0,-1)+"])":t}function _s(e){return e.replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029")}var ws=new RegExp("\\b"+"do,if,for,let,new,try,var,case,else,with,await,break,catch,class,const,super,throw,while,yield,delete,export,import,return,switch,default,extends,finally,continue,debugger,function,arguments".split(",").join("\\b|\\b")+"\\b"),$s=new RegExp("\\b"+"delete,typeof,void".split(",").join("\\s*\\([^\\)]*\\)|\\b")+"\\s*\\([^\\)]*\\)"),xs=/'(?:[^'\\]|\\.)*'|"(?:[^"\\]|\\.)*"|`(?:[^`\\]|\\.)*\$\{|\}(?:[^`\\]|\\.)*`|`(?:[^`\\]|\\.)*`/g;function ks(e,t,n,r){var o=e.replace(xs,""),i=o.match($s);i&&"$"!==o.charAt(i.index-1)&&n('avoid using JavaScript unary operator as property name: "'+i[0]+'" in expression '+t.trim(),r),Ss(e,t,n,r)}function As(e,t,n,r){Ss(e.for||"",t,n,r),Cs(e.alias,"v-for alias",t,n,r),Cs(e.iterator1,"v-for iterator",t,n,r),Cs(e.iterator2,"v-for iterator",t,n,r)}function Cs(e,t,n,r,o){if("string"==typeof e)try{new Function("var "+e+"=_")}catch(i){r("invalid "+t+' "'+e+'" in expression: '+n.trim(),o)}}function Ss(e,t,n,r){try{new Function("return "+e)}catch(i){var o=e.replace(xs,"").match(ws);n(o?'avoid using JavaScript keyword as property name: "'+o[0]+'"\n Raw expression: '+t.trim():"invalid expression: "+i.message+" in\n\n "+e+"\n\n Raw expression: "+t.trim()+"\n",r)}}function Os(e,t,n,r){try{new Function(e,"")}catch(o){n("invalid function parameter expression: "+o.message+" in\n\n "+e+"\n\n Raw expression: "+t.trim()+"\n",r)}}function Ts(e,t){var n="";if(t>0)for(;1&t&&(n+=e),!((t>>>=1)<=0);)e+=e;return n}function Ms(e,t){try{return new Function(e)}catch(n){return t.push({err:n,code:e}),I}}function js(e){var t=Object.create(null);return function(n,r,o){var i=(r=M({},r)).warn||ue;delete r.warn;try{new Function("return 1")}catch(e){e.toString().match(/unsafe-eval|CSP/)&&i("It seems you are using the standalone build of Vue.js in an environment with Content Security Policy that prohibits unsafe-eval. The template compiler cannot work in this environment. Consider relaxing the policy to allow unsafe-eval or pre-compiling your templates into render functions.")}var a=r.delimiters?String(r.delimiters)+n:n;if(t[a])return t[a];var s=e(n,r);s.errors&&s.errors.length&&(r.outputSourceRange?s.errors.forEach((function(e){i("Error compiling template:\n\n"+e.msg+"\n\n"+function(e,t,n){void 0===t&&(t=0),void 0===n&&(n=e.length);for(var r=e.split(/\r?\n/),o=0,i=[],a=0;a<r.length;a++)if((o+=r[a].length+1)>=t){for(var s=a-2;s<=a+2||n>o;s++)if(!(s<0||s>=r.length)){i.push(""+(s+1)+Ts(" ",3-String(s+1).length)+"| "+r[s]);var c=r[s].length;if(s===a){var l=t-(o-c)+1,u=n>o?c-l:n-t;i.push(" | "+Ts(" ",l)+Ts("^",u))}else if(s>a){if(n>o){var f=Math.min(n-o,c);i.push(" | "+Ts("^",f))}o+=c+1}}break}return i.join("\n")}(n,e.start,e.end),o)})):i("Error compiling template:\n\n"+n+"\n\n"+s.errors.map((function(e){return"- "+e})).join("\n")+"\n",o)),s.tips&&s.tips.length&&(r.outputSourceRange?s.tips.forEach((function(e){return fe(e.msg,o)})):s.tips.forEach((function(e){return fe(e,o)})));var c={},l=[];return c.render=Ms(s.render,l),c.staticRenderFns=s.staticRenderFns.map((function(e){return Ms(e,l)})),s.errors&&s.errors.length||!l.length||i("Failed to generate render function:\n\n"+l.map((function(e){var t=e.err,n=e.code;return t.toString()+" in\n\n"+n+"\n"})).join("\n"),o),t[a]=c}}var Is,Es,Ns=(Is=function(e,t){var n=function(e,t){la=t.warn||Qr,va=t.isPreTag||E,ha=t.mustUseProp||E,ma=t.getTagNamespace||E;var n=t.isReservedTag||E;ga=function(e){return!!e.component||!n(e.tag)},fa=eo(t.modules,"transformNode"),da=eo(t.modules,"preTransformNode"),pa=eo(t.modules,"postTransformNode"),ua=t.delimiters;var r,o,i=[],a=!1!==t.preserveWhitespace,s=t.whitespace,c=!1,l=!1,u=!1;function f(e,t){u||(u=!0,la(e,t))}function d(e){if(p(e),c||e.processed||(e=Ea(e,t)),i.length||e===r||(r.if&&(e.elseif||e.else)?(v(e),Da(r,{exp:e.elseif,block:e})):f("Component template should contain exactly one root element. If you are using v-if on multiple elements, use v-else-if to chain them instead.",{start:e.start})),o&&!e.forbidden)if(e.elseif||e.else)a=e,(s=function(e){for(var t=e.length;t--;){if(1===e[t].type)return e[t];" "!==e[t].text&&la('text "'+e[t].text.trim()+'" between v-if and v-else(-if) will be ignored.',e[t]),e.pop()}}(o.children))&&s.if?Da(s,{exp:a.elseif,block:a}):la("v-"+(a.elseif?'else-if="'+a.elseif+'"':"else")+" used on element <"+a.tag+"> without corresponding v-if.",a.rawAttrsMap[a.elseif?"v-else-if":"v-else"]);else{if(e.slotScope){var n=e.slotTarget||'"default"';(o.scopedSlots||(o.scopedSlots={}))[n]=e}o.children.push(e),e.parent=o}var a,s;e.children=e.children.filter((function(e){return!e.slotScope})),p(e),e.pre&&(c=!1),va(e.tag)&&(l=!1);for(var u=0;u<pa.length;u++)pa[u](e,t)}function p(e){if(!l)for(var t;(t=e.children[e.children.length-1])&&3===t.type&&" "===t.text;)e.children.pop()}function v(e){"slot"!==e.tag&&"template"!==e.tag||f("Cannot use <"+e.tag+"> as component root element because it may contain multiple nodes.",{start:e.start}),e.attrsMap.hasOwnProperty("v-for")&&f("Cannot use v-for on stateful component root element because it renders multiple elements.",e.rawAttrsMap["v-for"])}return function(e,t){for(var n,r,o=[],i=t.expectHTML,a=t.isUnaryTag||E,s=t.canBeLeftOpenTag||E,c=0;e;){if(n=e,r&&ta(r)){var l=0,u=r.toLowerCase(),f=na[u]||(na[u]=new RegExp("([\\s\\S]*?)(</"+u+"[^>]*>)","i")),d=e.replace(f,(function(e,n,r){return l=r.length,ta(u)||"noscript"===u||(n=n.replace(/<!\--([\s\S]*?)-->/g,"$1").replace(/<!\[CDATA\[([\s\S]*?)]]>/g,"$1")),sa(u,n)&&(n=n.slice(1)),t.chars&&t.chars(n),""}));c+=e.length-d.length,e=d,C(u,c-l,c)}else{var p=e.indexOf("<");if(0===p){if(Qi.test(e)){var v=e.indexOf("--\x3e");if(v>=0){t.shouldKeepComment&&t.comment(e.substring(4,v),c,c+v+3),x(v+3);continue}}if(ea.test(e)){var h=e.indexOf("]>");if(h>=0){x(h+2);continue}}var m=e.match(Xi);if(m){x(m[0].length);continue}var g=e.match(Yi);if(g){var y=c;x(g[0].length),C(g[1],y,c);continue}var b=k();if(b){A(b),sa(b.tagName,e)&&x(1);continue}}var _=void 0,w=void 0,$=void 0;if(p>=0){for(w=e.slice(p);!(Yi.test(w)||Zi.test(w)||Qi.test(w)||ea.test(w)||($=w.indexOf("<",1))<0);)p+=$,w=e.slice(p);_=e.substring(0,p)}p<0&&(_=e),_&&x(_.length),t.chars&&_&&t.chars(_,c-_.length,c)}if(e===n){t.chars&&t.chars(e),!o.length&&t.warn&&t.warn('Mal-formatted tag at end of template: "'+e+'"',{start:c+e.length});break}}function x(t){c+=t,e=e.substring(t)}function k(){var t=e.match(Zi);if(t){var n,r,o={tagName:t[1],attrs:[],start:c};for(x(t[0].length);!(n=e.match(Gi))&&(r=e.match(Ji)||e.match(qi));)r.start=c,x(r[0].length),r.end=c,o.attrs.push(r);if(n)return o.unarySlash=n[1],x(n[0].length),o.end=c,o}}function A(e){var n=e.tagName,c=e.unarySlash;i&&("p"===r&&zi(n)&&C(r),s(n)&&r===n&&C(n));for(var l=a(n)||!!c,u=e.attrs.length,f=new Array(u),d=0;d<u;d++){var p=e.attrs[d],v=p[3]||p[4]||p[5]||"",h="a"===n&&"href"===p[1]?t.shouldDecodeNewlinesForHref:t.shouldDecodeNewlines;f[d]={name:p[1],value:ca(v,h)},t.outputSourceRange&&(f[d].start=p.start+p[0].match(/^\s*/).length,f[d].end=p.end)}l||(o.push({tag:n,lowerCasedTag:n.toLowerCase(),attrs:f,start:e.start,end:e.end}),r=n),t.start&&t.start(n,f,l,e.start,e.end)}function C(e,n,i){var a,s;if(null==n&&(n=c),null==i&&(i=c),e)for(s=e.toLowerCase(),a=o.length-1;a>=0&&o[a].lowerCasedTag!==s;a--);else a=0;if(a>=0){for(var l=o.length-1;l>=a;l--)(l>a||!e&&t.warn)&&t.warn("tag <"+o[l].tag+"> has no matching end tag.",{start:o[l].start,end:o[l].end}),t.end&&t.end(o[l].tag,n,i);o.length=a,r=a&&o[a-1].tag}else"br"===s?t.start&&t.start(e,[],!0,n,i):"p"===s&&(t.start&&t.start(e,[],!1,n,i),t.end&&t.end(e,n,i))}C()}(e,{warn:la,expectHTML:t.expectHTML,isUnaryTag:t.isUnaryTag,canBeLeftOpenTag:t.canBeLeftOpenTag,shouldDecodeNewlines:t.shouldDecodeNewlines,shouldDecodeNewlinesForHref:t.shouldDecodeNewlinesForHref,shouldKeepComment:t.comments,outputSourceRange:t.outputSourceRange,start:function(e,n,a,s,u){var f=o&&o.ns||ma(e);Y&&"svg"===f&&(n=function(e){for(var t=[],n=0;n<e.length;n++){var r=e[n];Ra.test(r.name)||(r.name=r.name.replace(Ha,""),t.push(r))}return t}(n));var p,h=Ia(e,n,o);f&&(h.ns=f),t.outputSourceRange&&(h.start=s,h.end=u,h.rawAttrsMap=h.attrsList.reduce((function(e,t){return e[t.name]=t,e}),{})),n.forEach((function(e){Ma.test(e.name)&&la("Invalid dynamic argument expression: attribute names cannot contain spaces, quotes, <, >, / or =.",{start:e.start+e.name.indexOf("["),end:e.start+e.name.length})})),"style"!==(p=h).tag&&("script"!==p.tag||p.attrsMap.type&&"text/javascript"!==p.attrsMap.type)||ie()||(h.forbidden=!0,la("Templates should only be responsible for mapping the state to the UI. Avoid placing tags with side-effects in your templates, such as <"+e+">, as they will not be parsed.",{start:h.start}));for(var m=0;m<da.length;m++)h=da[m](h,t)||h;c||(function(e){null!=lo(e,"v-pre")&&(e.pre=!0)}(h),h.pre&&(c=!0)),va(h.tag)&&(l=!0),c?function(e){var t=e.attrsList,n=t.length;if(n)for(var r=e.attrs=new Array(n),o=0;o<n;o++)r[o]={name:t[o].name,value:JSON.stringify(t[o].value)},null!=t[o].start&&(r[o].start=t[o].start,r[o].end=t[o].end);else e.pre||(e.plain=!0)}(h):h.processed||(Na(h),function(e){var t=lo(e,"v-if");if(t)e.if=t,Da(e,{exp:t,block:e});else{null!=lo(e,"v-else")&&(e.else=!0);var n=lo(e,"v-else-if");n&&(e.elseif=n)}}(h),function(e){null!=lo(e,"v-once")&&(e.once=!0)}(h)),r||v(r=h),a?d(h):(o=h,i.push(h))},end:function(e,n,r){var a=i[i.length-1];i.length-=1,o=i[i.length-1],t.outputSourceRange&&(a.end=r),d(a)},chars:function(n,r,i){if(o){if(!Y||"textarea"!==o.tag||o.attrsMap.placeholder!==n){var u,d,p,v=o.children;(n=l||n.trim()?"script"===(u=o).tag||"style"===u.tag?n:ja(n):v.length?s?"condense"===s&&Oa.test(n)?"":" ":a?" ":"":"")&&(l||"condense"!==s||(n=n.replace(Ta," ")),!c&&" "!==n&&(d=Fi(n,ua))?p={type:2,expression:d.expression,tokens:d.tokens,text:n}:" "===n&&v.length&&" "===v[v.length-1].text||(p={type:3,text:n}),p&&(t.outputSourceRange&&(p.start=r,p.end=i),v.push(p)))}}else n===e?f("Component template requires a root element, rather than just text.",{start:r}):(n=n.trim())&&f('text "'+n+'" outside root element will be ignored.',{start:r})},comment:function(e,n,r){if(o){var i={type:3,text:e,isComment:!0};t.outputSourceRange&&(i.start=n,i.end=r),o.children.push(i)}}}),r}(e.trim(),t);!1!==t.optimize&&function(e,t){e&&(Ba=Wa(t.staticKeys||""),za=t.isReservedTag||E,function e(t){if(t.static=function(e){return 2!==e.type&&(3===e.type||!(!e.pre&&(e.hasBindings||e.if||e.for||g(e.tag)||!za(e.tag)||function(e){for(;e.parent;){if("template"!==(e=e.parent).tag)return!1;if(e.for)return!0}return!1}(e)||!Object.keys(e).every(Ba))))}(t),1===t.type){if(!za(t.tag)&&"slot"!==t.tag&&null==t.attrsMap["inline-template"])return;for(var n=0,r=t.children.length;n<r;n++){var o=t.children[n];e(o),o.static||(t.static=!1)}if(t.ifConditions)for(var i=1,a=t.ifConditions.length;i<a;i++){var s=t.ifConditions[i].block;e(s),s.static||(t.static=!1)}}}(e),function e(t,n){if(1===t.type){if((t.static||t.once)&&(t.staticInFor=n),t.static&&t.children.length&&(1!==t.children.length||3!==t.children[0].type))return void(t.staticRoot=!0);if(t.staticRoot=!1,t.children)for(var r=0,o=t.children.length;r<o;r++)e(t.children[r],n||!!t.for);if(t.ifConditions)for(var i=1,a=t.ifConditions.length;i<a;i++)e(t.ifConditions[i].block,n)}}(e,!1))}(n,t);var r=ss(n,t);return{ast:n,render:r.render,staticRenderFns:r.staticRenderFns}},function(e){function t(t,n){var r=Object.create(e),o=[],i=[],a=function(e,t,n){(n?i:o).push(e)};if(n){if(n.outputSourceRange){var s=t.match(/^\s*/)[0].length;a=function(e,t,n){var r={msg:e};t&&(null!=t.start&&(r.start=t.start+s),null!=t.end&&(r.end=t.end+s)),(n?i:o).push(r)}}for(var c in n.modules&&(r.modules=(e.modules||[]).concat(n.modules)),n.directives&&(r.directives=M(Object.create(e.directives||null),n.directives)),n)"modules"!==c&&"directives"!==c&&(r[c]=n[c])}r.warn=a;var l=Is(t.trim(),r);return function(e,t){e&&function e(t,n){if(1===t.type){for(var r in t.attrsMap)if(ba.test(r)){var o=t.attrsMap[r];if(o){var i=t.rawAttrsMap[r];"v-for"===r?As(t,'v-for="'+o+'"',n,i):"v-slot"===r||"#"===r[0]?Os(o,r+'="'+o+'"',n,i):ya.test(r)?ks(o,r+'="'+o+'"',n,i):Ss(o,r+'="'+o+'"',n,i)}}if(t.children)for(var a=0;a<t.children.length;a++)e(t.children[a],n)}else 2===t.type&&Ss(t.expression,t.text,n,t)}(e,t)}(l.ast,a),l.errors=o,l.tips=i,l}return{compile:t,compileToFunctions:js(t)}})(Ka),Ds=(Ns.compile,Ns.compileToFunctions);function Ls(e){return(Es=Es||document.createElement("div")).innerHTML=e?'<a href="\n"/>':'<div a="\n"/>',Es.innerHTML.indexOf("&#10;")>0}var Ps=!!K&&Ls(!1),Fs=!!K&&Ls(!0),Rs=$((function(e){var t=wr(e);return t&&t.innerHTML})),Hs=Wn.prototype.$mount;return Wn.prototype.$mount=function(e,t){if((e=e&&wr(e))===document.body||e===document.documentElement)return ue("Do not mount Vue to <html> or <body> - mount to normal elements instead."),this;var n=this.$options;if(!n.render){var r=n.template;if(r)if("string"==typeof r)"#"===r.charAt(0)&&((r=Rs(r))||ue("Template element not found or is empty: "+n.template,this));else{if(!r.nodeType)return ue("invalid template option:"+r,this),this;r=r.innerHTML}else e&&(r=function(e){if(e.outerHTML)return e.outerHTML;var t=document.createElement("div");return t.appendChild(e.cloneNode(!0)),t.innerHTML}(e));if(r){H.performance&&at&&at("compile");var o=Ds(r,{outputSourceRange:!0,shouldDecodeNewlines:Ps,shouldDecodeNewlinesForHref:Fs,delimiters:n.delimiters,comments:n.comments},this),i=o.render,a=o.staticRenderFns;n.render=i,n.staticRenderFns=a,H.performance&&at&&(at("compile end"),st("vue "+this._name+" compile","compile","compile end"))}}return Hs.call(this,e,t)},Wn.compile=Ds,Wn},e.exports=r()}).call(this,n(4),n(15).setImmediate)},,,,,,,function(e,t,n){"use strict";n.r(t);var r=n(6),o=n.n(r);n(14);const i=new URL(window.location.href).searchParams.get("page");if(!i)throw"Need page url arg";const a=window[i],s=a.settings,c=a.sections;function l(e,t){Object.keys(e).forEach(n=>{e[n]=t})}new o.a({el:"#nextgenthemes-vue",data:{errors:[],isSaving:!1,refreshAfterSave:!1,sectionsDisplayed:function(){const e={};return Object.keys(c).forEach(t=>{e[t]="debug"!==t}),e}(),message:"",vm:a.options},methods:{checkForError(){this.name||this.errors.push("Name required.")},saveOptions(){this.isSaving=!0,window.jQuery.ajax({url:a.rest_url+"/save",method:"POST",data:this.vm,beforeSend(e){e.setRequestHeader("X-WP-Nonce",a.nonce)},success:()=>{this.message="Options saved",setTimeout(()=>this.message="",1e3)},error:e=>{this.message=e.responseText,this.refreshAfterSave=!1},complete:()=>{this.isSaving=!1,this.refreshAfterSave&&(this.refreshAfterSave=!1,window.location.reload())}})},resetOptions(e="all"){"all"===e?Object.entries(s).forEach(([e,t])=>{this.vm[e]=t.default}):Object.entries(s).forEach(([t,n])=>{e===n.tag&&(this.vm[t]=n.default)}),this.saveOptions()},licenseAPI(e,t,n){this.isSaving=!0,window.jQuery.ajax({url:"https://nextgenthemes.com",method:"POST",crossDomain:!0,data:{edd_action:e+"_license",license:this.vm[n],item_id:t,url:a.home_url},success:e=>{this.message="License API call saved",setTimeout(()=>this.message="",1e3)},error:e=>this.message=e.responseText,complete:()=>this.isSaving=!1})},licenseAPI_native(e,t,n){const r=new XMLHttpRequest;r.onreadystatechange=function(){if(console.log("xhttp.readyState",r.readyState),console.log("xhttp.status",r.status),4===r.readyState&&200===r.status){const e=JSON.parse(r.responseText);console.log("slData",e)}};const o={edd_action:e+"_license",license:this.vm[n],item_id:t,url:a.home_url};r.open("POST","https://nextgenthemes.com",!0),r.setRequestHeader("Content-type","application/json; charset=utf-8"),r.setRequestHeader("Access-Control-Allow-Origin",a.home_url);let i="";for(const e in o)i+=e+"="+a[e]+"&";i=i.substring(0,i.length-1),r.send(i)},showSection(e){l(this.sectionsDisplayed,!1),this.sectionsDisplayed[e]=!0},showAllSectionsButDebug(){l(this.sectionsDisplayed,!0),this.sectionsDisplayed.debug=!1},uploadImage(e){const t=this,n=window.wp.media({title:"Upload Image",multiple:!1}).open().on("select",(function(){const r=n.state().get("selection").first().toJSON().id;t.vm[e]=r}))},action(e,t){this.vm.action=JSON.stringify({action:e,product:t}),this.refreshAfterSave=!0,this.saveOptions()}}})},function(e,t,n){},function(e,t,n){(function(e){var r=void 0!==e&&e||"undefined"!=typeof self&&self||window,o=Function.prototype.apply;function i(e,t){this._id=e,this._clearFn=t}t.setTimeout=function(){return new i(o.call(setTimeout,r,arguments),clearTimeout)},t.setInterval=function(){return new i(o.call(setInterval,r,arguments),clearInterval)},t.clearTimeout=t.clearInterval=function(e){e&&e.close()},i.prototype.unref=i.prototype.ref=function(){},i.prototype.close=function(){this._clearFn.call(r,this._id)},t.enroll=function(e,t){clearTimeout(e._idleTimeoutId),e._idleTimeout=t},t.unenroll=function(e){clearTimeout(e._idleTimeoutId),e._idleTimeout=-1},t._unrefActive=t.active=function(e){clearTimeout(e._idleTimeoutId);var t=e._idleTimeout;t>=0&&(e._idleTimeoutId=setTimeout((function(){e._onTimeout&&e._onTimeout()}),t))},n(16),t.setImmediate="undefined"!=typeof self&&self.setImmediate||void 0!==e&&e.setImmediate||this&&this.setImmediate,t.clearImmediate="undefined"!=typeof self&&self.clearImmediate||void 0!==e&&e.clearImmediate||this&&this.clearImmediate}).call(this,n(4))},function(e,t,n){(function(e,t){!function(e,n){"use strict";if(!e.setImmediate){var r,o,i,a,s,c=1,l={},u=!1,f=e.document,d=Object.getPrototypeOf&&Object.getPrototypeOf(e);d=d&&d.setTimeout?d:e,"[object process]"==={}.toString.call(e.process)?r=function(e){t.nextTick((function(){v(e)}))}:function(){if(e.postMessage&&!e.importScripts){var t=!0,n=e.onmessage;return e.onmessage=function(){t=!1},e.postMessage("","*"),e.onmessage=n,t}}()?(a="setImmediate$"+Math.random()+"$",s=function(t){t.source===e&&"string"==typeof t.data&&0===t.data.indexOf(a)&&v(+t.data.slice(a.length))},e.addEventListener?e.addEventListener("message",s,!1):e.attachEvent("onmessage",s),r=function(t){e.postMessage(a+t,"*")}):e.MessageChannel?((i=new MessageChannel).port1.onmessage=function(e){v(e.data)},r=function(e){i.port2.postMessage(e)}):f&&"onreadystatechange"in f.createElement("script")?(o=f.documentElement,r=function(e){var t=f.createElement("script");t.onreadystatechange=function(){v(e),t.onreadystatechange=null,o.removeChild(t),t=null},o.appendChild(t)}):r=function(e){setTimeout(v,0,e)},d.setImmediate=function(e){"function"!=typeof e&&(e=new Function(""+e));for(var t=new Array(arguments.length-1),n=0;n<t.length;n++)t[n]=arguments[n+1];var o={callback:e,args:t};return l[c]=o,r(c),c++},d.clearImmediate=p}function p(e){delete l[e]}function v(e){if(u)setTimeout(v,0,e);else{var t=l[e];if(t){u=!0;try{!function(e){var t=e.callback,n=e.args;switch(n.length){case 0:t();break;case 1:t(n[0]);break;case 2:t(n[0],n[1]);break;case 3:t(n[0],n[1],n[2]);break;default:t.apply(void 0,n)}}(t)}finally{p(e),u=!1}}}}}("undefined"==typeof self?void 0===e?this:e:self)}).call(this,n(4),n(17))},function(e,t){var n,r,o=e.exports={};function i(){throw new Error("setTimeout has not been defined")}function a(){throw new Error("clearTimeout has not been defined")}function s(e){if(n===setTimeout)return setTimeout(e,0);if((n===i||!n)&&setTimeout)return n=setTimeout,setTimeout(e,0);try{return n(e,0)}catch(t){try{return n.call(null,e,0)}catch(t){return n.call(this,e,0)}}}!function(){try{n="function"==typeof setTimeout?setTimeout:i}catch(e){n=i}try{r="function"==typeof clearTimeout?clearTimeout:a}catch(e){r=a}}();var c,l=[],u=!1,f=-1;function d(){u&&c&&(u=!1,c.length?l=c.concat(l):f=-1,l.length&&p())}function p(){if(!u){var e=s(d);u=!0;for(var t=l.length;t;){for(c=l,l=[];++f<t;)c&&c[f].run();f=-1,t=l.length}c=null,u=!1,function(e){if(r===clearTimeout)return clearTimeout(e);if((r===a||!r)&&clearTimeout)return r=clearTimeout,clearTimeout(e);try{r(e)}catch(t){try{return r.call(null,e)}catch(t){return r.call(this,e)}}}(e)}}function v(e,t){this.fun=e,this.array=t}function h(){}o.nextTick=function(e){var t=new Array(arguments.length-1);if(arguments.length>1)for(var n=1;n<arguments.length;n++)t[n-1]=arguments[n];l.push(new v(e,t)),1!==l.length||u||s(p)},v.prototype.run=function(){this.fun.apply(null,this.array)},o.title="browser",o.browser=!0,o.env={},o.argv=[],o.version="",o.versions={},o.on=h,o.addListener=h,o.once=h,o.off=h,o.removeListener=h,o.removeAllListeners=h,o.emit=h,o.prependListener=h,o.prependOnceListener=h,o.listeners=function(e){return[]},o.binding=function(e){throw new Error("process.binding is not supported")},o.cwd=function(){return"/"},o.chdir=function(e){throw new Error("process.chdir is not supported")},o.umask=function(){return 0}}]);
build/main.asset.php CHANGED
@@ -1 +1 @@
1
- <?php return array('dependencies' => array('wp-polyfill'), 'version' => '77ca5b902055864e578f24f40dc4c038');
1
+ <?php return array('dependencies' => array('wp-polyfill'), 'version' => '7dec01de774aca079a9a8464507f7763');
build/main.js CHANGED
@@ -1 +1 @@
1
- !function(e){var t={};function r(o){if(t[o])return t[o].exports;var n=t[o]={i:o,l:!1,exports:{}};return e[o].call(n.exports,n,n.exports,r),n.l=!0,n.exports}r.m=e,r.c=t,r.d=function(e,t,o){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:o})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var o=Object.create(null);if(r.r(o),Object.defineProperty(o,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var n in e)r.d(o,n,function(t){return e[t]}.bind(null,n));return o},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=7)}({7:function(e,t,r){"use strict";r.r(t),r(8);const o=document.querySelectorAll.bind(document),n=window.jQuery;function i(){o(".arve p, .arve .video-wrap, .arve .fluid-width-video-wrapper, .arve .fluid-vids").forEach(e=>{u(e)}),o(".arve br").forEach(e=>{e.remove()}),o(".arve-iframe, .arve-video").forEach(e=>{e.removeAttribute("width"),e.removeAttribute("height"),e.removeAttribute("style")}),o(".wp-block-embed").forEach(e=>{if(e.querySelector(".arve")){e.classList.remove("wp-embed-aspect-16-9","wp-has-aspect-ratio");const t=e.querySelector(".wp-block-embed__wrapper");t&&u(t)}})}function u(e){const t=e.parentNode;for(;e.firstChild;)t.insertBefore(e.firstChild,e);t.removeChild(e)}"html"!==document.documentElement.id&&(document.documentElement.id?document.body.id||(document.body.id="html"):document.documentElement.id="html"),i(),document.addEventListener("DOMContentLoaded",()=>{setTimeout(()=>{i()},1)}),n&&void 0!==n.fn.fitVids&&n(document).ready(()=>{setTimeout(()=>{i()},1)})},8:function(e,t,r){}});
1
+ !function(e){var t={};function r(o){if(t[o])return t[o].exports;var n=t[o]={i:o,l:!1,exports:{}};return e[o].call(n.exports,n,n.exports,r),n.l=!0,n.exports}r.m=e,r.c=t,r.d=function(e,t,o){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:o})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var o=Object.create(null);if(r.r(o),Object.defineProperty(o,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var n in e)r.d(o,n,function(t){return e[t]}.bind(null,n));return o},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=7)}({7:function(e,t,r){"use strict";r.r(t),r(8);const o=document.querySelectorAll.bind(document),n=window.jQuery;function i(){o(".arve p, .arve .video-wrap, .arve .fluid-width-video-wrapper, .arve .fluid-vids").forEach(e=>{u(e)}),o(".ast-oembed-container").forEach(e=>{e.querySelector(".arve")&&u(e)}),o(".arve br").forEach(e=>{e.remove()}),o(".arve-iframe, .arve-video").forEach(e=>{e.removeAttribute("width"),e.removeAttribute("height"),e.removeAttribute("style")}),o(".wp-block-embed").forEach(e=>{if(e.querySelector(".arve")){e.classList.remove("wp-embed-aspect-16-9","wp-has-aspect-ratio");const t=e.querySelector(".wp-block-embed__wrapper");t&&u(t)}})}function u(e){const t=e.parentNode;for(;e.firstChild;)t.insertBefore(e.firstChild,e);t.removeChild(e)}"html"!==document.documentElement.id&&(document.documentElement.id?document.body.id||(document.body.id="html"):document.documentElement.id="html"),i(),document.addEventListener("DOMContentLoaded",()=>{setTimeout(()=>{i()},1)}),n&&void 0!==n.fn.fitVids&&n(document).ready(()=>{setTimeout(()=>{i()},1)})},8:function(e,t,r){}});
changelog.md ADDED
@@ -0,0 +1,1201 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ ## Changelog ##
3
+
4
+ * [ARVE Pro changelog](https://nextgenthemes.com/plugins/arve-pro/#changelog)
5
+ * [ARVE Random Videos changelog](https://nextgenthemes.com/plugins/random-video/#changelog)
6
+
7
+ ### 2021-01-21 9.2.0 ###
8
+
9
+ * Fix: Compatibility with Astor Theme.
10
+ * Improved: Added notes that Shortcode UI is not maintained to the button and readme.
11
+ * Improved: Classic Tabs, new settings section for upcoming [ARVE sticky Videos](https://nextgenthemes.com/plugins/arve-sticky-videos/).
12
+ * Improved: Lots of code restructured and improved.
13
+
14
+ ### 2021-01-03 9.1.3 ###
15
+
16
+ * New: Vimeo play button option for ARVE Pro
17
+ * Improved: Fitvids conflict mitigation
18
+
19
+ ### 2020-12-24 9.1.2 ###
20
+
21
+ * Fix: Missing attribute errors when using `[embed]https://example.com/vid.mp4[/embed]` like shortcodes.
22
+
23
+ ### 2020-12-24 9.1.1 ###
24
+
25
+ * Marry XMAS, bitches.
26
+ * Fix: Errors related to video shortcode override.
27
+
28
+ ### 2020-12-23 9.1.0 ###
29
+
30
+ * Fix: Correct backwards compatibility for deprecated mode values.
31
+ * Fix: Expand on click UI in Gutenberg.
32
+ * New: Wrapper element `.arve-inner` for more custom control over embeds.
33
+ * Improved: Asset loading and caching.
34
+ * Improved: More relevant info about addons in the settings sidebar.
35
+
36
+ ### 2020-12-17 9.0.1 ###
37
+
38
+ * Fix: `contentURL` output for html5 video file embeds.
39
+
40
+ ### 2020-12-14 9.0.0-beta13 ###
41
+
42
+ * Fix: When no oembed data is found or input `src` is invalid url use generated `src` in all cases.
43
+ * Improved: added check for valid url for `src` input.
44
+ * Improved: 'src mismach' errors will be hidden as they are not critical and should not clutter peoples sites.
45
+
46
+ ### 2020-12-14 9.0.0-beta12 ###
47
+
48
+ * Fix: When deactivating or uninstalling ARVE, it will delete its embeds from the oembed cache.
49
+ * Improved: Caching system.
50
+ * Improved: Removed Twitch oembed handler (not provided anymore, still works without it).
51
+
52
+ ### 2020-12-12 9.0.0-beta11 ###
53
+
54
+ * New: Reset buttons for settings sections.
55
+ * Fix: Issues with error handling #2.
56
+ * Fix: Hide non critical errors relating to private Vimeo videos.
57
+ * Fix: Make sure 8.0 settings are moved over with right datatype. Hopefully fixes issues with not being able to save settings.
58
+
59
+ ### 2020-12-09 9.0.0-beta8 ###
60
+
61
+ * New: Transfer settings from version 8.0 to version 9.0. [Sorry](https://api.ipfsbrowser.com/ipfs/get.php?hash=QmTHuTcq4iYsoHYomBwV7Xp3KSuLVT1pAnoWQP5uH78d3A) this was supposed to work with the first 9.0 beta.
62
+ * Fix: Issues with error handling.
63
+
64
+ ### 2020-12-02 9.0.0-beta7 ###
65
+
66
+ * Fix: YouTube timestamp urls not working with only seconds `t=1234`.
67
+
68
+ ### 2020-12-01 9.0.0-beta6 ###
69
+
70
+ * Fix: Url parameters from settings page not working.
71
+ * Improved: Do not delete old license options in case people need to downgrade.
72
+
73
+ ### 2020-11-28 9.0.0-beta5 ###
74
+
75
+ This update is very long in the making and I hope it will pay off somehow, hopefully literally. A lot things happened in the code that will not be visible to the end users directly but made the code more modern and easier to maintain.
76
+
77
+ [More details on this **mayor** update](https://nextgenthemes.com/improvements-in-arve-9-0-and-arve-pro-5-0/)
78
+
79
+ New:
80
+
81
+ * Minimum PHP required is now 5.6.
82
+ * Finally the ARVE Gutenberg block is here! Its not polished yet and there is still work to be done.
83
+ * Optional admin bar button to quick access settings.
84
+ * Added Bitchute
85
+ * `av1mp4` shortcode parameter so serve [AV1](https://en.wikipedia.org/wiki/AV1) encoded files best named .av1.mp4 (to be used together with `mp4` or `webm`)
86
+ * Settings page overhaul, using my own little settings framework. All addon options can be seen and set (without effect) before actually having the addons installed.
87
+ * Option to completely disable all SEO data generation in case you want to use Yoast SEO or another plugin for that. Note that ARVE Pro offers more then just SEO for less.
88
+
89
+ Fixes:
90
+
91
+ * YouTube live links are now working correctly.
92
+ * TED embed url.
93
+ * Facebook embeds.
94
+ * Twitch embeds.
95
+
96
+ Improved:
97
+
98
+ * Generated iframe src will match what providers send over oembed.
99
+ * Lots of code improvements that may not be noticeable to users but took a lot of time and will make the plugin more maintainable and easier to extend.
100
+ * Removed the `lang` shortcode parameter that was only used for TED talks video subtitle display. This is now taken from the `language=x` url query.
101
+ * Embeds work though WPs oembed system now that comes with a more stable codebase and better caching system for embeds.
102
+ * Aspect ratios are now auto detected for all providers WP supports through oEmbed.
103
+ * Aspect ratio field is now auto filled when pasting a iframe embed code into the shortcode UI or Gutenberg UI.
104
+ * Removed jQuery dependency for frontend JavaScript.
105
+ * Prevent autoplay of multiple videos, only the first video on pageload will be autoplayed.
106
+
107
+ Removed:
108
+
109
+ * Hack to support direct embedding of Dropbox videos because it no longer works.
110
+ * Vimeo only `start` shortcode attribute. Use vimeo urls with `#t=30` at the end for starting time in seconds instead.
111
+
112
+ Probably things I forgot about, working on this for ~1 year
113
+
114
+ ### 2020-10-10 - 8.10.28 ###
115
+
116
+ * Tested and marked as compatible with WP 5.5.1
117
+
118
+ ### 2020-08-02 - 8.10.27 ###
119
+
120
+ * Fix: **SORRY!** message about beta testing was **not intended** to show hourly it was intended to show only once per user.
121
+ * Fix: Link in that messages was also to a 404 page, can it get worse?
122
+
123
+ ### 2020-07-25 - 8.10.24 ###
124
+
125
+ * Fix: `embedURL` SEO output.
126
+
127
+ ### 2020-05-14 - 8.10.23 ###
128
+
129
+ * Improved: Automatically set HTML5 videos that are set to autoplay to also be muted so they may play as browsers no longer allow unmuted autoplay.
130
+
131
+ ### 2019-11-05 - 8.10.20 ###
132
+
133
+ * Big version update with Gutenberg Block is coming [please help testing](https://nextgenthemes.com/plugins/arve/help-testing-the-beta-version/)
134
+
135
+ ### 2019-10-18 - 8.10.15 ###
136
+
137
+ * Fix: Force shortcode args to be array. To prevent issues.
138
+
139
+ ### 2019-10-09 - 8.10.13 ###
140
+
141
+ * Removed outdated link in widget.
142
+
143
+ ### 2019-10-01 - 8.10.12 ###
144
+
145
+ * Improved: Allow for manually srcset with `img_srcset` with the Pro Addon.
146
+
147
+ ### 2019-08-29 - 8.10.11 ###
148
+
149
+ * Removed vendor dir from Git versioning.
150
+
151
+ ### 2019-08-29 - 8.10.10 ###
152
+
153
+ Just a small readme update and checking new release script, making sure everything works and everyone is on the latest stable version.
154
+
155
+ ### 2019-08-19 - 8.10.8 ###
156
+
157
+ * Improved: Switch Youku embeds to https set to default 16:9 aspect ratio.
158
+ * Improved: added `allow-popups-to-escape-sandbox` to sandbox attribute. This eliminates the need for `sandbox="false"` for Vimeo action links to work. And just in general I think its a good idea.
159
+
160
+ ### 2019-07-31 - 8.10.6 ###
161
+
162
+ * Fix: Vimeo Action links not working correctly in Chrome when Sandbox is enabled. You can fix this by adding `sandbox="false"` to your shortcodes. But the ARVE Pro "disable links" option will no longer work.
163
+ * Improved: Deprecated `requires_flash` attribute and `Iframe Flash` option. Replaced is the new `sandbox` shortcode attribute.
164
+
165
+ ### 2019-01-23 - 8.10.4 ###
166
+
167
+ * Fix: PHP compatibility lowered to official 5.3 as there was accidentally 5.4+ code used. Make sure you are on PHP 7.3 or at least 5.6 for the upcoming future as WP itself will require 5.6 this year. Its also insecure to run on those outdated versions: https://secure.php.net/supported-versions.php.
168
+
169
+ ### 2019-01-16 - 8.10.2 ###
170
+
171
+ * Fix: Base code to fix titles not showing over thumbnails in recent Pro Addon version.
172
+ * Improved: Added `allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture"` to iframe as per official YouTube embed code.
173
+
174
+ ### 2018-11-29 - 8.10.1 ###
175
+
176
+ * Improved: Display message to remind customers to update ARVE Pro 4.2.0. Auto updates seem to not work again ...
177
+
178
+ ### 2018-11-27 - 8.10.0 ###
179
+
180
+ * Improved: Video max width setting now defaults (if empty) to your themes `$content_width` variable to optimize thumbnail loading in Pro Addon.
181
+ * Improved: Removed code what should be in the Pro Addon instead. Make sure to update the Pro Addon as well!
182
+
183
+ ### 2018-11-16 - 8.9.11 ###
184
+
185
+ * Fix: Wistia autoplay (mobile browsers sill prevent it, also effects single click lazyload in Pro)
186
+
187
+ ### 2018-10-19 - 8.9.10 ###
188
+
189
+ * Fix: The Gutenberg fix of the last version was not correct in the minified JS.
190
+
191
+ ### 2018-10-19 - 8.9.9 ###
192
+
193
+ * Fix: White space above video in Gutenberg blocks.
194
+
195
+ ### 2018-10-02 - 8.9.8 ###
196
+
197
+ * Updated EDD Plugin update class, this may fix some people having trouble auto updating ARVE Pro
198
+ * Fix: Licensing page no longer shows plugins wrongly as not installed.
199
+
200
+ ### 2018-07-22 - 8.9.6 ###
201
+
202
+ * New: Option to enable or disable youtube-nocookie.com embeds. It a privacy enhanced feature but it has at least one bug when setting highlighted video boxes they will open the wrong url so in case you need them you have to disable this.
203
+
204
+ ### 2018-06-07 - 8.9.5 ###
205
+
206
+ * Fixed: When pasting embed codes into the Shortcode UI dialog the `src=` will be extracted even when no quotes are used.
207
+ * Improved: Use youtube-nocookie.com domain again it is GPRP/Privacy friendly. Note the name is confusing as it sets cookies, but only when the user plays the video rather then just when loading the iframe. So its not "no cookies". But you can mention this into your cookie notices when dealing with GPRP.
208
+
209
+ ### 2018-06-02 - 8.9.4 ###
210
+
211
+ * Improved: Try to make autoplay in Chrome possible again. See [New Chrome Autoplay behavior](https://developers.google.com/web/updates/2017/09/autoplay-policy-changes). At the point of writing its not clear if the new iframe attribute makes them just autoplay no matter what. Please report your experiences.
212
+
213
+ ### 2018-04-29 - 8.9.3 ###
214
+
215
+ * Improved: Make overwrite of shortcode possible. Used in new [Random Video Addon](https://nextgenthemes.com/plugins/arve-random-video/)
216
+
217
+ ### 2018-04-18 - 8.9.2 ###
218
+
219
+ * Fix possible "not a string" errors.
220
+
221
+ ### 2018-04-12 - 8.9.1 ###
222
+
223
+ * New: Option to always load assets. Needed when dealing with AJAX and other special cases.
224
+
225
+ ### 2018-03-16 - 8.9.0 ###
226
+
227
+ * Fixed/improved Ustream url detection. Make sure you remove `wmode=transparent` if present and include `html5ui=1` for ustream on the ARVE URL parameters settings tab.
228
+
229
+ ### 2018-03-13 - 8.8.9 ###
230
+
231
+ * Improved licensing debug code.
232
+ * Added Vimeo PHP API class for upcoming versions and addons.
233
+
234
+ ### 2018-03-13 - 8.8.8 ###
235
+
236
+ * Added code to debug issues with license activations.
237
+
238
+ ### 2018-03-05 - 8.8.7 ###
239
+
240
+ * Fixed a link on the plugins screen (Thanks Hans).
241
+
242
+ ### 2018-02-25 - 8.8.6 ###
243
+
244
+ * Fix: HTML5 videos not working with lightbox in [ARVE PRO](https://nextgenthemes.com/plugins/arve-pro/)
245
+
246
+ ### 2018-02-25 - 8.8.5 ###
247
+
248
+ * Fix: Add default url parameters to youtube playlists. Note they will effect playlist urls like `https://www.youtube.com/playlist?list=PLXYApifkdCACM_ykvnCHeth-vIB6v1XE3` only and not those who also reference the starting video. There is currently a separate parameters option for this but it will be removed in version 9.0.
249
+
250
+ ### 2018-02-23 - 8.8.4 ###
251
+
252
+ * Fix: YouTube playlists where not correctly detected when having a underscore in the id.
253
+ * Improved: Better explanation of the new disable flash for general iframe option on the settings page.
254
+
255
+ ### 2018-02-16 - 8.8.3 ###
256
+
257
+ * New: Option to disable flash for not listed providers for more secure embeds and make the 'disable links' Pro Addon feature possible for those. See the description on the options page.
258
+ * Fix: Licensing deactivation did not work.
259
+ * Improved: Marked some providers as not requiring flash anymore.
260
+ * Improved: Fixed some links throughout the plugin and readme.
261
+ * Improved: Some minor code improvements.
262
+
263
+ ### 2018-02-12 - 8.8.2 ###
264
+
265
+ * Fix: Issue with the new Video API class.
266
+
267
+ ### 2018-02-12 - 8.8.1 ###
268
+
269
+ * Fix: `Can’t use function return value in write context`, white screen of deaths type error from the last update.
270
+
271
+ ### 2018-02-12 - 8.8.0 ###
272
+
273
+ **I could really use some positive reviews. It has been over 7 months without a 5 star review.** The top level menu that was complained about a lot has been removed. I am working on a big update that will make ARVE even better with automatic detection of aspect ratios, better caching and lots of improved code.
274
+
275
+ * New: Added options fields for Vimeo API used in upcoming addons.
276
+ * Improved: Removed NextGenThemes top level menu and ads page because to many complaints.
277
+ * Improved: Moved licensing settings page to 'settings' menu.
278
+
279
+ ### 2018-02-02 - 8.7.8 ###
280
+
281
+ * No longer try to guess and spam autoplay parameters for general iframe embeds.
282
+ * Fix: Google drive embeds not working.
283
+
284
+ ### 2018-01-09 - 8.7.7 ###
285
+
286
+ * New: `duration` shortcode attribute and dialog entry.
287
+ * Fixed: Corrected some dead links inside the plugin.
288
+ * Improved: Added `muted`, `controls` and `loop` to shortcode UI dialog for HTML5 videos.
289
+ * Improved: Removed video file extension check so any file can be used `[arve mp4="http://example.com/some-file" webm="http://example.com/some-other-file" /]`. Useful for example to embed files hosted on IPFS that do have a cryptic hash instead of a human readable filename.
290
+
291
+ ### 2017-12-20 - 8.7.6 ###
292
+
293
+ * Fix license activation now working correctly.
294
+ * Corrected link in readme.
295
+
296
+ ### 2017-12-19 - 8.7.5 ###
297
+
298
+ * Maybe fix license activation in some rare cases.
299
+
300
+ ### 2017-12-17 - 8.7.4 ###
301
+
302
+ * Fix: Removed URL validation because it fails with some weird URLs.
303
+
304
+ ### 2017-12-13 - 8.7.3 ###
305
+
306
+ * Updated EDD Plugin Updater class.
307
+ * Fixed some links in the readme.
308
+
309
+ ### 2017-08-16 - 8.7.2 ###
310
+
311
+ * Fix: Same Video with different start times in lightboxes.
312
+
313
+ ### 2017-07-12 - 8.7.1 ###
314
+
315
+ * Fix: Throw no PHP notice on admin when WP_DEBUG is enabled.
316
+ * Fix: Fix related to upcoming Pro Addon update and private vimeo videos.
317
+
318
+ ### 2017-07-10 - 8.7.0 ###
319
+
320
+ * Fix: web.facebook.com/... video urls not getting detected
321
+
322
+ ### 2017-06-17 - 8.6.6 ###
323
+
324
+ * Fix: Message dismissal not working.
325
+
326
+ ### 2017-06-17 - 8.6.5 ###
327
+
328
+ * Fix: Added `allow-presentation` to iframe sandbox to fix Chrome 59 not loading iframes. Thanks njs
329
+ * Improved: Admin message and dashboard ad size reduced, added links to dashboard widget, settings page ad is now sidebar-like on big screens.
330
+
331
+ ### 2017-06-15 - 8.6.4 ###
332
+
333
+ * Fix: Removes a .video-wrap element from ARVE's HTML that is added by a theme and caused videos to be invisible.
334
+ * Fix: PHP error in some cases.
335
+ * Improved: If mode is not supported fall back to normal without error message (for now).
336
+ * Improved: Changed embed URL for Alugha
337
+
338
+ ### 2017-05-17 - 8.6.3 ###
339
+
340
+ * Fixed issue with width and height attributes
341
+
342
+ ### 2017-05-17 - 8.6.2 ###
343
+
344
+ * Fixed license activation issues.
345
+
346
+ ### 2017-05-10 - 8.6.1 ###
347
+
348
+ * Minor code change.
349
+
350
+ ### 2017-05-10 - 8.6.0 ###
351
+
352
+ * New: `controlslist` shortcode attribute and option to control the Chrome HTML5 player `nodownload` is default, it hides the download button on the player.
353
+
354
+ ### 2017-05-05 - 8.5.2 ###
355
+
356
+ * Improved: Embed Liveleak with https. Remove the default parameter.
357
+
358
+ ### 2017-05-05 - 8.5.1 ###
359
+
360
+ * Improved: Mark Liveleak that it not requires flash anymore. This makes the 'disable links' option of the Pro Addon possible. Becomes very handy as Liveleak annoyingly opens new tabs when clicking outside the play button.
361
+
362
+ ### 2017-05-04 - 8.5.0 ###
363
+
364
+ * New: playsinline, and muted attributes for HTML5 video.
365
+ * Data attributes are no longer prefixed with -arve and various other code improvements.
366
+
367
+ ### 2017-05-01 - 8.4.2 ###
368
+
369
+ * Code improvements for addons.
370
+
371
+ ### 2017-04-30 - 8.4.1 ###
372
+
373
+ * Fix password protected videos on vimeo (sandbox allow-forms)
374
+
375
+ ### 2017-04-25 - 8.4.0 ###
376
+
377
+ * Improved: The 'Take over [video]' option was renamed to 'Use ARVE for HTML5 video embeds' and is now enabled by default. (It never only was the shortcode but also HTML5 video file URLs on their own lines)
378
+ * New: Support for embedding Dropbox hosted HTML5 video files (mp4, webm, ogv). Needs the 'Use ARVE for HTML5 video embeds' to be activated. (Beta feature)
379
+ * Fix: YouTube only playlist URLs embedded without https.
380
+
381
+ ### 2017-04-11 - 8.3.1 ###
382
+
383
+ * Fix: Global CSS id was not correctly added.
384
+
385
+ ### 2017-04-10 - 8.2.5 ###
386
+
387
+ * Fix: Some Brightcove URLs were not correctly detected.
388
+ * Improved: Better automated tests and some minor code enhancements.
389
+ * Improved: Some texts, new link to the settings page below parameter field.
390
+ * Improved: How aspect ratio is handled for HTML 5 video. If not set (default) the browser will detect it based on the video file that is embedded.
391
+ * Improved: Gives the aligned videos a top margin of `0.4em` to try to align them better with text.
392
+ * Improved: The 'by ARVE' promotion links do now open in a new tab/window.
393
+
394
+ ### 2017-03-27 - 8.2.4 ###
395
+
396
+ * Fixed: YouTube cards generate a youtube-nocookie.com url to a channel when the -nocookie.url is used to embedding. tltr; This is actually a YouTube bug but this is fixed in ARVE now by using the normal YouTube url for embeds. I like the additional 'privacy' it provides by not setting cookies as long as the user not plays a video. But considering this is not the first time YouTube has bugs related to this feature, I switched this back and forth in the past, I am considering just not using it anymore.
397
+
398
+ ### 2017-03-25 - 8.2.3 ###
399
+
400
+ * Fixed: 'Disable links' feature from the Pro Addon was not working.
401
+ * Some minor code improvements.
402
+
403
+ ### 2017-03-20 - 8.2.2 ###
404
+
405
+ * Moved the ARVE menu below the settings menu (where most plugins are), sorry xberg. I got complaints about global menus and I like to keep the global Nextgenthemes menu but 2 global menus is a bit to much. I have given the Nextgenthemes menu a video icon now. I hope this is a good compromise.
406
+ * Improved: Finished the German translation.
407
+ * Improved: Made the ARVE Pro promotion on the settings menu close-able, hopefully less people get offended.
408
+
409
+ ### 2017-03-20 - 8.2.0 ###
410
+
411
+ * Fixed: Plugin action links on installed plugin screen
412
+ * Fixed: CSS specificity issues by adding a `id="arve"` to the entire document and based all the CSS on `#arve`. This will end a long time battle with themes styles without using bad practices. If you have custom styles overwriting ARVE CSS you may need to increase specificity (or use `!important`).
413
+ * Improved: styles and scripts and now served minified unless `WP_DEBUG` is set.
414
+ * Improved: styles are now only loaded (to the bottom) when there is a video on the page.
415
+ * Improved: Settings title is now 'Advanced Responsive Video Embedder Settings' again rather then just ARVE.
416
+
417
+ ### 2017-03-12 - 8.1.1 ###
418
+
419
+ * Improved: Added ARVE to menu below plugins so it can be easy found.
420
+ * Improved: Used `wp_add_inline_style` function for inline styles.
421
+ * Removed some code that is not needed.
422
+
423
+ ### 2017-03-03 - 8.0.9 ###
424
+
425
+ * Fix: Admin page error for messing file.
426
+
427
+ ### 2017-03-02 - 8.0.8 ###
428
+
429
+ * Improved: Updated EDD Plugin Updater class
430
+
431
+ ### 2017-02-24 - 8.0.7 ###
432
+
433
+ * Fix: Options not correctly put in debug-info.
434
+ * Improved: Make License input fields a bit wider.
435
+ * Improved: Some small code improvements.
436
+
437
+ ### 2017-02-12 - 8.0.5 ###
438
+
439
+ * Fix: Small size of lightbox when using the [Pro Addon](https://nextgenthemes.com/plugins/arve-pro/).
440
+
441
+ ### 2017-02-11 - 8.0.4 ###
442
+
443
+ * CSS improved
444
+ * Updated Addon Updater Class
445
+
446
+ ### 2017-01-03 - 8.0.2 ###
447
+
448
+ * Fix: Errors on settings page when Pro Addon is not installed.
449
+
450
+ ### 2016-12-17 - 8.0.1 ###
451
+
452
+ * Fix: `undefined function is_plugin_active()` error caused by some plugins
453
+ * Improved: Show actual meaningful message if PHP is lower then the required 5.3. Bluehost (oh proud wp.org recommended host) seems to show customers a **wrong** php version in the config and lets them hang on insecure end of life versions.
454
+
455
+ ### 2016-12-09 - Pro Addon 3.6.8 ###
456
+
457
+ * Fix: Wrongly tagged version.
458
+
459
+ ### 2016-12-07 - Pro Addon 3.6.7 ###
460
+
461
+ * Fix: Some thumbnails not loading.
462
+
463
+ ### 2016-12-07 - 8.0.0 ###
464
+
465
+ * Fix: 'Take over [video] shortcode' option not working. (Always acted as on, default is off)
466
+ * Fix: [video] override putting out a error for not reason.
467
+ * Improved code: Dropped 2 micro classes in favor for antonymous functions.
468
+
469
+ ### 2016-12-07 - Pro Addon 3.6.6 ###
470
+
471
+ * Improved: Load the CSS always in the `<head>`, this enables to change its CSS with the new CSS customizer in WP 4.7 and may also fix issues with caching plugins.
472
+
473
+ ### 2016-11-30 - 7.9.23 ###
474
+
475
+ * Fix: Ending up with wrong URLs by disabling auto shortening of URLs when pasting them into the shortcode-ui dialog.
476
+ * Improved: Enable SSL verify for API calls.
477
+ * Improved: License action return messages.
478
+
479
+ ### 2016-11-30 - Pro Addon 3.6.4 ###
480
+
481
+ * Fix: Autoplay without setting
482
+
483
+ ### 2016-11-30 - 7.9.21 ###
484
+
485
+ * Fix: Fatal error.
486
+
487
+ ### 2016-11-29 - Pro Addon 3.6.4 ###
488
+
489
+ * Improved: Licensing field removed from the pro options tab (now in main plugin). This enables resetting pro options settings without deleting license key.
490
+ * Fix: Autoplay not applied property.
491
+ * Fix: HTML5 not autoplaying in lightbox.
492
+ * Improved: New default option for inview lazyload is 'On iOS, Android and Desktops when no thumbnail is found'.
493
+ * Improved: New installations will show a message guiding users to activation screen.
494
+
495
+ ### 2016-11-29 - 7.9.19 ###
496
+
497
+ * Fix: 'Embed Video' Button not working with Advanced Custom Fields (Possibly fixed other 3rd party editor plugins compatibility issues as well) Thanks to David Trenear!
498
+ * Fix: Facebook URL detection for usernames with dots in them.
499
+ * Fix: Invisible HTML5 Lazyload-lightbox videos
500
+ * Fix: Shortcode UI script enqueued to early causing JS erros on admin pages.
501
+ * Improved: Error messages for missing mandatory attributes.
502
+ * Improved: Moved some code logic of the pro addon out of the main plugin.
503
+ * New: `disable_flash` parameter mainly for unlisted providers will be treated as general iframe embeds. With set to true this will enable you to use the 'disable_links' feature of the pro plugin.
504
+ * New: Filters for new cool things coming up
505
+ * New: License page, relocated options page
506
+ * New: YouTube URL detection for playlists without starting video `https://www.youtube.com/playlist?list=PL3Esg-ZzbiUmeSKBAQ3ej1hQxDSsmnp-7`
507
+ * Possible Fix: Videos displayed to small in some Browsers
508
+
509
+ ### 2016-10-29 - 7.9.8 and Pro Addon 3.3.4 ###
510
+
511
+ * Fix: Fix lightbox thumbnail
512
+ * Improved: CSS
513
+
514
+ ### 2016-10-28 - Pro Addon 3.3.1 ###
515
+
516
+ * Fix: Fix thumbnails being displayed wrong in IE.
517
+
518
+ ### 2016-10-28 - Pro Addon 3.3.0 ###
519
+
520
+ * Fix: Restored broken update notifications and semi auto updates.
521
+
522
+ ### 2016-10-28 - 7.9.7 ###
523
+
524
+ * New: Wistia Support.
525
+ * Improved: Allow HTML in title attribute.
526
+ * Improved: Force more CSS Styles.
527
+
528
+ ### 2016-10-27 - Pro Addon 3.2.9 ###
529
+
530
+ * Fix: Twitch API failing (needs Client-ID now)
531
+
532
+ ### 2016-10-27 - Pro Addon 3.2.8 ###
533
+
534
+ * Improved: oembed error message
535
+ * Improved: Skip srcset function for PHP 5.3 and lower
536
+
537
+ ### 2016-10-27 - 7.9.6 ###
538
+
539
+ * Fix: Thumbnail not correctly applied to <video> tag for self hosted videos.
540
+ * Improved: CSS for self hosted videos.
541
+ * Improved: Enabled detection for rubtube and VK and show them as supported providers, even they where supported as general iframe embeds before.
542
+
543
+ ### 2016-10-25 - Pro Addon 3.2.7 ###
544
+
545
+ * Fix: 2 clicks needed to play lazyloaded video on desktops
546
+
547
+ ### 2016-10-24 - Pro Addon 3.2.5 ###
548
+
549
+ * Fix: JavaScript error related to abandoned Script.
550
+ * Fix: Custom Thumbnails not applied.
551
+
552
+ ### 2016-10-24 - 7.9.5 ###
553
+
554
+ * Fix: Custom Thumbnails not applied.
555
+ * Fix: Shortcode UI script only loaded if the plugin is active.
556
+
557
+ ### 2016-10-23 - 7.9.4 and Pro Addon 3.2.3 ###
558
+
559
+ * Fix: Multiple issues about the new HTML5 video embedding (still experimental)
560
+
561
+ ### 2016-10-23 - Pro Addon 3.2.2 ###
562
+
563
+ * Fix: 'Disable Links' not working.
564
+
565
+ ### 2016-10-23 - Pro Addon 3.2.0 ###
566
+
567
+ * Fix: Issue with lazyload and AJAX.
568
+ * Fix: W3TC issue by using yet another lazyload method. Final this time?
569
+ * Fix: YouTube Thumbnail detection when there are no HD images.
570
+ * Improved: Code used to cache thumbnails, this may improve improve performance.
571
+ * Improved: Lots code restructured and improved.
572
+ * New: New Lazyload mode setting to prevent "two touched needed to play video on mobiles" issue. Its also
573
+ * New: Facebook thumbnail detection.
574
+
575
+ ### 2016-10-23 - 7.9.2 ###
576
+
577
+ * Fix: Brightcove Autoplay issue.
578
+ * Fix: Liveleak thumbnail detection issues.
579
+ * Fix: Parameters not being added.
580
+ * Fix: Twitch single videos not using https
581
+ * Fix: Vevo marked to require flash to make it work again.
582
+ * Improved: Better dialog with better description and links about the shortcake UI plugin.
583
+ * Improved: Facebook embed method.
584
+ * Improved: Lots code restructured and improved.
585
+ * Improved: Parameters are always possible no matter the provider.
586
+ * Improved: Restructure of the plugin, abandon OOP mostly.
587
+ * Improved: Revive saving of last setting page tab.
588
+ * New: "Image Cache Time" setting on the setting page. Thumbnail URLs form the media gallery can now be cached with transients, that may improve performance.
589
+ * New: Support for self hosted videos (experimental)
590
+
591
+ ### 2016-10-03 - Pro Addon 2.5.2 ###
592
+
593
+ * Fix: Force button styles to make sure themes styles get overwritten.
594
+
595
+ ### Pro Addon 2.5.1 beta - 2016-09-21 ###
596
+
597
+ * New: Thumbnail support for Liveleak.
598
+ * Fix: Update loop.
599
+
600
+ ### Pro Addon 2.5.0 beta - 2016-09-21 ###
601
+
602
+ * Improved: Thumbnails detection.
603
+ * Improved how license keys are handled when set in wp-config.php.
604
+
605
+ ### 7.5.1 beta - 2016-09-21 ###
606
+
607
+ * Fix: Liveleak seems to require flash for some videos.
608
+
609
+ ### 7.5.0 beta - 2016-09-21 ###
610
+
611
+ * Fix: Youku URL detection and aspect ratio.
612
+ * Improved: `.arve-inner` css class in favor of some more specific classes combining styles.
613
+ * Improved: removed TGMPA class because it was causing horrible issues.
614
+
615
+ ### Pro Addon 2.4.5 beta - 2016-09-19 ###
616
+
617
+ * New: Adds the ability to define the pro key in your wp-config.php file with `define( 'ARVE_PRO_KEY', 'your_key_here' )`. When activating the plugin it now also tries to activate its license when a key is defined.
618
+
619
+ ### 7.4.3 beta - 2016-09-19 ###
620
+
621
+ * Fix: Deal with fluid-vids script messing with this plugin, making videos invisible.
622
+
623
+ ### Pro Addon 2.4.0 beta - 2016-09-18 ###
624
+
625
+ * New: Adds Yahoo auto thumbnail and title support
626
+
627
+ ### 7.4.1 beta - 2016-09-18 ###
628
+
629
+ * New: Adds Yahoo Video support
630
+
631
+ ### 7.3.2 beta - 2016-09-17 ###
632
+
633
+ * Fix: Remove security="restricted" from iframes to make IE work again.
634
+
635
+ ### 7.3.1 beta - 2016-09-17 ###
636
+
637
+ * Fix: Get rid of undefined index warnings when pro addon is not active.
638
+
639
+ ### 7.3.0 beta - 2016-09-17 ###
640
+
641
+ * Improved: Show admin notices only to users who have the 'activate_plugins' capability.
642
+ * Improved: Added notice to the readme for the TGMPA cause white screen of death issue.
643
+
644
+ ### Pro Addon 2.3.2 - 2016-09-17 ###
645
+
646
+ * Possible Fix for not centered play button.
647
+
648
+ ### 7.2.13 beta - 2016-09-16 ###
649
+
650
+ * Fix: Set fitvidsignore class and remove the Fitvids container to prevent it from messing with ARVE embeds.
651
+ * Fix: Remove possible width and height parameters on iframes to prevent scripts from messing with ARVE embeds.
652
+
653
+ ### 7.2.12 beta - 2016-09-16 ###
654
+
655
+ * Improved: replaced static:: with self:: to support older php versions.
656
+
657
+ ### 7.2.10 beta - 2016-09-15 ###
658
+
659
+ * Fix: `[iframe]` shortcode not working.
660
+
661
+ ### Pro Addon 2.3.1 beta - 2016-09-15 ###
662
+
663
+ * New: Added support for displaying title of videos on top of the thumbnail images.
664
+ * New: Responsive thumbnails using srcset the browser takes the best image resolution for the users device. (HTML5 srcset)
665
+ * New: Choose between 3 hover styles for the thumbnails: 'zoom image' (new default), 'rectangle move in' (old), or 'none' where only the play button changes.
666
+ * New: Choose between 2 play button styles.
667
+ * Fix: Screenfull error.
668
+ * Fix: License API call.
669
+ * Improved: Rectangle animation.
670
+ * Improved: Updated 'lity' lightbox script.
671
+ * Improved: Thumbnail handling.
672
+ * Improved: Removed the 'Lazyload Maximal Width' setting to simplify things (there still is 'Maximal Width' and 'Aligned Maximal Width').
673
+ * Improved: Removed the 'Fake Thumbnail' feature because the entire idea was bad and real thumbnails should be used.
674
+ * Improved: Updated EDD_SL_Plugin_Updater Class
675
+ * Dropped PHP Class.
676
+
677
+ ### 7.2.9 beta - 2016-09-15 ###
678
+
679
+ * New: Recommend and guide to users to install [Shortcake (Shortcode UI)](https://de.wordpress.org/plugins/shortcode-ui/) via [TGMPA](http://tgmpluginactivation.com/)
680
+ * New: Amazing catch-all shortcode [arve url="..."] that can be used for all supported providers and even with any iframe `src` if all unlisted providers that support responsive iframe embeds.
681
+ * New: Support for kla.tv.
682
+ * New: Support for youku (fulfilled request)
683
+ * New: New Advanced Shortcode Dialog with nice UI for choose thumbnails from your WP Media Gallery, very detailed helping texts, display of default settings, hiding of fields based on need ...
684
+ * New: WYSIWYG Preview of Shortcodes.
685
+ * New: The two above features need the [Shortcake (Shortcode UI)](https://de.wordpress.org/plugins/shortcode-ui/) Plugin that is maybe moving into WordPress core later.
686
+ * New: A default alignment can now be set in the Settings page. (fulfilled request)
687
+ * New: 'iframe_name' shortcode parameter for `<iframe name="xxxxx"`, useful when wanting to target ARVE embeds with links. (fulfilled request)
688
+ * New: ARVE is now SEO friendly giving you the ability to add some schema.org microdata. Googles tools should not complain anymore if you add title, description and upload date. (fulfilled request)
689
+ * Deleted Language files in favor of [wordpress.org managed translations](https://translate.wordpress.org/projects/wp-plugins/advanced-responsive-video-embedder/dev) volunteers are welcome ;)
690
+ * Improved: Got rid of PHP globals.
691
+ * Improved: Added image upload dialog to settings page and shortcode dialog.
692
+ * Improved: Better CSS to overwrite unwanted theme styles.
693
+ * Improved: Lots if code improvements.
694
+ * Improved: SSL enabled and forced when supported by providers.
695
+ * Fix: Blury Vimeo thumbnails
696
+ * Fix: Prevent Dashboard Widget conflicts with WP Helpers plugin (possibly others). Thanks to Steve Bruner.
697
+ * Fix: Issue with unwanted borders showing on embeds.
698
+ * Fix: youtu.be URLs now detected correct in shortcode dialog.
699
+ * Fix: All Vevo URLs are now detected correctly.
700
+ * Fix: Bool options settings.
701
+ * Removed blip because the service was shutdown.
702
+ * Removed myvideo.de because the service was restructured.
703
+
704
+ ### 6.4.0 ###
705
+
706
+ * Fix: Always prevent scrollbars.
707
+
708
+ ### Pro Addon 1.4.4
709
+
710
+ * Fixed: Infinite update loop.
711
+ * Improved: Updated Updater class.
712
+
713
+ ### Pro Addon 1.4.3
714
+
715
+ * Fixed: rectangle overflow issue.
716
+
717
+ ### Pro Addon 1.4.2
718
+
719
+ * Fixed: license activation problems.
720
+
721
+ ### Pro Addon 1.4.1
722
+
723
+ * Fixed critical bug for auto updates. Please [click here](https://nextgenthemes.com/support/915/add-wont-update-wordpress-says-download-failed-unauthorized?show=1053#a1053) if your update fails.
724
+
725
+ ### 6.3.9 ###
726
+
727
+ * Fix: Facebook (now really, hopefully).
728
+
729
+ ### 6.3.8 ###
730
+
731
+ * Fix: Facebook in lazyload modes.
732
+
733
+ ### 6.3.7 ###
734
+
735
+ * New: Facebook video support.
736
+
737
+ ### 6.3.4 ###
738
+
739
+ * Fix?: Iframes are now created with a fixed 853x480 size in feeds, this probably will fix some feedreaders incorrectly or not displaying videos.
740
+
741
+ ### 6.3.3 ###
742
+
743
+ * Improved: Disabled file URL detection as this solution was bad.
744
+
745
+ ### 6.3.2 ###
746
+
747
+ * Fixed/Improved: [arve_tests] shortcode.
748
+
749
+ ### Pro Addon 1.4 ###
750
+
751
+ * Fix: Fake thumbnails now work for lazyload-lightbox mode.
752
+
753
+ ### 6.3.1 & Pro Addon 1.4.0 ###
754
+
755
+ * Improved: Testing Shortcode.
756
+ * Improved: When there is no thumbnail lazyload mode will fall back to normal mode.
757
+ * New: Added support for alugha.com.
758
+
759
+ ### Pro Addon 1.1.5 ###
760
+
761
+ * New: Added setting and parameter grow="yes/no" to control the grow-on-click behaviour that was introduced in 6.0 to your liking.
762
+
763
+ ### 6.1.2 ###
764
+
765
+ * Improved: Added thumbnail and grow parameters to the Shortcode Creator Dialog.
766
+ * Improved: Updated screenshots.
767
+
768
+ ### Pro Addon 1.1.3 ###
769
+
770
+ * Improved: link-linghtbox mode does not force a newline for the link anymore.
771
+ * Fix: Autoplaying in Background when navigating back in browser.
772
+
773
+ ### Pro Addon 1.1.0 ###
774
+
775
+ * Fix: Various issues reguarding lightbox mode.
776
+
777
+ ### 6.1.0 ###
778
+
779
+ * Fix: Messages about pro addon removed when it is installed.
780
+
781
+ ### Pro Addon 1.0.7 ###
782
+
783
+ * Fix: Video start playing again invisible when closeing lightbox with ESC.
784
+
785
+ ### 6.0.6 Beta ###
786
+
787
+ * Improved: Adds a "Debug Info" tab to the settings page copy pasting when there is are issue.
788
+
789
+ ### Pro Addon 1.0.6 ###
790
+
791
+ * Remove development functions.
792
+
793
+ ### Pro Addon 1.0.4 ###
794
+
795
+ * Possibly Fixes SSL issues during activation.
796
+
797
+ ### Pro Addon 1.0.3 ###
798
+
799
+ * Fix: Maxwidth issue.
800
+
801
+ ### 6.0.5 Beta ###
802
+
803
+ * Fix: Foreach php error
804
+
805
+ ### 6.0.4 Beta ###
806
+
807
+ * Fix: Youtube URL with starttime.
808
+
809
+ ### 6.0.3 Beta, Pro Addon 1.0.3 ###
810
+
811
+ * Fix: Max-width output issue.
812
+
813
+ ### 6.0.2 Beta - 2015/07/24 - work time: ~60 days ###
814
+
815
+ Please check the [migration guide](https://nextgenthemes.com/?p=1875) about upgrading to this version.
816
+
817
+ * Fix: Jackpack Shortcode Embeds module incompatibility.
818
+ * New: URL parameters are now possible via URLs used for embeds (passed to iframe src).
819
+ * Changed: URL parameters to controll arve features are now 'arve[mode]=' style instead of 'arve-mode='.
820
+ * Improved: Enabled HTTPS support for Viddler and MyVideo.
821
+ * Improved: TED Talks shortcodes now support the 'lang' parameter.
822
+ * Improved: New embed URLs for MyVideo.
823
+ * Improved: Better Twitch support.
824
+ * Improved: Dailymotion HTTPS support.
825
+ * Improved: To reduce CSS and keep it simpler aspect ratios are now handled with inline styles.
826
+ * Improved: Moved to complete WP Settings API.
827
+ * Improved: Tabbed and extendable options page.
828
+ * Improved: Massive code improvements.
829
+ * Improved: Replaced all Admin Messages that caused bugs and annoyance for users with a dashboard Widget.
830
+
831
+ ### Pro Addon 1.0.1 ###
832
+
833
+ * New: link-lightbox mode creates a link the triggers a lightbox with a video on click.
834
+
835
+ ### Pro Addon 0.9.7 ###
836
+
837
+ * Fix: Lazyload videos not growing when global maxwidth setting was set.
838
+ * Improved: Finally got rid of the jQuery Colorbox depency, the Pro Addon now includes lity for lightboxes.
839
+
840
+ ### Pro Addon 0.9.5 ###
841
+
842
+ * Fix: Licensing Activation should now finally work correcty. (Multisite may need some tweaks)
843
+ * Fix: Pissibility of unwanted margins/paddings on the transparent button.
844
+
845
+ ### Pro Addon 0.9.0 ###
846
+
847
+ * Changed: 'Lazyload' mode now grows the video size after thumbnails are clicked.
848
+ * Changed: 'Thumbnail' mode is now called 'Lazyload -> Colorbox' and has a sightly different behavior.
849
+ * New: 'Lazyload -> Fullscreen' mode to instandly go Fullscreen after clicking the Lazyloaded preview image.
850
+ * New: 'Lazyload -> Fixed' Fullscreen/-window mode (extremly experimental) with ability to resize fixed video on screen while reading the page.
851
+ * New: 'thumbnail' parameter, take image URL or a ID to a media libray image to be used as thumbnail image.
852
+ * Improved: Enabled fake thumbnails for USTREAM and myvideo.de.
853
+ * Depricated: Providers that only support `<object>` are from now only supported in normal mode, will switch automatically. This effects only recorded Twitch videos, flickr and veoh.
854
+
855
+ ### 5.3.4 Beta - 2015/03/15 ###
856
+
857
+ * Fix: ID detection for youtu.be and dai.ly URLs, will now work with https://(www.) as well.
858
+ * Fix: Myvideo.de videos with 7 and 8 digit IDs.
859
+
860
+ ### 5.3.3 Beta ###
861
+
862
+ * Fix: Workarround for a currently ongoing YouTube issue causing YouTube embeds to fail with erros on mobile devives. This was not a 'bug' caused by this plugin btw.
863
+
864
+ ### 5.3.2 Beta ###
865
+
866
+ * Fix: Die 'Array' errors DIE!
867
+
868
+ ### 5.3.1 Beta ###
869
+
870
+ * Improved: Added shortcode example to youtube starttime examples.
871
+ * Improved: Clarified from who the admin messages come.
872
+
873
+ ### 5.3.0 Beta ###
874
+
875
+ * **If you get a error '... array ...' please reset your options on the options page and redo the options you had before**
876
+ * Fix: '... expected array' error when saving options on some cases. If you get a error please reset your
877
+ * Fix: ttp://youtu.be/... shortlinks are not detected correctly in the shortcode creator dialog.
878
+ * Improved: Ported code to WordPress Plugin Boilerplate 3.0 style.
879
+ * Improved: Switched vevo and xtube from object to iframe embeds.
880
+ * Improved: Lots of minor code enhancements.
881
+
882
+ ### 5.1.1 ###
883
+
884
+ * Fix: Removed mixed content warnungs for youtube and vimeo.
885
+ * Translation updates.
886
+
887
+ ### 5.1.0 ###
888
+
889
+ * New: Vimeo HTTPS support (works automatically if your site is HTTPS)
890
+
891
+ ### 5.0.2 Beta ###
892
+
893
+ * Improved: Marked as working with WP 4.0
894
+
895
+ ### 5.0.1 Beta ###
896
+
897
+ * Fix: Options var error
898
+
899
+ ### 5.0.0 Beta ###
900
+
901
+ * Fix: Max-width options should now work in all circumstances
902
+ * Improved: Various CSS improvements
903
+ * Improved: Changed play overlay image to a Google+ style image
904
+
905
+ ### 4.9.0 Beta ###
906
+
907
+ * Improved: All Javascript is loaded from files now and they are only loaded when there are embeds on the page. This improves page load times on pages with no embeds.
908
+ * Fix: Removed autohide#1 from default YouTube Parameters since it causes a YouTube bug in the HTML5 player.
909
+
910
+ ### 4.8.0 ###
911
+
912
+ * Updated: Spanish translation now 80% complete. Thanks Xarkitu!
913
+ * Improved: Do not load admin dialog when doing AJAX
914
+
915
+ ### 4.7.0 ###
916
+
917
+ * Fix: Iframe code detection
918
+
919
+ ### 4.6.0 ###
920
+
921
+ * Improvement: PHP required version lowered to 5.2.4
922
+
923
+ ### 4.5.4 ###
924
+
925
+ * Fix: Save of custom URL parameters
926
+ * New: CHANGES.md file for github updater
927
+
928
+ ### 4.5.3 ###
929
+
930
+ * Fix: Fatal PHP Error on activation.
931
+ * Fix: Readme spellings.
932
+
933
+ ### 4.5.0 ###
934
+
935
+ * Fix: Minor options page spelling and field association fixes.
936
+ * Fix: Added Lazyload to mode select in the shortcode dialog.
937
+ * New: 4players.de support.
938
+ * New: Added parameter input to the shortcode dialog.
939
+ * Improved: Default options are no longer stored in the database.
940
+ * Improved: Transparency fade animation on thumbnail hover.
941
+ * Improved: No more ugly URL hash (#arve-load-video) after clicking links.
942
+ * Improved: Dropped IE 8 support for Lazyload mode.
943
+ * Improved: Lots of code improvements.
944
+
945
+ ### 4.3.0 ###
946
+
947
+ * New: Added Iframe examples.
948
+ * Improved: Limited support for self hosted Videos. Dialog will detect URLS that end up with .webm .mp4 .ogg creates a iframe embed code with them. This is probaly not the best way to do this but it works. Real HTML5 video tag embeds may come later.
949
+ * Improved: Redesigned the button to look like WordPress and move it out of the Tiny MCE Editor. This enables you to embed videos in the code editor as well.
950
+ * Improved: Redesigned the Shortcode Creator dialog. Less clutter, more compact and it now includes the recently introduced `aspect_ratio`.
951
+
952
+ ### 4.2.0 ###
953
+
954
+ * New: As requested: `aspect_ratio` parameter
955
+ * Fix: Vimeo playing problems in Firefox.
956
+
957
+ ### 4.1.1 ###
958
+
959
+ * Fix: Play button not showing.
960
+
961
+ ### 4.1.0 ###
962
+
963
+ * New: Vine support
964
+ * New: Support for starttime from youtube URLs
965
+ * Improved: Include play image inside CSS, -1 http request may speed things up
966
+ * Improved: Tests
967
+
968
+ ### 4.0.0 ###
969
+
970
+ * New: Trigger-able debug output.
971
+ * Improved: The `[arve_tests]` shortcode now includes alignment and maxwidth tests
972
+ * Fix: Thumbnail image now displayed when using lazyload with `maxwidth` parameter
973
+
974
+ ### 3.9.9 ###
975
+
976
+ * Improved: Allowing `maxwidth` parameter in `lazyload` mode
977
+
978
+ ### 3.9.8 ###
979
+
980
+ * Fix: Thumbnail not opening Colorbox
981
+
982
+ ### 3.9.7 ALPHA! ###
983
+
984
+ * New: I am proud to introduce the new 'lazyload' mode. ARVEs new default mode. Load Images only and load the Video only on click. Like Google+ without the title.
985
+ * New: Added MPORA support
986
+ * New: Added (real) thumbnail support for Collegehumor, Twitch, FunnyOrDie, MPORA
987
+ * New: `[arve_tests]` shortcode that is used to test the plugin and provide examples.
988
+ * New: `[arve_supported]` shortcode probably of no use for users. It will generate the a list of providers with supported features.
989
+ * Improved: Enabled fake thumbnails for Comedycentral, Gametrailers and Spike
990
+ * Improved: Remote API calls and handling their errors.
991
+ * Improved: Get high resolution thumbnails from YouTube if available.
992
+ * Improved: The evil admin message is now only shown once to users who can delete plugins (Admins and the like) and if the plugin was activated a week ago or longer.
993
+ * Improved: Lots of smaller code improvements.
994
+
995
+ ### 3.6.1 ###
996
+
997
+ * Fix: Register link in changelog.
998
+
999
+ ### 3.6.0 ###
1000
+
1001
+ * New: Thanks to [Ilya Grishkov](https://ilyagrishkov.com) thumbnail URLs for Vimeo, Blip and Dailymotion Playlists are now cached (by default 24hours) this drastically reduces page loading times for thumbnail embeds from these providers because it bypasses calling their APIs for that period.
1002
+ * Fix: Thumbnails for YouTube playlists.
1003
+ * Fix: Shortcode creator ID detection for iframes (src URL)
1004
+ * Fix: Updated Dailymoton docs link on Options page
1005
+ * Improved: Error messages are now all ready to be translated. Current Translation status: German 50%, French 50%, Spanish 84%. Register at [nextgenthemes.com](https://nextgenthemes.com/wp-login.php?action#register) and then login to [translate.nextgenthemes.com](https://translate.nextgenthemes.com) to help translate.
1006
+
1007
+ ### 3.5.2 ###
1008
+
1009
+ * New: Twitch.tv support
1010
+ * New: Spanish Translation from Andrew Kurtis webhostinghub.com
1011
+ * Improved: Support for `https://new.ted.com/...` URLs
1012
+ * Improved: Some code improvements, among them IDs of hidden objects are now generated with a simple `static` counter instead of some random generated string.
1013
+
1014
+ ### 3.5.1 ###
1015
+
1016
+ * Fix: Bug causing the Shortcode Creator not detecting shortcode tags when customized
1017
+ * Improved how embeds `<object>` embed codes are generated.
1018
+ * Updated FAQ
1019
+ * New: Xtube support (On request)
1020
+
1021
+ ### 3.5.0 ###
1022
+
1023
+ * New: Custom parameters!
1024
+ * Fix: Youtube playlists now work correctly
1025
+ * Fix: Translations are working again (incomplete German and French)
1026
+ * Deprecated: `start` and `end` shortcode parametets should not be used anymore with youtube, instead use the new parameters feature like `[youtube id#"123456" parameters#"start#60 end#120"]`
1027
+
1028
+ ### 3.1.2 ###
1029
+
1030
+ * Fix: IE8 JavaScript errors
1031
+ * Improved: The evil message at the admin.
1032
+
1033
+ ### 3.1.1 (github only) ###
1034
+
1035
+ * Improved: Added `px` suffix to values on options page
1036
+
1037
+ ### 3.1.0 (beta) ###
1038
+
1039
+ * New: Development versions now available via [Github Plugin Updater](https://github.com/afragen/github-updater) please install this to test cutting edge versions
1040
+ * New: Introducing 'Align Maximal Width' option
1041
+ * Fix: Invisible normal mode embeds with align
1042
+ * Fix: Yahoo detection
1043
+ * Fix: Kickstarter detection
1044
+ * Fix: Daylimoition Playlist
1045
+ * Fix: Colleghumor
1046
+ * Improved: Screenshots updated
1047
+ * Improved: Beginning process of provider based aspect ratios.
1048
+ * Improved: Dailymotion playlists/jukeboxes now show Native thumbnails
1049
+ * Improved: Iframe embed code detection with with single quoted `src#''`
1050
+
1051
+ ### 3.0.4 (beta) ###
1052
+
1053
+ * Javascript Fix
1054
+
1055
+ ### 3.0.0 (beta) ###
1056
+
1057
+ * New: Support for embedding via simply pasting of URLs into posts (need to be on their own line, no button or shortcodes needed)
1058
+ * New: Thumbnails are now responsive
1059
+ * New: Vevo support
1060
+ * New: TED Talks support
1061
+ * New: IGN support
1062
+ * New: Kickstarter support
1063
+ * Improved: request large thumbnail from vimeo instead of medium
1064
+ * Improved: 'youtubelist' shortcode deprecated YouTube playlists are now handled via the normal youtube shortcode with support for starting video
1065
+ * Improved: 'bliptv' shortcode deprecated on favor of 'blip' that uses the ids from blip.tv URLs instead of the ones from embed codes
1066
+ * Improved: Moved code to newest Plugin Boilerplate
1067
+ * Improved: Massive code improvements
1068
+
1069
+ ### 2.7.4 ###
1070
+
1071
+ * Fix: Dropped mb_detect_encoding now using just preg_match to support rare php setups.
1072
+
1073
+ ### 2.7.3 ###
1074
+
1075
+ * New: Added French Translation from Karel - neo7.fr
1076
+
1077
+ ### 2.7.2 ###
1078
+
1079
+ * Fix: Permissions for the button, now authors who
1080
+
1081
+ ### 2.7.0 ###
1082
+
1083
+ * Fix: Admin page capabilities
1084
+ * Improved: Reintroduced the manual provider and ID input to be used then not detected correctly.
1085
+
1086
+ ### 2.6.4 ###
1087
+
1088
+ * Fix: Black bar issue. (Dropped IE6 hacks/workarounds)
1089
+
1090
+ ### 2.6.3 ###
1091
+
1092
+ * Fix: Normal embeds not sizing correctly
1093
+ * New: Added scrolling#"no" to Iframes
1094
+ * Improved: Init shortcodes at a late stage to dominate conflicts
1095
+ * Improved: Improved Iframe parameter handling
1096
+ * Improved: Metacafe, Myspace, Videojug are now handled via Iframe
1097
+
1098
+ ### 2.6.2 ###
1099
+
1100
+ * Fix: Objects open correctly in Colorbox
1101
+ * Fix: Iframe autoplay parameters startign with '&'
1102
+ * New: Added screenshot for options page
1103
+ * Improved: Youtube Videos with now me embedded with the same protocol your website is on, meaning if your website is https youtube embeds will be in https as well.
1104
+
1105
+ ### 2.6.1 ###
1106
+
1107
+ * Fix: Colorbox args script not having colorbox in depenency array
1108
+ * Fix: Maxwidth shortcode generator field now has default value#""
1109
+ * Fix: Blip embed code detection
1110
+
1111
+ ### 2.6.0 ###
1112
+
1113
+ * Improved: Move to a class structure with help of the great https://github.com/tommcfarlin/WordPress-Plugin-Boilerplate
1114
+ * Improved: Some smaller Improvements
1115
+ * New: Shortcode Dialog now has Autoplay option
1116
+ * New: Guessing of autoplay parameters for the Iframe shortcodes.
1117
+ * Hopefully fixed issues with other plugins and some themes, Javascript was messed up and is fine now.
1118
+
1119
+ ### 2.5 ###
1120
+
1121
+ * Fix: Objects in Colorboxes, now always have width and height 100%
1122
+ * new shortcode attribute 'autoplay' for single videos
1123
+ * support for start at given time for vimeo
1124
+
1125
+ ### 2.4 ###
1126
+
1127
+ * propper licence
1128
+ * Class renamed
1129
+
1130
+ ### 2.3 beta ###
1131
+
1132
+ * fix for maxwidth wrapper no maxwidth option is set
1133
+
1134
+ ### 2.1 beta ###
1135
+
1136
+ * Security and general code improvements
1137
+ * Added autoplay option
1138
+
1139
+ ### 2.0 beta ###
1140
+
1141
+ * added Yahoo!
1142
+ * spike bugfix
1143
+ * small improvements to code
1144
+ * removed the fixed mode
1145
+
1146
+ ### 1.9 beta ###
1147
+
1148
+ * added youtubes modestbranding mode
1149
+ * added missing veoh id detection
1150
+ * fixed vimeo id detection
1151
+ * added now custom thumbnail feature
1152
+ * fixed the align class creation
1153
+ * renamed the shortcode dialog
1154
+ * removed the text field for teh fixed width option (beginning of the removal process)
1155
+
1156
+ ### 1.8 beta ###
1157
+
1158
+ * added new tinymce botton with dialog to detect ids from URL's and embed codes and automatically create shortcodes
1159
+ * removed the image resizer (Faster and more secure for servers), now uses just CSS. Polyfill for for IE to support 'background-size' included.
1160
+ * changed the play overlay image to a bigger one
1161
+ * added comedycentral, spike
1162
+ * removed google video, it died
1163
+ * lots of improvements and fixes
1164
+
1165
+ ### 1.7 ###
1166
+
1167
+ * fixed gametrailers and collegehumor
1168
+ * fixed options handling for updateded options
1169
+ * added ustream support
1170
+ * renamed a function to prevent issues with other plugins
1171
+
1172
+ ### 1.6 ###
1173
+
1174
+ * corrected readme errors, typos and added better description to shortcode options
1175
+
1176
+ ### 1.5 ###
1177
+
1178
+ * lots of code improvements, now uses wordpress settings api, and propper sanitising
1179
+
1180
+ ### 1.4.5 ###
1181
+
1182
+ * added flickr video, archive.org
1183
+ * inproved how flashvars were implemented
1184
+
1185
+ ### 1.4.4 ###
1186
+
1187
+ * fixes
1188
+
1189
+ ### 1.4.2 ###
1190
+
1191
+ * Options dialog overhaul
1192
+ * replaced Fancybox with Colorbox
1193
+
1194
+ ### 1.0 ###
1195
+
1196
+ * Removed Services that went down over the years
1197
+ * Changed the way shortcodes were implemented from regexp to wordpress 'add shortcode' function
1198
+
1199
+ ### 2012-02-03 0.1 ###
1200
+
1201
+ * Started by improving the WordPress 'Video Embedder Plugin' but now complete new code `svn log --stop-on-copy --quiet https://plugins.svn.wordpress.org/advanced-responsive-video-embedder/ | tail -2` this plugins was submitted and approved in 2012, seems I have been working on this longer then I thought.
php/Admin/functions-admin.php CHANGED
@@ -10,7 +10,6 @@ function action_admin_init_setup_messages() {
10
 
11
  if ( defined( 'ARVE_PRO_VERSION' ) ) {
12
  $pro_version = ARVE_PRO_VERSION;
13
-
14
  } elseif ( defined( '\Nextgenthemes\ARVE\Pro\VERSION' ) ) {
15
  $pro_version = \Nextgenthemes\ARVE\Pro\VERSION;
16
  }
@@ -42,7 +41,9 @@ function action_admin_init_setup_messages() {
42
 
43
  if ( display_pro_ad() ) {
44
 
45
- $pro_ad_message = __( '<p>Hi, this is Nico(las Jonas) the author of the ARVE - Advanced Responsive Video Embedder plugin. If you are interrested in additional features and/or want to support the work I do on this plugin please consider buying the Pro Addon.</p>', 'advanced-responsive-video-embedder' );
 
 
46
 
47
  // phpcs:ignore WordPress.WP.AlternativeFunctions.file_get_contents_file_get_contents
48
  $pro_ad_message .= file_get_contents( __DIR__ . '/partials/pro-ad.html' );
@@ -138,25 +139,30 @@ function add_action_links( $links ) {
138
  function add_media_button() {
139
 
140
  $options = ARVE\options();
141
-
142
  add_thickbox();
 
143
 
144
- echo '<div id="arve-thickbox" style="display:none;">';
145
- // phpcs:disable WordPress.WP.I18n.MissingTranslatorsComment
146
- printf(
147
- __( // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
148
- '<p>This button can open a optional ARVE a Shortcode creation dialog. ARVE needs the <a href="%1$s">Shortcode UI plugin</a> active for this fuctionality.</p>
149
-
150
- <p>The "Shortcake (Shortcode UI)" plugin also adds What You See Is What You Get functionality for ARVE Shortcodes to WordPress visual post editor. It is perfectly fine to pass on this and <a href="%2$s">manually</a> write shortcodes or don\'t use shortcodes at all, but it makes things easier.</p>',
151
- 'advanced-responsive-video-embedder'
152
- ),
153
- esc_url( network_admin_url( 'plugin-install.php?s=Shortcode+UI&tab=search&type=term' ) ),
154
- esc_url( 'https://nextgenthemes.com/plugins/arve/documentation/' )
155
- );
156
- // phpcs:enable WordPress.WP.I18n.MissingTranslatorsComment
157
-
158
- echo '</div>';
159
-
 
 
 
 
 
160
  printf(
161
  '<button id="arve-btn" title="%s" data-mode="%s" class="arve-btn button add_media" type="button"><span class="wp-media-buttons-icon arve-icon"></span> %s</button>',
162
  esc_attr__( 'ARVE Advanced Responsive Video Embedder', 'advanced-responsive-video-embedder' ),
@@ -172,18 +178,33 @@ function register_shortcode_ui() {
172
  foreach ( $settings as $k => $v ) :
173
 
174
  if ( 'boolean' === $v['type'] ) {
175
- $v['type'] = 'select';
176
 
177
  if ( isset($v['option']) && true === $v['option'] ) {
178
  $v['options'] = [
179
- [ 'value' => '', 'label' => esc_html__( 'Default (settings page)', 'advanced-responsive-video-embedder' ) ],
180
- [ 'value' => 'yes', 'label' => esc_html__( 'Yes', 'advanced-responsive-video-embedder' ) ],
181
- [ 'value' => 'no', 'label' => esc_html__( 'No', 'advanced-responsive-video-embedder' ) ],
 
 
 
 
 
 
 
 
 
182
  ];
183
  } else {
184
  $v['options'] = [
185
- [ 'value' => 'no', 'label' => esc_html__( 'No', 'advanced-responsive-video-embedder' ) ],
186
- [ 'value' => 'yes', 'label' => esc_html__( 'Yes', 'advanced-responsive-video-embedder' ) ],
 
 
 
 
 
 
187
  ];
188
  }
189
  }
@@ -312,24 +333,6 @@ function params_section_description() {
312
  <?php
313
  }
314
 
315
- function plugin_ver_status( $folder_and_filename ) {
316
-
317
- $file = WP_PLUGIN_DIR . '/' . $folder_and_filename;
318
-
319
- if ( ! is_file( $file ) ) {
320
- return 'NOT INSTALLED';
321
- }
322
-
323
- $data = get_plugin_data( $file );
324
- $out = $data['Version'];
325
-
326
- if ( ! is_plugin_active( $folder_and_filename ) ) {
327
- $out .= ' INACTIVE';
328
- }
329
-
330
- return $out; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
331
- }
332
-
333
  function debug_section_description() {
334
  include_once __DIR__ . '/partials/debug-info.php';
335
  }
@@ -361,7 +364,7 @@ function admin_enqueue_scripts() {
361
  Common\enqueue_asset(
362
  [
363
  'handle' => 'arve-admin-sc-ui',
364
- 'path' => ARVE\PLUGIN_DIR . '/build/shortcode-ui.js',
365
  'src' => plugins_url( 'build/shortcode-ui.js', ARVE\PLUGIN_FILE ),
366
  'deps' => [ 'shortcode-ui' ],
367
  ]
10
 
11
  if ( defined( 'ARVE_PRO_VERSION' ) ) {
12
  $pro_version = ARVE_PRO_VERSION;
 
13
  } elseif ( defined( '\Nextgenthemes\ARVE\Pro\VERSION' ) ) {
14
  $pro_version = \Nextgenthemes\ARVE\Pro\VERSION;
15
  }
41
 
42
  if ( display_pro_ad() ) {
43
 
44
+ $pro_ad_message = __( 'Hi, this is Nico(las Jonas) the author of the ARVE - Advanced Responsive Video Embedder plugin. If you are interrested in additional features and/or want to support the work I do on this plugin please consider buying the Pro Addon.', 'advanced-responsive-video-embedder' );
45
+
46
+ $pro_ad_message = "<p>$pro_ad_message</p>";
47
 
48
  // phpcs:ignore WordPress.WP.AlternativeFunctions.file_get_contents_file_get_contents
49
  $pro_ad_message .= file_get_contents( __DIR__ . '/partials/pro-ad.html' );
139
  function add_media_button() {
140
 
141
  $options = ARVE\options();
 
142
  add_thickbox();
143
+ ?>
144
 
145
+ <div id="arve-thickbox" style="display:none;">
146
+ <p>
147
+ <?php
148
+ printf(
149
+ // phpcs:ignore
150
+ Common\kses_basic( __( 'This button can open an optional ARVE a Shortcode creation dialog. ARVE needs the <a href="%s">Shortcode UI plugin</a> active for this fuctionality. It helps creating shortcodes and provides a preview in the Editor. But sadly Shortcode UI is not maintained anymore and there have been some know issues with Shortcode UI.', 'advanced-responsive-video-embedder' ) ),
151
+ esc_url( network_admin_url( 'plugin-install.php?s=Shortcode+UI&tab=search&type=term' ) )
152
+ );
153
+ ?>
154
+ </p>
155
+ <p>
156
+ <?php
157
+ printf(
158
+ // phpcs:ignore
159
+ Common\kses_basic( __( 'It is perfectly fine to pass on this and <a href="%s">manually</a> write shortcodes or don\'t use shortcodes at all, but it makes things easier. And if you even switch to Gutenberg there is a ARVE Block all the settings in the sidebar waiting for you..', 'advanced-responsive-video-embedder' ) ),
160
+ esc_url( 'https://nextgenthemes.com/plugins/arve/documentation/' )
161
+ );
162
+ ?>
163
+ </p>
164
+ </div>
165
+ <?php
166
  printf(
167
  '<button id="arve-btn" title="%s" data-mode="%s" class="arve-btn button add_media" type="button"><span class="wp-media-buttons-icon arve-icon"></span> %s</button>',
168
  esc_attr__( 'ARVE Advanced Responsive Video Embedder', 'advanced-responsive-video-embedder' ),
178
  foreach ( $settings as $k => $v ) :
179
 
180
  if ( 'boolean' === $v['type'] ) {
181
+ $v['type'] = 'select';
182
 
183
  if ( isset($v['option']) && true === $v['option'] ) {
184
  $v['options'] = [
185
+ [
186
+ 'value' => '',
187
+ 'label' => esc_html__( 'Default (settings page)', 'advanced-responsive-video-embedder' ),
188
+ ],
189
+ [
190
+ 'value' => 'yes',
191
+ 'label' => esc_html__( 'Yes', 'advanced-responsive-video-embedder' ),
192
+ ],
193
+ [
194
+ 'value' => 'no',
195
+ 'label' => esc_html__( 'No', 'advanced-responsive-video-embedder' ),
196
+ ],
197
  ];
198
  } else {
199
  $v['options'] = [
200
+ [
201
+ 'value' => 'no',
202
+ 'label' => esc_html__( 'No', 'advanced-responsive-video-embedder' ),
203
+ ],
204
+ [
205
+ 'value' => 'yes',
206
+ 'label' => esc_html__( 'Yes', 'advanced-responsive-video-embedder' ),
207
+ ],
208
  ];
209
  }
210
  }
333
  <?php
334
  }
335
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
336
  function debug_section_description() {
337
  include_once __DIR__ . '/partials/debug-info.php';
338
  }
364
  Common\enqueue_asset(
365
  [
366
  'handle' => 'arve-admin-sc-ui',
367
+ 'path' => ARVE\PLUGIN_DIR . '/build/shortcode-ui.js',
368
  'src' => plugins_url( 'build/shortcode-ui.js', ARVE\PLUGIN_FILE ),
369
  'deps' => [ 'shortcode-ui' ],
370
  ]
php/Admin/functions-settings-page.php CHANGED
@@ -2,85 +2,29 @@
2
  namespace Nextgenthemes\ARVE\Admin;
3
 
4
  use \Nextgenthemes\ARVE;
5
-
6
- function settings_header( $instance ) {
7
-
8
- ?>
9
- <button @click='showAllSectionsButDebug()' class="button-secondary">All Options</button>
10
- <?php
11
- foreach ( $instance->sections as $slug => $name ) {
12
-
13
- $btn_type = in_array( $slug, [ 'pro', 'videojs', 'randomvideo' ], true ) ? 'primary' : 'secondary';
14
-
15
- printf(
16
- ' <button @click=\'showSection("%s")\' class="button-%s">%s</button>',
17
- esc_attr( $slug ),
18
- esc_attr( $btn_type ),
19
- esc_html( $name )
20
- );
21
- }
22
- ?>
23
-
24
- <div class="ngt-block" v-show="sectionsDisplayed.pro || sectionsDisplayed.videojs || sectionsDisplayed.randomvideo" >
25
- <p><?php esc_html_e( 'You may already set options for addons but they will only take effect if the associated addons are installed.', 'advanced-responsive-video-embedder' ); ?></p>
26
- </div>
27
-
28
- <div class="ngt-block" v-show="sectionsDisplayed.debug">
29
- <br>
30
- <?php require_once __DIR__ . '/partials/debug-info.php'; ?>
31
- </div>
32
- <?php
33
- }
34
 
35
  function settings_sidebar() {
36
- // phpcs:ignore WordPress.WP.AlternativeFunctions.file_system_read_readfile
37
  if ( ! is_plugin_active( 'arve-pro/arve-pro.php' ) ) {
38
- readfile( __DIR__ . '/partials/settings-sidebar-pro.html' );
39
  }
40
 
41
  if ( ! is_plugin_active( 'arve-random-video/arve-random-video.php' ) ) {
42
- readfile( __DIR__ . '/partials/settings-sidebar-random-video.html' );
43
  }
44
 
45
- if ( ! is_plugin_active( 'arve-amp/arve-amp.php' ) ) {
46
- readfile( __DIR__ . '/partials/settings-sidebar-amp.html' );
47
- }
48
-
49
- readfile( __DIR__ . '/partials/settings-sidebar-rate.html' );
50
- }
51
 
52
- function echo_active_plugins() {
53
- $allplugins = get_plugins();
54
- $active_plugins = get_option( 'active_plugins', [] );
55
-
56
- echo "ACTIVE PLUGINS:\n";
57
- foreach ( $allplugins as $plugin_path => $plugin ) {
58
- // If the plugin isn't active, don't show it.
59
- if ( ! in_array( $plugin_path, $active_plugins, true ) ) {
60
- continue;
61
- }
62
- echo esc_html( "{$plugin['Name']}: {$plugin['Version']}\n" );
63
- }
64
  }
65
 
66
- function echo_network_active_plugins() {
67
-
68
- if ( ! is_multisite() ) {
69
- return;
70
- }
71
-
72
- echo "NETWORK ACTIVE PLUGINS: \n";
73
- $allplugins = wp_get_active_network_plugins();
74
- $active_plugins = get_site_option( 'active_sitewide_plugins', [] );
75
- foreach ( $allplugins as $plugin_path ) {
76
- $plugin_base = plugin_basename( $plugin_path );
77
- // If the plugin isn't active, don't show it.
78
- if ( ! array_key_exists( $plugin_base, $active_plugins ) ) {
79
- continue;
80
- }
81
- $plugin = get_plugin_data( $plugin_path );
82
- echo esc_html( "{$plugin['Name']}: {$plugin['Version']}\n" );
83
- }
84
  }
85
 
86
  function filter_save_options( $options ) {
2
  namespace Nextgenthemes\ARVE\Admin;
3
 
4
  use \Nextgenthemes\ARVE;
5
+ use \Nextgenthemes\ARVE\Common;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6
 
7
  function settings_sidebar() {
8
+
9
  if ( ! is_plugin_active( 'arve-pro/arve-pro.php' ) ) {
10
+ print_settings_box_html( '/partials/settings-sidebar-pro.html' );
11
  }
12
 
13
  if ( ! is_plugin_active( 'arve-random-video/arve-random-video.php' ) ) {
14
+ print_settings_box_html( '/partials/settings-sidebar-random-video.html' );
15
  }
16
 
17
+ // if ( ! is_plugin_active( 'arve-amp/arve-amp.php' ) ) {
18
+ // print_settings_box_html( '/partials/settings-sidebar-amp.html' );
19
+ // }
 
 
 
20
 
21
+ print_settings_box_html( '/partials/settings-sidebar-rate.html' );
 
 
 
 
 
 
 
 
 
 
 
22
  }
23
 
24
+ function print_settings_box_html( $file ) {
25
+ echo '<div class="ngt-sidebar-box">';
26
+ readfile( __DIR__ . $file ); // phpcs:ignore WordPress.WP.AlternativeFunctions.file_system_read_readfile
27
+ echo '</div>';
 
 
 
 
 
 
 
 
 
 
 
 
 
 
28
  }
29
 
30
  function filter_save_options( $options ) {
php/Admin/partials/debug-info.php DELETED
@@ -1,18 +0,0 @@
1
- <?php
2
- namespace Nextgenthemes\ARVE\Admin;
3
- ?>
4
- <textarea style="font-family: monospace; width: 100%" rows="25">
5
- ARVE Version: <?= esc_html( plugin_ver_status( 'advanced-responsive-video-embedder/advanced-responsive-video-embedder.php' ) . "\n" ); ?>
6
- ARVE Pro Version: <?= esc_html( plugin_ver_status( 'arve-pro/arve-pro.php' ) . "\n" ); ?>
7
- ARVE AMP Version: <?= esc_html( plugin_ver_status( 'arve-amp/arve-amp.php' ) . "\n" ); ?>
8
- ARVE Random Video: <?= esc_html( plugin_ver_status( 'arve-random-video/arve-random-video.php' ) . "\n" ); ?>
9
- WordPress Version: <?= esc_html( $GLOBALS['wp_version'] . "\n" ); ?>
10
- PHP Version: <?= esc_html( phpversion() . "\n" ); ?>
11
-
12
- <?php echo_active_plugins(); ?>
13
-
14
- <?php echo_network_active_plugins(); ?>
15
-
16
- ARVE OPTIONS:
17
- <?php var_dump( get_option( 'nextgenthemes_arve' ) ); // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_var_dump ?>
18
- </textarea>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
php/Admin/partials/pro-ad.html CHANGED
@@ -1,10 +1,13 @@
1
  <ul>
2
  <li><strong>Disable links in embeds</strong>
3
  For example: Clicking on a title in a YouTube embed will not open a new popup/tab/window. <strong>Prevent video hosts to lead your visitors away from your site!</strong></li>
4
- <li><strong>Lazyload mode</strong><br>Make your site load <strong>faster</strong> by loading only a image instead of the entire video player on pageload.</li>
5
- <li><strong>Lazyload -&gt; Lightbox</strong><br>Shows the Video in a Lightbox after clicking a preview image</li>
6
- <li><strong>Link -&gt; Lightbox</strong><br>Use simple links as triggers for lightboxed videos</li>
 
 
 
7
  <li>Automatic or custom titles and thumbnails images</li>
8
  <li>'Expand on click' feature</li>
9
- <li>And more, for a <strong><a href="https://nextgenthemes.com/plugins/arve-pro/">complete feature list</a></strong> and purchase please visit the <strong><a href="https://nextgenthemes.com/plugins/arve-pro/">official site</a></strong></li>
10
  </ul>
1
  <ul>
2
  <li><strong>Disable links in embeds</strong>
3
  For example: Clicking on a title in a YouTube embed will not open a new popup/tab/window. <strong>Prevent video hosts to lead your visitors away from your site!</strong></li>
4
+ <li><strong>Lazyload mode</strong><br />
5
+ Make your site load <strong>faster</strong> by loading only a image instead of the entire video player on pageload.</li>
6
+ <li><strong>Lazyload -&gt; Lightbox</strong><br />
7
+ Shows the Video in a Lightbox after clicking a preview image</li>
8
+ <li><strong>Link -&gt; Lightbox</strong><br />
9
+ Use simple links as triggers for lightboxed videos</li>
10
  <li>Automatic or custom titles and thumbnails images</li>
11
  <li>'Expand on click' feature</li>
12
+ <li>And more, for a <strong><a href="https://nextgenthemes.com/plugins/arve-pro/" rel="nofollow">complete feature list</a></strong> and purchase please visit the <strong><a href="https://nextgenthemes.com/plugins/arve-pro/" rel="nofollow">official site</a></strong></li>
13
  </ul>
php/Admin/partials/pro-ad.md DELETED
@@ -1,11 +0,0 @@
1
- * **Disable links in embeds**
2
- For example: Clicking on a title in a YouTube embed will not open a new popup/tab/window. **Prevent video hosts to lead your visitors away from your site!**
3
- * **Lazyload mode**
4
- Make your site load **faster** by loading only a image instead of the entire video player on pageload.
5
- * **Lazyload -> Lightbox**
6
- Shows the Video in a Lightbox after clicking a preview image
7
- * **Link -> Lightbox**
8
- Use simple links as triggers for lightboxed videos
9
- * Automatic or custom titles and thumbnails images
10
- * 'Expand on click' feature
11
- * And more, for a **[complete feature list](https://nextgenthemes.com/plugins/arve-pro/)** and purchase please visit the **[official site](https://nextgenthemes.com/plugins/arve-pro/)**
 
 
 
 
 
 
 
 
 
 
 
php/Admin/partials/settings-sidebar-amp.html CHANGED
@@ -1,4 +1,2 @@
1
- <div class="ngt-sidebar-box">
2
- <h3><a href="https://nextgenthemes.com/plugins/arve-amp/">AMP Addon</a></h3>
3
- <p>If you use AMP you need this.</p>
4
- </div>
1
+ <h3><a href="https://nextgenthemes.com/plugins/arve-amp/">AMP Addon</a></h3>
2
+ <p>If you use AMP you need this.</p>
 
 
php/Admin/partials/settings-sidebar-pro.html CHANGED
@@ -1,28 +1,27 @@
1
- <div class="ngt-sidebar-box">
2
- <h3 id="pro-addon"><a href="https://nextgenthemes.com/plugins/arve-pro/">Pro Addon</a></h3>
3
- <p><strong><big>10% off</big></strong> first year with discount code <code
4
- style="font-family: Menlo, Consolas, &quot;DejaVu Sans Mono&quot, monospace">settingspage</code>.</p>
5
- <p>This plugin is financed by purchases of the <a href="https://nextgenthemes.com/plugins/arve-pro/">Pro Addon</a>.
6
- The development and support of this plugins has become a job for me so I hope you understand that I can not make
7
- all features gratis and that you <a href="https://nextgenthemes.com/plugins/arve-pro/">purchase it</a> to get
8
- extra features and support the development.</p>
9
- <ul>
10
- <li><strong>Disable links in embeds (killer feature!)</strong><br>For example: Clicking on a title in a YouTube
11
- embed will not open a new tab. <strong>Prevent video hosts to lead your visitors away from your
12
- site!</strong></li>
13
- <li><strong>Lazyload mode</strong><br>Make your site load <strong>faster</strong> by loading only a image
14
- instead of the entire video player on pageload.</li>
15
- <li><strong>Lazyload -&gt; Lightbox</strong><br>Shows the Video in a Lightbox after clicking a preview image
16
- </li>
17
- <li><strong>Link -&gt; Lightbox</strong><br>Use simple links as triggers for lightboxed videos</li>
18
- <li>Automatic or custom thumbnail images</li>
19
- <li>Automatic or custom titles on top of your thumbnails</li>
20
- <li>'Expand on click' feature</li>
21
- <li>2 hover &amp; 2 icon styles</li>
22
- <li>Responsive thumbnails (srcset)</li>
23
- <li><strong>Feel good about yourself</strong><br>for supporting my 8+ years work on this plugin. Tons of hours,
24
- weekends always worked on improving it.</li>
25
- <li>Show the latest video of a YouTube channel by using the channel URL (updated/cached hourly)</li>
26
- <li><strong><a href="https://nextgenthemes.com/plugins/arve-pro/">Get the ARVE Pro Addon</a></strong></li>
27
- </ul>
28
- </div>
1
+ <h3><a href="https://nextgenthemes.com/plugins/arve-pro/">Pro Addon</a></h3>
2
+
3
+ <p><strong><big>10% off</big></strong> first year with discount code <code>settingspage</code>.</p>
4
+
5
+ <p>This plugin is financed by purchases of the <a href="https://nextgenthemes.com/plugins/arve-pro/">Pro Addon</a>. The development and support of this plugins has become a job for me, so I hope you understand that I can not make all features gratis and that you <a href="https://nextgenthemes.com/plugins/arve-pro/">purchase it</a> to get extra features and support the development.</p>
6
+
7
+ <ul>
8
+ <li><strong>Disable links in embeds (killer feature!)</strong><br>
9
+ For example: Clicking on a title in a YouTube embed will not open a new tab. <strong>Prevent video hosts to lead your visitors away from your site!</strong></li>
10
+ <li><strong>Lazyload</strong><br>
11
+ Make your site load <strong>faster</strong> by loading only an image instead of the entire video player on pageload.</li>
12
+ <li><strong>Lightbox</strong><br>
13
+ Shows the Video in a Lightbox after clicking a Lazyload preview image</li>
14
+ <li><strong>Link Lightbox</strong><br>
15
+ Use simple links as triggers for opening Video Lightboxes</li>
16
+ <li>Auto pause videos when another video is played</li>
17
+ <li>Automatic or custom thumbnail images</li>
18
+ <li>Automatic or custom titles on top of your thumbnails</li>
19
+ <li>&lsquo;Expand on click&rsquo; feature</li>
20
+ <li>2 hover &amp; 3 play icon styles</li>
21
+ <li>Responsive thumbnails (srcset)</li>
22
+ <li><strong>Feel good about yourself</strong><br>
23
+ for supporting my 8+ years work on this plugin. Tons of hours, weekends … always worked on improving it</li>
24
+ <li>Show the latest video of a YouTube channel by using the channel URL (updated/cached hourly)</li>
25
+ <li><strong><a href="https://nextgenthemes.com/plugins/arve-pro/">Get the ARVE Pro</a></strong></li>
26
+ </ul>
27
+
 
php/Admin/partials/settings-sidebar-pro.md DELETED
@@ -1,33 +0,0 @@
1
- <div class="ngt-sidebar-box">
2
-
3
- ### Please rate
4
-
5
- It would really help to get a [5 star rating from you.](https://wordpress.org/support/plugin/advanced-responsive-video-embedder/reviews/#new-post)
6
-
7
- ### [Pro Addon][1]
8
-
9
- **<big>10% off</big>** first year with discount code `settingspage`.
10
-
11
- This plugin is financed by purchases of the [Pro Addon][1]. The development and support of this plugins has become a job for me so I hope you understand that I can not make all features gratis and that you [purchase it][1] to get extra features and support the development.
12
-
13
- * **Disable links in embeds (killer feature!)**
14
- For example: Clicking on a title in a YouTube embed will not open a new tab. **Prevent video hosts to lead your visitors away from your site!**
15
- * **Lazyload**
16
- Make your site load **faster** by loading only a image instead of the entire video player on pageload.
17
- * **Lightbox**
18
- Shows the Video in a Lightbox after clicking a preview image
19
- * **Link -> Lightbox**
20
- Use simple links as triggers for lightboxed videos
21
- * Automatic or custom thumbnail images
22
- * Automatic or custom titles on top of your thumbnails
23
- * 'Expand on click' feature
24
- * 2 hover & 2 icon styles
25
- * Responsive thumbnails (srcset)
26
- * **Feel good about yourself**
27
- for supporting my 5+ years work on this plugin. Tons of hours, weekends … always worked on improving it.
28
- * Show the latest video of a YouTube channel by using the channel URL (updated/cached hourly)
29
- * **[Get the ARVE Pro Addon][1]**
30
-
31
- </div>
32
-
33
- [1]: https://nextgenthemes.com/plugins/arve-pro/
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
php/Admin/partials/settings-sidebar-random-video.html CHANGED
@@ -1,9 +1,10 @@
1
- <div class="ngt-sidebar-box">
2
- <h3 id="pro-addon"><a href="https://nextgenthemes.com/plugins/arve-random-video/">Random Video Addon</a></h3>
3
- <p>Display random video from:</p>
4
- <ul>
5
- <li>YouTube Playlist</li>
6
- <li>Vimeo Showcase</li>
7
- <li>Comma separated list of video URLs</li>
8
- </ul>
9
- </div>
 
1
+ <h3><a href="https://nextgenthemes.com/plugins/arve-random-video/">Random Video Addon</a></h3>
2
+
3
+ <p>Display random video from:</p>
4
+
5
+ <ul>
6
+ <li>YouTube Playlist</li>
7
+ <li>Vimeo Showcase</li>
8
+ <li>Comma separated list of video URLs</li>
9
+ </ul>
10
+
php/Admin/partials/settings-sidebar-rate.html CHANGED
@@ -1,6 +1,4 @@
1
- <div class="ngt-sidebar-box">
2
- <h3 id="please-rate">Please rate</h3>
3
- <p>It would really help to get a <a
4
- href="https://wordpress.org/support/plugin/advanced-responsive-video-embedder/reviews/#new-post">5 star
5
- rating from you.</a></p>
6
- </div>
1
+ <h3 id="please-rate">Please rate</h3>
2
+ <p>It would really help to get a <a
3
+ href="https://wordpress.org/support/plugin/advanced-responsive-video-embedder/reviews/#new-post">5 star
4
+ rating from you.</a></p>
 
 
php/Common/Admin/functions-debug.php ADDED
@@ -0,0 +1,56 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Nextgenthemes\ARVE\Common\Admin;
3
+
4
+ use \Nextgenthemes\ARVE\Common;
5
+
6
+ function plugin_ver_status( $folder_and_filename ) {
7
+
8
+ $file = WP_PLUGIN_DIR . '/' . $folder_and_filename;
9
+
10
+ if ( ! is_file( $file ) ) {
11
+ return 'NOT INSTALLED';
12
+ }
13
+
14
+ $data = get_plugin_data( $file );
15
+ $out = $data['Version'];
16
+
17
+ if ( ! is_plugin_active( $folder_and_filename ) ) {
18
+ $out .= ' INACTIVE';
19
+ }
20
+
21
+ return $out; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
22
+ }
23
+
24
+ function print_active_plugins() {
25
+ $allplugins = get_plugins();
26
+ $active_plugins = get_option( 'active_plugins', [] );
27
+
28
+ echo "ACTIVE PLUGINS:\n";
29
+ foreach ( $allplugins as $plugin_path => $plugin ) {
30
+ // If the plugin isn't active, don't show it.
31
+ if ( ! in_array( $plugin_path, $active_plugins, true ) ) {
32
+ continue;
33
+ }
34
+ echo esc_html( "{$plugin['Name']}: {$plugin['Version']}\n" );
35
+ }
36
+ }
37
+
38
+ function print_network_active_plugins() {
39
+
40
+ if ( ! is_multisite() ) {
41
+ return;
42
+ }
43
+
44
+ echo "NETWORK ACTIVE PLUGINS: \n";
45
+ $allplugins = wp_get_active_network_plugins();
46
+ $active_plugins = get_site_option( 'active_sitewide_plugins', [] );
47
+ foreach ( $allplugins as $plugin_path ) {
48
+ $plugin_base = plugin_basename( $plugin_path );
49
+ // If the plugin isn't active, don't show it.
50
+ if ( ! array_key_exists( $plugin_base, $active_plugins ) ) {
51
+ continue;
52
+ }
53
+ $plugin = get_plugin_data( $plugin_path );
54
+ echo esc_html( "{$plugin['Name']}: {$plugin['Version']}\n" );
55
+ }
56
+ }
php/Common/Admin/functions-settings.php CHANGED
@@ -9,19 +9,17 @@ function label_text( $option ) {
9
  <?php
10
  echo esc_html( $option['label'] );
11
 
12
- if (
13
- Common\contains( __NAMESPACE__, 'ARVE' ) &&
14
- ! in_array( $option['tag'], [ 'main', 'html5', 'urlparams' ], true )
15
- ) {
16
 
17
  printf(
18
- ' <a href="https://nextgenthemes.com/plugins/arve-%s">(%s)</a>',
19
- esc_attr( str_replace( 'randomvideo', 'random-video', $option['tag'] ) ),
20
- esc_html( ucfirst( $option['tag'] ) . ' Addon' )
21
  );
22
  }
23
 
24
- if ( ! empty( $option['tag'] ) && 'not' === $option['tag'] ) : ?>
 
25
  &nbsp;
26
  <span class="button-primary button-primary--ngt-small">
27
  <?= esc_html( $option['tag'] ); ?>
@@ -101,9 +99,9 @@ function print_licensekey_field( $key, $option ) {
101
  <?php label_text( $option ); ?>
102
  <input v-model="<?= esc_attr( "vm.$key" ); ?>" type="text" class="medium-text" style="width: 350px;" <?= esc_attr( $readonly ); ?> />
103
  <?php if ( Common\has_valid_key( $key ) ) : ?>
104
- <button @click="action( 'deactivate', '<?= esc_attr( $key ); ?>' )">Deactivate</button>
105
  <?php else : ?>
106
- <button @click="action( 'activate', '<?= esc_attr( $key ); ?>' )">Activate</button>
107
  <?php endif; ?>
108
  <br>
109
  Status: <?= esc_html( "{{ vm.{$key}_status }}" ); ?>
@@ -164,7 +162,7 @@ function block_attr( $key, $option ) {
164
  } else {
165
  $block_attr = [
166
  'class' => "ngt-option-block ngt-option-block--$key ngt-option-block--{$option['tag']}",
167
- 'v-show' => 'sectionsDisplayed.' . $option['tag'],
168
  ];
169
  }
170
 
9
  <?php
10
  echo esc_html( $option['label'] );
11
 
12
+ if ( $option['premium'] ) {
 
 
 
13
 
14
  printf(
15
+ ' <span>(</span><a href="https://nextgenthemes.com/plugins/arve-%s">%s</a><span>)</span>',
16
+ esc_attr( $option['tag'] ),
17
+ esc_html( $option['tag_name'] )
18
  );
19
  }
20
 
21
+ if ( ! empty( $option['tag'] ) && 'not' === $option['tag'] ) : // TODO this seems to be unused
22
+ ?>
23
  &nbsp;
24
  <span class="button-primary button-primary--ngt-small">
25
  <?= esc_html( $option['tag'] ); ?>
99
  <?php label_text( $option ); ?>
100
  <input v-model="<?= esc_attr( "vm.$key" ); ?>" type="text" class="medium-text" style="width: 350px;" <?= esc_attr( $readonly ); ?> />
101
  <?php if ( Common\has_valid_key( $key ) ) : ?>
102
+ <button @click="action( 'deactivate', '<?= esc_attr( $key ); ?>' )" class="button button-secondary">Deactivate</button>
103
  <?php else : ?>
104
+ <button @click="action( 'activate', '<?= esc_attr( $key ); ?>' )" class="button button-secondary">Activate</button>
105
  <?php endif; ?>
106
  <br>
107
  Status: <?= esc_html( "{{ vm.{$key}_status }}" ); ?>
162
  } else {
163
  $block_attr = [
164
  'class' => "ngt-option-block ngt-option-block--$key ngt-option-block--{$option['tag']}",
165
+ 'v-show' => "sectionsDisplayed['{$option['tag']}']",
166
  ];
167
  }
168
 
php/Common/Admin/partials/debug-info.php ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Nextgenthemes\ARVE\Common\Admin;
3
+
4
+ ?>
5
+ <textarea style="font-family: monospace; width: 100%" rows="25">
6
+ ARVE: <?= esc_html( plugin_ver_status( 'advanced-responsive-video-embedder/advanced-responsive-video-embedder.php' ) . "\n" ); ?>
7
+ ARVE Pro: <?= esc_html( plugin_ver_status( 'arve-pro/arve-pro.php' ) . "\n" ); ?>
8
+ ARVE AMP: <?= esc_html( plugin_ver_status( 'arve-amp/arve-amp.php' ) . "\n" ); ?>
9
+ ARVE Sticky Videos: <?= esc_html( plugin_ver_status( 'arve-sticky-videos/arve-sticky-videos.php' ) . "\n" ); ?>
10
+ ARVE Random Video: <?= esc_html( plugin_ver_status( 'arve-random-video/arve-random-video.php' ) . "\n" ); ?>
11
+ WordPress Version: <?= esc_html( $GLOBALS['wp_version'] . "\n" ); ?>
12
+ PHP Version: <?= esc_html( phpversion() . "\n" ); ?>
13
+ REST URL: <?= esc_html( get_rest_url( null, $this->rest_namespace ) . "\n" ); ?>
14
+
15
+ <?php print_active_plugins(); ?>
16
+
17
+ <?php print_network_active_plugins(); ?>
18
+
19
+ ARVE OPTIONS:
20
+ <?php var_dump( get_option( 'nextgenthemes_arve' ) ); // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_var_dump ?>
21
+ </textarea>
php/Common/Settings.php CHANGED
@@ -2,14 +2,15 @@
2
  namespace Nextgenthemes\ARVE\Common;
3
 
4
  class Settings {
5
-
 
6
  public $sections = [];
 
7
  private $menu_title = '';
8
  private $option_key = '';
9
  private $slugged_namspace = '';
10
  private $slashed_namspace = '';
11
  private $rest_namespace = '';
12
- private $rest_url = '';
13
  private $settings = [];
14
  private $settings_page_title = '';
15
  private $options_defaults = [];
@@ -18,24 +19,27 @@ class Settings {
18
  public function __construct( $args ) {
19
 
20
  $defaults = [
21
- 'menu_parent_slug' => 'options-general.php',
22
- 'sections' => [],
 
 
 
23
  ];
24
 
25
  $args = wp_parse_args( $args, $defaults );
26
 
27
  $this->settings = $args['settings'];
28
  $this->sections = $args['sections'];
 
29
  $this->menu_title = $args['menu_title'];
30
  $this->settings_page_title = $args['settings_page_title'];
31
  $this->slugged_namespace = sanitize_key( str_replace( '\\', '_', $args['namespace'] ) );
32
  $this->slashed_namespace = str_replace( '_', '/', $this->slugged_namespace );
33
  $this->rest_namespace = $this->slugged_namespace . '/v1';
34
- $this->rest_url = get_home_url() . '/wp-json/' . $this->rest_namespace;
35
  $this->menu_parent_slug = $args['menu_parent_slug'];
36
 
37
  foreach ( $this->settings as $key => $value ) {
38
-
39
  $this->options_tags[] = $value['tag'];
40
 
41
  $this->options_defaults[ $key ] = $value['default'];
@@ -104,7 +108,7 @@ class Settings {
104
  [
105
  'methods' => 'POST',
106
  'args' => $this->settings,
107
- 'permission_callback' => function() {
108
  return current_user_can( 'manage_options' );
109
  },
110
  'callback' => function( \WP_REST_Request $request ) {
@@ -118,38 +122,36 @@ class Settings {
118
  public function assets( $page ) {
119
 
120
  // Check if we are currently viewing our setting page
121
- if ( ! ends_with( $page, $this->slugged_namespace ) ) {
122
  return;
123
  }
124
 
125
- enqueue_asset(
126
- [
127
- 'handle' => 'nextgenthemes-settings',
128
- 'src' => plugin_or_theme_src( 'build/common/settings.css' ),
129
- 'path' => dirname( dirname( __DIR__ ) ) . '/build/common/settings.css',
130
- ]
131
- );
132
-
133
  enqueue_asset(
134
  [
135
  'handle' => 'nextgenthemes-settings',
136
- 'src' => plugin_or_theme_src( 'build/common/settings.js' ),
137
- 'path' => dirname( dirname( __DIR__ ) ) . '/build/common/settings.js',
138
- 'deps' => [ 'jquery' ],
139
- 'async' => false,
140
  ]
141
  );
142
 
143
- // Sending data to our plugin settings JS file
144
- wp_localize_script(
145
- 'nextgenthemes-settings',
146
- $this->slugged_namespace,
 
 
 
 
 
 
147
  [
148
- 'nonce' => wp_create_nonce( 'wp_rest' ),
149
- 'rest_url' => $this->rest_url,
150
- 'home_url' => get_home_url(),
151
- 'options' => $this->options,
152
- 'settings' => $this->settings,
 
 
153
  ]
154
  );
155
  }
@@ -159,7 +161,9 @@ class Settings {
159
  // phpcs:disable WordPress.Security.EscapeOutput.OutputNotEscaped
160
  foreach ( $this->settings as $key => $option ) {
161
 
162
- $field_type = isset( $option['ui'] ) ? $option['ui'] : $option['type'];
 
 
163
 
164
  if ( 'hidden' !== $field_type ) :
165
  ?>
@@ -182,6 +186,27 @@ class Settings {
182
  // phpcs:enable WordPress.Security.EscapeOutput.OutputNotEscaped
183
  }
184
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
185
  public function print_save_section() {
186
  ?>
187
  <p>
@@ -189,57 +214,147 @@ class Settings {
189
  @click='saveOptions'
190
  :disabled='isSaving'
191
  class='button button-primary'
192
- >Save</button>
 
 
193
  <strong v-if='message'>{{ message }}</strong>
194
  <img
195
  v-if='isSaving == true'
196
  class="wrap--nextgenthemes__loading-indicator"
197
  src='<?php echo esc_url( get_admin_url() . '/images/wpspin_light-2x.gif' ); ?>'
198
- alt='Loading indicator' />
 
199
  </p>
200
  <?php
201
  }
202
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
203
  public function print_admin_page() {
204
  ?>
205
- <div class='wrap wrap--nextgenthemes'>
206
  <h2><?php echo esc_html( get_admin_page_title() ); ?></h2>
 
207
  <div class="ngt-settings-grid">
208
- <div class="ngt-settings-grid__content" id='nextgenthemes-vue'>
209
  <?php
210
-
211
- do_action( $this->slashed_namespace . '/admin/settings_header', $this );
212
  $this->print_save_section();
 
213
  $this->print_settings_blocks();
214
  $this->print_save_section();
 
215
  ?>
216
- <p>
217
- <?php
218
- foreach ( $this->sections as $key => $label ) {
219
-
220
- if ( in_array( $key, [ 'debug', 'randomvideo' ] ) )
221
- continue;
222
- ?>
223
- <button
224
- @click='resetOptions("<?= $key; ?>")'
225
- :disabled='isSaving'
226
- class='button button-secondary'
227
- ><?php
228
- esc_html_e( 'Reset', 'advanced-responsive-video-embedder' );
229
- esc_html_e( " $label" ) ;
230
- ?></button>
231
- <?php
232
- }
233
- ?>
234
- <button
235
- @click='resetOptions("all")'
236
- :disabled='isSaving'
237
- class='button button-secondary'
238
- ><?php esc_html_e( 'Reset ALL Options', 'advanced-responsive-video-embedder' ); ?></button>
239
- </p>
240
  </div>
241
  <div class="ngt-settings-grid__sidebar">
242
  <?php do_action( $this->slashed_namespace . '/admin/settings_sidebar', $this ); ?>
 
243
  </div>
244
  </div>
245
  </div>
2
  namespace Nextgenthemes\ARVE\Common;
3
 
4
  class Settings {
5
+ private static $no_reset_sections = [ 'debug', 'random-video', 'keys' ];
6
+
7
  public $sections = [];
8
+ private $premium_sections = [];
9
  private $menu_title = '';
10
  private $option_key = '';
11
  private $slugged_namspace = '';
12
  private $slashed_namspace = '';
13
  private $rest_namespace = '';
 
14
  private $settings = [];
15
  private $settings_page_title = '';
16
  private $options_defaults = [];
19
  public function __construct( $args ) {
20
 
21
  $defaults = [
22
+ 'menu_parent_slug' => 'options-general.php',
23
+ 'sections' => [ 'main' => 'Main' ],
24
+ 'premium_sections' => [],
25
+ 'settings_page_title' => 'Default Page Title',
26
+ 'default_menu_title' => 'Default Menu Title',
27
  ];
28
 
29
  $args = wp_parse_args( $args, $defaults );
30
 
31
  $this->settings = $args['settings'];
32
  $this->sections = $args['sections'];
33
+ $this->premium_sections = $args['premium_sections'];
34
  $this->menu_title = $args['menu_title'];
35
  $this->settings_page_title = $args['settings_page_title'];
36
  $this->slugged_namespace = sanitize_key( str_replace( '\\', '_', $args['namespace'] ) );
37
  $this->slashed_namespace = str_replace( '_', '/', $this->slugged_namespace );
38
  $this->rest_namespace = $this->slugged_namespace . '/v1';
 
39
  $this->menu_parent_slug = $args['menu_parent_slug'];
40
 
41
  foreach ( $this->settings as $key => $value ) {
42
+
43
  $this->options_tags[] = $value['tag'];
44
 
45
  $this->options_defaults[ $key ] = $value['default'];
108
  [
109
  'methods' => 'POST',
110
  'args' => $this->settings,
111
+ 'permission_callback' => function() {
112
  return current_user_can( 'manage_options' );
113
  },
114
  'callback' => function( \WP_REST_Request $request ) {
122
  public function assets( $page ) {
123
 
124
  // Check if we are currently viewing our setting page
125
+ if ( ! str_ends_with( $page, $this->slugged_namespace ) ) {
126
  return;
127
  }
128
 
 
 
 
 
 
 
 
 
129
  enqueue_asset(
130
  [
131
  'handle' => 'nextgenthemes-settings',
132
+ 'src' => plugin_or_theme_src( 'build/common/settings.css' ),
133
+ 'path' => dirname( dirname( __DIR__ ) ) . '/build/common/settings.css',
 
 
134
  ]
135
  );
136
 
137
+ $settings_data = [
138
+ 'options' => $this->options,
139
+ 'home_url' => get_home_url(),
140
+ 'rest_url' => esc_url( get_rest_url( null, $this->rest_namespace ) ),
141
+ 'nonce' => wp_create_nonce( 'wp_rest' ),
142
+ 'settings' => $this->settings,
143
+ 'sections' => $this->sections,
144
+ ];
145
+
146
+ enqueue_asset(
147
  [
148
+ 'handle' => 'nextgenthemes-settings',
149
+ 'src' => plugin_or_theme_src( 'build/common/settings.js' ),
150
+ 'path' => dirname( dirname( __DIR__ ) ) . '/build/common/settings.js',
151
+ 'deps' => [ 'jquery' ],
152
+ 'async' => false,
153
+ 'inline_script' => "var {$this->slugged_namespace} = " . \wp_json_encode( $settings_data ) . ';',
154
+ 'inline_script_pos' => 'before',
155
  ]
156
  );
157
  }
161
  // phpcs:disable WordPress.Security.EscapeOutput.OutputNotEscaped
162
  foreach ( $this->settings as $key => $option ) {
163
 
164
+ $option['premium'] = in_array( $option['tag'], $this->premium_sections, true );
165
+ $option['tag_name'] = $this->sections[ $option['tag'] ];
166
+ $field_type = isset( $option['ui'] ) ? $option['ui'] : $option['type'];
167
 
168
  if ( 'hidden' !== $field_type ) :
169
  ?>
186
  // phpcs:enable WordPress.Security.EscapeOutput.OutputNotEscaped
187
  }
188
 
189
+ private function print_settings_tabs() {
190
+ ?>
191
+ <h2 class="nav-tab-wrapper">
192
+ <a @click='showAllSectionsButDebug()' class="nav-tab">All Options</button>
193
+ <?php
194
+ foreach ( $this->sections as $slug => $name ) :
195
+
196
+ $classes = in_array( $slug, $this->premium_sections, true ) ? 'nav-tab nav-tab--ngt-highlight' : 'nav-tab';
197
+ ?>
198
+ <a
199
+ @click="showSection('<?= esc_attr($slug) ?>')"
200
+ class="<?= esc_attr($classes) ?>"
201
+ v-bind:class='{ "nav-tab-active": sectionsDisplayed["<?= esc_attr($slug) ?>"] }'
202
+ >
203
+ <?= esc_html($name) ?>
204
+ </a>
205
+ <?php endforeach; ?>
206
+ </h2>
207
+ <?php
208
+ }
209
+
210
  public function print_save_section() {
211
  ?>
212
  <p>
214
  @click='saveOptions'
215
  :disabled='isSaving'
216
  class='button button-primary'
217
+ >
218
+ Save
219
+ </button>
220
  <strong v-if='message'>{{ message }}</strong>
221
  <img
222
  v-if='isSaving == true'
223
  class="wrap--nextgenthemes__loading-indicator"
224
  src='<?php echo esc_url( get_admin_url() . '/images/wpspin_light-2x.gif' ); ?>'
225
+ alt='Loading indicator'
226
+ />
227
  </p>
228
  <?php
229
  }
230
 
231
+ private function print_paid_section_message() {
232
+
233
+ if ( empty( $this->premium_sections ) ) {
234
+ return;
235
+ }
236
+
237
+ foreach ( $this->premium_sections as $slug ) {
238
+ $d_sections[] = sprintf( "sectionsDisplayed['%s']", esc_attr($slug) );
239
+ }
240
+
241
+ $v_show = implode( ' || ', $d_sections );
242
+ // phpcs:disable WordPress.Security.EscapeOutput.OutputNotEscaped
243
+ ?>
244
+ <div class="ngt-block" v-show="<?= $v_show ?>" >
245
+ <p><?php esc_html_e( 'You may already set options for addons but they will only take effect if the associated addons are installed.', 'advanced-responsive-video-embedder' ); ?></p>
246
+ </div>
247
+ <?php
248
+ // phpcs:enable WordPress.Security.EscapeOutput.OutputNotEscaped
249
+ }
250
+
251
+ private function print_debug_info_block() {
252
+ ?>
253
+ <div class="ngt-block" v-show="sectionsDisplayed.debug">
254
+ <?php require_once __DIR__ . '/Admin/partials/debug-info.php'; ?>
255
+ </div>
256
+ <?php
257
+ }
258
+
259
+ private function print_reset_bottons() {
260
+ ?>
261
+ <p>
262
+ <?php
263
+ foreach ( $this->sections as $key => $label ) {
264
+
265
+ if ( in_array( $key, self::$no_reset_sections, true ) ) {
266
+ continue;
267
+ }
268
+
269
+ ?>
270
+ <button
271
+ @click="resetOptions('<?= esc_attr($key); ?>')"
272
+ :disabled='isSaving'
273
+ class='button button--ngt-reset button-secondary'
274
+ v-show="sectionsDisplayed['<?= esc_attr( $key ); ?>']"
275
+ >
276
+ <?php
277
+ printf(
278
+ // translators: Options section
279
+ esc_html__( 'Reset %s section', 'advanced-responsive-video-embedder' ),
280
+ esc_html( $label )
281
+ );
282
+ ?>
283
+ </button>
284
+ <?php
285
+ }
286
+ ?>
287
+ </p>
288
+ <?php
289
+ }
290
+
291
+ public function print_errors() {
292
+ ?>
293
+ <div class="ngt-block" v-if="errors.length">
294
+ <strong>Please correct the following error(s):</strong>
295
+ <ul>
296
+ <li v-for="error in errors">{{ error }}</li>
297
+ </ul>
298
+ </div>
299
+ <?php
300
+ }
301
+
302
+ public function print_outdated_php_msg() {
303
+
304
+ if ( \version_compare(PHP_VERSION, '5.6.40', '<=') ) {
305
+
306
+ ?>
307
+ <div class="ngt-sidebar-box">
308
+ <p>
309
+ <?php
310
+ printf(
311
+ // translators: PHP version, URL, Contact URL
312
+ kses_basic( __( 'Your PHP version %1$s is very <a href="%2$s">outdated, insecure and slow</a>. No pressure, this plugin will continue to work with PHP 5.6, but at some undecided point I like to use features from PHP 7. If you can not update for some reason please tell <a href="%3$s">tell me</a>. WordPress itself planned to require PHP 7 in a feature release but decided not to persue this for now because so many people still run on outdated versions. WordPress already has beta support for 8.0 but I would not go with 8.0 just yet.', 'advanced-responsive-video-embedder' ) ), // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
313
+ esc_html( PHP_VERSION ),
314
+ esc_url( 'https://www.php.net/supported-versions' ),
315
+ esc_url( 'https://nextgenthemes.com/contact/' )
316
+ );
317
+ ?>
318
+ </p>
319
+ </div>
320
+ <?php
321
+ } elseif ( \version_compare(PHP_VERSION, '7.3.23', '<') ) {
322
+ ?>
323
+ <div class="ngt-sidebar-box">
324
+ <p>
325
+ <?php
326
+ printf(
327
+ // translators: URL
328
+ kses_basic( __( 'Just a heads up, your PHP version %1$s is outdated and potentially insecure. See what versions are <a href="%2$s">good here</a>. WordPress already has beta support for 8.0 but I would not go with 8.0 just yet.', 'advanced-responsive-video-embedder' ) ), // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
329
+ esc_html( PHP_VERSION ),
330
+ esc_url( 'https://www.php.net/supported-versions' )
331
+ );
332
+ ?>
333
+ </p>
334
+ </div>
335
+ <?php
336
+ }
337
+ }
338
+
339
  public function print_admin_page() {
340
  ?>
341
+ <div class='wrap wrap--nextgenthemes' id='nextgenthemes-vue'>
342
  <h2><?php echo esc_html( get_admin_page_title() ); ?></h2>
343
+ <?php $this->print_settings_tabs(); ?>
344
  <div class="ngt-settings-grid">
345
+ <div class="ngt-settings-grid__content" >
346
  <?php
347
+ $this->print_paid_section_message();
 
348
  $this->print_save_section();
349
+ $this->print_debug_info_block();
350
  $this->print_settings_blocks();
351
  $this->print_save_section();
352
+ $this->print_reset_bottons();
353
  ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
354
  </div>
355
  <div class="ngt-settings-grid__sidebar">
356
  <?php do_action( $this->slashed_namespace . '/admin/settings_sidebar', $this ); ?>
357
+ <?php $this->print_outdated_php_msg(); ?>
358
  </div>
359
  </div>
360
  </div>
php/Common/functions-assets.php CHANGED
@@ -26,7 +26,7 @@ function deps_and_ver( $path ) {
26
  $asset_php = $pathinfo['dirname'] . DIRECTORY_SEPARATOR . $pathinfo['filename'] . '.asset.php';
27
 
28
  if ( is_file( $asset_php ) ) {
29
- $dv = require( $asset_php );
30
 
31
  if ( 'css' === $pathinfo['extension'] ) {
32
  $dv['dependencies'] = [];
@@ -41,27 +41,30 @@ function deps_and_ver( $path ) {
41
  function replace_extension($filename, $new_extension) {
42
  $info = pathinfo($filename);
43
  $dir = $info['dirname'] ? $info['dirname'] . DIRECTORY_SEPARATOR : '';
44
-
45
  return $dir . $info['filename'] . '.' . $new_extension;
46
  }
47
 
48
  function asset( array $args ) {
49
 
50
  $defaults = [
51
- 'path' => '',
52
- 'async' => true,
53
- 'cdn_src' => '',
54
- 'defer' => false,
55
- 'deps' => [],
56
- 'enqueue' => false,
57
- 'enqueue_hooks' => [],
58
- 'handle' => '',
59
- 'in_footer' => true,
60
- 'integrity' => '',
61
- 'media' => 'all',
62
- 'src' => '',
63
- 'ver' => null,
64
- 'mce' => false,
 
 
 
65
  ];
66
 
67
  $args = wp_parse_args( $args, $defaults );
@@ -82,6 +85,10 @@ function asset( array $args ) {
82
 
83
  wp_register_script( $args['handle'], $args['src'], $args['deps'], $args['ver'], $args['in_footer'] );
84
 
 
 
 
 
85
  if ( $args['integrity'] || $args['async'] || $args['defer'] ) {
86
  add_attr_to_asset( 'script', $args );
87
  }
@@ -96,6 +103,10 @@ function asset( array $args ) {
96
  } else {
97
  wp_register_style( $args['handle'], $args['src'], $args['deps'], $args['ver'], $args['media'] );
98
 
 
 
 
 
99
  if ( $args['integrity'] ) {
100
  add_attr_to_asset( 'style', $args );
101
  }
26
  $asset_php = $pathinfo['dirname'] . DIRECTORY_SEPARATOR . $pathinfo['filename'] . '.asset.php';
27
 
28
  if ( is_file( $asset_php ) ) {
29
+ $dv = require $asset_php;
30
 
31
  if ( 'css' === $pathinfo['extension'] ) {
32
  $dv['dependencies'] = [];
41
  function replace_extension($filename, $new_extension) {
42
  $info = pathinfo($filename);
43
  $dir = $info['dirname'] ? $info['dirname'] . DIRECTORY_SEPARATOR : '';
44
+
45
  return $dir . $info['filename'] . '.' . $new_extension;
46
  }
47
 
48
  function asset( array $args ) {
49
 
50
  $defaults = [
51
+ 'path' => '',
52
+ 'async' => true,
53
+ 'cdn_src' => '',
54
+ 'defer' => false,
55
+ 'deps' => [],
56
+ 'enqueue' => false,
57
+ 'enqueue_hooks' => [],
58
+ 'handle' => '',
59
+ 'in_footer' => true,
60
+ 'integrity' => '',
61
+ 'media' => 'all',
62
+ 'src' => '',
63
+ 'ver' => null,
64
+ 'mce' => false,
65
+ 'inline_style' => '',
66
+ 'inline_script' => '',
67
+ 'inline_script_pos' => 'after',
68
  ];
69
 
70
  $args = wp_parse_args( $args, $defaults );
85
 
86
  wp_register_script( $args['handle'], $args['src'], $args['deps'], $args['ver'], $args['in_footer'] );
87
 
88
+ if ( $args['inline_script'] ) {
89
+ wp_add_inline_script( $args['handle'], $args['inline_script'], $args['inline_script_pos'] );
90
+ }
91
+
92
  if ( $args['integrity'] || $args['async'] || $args['defer'] ) {
93
  add_attr_to_asset( 'script', $args );
94
  }
103
  } else {
104
  wp_register_style( $args['handle'], $args['src'], $args['deps'], $args['ver'], $args['media'] );
105
 
106
+ if ( $args['inline_style'] ) {
107
+ wp_add_inline_style( $args['handle'], $args['inline_style'] );
108
+ }
109
+
110
  if ( $args['integrity'] ) {
111
  add_attr_to_asset( 'style', $args );
112
  }
php/Common/functions-compat.php ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ if ( ! function_exists( 'str_contains' ) ) {
4
+
5
+ function str_contains( $haystack, $needle ) {
6
+ return false !== strpos( $haystack, $needle );
7
+ }
8
+ }
9
+
10
+ if ( ! function_exists( 'str_starts_with' ) ) {
11
+
12
+ function str_starts_with( $haystack, $needle ) {
13
+ return $haystack[0] === $needle[0] ? strncmp( $haystack, $needle, strlen( $needle ) ) === 0 : false;
14
+ }
15
+ }
16
+
17
+ if ( ! function_exists( 'str_ends_with' ) ) {
18
+
19
+ function str_ends_with( $haystack, $needle ) {
20
+
21
+ if ( '' === $needle ) {
22
+ return true;
23
+ }
24
+
25
+ // search forward starting from end minus needle length characters
26
+ $diff = strlen( $haystack ) - strlen( $needle );
27
+
28
+ return $diff >= 0 && strpos( $haystack, $needle, $diff ) !== false;
29
+ }
30
+ }
php/Common/functions-deprecated.php ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Nextgenthemes\ARVE\Common;
3
+
4
+ function contains( $haystack, $needle ) {
5
+ return str_contains( $haystack, $needle );
6
+ }
7
+
8
+ function starts_with( $haystack, $needle ) {
9
+ return str_starts_with( $haystack, $needle );
10
+ }
11
+
12
+ function ends_with( $haystack, $needle ) {
13
+ return str_ends_with( $haystack, $needle );
14
+ }
php/Common/functions-license.php CHANGED
@@ -1,6 +1,27 @@
1
  <?php
2
  namespace Nextgenthemes\ARVE\Common;
3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4
  function has_valid_key( $product ) {
5
  $o = (array) get_option( 'nextgenthemes' );
6
 
1
  <?php
2
  namespace Nextgenthemes\ARVE\Common;
3
 
4
+ function check_product_keys() {
5
+
6
+ $products = get_products();
7
+
8
+ unset( $products['arve_amp'] );
9
+
10
+ foreach ( $products as $key => $value ) :
11
+
12
+ if ( $value['active'] && ! $value['valid_key'] ) {
13
+ $msg = sprintf(
14
+ // Translators: URL, Product name
15
+ kses_basic( __( '<a href="%1$s">%2$s</a> license not activated or valid', 'advanced-responsive-video-embedder' ) ),
16
+ esc_url( 'https://nextgenthemes.com/plugins/arve/documentation/installing-and-license-management/' ),
17
+ $value['name']
18
+ );
19
+
20
+ throw new \Exception($msg);
21
+ }
22
+ endforeach;
23
+ }
24
+
25
  function has_valid_key( $product ) {
26
  $o = (array) get_option( 'nextgenthemes' );
27
 
php/Common/functions-misc.php CHANGED
@@ -82,9 +82,9 @@ function array_insert_before($key, array &$array, $new_key, $new_value) {
82
  $new = array();
83
  foreach ($array as $k => $value) {
84
  if ($k === $key) {
85
- $new[$new_key] = $new_value;
86
  }
87
- $new[$k] = $value;
88
  }
89
  return $new;
90
  }
@@ -112,12 +112,12 @@ function array_insert_after($key, array &$array, $new_key, $new_value) {
112
  if (array_key_exists($key, $array)) {
113
  $new = array();
114
  foreach ($array as $k => $value) {
115
- $new[$k] = $value;
116
  if ($k === $key) {
117
- $new[$new_key] = $new_value;
118
  }
119
- }
120
- return $new;
121
  }
122
  return false;
123
  }
82
  $new = array();
83
  foreach ($array as $k => $value) {
84
  if ($k === $key) {
85
+ $new[ $new_key ] = $new_value;
86
  }
87
+ $new[ $k ] = $value;
88
  }
89
  return $new;
90
  }
112
  if (array_key_exists($key, $array)) {
113
  $new = array();
114
  foreach ($array as $k => $value) {
115
+ $new[ $k ] = $value;
116
  if ($k === $key) {
117
+ $new[ $new_key ] = $new_value;
118
  }
119
+ }
120
+ return $new;
121
  }
122
  return false;
123
  }
php/Common/functions-settings.php CHANGED
@@ -11,6 +11,10 @@ function nextgenthemes_settings_instance() {
11
  [
12
  'namespace' => 'nextgenthemes',
13
  'settings' => nextgenthemes_settings(),
 
 
 
 
14
  'menu_title' => esc_html__( 'NextGenThemes Settings', 'advanced-responsive-video-embedder' ),
15
  'settings_page_title' => esc_html__( 'NextGenThemes Settings', 'advanced-responsive-video-embedder' ),
16
  ]
@@ -66,7 +70,7 @@ function nextgenthemes_settings() {
66
  $settings[ $p ] = [
67
  'default' => '',
68
  'option' => true,
69
- 'tag' => 'main',
70
  // translators: %s is Product name
71
  'label' => sprintf( esc_html__( '%s license Key', 'advanced-responsive-video-embedder' ), $value['name'] ),
72
  'type' => 'string',
@@ -76,7 +80,7 @@ function nextgenthemes_settings() {
76
  $settings[ $p . '_status' ] = [
77
  'default' => '',
78
  'option' => true,
79
- 'tag' => 'main',
80
  // translators: %s is Product name
81
  'label' => sprintf( esc_html__( '%s license Key Status', 'advanced-responsive-video-embedder' ), $value['name'] ),
82
  'type' => 'string',
@@ -88,7 +92,7 @@ function nextgenthemes_settings() {
88
  $settings[ $key . '_beta' ] = [
89
  'default' => false,
90
  'option' => true,
91
- 'tag' => 'main',
92
  // translators: Product name
93
  'label' => sprintf( esc_html__( '%s beta updates', 'advanced-responsive-video-embedder' ), $value['name'] ),
94
  'type' => 'boolean',
@@ -96,17 +100,17 @@ function nextgenthemes_settings() {
96
  }
97
 
98
  $settings['cdn'] = [
 
99
  'default' => false,
100
  'option' => true,
101
- 'tag' => 'main',
102
  'label' => esc_html__( 'Use jsDelivr CDN for some assets', 'advanced-responsive-video-embedder' ),
103
  'type' => 'boolean',
104
  ];
105
 
106
  $settings['action'] = [
 
107
  'default' => '',
108
  'option' => true,
109
- 'tag' => 'main',
110
  'label' => esc_html__( 'Action', 'advanced-responsive-video-embedder' ),
111
  'type' => 'string',
112
  'ui' => 'hidden',
@@ -118,7 +122,7 @@ function nextgenthemes_settings() {
118
  function get_products() {
119
 
120
  $products = [
121
- 'arve_pro' => [
122
  'namespace' => 'ARVE\Pro',
123
  'name' => 'ARVE Pro',
124
  'id' => 1253,
@@ -126,7 +130,7 @@ function get_products() {
126
  'author' => 'Nicolas Jonas',
127
  'url' => 'https://nextgenthemes.com/plugins/arve-pro/',
128
  ],
129
- 'arve_amp' => [
130
  'namespace' => 'ARVE\AMP',
131
  'name' => 'ARVE AMP',
132
  'id' => 16941,
@@ -142,6 +146,14 @@ function get_products() {
142
  'author' => 'Nicolas Jonas',
143
  'url' => 'https://nextgenthemes.com/plugins/arve-random-video/',
144
  ],
 
 
 
 
 
 
 
 
145
  ];
146
 
147
  $products = apply_filters( 'nextgenthemes_products', $products );
11
  [
12
  'namespace' => 'nextgenthemes',
13
  'settings' => nextgenthemes_settings(),
14
+ 'sections' => [
15
+ 'keys' => esc_html__( 'License Keys', 'advanced-responsive-video-embedder' ),
16
+ 'beta-updates' => esc_html__( 'Beta Updates', 'advanced-responsive-video-embedder' ),
17
+ ],
18
  'menu_title' => esc_html__( 'NextGenThemes Settings', 'advanced-responsive-video-embedder' ),
19
  'settings_page_title' => esc_html__( 'NextGenThemes Settings', 'advanced-responsive-video-embedder' ),
20
  ]
70
  $settings[ $p ] = [
71
  'default' => '',
72
  'option' => true,
73
+ 'tag' => 'keys',
74
  // translators: %s is Product name
75
  'label' => sprintf( esc_html__( '%s license Key', 'advanced-responsive-video-embedder' ), $value['name'] ),
76
  'type' => 'string',
80
  $settings[ $p . '_status' ] = [
81
  'default' => '',
82
  'option' => true,
83
+ 'tag' => 'keys',
84
  // translators: %s is Product name
85
  'label' => sprintf( esc_html__( '%s license Key Status', 'advanced-responsive-video-embedder' ), $value['name'] ),
86
  'type' => 'string',
92
  $settings[ $key . '_beta' ] = [
93
  'default' => false,
94
  'option' => true,
95
+ 'tag' => 'beta-updates',
96
  // translators: Product name
97
  'label' => sprintf( esc_html__( '%s beta updates', 'advanced-responsive-video-embedder' ), $value['name'] ),
98
  'type' => 'boolean',
100
  }
101
 
102
  $settings['cdn'] = [
103
+ 'tag' => 'keys',
104
  'default' => false,
105
  'option' => true,
 
106
  'label' => esc_html__( 'Use jsDelivr CDN for some assets', 'advanced-responsive-video-embedder' ),
107
  'type' => 'boolean',
108
  ];
109
 
110
  $settings['action'] = [
111
+ 'tag' => 'keys',
112
  'default' => '',
113
  'option' => true,
 
114
  'label' => esc_html__( 'Action', 'advanced-responsive-video-embedder' ),
115
  'type' => 'string',
116
  'ui' => 'hidden',
122
  function get_products() {
123
 
124
  $products = [
125
+ 'arve_pro' => [
126
  'namespace' => 'ARVE\Pro',
127
  'name' => 'ARVE Pro',
128
  'id' => 1253,
130
  'author' => 'Nicolas Jonas',
131
  'url' => 'https://nextgenthemes.com/plugins/arve-pro/',
132
  ],
133
+ 'arve_amp' => [
134
  'namespace' => 'ARVE\AMP',
135
  'name' => 'ARVE AMP',
136
  'id' => 16941,
146
  'author' => 'Nicolas Jonas',
147
  'url' => 'https://nextgenthemes.com/plugins/arve-random-video/',
148
  ],
149
+ 'arve_sticky_videos' => [
150
+ 'namespace' => 'ARVE\StickyVideos',
151
+ 'name' => 'ARVE Sticky Videos',
152
+ 'id' => false,
153
+ 'type' => 'plugin',
154
+ 'author' => 'Nicolas Jonas',
155
+ 'url' => 'https://nextgenthemes.com/plugins/arve-sticky-videos/',
156
+ ],
157
  ];
158
 
159
  $products = apply_filters( 'nextgenthemes_products', $products );
php/Common/functions-string.php CHANGED
@@ -1,11 +1,11 @@
1
  <?php
2
  namespace Nextgenthemes\ARVE\Common;
3
 
4
- function contains_any( $haystack, array $needles ) {
5
 
6
  foreach ( $needles as $needle ) {
7
 
8
- if ( contains( $haystack, $needle ) ) {
9
  return true;
10
  }
11
  }
@@ -13,41 +13,50 @@ function contains_any( $haystack, array $needles ) {
13
  return false;
14
  }
15
 
16
- function contains( $haystack, $needle ) {
17
- return false !== strpos( $haystack, $needle );
18
- }
19
 
20
- function starts_with( $haystack, $needle ) {
21
- return $haystack[0] === $needle[0] ? strncmp( $haystack, $needle, strlen( $needle ) ) === 0 : false;
22
- }
23
 
24
- function ends_with( $haystack, $needle ) {
25
- // search forward starting from end minus needle length characters
26
- if ( '' === $needle ) {
27
- return true;
28
  }
29
 
30
- $diff = strlen( $haystack ) - strlen( $needle );
 
 
 
 
 
 
 
31
 
32
- return $diff >= 0 && strpos( $haystack, $needle, $diff ) !== false;
33
  }
34
 
35
- function remove_url_query( $url ) {
36
 
37
- $parsed_url = parse_url( $url );
38
 
39
- if ( ! $parsed_url ) {
40
- return $url;
41
  }
42
 
43
- $scheme = isset( $parsed_url['scheme'] ) ? $parsed_url['scheme'] . '://' : '';
44
- $host = isset( $parsed_url['host'] ) ? $parsed_url['host'] : '';
45
- $port = isset( $parsed_url['port'] ) ? ':' . $parsed_url['port'] : '';
46
- $user = isset( $parsed_url['user'] ) ? $parsed_url['user'] : '';
47
- $pass = isset( $parsed_url['pass'] ) ? ':' . $parsed_url['pass'] : '';
48
- $pass = ( $user || $pass ) ? "$pass@" : '';
49
- $path = isset( $parsed_url['path'] ) ? $parsed_url['path'] : '';
50
- $fragment = isset( $parsed_url['fragment'] ) ? '#' . $parsed_url['fragment'] : '';
51
 
52
- return "$scheme$user$pass$host$port$path$fragment";
 
 
 
 
 
 
 
 
 
 
 
 
 
 
53
  }
1
  <?php
2
  namespace Nextgenthemes\ARVE\Common;
3
 
4
+ function str_contains_any( $haystack, array $needles ) {
5
 
6
  foreach ( $needles as $needle ) {
7
 
8
+ if ( str_contains( $haystack, $needle ) ) {
9
  return true;
10
  }
11
  }
13
  return false;
14
  }
15
 
16
+ function remove_url_query( $url ) {
 
 
17
 
18
+ $parsed_url = parse_url( $url );
 
 
19
 
20
+ if ( ! $parsed_url ) {
21
+ return $url;
 
 
22
  }
23
 
24
+ $scheme = isset( $parsed_url['scheme'] ) ? $parsed_url['scheme'] . '://' : '';
25
+ $host = isset( $parsed_url['host'] ) ? $parsed_url['host'] : '';
26
+ $port = isset( $parsed_url['port'] ) ? ':' . $parsed_url['port'] : '';
27
+ $user = isset( $parsed_url['user'] ) ? $parsed_url['user'] : '';
28
+ $pass = isset( $parsed_url['pass'] ) ? ':' . $parsed_url['pass'] : '';
29
+ $pass = ( $user || $pass ) ? "$pass@" : '';
30
+ $path = isset( $parsed_url['path'] ) ? $parsed_url['path'] : '';
31
+ $fragment = isset( $parsed_url['fragment'] ) ? '#' . $parsed_url['fragment'] : '';
32
 
33
+ return "$scheme$user$pass$host$port$path$fragment";
34
  }
35
 
36
+ function dashes_to_camel_case( $string, $capitalize_first_character = false ) {
37
 
38
+ $str = str_replace('-', '', ucwords($string, '-'));
39
 
40
+ if ( ! $capitalize_first_character ) {
41
+ $str = lcfirst($str);
42
  }
43
 
44
+ return $str;
45
+ }
 
 
 
 
 
 
46
 
47
+ function kses_basic( $html ) {
48
+ return wp_kses(
49
+ $html,
50
+ [
51
+ 'a' => [
52
+ 'href' => [],
53
+ 'target' => [],
54
+ 'title' => [],
55
+ ],
56
+ 'br' => [],
57
+ 'em' => [],
58
+ 'strong' => [],
59
+ 'code' => [],
60
+ ]
61
+ );
62
  }
php/Common/init.php CHANGED
@@ -4,6 +4,9 @@ namespace Nextgenthemes\ARVE\Common;
4
  const VERSION = '1.0.0';
5
 
6
  // phpcs:disable WPThemeReview.CoreFunctionality.FileInclude.FileIncludeFound
 
 
 
7
  require_once __DIR__ . '/Settings.php';
8
  require_once __DIR__ . '/functions-settings.php';
9
  require_once __DIR__ . '/functions-license.php';
@@ -18,6 +21,7 @@ require_once __DIR__ . '/Admin/NoticeFactory.php';
18
  require_once __DIR__ . '/Admin/functions-licensing.php';
19
  require_once __DIR__ . '/Admin/functions-settings.php';
20
  require_once __DIR__ . '/Admin/functions-notices.php';
 
21
  // phpcs:enable WPThemeReview.CoreFunctionality.FileInclude.FileIncludeFound
22
 
23
  if ( ! defined( 'NGT_COMMON_INIT' ) ) {
4
  const VERSION = '1.0.0';
5
 
6
  // phpcs:disable WPThemeReview.CoreFunctionality.FileInclude.FileIncludeFound
7
+ require_once __DIR__ . '/functions-compat.php';
8
+ require_once __DIR__ . '/functions-deprecated.php';
9
+ // ------------------------------------------------
10
  require_once __DIR__ . '/Settings.php';
11
  require_once __DIR__ . '/functions-settings.php';
12
  require_once __DIR__ . '/functions-license.php';
21
  require_once __DIR__ . '/Admin/functions-licensing.php';
22
  require_once __DIR__ . '/Admin/functions-settings.php';
23
  require_once __DIR__ . '/Admin/functions-notices.php';
24
+ require_once __DIR__ . '/Admin/functions-debug.php';
25
  // phpcs:enable WPThemeReview.CoreFunctionality.FileInclude.FileIncludeFound
26
 
27
  if ( ! defined( 'NGT_COMMON_INIT' ) ) {
php/EmbedChecker.php CHANGED
@@ -15,9 +15,9 @@ class EmbedChecker {
15
  $maybe_arve_html = $GLOBALS['wp_embed']->shortcode( $this->shortcode_args, $this->shortcode_args['url'] );
16
  remove_filter( 'nextgenthemes/arve/oembed2args', [ $this, 'oembed2args' ] );
17
 
18
- if ( false !== strpos( $maybe_arve_html, 'class="arve' ) ) {
19
  return $maybe_arve_html;
20
- };
21
 
22
  return false;
23
  }
15
  $maybe_arve_html = $GLOBALS['wp_embed']->shortcode( $this->shortcode_args, $this->shortcode_args['url'] );
16
  remove_filter( 'nextgenthemes/arve/oembed2args', [ $this, 'oembed2args' ] );
17
 
18
+ if ( str_contains( $maybe_arve_html, 'class="arve' ) ) {
19
  return $maybe_arve_html;
20
+ }
21
 
22
  return false;
23
  }
php/ShortcodeArgs.php ADDED
@@ -0,0 +1,427 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Nextgenthemes\ARVE;
3
+
4
+ class ShortcodeArgs {
5
+
6
+ private $errors;
7
+
8
+ public function __construct( $error_instance ) {
9
+ $this->errors = $error_instance;
10
+ }
11
+
12
+ public function get_done( array $a ) {
13
+
14
+ missing_attribute_check( $a );
15
+
16
+ $a = $this->args_validate( $a );
17
+ $a = args_detect_html5( $a );
18
+ $a = $this->detect_provider_and_id_from_url( $a );
19
+
20
+ $a['aspect_ratio'] = arg_aspect_ratio( $a );
21
+ $a['thumbnail'] = apply_filters( 'nextgenthemes/arve/args/thumbnail', $a['thumbnail'], $a );
22
+ $a['img_src'] = $this->arg_img_src( $a );
23
+ $a['img_srcset'] = $this->arg_img_srcset( $a );
24
+ $a = args_video( $a );
25
+ $a['id'] = liveleak_id_fix( $a );
26
+ $a['maxwidth'] = $this->arg_maxwidth( $a );
27
+ $a['width'] = $a['maxwidth'];
28
+ $a['height'] = height_from_width_and_ratio( $a['width'], $a['aspect_ratio'] );
29
+ $a['mode'] = $this->arg_mode( $a );
30
+ $a['autoplay'] = arg_autoplay( $a );
31
+ $a['src'] = $this->arg_iframe_src( $a );
32
+ $a['uid'] = sanitize_key( uniqid( "arve-{$a['provider']}-{$a['id']}", true) );
33
+
34
+ return $a;
35
+ }
36
+
37
+ private function arg_maxwidth( array $a ) {
38
+
39
+ $options = options();
40
+
41
+ if ( empty( $a['maxwidth'] ) ) {
42
+
43
+ if ( in_array( $a['align'], [ 'left', 'right', 'center' ], true ) ) {
44
+ $a['maxwidth'] = (int) $options['align_maxwidth'];
45
+ } elseif ( empty( $options['maxwidth'] ) ) {
46
+ $a['maxwidth'] = (int) empty( $GLOBALS['content_width'] ) ? DEFAULT_MAXWIDTH : $GLOBALS['content_width'];
47
+ } else {
48
+ $a['maxwidth'] = (int) $options['maxwidth'];
49
+ }
50
+ }
51
+
52
+ if ( $a['maxwidth'] < 50 ) {
53
+ $this->errors->add( 'maxw', __( 'Maxwidth needs to be 50+', 'advanced-responsive-video-embedder' ) );
54
+ }
55
+
56
+ return $a['maxwidth'];
57
+ }
58
+
59
+ private function arg_mode( array $a ) {
60
+
61
+ if ( 'lazyload-lightbox' === $a['mode'] ) {
62
+ $a['mode'] = 'lightbox';
63
+ }
64
+
65
+ if ( 'thumbnail' === $a['mode'] ) {
66
+ $a['mode'] = 'lazyload';
67
+ }
68
+
69
+ if ( 'normal' !== $a['mode'] &&
70
+ ! defined( '\Nextgenthemes\ARVE\Pro\VERSION' ) ) {
71
+
72
+ $err_msg = sprintf(
73
+ // Translators: Mode
74
+ __( 'Mode: %s not available (ARVE Pro not active?), switching to normal mode', 'advanced-responsive-video-embedder' ),
75
+ $a['mode']
76
+ );
77
+ $a['errors']->add( 'mode-not-avail', $err_msg );
78
+ $a['mode'] = 'normal';
79
+ }
80
+
81
+ return $a['mode'];
82
+ }
83
+
84
+ private function args_validate( array $a ) {
85
+
86
+ foreach ( $a as $key => $value ) {
87
+
88
+ switch ( $key ) {
89
+ case 'errors':
90
+ break;
91
+ case 'url_handler':
92
+ if ( null !== $value && ! is_array( $value ) ) {
93
+ $this->errors->add( 2, 'url_handler needs to be null or array' . $value );
94
+ }
95
+ break;
96
+ case 'oembed_data':
97
+ if ( null !== $value && ! is_object( $value ) ) {
98
+ $this->errors->add( 'oembed_data', 'oembed_data needs to be null or a object' );
99
+ }
100
+ break;
101
+ default:
102
+ if ( null !== $value && ! is_string( $value ) ) {
103
+ $this->errors->add( 2, "$key must be null or string" );
104
+ }
105
+ break;
106
+ }
107
+ }
108
+
109
+ foreach ( bool_shortcode_args() as $arg ) {
110
+ $a[ $arg ] = $this->validate_bool( $a[ $arg ], $arg );
111
+ };
112
+
113
+ $url_args = array_merge( VIDEO_FILE_EXTENSIONS, [ 'url', 'src' ] );
114
+
115
+ foreach ( $url_args as $key => $urlarg ) {
116
+ $a[ $urlarg ] = $this->validate_url( $a[ $urlarg ], $urlarg );
117
+ };
118
+
119
+ $a['align'] = $this->validate_align( $a );
120
+ $a['aspect_ratio'] = $this->validate_aspect_ratio( $a );
121
+
122
+ return $a;
123
+ }
124
+
125
+ private function validate_url( $url, $attr_name ) {
126
+
127
+ if ( ! empty( $url ) && ! valid_url( $url ) ) {
128
+
129
+ $error_msg = sprintf(
130
+ // Translators: 1 URL 2 Attr name
131
+ __( 'Invalid URL <code>%1$s</code> in <code>%2$s</code>', 'advanced-responsive-video-embedder' ),
132
+ esc_html( $url ),
133
+ esc_html( $attr_name )
134
+ );
135
+
136
+ $this->errors->add( $attr_name, $error_msg );
137
+ }
138
+
139
+ return $url;
140
+ }
141
+
142
+ // phpcs:ignore Generic.Metrics.CyclomaticComplexity.TooHigh
143
+ private function validate_bool( $str, $attr_name ) {
144
+
145
+ switch ( $str ) {
146
+ case 'true':
147
+ case '1':
148
+ case 'y':
149
+ case 'yes':
150
+ case 'on':
151
+ return true;
152
+ case '':
153
+ case null:
154
+ return null;
155
+ case 'false':
156
+ case '0':
157
+ case 'n':
158
+ case 'no':
159
+ case 'off':
160
+ return false;
161
+ default:
162
+ $this->errors->add(
163
+ $attr_name,
164
+ // Translators: %1$s = Attr Name, %2$s = Attribute array
165
+ sprintf(
166
+ // Translators: Attribute Name
167
+ __( '%1$s <code>%2$s</code> not valid', 'advanced-responsive-video-embedder' ),
168
+ esc_html( $attr_name ),
169
+ esc_html( $str )
170
+ )
171
+ );
172
+ return null;
173
+ }//end switch
174
+ }
175
+
176
+ private function validate_align( array $a ) {
177
+
178
+ switch ( $a['align'] ) {
179
+ case null:
180
+ case '':
181
+ case 'none':
182
+ $a['align'] = null;
183
+ break;
184
+ case 'left':
185
+ case 'right':
186
+ case 'center':
187
+ break;
188
+ default:
189
+ $this->errors->add(
190
+ 'align',
191
+ // Translators: Alignment
192
+ sprintf( __( 'Align <code>%s</code> not valid', 'advanced-responsive-video-embedder' ), esc_html( $a['align'] ) )
193
+ );
194
+ $a['align'] = null;
195
+ break;
196
+ }
197
+
198
+ return $a['align'];
199
+ }
200
+
201
+ private function validate_aspect_ratio( array $a ) {
202
+
203
+ if ( empty( $a['aspect_ratio'] ) ) {
204
+ return $a['aspect_ratio'];
205
+ }
206
+
207
+ $ratio = explode( ':', $a['aspect_ratio'] );
208
+
209
+ if ( empty( $ratio[0] ) || ! is_numeric( $ratio[0] ) ||
210
+ empty( $ratio[1] ) || ! is_numeric( $ratio[1] )
211
+ ) {
212
+ $this->errors->add(
213
+ 'aspect_ratio',
214
+ // Translators: attribute
215
+ sprintf( __( 'Aspect ratio <code>%s</code> is not valid', 'advanced-responsive-video-embedder' ), $a['aspect_ratio'] )
216
+ );
217
+
218
+ $a['aspect_ratio'] = null;
219
+ }
220
+
221
+ return $a['aspect_ratio'];
222
+ }
223
+
224
+ private function arg_img_src( array $a ) {
225
+
226
+ $img_src = false;
227
+
228
+ if ( $a['thumbnail'] ) :
229
+
230
+ if ( is_numeric( $a['thumbnail'] ) ) {
231
+
232
+ $img_src = wp_get_attachment_image_url( $a['thumbnail'], 'small' );
233
+
234
+ if ( empty( $img_src ) ) {
235
+ $this->errors->add( 'no-media-id', __( 'No attachment with that ID', 'advanced-responsive-video-embedder' ) );
236
+ }
237
+ } elseif ( valid_url( $a['thumbnail'] ) ) {
238
+
239
+ $img_src = $a['thumbnail'];
240
+
241
+ } else {
242
+
243
+ $this->errors->add( 'invalid-url', __( 'Not a valid thumbnail URL or Media ID given', 'advanced-responsive-video-embedder' ) );
244
+ }
245
+
246
+ endif; // thumbnail
247
+
248
+ return apply_filters( 'nextgenthemes/arve/args/img_src', $img_src, $a );
249
+ }
250
+
251
+ private function arg_img_srcset( array $a ) {
252
+
253
+ $img_srcset = false;
254
+
255
+ if ( $a['img_src'] && is_numeric( $a['thumbnail'] ) ) {
256
+ $img_srcset = wp_get_attachment_image_srcset( $a['thumbnail'], 'small' );
257
+ }
258
+
259
+ return apply_filters( 'nextgenthemes/arve/args/img_srcset', $img_srcset, $a );
260
+ }
261
+
262
+ private function detect_provider_and_id_from_url( array $a ) {
263
+
264
+ if ( 'html5' === $a['provider'] ||
265
+ ( $a['provider'] && $a['id'] )
266
+ ) {
267
+ return $a;
268
+ }
269
+
270
+ if ( ! $a['url'] && ! $a['src'] ) {
271
+ throw new \Exception(
272
+ __( 'detect_provider_and_id_from_url method needs url.', 'advanced-responsive-video-embedder' )
273
+ );
274
+ }
275
+
276
+ $options = options();
277
+ $properties = get_host_properties();
278
+ $input_provider = $a['provider'];
279
+
280
+ foreach ( $properties as $host_id => $host ) :
281
+
282
+ if ( empty( $host['regex'] ) ) {
283
+ continue;
284
+ }
285
+
286
+ $preg_match = preg_match( $host['regex'], $a['url'], $matches );
287
+
288
+ if ( 1 !== $preg_match ) {
289
+ continue;
290
+ }
291
+
292
+ foreach ( $matches as $key => $value ) {
293
+
294
+ if ( is_string( $key ) ) {
295
+ $a['provider'] = $host_id;
296
+ $a[ $key ] = $matches[ $key ];
297
+ }
298
+ }
299
+ endforeach;
300
+
301
+ if ( $input_provider &&
302
+ ( $input_provider !== $a['provider'] ) &&
303
+ ! ( 'youtube' === $input_provider && 'youtubelist' === $a['provider'] )
304
+ ) {
305
+ $this->errors->add( 'detect!=oembed', "Regex detected provider <code>{$a['provider']}</code> did not match given provider <code>$input_provider</code>" );
306
+ }
307
+
308
+ if ( ! $a['provider'] ) {
309
+ $a['provider'] = 'iframe';
310
+ $a['src'] = $a['src'] ? $a['src'] : $a['url'];
311
+ $a['id'] = $a['src'];
312
+ }
313
+
314
+ return $a;
315
+ }
316
+
317
+ private function special_iframe_src_mods( array $a ) {
318
+
319
+ switch ( $a['provider'] ) {
320
+ case 'youtube':
321
+ $yt_v = Common\get_url_arg( $a['url'], 'v' );
322
+ $yt_list = Common\get_url_arg( $a['url'], 'list' );
323
+
324
+ if ( str_contains( $a['src'], '/embed/videoseries?' ) &&
325
+ $yt_v
326
+ ) {
327
+ $a['src'] = str_replace( '/embed/videoseries?', "/embed/$yt_v?", $a['src'] );
328
+ }
329
+
330
+ if ( $yt_list ) {
331
+ $a['src'] = remove_query_arg( 'feature', $a['src'] );
332
+ $a['src'] = add_query_arg( 'list', $yt_list, $a['src'] );
333
+ $a['src_gen'] = add_query_arg( 'list', $yt_list, $a['src_gen'] );
334
+ }
335
+ break;
336
+ case 'vimeo':
337
+ $a['src'] = add_query_arg( 'dnt', 1, $a['src'] );
338
+ $a['src_gen'] = add_query_arg( 'dnt', 1, $a['src_gen'] );
339
+
340
+ $parsed_url = wp_parse_url( $a['url'] );
341
+
342
+ if ( ! empty( $parsed_url['fragment'] ) && str_starts_with( $parsed_url['fragment'], 't' ) ) {
343
+ $a['src'] .= '#' . $parsed_url['fragment'];
344
+ $a['src_gen'] .= '#' . $parsed_url['fragment'];
345
+ }
346
+ break;
347
+ case 'wistia':
348
+ $a['src'] = add_query_arg( 'dnt', 1, $a['src'] );
349
+ $a['src_gen'] = add_query_arg( 'dnt', 1, $a['src_gen'] );
350
+ break;
351
+ }
352
+
353
+ return $a;
354
+ }
355
+
356
+ private function arg_iframe_src( array $a ) {
357
+
358
+ if ( 'html5' === $a['provider'] ) {
359
+ return false;
360
+ }
361
+
362
+ if ( ! $a['provider'] || ! $a['id'] ) {
363
+ $this->errors->add( 'no-provider-and-id', 'Need Provider and ID to build iframe src' );
364
+ return false;
365
+ }
366
+
367
+ $options = options();
368
+ $a['src_gen'] = build_iframe_src( $a );
369
+ $a = special_iframe_src_mods( $a );
370
+
371
+ $this->compare_oembed_src_with_generated_src( $a );
372
+
373
+ if ( ! valid_url( $a['src'] ) && valid_url( $a['src_gen'] ) ) {
374
+ $a['src'] = $a['src_gen'];
375
+ }
376
+
377
+ $a['src'] = iframe_src_args( $a['src'], $a );
378
+ $a['src'] = iframe_src_autoplay_args( $a['autoplay'], $a );
379
+
380
+ if ( 'youtube' === $a['provider'] && $options['youtube_nocookie'] ) {
381
+ $a['src'] = str_replace( 'https://www.youtube.com', 'https://www.youtube-nocookie.com', $a['src'] );
382
+ }
383
+
384
+ return $a['src'];
385
+ }
386
+
387
+ private function compare_oembed_src_with_generated_src( $a ) {
388
+
389
+ if ( ! $a['src'] ) {
390
+ return;
391
+ }
392
+
393
+ $src = $a['src'];
394
+ $src_gen = $a['src_gen'];
395
+
396
+ switch ( $a['provider'] ) {
397
+ case 'wistia':
398
+ case 'vimeo':
399
+ $src = Common\remove_url_query( $a['src'] );
400
+ $src_gen = Common\remove_url_query( $a['src_gen'] );
401
+ break;
402
+ case 'youtube':
403
+ $src = remove_query_arg( 'feature', $a['src'] );
404
+ break;
405
+ }
406
+
407
+ if ( $src !== $src_gen ) {
408
+ $msg = sprintf(
409
+ 'src mismatch<br>url: %s<br>src in: %s<br>src gen: %s',
410
+ $a['url'],
411
+ $a['src'],
412
+ $a['src_gen']
413
+ );
414
+
415
+ if ( $src !== $a['src'] || $src_gen !== $a['src_gen'] ) {
416
+ $msg .= sprintf(
417
+ 'Actual comparison<br>url: %s<br>src in: %s<br>src gen: %s',
418
+ $a['url'],
419
+ $src,
420
+ $src_gen
421
+ );
422
+ }
423
+
424
+ $this->errors->add( 'hidden', $msg );
425
+ }
426
+ }
427
+ }
php/functions-assets.php CHANGED
@@ -33,7 +33,7 @@ function register_assets() {
33
  foreach ( $sc_settings as $key => $v ) {
34
 
35
  $attr[ $key ] = [
36
- 'type' => ( 'select' === $v['type'] ) ? 'string' : $v['type']
37
  ];
38
 
39
  if ( $options['gutenberg_help'] && ! empty( $v['description'] ) ) {
@@ -121,7 +121,7 @@ function gutenberg_block( $args ) {
121
  function maybe_enqueue_assets( $html ) {
122
 
123
  // Doing this because of embed caching the actual functions and filters generating the videos may not be called, if the Block or Shortcode is not used the styles would never get loaded but we micro optimize and load them only when needed this way.
124
- if ( Common\contains( $html, 'class="arve' ) ) {
125
  wp_enqueue_style( 'arve' );
126
  wp_enqueue_script( 'arve' );
127
  }
33
  foreach ( $sc_settings as $key => $v ) {
34
 
35
  $attr[ $key ] = [
36
+ 'type' => ( 'select' === $v['type'] ) ? 'string' : $v['type'],
37
  ];
38
 
39
  if ( $options['gutenberg_help'] && ! empty( $v['description'] ) ) {
121
  function maybe_enqueue_assets( $html ) {
122
 
123
  // Doing this because of embed caching the actual functions and filters generating the videos may not be called, if the Block or Shortcode is not used the styles would never get loaded but we micro optimize and load them only when needed this way.
124
+ if ( str_contains( $html, 'class="arve' ) ) {
125
  wp_enqueue_style( 'arve' );
126
  wp_enqueue_script( 'arve' );
127
  }
php/functions-host-properties.php CHANGED
@@ -174,15 +174,15 @@ function get_host_properties() {
174
  ],
175
  'facebook' => [
176
  'name' => 'Facebook',
177
- 'oembed' => true,
178
  'regex' => '#(?<id>https?://([a-z]+\.)?facebook\.com/[-.a-z0-9]+/videos/[^\s]+)#i',
179
  'url_encode_id' => true,
180
  'embed_url' => 'https://www.facebook.com/plugins/video.php?href=%s',
181
- 'auto_thumbnail' => true,
182
  'tests' => [
183
  [
184
  'url' => 'https://www.facebook.com/TheKillingsOfTonyBlair/videos/vb.551089058285349/562955837098671/?type=2&theater',
185
- 'id' => 'https://www.facebook.com/TheKillingsOfTonyBlair/videos/vb.551089058285349/562955837098671/',
186
  ],
187
  [
188
  'url' => 'https://web.facebook.com/XTvideo/videos/10153906059711871/',
@@ -613,8 +613,8 @@ function get_host_properties() {
613
  'id' => 'GjL82KUHVb0&list=PLI46g-I12_9qGBq-4epxOay0hotjys5iA',
614
  ],
615
  [
616
- 'url' => 'https://youtu.be/b8m9zhNAgKs?list=PLI_7Mg2Z_-4I-W_lI55D9lBUkC66ftHMg',
617
- 'id' => 'b8m9zhNAgKs?list=PLI_7Mg2Z_-4I-W_lI55D9lBUkC66ftHMg',
618
  ],
619
  ],
620
  'specific_tests' => [
174
  ],
175
  'facebook' => [
176
  'name' => 'Facebook',
177
+ 'oembed' => false,
178
  'regex' => '#(?<id>https?://([a-z]+\.)?facebook\.com/[-.a-z0-9]+/videos/[^\s]+)#i',
179
  'url_encode_id' => true,
180
  'embed_url' => 'https://www.facebook.com/plugins/video.php?href=%s',
181
+ 'auto_thumbnail' => false,
182
  'tests' => [
183
  [
184
  'url' => 'https://www.facebook.com/TheKillingsOfTonyBlair/videos/vb.551089058285349/562955837098671/?type=2&theater',
185
+ 'id' => 'https://www.facebook.com/TheKillingsOfTonyBlair/videos/vb.551089058285349/562955837098671/?type=2&theater',
186
  ],
187
  [
188
  'url' => 'https://web.facebook.com/XTvideo/videos/10153906059711871/',
613
  'id' => 'GjL82KUHVb0&list=PLI46g-I12_9qGBq-4epxOay0hotjys5iA',
614
  ],
615
  [
616
+ 'url' => 'https://youtu.be/b8m9zhNAgKs?list=PLI_7Mg2Z_-4I-W_lI55D9lBUkC66ftHMg',
617
+ 'id' => 'b8m9zhNAgKs?list=PLI_7Mg2Z_-4I-W_lI55D9lBUkC66ftHMg',
618
  ],
619
  ],
620
  'specific_tests' => [
php/functions-html-output.php CHANGED
@@ -1,6 +1,8 @@
1
  <?php
2
  namespace Nextgenthemes\ARVE;
3
 
 
 
4
  function build_html( array $a ) {
5
 
6
  $options = options();
@@ -61,7 +63,7 @@ function build_iframe_tag( array $a ) {
61
  'allowfullscreen' => '',
62
  'class' => $class,
63
  'data-arve' => $a['uid'],
64
- 'data-src-no-ap' => iframe_src_autoplay_args( $a['src'], false, $a ),
65
  'frameborder' => '0',
66
  'height' => $a['height'],
67
  'name' => $a['iframe_name'],
1
  <?php
2
  namespace Nextgenthemes\ARVE;
3
 
4
+ use function \Nextgenthemes\ARVE\Common\get_var_dump;
5
+
6
  function build_html( array $a ) {
7
 
8
  $options = options();
63
  'allowfullscreen' => '',
64
  'class' => $class,
65
  'data-arve' => $a['uid'],
66
+ 'data-src-no-ap' => iframe_src_autoplay_args( false, $a ),
67
  'frameborder' => '0',
68
  'height' => $a['height'],
69
  'name' => $a['iframe_name'],
php/functions-misc.php CHANGED
@@ -4,7 +4,7 @@ namespace Nextgenthemes\ARVE;
4
  function aspect_ratio_gcd( $aspect_ratio ) {
5
 
6
  list( $width, $height ) = explode( ':', $aspect_ratio );
7
- $gcd = gcd( $width, $height );
8
 
9
  $aspect_ratio = $width / $gcd . ':' . $height / $gcd;
10
 
@@ -55,7 +55,7 @@ function youtube_time_to_seconds( $yttime ) {
55
 
56
  preg_match( $pattern, $yttime, $matches );
57
 
58
- foreach( [ 'h', 'm', 's' ] as $m ) {
59
  if ( ! isset( $matches[ $m ] ) ) {
60
  $matches[ $m ] = 0;
61
  }
@@ -68,19 +68,12 @@ function youtube_time_to_seconds( $yttime ) {
68
 
69
  function new_height( $old_width, $old_height, $new_width ) {
70
 
71
- $aspect_num = $old_width / $old_height;
72
- $new_height = $new_width / $aspect_num;
73
 
74
  return $new_height;
75
  }
76
 
77
- function new_height_from_aspect_ratio( $new_width, $aspect_ratio ) {
78
-
79
- list( $old_width, $old_height ) = explode( ':', $aspect_ratio );
80
-
81
- return new_height( $old_width, $old_height, $new_width );
82
- }
83
-
84
  /**
85
  * Calculates padding percentage value for a particular aspect ratio
86
  *
@@ -103,29 +96,29 @@ function disabled_on_feeds() {
103
  }
104
 
105
  function seconds_to_iso8601_duration( $time ) {
106
- $units = array(
107
- 'Y' => 365*24*3600,
108
- 'D' => 24*3600,
109
- 'H' => 3600,
110
- 'M' => 60,
111
- 'S' => 1,
112
- );
113
-
114
- $str = 'P';
115
- $istime = false;
116
-
117
- foreach ( $units as $unitName => &$unit ) {
118
- $quot = intval($time / $unit);
119
- $time -= $quot * $unit;
120
- $unit = $quot;
121
- if ( $unit > 0 ) {
122
- if ( ! $istime && in_array($unitName, array('H', 'M', 'S'))) { // There may be a better way to do this
123
- $str .= 'T';
124
- $istime = true;
125
- }
126
- $str .= strval($unit) . $unitName;
127
- }
128
- }
129
-
130
- return $str;
131
  }
4
  function aspect_ratio_gcd( $aspect_ratio ) {
5
 
6
  list( $width, $height ) = explode( ':', $aspect_ratio );
7
+ $gcd = gcd( $width, $height );
8
 
9
  $aspect_ratio = $width / $gcd . ':' . $height / $gcd;
10
 
55
 
56
  preg_match( $pattern, $yttime, $matches );
57
 
58
+ foreach ( [ 'h', 'm', 's' ] as $m ) {
59
  if ( ! isset( $matches[ $m ] ) ) {
60
  $matches[ $m ] = 0;
61
  }
68
 
69
  function new_height( $old_width, $old_height, $new_width ) {
70
 
71
+ $aspect_num = $old_width / $old_height;
72
+ $new_height = $new_width / $aspect_num;
73
 
74
  return $new_height;
75
  }
76
 
 
 
 
 
 
 
 
77
  /**
78
  * Calculates padding percentage value for a particular aspect ratio
79
  *
96
  }
97
 
98
  function seconds_to_iso8601_duration( $time ) {
99
+ $units = array(
100
+ 'Y' => 365 * 24 * 3600,
101
+ 'D' => 24 * 3600,
102
+ 'H' => 3600,
103
+ 'M' => 60,
104
+ 'S' => 1,
105
+ );
106
+
107
+ $str = 'P';
108
+ $istime = false;
109
+
110
+ foreach ( $units as $unit_name => $unit ) {
111
+ $quot = intval($time / $unit);
112
+ $time -= $quot * $unit;
113
+ $unit = $quot;
114
+ if ( $unit > 0 ) {
115
+ if ( ! $istime && in_array( $unit_name, array( 'H', 'M', 'S' ), true )) { // There may be a better way to do this
116
+ $str .= 'T';
117
+ $istime = true;
118
+ }
119
+ $str .= strval($unit) . $unit_name;
120
+ }
121
+ }
122
+
123
+ return $str;
124
  }
php/functions-oembed.php CHANGED
@@ -61,7 +61,7 @@ function oembed2args( $data, $url ) {
61
  // needed for private videos
62
  function vimeo_referer( $args, $url ) {
63
 
64
- if ( Common\contains( $url, 'vimeo' ) ) {
65
  $args['headers']['Referer'] = site_url();
66
  }
67
 
@@ -80,11 +80,11 @@ function trigger_cache_rebuild( $ttl, $url, $attr, $post_id ) {
80
  $cache_time = get_post_meta( $post_id, $cachekey_time, true );
81
 
82
  // Get the cached HTML
83
- $cachekey = '_oembed_' . $key_suffix;
84
- $metadata = get_post_custom( $post_id );
85
- $cache_exists = isset( $metadata[ $cachekey ][0] );
86
- $cache_html = $cache_exists ? strtolower( get_post_meta( $post_id, $cachekey, true ) ) : false;
87
- // $cache_exists2 = metadata_exists( 'post', $post_id, $cachekey ); // TODO not sure of 'post' is always right for embeds outside of
88
 
89
  // time after a recache should be done
90
  $trigger_time = get_option( 'nextgenthemes_arve_oembed_recache' );
@@ -96,13 +96,13 @@ function trigger_cache_rebuild( $ttl, $url, $attr, $post_id ) {
96
  'open.spotify.com',
97
  'secure.polldaddy.com',
98
  'embed.tumblr.com',
99
- 'imgur.com'
100
  ];
101
 
102
  // Check if we need to regenerate the oEmbed HTML:
103
  if ( $cache_exists &&
104
  $cache_time < $trigger_time &&
105
- ! Common\contains_any( $cache_html, $not_touching ) &&
106
  $GLOBALS['wp_embed']->usecache
107
  ) {
108
  // What we need to skip the oembed cache part
61
  // needed for private videos
62
  function vimeo_referer( $args, $url ) {
63
 
64
+ if ( str_contains( $url, 'vimeo' ) ) {
65
  $args['headers']['Referer'] = site_url();
66
  }
67
 
80
  $cache_time = get_post_meta( $post_id, $cachekey_time, true );
81
 
82
  // Get the cached HTML
83
+ $cachekey = '_oembed_' . $key_suffix;
84
+ $metadata = get_post_custom( $post_id );
85
+ $cache_exists = isset( $metadata[ $cachekey ][0] );
86
+ $cache_html = $cache_exists ? strtolower( get_post_meta( $post_id, $cachekey, true ) ) : false;
87
+ // $cache_exists2 = metadata_exists( 'post', $post_id, $cachekey ); // TODO not sure of 'post' is always right for embeds outside of
88
 
89
  // time after a recache should be done
90
  $trigger_time = get_option( 'nextgenthemes_arve_oembed_recache' );
96
  'open.spotify.com',
97
  'secure.polldaddy.com',
98
  'embed.tumblr.com',
99
+ 'imgur.com',
100
  ];
101
 
102
  // Check if we need to regenerate the oEmbed HTML:
103
  if ( $cache_exists &&
104
  $cache_time < $trigger_time &&
105
+ ! Common\str_contains_any( $cache_html, $not_touching ) &&
106
  $GLOBALS['wp_embed']->usecache
107
  ) {
108
  // What we need to skip the oembed cache part
php/functions-settings.php CHANGED
@@ -1,6 +1,8 @@
1
  <?php
2
  namespace Nextgenthemes\ARVE;
3
 
 
 
4
  function options() {
5
  $i = settings_instance();
6
  return $i->get_options();
@@ -22,17 +24,19 @@ function settings_instance() {
22
  'namespace' => __NAMESPACE__,
23
  'settings' => settings(),
24
  'sections' => [
25
- 'main' => __( 'Main', 'advanced-responsive-video-embedder' ),
26
- 'pro' => __( 'Pro', 'advanced-responsive-video-embedder' ),
27
- #'videojs' => __( 'Video.js', 'advanced-responsive-video-embedder' ),
28
- 'randomvideo' => __( 'Random Video', 'advanced-responsive-video-embedder' ),
29
- 'html5' => __( 'HTML5', 'advanced-responsive-video-embedder' ),
30
- 'urlparams' => __( 'URL Parameters', 'advanced-responsive-video-embedder' ),
31
- 'debug' => __( 'Debug', 'advanced-responsive-video-embedder' ),
 
32
  ],
 
33
  'menu_parent_slug' => 'options-general.php',
34
- 'menu_title' => __( 'ARVE', 'advanced-responsive-video-embedder' ),
35
- 'settings_page_title' => __( 'ARVE Settings', 'advanced-responsive-video-embedder' ),
36
  ]
37
  );
38
  }
@@ -149,7 +153,7 @@ function shortcode_pairs() {
149
  'gutenberg' => null,
150
  'src' => null,
151
  'img_srcset' => null,
152
- 'maxwidth' => null, # Overwriting the option value ON PURPOSE here, see sc_filter_maxwidth
153
  'av1mp4' => null,
154
  'mp4' => null,
155
  'm4v' => null,
@@ -238,10 +242,6 @@ function upgrade_options( $settings_instance ) {
238
  }
239
  }
240
 
241
- function get_supported_modes() {
242
- return apply_filters( 'nextgenthemes/arve/modes', [ 'normal' => esc_html__( 'Normal', 'advanced-responsive-video-embedder' ) ] );
243
- }
244
-
245
  function all_settings() {
246
 
247
  $properties = get_host_properties();
@@ -265,9 +265,9 @@ function all_settings() {
265
  $auto_title = implode( ', ', $auto_title );
266
  $embed_code_only = implode( ', ', $embed_code_only );
267
  $def_bool_options = [
268
- '' => __( 'Default (settings page)', 'advanced-responsive-video-embedder' ),
269
- 'true' => __( 'True', 'advanced-responsive-video-embedder' ),
270
- 'false' => __( 'False', 'advanced-responsive-video-embedder' ),
271
  ];
272
 
273
  $provider_list_link = 'https://nextgenthemes.com/plugins/arve-pro/#video-host-support';
@@ -277,12 +277,12 @@ function all_settings() {
277
  'url' => [
278
  'default' => null,
279
  'option' => false,
280
- 'label' => __( 'Video URL / iframe Embed Code', 'advanced-responsive-video-embedder' ),
281
  'type' => 'string',
282
  'placeholder' => esc_attr__( 'Video URL / iframe Embed Code', 'advanced-responsive-video-embedder' ),
283
  'description' => sprintf(
284
  // Translators: %1$s Providers
285
- __( 'Post the URL of the video here. For %1$s and any <a href="%2$s">unlisted</a> video hosts paste their iframe embed codes.', 'advanced-responsive-video-embedder' ),
286
  esc_html( $embed_code_only ),
287
  esc_url( $provider_list_link )
288
  ),
@@ -292,11 +292,11 @@ function all_settings() {
292
  'title' => [
293
  'default' => null,
294
  'option' => false,
295
- 'label' => __( 'Title', 'advanced-responsive-video-embedder' ),
296
  'type' => 'string',
297
  'description' => sprintf(
298
  // Translators: Provider list
299
- __( 'Used for SEO, is visible on top of thumbnails in Lazyload/Lightbox modes, is used as link text in link-lightbox mode. <a href="%1$s">ARVE Pro</a> is able to get them from %2$s automatically.', 'advanced-responsive-video-embedder' ),
300
  esc_url( $pro_addon_link ),
301
  esc_html( $auto_title )
302
  ),
@@ -306,33 +306,46 @@ function all_settings() {
306
  'description' => [
307
  'default' => null,
308
  'option' => false,
309
- 'label' => __( 'Description', 'advanced-responsive-video-embedder' ),
310
  'type' => 'string',
311
- 'placeholder' => __( 'Used for SEO (needed, ARVE Pro auto fills this)', 'advanced-responsive-video-embedder' ),
312
- 'description' => sprintf( __( '<a href="%s">ARVE Pro</a> fills this automatically', 'advanced-responsive-video-embedder' ), esc_url( $pro_addon_link ) ), // phpcs:ignore WordPress.WP.I18n.MissingTranslatorsComment
 
 
 
 
 
313
  'descriptionlink' => esc_url( $pro_addon_link ),
314
  'descriptionlinktext' => esc_html__( 'ARVE Pro', 'advanced-responsive-video-embedder' ),
315
  ],
316
  'upload_date' => [
317
  'default' => null,
318
  'option' => false,
319
- 'label' => __( 'Upload Date', 'advanced-responsive-video-embedder' ),
320
  'type' => 'string',
321
- 'placeholder' => __( '2019-09-29 (ARVE Pro fills this with post date)', 'advanced-responsive-video-embedder' ),
322
- 'description' => sprintf( __( '<a href="%s">ARVE Pro</a> fills this automatically', 'advanced-responsive-video-embedder' ), esc_url( $pro_addon_link ) ), // phpcs:ignore WordPress.WP.I18n.MissingTranslatorsComment
 
 
 
 
323
  'descriptionlink' => esc_url( $pro_addon_link ),
324
  'descriptionlinktext' => esc_html__( 'ARVE Pro', 'advanced-responsive-video-embedder' ),
325
  ],
326
  'mode' => [
327
  'tag' => 'pro',
328
  'default' => 'normal',
329
- 'label' => __( 'Mode', 'advanced-responsive-video-embedder' ),
330
  'type' => 'select',
331
- 'options' =>
332
- [ '' => __( 'Default (settings page)', 'advanced-responsive-video-embedder' ) ]
333
- + get_supported_modes(),
 
 
 
334
  'description' => sprintf(
335
- __( 'For Lazyload, Lightbox and Link mode check out <a href="%s">ARVE Pro</a>.', 'advanced-responsive-video-embedder' ), // phpcs:ignore WordPress.WP.I18n.MissingTranslatorsComment
 
336
  'https://nextgenthemes.com/plugins/arve-pro/'
337
  ),
338
  'descriptionlink' => esc_url( $pro_addon_link ),
@@ -343,31 +356,31 @@ function all_settings() {
343
  'default' => '',
344
  'ui' => 'image_upload',
345
  'shortcode' => false,
346
- 'label' => __( 'Thumbnail Fallback', 'advanced-responsive-video-embedder' ),
347
  'type' => 'string',
348
- 'placeholder' => __( 'URL or media gallery image ID used for thumbnail', 'advanced-responsive-video-embedder' ),
349
- 'description' => __( 'URL or media gallery image ID used for thumbnail', 'advanced-responsive-video-embedder' ),
350
  ],
351
  'thumbnail_post_image_fallback' => [
352
  'tag' => 'pro',
353
  'default' => false,
354
  'shortcode' => false,
355
- 'label' => __( 'Thumbnail Featured Image Fallback', 'advanced-responsive-video-embedder' ),
356
  'type' => 'boolean',
357
  ],
358
  'thumbnail' => [
359
  'default' => null,
360
  'shortcode' => true,
361
  'option' => false,
362
- 'label' => __( 'Thumbnail', 'advanced-responsive-video-embedder' ),
363
  'type' => 'attachment',
364
  'libraryType' => [ 'image' ],
365
- 'addButton' => __( 'Select Image', 'advanced-responsive-video-embedder' ),
366
- 'frameTitle' => __( 'Select Image', 'advanced-responsive-video-embedder' ),
367
- 'placeholder' => __( 'Media library image ID or image URL', 'advanced-responsive-video-embedder' ),
368
  'description' => sprintf(
369
  // Translators: 1 Link, 2 Provider list
370
- __( 'Media library image ID (Select above in Gutenberg) or image URL for preview image for Lazyload modes, always used for SEO. <a href="%1$s">ARVE Pro</a> is able to get them from %2$s automatically.', 'advanced-responsive-video-embedder' ),
371
  esc_url( $pro_addon_link ),
372
  esc_html( $auto_thumbs )
373
  ),
@@ -378,126 +391,126 @@ function all_settings() {
378
  'default' => false,
379
  'shortcode' => true,
380
  'tag' => 'pro',
381
- 'label' => __( 'Hide Title (Lazyload & Lightbox only)', 'advanced-responsive-video-embedder' ),
382
  'type' => 'boolean',
383
- 'description' => __( 'Usefull when the thumbnail image already displays the video title (Lazyload & Lightbox modes).', 'advanced-responsive-video-embedder' ),
384
  ],
385
  'grow' => [
386
  'tag' => 'pro',
387
  'default' => true,
388
  'type' => 'select',
389
  'options' => $def_bool_options,
390
- 'label' => __( 'Expand on play? (Lazyload only)', 'advanced-responsive-video-embedder' ),
391
- 'description' => __( 'Expands video size after clicking the thumbnail (Lazyload Mode)', 'advanced-responsive-video-embedder' ),
392
  ],
393
  'fullscreen' => [
394
  'tag' => 'pro',
395
  'default' => 'disabled',
396
  'type' => 'select',
397
- 'label' => __( 'Go Fullscreen on opening Lightbox?', 'advanced-responsive-video-embedder' ),
398
- 'desc_detail' => __( 'Makes the Browser go fullscreen when opening the Lighbox. Optionally stay in Fullscreen mode even after the Lightbox is closed', 'advanced-responsive-video-embedder' ),
399
  'options' => [
400
- '' => __( 'Default (settings page)', 'advanced-responsive-video-embedder' ),
401
- 'enabled-exit' => __( 'Enabled, exit FS on lightbox close', 'advanced-responsive-video-embedder' ),
402
- 'enabled-stick' => __( 'Enabled, stay FS on lightbox close', 'advanced-responsive-video-embedder' ),
403
- 'disabled' => __( 'Disabled', 'advanced-responsive-video-embedder' ),
404
  ],
405
  ],
406
  'play_icon_style' => [
407
  'tag' => 'pro',
408
  'default' => 'youtube',
409
- 'label' => __( 'Play Button', 'advanced-responsive-video-embedder' ),
410
  'type' => 'select',
411
  'options' => [
412
  // Translators: 1 %s is play icon style.
413
- '' => __( 'Default (settings page)', 'advanced-responsive-video-embedder' ),
414
- 'youtube' => __( 'Youtube', 'advanced-responsive-video-embedder' ),
415
- 'youtube-red-diamond' => __( 'Youtube Red Diamond', 'advanced-responsive-video-embedder' ),
416
- 'vimeo' => __( 'Vimeo', 'advanced-responsive-video-embedder' ),
417
- 'circle' => __( 'Circle', 'advanced-responsive-video-embedder' ),
418
- 'none' => __( 'No play image', 'advanced-responsive-video-embedder' ),
419
- 'custom' => __( 'Custom (for PHP filter)', 'advanced-responsive-video-embedder' ),
420
  ],
421
  ],
422
  'hover_effect' => [
423
  'tag' => 'pro',
424
  'default' => 'zoom',
425
- 'label' => __( 'Hover Effect (Lazyload/Lightbox only)', 'advanced-responsive-video-embedder' ),
426
  'type' => 'select',
427
  'options' => [
428
- '' => __( 'Default (settings page)', 'advanced-responsive-video-embedder' ),
429
- 'zoom' => __( 'Zoom Thumbnail', 'advanced-responsive-video-embedder' ),
430
- 'rectangle' => __( 'Move Rectangle in', 'advanced-responsive-video-embedder' ),
431
- 'none' => __( 'None', 'advanced-responsive-video-embedder' ),
432
  ],
433
  ],
434
  'disable_links' => [
435
  'tag' => 'pro',
436
  'default' => false,
437
- 'label' => __( 'Disable links', 'advanced-responsive-video-embedder' ),
438
  'type' => 'select',
439
  'options' => $def_bool_options,
440
- 'description' => __( 'Prevent embeds to open new popups/tabs from links inside video embeds. Note: breaks functionality like sharing.', 'advanced-responsive-video-embedder' ),
441
  ],
442
  // 'mobile_inview' => [
443
  // 'tag' => 'pro',
444
  // 'default' => true,
445
  // 'shortcode' => false,
446
- // 'label' => __( 'Mobile Inview Fallback', 'advanced-responsive-video-embedder' ),
447
  // 'type' => 'boolean',
448
- // 'description' => __( 'This is not needed/used for YouTube and Vimeo. On mobiles fallback Lazyload mode to Lazyload Inview as workarround for the problem that it otherwise needs two touches to play a lazyloaded video because mobile browsers prevent autoplay. Note that this will prevent users to see your custom thumbnails or titles!', 'advanced-responsive-video-embedder' ),
449
  // ],
450
  'align' => [
451
  'default' => 'none',
452
  'shortcode' => true,
453
- 'label' => __( 'Alignment', 'advanced-responsive-video-embedder' ),
454
  'type' => 'select',
455
  'options' => [
456
- '' => __( 'Default (settings page)', 'advanced-responsive-video-embedder' ),
457
- 'none' => __( 'None', 'advanced-responsive-video-embedder' ),
458
- 'left' => __( 'Left', 'advanced-responsive-video-embedder' ),
459
- 'right' => __( 'Right', 'advanced-responsive-video-embedder' ),
460
- 'center' => __( 'Center', 'advanced-responsive-video-embedder' ),
461
  ],
462
  ],
463
  'lightbox_script' => [
464
  'tag' => 'pro',
465
  'default' => 'bigpicture',
466
  'shortcode' => false,
467
- 'label' => __( 'Lightbox Script', 'advanced-responsive-video-embedder' ),
468
  'type' => 'select',
469
  'options' => [
470
- 'bigpicture' => __( 'BigPicture', 'advanced-responsive-video-embedder' ),
471
- 'lity' => __( 'Lity', 'advanced-responsive-video-embedder' ),
472
  ],
473
- 'description' => __( 'Only use Lity if you have issues with Big Picture', 'advanced-responsive-video-embedder' ),
474
  ],
475
  'arve_link' => [
476
  'default' => false,
477
- 'label' => __( 'ARVE Link', 'advanced-responsive-video-embedder' ),
478
  'type' => 'select',
479
  'options' => $def_bool_options,
480
- 'description' => __( "Shows a small 'ARVE' link below the videos. Be the most awesome person and help promoting this plugin.", 'advanced-responsive-video-embedder' ),
481
  ],
482
  'duration' => [
483
  'default' => null,
484
  'option' => false,
485
- 'label' => __( 'Duration', 'advanced-responsive-video-embedder' ),
486
  'type' => 'string',
487
  'placeholder' => '1H2M3S',
488
- 'description' => __( '`1H2M3S` for 1 hour, 2 minutes and 3 seconds. `5M` for 5 minutes.', 'advanced-responsive-video-embedder' ),
489
  ],
490
  'autoplay' => [
491
  'default' => false,
492
  'shortcode' => true,
493
- 'label' => __( 'Autoplay', 'advanced-responsive-video-embedder' ),
494
  'type' => 'select',
495
  'options' => $def_bool_options,
496
- 'description' => __( 'Do not expect this to work! Browsers (especially mobile) or user settings prevent it, some video hosts do not support it at all. Only used in normal mode. ARVE will mute HTML5 video playback in case to make autoplay work for the broadest audience.', 'advanced-responsive-video-embedder' ),
497
  ],
498
  'maxwidth' => [
499
  'default' => 0,
500
- 'label' => __( 'Maximal Width', 'advanced-responsive-video-embedder' ),
501
  'type' => 'integer',
502
  'description' => sprintf(
503
  // Translators: $content_width value.
@@ -508,35 +521,80 @@ function all_settings() {
508
  'lightbox_maxwidth' => [
509
  'tag' => 'pro',
510
  'default' => 1174,
511
- 'label' => __( 'Lightbox Maximal Width', 'advanced-responsive-video-embedder' ),
512
  'type' => 'integer',
513
- 'placeholder' => __( 'Leave empty for default from settings page', 'advanced-responsive-video-embedder' ),
514
- 'description' => __( 'default 1174', 'advanced-responsive-video-embedder' ),
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
515
  ],
516
  'align_maxwidth' => [
517
  'default' => 400,
518
  'shortcode' => false,
519
- 'label' => __( 'Align Maximal Width', 'advanced-responsive-video-embedder' ),
520
  'type' => 'integer',
521
  'description' => esc_attr__( 'In px, Needed! Must be 100+ to work.', 'advanced-responsive-video-embedder' ),
522
  ],
523
  'aspect_ratio' => [
524
  'default' => null,
525
  'option' => false,
526
- 'label' => __( 'Aspect Ratio', 'advanced-responsive-video-embedder' ),
527
  'type' => 'string',
528
- 'description' => __( 'E.g. 4:3, 21:9. Only needed in rare cases. ARVE is usually smart enough to figure this out on its own.', 'advanced-responsive-video-embedder' ),
529
- 'placeholder' => __( '4:3, 21:9 ...', 'advanced-responsive-video-embedder' ),
530
  ],
531
  'parameters' => [
532
  'default' => null,
533
  'html5' => false,
534
  'option' => false,
535
- 'label' => __( 'Parameters', 'advanced-responsive-video-embedder' ),
536
  'type' => 'string',
537
- 'placeholder' => __( 'example=1&foo=bar', 'advanced-responsive-video-embedder' ),
538
  'description' => sprintf(
539
- __( 'Provider specific player settings on iframe src. See <a href="%s">documentation.</a>', 'advanced-responsive-video-embedder' ), // phpcs:ignore WordPress.WP.I18n.MissingTranslatorsComment
540
  esc_url( 'https://nextgenthemes.com/plugins/arve/documentation/#parematers' )
541
  ),
542
  ],
@@ -544,111 +602,111 @@ function all_settings() {
544
  'tag' => 'html5',
545
  'default' => true,
546
  'shortcode' => false,
547
- 'label' => __( 'Use ARVE for video files?', 'advanced-responsive-video-embedder' ),
548
  'type' => 'boolean',
549
- 'description' => __( 'Use ARVE to embed HTML5 video files. ARVE uses the browsers players instead of loading the mediaelement player that WP uses.', 'advanced-responsive-video-embedder' ),
550
  ],
551
  'controlslist' => [
552
  'tag' => 'html5',
553
  'default' => '',
554
- 'label' => __( 'Chrome HTML5 Player controls', 'advanced-responsive-video-embedder' ),
555
  'type' => 'string',
556
  'placeholder' => 'nodownload nofullscreen noremoteplayback',
557
- 'description' => __( 'controlsList attribute on &lt;video&gt; for example use <code>nodownload nofullscreen noremoteplayback</code> to hide the download and the fullscreen button on the chrome HTML5 video player and disable remote playback.', 'advanced-responsive-video-embedder' ),
558
  ],
559
  'controls' => [
560
  'tag' => 'html5',
561
  'default' => true,
562
- 'label' => __( 'Show Controls? (Video file only)', 'advanced-responsive-video-embedder' ),
563
  'type' => 'select',
564
  'options' => $def_bool_options,
565
- 'description' => __( 'Show controls on HTML5 video.', 'advanced-responsive-video-embedder' ),
566
  ],
567
  'loop' => [
568
  'tag' => 'html5',
569
  'default' => 'n',
570
  'shortcode' => true,
571
  'option' => false,
572
- 'label' => __( 'Loop?', 'advanced-responsive-video-embedder' ),
573
  'type' => 'boolean',
574
- 'description' => __( 'Loop HTML5 video.', 'advanced-responsive-video-embedder' ),
575
  ],
576
  'muted' => [
577
  'tag' => 'html5',
578
  'default' => 'n',
579
  'shortcode' => true,
580
  'option' => false,
581
- 'label' => __( 'Mute?', 'advanced-responsive-video-embedder' ),
582
  'type' => 'boolean',
583
- 'description' => __( 'Mute HTML5 video.', 'advanced-responsive-video-embedder' ),
584
  ],
585
  'volume' => [
586
  'tag' => 'pro',
587
  'default' => 100,
588
  'shortcode' => true,
589
- 'label' => __( 'Volume?', 'advanced-responsive-video-embedder' ),
590
  'placeholder' => '100',
591
  'type' => 'integer',
592
- 'description' => __( 'Works with video files only.', 'advanced-responsive-video-embedder' ),
593
  ],
594
  'always_enqueue_assets' => [
595
  'shortcode' => false,
596
  'default' => false,
597
- 'label' => __( 'Always load assets', 'advanced-responsive-video-embedder' ),
598
  'type' => 'boolean',
599
- 'description' => __( 'Default=No ARVE will loads its scripts and styles only when the posts content contains a arve video. In case your content is loaded via AJAX at a later stage this detection will not work or the styles are not loaded for another reason you may have to enable this option', 'advanced-responsive-video-embedder' ),
600
  ],
601
  'youtube_nocookie' => [
602
  'default' => true,
603
  'shortcode' => false,
604
- 'label' => __( 'Use youtube-nocookie.com url?', 'advanced-responsive-video-embedder' ),
605
  'type' => 'boolean',
606
- 'description' => __( 'Privacy enhanced mode, will NOT disable cookies but only sets them when a user starts to play a video. There is currently a youtube bug that opens highlighed video boxes with a wrong -nocookie.com url so you need to disble this if you need those.', 'advanced-responsive-video-embedder' ),
607
  ],
608
  'vimeo_api_id' => [
609
- 'tag' => 'randomvideo',
610
  'default' => '',
611
  'shortcode' => false,
612
- 'label' => __( 'Vimeo client identifier', 'advanced-responsive-video-embedder' ),
613
  'type' => 'string',
614
  'description' => sprintf(
615
  // Translators: URL
616
- __( 'Needed for <a href="%s">Random Video Addon</a>.', 'advanced-responsive-video-embedder' ),
617
  esc_url( 'https://nextgenthemes.com/plugins/arve-random-video/' )
618
  ),
619
  'descriptionlink' => esc_url( 'https://nextgenthemes.com/plugins/arve-random-video/' ),
620
  'descriptionlinktext' => esc_html__( 'Random Video Addon', 'advanced-responsive-video-embedder' ),
621
  ],
622
  'vimeo_api_secret' => [
623
- 'tag' => 'randomvideo',
624
  'default' => '',
625
  'shortcode' => false,
626
- 'label' => __( 'Vimeo client secret', 'advanced-responsive-video-embedder' ),
627
  'type' => 'string',
628
  'description' => sprintf(
629
  // Translators: URL
630
- __( 'Needed for <a href="%s">Random Video Addon</a>.', 'advanced-responsive-video-embedder' ),
631
  esc_url( 'https://nextgenthemes.com/plugins/arve-random-video/' )
632
  ),
633
  'descriptionlink' => esc_url( 'https://nextgenthemes.com/plugins/arve-random-video/' ),
634
  'descriptionlinktext' => esc_html__( 'Random Video Addon', 'advanced-responsive-video-embedder' ),
635
  ],
636
  'vimeo_api_token' => [
637
- 'tag' => 'randomvideo',
638
  'default' => '',
639
  'shortcode' => false,
640
- 'label' => __( 'Vimeo API Token', 'advanced-responsive-video-embedder' ),
641
  'type' => 'string',
642
  'description' => sprintf(
643
  // Translators: URL
644
- __( 'Needed for <a href="%s">Random Video Addon</a>.', 'advanced-responsive-video-embedder' ),
645
  esc_url( 'https://nextgenthemes.com/plugins/arve-random-video/' )
646
  ),
647
  'descriptionlink' => esc_url( 'https://nextgenthemes.com/plugins/arve-random-video/' ),
648
  'descriptionlinktext' => esc_html__( 'Random Video Addon', 'advanced-responsive-video-embedder' ),
649
  ],
650
  'random_video_url' => [
651
- 'tag' => 'randomvideo',
652
  'default' => null,
653
  'option' => false,
654
  'shortcode' => true,
@@ -656,22 +714,22 @@ function all_settings() {
656
  'type' => 'string',
657
  'description' => sprintf(
658
  // Translators: URL
659
- __( 'Vimeo showcase URL <a href="%s">(Random Video Addon)</a>.', 'advanced-responsive-video-embedder' ),
660
  esc_url( 'https://nextgenthemes.com/plugins/arve-random-video/' )
661
  ),
662
  'descriptionlink' => esc_url( 'https://nextgenthemes.com/plugins/arve-random-video/' ),
663
  'descriptionlinktext' => esc_html__( 'Random Video Addon', 'advanced-responsive-video-embedder' ),
664
  ],
665
  'random_video_urls' => [
666
- 'tag' => 'randomvideo',
667
  'default' => null,
668
  'option' => false,
669
  'shortcode' => true,
670
- 'label' => esc_html__( 'Random Video URL', 'advanced-responsive-video-embedder' ),
671
  'type' => 'string',
672
  'description' => sprintf(
673
  // Translators: URL
674
- __( 'Video URLs seperated by commas. <a href="%s">(Random Video Addon)</a>.', 'advanced-responsive-video-embedder' ),
675
  esc_url( 'https://nextgenthemes.com/plugins/arve-random-video/' )
676
  ),
677
  'descriptionlink' => esc_url( 'https://nextgenthemes.com/plugins/arve-random-video/' ),
@@ -680,61 +738,61 @@ function all_settings() {
680
  'legacy_shortcodes' => [
681
  'default' => true,
682
  'shortcode' => false,
683
- 'label' => __( 'Enable lagacy shortcodes', 'advanced-responsive-video-embedder' ),
684
  'type' => 'boolean',
685
- 'description' => __( 'Enable the old and deprected <code>[youtube id="abcde" /]</code> or <code>[vimeo id="abcde" /]</code> ... style shortcodes. Only enable if you have them in your content.', 'advanced-responsive-video-embedder' ),
686
  ],
687
  'sandbox' => [
688
  'default' => true,
689
  'shortcode' => true,
690
- 'label' => __( 'Sandbox', 'advanced-responsive-video-embedder' ),
691
  'type' => 'boolean',
692
- 'description' => __( "Only disable if you have to. If you embed encrypted media you have to disable this. 'Disable Links' feature from ARVE Pro will not work when without sandbox.", 'advanced-responsive-video-embedder' ),
693
  ],
694
  'seo_data' => [
695
  'tag' => 'main',
696
  'default' => true,
697
  'shortcode' => false,
698
- 'label' => __( 'Enable structured data (schema.org)', 'advanced-responsive-video-embedder' ),
699
  'type' => 'boolean',
700
- 'description' => __( 'Disable if you use Yoast Video SEO or another plugin that generates the data already.', 'advanced-responsive-video-embedder' ),
701
  ],
702
  'gutenberg_help' => [
703
  'default' => true,
704
  'shortcode' => false,
705
- 'label' => __( 'Enable help text in the Block sidebar?', 'advanced-responsive-video-embedder' ),
706
  'type' => 'boolean',
707
- 'description' => __( 'Disabling this makes the interface much cleaner.', 'advanced-responsive-video-embedder' ),
708
  ],
709
  'feed' => [
710
  'default' => true,
711
  'shortcode' => false,
712
  'option' => true,
713
- 'label' => __( 'Use in RSS/Atom Feeds?', 'advanced-responsive-video-embedder' ),
714
  'type' => 'boolean',
715
- 'description' => __( 'Enable the plugin in RSS/Atom feeds? Disabling will not completely diable everything but it will use native WP behavior in feeds where possible.', 'advanced-responsive-video-embedder' ),
716
  ],
717
  /*
718
  'videojs_theme' => [
719
  'tag' => 'videojs',
720
  'default' => 'default',
721
  'shortcode' => false,
722
- 'label' => __( 'Video.js Theme', 'advanced-responsive-video-embedder' ),
723
  'type' => 'select',
724
  'options' => [
725
- 'default' => __( 'Default', 'advanced-responsive-video-embedder' ),
726
- 'netfoutube' => __( 'Netfoutube', 'advanced-responsive-video-embedder' ),
727
- 'city' => __( 'City', 'advanced-responsive-video-embedder' ),
728
- 'forest' => __( 'Forest', 'advanced-responsive-video-embedder' ),
729
- 'fantasy' => __( 'Fantasy', 'advanced-responsive-video-embedder' ),
730
- 'sea' => __( 'Sea', 'advanced-responsive-video-embedder' ),
731
  ],
732
  ],
733
  'videojs_youtube' => [
734
  'tag' => 'videojs',
735
  'default' => false,
736
  'shortcode' => false,
737
- 'label' => __( 'Use Video.js for YouTube', 'advanced-responsive-video-embedder' ),
738
  'type' => 'boolean',
739
  ],
740
  */
@@ -742,9 +800,9 @@ function all_settings() {
742
  'default' => false,
743
  'shortcode' => false,
744
  'option' => true,
745
- 'label' => __( 'Admin bar ARVE button', 'advanced-responsive-video-embedder' ),
746
  'type' => 'boolean',
747
- 'description' => __( 'For quickly accessing the ARVE settings page.', 'advanced-responsive-video-embedder' ),
748
  ],
749
  ];
750
 
@@ -760,7 +818,7 @@ function all_settings() {
760
  'option' => true,
761
  'shortcode' => false,
762
  // Translators: %s is Provider
763
- 'label' => sprintf( __( '%s url parameters', 'advanced-responsive-video-embedder' ), $provider ),
764
  'type' => 'string',
765
  ];
766
  }
1
  <?php
2
  namespace Nextgenthemes\ARVE;
3
 
4
+ use function \Nextgenthemes\ARVE\Common\kses_basic;
5
+
6
  function options() {
7
  $i = settings_instance();
8
  return $i->get_options();
24
  'namespace' => __NAMESPACE__,
25
  'settings' => settings(),
26
  'sections' => [
27
+ 'main' => esc_html__( 'Main', 'advanced-responsive-video-embedder' ),
28
+ 'pro' => esc_html__( 'Pro', 'advanced-responsive-video-embedder' ),
29
+ 'sticky-videos' => esc_html__( 'Sticky Videos', 'advanced-responsive-video-embedder' ),
30
+ 'random-video' => esc_html__( 'Random Video', 'advanced-responsive-video-embedder' ),
31
+ 'urlparams' => esc_html__( 'URL Parameters', 'advanced-responsive-video-embedder' ),
32
+ 'html5' => esc_html__( 'HTML5', 'advanced-responsive-video-embedder' ),
33
+ 'debug' => esc_html__( 'Debug Info', 'advanced-responsive-video-embedder' ),
34
+ #'videojs' => esc_html__( 'Video.js', 'advanced-responsive-video-embedder' ),
35
  ],
36
+ 'premium_sections' => [ 'pro', 'sticky-videos', 'random-video', 'videojs' ],
37
  'menu_parent_slug' => 'options-general.php',
38
+ 'menu_title' => esc_html__( 'ARVE', 'advanced-responsive-video-embedder' ),
39
+ 'settings_page_title' => esc_html__( 'ARVE Settings', 'advanced-responsive-video-embedder' ),
40
  ]
41
  );
42
  }
153
  'gutenberg' => null,
154
  'src' => null,
155
  'img_srcset' => null,
156
+ 'maxwidth' => null, # Overwriting the option value ON PURPOSE here, see arg_maxwidth
157
  'av1mp4' => null,
158
  'mp4' => null,
159
  'm4v' => null,
242
  }
243
  }
244
 
 
 
 
 
245
  function all_settings() {
246
 
247
  $properties = get_host_properties();
265
  $auto_title = implode( ', ', $auto_title );
266
  $embed_code_only = implode( ', ', $embed_code_only );
267
  $def_bool_options = [
268
+ '' => esc_html__( 'Default (settings page)', 'advanced-responsive-video-embedder' ),
269
+ 'true' => esc_html__( 'True', 'advanced-responsive-video-embedder' ),
270
+ 'false' => esc_html__( 'False', 'advanced-responsive-video-embedder' ),
271
  ];
272
 
273
  $provider_list_link = 'https://nextgenthemes.com/plugins/arve-pro/#video-host-support';
277
  'url' => [
278
  'default' => null,
279
  'option' => false,
280
+ 'label' => esc_html__( 'Video URL / iframe Embed Code', 'advanced-responsive-video-embedder' ),
281
  'type' => 'string',
282
  'placeholder' => esc_attr__( 'Video URL / iframe Embed Code', 'advanced-responsive-video-embedder' ),
283
  'description' => sprintf(
284
  // Translators: %1$s Providers
285
+ kses_basic( __( 'Post the URL of the video here. For %1$s and any <a href="%2$s">unlisted</a> video hosts paste their iframe embed codes.', 'advanced-responsive-video-embedder' ) ),
286
  esc_html( $embed_code_only ),
287
  esc_url( $provider_list_link )
288
  ),
292
  'title' => [
293
  'default' => null,
294
  'option' => false,
295
+ 'label' => esc_html__( 'Title', 'advanced-responsive-video-embedder' ),
296
  'type' => 'string',
297
  'description' => sprintf(
298
  // Translators: Provider list
299
+ kses_basic( __( 'Used for SEO, is visible on top of thumbnails in Lazyload/Lightbox modes, is used as link text in link-lightbox mode. <a href="%1$s">ARVE Pro</a> is able to get them from %2$s automatically.', 'advanced-responsive-video-embedder' ) ),
300
  esc_url( $pro_addon_link ),
301
  esc_html( $auto_title )
302
  ),
306
  'description' => [
307
  'default' => null,
308
  'option' => false,
309
+ 'label' => esc_html__( 'Description', 'advanced-responsive-video-embedder' ),
310
  'type' => 'string',
311
+ 'placeholder' => esc_html__( 'Used for SEO (needed, ARVE Pro auto fills this)', 'advanced-responsive-video-embedder' ),
312
+
313
+ 'description' => sprintf(
314
+ // translators: URL
315
+ kses_basic( __( '<a href="%s">ARVE Pro</a> fills this automatically', 'advanced-responsive-video-embedder' ) ),
316
+ esc_url( $pro_addon_link )
317
+ ),
318
  'descriptionlink' => esc_url( $pro_addon_link ),
319
  'descriptionlinktext' => esc_html__( 'ARVE Pro', 'advanced-responsive-video-embedder' ),
320
  ],
321
  'upload_date' => [
322
  'default' => null,
323
  'option' => false,
324
+ 'label' => esc_html__( 'Upload Date', 'advanced-responsive-video-embedder' ),
325
  'type' => 'string',
326
+ 'placeholder' => esc_html__( '2019-09-29 (ARVE Pro fills this with post date)', 'advanced-responsive-video-embedder' ),
327
+ 'description' => sprintf(
328
+ // translators: URL
329
+ kses_basic( __( '<a href="%s">ARVE Pro</a> fills this automatically', 'advanced-responsive-video-embedder' ) ),
330
+ esc_url( $pro_addon_link )
331
+ ),
332
  'descriptionlink' => esc_url( $pro_addon_link ),
333
  'descriptionlinktext' => esc_html__( 'ARVE Pro', 'advanced-responsive-video-embedder' ),
334
  ],
335
  'mode' => [
336
  'tag' => 'pro',
337
  'default' => 'normal',
338
+ 'label' => esc_html__( 'Mode', 'advanced-responsive-video-embedder' ),
339
  'type' => 'select',
340
+ 'options' => [
341
+ '' => esc_html__( 'Default (settings page)', 'advanced-responsive-video-embedder' ),
342
+ 'lazyload' => esc_html__( 'Lazyload', 'advanced-responsive-video-embedder' ),
343
+ 'lightbox' => esc_html__( 'Lightbox', 'advanced-responsive-video-embedder' ),
344
+ 'link-lightbox' => esc_html__( 'Link -> Lightbox', 'advanced-responsive-video-embedder' ),
345
+ ],
346
  'description' => sprintf(
347
+ // translators: URL
348
+ kses_basic( __( 'For Lazyload, Lightbox and Link mode check out <a href="%s">ARVE Pro</a>. Only use normal when Pro is not installed!', 'advanced-responsive-video-embedder' ) ),
349
  'https://nextgenthemes.com/plugins/arve-pro/'
350
  ),
351
  'descriptionlink' => esc_url( $pro_addon_link ),
356
  'default' => '',
357
  'ui' => 'image_upload',
358
  'shortcode' => false,
359
+ 'label' => esc_html__( 'Thumbnail Fallback', 'advanced-responsive-video-embedder' ),
360
  'type' => 'string',
361
+ 'placeholder' => esc_html__( 'URL or media gallery image ID used for thumbnail', 'advanced-responsive-video-embedder' ),
362
+ 'description' => esc_html__( 'URL or media gallery image ID used for thumbnail', 'advanced-responsive-video-embedder' ),
363
  ],
364
  'thumbnail_post_image_fallback' => [
365
  'tag' => 'pro',
366
  'default' => false,
367
  'shortcode' => false,
368
+ 'label' => esc_html__( 'Thumbnail Featured Image Fallback', 'advanced-responsive-video-embedder' ),
369
  'type' => 'boolean',
370
  ],
371
  'thumbnail' => [
372
  'default' => null,
373
  'shortcode' => true,
374
  'option' => false,
375
+ 'label' => esc_html__( 'Thumbnail', 'advanced-responsive-video-embedder' ),
376
  'type' => 'attachment',
377
  'libraryType' => [ 'image' ],
378
+ 'addButton' => esc_html__( 'Select Image', 'advanced-responsive-video-embedder' ),
379
+ 'frameTitle' => esc_html__( 'Select Image', 'advanced-responsive-video-embedder' ),
380
+ 'placeholder' => esc_html__( 'Media library image ID or image URL', 'advanced-responsive-video-embedder' ),
381
  'description' => sprintf(
382
  // Translators: 1 Link, 2 Provider list
383
+ kses_basic( __( 'Media library image ID (Select above in Gutenberg) or image URL for preview image for Lazyload modes, always used for SEO. <a href="%1$s">ARVE Pro</a> is able to get them from %2$s automatically.', 'advanced-responsive-video-embedder' ) ),
384
  esc_url( $pro_addon_link ),
385
  esc_html( $auto_thumbs )
386
  ),
391
  'default' => false,
392
  'shortcode' => true,
393
  'tag' => 'pro',
394
+ 'label' => esc_html__( 'Hide Title (Lazyload & Lightbox only)', 'advanced-responsive-video-embedder' ),
395
  'type' => 'boolean',
396
+ 'description' => esc_html__( 'Usefull when the thumbnail image already displays the video title (Lazyload & Lightbox modes).', 'advanced-responsive-video-embedder' ),
397
  ],
398
  'grow' => [
399
  'tag' => 'pro',
400
  'default' => true,
401
  'type' => 'select',
402
  'options' => $def_bool_options,
403
+ 'label' => esc_html__( 'Expand on play? (Lazyload only)', 'advanced-responsive-video-embedder' ),
404
+ 'description' => esc_html__( 'Expands video size after clicking the thumbnail (Lazyload Mode)', 'advanced-responsive-video-embedder' ),
405
  ],
406
  'fullscreen' => [
407
  'tag' => 'pro',
408
  'default' => 'disabled',
409
  'type' => 'select',
410
+ 'label' => esc_html__( 'Go Fullscreen on opening Lightbox?', 'advanced-responsive-video-embedder' ),
411
+ 'desc_detail' => esc_html__( 'Makes the Browser go fullscreen when opening the Lighbox. Optionally stay in Fullscreen mode even after the Lightbox is closed', 'advanced-responsive-video-embedder' ),
412
  'options' => [
413
+ '' => esc_html__( 'Default (settings page)', 'advanced-responsive-video-embedder' ),
414
+ 'enabled-exit' => esc_html__( 'Enabled, exit FS on lightbox close', 'advanced-responsive-video-embedder' ),
415
+ 'enabled-stick' => esc_html__( 'Enabled, stay FS on lightbox close', 'advanced-responsive-video-embedder' ),
416
+ 'disabled' => esc_html__( 'Disabled', 'advanced-responsive-video-embedder' ),
417
  ],
418
  ],
419
  'play_icon_style' => [
420
  'tag' => 'pro',
421
  'default' => 'youtube',
422
+ 'label' => esc_html__( 'Play Button', 'advanced-responsive-video-embedder' ),
423
  'type' => 'select',
424
  'options' => [
425
  // Translators: 1 %s is play icon style.
426
+ '' => esc_html__( 'Default (settings page)', 'advanced-responsive-video-embedder' ),
427
+ 'youtube' => esc_html__( 'Youtube', 'advanced-responsive-video-embedder' ),
428
+ 'youtube-red-diamond' => esc_html__( 'Youtube Red Diamond', 'advanced-responsive-video-embedder' ),
429
+ 'vimeo' => esc_html__( 'Vimeo', 'advanced-responsive-video-embedder' ),
430
+ 'circle' => esc_html__( 'Circle', 'advanced-responsive-video-embedder' ),
431
+ 'none' => esc_html__( 'No play image', 'advanced-responsive-video-embedder' ),
432
+ 'custom' => esc_html__( 'Custom (for PHP filter)', 'advanced-responsive-video-embedder' ),
433
  ],
434
  ],
435
  'hover_effect' => [
436
  'tag' => 'pro',
437
  'default' => 'zoom',
438
+ 'label' => esc_html__( 'Hover Effect (Lazyload/Lightbox only)', 'advanced-responsive-video-embedder' ),
439
  'type' => 'select',
440
  'options' => [
441
+ '' => esc_html__( 'Default (settings page)', 'advanced-responsive-video-embedder' ),
442
+ 'zoom' => esc_html__( 'Zoom Thumbnail', 'advanced-responsive-video-embedder' ),
443
+ 'rectangle' => esc_html__( 'Move Rectangle in', 'advanced-responsive-video-embedder' ),
444
+ 'none' => esc_html__( 'None', 'advanced-responsive-video-embedder' ),
445
  ],
446
  ],
447
  'disable_links' => [
448
  'tag' => 'pro',
449
  'default' => false,
450
+ 'label' => esc_html__( 'Disable links', 'advanced-responsive-video-embedder' ),
451
  'type' => 'select',
452
  'options' => $def_bool_options,
453
+ 'description' => esc_html__( 'Prevent embeds to open new popups/tabs from links inside video embeds. Note: breaks functionality like sharing.', 'advanced-responsive-video-embedder' ),
454
  ],
455
  // 'mobile_inview' => [
456
  // 'tag' => 'pro',
457
  // 'default' => true,
458
  // 'shortcode' => false,
459
+ // 'label' => esc_html__( 'Mobile Inview Fallback', 'advanced-responsive-video-embedder' ),
460
  // 'type' => 'boolean',
461
+ // 'description' => esc_html__( 'This is not needed/used for YouTube and Vimeo. On mobiles fallback Lazyload mode to Lazyload Inview as workarround for the problem that it otherwise needs two touches to play a lazyloaded video because mobile browsers prevent autoplay. Note that this will prevent users to see your custom thumbnails or titles!', 'advanced-responsive-video-embedder' ),
462
  // ],
463
  'align' => [
464
  'default' => 'none',
465
  'shortcode' => true,
466
+ 'label' => esc_html__( 'Alignment', 'advanced-responsive-video-embedder' ),
467
  'type' => 'select',
468
  'options' => [
469
+ '' => esc_html__( 'Default (settings page)', 'advanced-responsive-video-embedder' ),
470
+ 'none' => esc_html__( 'None', 'advanced-responsive-video-embedder' ),
471
+ 'left' => esc_html__( 'Left', 'advanced-responsive-video-embedder' ),
472
+ 'right' => esc_html__( 'Right', 'advanced-responsive-video-embedder' ),
473
+ 'center' => esc_html__( 'Center', 'advanced-responsive-video-embedder' ),
474
  ],
475
  ],
476
  'lightbox_script' => [
477
  'tag' => 'pro',
478
  'default' => 'bigpicture',
479
  'shortcode' => false,
480
+ 'label' => esc_html__( 'Lightbox Script', 'advanced-responsive-video-embedder' ),
481
  'type' => 'select',
482
  'options' => [
483
+ 'bigpicture' => esc_html__( 'BigPicture', 'advanced-responsive-video-embedder' ),
484
+ 'lity' => esc_html__( 'Lity', 'advanced-responsive-video-embedder' ),
485
  ],
486
+ 'description' => esc_html__( 'Only use Lity if you have issues with Big Picture', 'advanced-responsive-video-embedder' ),
487
  ],
488
  'arve_link' => [
489
  'default' => false,
490
+ 'label' => esc_html__( 'ARVE Link', 'advanced-responsive-video-embedder' ),
491
  'type' => 'select',
492
  'options' => $def_bool_options,
493
+ 'description' => esc_html__( "Shows a small 'ARVE' link below the videos. Be the most awesome person and help promoting this plugin.", 'advanced-responsive-video-embedder' ),
494
  ],
495
  'duration' => [
496
  'default' => null,
497
  'option' => false,
498
+ 'label' => esc_html__( 'Duration', 'advanced-responsive-video-embedder' ),
499
  'type' => 'string',
500
  'placeholder' => '1H2M3S',
501
+ 'description' => esc_html__( '`1H2M3S` for 1 hour, 2 minutes and 3 seconds. `5M` for 5 minutes.', 'advanced-responsive-video-embedder' ),
502
  ],
503
  'autoplay' => [
504
  'default' => false,
505
  'shortcode' => true,
506
+ 'label' => esc_html__( 'Autoplay', 'advanced-responsive-video-embedder' ),
507
  'type' => 'select',
508
  'options' => $def_bool_options,
509
+ 'description' => esc_html__( 'Do not expect this to work! Browsers (especially mobile) or user settings prevent it, some video hosts do not support it at all. Only used in normal mode. ARVE will mute HTML5 video playback in case to make autoplay work for the broadest audience.', 'advanced-responsive-video-embedder' ),
510
  ],
511
  'maxwidth' => [
512
  'default' => 0,
513
+ 'label' => esc_html__( 'Maximal Width', 'advanced-responsive-video-embedder' ),
514
  'type' => 'integer',
515
  'description' => sprintf(
516
  // Translators: $content_width value.
521
  'lightbox_maxwidth' => [
522
  'tag' => 'pro',
523
  'default' => 1174,
524
+ 'label' => esc_html__( 'Lightbox Maximal Width', 'advanced-responsive-video-embedder' ),
525
  'type' => 'integer',
526
+ 'placeholder' => esc_html__( 'Leave empty for default from settings page', 'advanced-responsive-video-embedder' ),
527
+ 'description' => esc_html__( 'default 1174', 'advanced-responsive-video-embedder' ),
528
+ ],
529
+ 'sticky_width' => [
530
+ 'tag' => 'sticky-videos',
531
+ 'default' => '350px',
532
+ 'shortcode' => false,
533
+ 'label' => esc_html__( 'Sticky Video Width', 'advanced-responsive-video-embedder' ),
534
+ 'type' => 'string',
535
+ 'description' => esc_attr__( 'CSS value (px, vw, ...) 350px is default.', 'advanced-responsive-video-embedder' ),
536
+ ],
537
+ 'sticky_gap' => [
538
+ 'tag' => 'sticky-videos',
539
+ 'default' => '0',
540
+ 'shortcode' => false,
541
+ 'label' => esc_html__( 'Sticky Video Corner Gap', 'advanced-responsive-video-embedder' ),
542
+ 'type' => 'string',
543
+ 'description' => esc_attr__( 'CSS value (px, vw, ...).', 'advanced-responsive-video-embedder' ),
544
+ ],
545
+ 'sticky_close_btn_pos_x' => [
546
+ 'tag' => 'sticky-videos',
547
+ 'default' => '0',
548
+ 'shortcode' => false,
549
+ 'label' => esc_html__( 'Close Button Position X', 'advanced-responsive-video-embedder' ),
550
+ 'type' => 'string',
551
+ 'description' => esc_attr__( 'The base poition is always in the corner pointing to the middle of the screem, nagative values will position the button outside of video.', 'advanced-responsive-video-embedder' ),
552
+ ],
553
+ 'sticky_close_btn_pos_y' => [
554
+ 'tag' => 'sticky-videos',
555
+ 'default' => '-15px',
556
+ 'shortcode' => false,
557
+ 'label' => esc_html__( 'Close Button Position X', 'advanced-responsive-video-embedder' ),
558
+ 'type' => 'string',
559
+ 'description' => esc_attr__( 'The base poition is always in the corner pointing to the middle of the screem, nagative values will position the button outside of video.', 'advanced-responsive-video-embedder' ),
560
+ ],
561
+ 'sticky_pos' => [
562
+ 'tag' => 'sticky-videos',
563
+ 'default' => 'top-left',
564
+ 'label' => esc_html__( 'Sticky Video Position', 'advanced-responsive-video-embedder' ),
565
+ 'type' => 'select',
566
+ 'options' => [
567
+ 'top-left' => esc_html__( 'Top left', 'advanced-responsive-video-embedder' ),
568
+ 'top-right' => esc_html__( 'Top right', 'advanced-responsive-video-embedder' ),
569
+ 'bottom-left' => esc_html__( 'Bottom left', 'advanced-responsive-video-embedder' ),
570
+ 'bottom-right' => esc_html__( 'Bottom right', 'advanced-responsive-video-embedder' ),
571
+ ],
572
+ 'description' => esc_attr__( 'Corner the video gets pinned to on bigger screens.', 'advanced-responsive-video-embedder' ),
573
  ],
574
  'align_maxwidth' => [
575
  'default' => 400,
576
  'shortcode' => false,
577
+ 'label' => esc_html__( 'Align Maximal Width', 'advanced-responsive-video-embedder' ),
578
  'type' => 'integer',
579
  'description' => esc_attr__( 'In px, Needed! Must be 100+ to work.', 'advanced-responsive-video-embedder' ),
580
  ],
581
  'aspect_ratio' => [
582
  'default' => null,
583
  'option' => false,
584
+ 'label' => esc_html__( 'Aspect Ratio', 'advanced-responsive-video-embedder' ),
585
  'type' => 'string',
586
+ 'description' => esc_html__( 'E.g. 4:3, 21:9. Only needed in rare cases. ARVE is usually smart enough to figure this out on its own.', 'advanced-responsive-video-embedder' ),
587
+ 'placeholder' => esc_html__( '4:3, 21:9 ...', 'advanced-responsive-video-embedder' ),
588
  ],
589
  'parameters' => [
590
  'default' => null,
591
  'html5' => false,
592
  'option' => false,
593
+ 'label' => esc_html__( 'Parameters', 'advanced-responsive-video-embedder' ),
594
  'type' => 'string',
595
+ 'placeholder' => esc_html__( 'example=1&foo=bar', 'advanced-responsive-video-embedder' ),
596
  'description' => sprintf(
597
+ kses_basic( __( 'Provider specific player settings on iframe src. See <a href="%s">documentation.</a>', 'advanced-responsive-video-embedder' ) ), // phpcs:ignore WordPress.WP.I18n.MissingTranslatorsComment
598
  esc_url( 'https://nextgenthemes.com/plugins/arve/documentation/#parematers' )
599
  ),
600
  ],
602
  'tag' => 'html5',
603
  'default' => true,
604
  'shortcode' => false,
605
+ 'label' => esc_html__( 'Use ARVE for video files?', 'advanced-responsive-video-embedder' ),
606
  'type' => 'boolean',
607
+ 'description' => esc_html__( 'Use ARVE to embed HTML5 video files. ARVE uses the browsers players instead of loading the mediaelement player that WP uses.', 'advanced-responsive-video-embedder' ),
608
  ],
609
  'controlslist' => [
610
  'tag' => 'html5',
611
  'default' => '',
612
+ 'label' => esc_html__( 'Chrome HTML5 Player controls', 'advanced-responsive-video-embedder' ),
613
  'type' => 'string',
614
  'placeholder' => 'nodownload nofullscreen noremoteplayback',
615
+ 'description' => kses_basic( __( 'controlsList attribute on &lt;video&gt; for example use <code>nodownload nofullscreen noremoteplayback</code> to hide the download and the fullscreen button and disable remote playback. Or just the option(s) you like.', 'advanced-responsive-video-embedder' ) ),
616
  ],
617
  'controls' => [
618
  'tag' => 'html5',
619
  'default' => true,
620
+ 'label' => esc_html__( 'Show Controls? (Video file only)', 'advanced-responsive-video-embedder' ),
621
  'type' => 'select',
622
  'options' => $def_bool_options,
623
+ 'description' => esc_html__( 'Show controls on HTML5 video.', 'advanced-responsive-video-embedder' ),
624
  ],
625
  'loop' => [
626
  'tag' => 'html5',
627
  'default' => 'n',
628
  'shortcode' => true,
629
  'option' => false,
630
+ 'label' => esc_html__( 'Loop?', 'advanced-responsive-video-embedder' ),
631
  'type' => 'boolean',
632
+ 'description' => esc_html__( 'Loop HTML5 video.', 'advanced-responsive-video-embedder' ),
633
  ],
634
  'muted' => [
635
  'tag' => 'html5',
636
  'default' => 'n',
637
  'shortcode' => true,
638
  'option' => false,
639
+ 'label' => esc_html__( 'Mute?', 'advanced-responsive-video-embedder' ),
640
  'type' => 'boolean',
641
+ 'description' => esc_html__( 'Mute HTML5 video.', 'advanced-responsive-video-embedder' ),
642
  ],
643
  'volume' => [
644
  'tag' => 'pro',
645
  'default' => 100,
646
  'shortcode' => true,
647
+ 'label' => esc_html__( 'Volume?', 'advanced-responsive-video-embedder' ),
648
  'placeholder' => '100',
649
  'type' => 'integer',
650
+ 'description' => esc_html__( 'Works with video files only.', 'advanced-responsive-video-embedder' ),
651
  ],
652
  'always_enqueue_assets' => [
653
  'shortcode' => false,
654
  'default' => false,
655
+ 'label' => esc_html__( 'Always load assets', 'advanced-responsive-video-embedder' ),
656
  'type' => 'boolean',
657
+ 'description' => esc_html__( 'Default=No ARVE will loads its scripts and styles only when the posts content contains a arve video. In case your content is loaded via AJAX at a later stage this detection will not work or the styles are not loaded for another reason you may have to enable this option', 'advanced-responsive-video-embedder' ),
658
  ],
659
  'youtube_nocookie' => [
660
  'default' => true,
661
  'shortcode' => false,
662
+ 'label' => esc_html__( 'Use youtube-nocookie.com url?', 'advanced-responsive-video-embedder' ),
663
  'type' => 'boolean',
664
+ 'description' => esc_html__( 'Privacy enhanced mode, will NOT disable cookies but only sets them when a user starts to play a video. There is currently a youtube bug that opens highlighed video boxes with a wrong -nocookie.com url so you need to disble this if you need those.', 'advanced-responsive-video-embedder' ),
665
  ],
666
  'vimeo_api_id' => [
667
+ 'tag' => 'random-video',
668
  'default' => '',
669
  'shortcode' => false,
670
+ 'label' => esc_html__( 'Vimeo client identifier', 'advanced-responsive-video-embedder' ),
671
  'type' => 'string',
672
  'description' => sprintf(
673
  // Translators: URL
674
+ kses_basic( __( 'Needed for <a href="%s">Random Video Addon</a>.', 'advanced-responsive-video-embedder' ) ),
675
  esc_url( 'https://nextgenthemes.com/plugins/arve-random-video/' )
676
  ),
677
  'descriptionlink' => esc_url( 'https://nextgenthemes.com/plugins/arve-random-video/' ),
678
  'descriptionlinktext' => esc_html__( 'Random Video Addon', 'advanced-responsive-video-embedder' ),
679
  ],
680
  'vimeo_api_secret' => [
681
+ 'tag' => 'random-video',
682
  'default' => '',
683
  'shortcode' => false,
684
+ 'label' => esc_html__( 'Vimeo client secret', 'advanced-responsive-video-embedder' ),
685
  'type' => 'string',
686
  'description' => sprintf(
687
  // Translators: URL
688
+ kses_basic( __( 'Needed for <a href="%s">Random Video Addon</a>.', 'advanced-responsive-video-embedder' ) ),
689
  esc_url( 'https://nextgenthemes.com/plugins/arve-random-video/' )
690
  ),
691
  'descriptionlink' => esc_url( 'https://nextgenthemes.com/plugins/arve-random-video/' ),
692
  'descriptionlinktext' => esc_html__( 'Random Video Addon', 'advanced-responsive-video-embedder' ),
693
  ],
694
  'vimeo_api_token' => [
695
+ 'tag' => 'random-video',
696
  'default' => '',
697
  'shortcode' => false,
698
+ 'label' => esc_html__( 'Vimeo API Token', 'advanced-responsive-video-embedder' ),
699
  'type' => 'string',
700
  'description' => sprintf(
701
  // Translators: URL
702
+ kses_basic( __( 'Needed for <a href="%s">Random Video Addon</a>.', 'advanced-responsive-video-embedder' ) ),
703
  esc_url( 'https://nextgenthemes.com/plugins/arve-random-video/' )
704
  ),
705
  'descriptionlink' => esc_url( 'https://nextgenthemes.com/plugins/arve-random-video/' ),
706
  'descriptionlinktext' => esc_html__( 'Random Video Addon', 'advanced-responsive-video-embedder' ),
707
  ],
708
  'random_video_url' => [
709
+ 'tag' => 'random-video',
710
  'default' => null,
711
  'option' => false,
712
  'shortcode' => true,
714
  'type' => 'string',
715
  'description' => sprintf(
716
  // Translators: URL
717
+ kses_basic( __( 'Youtube Playlist or Vimeo showcase URL<a href="%s">(Random Video Addon)</a>.', 'advanced-responsive-video-embedder' ) ),
718
  esc_url( 'https://nextgenthemes.com/plugins/arve-random-video/' )
719
  ),
720
  'descriptionlink' => esc_url( 'https://nextgenthemes.com/plugins/arve-random-video/' ),
721
  'descriptionlinktext' => esc_html__( 'Random Video Addon', 'advanced-responsive-video-embedder' ),
722
  ],
723
  'random_video_urls' => [
724
+ 'tag' => 'random-video',
725
  'default' => null,
726
  'option' => false,
727
  'shortcode' => true,
728
+ 'label' => esc_html__( 'Random Video URLs', 'advanced-responsive-video-embedder' ),
729
  'type' => 'string',
730
  'description' => sprintf(
731
  // Translators: URL
732
+ kses_basic( __( 'Video URLs seperated by commas. <a href="%s">(Random Video Addon)</a>.', 'advanced-responsive-video-embedder' ) ),
733
  esc_url( 'https://nextgenthemes.com/plugins/arve-random-video/' )
734
  ),
735
  'descriptionlink' => esc_url( 'https://nextgenthemes.com/plugins/arve-random-video/' ),
738
  'legacy_shortcodes' => [
739
  'default' => true,
740
  'shortcode' => false,
741
+ 'label' => esc_html__( 'Enable lagacy shortcodes', 'advanced-responsive-video-embedder' ),
742
  'type' => 'boolean',
743
+ 'description' => esc_html__( 'Enable the old and deprected <code>[youtube id="abcde" /]</code> or <code>[vimeo id="abcde" /]</code> ... style shortcodes. Only enable if you have them in your content.', 'advanced-responsive-video-embedder' ),
744
  ],
745
  'sandbox' => [
746
  'default' => true,
747
  'shortcode' => true,
748
+ 'label' => esc_html__( 'Sandbox', 'advanced-responsive-video-embedder' ),
749
  'type' => 'boolean',
750
+ 'description' => esc_html__( "Only disable if you have to. If you embed encrypted media you have to disable this. 'Disable Links' feature from ARVE Pro will not work when without sandbox.", 'advanced-responsive-video-embedder' ),
751
  ],
752
  'seo_data' => [
753
  'tag' => 'main',
754
  'default' => true,
755
  'shortcode' => false,
756
+ 'label' => esc_html__( 'Enable structured data (schema.org)', 'advanced-responsive-video-embedder' ),
757
  'type' => 'boolean',
758
+ 'description' => esc_html__( 'Disable if you use Yoast Video SEO or another plugin that generates the data already.', 'advanced-responsive-video-embedder' ),
759
  ],
760
  'gutenberg_help' => [
761
  'default' => true,
762
  'shortcode' => false,
763
+ 'label' => esc_html__( 'Enable help text in the Block sidebar?', 'advanced-responsive-video-embedder' ),
764
  'type' => 'boolean',
765
+ 'description' => esc_html__( 'Disabling this makes the interface much cleaner.', 'advanced-responsive-video-embedder' ),
766
  ],
767
  'feed' => [
768
  'default' => true,
769
  'shortcode' => false,
770
  'option' => true,
771
+ 'label' => esc_html__( 'Use in RSS/Atom Feeds?', 'advanced-responsive-video-embedder' ),
772
  'type' => 'boolean',
773
+ 'description' => esc_html__( 'Enable the plugin in RSS/Atom feeds? Disabling will not completely diable everything but it will use native WP behavior in feeds where possible.', 'advanced-responsive-video-embedder' ),
774
  ],
775
  /*
776
  'videojs_theme' => [
777
  'tag' => 'videojs',
778
  'default' => 'default',
779
  'shortcode' => false,
780
+ 'label' => esc_html__( 'Video.js Theme', 'advanced-responsive-video-embedder' ),
781
  'type' => 'select',
782
  'options' => [
783
+ 'default' => esc_html__( 'Default', 'advanced-responsive-video-embedder' ),
784
+ 'netfoutube' => esc_html__( 'Netfoutube', 'advanced-responsive-video-embedder' ),
785
+ 'city' => esc_html__( 'City', 'advanced-responsive-video-embedder' ),
786
+ 'forest' => esc_html__( 'Forest', 'advanced-responsive-video-embedder' ),
787
+ 'fantasy' => esc_html__( 'Fantasy', 'advanced-responsive-video-embedder' ),
788
+ 'sea' => esc_html__( 'Sea', 'advanced-responsive-video-embedder' ),
789
  ],
790
  ],
791
  'videojs_youtube' => [
792
  'tag' => 'videojs',
793
  'default' => false,
794
  'shortcode' => false,
795
+ 'label' => esc_html__( 'Use Video.js for YouTube', 'advanced-responsive-video-embedder' ),
796
  'type' => 'boolean',
797
  ],
798
  */
800
  'default' => false,
801
  'shortcode' => false,
802
  'option' => true,
803
+ 'label' => esc_html__( 'Admin bar ARVE button', 'advanced-responsive-video-embedder' ),
804
  'type' => 'boolean',
805
+ 'description' => esc_html__( 'For quickly accessing the ARVE settings page.', 'advanced-responsive-video-embedder' ),
806
  ],
807
  ];
808
 
818
  'option' => true,
819
  'shortcode' => false,
820
  // Translators: %s is Provider
821
+ 'label' => sprintf( esc_html__( '%s url parameters', 'advanced-responsive-video-embedder' ), $provider ),
822
  'type' => 'string',
823
  ];
824
  }
php/functions-shortcode-filters.php CHANGED
@@ -1,29 +1,49 @@
1
  <?php
2
  namespace Nextgenthemes\ARVE;
3
 
4
- function sc_filter_set_uid( array $a ) {
 
 
 
 
 
 
 
5
 
6
- if ( has_fatal_error( $a ) ) {
7
  return $a;
8
  }
9
 
10
- static $i = 1;
 
 
11
 
12
- $a['uid'] = sanitize_key( uniqid( "arve-{$a['provider']}-{$a['id']}-$i", true) );
13
 
14
- $i++;
 
 
 
 
15
 
16
- return $a;
17
- }
18
 
19
- function sc_filter_aspect_ratio( array $a ) {
 
 
 
 
20
 
21
- if ( has_fatal_error( $a ) ) {
22
- return $a;
23
  }
 
 
 
 
 
 
24
 
25
  if ( ! empty( $a['aspect_ratio'] ) ) {
26
- return $a;
27
  }
28
 
29
  if ( ! empty( $a['oembed_data']->width ) && ! empty( $a['oembed_data']->height ) ) {
@@ -44,189 +64,49 @@ function sc_filter_aspect_ratio( array $a ) {
44
  $a['aspect_ratio'] = aspect_ratio_gcd( $a['aspect_ratio'] );
45
  }
46
 
47
- return $a;
48
  }
49
 
50
- function sc_filter_dimensions( array $a ) {
51
-
52
- if ( has_fatal_error( $a ) ) {
53
- return $a;
54
- }
55
-
56
- $a['width'] = $a['maxwidth'];
57
-
58
- if ( $a['aspect_ratio'] ) {
59
- $a['height'] = new_height_from_aspect_ratio( $a['width'], $a['aspect_ratio'] );
60
- }
61
-
62
- return $a;
63
- }
64
-
65
- function sc_filter_maxwidth( array $a ) {
66
-
67
- if ( has_fatal_error( $a ) ) {
68
- return $a;
69
- }
70
 
71
  $options = options();
72
 
73
- if ( empty( $a['maxwidth'] ) ) {
74
 
75
- if ( in_array( $a['align'], [ 'left', 'right', 'center' ], true ) ) {
76
- $a['maxwidth'] = (int) $options['align_maxwidth'];
77
  } elseif ( empty( $options['maxwidth'] ) ) {
78
- $a['maxwidth'] = (int) empty( $GLOBALS['content_width'] ) ? DEFAULT_MAXWIDTH : $GLOBALS['content_width'];
79
  } else {
80
- $a['maxwidth'] = (int) $options['maxwidth'];
81
  }
82
  }
83
 
84
- if ( $a['maxwidth'] < 50 ) {
85
- $a['errors']->add( 'no-maxwidth', __( 'Maxwidth needs to be 50+', 'advanced-responsive-video-embedder' ) );
86
  }
87
 
88
- return $a;
89
  }
90
 
91
- function sc_filter_liveleak_id_fix( array $a ) {
92
-
93
- if ( has_fatal_error( $a ) ) {
94
- return $a;
95
- }
96
 
97
  if ( 'liveleak' !== $a['provider'] ) {
98
- return $a;
99
  }
100
 
101
- if ( Common\starts_with( $a['id'], 't=' ) ) {
102
  $a['id'][0] = 'i';
103
- } elseif ( ! Common\starts_with( $a['id'], 'i=' )
104
- && ! Common\starts_with( $a['id'], 'f=' )
105
  ) {
106
  $a['id'] = 'i=' . $a['id'];
107
  }
108
 
109
- return $a;
110
- }
111
-
112
- function sc_filter_mode( array $a ) {
113
-
114
- if ( has_fatal_error( $a ) ) {
115
- return $a;
116
- }
117
-
118
- if ( 'lazyload-lightbox' === $a['mode'] ) {
119
- $a['mode'] = 'lightbox';
120
- }
121
-
122
- if ( 'thumbnail' === $a['mode'] ) {
123
- $a['mode'] = 'lazyload';
124
- }
125
-
126
- $supported_modes = get_supported_modes();
127
-
128
- if ( ! array_key_exists( $a['mode'], $supported_modes ) ) {
129
-
130
- $err_msg = sprintf(
131
- // Translators: Mode
132
- __( 'Mode: %s not available (ARVE Pro not active?), switching to normal mode', 'advanced-responsive-video-embedder' ),
133
- $a['mode']
134
- );
135
- $a['errors']->add( 'mode-not-avail', $err_msg );
136
- $a['mode'] = 'normal';
137
- }
138
-
139
- return apply_filters( 'nextgenthemes/arve/sc_filter/mode', $a );
140
- }
141
-
142
- function sc_filter_validate( array $a ) {
143
-
144
- if ( has_fatal_error( $a ) ) {
145
- return $a;
146
- }
147
-
148
- foreach ( $a as $key => $value ) {
149
-
150
- switch ( $key ) {
151
- case 'errors':
152
- break;
153
- case 'url_handler':
154
- if ( null !== $value && ! is_array( $value ) ) {
155
- $a['errors']->add( 2, 'url_handler needs to be null or array' . $value );
156
- }
157
- break;
158
- case 'oembed_data':
159
- if ( null !== $value && ! is_object( $value ) ) {
160
- $a['errors']->add( 'oembed_data', 'oembed_data needs to be null or a object' );
161
- }
162
- break;
163
- default:
164
- if ( null !== $value && ! is_string( $value ) ) {
165
- $a['errors']->add( 2, "$key must be null or string" );
166
- }
167
- break;
168
- }
169
- }
170
-
171
- foreach ( bool_shortcode_args() as $boolattr ) {
172
- $a = validate_bool( $a, $boolattr );
173
- };
174
- unset( $boolattr );
175
-
176
- $url_args = VIDEO_FILE_EXTENSIONS;
177
- $url_args[] = 'url';
178
- $url_args[] = 'src';
179
-
180
- foreach ( $url_args as $urlattr ) {
181
- $a = validate_url( $a, $urlattr );
182
- };
183
- unset( $urlattr );
184
-
185
- $a = validate_align( $a );
186
- $a = validate_aspect_ratio( $a );
187
-
188
- return apply_filters( 'nextgenthemes/arve/sc_filter/validate', $a );
189
- }
190
-
191
- function sc_filter_validate_again( array $a ) {
192
-
193
- if ( has_fatal_error( $a ) ) {
194
- return $a;
195
- }
196
-
197
- if ( 'html5' !== $a['provider'] ) {
198
-
199
- if ( ! is_int( $a['width'] ) ) {
200
- $a['width'] = (int) $a['width'];
201
- $a['errors']->add( 'width', '<code>width</code> must be int' );
202
- }
203
-
204
- if ( ! is_int( $a['height'] ) ) {
205
- $a['height'] = (int) $a['height'];
206
- $a['errors']->add( 'height', '<code>height</code> must be int' );
207
- }
208
- }
209
-
210
- foreach ( $a as $key => $val ) {
211
-
212
- if ( 'oembed_data' === $key && ! is_object( $a[ $attr ] ) && ! is_null( $a[ $attr ] ) ) {
213
- $a['errors']->add( 'not bool', $attr . ' must be object' );
214
- }
215
-
216
- if ( in_array( $key, bool_shortcode_args(), true ) && ! is_bool( $a[ $attr ] ) ) {
217
- $a['errors']->add( 'not bool', $attr . ' must be bool' );
218
- }
219
- }
220
- unset( $attr );
221
-
222
- return $a;
223
  }
224
 
225
- function sc_filter_autoplay( array $a ) {
226
-
227
- if ( has_fatal_error( $a ) ) {
228
- return $a;
229
- }
230
 
231
  if ( 'normal' === $a['mode'] ) { // Prevent more then one vid autoplaying
232
 
@@ -241,102 +121,21 @@ function sc_filter_autoplay( array $a ) {
241
  }
242
  }
243
 
244
- return apply_filters( 'nextgenthemes/arve/sc_filter/autoplay', $a );
245
- }
246
-
247
- function has_fatal_error( array $a ) {
248
- ( '' !== $a['errors']->get_error_message( 'fatal' ) ) ? true : false;
249
- }
250
-
251
- function sc_filter_missing_attribute_check( array $a ) {
252
-
253
- if ( ! is_wp_error( $a['errors'] ) ) {
254
-
255
- $a['errors'] = new \WP_Error();
256
-
257
- $msg = 'WP Error was not initialized, attributes were: <pre>' . var_export( $a, true ) . '</pre>';
258
- $a['errors']->add( 'no-wp-error', $msg );
259
- }
260
-
261
- if ( has_fatal_error( $a ) ) {
262
- return $a;
263
- }
264
-
265
- // Old shortcodes
266
- if ( $a['legacy_sc'] ) {
267
-
268
- if ( ! $a['id'] || ! $a['provider'] ) {
269
- $a['errors']->add( 'fatal', 'need id and provider' );
270
- }
271
-
272
- return $a;
273
- }
274
-
275
- $error = true;
276
- $required_attributes = VIDEO_FILE_EXTENSIONS;
277
- $required_attributes[] = 'url';
278
-
279
- foreach ( $required_attributes as $req_attr ) {
280
-
281
- if ( $a[ $req_attr ] ) {
282
- $error = false;
283
- break;
284
- }
285
- }
286
-
287
- if ( $error ) {
288
-
289
- $msg = sprintf(
290
- // Translators: Attributes.
291
- esc_html__( 'The [[arve]] shortcode needs one of this attributes %s', 'advanced-responsive-video-embedder' ),
292
- implode( ', ', $required_attributes )
293
- );
294
-
295
- $a['errors']->add( 'fatal', $msg );
296
- }
297
-
298
- return $a;
299
  }
300
 
301
- function sc_filter_thumbnail( array $a ) {
302
 
303
- if ( has_fatal_error( $a ) ) {
304
- return $a;
305
  }
306
 
307
- $a = apply_filters( 'nextgenthemes/arve/sc_filter/thumbnail', $a );
308
-
309
- if ( $a['thumbnail'] ) :
310
-
311
- if ( is_numeric( $a['thumbnail'] ) ) {
312
-
313
- $a['img_src'] = wp_get_attachment_image_url( $a['thumbnail'], 'small' );
314
- $a['img_srcset'] = wp_get_attachment_image_srcset( $a['thumbnail'], 'small' );
315
-
316
- if ( empty( $a['img_src'] ) ) {
317
- $a['errors']->add( 'wp thumbnail', __( 'No attachment with that ID', 'advanced-responsive-video-embedder' ) );
318
- }
319
- } elseif ( valid_url( $a['thumbnail'] ) ) {
320
-
321
- $a['img_src'] = $a['thumbnail'];
322
-
323
- } else {
324
-
325
- $a['errors']->add( 'thumbnail', __( 'Not a valid thumbnail URL or Media ID given', 'advanced-responsive-video-embedder' ) );
326
- }
327
- endif;
328
-
329
- $a = apply_filters( 'nextgenthemes/arve/sc_filter/img_src', $a );
330
- $a = apply_filters( 'nextgenthemes/arve/sc_filter/img_srcset', $a );
331
 
332
- return $a;
333
  }
334
 
335
- function sc_filter_video( array $a ) {
336
-
337
- if ( has_fatal_error( $a ) ) {
338
- return $a;
339
- }
340
 
341
  foreach ( VIDEO_FILE_EXTENSIONS as $ext ) {
342
 
@@ -345,67 +144,6 @@ function sc_filter_video( array $a ) {
345
  }
346
  }
347
 
348
- return apply_filters( 'nextgenthemes/arve/sc_filter/video', $a );
349
- }
350
-
351
- function sc_filter_detect_provider_and_id_from_url( array $a ) {
352
-
353
- if ( has_fatal_error( $a ) ) {
354
- return $a;
355
- }
356
-
357
- if ( 'html5' === $a['provider'] ||
358
- ( $a['provider'] && $a['id'] )
359
- ) {
360
- return $a;
361
- }
362
-
363
- if ( ! $a['url'] && ! $a['src'] ) {
364
- $a['errors']->add(
365
- 'fatal',
366
- __( 'sc_filter_detect_provider_and_id_from_url function needs url.', 'advanced-responsive-video-embedder' )
367
- );
368
- return $a;
369
- }
370
-
371
- $options = options();
372
- $properties = get_host_properties();
373
- $input_provider = $a['provider'];
374
-
375
- foreach ( $properties as $host_id => $host ) :
376
-
377
- if ( empty( $host['regex'] ) ) {
378
- continue;
379
- }
380
-
381
- $preg_match = preg_match( $host['regex'], $a['url'], $matches );
382
-
383
- if ( 1 !== $preg_match ) {
384
- continue;
385
- }
386
-
387
- foreach ( $matches as $key => $value ) {
388
-
389
- if ( is_string( $key ) ) {
390
- $a['provider'] = $host_id;
391
- $a[ $key ] = $matches[ $key ];
392
- }
393
- }
394
- endforeach;
395
-
396
- if ( $input_provider &&
397
- ( $input_provider !== $a['provider'] ) &&
398
- ! ( 'youtube' === $input_provider && 'youtubelist' === $a['provider'] )
399
- ) {
400
- $a['errors']->add( 'detect!=oembed', "Regex detected provider <code>{$a['provider']}</code> did not match given provider <code>$input_provider</code>" );
401
- }
402
-
403
- if ( ! $a['provider'] ) {
404
- $a['provider'] = 'iframe';
405
- $a['src'] = $a['src'] ? $a['src'] : $a['url'];
406
- $a['id'] = $a['src'];
407
- }
408
-
409
  return $a;
410
  }
411
 
@@ -416,7 +154,7 @@ function special_iframe_src_mods( array $a ) {
416
  $yt_v = Common\get_url_arg( $a['url'], 'v' );
417
  $yt_list = Common\get_url_arg( $a['url'], 'list' );
418
 
419
- if ( Common\contains( $a['src'], '/embed/videoseries?' ) &&
420
  $yt_v
421
  ) {
422
  $a['src'] = str_replace( '/embed/videoseries?', "/embed/$yt_v?", $a['src'] );
@@ -434,7 +172,7 @@ function special_iframe_src_mods( array $a ) {
434
 
435
  $parsed_url = wp_parse_url( $a['url'] );
436
 
437
- if ( ! empty( $parsed_url['fragment'] ) && Common\starts_with( $parsed_url['fragment'], 't' ) ) {
438
  $a['src'] .= '#' . $parsed_url['fragment'];
439
  $a['src_gen'] .= '#' . $parsed_url['fragment'];
440
  }
@@ -448,85 +186,6 @@ function special_iframe_src_mods( array $a ) {
448
  return $a;
449
  }
450
 
451
- function sc_filter_iframe_src( array $a ) {
452
-
453
- if ( has_fatal_error( $a ) ) {
454
- return $a;
455
- }
456
-
457
- if ( 'html5' === $a['provider'] ) {
458
- return $a;
459
- }
460
-
461
- if ( ! $a['provider'] || ! $a['id'] ) {
462
- $a['errors']->add( 'no-provider-and-id', 'Need Provider and ID to build iframe src' );
463
- return $a;
464
- }
465
-
466
- $options = options();
467
- $a['src_gen'] = build_iframe_src( $a );
468
- $a = special_iframe_src_mods( $a );
469
- $a = compare_oembed_src_with_generated_src( $a );
470
-
471
- if ( ! valid_url( $a['src'] ) && valid_url( $a['src_gen'] ) ) {
472
- $a['src'] = $a['src_gen'];
473
- }
474
-
475
- $a['src'] = iframe_src_args( $a['src'], $a );
476
- $a['src'] = iframe_src_autoplay_args( $a['src'], $a['autoplay'], $a );
477
-
478
- if ( 'youtube' === $a['provider'] && $options['youtube_nocookie'] ) {
479
- $a['src'] = str_replace( 'https://www.youtube.com', 'https://www.youtube-nocookie.com', $a['src'] );
480
- }
481
-
482
- $a = apply_filters( 'nextgenthemes/arve/sc_filter/src', $a );
483
-
484
- return $a;
485
- }
486
-
487
- function compare_oembed_src_with_generated_src( array $a ) {
488
-
489
- if ( ! $a['src'] ) {
490
- return $a;
491
- }
492
-
493
- $src = $a['src'];
494
- $src_gen = $a['src_gen'];
495
-
496
- switch ( $a['provider'] ) {
497
- case 'wistia':
498
- case 'vimeo':
499
- $src = Common\remove_url_query( $a['src'] );
500
- $src_gen = Common\remove_url_query( $a['src_gen'] );
501
- break;
502
- case 'youtube':
503
- $src = remove_query_arg( 'feature', $a['src'] );
504
- break;
505
- }
506
-
507
- if ( $src !== $src_gen ) {
508
- $msg = sprintf(
509
- 'src mismatch<br>url: %s<br>src in: %s<br>src gen: %s',
510
- $a['url'],
511
- $a['src'],
512
- $a['src_gen']
513
- );
514
-
515
- if ( $src !== $a['src'] || $src_gen !== $a['src_gen'] ) {
516
- $msg .= sprintf(
517
- 'Actual comparison<br>url: %s<br>src in: %s<br>src gen: %s',
518
- $a['url'],
519
- $src,
520
- $src_gen
521
- );
522
- }
523
-
524
- $a['errors']->add( 'hidden', $msg );
525
- }
526
-
527
- return $a;
528
- }
529
-
530
  function build_iframe_src( array $a ) {
531
 
532
  $options = options();
@@ -593,8 +252,8 @@ function iframe_src_args( $src, array $a ) {
593
  $parameters = wp_parse_args( preg_replace( '!\s+!', '&', $a['parameters'] ) );
594
  $params_options = [];
595
 
596
- if ( ! empty( $options['url_params_' . $a['provider'] ] ) ) {
597
- $params_options = wp_parse_args( preg_replace( '!\s+!', '&', $options['url_params_' . $a['provider'] ] ) );
598
  }
599
 
600
  $parameters = wp_parse_args( $parameters, $params_options );
@@ -613,7 +272,7 @@ function iframe_src_args( $src, array $a ) {
613
  }
614
 
615
  // phpcs:ignore Generic.Metrics.CyclomaticComplexity.MaxExceeded
616
- function iframe_src_autoplay_args( $src, $autoplay, array $a ) {
617
 
618
  switch ( $a['provider'] ) {
619
  case 'alugha':
@@ -626,109 +285,56 @@ function iframe_src_autoplay_args( $src, $autoplay, array $a ) {
626
  case 'vimeo':
627
  case 'youtube':
628
  case 'youtubelist':
629
- $on = add_query_arg( 'autoplay', 1, $a['src'] );
630
- $off = add_query_arg( 'autoplay', 0, $a['src'] );
631
- break;
632
  case 'twitch':
633
  case 'ustream':
634
- $on = add_query_arg( 'autoplay', 'true', $a['src'] );
635
- $off = add_query_arg( 'autoplay', 'false', $a['src'] );
636
- break;
637
  case 'livestream':
638
- case 'Wistia':
639
- $on = add_query_arg( 'autoPlay', 'true', $a['src'] );
640
- $off = add_query_arg( 'autoPlay', 'false', $a['src'] );
641
- break;
642
  case 'metacafe':
643
- $on = add_query_arg( 'ap', 1, $a['src'] );
644
- $off = remove_query_arg( 'ap', $a['src'] );
645
- break;
646
  case 'brightcove':
647
  case 'snotr':
648
- $on = add_query_arg( 'autoplay', 1, $a['src'] );
649
- $off = remove_query_arg( 'autoplay', $a['src'] );
650
- break;
651
  case 'yahoo':
652
- $on = add_query_arg( 'player_autoplay', 'true', $a['src'] );
653
- $off = add_query_arg( 'player_autoplay', 'false', $a['src'] );
654
- break;
655
  default:
656
  // Do nothing for providers that to not support autoplay or fail with parameters
657
- $on = $src;
658
- $off = $src;
659
- break;
660
- /*
661
- case 'videojug':
662
- $on = add_query_arg( 'ap', 1, $a['src'] );
663
- $off = add_query_arg( 'ap', 0, $a['src'] );
664
- break;
665
- case 'veoh':
666
- $on = add_query_arg( 'videoAutoPlay', 1, $a['src'] );
667
- $off = add_query_arg( 'videoAutoPlay', 0, $a['src'] );
668
- break;
669
- case 'iframe':
670
- $on = add_query_arg(
671
- [
672
- 'ap' => '1',
673
- 'autoplay' => '1',
674
- 'autoStart' => 'true',
675
- 'player_autoStart' => 'true',
676
- ],
677
- $a['src']
678
- );
679
- $off = add_query_arg(
680
- [
681
- 'ap' => '0',
682
- 'autoplay' => '0',
683
- 'autoStart' => 'false',
684
- 'player_autoStart' => 'false',
685
- ],
686
- $a['src']
687
- );
688
- break;
689
- */
690
  }
691
-
692
- if ( $autoplay ) {
693
- $src = $on;
694
- } else {
695
- $src = $off;
696
- }
697
-
698
- return $src;
699
- }
700
-
701
- function sc_filter_detect_query_args( array $a ) {
702
-
703
- if ( empty( $a['url'] ) ) {
704
- return $a;
705
- }
706
-
707
- $to_extract = [
708
- 'brightcove' => [ 'videoId', 'something' ],
709
- ];
710
-
711
- foreach ( $to_extract as $provider => $parameters ) {
712
-
713
- if ( $provider !== $a['provider'] ) {
714
- return $a;
715
- }
716
-
717
- $query_array = url_query_array( $a['url'] );
718
-
719
- foreach ( $parameters as $key => $parameter ) {
720
-
721
- $att_name = $a['provider'] . "_$parameter";
722
-
723
- if ( empty( $query_array[ $parameter ] ) ) {
724
- $a[ $att_name ] = new \WP_Error( $att_name, "$parameter not found in URL" );
725
- } else {
726
- $a[ $att_name ] = $query_array[ $parameter ];
727
- }
728
- }
729
- }
730
-
731
- return $a;
732
  }
733
 
734
  function get_video_type( $ext ) {
@@ -744,11 +350,7 @@ function get_video_type( $ext ) {
744
  }
745
  }
746
 
747
- function sc_filter_detect_html5( array $a ) {
748
-
749
- if ( has_fatal_error( $a ) ) {
750
- return $a;
751
- }
752
 
753
  if ( $a['provider'] && 'html5' !== $a['provider'] ) {
754
  return $a;
@@ -756,14 +358,14 @@ function sc_filter_detect_html5( array $a ) {
756
 
757
  foreach ( VIDEO_FILE_EXTENSIONS as $ext ) :
758
 
759
- if ( Common\ends_with( $a['url'], ".$ext" ) &&
760
  ! $a[ $ext ]
761
  ) {
762
  $a[ $ext ] = $a['url'];
763
  }
764
 
765
  if ( 'av1mp4' === $ext &&
766
- Common\ends_with( $a['url'], 'av1.mp4' ) &&
767
  ! $a[ $ext ]
768
  ) {
769
  $a[ $ext ] = $a['url'];
1
  <?php
2
  namespace Nextgenthemes\ARVE;
3
 
4
+ function missing_attribute_check( array $a ) {
5
+
6
+ // Old shortcodes
7
+ if ( $a['legacy_sc'] ) {
8
+
9
+ if ( ! $a['id'] || ! $a['provider'] ) {
10
+ throw new \Exception('need id and provider');
11
+ }
12
 
 
13
  return $a;
14
  }
15
 
16
+ $error = true;
17
+ $required_attributes = VIDEO_FILE_EXTENSIONS;
18
+ $required_attributes[] = 'url';
19
 
20
+ foreach ( $required_attributes as $req_attr ) {
21
 
22
+ if ( $a[ $req_attr ] ) {
23
+ $error = false;
24
+ break;
25
+ }
26
+ }
27
 
28
+ if ( $error ) {
 
29
 
30
+ $msg = sprintf(
31
+ // Translators: Attributes.
32
+ esc_html__( 'The [[arve]] shortcode needs one of this attributes %s', 'advanced-responsive-video-embedder' ),
33
+ implode( ', ', $required_attributes )
34
+ );
35
 
36
+ throw new \Exception($msg);
 
37
  }
38
+ }
39
+
40
+ /**
41
+ * @return false|string
42
+ */
43
+ function arg_aspect_ratio( array $a ) {
44
 
45
  if ( ! empty( $a['aspect_ratio'] ) ) {
46
+ return $a['aspect_ratio'];
47
  }
48
 
49
  if ( ! empty( $a['oembed_data']->width ) && ! empty( $a['oembed_data']->height ) ) {
64
  $a['aspect_ratio'] = aspect_ratio_gcd( $a['aspect_ratio'] );
65
  }
66
 
67
+ return $a['aspect_ratio'];
68
  }
69
 
70
+ function arg_maxwidth( $maxwidth, $align ) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
71
 
72
  $options = options();
73
 
74
+ if ( empty( $maxwidth ) ) {
75
 
76
+ if ( in_array( $align, [ 'left', 'right', 'center' ], true ) ) {
77
+ $maxwidth = (int) $options['align_maxwidth'];
78
  } elseif ( empty( $options['maxwidth'] ) ) {
79
+ $maxwidth = (int) empty( $GLOBALS['content_width'] ) ? DEFAULT_MAXWIDTH : $GLOBALS['content_width'];
80
  } else {
81
+ $maxwidth = (int) $options['maxwidth'];
82
  }
83
  }
84
 
85
+ if ( $maxwidth < 50 ) {
86
+ throw new \Exception( __( 'Maxwidth needs to be 50+', 'advanced-responsive-video-embedder' ) );
87
  }
88
 
89
+ return $maxwidth;
90
  }
91
 
92
+ function liveleak_id_fix( array $a ) {
 
 
 
 
93
 
94
  if ( 'liveleak' !== $a['provider'] ) {
95
+ return $a['id'];
96
  }
97
 
98
+ if ( str_starts_with( $a['id'], 't=' ) ) {
99
  $a['id'][0] = 'i';
100
+ } elseif ( ! str_starts_with( $a['id'], 'i=' )
101
+ && ! str_starts_with( $a['id'], 'f=' )
102
  ) {
103
  $a['id'] = 'i=' . $a['id'];
104
  }
105
 
106
+ return $a['id'];
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
107
  }
108
 
109
+ function arg_autoplay( array $a ) {
 
 
 
 
110
 
111
  if ( 'normal' === $a['mode'] ) { // Prevent more then one vid autoplaying
112
 
121
  }
122
  }
123
 
124
+ return apply_filters( 'nextgenthemes/arve/args/autoplay', $a['autoplay'], $a );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
125
  }
126
 
127
+ function height_from_width_and_ratio( $width, $ratio ) {
128
 
129
+ if ( empty( $ratio ) ) {
130
+ return false;
131
  }
132
 
133
+ list( $old_width, $old_height ) = explode( ':', $ratio );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
134
 
135
+ return new_height( $old_width, $old_height, $width );
136
  }
137
 
138
+ function args_video( array $a ) {
 
 
 
 
139
 
140
  foreach ( VIDEO_FILE_EXTENSIONS as $ext ) {
141
 
144
  }
145
  }
146
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
147
  return $a;
148
  }
149
 
154
  $yt_v = Common\get_url_arg( $a['url'], 'v' );
155
  $yt_list = Common\get_url_arg( $a['url'], 'list' );
156
 
157
+ if ( str_contains( $a['src'], '/embed/videoseries?' ) &&
158
  $yt_v
159
  ) {
160
  $a['src'] = str_replace( '/embed/videoseries?', "/embed/$yt_v?", $a['src'] );
172
 
173
  $parsed_url = wp_parse_url( $a['url'] );
174
 
175
+ if ( ! empty( $parsed_url['fragment'] ) && str_starts_with( $parsed_url['fragment'], 't' ) ) {
176
  $a['src'] .= '#' . $parsed_url['fragment'];
177
  $a['src_gen'] .= '#' . $parsed_url['fragment'];
178
  }
186
  return $a;
187
  }
188
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
189
  function build_iframe_src( array $a ) {
190
 
191
  $options = options();
252
  $parameters = wp_parse_args( preg_replace( '!\s+!', '&', $a['parameters'] ) );
253
  $params_options = [];
254
 
255
+ if ( ! empty( $options[ 'url_params_' . $a['provider'] ] ) ) {
256
+ $params_options = wp_parse_args( preg_replace( '!\s+!', '&', $options[ 'url_params_' . $a['provider'] ] ) );
257
  }
258
 
259
  $parameters = wp_parse_args( $parameters, $params_options );
272
  }
273
 
274
  // phpcs:ignore Generic.Metrics.CyclomaticComplexity.MaxExceeded
275
+ function iframe_src_autoplay_args( $autoplay, array $a ) {
276
 
277
  switch ( $a['provider'] ) {
278
  case 'alugha':
285
  case 'vimeo':
286
  case 'youtube':
287
  case 'youtubelist':
288
+ return $autoplay ?
289
+ add_query_arg( 'autoplay', 1, $a['src'] ) :
290
+ add_query_arg( 'autoplay', 0, $a['src'] );
291
  case 'twitch':
292
  case 'ustream':
293
+ return $autoplay ?
294
+ add_query_arg( 'autoplay', 'true', $a['src'] ) :
295
+ add_query_arg( 'autoplay', 'false', $a['src'] );
296
  case 'livestream':
297
+ case 'wistia':
298
+ return $autoplay ?
299
+ add_query_arg( 'autoPlay', 'true', $a['src'] ) :
300
+ add_query_arg( 'autoPlay', 'false', $a['src'] );
301
  case 'metacafe':
302
+ return $autoplay ?
303
+ add_query_arg( 'ap', 1, $a['src'] ) :
304
+ remove_query_arg( 'ap', $a['src'] );
305
  case 'brightcove':
306
  case 'snotr':
307
+ return $autoplay ?
308
+ add_query_arg( 'autoplay', 1, $a['src'] ) :
309
+ remove_query_arg( 'autoplay', $a['src'] );
310
  case 'yahoo':
311
+ return $autoplay ?
312
+ add_query_arg( 'autoplay', 'true', $a['src'] ) :
313
+ add_query_arg( 'autoplay', 'false', $a['src'] );
314
  default:
315
  // Do nothing for providers that to not support autoplay or fail with parameters
316
+ return $a['src'];
317
+ case 'MAYBEiframe':
318
+ return $autoplay ?
319
+ add_query_arg(
320
+ [
321
+ 'ap' => '1',
322
+ 'autoplay' => '1',
323
+ 'autoStart' => 'true',
324
+ 'player_autoStart' => 'true',
325
+ ],
326
+ $a['src']
327
+ ) :
328
+ add_query_arg(
329
+ [
330
+ 'ap' => '0',
331
+ 'autoplay' => '0',
332
+ 'autoStart' => 'false',
333
+ 'player_autoStart' => 'false',
334
+ ],
335
+ $a['src']
336
+ );
 
 
 
 
 
 
 
 
 
 
 
 
337
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
338
  }
339
 
340
  function get_video_type( $ext ) {
350
  }
351
  }
352
 
353
+ function args_detect_html5( array $a ) {
 
 
 
 
354
 
355
  if ( $a['provider'] && 'html5' !== $a['provider'] ) {
356
  return $a;
358
 
359
  foreach ( VIDEO_FILE_EXTENSIONS as $ext ) :
360
 
361
+ if ( str_ends_with( $a['url'], ".$ext" ) &&
362
  ! $a[ $ext ]
363
  ) {
364
  $a[ $ext ] = $a['url'];
365
  }
366
 
367
  if ( 'av1mp4' === $ext &&
368
+ str_ends_with( $a['url'], 'av1.mp4' ) &&
369
  ! $a[ $ext ]
370
  ) {
371
  $a[ $ext ] = $a['url'];
php/functions-shortcodes.php CHANGED
@@ -1,8 +1,6 @@
1
  <?php
2
  namespace Nextgenthemes\ARVE;
3
 
4
- use function Nextgenthemes\ARVE\Common\starts_with;
5
-
6
  function shortcode( $a, $content = null ) {
7
 
8
  $a = (array) $a;
@@ -79,44 +77,64 @@ function basic_tests( $tests ) {
79
  return $html;
80
  }
81
 
82
- function build_video( array $input_atts ) {
 
 
 
 
 
 
 
 
 
 
 
83
 
84
- for ( $n = 1; $n <= NUM_TRACKS; $n++ ) {
85
- $pairs[ "track_{$n}" ] = null;
86
- $pairs[ "track_{$n}_label" ] = null;
 
 
 
87
  }
88
 
89
- $a = shortcode_atts( shortcode_pairs(), $input_atts, 'arve' );
 
 
 
 
 
90
  $html = '';
91
 
92
- ksort( $a );
93
- ksort( $input_atts );
94
 
95
- if ( $a['errors']->has_errors() ) {
 
 
96
 
97
- foreach ( $a['errors']->get_error_codes() as $code ) {
98
- foreach ( $a['errors']->get_error_messages( $code ) as $key => $message ) {
99
- $html .= sprintf(
100
- '<span class="arve-error"%s>%s %s</span>',
101
- 'hidden' === $code ? ' hidden' : '',
102
- __( '<abbr title="Advanced Responsive Video Embedder">ARVE</abbr> Error:', 'advanced-responsive-video-embedder' ),
103
- $message
104
- );
105
- }
106
- }
107
 
108
- if ( '' !== $a['errors']->get_error_message( 'fatal' ) ) {
109
- $html .= get_debug_info( $html, $a, $input_atts );
110
- return $html;
111
- }
 
 
 
 
 
 
 
112
  }
 
113
 
114
- $html .= build_html( $a );
115
- $html .= get_debug_info( $html, $a, $input_atts );
116
 
117
- wp_enqueue_script( 'arve' );
118
 
119
- return apply_filters( 'nextgenthemes/arve/html', $html, $a );
120
  }
121
 
122
  function shortcode_option_defaults() {
1
  <?php
2
  namespace Nextgenthemes\ARVE;
3
 
 
 
4
  function shortcode( $a, $content = null ) {
5
 
6
  $a = (array) $a;
77
  return $html;
78
  }
79
 
80
+ function error( $msg, $code = '' ) {
81
+
82
+ return sprintf(
83
+ '<span class="arve-error"%s><abbr title="%s">ARVE</abbr> %s</span>',
84
+ 'hidden' === $code ? ' hidden' : '',
85
+ __( 'Advanced Responsive Video Embedder', 'advanced-responsive-video-embedder' ),
86
+ // translators: Error message
87
+ sprintf( __( 'Error: %s', 'advanced-responsive-video-embedder' ), $msg )
88
+ );
89
+ }
90
+
91
+ function add_error_html( array $a ) {
92
 
93
+ $html = '';
94
+
95
+ foreach ( $a['errors']->get_error_codes() as $code ) {
96
+ foreach ( $a['errors']->get_error_messages( $code ) as $key => $message ) {
97
+ $html .= error( $message, $code );
98
+ }
99
  }
100
 
101
+ return $html;
102
+ }
103
+
104
+ function build_video( array $input_atts ) {
105
+
106
+ $a = array();
107
  $html = '';
108
 
109
+ try {
110
+ Common\check_product_keys();
111
 
112
+ $a = shortcode_atts( shortcode_pairs(), $input_atts, 'arve' );
113
+ ksort( $a );
114
+ ksort( $input_atts );
115
 
116
+ $build_args = new ShortcodeArgs( $a['errors'] );
117
+ $a = $build_args->get_done( $a );
 
 
 
 
 
 
 
 
118
 
119
+ $html .= add_error_html( $a );
120
+ $html .= build_html( $a );
121
+ $html .= get_debug_info( $html, $a, $input_atts );
122
+
123
+ wp_enqueue_script( 'arve' );
124
+
125
+ return apply_filters( 'nextgenthemes/arve/html', $html, $a );
126
+
127
+ } catch ( \Exception $e ) {
128
+ return error( $e->getMessage(), $e->getCode() ) .
129
+ get_debug_info( '', $a, $input_atts );
130
  }
131
+ }
132
 
133
+ function arg_filters( array $a ) {
 
134
 
135
+ $args = new ShortcodeArgs( $a );
136
 
137
+ return $args->get_done();
138
  }
139
 
140
  function shortcode_option_defaults() {
php/functions-url-handlers.php CHANGED
@@ -1,8 +1,6 @@
1
  <?php
2
  namespace Nextgenthemes\ARVE;
3
 
4
- use \Nextgenthemes\ARVE\Common\starts_with;
5
-
6
  function create_url_handlers() {
7
 
8
  $properties = get_host_properties();
1
  <?php
2
  namespace Nextgenthemes\ARVE;
3
 
 
 
4
  function create_url_handlers() {
5
 
6
  $properties = get_host_properties();
php/functions-validation.php CHANGED
@@ -7,7 +7,7 @@ function valid_url( $url ) {
7
  return false;
8
  }
9
 
10
- if ( Common\starts_with( $url, '//' ) ) {
11
  $url = 'https:' . $url;
12
  }
13
 
@@ -18,46 +18,6 @@ function valid_url( $url ) {
18
  return false;
19
  }
20
 
21
- function validate_url( array $a, $attr_name ) {
22
-
23
- if ( ! empty( $a[ $attr_name ] ) && ! valid_url( $a[ $attr_name ] ) ) {
24
-
25
- $error_msg = sprintf(
26
- // Translators: 1 URL 2 Attr name
27
- __( 'Invalid URL <code>%1$s</code> in <code>%2$s</code>', 'advanced-responsive-video-embedder' ),
28
- esc_html( $a[ $attr_name ] ),
29
- esc_html( $attr_name )
30
- );
31
-
32
- $a['errors']->add( $attr_name, $error_msg );
33
- }
34
-
35
- return $a;
36
- }
37
-
38
- function validate_aspect_ratio( array $a ) {
39
-
40
- if ( empty( $a['aspect_ratio'] ) ) {
41
- return $a;
42
- }
43
-
44
- $ratio = explode( ':', $a['aspect_ratio'] );
45
-
46
- if ( empty( $ratio[0] ) || ! is_numeric( $ratio[0] ) ||
47
- empty( $ratio[1] ) || ! is_numeric( $ratio[1] )
48
- ) {
49
- $a['errors']->add(
50
- 'aspect_ratio',
51
- // Translators: attribute
52
- sprintf( __( 'Aspect ratio <code>%s</code> is not valid', 'advanced-responsive-video-embedder' ), $a['aspect_ratio'] )
53
- );
54
-
55
- $a['aspect_ratio'] = null;
56
- }
57
-
58
- return $a;
59
- }
60
-
61
  function bool_to_shortcode_string( $val ) {
62
 
63
  if ( false === $val ) {
@@ -66,67 +26,3 @@ function bool_to_shortcode_string( $val ) {
66
 
67
  return (string) $val;
68
  }
69
-
70
- // phpcs:ignore Generic.Metrics.CyclomaticComplexity.TooHigh
71
- function validate_bool( array $a, $attr_name ) {
72
-
73
- switch ( $a[ $attr_name ] ) {
74
- case 'true':
75
- case '1':
76
- case 'y':
77
- case 'yes':
78
- case 'on':
79
- $a[ $attr_name ] = true;
80
- break;
81
- case '':
82
- case null:
83
- $a[ $attr_name ] = null;
84
- break;
85
- case 'false':
86
- case '0':
87
- case 'n':
88
- case 'no':
89
- case 'off':
90
- $a[ $attr_name ] = false;
91
- break;
92
- default:
93
- $a['errors']->add(
94
- $attr_name,
95
- // Translators: %1$s = Attr Name, %2$s = Attribute array
96
- sprintf(
97
- // Translators: Attribute Name
98
- __( '%1$s <code>%2$s</code> not valid', 'advanced-responsive-video-embedder' ),
99
- esc_html( $attr_name ),
100
- esc_html( $a[ $attr_name ] )
101
- )
102
- );
103
- break;
104
- }//end switch
105
-
106
- return $a;
107
- }
108
-
109
- function validate_align( array $a ) {
110
-
111
- switch ( $a['align'] ) {
112
- case null:
113
- case '':
114
- case 'none':
115
- $a['align'] = null;
116
- break;
117
- case 'left':
118
- case 'right':
119
- case 'center':
120
- break;
121
- default:
122
- $a['errors']->add(
123
- 'align',
124
- // Translators: Alignment
125
- sprintf( __( 'Align <code>%s</code> not valid', 'advanced-responsive-video-embedder' ), esc_html( $a['align'] ) )
126
- );
127
- $a['align'] = null;
128
- break;
129
- }
130
-
131
- return $a;
132
- }
7
  return false;
8
  }
9
 
10
+ if ( str_starts_with( $url, '//' ) ) {
11
  $url = 'https:' . $url;
12
  }
13
 
18
  return false;
19
  }
20
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
21
  function bool_to_shortcode_string( $val ) {
22
 
23
  if ( false === $val ) {
26
 
27
  return (string) $val;
28
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
readme.txt CHANGED
@@ -2,19 +2,182 @@
2
  Contributors: nico23
3
  Donate link: https://nextgenthemes.com/donate/
4
  Tags: YouTube, Vimeo, lazyload, thumbnail, video, responsive, embeds, video-embedder, iframe, lightweight, simplicity, shortcodes
5
- Requires at least: 4.4.0
6
  Tested up to: 5.6
7
  Requires PHP: 5.6
8
- Stable tag: 9.1.3
9
  License: GPL-3.0
10
  License URI: https://www.gnu.org/licenses/gpl-3.0.html
11
 
12
  Easy responsive video embeds via URLs or shortcodes. Perfect drop-in replacement for WordPress' default embeds. Best plugin for videos?
13
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
14
  ## Changelog ##
15
 
16
- * [ARVE Pro addon changelog](https://nextgenthemes.com/plugins/arve-pro/changelog/)
17
- * [ARVE AMP addon changelog](https://nextgenthemes.com/plugins/arve-amp/)
 
 
 
 
 
 
 
18
 
19
  ### 2021-01-03 9.1.3 ###
20
 
@@ -661,14 +824,14 @@ Just a small readme update and checking new release script, making sure everythi
661
 
662
  ### 7.2.10 beta - 2016-09-15 ###
663
 
664
- * Fix: [iframe] shortcode not working.
665
 
666
  ### Pro Addon 2.3.1 beta - 2016-09-15 ###
667
 
668
  * New: Added support for displaying title of videos on top of the thumbnail images.
669
  * New: Responsive thumbnails using srcset the browser takes the best image resolution for the users device. (HTML5 srcset)
670
  * New: Choose between 3 hover styles for the thumbnails: 'zoom image' (new default), 'rectangle move in' (old), or 'none' where only the play button changes.
671
- * New: Choose beween 2 play button styles.
672
  * Fix: Screenfull error.
673
  * Fix: License API call.
674
  * Improved: Rectangle animation.
@@ -696,7 +859,7 @@ Just a small readme update and checking new release script, making sure everythi
696
  * Improved: Added image upload dialog to settings page and shortcode dialog.
697
  * Improved: Better CSS to overwrite unwanted theme styles.
698
  * Improved: Lots if code improvements.
699
- * Improved: SSL enabled and forced when supported by provoders.
700
  * Fix: Blury Vimeo thumbnails
701
  * Fix: Prevent Dashboard Widget conflicts with WP Helpers plugin (possibly others). Thanks to Steve Bruner.
702
  * Fix: Issue with unwanted borders showing on embeds.
@@ -1203,144 +1366,4 @@ Please check the [migration guide](https://nextgenthemes.com/?p=1875) about upgr
1203
 
1204
  ### 2012-02-03 0.1 ###
1205
 
1206
- * Started by improving the WordPress 'Video Embedder Plugin' but now complete new code `svn log --stop-on-copy --quiet https://plugins.svn.wordpress.org/advanced-responsive-video-embedder/ | tail -2` seems this plugins was submitted and approved in 2012, seems I have been working on this longer then I thought.
1207
-
1208
- ## Description ##
1209
-
1210
- The best WordPress plugin for videos? Supports close to everything you can imagine, still keeping it easy & simple.
1211
-
1212
- It is very likely the one and only plugin you will ever need to handle video embeds on your WordPress site(s). It goes far beyond just making your videos responsive!
1213
-
1214
- [youtube https://www.youtube.com/watch?v=m6mkA6Zr1vY ]
1215
-
1216
- * [Documentation](https://nextgenthemes.com/plugins/arve/documentation/)
1217
- * [GitHub Page](https://github.com/nextgenthemes/advanced-responsive-video-embedder)
1218
- * [Pro Addon](https://nextgenthemes.com/plugins/arve-pro/)
1219
-
1220
- ### Features ###
1221
-
1222
- * SEO friendly, lets you specify title, description, upload date to provide search engines with the schema.org data they like to have for better indexing.
1223
- * <abbr title="What You See Is What You Get">WYSIWYG</abbr> support. No more messing around with shortcodes and previewing.
1224
- * New improved dialog for embedding videos.
1225
- * Magically makes videos responsive you already embedded with WordPress default features.
1226
- * No 'lock in' if you do not use the ARVE Gutenberg Block or shortcodes.
1227
- * Supports [almost every video host](https://nextgenthemes.com/plugins/arve-pro/#support-table) that supports iframe embed codes.
1228
- * Embeds via pasting the URL in its own line just like WordPress!
1229
- * Optionally use very powerful Shortcodes instead.
1230
- * Clean shortcode syntax `[arve url="https://youtu.be/yUCFRL43Zm4" align="left" parameters="start=30" ... /]`, no unnecessary shortcode wrapping.
1231
- * One single button for all providers.
1232
- * Responsive embeds with CSS, much better then with JavaScript.
1233
- * Tries to be as unobtrusive as possible, sets 'hide brand' variables if supported, disables related videos at the end … to help keep people on your site rather then going to YouTube or keep watching videos.
1234
- * Limited Autostart (for providers that support it, mobile browsers prevent this)
1235
- * Custom URL parameters to use all options providers offer.
1236
- * Optional maximal width.
1237
- * Video alignment.
1238
- * Detailed description of options in-place.
1239
- * Automatic detected and custom aspect ratio.
1240
-
1241
- ### [Supported Providers](https://nextgenthemes.com/plugins/arve-pro/#support-table) ###
1242
-
1243
- allmyvideos.net, Alugha, Archive.org, Break, Brightcove, CollegeHumor, Comedy Central, Dailymotion, Facebook, Funny or Die, IGN, Kickstarter, LiveLeak, Livestream, kla.tv, Metacafe, Movieweb, MPORA, Myspace, Snotr, Spike, TED Talks, Twitch, Veoh, Vevo, Viddler, vidspot.net, Vine, Vimeo, VK, Vzaar, Wistia, XTube, Yahoo, Youku, YouTube, YouTube Playlist, HTML5 video files directly, Google_drive, Dropbox, Ooyala
1244
- [All providers with responsive iframe embed codes](https://nextgenthemes.com/plugins/arve/documentation/#general-iframe-embedding)
1245
-
1246
- ### Reviews ###
1247
-
1248
- #### &#9733; &#9733; &#9733; &#9733; &#9733; The best there is – I have tried many… ####
1249
- Have downloaded and paid for at least 4 other video players that use lightbox. Each one has major flaws. This products works perfectly. If you use the OnSite Editor, then just copy the short code and it works great.
1250
-
1251
- [arve url="https://www.youtube.com/watch?v=Z7g8-GxLTSc" /]
1252
-
1253
- For speed, the product uses the thumbnails from the server. So many of the other products do NOT do this and it slows the page rendering. This product should appear first on the WordPress search. Spent 3 days of my life wasted on other products, only to delete each one. [review by jodani](https://wordpress.org/support/plugin/advanced-responsive-video-embedder/reviews/?filter=5)
1254
-
1255
- #### &#9733; &#9733; &#9733; &#9733; &#9733; Finally something that works ####
1256
- So I have a responsive theme but on pages with you tube videos it wasn't making the you tube videos fit in the mobile screen. I have spent the last hour trying many plugins and researching on google and finally I installed this. And I didn't have to update any settings or anything just refreshed a post with videos and all the sudden it is beautiful and responsive on my mobile phone!!!!!! THANK YOU!!!! [review by happyecho](https://wordpress.org/support/plugin/advanced-responsive-video-embedder/reviews/?filter=5)
1257
-
1258
- #### &#9733; &#9733; &#9733; &#9733; &#9733; Only Plug-in that worked ####
1259
- I used a lot of high ranking plug-ins but they still broke my design. Downloaded this and worked right away. Thanks! [review by crconnell89](https://wordpress.org/support/plugin/advanced-responsive-video-embedder/reviews/?filter=5)
1260
-
1261
- This plugin is financed by sales of the [Pro Addon](https://nextgenthemes.com/plugins/arve-pro/). The development and support of this plugins has become a job for me so I hope you understand that I can not make all features gratis and that you [purchase it](https://nextgenthemes.com/plugins/arve-pro/) to get extra features and support the development.
1262
-
1263
- ### [Pro Addon](https://nextgenthemes.com/plugins/arve-pro/) ###
1264
-
1265
- * **Disable links in embeds (killer feature!)**<br>
1266
- For example: Clicking on a title in a YouTube embed will not open a new popup/tab/window. **Prevent video hosts to lead your visitors away from your site!** Note this also breaks sharing functionality and is not possible when the provider requires flash. Try it on [this page](https://nextgenthemes.com/plugins/arve-pro/). Right click on links still works.
1267
- * **Lazyload mode**<br>
1268
- Make your site load **faster** by loading only a image instead of the entire video player on pageload.
1269
- * **Lazyload -> Lightbox**<br>
1270
- Shows the Video in a Lightbox after clicking a preview image
1271
- * **Link -> Lightbox**<br>
1272
- Use simple links as triggers for lightboxed videos
1273
- * Automatic or custom thumbnail images
1274
- * Automatic or custom titles on top of your thumbnails
1275
- * 'Expand on click' feature
1276
- * 3 hover styles
1277
- * 3 play icon styles to choose from
1278
- * Responsive thumbnails using cutting edge HTML5 technology
1279
- * **Feel good about yourself**<br>
1280
- for supporting my 8+ years work on this plugin. Tons of hours, weekends … always worked on improving it.
1281
- * Show the latest video of a YouTube channel by using the channel URL (updated/cached hourly)
1282
- * **[Get the ARVE Pro Addon](https://nextgenthemes.com/plugins/arve-pro/)** 10% off first year with discount code `wporg`
1283
-
1284
- ### ARVE AMP Addon ###
1285
-
1286
- * Requires the gratis plugins [ARVE](https://wordpress.org/plugins/advanced-responsive-video-embedder/) and [AMP](https://wordpress.org/plugins/amp/)
1287
- * Makes ARVE ready for Accelerated Mobile Pages (AMP)
1288
- * It will display videos embedded with ARVE on AMP pages correctly
1289
- * No options, just works
1290
- * It creates &lt;amp-brightcove&gt;, &lt;amp-youtube&gt;, &lt;amp-vimeo&gt;, &lt;amp-dailymotion&gt; elements
1291
- * For all other video hosts supported by ARVE &lt;amp-iframe&gt; element is used
1292
- * HTML5 video embeds are also supported with &lt;amp-video&gt;
1293
- * **[Check out the ARVE AMP Addon](https://nextgenthemes.com/plugins/arve-amp/)**
1294
-
1295
- ### Thanks ###
1296
-
1297
- * Of course all the customers who bought a addon.
1298
- * Howard Iken of [myfloridalaw.com](https://www.myfloridalaw.com) top donor, super nice to me even if I was rude and not deserved it!
1299
- * [Ilya Grishkov](https://www.ilyagrishkov.com) for bringing up the idea and the first code to cache thumbnail urls.
1300
- * Everybody giving constructive feedback, testing beta versions.
1301
- * Everybody who donated back in the days when this was donation based.
1302
-
1303
- ### Thanks to the developers of the software used in ARVE ###
1304
-
1305
- * [Shortcode UI](https://wordpress.org/plugins/shortcode-ui/), optional Plugin, utilized by ARVE
1306
- * [Lity Lightbox](http://sorgalla.com/lity/), used in [Pro Addon](https://nextgenthemes.com/plugins/arve-pro/)
1307
-
1308
- ## Installation ##
1309
-
1310
- Please refer to [codex.wordpress.org/Managing_Plugins#Automatic_Plugin_Installation](https://codex.wordpress.org/Managing_Plugins#Automatic_Plugin_Installation).
1311
-
1312
- ## Frequently Asked Questions ##
1313
-
1314
- ### I have a problem ... ###
1315
-
1316
- Please report it on [nextgenthemes.com/support/](https://nextgenthemes.com/support/) **and please do not on the wordpess.org forums, thanks.**
1317
-
1318
- ### How to get the pro version working? ###
1319
-
1320
- 1. Go though the purchase process on [nextgenthemes.com/arve-pro/](https://nextgenthemes.com/arve-pro/)
1321
- 1. Follow the 3 easy steps you get with the purchase receipt. It is basically downloading a arve-pro.zip and installing it through your WordPress Admin panel.
1322
-
1323
- ### Why are my videos not filling their container? ###
1324
-
1325
- You are most likely use `align`, this plugin has a option for limiting video width with alignment. If you want your videos to fill their containers then you should not use the `align` shortcode attribute. This assumes that you left the 'Video Maximal Width' field on the options page empty.
1326
-
1327
- ### Can you add a video provider? ###
1328
-
1329
- I have no plans on implementing providers that include videos via JavaScript such as www.nicovideo.jp. I also will not implement video services from mainstream media news organizations. For others, feel free to ask.
1330
-
1331
- ### How do I embed videos from a unlisted providers / iframes? ###
1332
-
1333
- This plugin not changes anything to usual HTML `<iframe>` embed codes you have to use the shortcode creator dialog and paste iframe embed codes there or write them manually. They will become `[arve url="https://..."]`. The url represents what is the `src` in HTML embeds. It works as simple as this, if the [arve] shortcode does not detect a known URL structure then it will treat the URL as a `src` for the iframe.
1334
-
1335
- ### Why does my YouTube video not repeat/loop? ###
1336
-
1337
- This plugins embed is considered as 'custom player' by YouTube so you have to pass the video ID as playlist parameters to make the loop work.
1338
-
1339
- `[arve url="https://www.youtube.com/watch?v=pvRqvX413Ik" parameters="loop=1&playlist=pvRqvX413Ik"]`
1340
-
1341
- ## Screenshots ##
1342
-
1343
- 1. Shortcode dialog
1344
- 2. Main Options
1345
- 2. URL Parameter Options
1346
- 3. Pro Options
2
  Contributors: nico23
3
  Donate link: https://nextgenthemes.com/donate/
4
  Tags: YouTube, Vimeo, lazyload, thumbnail, video, responsive, embeds, video-embedder, iframe, lightweight, simplicity, shortcodes
5
+ Requires at least: 4.4.24
6
  Tested up to: 5.6
7
  Requires PHP: 5.6
8
+ Stable tag: 9.2.0
9
  License: GPL-3.0
10
  License URI: https://www.gnu.org/licenses/gpl-3.0.html
11
 
12
  Easy responsive video embeds via URLs or shortcodes. Perfect drop-in replacement for WordPress' default embeds. Best plugin for videos?
13
 
14
+ ## Description ##
15
+
16
+ The best WordPress plugin for videos? Supports close to everything you can imagine, still keeping it easy & simple.
17
+
18
+ It is very likely the one and only plugin you will ever need to handle video embeds on your WordPress site(s). It goes far beyond just making your videos responsive!
19
+
20
+ [youtube https://www.youtube.com/watch?v=m6mkA6Zr1vY ]
21
+
22
+ ### Features ###
23
+
24
+ #### Classic Editor ####
25
+
26
+ * Takes over WordPress embeds with URLs on their own line and `[embed]` shortcodes.
27
+ * Can take over WP's default video file embeds.
28
+ * Has its own very powerful `[arve]` shortcode.
29
+ * Optional <abbr title="What You See Is What You Get">WYSIWYG</abbr> support with [Shortcode UI]() (not maintained). No more messing around with shortcodes and previewing.
30
+
31
+ #### Gutenberg ####
32
+
33
+ * Works with Embed, YouTube, Vimeo, Shortcode ... blocks.
34
+ * Provides it's own powerful ARVE Block with all the features the `[arve]` shortcode provides with a nice UI with detailed settings descriptions in.
35
+
36
+ #### Both ####
37
+
38
+ * Magically makes videos responsive you already embedded with WordPress default features.
39
+ * SEO friendly, lets you specify title, description, upload date to provide search engines with the schema.org data they like to have for better indexing. Pro can autofill this for you.
40
+ * No 'lock in' if you do not use the ARVE Gutenberg Block or `[arve]` shortcodes.
41
+ * Supports [almost every video host](https://nextgenthemes.com/plugins/arve-pro/#support-table) that supports iframe embed codes.
42
+ * Embeds via pasting the URL in its own line just like WordPress!
43
+ * Optionally use very powerful Shortcodes instead.
44
+ * Clean shortcode syntax `[arve url="https://youtu.be/yUCFRL43Zm4" align="left" parameters="start=30" ... /]`, no unnecessary shortcode wrapping.
45
+ * One shortcode or Block for all video providers.
46
+ * Responsive embeds with CSS, much better than with JavaScript.
47
+ * Tries to be as unobtrusive as possible, sets 'hide brand' variables if supported, disables related videos at the end … to help keep people on your site rather then going to YouTube or keep watching videos.
48
+ * Limited Autoplay (for providers that support it, they may mute it. Mobile browsers prevent autoplay with audio so ARVE will automatically mute HTML5 videos set to autoplay)
49
+ * Custom URL parameters to use all options providers offer.
50
+ * Optional maximal width.
51
+ * Video alignment.
52
+ * Detailed description of options in-place.
53
+ * Automatic detected and custom aspect ratio.
54
+
55
+ #### Supported Providers ####
56
+
57
+ [All providers with iframe embed codes](https://nextgenthemes.com/plugins/arve/documentation/#general-iframe-embedding)
58
+ Alugha, Archive.org, Bitchute, Break, Brightcove, Comedy Central, Dailymotion, Dailymotion Playlist, DTube, Facebook, Funny or Die, IGN, Kickstarter, LiveLeak, Livestream.com, kla.tv, Metacafe, myspace, Snotr, Spike, TED Talks, Twitch, Ustream, RuTube.ru, Viddler, vidspot.net, Vimeo, VK, vzaar, Wistia, XTube, Yahoo, Youku, YouTube, YouTube Playlist, mp4 or webm video files, ARVE general iframe embed, Google Drive, ooyala, IMDB
59
+ ### Reviews ###
60
+
61
+ #### &#9733; &#9733; &#9733; &#9733; &#9733; Great plugin, great support ####
62
+ I’ve been using this plugin (free version and pro add-on) for a few years now. It works very well for my purposes (mainly lazyload and lightbox functionality). Recently I had a support issue with the new version which required some intervention – it was a conflict with my theme. Nico, the developer, went above and beyond to get a fix promptly sorted out for me. Thank you Nico.
63
+
64
+ #### &#9733; &#9733; &#9733; &#9733; &#9733; The best there is – I have tried many… ####
65
+ Have downloaded and paid for at least 4 other video players that use lightbox. Each one has major flaws. This products works perfectly. If you use the OnSite Editor, then just copy the short code and it works great.
66
+
67
+ [arve url="https://www.youtube.com/watch?v=Z7g8-GxLTSc" /]
68
+
69
+ For speed, the product uses the thumbnails from the server. So many of the other products do NOT do this and it slows the page rendering. This product should appear first on the WordPress search. Spent 3 days of my life wasted on other products, only to delete each one. [review by jodani][16]
70
+
71
+ #### &#9733; &#9733; &#9733; &#9733; &#9733; Finally something that works ####
72
+ So I have a responsive theme but on pages with you tube videos it wasn't making the you tube videos fit in the mobile screen. I have spent the last hour trying many plugins and researching on google and finally I installed this. And I didn't have to update any settings or anything just refreshed a post with videos and all the sudden it is beautiful and responsive on my mobile phone!!!!!! THANK YOU!!!! [review by happyecho][16]
73
+
74
+ #### &#9733; &#9733; &#9733; &#9733; &#9733; Only Plug-in that worked ####
75
+ I used a lot of high ranking plug-ins but they still broke my design. Downloaded this and worked right away. Thanks! [review by crconnell89][16]
76
+
77
+ [16]: https://wordpress.org/support/plugin/advanced-responsive-video-embedder/reviews/?filter=5
78
+
79
+ ### [Pro Addon][20]
80
+
81
+ **<big>10% off</big>** first year with discount code `settingspage`.
82
+
83
+ This plugin is financed by purchases of the [Pro Addon][20]. The development and support of this plugins has become a job for me, so I hope you understand that I can not make all features gratis and that you [purchase it][20] to get extra features and support the development.
84
+
85
+ * **Disable links in embeds (killer feature!)**<br>
86
+ For example: Clicking on a title in a YouTube embed will not open a new tab. **Prevent video hosts to lead your visitors away from your site!**
87
+ * **Lazyload**<br>
88
+ Make your site load **faster** by loading only an image instead of the entire video player on pageload.
89
+ * **Lightbox**<br>
90
+ Shows the Video in a Lightbox after clicking a Lazyload preview image
91
+ * **Link ⇾ Lightbox**<br>
92
+ Use simple links as triggers for opening Video Lightboxes
93
+ * Auto pause videos when another video is played
94
+ * Automatic or custom thumbnail images
95
+ * Automatic or custom titles on top of your thumbnails
96
+ * 'Expand on click' feature
97
+ * 2 hover & 3 play icon styles
98
+ * Responsive thumbnails (srcset)
99
+ * **Feel good about yourself**<br>
100
+ for supporting my 8+ years work on this plugin. Tons of hours, weekends … always worked on improving it
101
+ * Show the latest video of a YouTube channel by using the channel URL (updated/cached hourly)
102
+ * **[Get the ARVE Pro][20]**
103
+
104
+ [20]: https://nextgenthemes.com/plugins/arve-pro/
105
+
106
+ ### [Random Video Addon](https://nextgenthemes.com/plugins/arve-random-video/) ###
107
+
108
+ Display random video from:
109
+
110
+ * YouTube Playlist
111
+ * Vimeo Showcase
112
+ * Comma separated list of video URLs
113
+
114
+ #### Supported Providers ####
115
+
116
+ [All providers with iframe embed codes](https://nextgenthemes.com/plugins/arve/documentation/#general-iframe-embedding)
117
+ Alugha, Archive.org, Bitchute, Break, Brightcove, Comedy Central, Dailymotion, Dailymotion Playlist, DTube, Facebook, Funny or Die, IGN, Kickstarter, LiveLeak, Livestream.com, kla.tv, Metacafe, myspace, Snotr, Spike, TED Talks, Twitch, Ustream, RuTube.ru, Viddler, vidspot.net, Vimeo, VK, vzaar, Wistia, XTube, Yahoo, Youku, YouTube, YouTube Playlist, mp4 or webm video files, ARVE general iframe embed, Google Drive, ooyala, IMDB
118
+ ### Thanks ###
119
+
120
+ * Of course all the customers who bought a addon.
121
+ * Howard Iken of [myfloridalaw.com](https://www.myfloridalaw.com) top donor, super nice to me even if I was rude and not deserved it!
122
+ * [Ilya Grishkov](https://www.ilyagrishkov.com) for bringing up the idea and the first code to cache thumbnail urls.
123
+ * Everybody giving constructive feedback, testing beta versions.
124
+ * Everybody who donated back in the days when this was donation based.
125
+
126
+ ### Thanks to the developers of the software used in ARVE ###
127
+
128
+ * [BigPicture](https://github.com/henrygd/bigpicture), used in [Pro Addon](https://nextgenthemes.com/plugins/arve-pro/)
129
+ * [Shortcode UI](https://wordpress.org/plugins/shortcode-ui/), optional plugin (no longer maintained)
130
+
131
+ ## Frequently Asked Questions ##
132
+
133
+ ### I have a problem ... ###
134
+
135
+ Please report it on [nextgenthemes.com/support/](https://nextgenthemes.com/support/) **and please do not on the wordpess.org forums, thanks.**
136
+
137
+ ### How to get the pro version working? ###
138
+
139
+ 1. Go though the purchase process on [nextgenthemes.com/arve-pro/](https://nextgenthemes.com/arve-pro/)
140
+ 1. Follow the 3 easy steps you get with the purchase receipt. It is basically downloading a arve-pro.zip and installing it through your WordPress Admin panel.
141
+ 1. After that you may want to switch your default mode to Lazyload or Lightbox or the ARVE settings page.
142
+
143
+ ### Why are my videos not filling their container? ###
144
+
145
+ You may need to adjust your 'Maximal Width' setting to your liking.
146
+
147
+ You are most likely use `align`, this plugin has a option for limiting video width with alignment. If you want your videos to fill their containers then you should not use the `align` shortcode attribute.
148
+
149
+ ### Can you add a video provider? ###
150
+
151
+ Feel free to ask.
152
+
153
+ ### How do I embed videos from a unlisted providers / iframes? ###
154
+
155
+ This plugin not changes anything to usual HTML `<iframe>` embed codes you have to use the shortcodes or the Gutenberg Block. They will become `[arve url="https://..."]`. The url represents what is the `src` in HTML embeds. It works as simple as this, if the [arve] shortcode does not detect a known URL structure then it will treat the URL as a `src` for the iframe.
156
+
157
+ ### Why does my YouTube video not repeat/loop? ###
158
+
159
+ This plugins embed is considered as 'custom player' by YouTube so you have to pass the video ID as playlist parameters to make the loop work.
160
+
161
+ `[arve url="https://www.youtube.com/watch?v=pvRqvX413Ik" parameters="loop=1&playlist=pvRqvX413Ik"]`
162
+
163
+ ## Screenshots ##
164
+
165
+ 1. Shortcode dialog
166
+ 2. Main Options
167
+ 2. URL Parameter Options
168
+ 3. Pro Options
169
+
170
  ## Changelog ##
171
 
172
+ * [ARVE Pro changelog](https://nextgenthemes.com/plugins/arve-pro/#changelog)
173
+ * [ARVE Random Videos changelog](https://nextgenthemes.com/plugins/random-video/#changelog)
174
+
175
+ ### 2021-01-21 9.2.0 ###
176
+
177
+ * Fix: Compatibility with Astor Theme.
178
+ * Improved: Added notes that Shortcode UI is not maintained to the button and readme.
179
+ * Improved: Classic Tabs, new settings section for upcoming [ARVE sticky Videos](https://nextgenthemes.com/plugins/arve-sticky-videos/).
180
+ * Improved: Lots of code restructured and improved.
181
 
182
  ### 2021-01-03 9.1.3 ###
183
 
824
 
825
  ### 7.2.10 beta - 2016-09-15 ###
826
 
827
+ * Fix: `[iframe]` shortcode not working.
828
 
829
  ### Pro Addon 2.3.1 beta - 2016-09-15 ###
830
 
831
  * New: Added support for displaying title of videos on top of the thumbnail images.
832
  * New: Responsive thumbnails using srcset the browser takes the best image resolution for the users device. (HTML5 srcset)
833
  * New: Choose between 3 hover styles for the thumbnails: 'zoom image' (new default), 'rectangle move in' (old), or 'none' where only the play button changes.
834
+ * New: Choose between 2 play button styles.
835
  * Fix: Screenfull error.
836
  * Fix: License API call.
837
  * Improved: Rectangle animation.
859
  * Improved: Added image upload dialog to settings page and shortcode dialog.
860
  * Improved: Better CSS to overwrite unwanted theme styles.
861
  * Improved: Lots if code improvements.
862
+ * Improved: SSL enabled and forced when supported by providers.
863
  * Fix: Blury Vimeo thumbnails
864
  * Fix: Prevent Dashboard Widget conflicts with WP Helpers plugin (possibly others). Thanks to Steve Bruner.
865
  * Fix: Issue with unwanted borders showing on embeds.
1366
 
1367
  ### 2012-02-03 0.1 ###
1368
 
1369
+ * Started by improving the WordPress 'Video Embedder Plugin' but now complete new code `svn log --stop-on-copy --quiet https://plugins.svn.wordpress.org/advanced-responsive-video-embedder/ | tail -2` this plugins was submitted and approved in 2012, seems I have been working on this longer then I thought.