deemix-webui/public/js/bundle.js

33591 lines
1.3 MiB
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*!
* Vue.js v2.6.12
* (c) 2014-2020 Evan You
* Released under the MIT License.
*/
/* */
var emptyObject = Object.freeze({});
// These helpers produce better VM code in JS engines due to their
// explicitness and function inlining.
function isUndef (v) {
return v === undefined || v === null
}
function isDef (v) {
return v !== undefined && v !== null
}
function isTrue (v) {
return v === true
}
function isFalse (v) {
return v === false
}
/**
* Check if value is primitive.
*/
function isPrimitive (value) {
return (
typeof value === 'string' ||
typeof value === 'number' ||
// $flow-disable-line
typeof value === 'symbol' ||
typeof value === 'boolean'
)
}
/**
* Quick object check - this is primarily used to tell
* Objects from primitive values when we know the value
* is a JSON-compliant type.
*/
function isObject (obj) {
return obj !== null && typeof obj === 'object'
}
/**
* Get the raw type string of a value, e.g., [object Object].
*/
var _toString = Object.prototype.toString;
function toRawType (value) {
return _toString.call(value).slice(8, -1)
}
/**
* Strict object type check. Only returns true
* for plain JavaScript objects.
*/
function isPlainObject (obj) {
return _toString.call(obj) === '[object Object]'
}
function isRegExp (v) {
return _toString.call(v) === '[object RegExp]'
}
/**
* Check if val is a valid array index.
*/
function isValidArrayIndex (val) {
var n = parseFloat(String(val));
return n >= 0 && Math.floor(n) === n && isFinite(val)
}
function isPromise (val) {
return (
isDef(val) &&
typeof val.then === 'function' &&
typeof val.catch === 'function'
)
}
/**
* Convert a value to a string that is actually rendered.
*/
function toString (val) {
return val == null
? ''
: Array.isArray(val) || (isPlainObject(val) && val.toString === _toString)
? JSON.stringify(val, null, 2)
: String(val)
}
/**
* Convert an input value to a number for persistence.
* If the conversion fails, return original string.
*/
function toNumber (val) {
var n = parseFloat(val);
return isNaN(n) ? val : n
}
/**
* Make a map and return a function for checking if a key
* is in that map.
*/
function makeMap (
str,
expectsLowerCase
) {
var map = Object.create(null);
var list = str.split(',');
for (var i = 0; i < list.length; i++) {
map[list[i]] = true;
}
return expectsLowerCase
? function (val) { return map[val.toLowerCase()]; }
: function (val) { return map[val]; }
}
/**
* Check if a tag is a built-in tag.
*/
var isBuiltInTag = makeMap('slot,component', true);
/**
* Check if an attribute is a reserved attribute.
*/
var isReservedAttribute = makeMap('key,ref,slot,slot-scope,is');
/**
* Remove an item from an array.
*/
function remove (arr, item) {
if (arr.length) {
var index = arr.indexOf(item);
if (index > -1) {
return arr.splice(index, 1)
}
}
}
/**
* Check whether an object has the property.
*/
var hasOwnProperty = Object.prototype.hasOwnProperty;
function hasOwn (obj, key) {
return hasOwnProperty.call(obj, key)
}
/**
* Create a cached version of a pure function.
*/
function cached (fn) {
var cache = Object.create(null);
return (function cachedFn (str) {
var hit = cache[str];
return hit || (cache[str] = fn(str))
})
}
/**
* Camelize a hyphen-delimited string.
*/
var camelizeRE = /-(\w)/g;
var camelize = cached(function (str) {
return str.replace(camelizeRE, function (_, c) { return c ? c.toUpperCase() : ''; })
});
/**
* Capitalize a string.
*/
var capitalize = cached(function (str) {
return str.charAt(0).toUpperCase() + str.slice(1)
});
/**
* Hyphenate a camelCase string.
*/
var hyphenateRE = /\B([A-Z])/g;
var hyphenate = cached(function (str) {
return str.replace(hyphenateRE, '-$1').toLowerCase()
});
/**
* Simple bind polyfill for environments that do not support it,
* e.g., PhantomJS 1.x. Technically, we don't need this anymore
* since native bind is now performant enough in most browsers.
* But removing it would mean breaking code that was able to run in
* PhantomJS 1.x, so this must be kept for backward compatibility.
*/
/* istanbul ignore next */
function polyfillBind (fn, ctx) {
function boundFn (a) {
var l = arguments.length;
return l
? l > 1
? fn.apply(ctx, arguments)
: fn.call(ctx, a)
: fn.call(ctx)
}
boundFn._length = fn.length;
return boundFn
}
function nativeBind (fn, ctx) {
return fn.bind(ctx)
}
var bind = Function.prototype.bind
? nativeBind
: polyfillBind;
/**
* Convert an Array-like object to a real Array.
*/
function toArray (list, start) {
start = start || 0;
var i = list.length - start;
var ret = new Array(i);
while (i--) {
ret[i] = list[i + start];
}
return ret
}
/**
* Mix properties into target object.
*/
function extend (to, _from) {
for (var key in _from) {
to[key] = _from[key];
}
return to
}
/**
* Merge an Array of Objects into a single Object.
*/
function toObject (arr) {
var res = {};
for (var i = 0; i < arr.length; i++) {
if (arr[i]) {
extend(res, arr[i]);
}
}
return res
}
/* eslint-disable no-unused-vars */
/**
* Perform no operation.
* Stubbing args to make Flow happy without leaving useless transpiled code
* with ...rest (https://flow.org/blog/2017/05/07/Strict-Function-Call-Arity/).
*/
function noop (a, b, c) {}
/**
* Always return false.
*/
var no = function (a, b, c) { return false; };
/* eslint-enable no-unused-vars */
/**
* Return the same value.
*/
var identity = function (_) { return _; };
/**
* Generate a string containing static keys from compiler modules.
*/
function genStaticKeys (modules) {
return modules.reduce(function (keys, m) {
return keys.concat(m.staticKeys || [])
}, []).join(',')
}
/**
* Check if two values are loosely equal - that is,
* if they are plain objects, do they have the same shape?
*/
function looseEqual (a, b) {
if (a === b) { return true }
var isObjectA = isObject(a);
var isObjectB = isObject(b);
if (isObjectA && isObjectB) {
try {
var isArrayA = Array.isArray(a);
var isArrayB = Array.isArray(b);
if (isArrayA && isArrayB) {
return a.length === b.length && a.every(function (e, i) {
return looseEqual(e, b[i])
})
} else if (a instanceof Date && b instanceof Date) {
return a.getTime() === b.getTime()
} else if (!isArrayA && !isArrayB) {
var keysA = Object.keys(a);
var keysB = Object.keys(b);
return keysA.length === keysB.length && keysA.every(function (key) {
return looseEqual(a[key], b[key])
})
} else {
/* istanbul ignore next */
return false
}
} catch (e) {
/* istanbul ignore next */
return false
}
} else if (!isObjectA && !isObjectB) {
return String(a) === String(b)
} else {
return false
}
}
/**
* Return the first index at which a loosely equal value can be
* found in the array (if value is a plain object, the array must
* contain an object of the same shape), or -1 if it is not present.
*/
function looseIndexOf (arr, val) {
for (var i = 0; i < arr.length; i++) {
if (looseEqual(arr[i], val)) { return i }
}
return -1
}
/**
* Ensure a function is called only once.
*/
function once (fn) {
var called = false;
return function () {
if (!called) {
called = true;
fn.apply(this, arguments);
}
}
}
var SSR_ATTR = 'data-server-rendered';
var ASSET_TYPES = [
'component',
'directive',
'filter'
];
var LIFECYCLE_HOOKS = [
'beforeCreate',
'created',
'beforeMount',
'mounted',
'beforeUpdate',
'updated',
'beforeDestroy',
'destroyed',
'activated',
'deactivated',
'errorCaptured',
'serverPrefetch'
];
/* */
var config = ({
/**
* Option merge strategies (used in core/util/options)
*/
// $flow-disable-line
optionMergeStrategies: Object.create(null),
/**
* Whether to suppress warnings.
*/
silent: false,
/**
* Show production mode tip message on boot?
*/
productionTip: "production" !== 'production',
/**
* Whether to enable devtools
*/
devtools: "production" !== 'production',
/**
* Whether to record perf
*/
performance: false,
/**
* Error handler for watcher errors
*/
errorHandler: null,
/**
* Warn handler for watcher warns
*/
warnHandler: null,
/**
* Ignore certain custom elements
*/
ignoredElements: [],
/**
* Custom user key aliases for v-on
*/
// $flow-disable-line
keyCodes: Object.create(null),
/**
* Check if a tag is reserved so that it cannot be registered as a
* component. This is platform-dependent and may be overwritten.
*/
isReservedTag: no,
/**
* Check if an attribute is reserved so that it cannot be used as a component
* prop. This is platform-dependent and may be overwritten.
*/
isReservedAttr: no,
/**
* Check if a tag is an unknown element.
* Platform-dependent.
*/
isUnknownElement: no,
/**
* Get the namespace of an element
*/
getTagNamespace: noop,
/**
* Parse the real tag name for the specific platform.
*/
parsePlatformTagName: identity,
/**
* Check if an attribute must be bound using property, e.g. value
* Platform-dependent.
*/
mustUseProp: no,
/**
* Perform updates asynchronously. Intended to be used by Vue Test Utils
* This will significantly reduce performance if set to false.
*/
async: true,
/**
* Exposed for legacy reasons
*/
_lifecycleHooks: LIFECYCLE_HOOKS
});
/* */
/**
* unicode letters used for parsing html tags, component names and property paths.
* using https://www.w3.org/TR/html53/semantics-scripting.html#potentialcustomelementname
* skipping \u10000-\uEFFFF due to it freezing up PhantomJS
*/
var unicodeRegExp = /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/;
/**
* Check if a string starts with $ or _
*/
function isReserved (str) {
var c = (str + '').charCodeAt(0);
return c === 0x24 || c === 0x5F
}
/**
* Define a property.
*/
function def (obj, key, val, enumerable) {
Object.defineProperty(obj, key, {
value: val,
enumerable: !!enumerable,
writable: true,
configurable: true
});
}
/**
* Parse simple path.
*/
var bailRE = new RegExp(("[^" + (unicodeRegExp.source) + ".$_\\d]"));
function parsePath (path) {
if (bailRE.test(path)) {
return
}
var segments = path.split('.');
return function (obj) {
for (var i = 0; i < segments.length; i++) {
if (!obj) { return }
obj = obj[segments[i]];
}
return obj
}
}
/* */
// can we use __proto__?
var hasProto = '__proto__' in {};
// Browser environment sniffing
var inBrowser = typeof window !== 'undefined';
var inWeex = typeof WXEnvironment !== 'undefined' && !!WXEnvironment.platform;
var weexPlatform = inWeex && WXEnvironment.platform.toLowerCase();
var UA = inBrowser && window.navigator.userAgent.toLowerCase();
var isIE = UA && /msie|trident/.test(UA);
var isIE9 = UA && UA.indexOf('msie 9.0') > 0;
var isEdge = UA && UA.indexOf('edge/') > 0;
var isAndroid = (UA && UA.indexOf('android') > 0) || (weexPlatform === 'android');
var isIOS = (UA && /iphone|ipad|ipod|ios/.test(UA)) || (weexPlatform === 'ios');
var isChrome = UA && /chrome\/\d+/.test(UA) && !isEdge;
var isPhantomJS = UA && /phantomjs/.test(UA);
var isFF = UA && UA.match(/firefox\/(\d+)/);
// Firefox has a "watch" function on Object.prototype...
var nativeWatch = ({}).watch;
var supportsPassive = false;
if (inBrowser) {
try {
var opts = {};
Object.defineProperty(opts, 'passive', ({
get: function get () {
/* istanbul ignore next */
supportsPassive = true;
}
})); // https://github.com/facebook/flow/issues/285
window.addEventListener('test-passive', null, opts);
} catch (e) {}
}
// this needs to be lazy-evaled because vue may be required before
// vue-server-renderer can set VUE_ENV
var _isServer;
var isServerRendering = function () {
if (_isServer === undefined) {
/* istanbul ignore if */
if (!inBrowser && !inWeex && typeof global !== 'undefined') {
// detect presence of vue-server-renderer and avoid
// Webpack shimming the process
_isServer = global['process'] && global['process'].env.VUE_ENV === 'server';
} else {
_isServer = false;
}
}
return _isServer
};
// detect devtools
var devtools = inBrowser && window.__VUE_DEVTOOLS_GLOBAL_HOOK__;
/* istanbul ignore next */
function isNative (Ctor) {
return typeof Ctor === 'function' && /native code/.test(Ctor.toString())
}
var hasSymbol =
typeof Symbol !== 'undefined' && isNative(Symbol) &&
typeof Reflect !== 'undefined' && isNative(Reflect.ownKeys);
var _Set;
/* istanbul ignore if */ // $flow-disable-line
if (typeof Set !== 'undefined' && isNative(Set)) {
// use native Set when available.
_Set = Set;
} else {
// a non-standard Set polyfill that only works with primitive keys.
_Set = /*@__PURE__*/(function () {
function Set () {
this.set = Object.create(null);
}
Set.prototype.has = function has (key) {
return this.set[key] === true
};
Set.prototype.add = function add (key) {
this.set[key] = true;
};
Set.prototype.clear = function clear () {
this.set = Object.create(null);
};
return Set;
}());
}
/* */
var warn = noop;
/* */
var uid = 0;
/**
* A dep is an observable that can have multiple
* directives subscribing to it.
*/
var Dep = function Dep () {
this.id = uid++;
this.subs = [];
};
Dep.prototype.addSub = function addSub (sub) {
this.subs.push(sub);
};
Dep.prototype.removeSub = function removeSub (sub) {
remove(this.subs, sub);
};
Dep.prototype.depend = function depend () {
if (Dep.target) {
Dep.target.addDep(this);
}
};
Dep.prototype.notify = function notify () {
// stabilize the subscriber list first
var subs = this.subs.slice();
for (var i = 0, l = subs.length; i < l; i++) {
subs[i].update();
}
};
// The current target watcher being evaluated.
// This is globally unique because only one watcher
// can be evaluated at a time.
Dep.target = null;
var targetStack = [];
function pushTarget (target) {
targetStack.push(target);
Dep.target = target;
}
function popTarget () {
targetStack.pop();
Dep.target = targetStack[targetStack.length - 1];
}
/* */
var VNode = function VNode (
tag,
data,
children,
text,
elm,
context,
componentOptions,
asyncFactory
) {
this.tag = tag;
this.data = data;
this.children = children;
this.text = text;
this.elm = elm;
this.ns = undefined;
this.context = context;
this.fnContext = undefined;
this.fnOptions = undefined;
this.fnScopeId = undefined;
this.key = data && data.key;
this.componentOptions = componentOptions;
this.componentInstance = undefined;
this.parent = undefined;
this.raw = false;
this.isStatic = false;
this.isRootInsert = true;
this.isComment = false;
this.isCloned = false;
this.isOnce = false;
this.asyncFactory = asyncFactory;
this.asyncMeta = undefined;
this.isAsyncPlaceholder = false;
};
var prototypeAccessors = { child: { configurable: true } };
// DEPRECATED: alias for componentInstance for backwards compat.
/* istanbul ignore next */
prototypeAccessors.child.get = function () {
return this.componentInstance
};
Object.defineProperties( VNode.prototype, prototypeAccessors );
var createEmptyVNode = function (text) {
if ( text === void 0 ) text = '';
var node = new VNode();
node.text = text;
node.isComment = true;
return node
};
function createTextVNode (val) {
return new VNode(undefined, undefined, undefined, String(val))
}
// optimized shallow clone
// used for static nodes and slot nodes because they may be reused across
// multiple renders, cloning them avoids errors when DOM manipulations rely
// on their elm reference.
function cloneVNode (vnode) {
var cloned = new VNode(
vnode.tag,
vnode.data,
// #7975
// clone children array to avoid mutating original in case of cloning
// a child.
vnode.children && vnode.children.slice(),
vnode.text,
vnode.elm,
vnode.context,
vnode.componentOptions,
vnode.asyncFactory
);
cloned.ns = vnode.ns;
cloned.isStatic = vnode.isStatic;
cloned.key = vnode.key;
cloned.isComment = vnode.isComment;
cloned.fnContext = vnode.fnContext;
cloned.fnOptions = vnode.fnOptions;
cloned.fnScopeId = vnode.fnScopeId;
cloned.asyncMeta = vnode.asyncMeta;
cloned.isCloned = true;
return cloned
}
/*
* not type checking this file because flow doesn't play well with
* dynamically accessing methods on Array prototype
*/
var arrayProto = Array.prototype;
var arrayMethods = Object.create(arrayProto);
var methodsToPatch = [
'push',
'pop',
'shift',
'unshift',
'splice',
'sort',
'reverse'
];
/**
* Intercept mutating methods and emit events
*/
methodsToPatch.forEach(function (method) {
// cache original method
var original = arrayProto[method];
def(arrayMethods, method, function mutator () {
var args = [], len = arguments.length;
while ( len-- ) args[ len ] = arguments[ len ];
var result = original.apply(this, args);
var ob = this.__ob__;
var inserted;
switch (method) {
case 'push':
case 'unshift':
inserted = args;
break
case 'splice':
inserted = args.slice(2);
break
}
if (inserted) { ob.observeArray(inserted); }
// notify change
ob.dep.notify();
return result
});
});
/* */
var arrayKeys = Object.getOwnPropertyNames(arrayMethods);
/**
* In some cases we may want to disable observation inside a component's
* update computation.
*/
var shouldObserve = true;
function toggleObserving (value) {
shouldObserve = value;
}
/**
* Observer class that is attached to each observed
* object. Once attached, the observer converts the target
* object's property keys into getter/setters that
* collect dependencies and dispatch updates.
*/
var Observer = function Observer (value) {
this.value = value;
this.dep = new Dep();
this.vmCount = 0;
def(value, '__ob__', this);
if (Array.isArray(value)) {
if (hasProto) {
protoAugment(value, arrayMethods);
} else {
copyAugment(value, arrayMethods, arrayKeys);
}
this.observeArray(value);
} else {
this.walk(value);
}
};
/**
* Walk through all properties and convert them into
* getter/setters. This method should only be called when
* value type is Object.
*/
Observer.prototype.walk = function walk (obj) {
var keys = Object.keys(obj);
for (var i = 0; i < keys.length; i++) {
defineReactive$$1(obj, keys[i]);
}
};
/**
* Observe a list of Array items.
*/
Observer.prototype.observeArray = function observeArray (items) {
for (var i = 0, l = items.length; i < l; i++) {
observe(items[i]);
}
};
// helpers
/**
* Augment a target Object or Array by intercepting
* the prototype chain using __proto__
*/
function protoAugment (target, src) {
/* eslint-disable no-proto */
target.__proto__ = src;
/* eslint-enable no-proto */
}
/**
* Augment a target Object or Array by defining
* hidden properties.
*/
/* istanbul ignore next */
function copyAugment (target, src, keys) {
for (var i = 0, l = keys.length; i < l; i++) {
var key = keys[i];
def(target, key, src[key]);
}
}
/**
* Attempt to create an observer instance for a value,
* returns the new observer if successfully observed,
* or the existing observer if the value already has one.
*/
function observe (value, asRootData) {
if (!isObject(value) || value instanceof VNode) {
return
}
var ob;
if (hasOwn(value, '__ob__') && value.__ob__ instanceof Observer) {
ob = value.__ob__;
} else if (
shouldObserve &&
!isServerRendering() &&
(Array.isArray(value) || isPlainObject(value)) &&
Object.isExtensible(value) &&
!value._isVue
) {
ob = new Observer(value);
}
if (asRootData && ob) {
ob.vmCount++;
}
return ob
}
/**
* Define a reactive property on an Object.
*/
function defineReactive$$1 (
obj,
key,
val,
customSetter,
shallow
) {
var dep = new Dep();
var property = Object.getOwnPropertyDescriptor(obj, key);
if (property && property.configurable === false) {
return
}
// cater for pre-defined getter/setters
var getter = property && property.get;
var setter = property && property.set;
if ((!getter || setter) && arguments.length === 2) {
val = obj[key];
}
var childOb = !shallow && observe(val);
Object.defineProperty(obj, key, {
enumerable: true,
configurable: true,
get: function reactiveGetter () {
var value = getter ? getter.call(obj) : val;
if (Dep.target) {
dep.depend();
if (childOb) {
childOb.dep.depend();
if (Array.isArray(value)) {
dependArray(value);
}
}
}
return value
},
set: function reactiveSetter (newVal) {
var value = getter ? getter.call(obj) : val;
/* eslint-disable no-self-compare */
if (newVal === value || (newVal !== newVal && value !== value)) {
return
}
// #7981: for accessor properties without setter
if (getter && !setter) { return }
if (setter) {
setter.call(obj, newVal);
} else {
val = newVal;
}
childOb = !shallow && observe(newVal);
dep.notify();
}
});
}
/**
* Set a property on an object. Adds the new property and
* triggers change notification if the property doesn't
* already exist.
*/
function set (target, key, val) {
if (Array.isArray(target) && isValidArrayIndex(key)) {
target.length = Math.max(target.length, key);
target.splice(key, 1, val);
return val
}
if (key in target && !(key in Object.prototype)) {
target[key] = val;
return val
}
var ob = (target).__ob__;
if (target._isVue || (ob && ob.vmCount)) {
return val
}
if (!ob) {
target[key] = val;
return val
}
defineReactive$$1(ob.value, key, val);
ob.dep.notify();
return val
}
/**
* Delete a property and trigger change if necessary.
*/
function del (target, key) {
if (Array.isArray(target) && isValidArrayIndex(key)) {
target.splice(key, 1);
return
}
var ob = (target).__ob__;
if (target._isVue || (ob && ob.vmCount)) {
return
}
if (!hasOwn(target, key)) {
return
}
delete target[key];
if (!ob) {
return
}
ob.dep.notify();
}
/**
* Collect dependencies on array elements when the array is touched, since
* we cannot intercept array element access like property getters.
*/
function dependArray (value) {
for (var e = (void 0), i = 0, l = value.length; i < l; i++) {
e = value[i];
e && e.__ob__ && e.__ob__.dep.depend();
if (Array.isArray(e)) {
dependArray(e);
}
}
}
/* */
/**
* Option overwriting strategies are functions that handle
* how to merge a parent option value and a child option
* value into the final value.
*/
var strats = config.optionMergeStrategies;
/**
* Helper that recursively merges two data objects together.
*/
function mergeData (to, from) {
if (!from) { return to }
var key, toVal, fromVal;
var keys = hasSymbol
? Reflect.ownKeys(from)
: Object.keys(from);
for (var i = 0; i < keys.length; i++) {
key = keys[i];
// in case the object is already observed...
if (key === '__ob__') { continue }
toVal = to[key];
fromVal = from[key];
if (!hasOwn(to, key)) {
set(to, key, fromVal);
} else if (
toVal !== fromVal &&
isPlainObject(toVal) &&
isPlainObject(fromVal)
) {
mergeData(toVal, fromVal);
}
}
return to
}
/**
* Data
*/
function mergeDataOrFn (
parentVal,
childVal,
vm
) {
if (!vm) {
// in a Vue.extend merge, both should be functions
if (!childVal) {
return parentVal
}
if (!parentVal) {
return childVal
}
// when parentVal & childVal are both present,
// we need to return a function that returns the
// merged result of both functions... no need to
// check if parentVal is a function here because
// it has to be a function to pass previous merges.
return function mergedDataFn () {
return mergeData(
typeof childVal === 'function' ? childVal.call(this, this) : childVal,
typeof parentVal === 'function' ? parentVal.call(this, this) : parentVal
)
}
} else {
return function mergedInstanceDataFn () {
// instance merge
var instanceData = typeof childVal === 'function'
? childVal.call(vm, vm)
: childVal;
var defaultData = typeof parentVal === 'function'
? parentVal.call(vm, vm)
: parentVal;
if (instanceData) {
return mergeData(instanceData, defaultData)
} else {
return defaultData
}
}
}
}
strats.data = function (
parentVal,
childVal,
vm
) {
if (!vm) {
if (childVal && typeof childVal !== 'function') {
return parentVal
}
return mergeDataOrFn(parentVal, childVal)
}
return mergeDataOrFn(parentVal, childVal, vm)
};
/**
* Hooks and props are merged as arrays.
*/
function mergeHook (
parentVal,
childVal
) {
var res = childVal
? parentVal
? parentVal.concat(childVal)
: Array.isArray(childVal)
? childVal
: [childVal]
: parentVal;
return res
? dedupeHooks(res)
: res
}
function dedupeHooks (hooks) {
var res = [];
for (var i = 0; i < hooks.length; i++) {
if (res.indexOf(hooks[i]) === -1) {
res.push(hooks[i]);
}
}
return res
}
LIFECYCLE_HOOKS.forEach(function (hook) {
strats[hook] = mergeHook;
});
/**
* Assets
*
* When a vm is present (instance creation), we need to do
* a three-way merge between constructor options, instance
* options and parent options.
*/
function mergeAssets (
parentVal,
childVal,
vm,
key
) {
var res = Object.create(parentVal || null);
if (childVal) {
return extend(res, childVal)
} else {
return res
}
}
ASSET_TYPES.forEach(function (type) {
strats[type + 's'] = mergeAssets;
});
/**
* Watchers.
*
* Watchers hashes should not overwrite one
* another, so we merge them as arrays.
*/
strats.watch = function (
parentVal,
childVal,
vm,
key
) {
// work around Firefox's Object.prototype.watch...
if (parentVal === nativeWatch) { parentVal = undefined; }
if (childVal === nativeWatch) { childVal = undefined; }
/* istanbul ignore if */
if (!childVal) { return Object.create(parentVal || null) }
if (!parentVal) { return childVal }
var ret = {};
extend(ret, parentVal);
for (var key$1 in childVal) {
var parent = ret[key$1];
var child = childVal[key$1];
if (parent && !Array.isArray(parent)) {
parent = [parent];
}
ret[key$1] = parent
? parent.concat(child)
: Array.isArray(child) ? child : [child];
}
return ret
};
/**
* Other object hashes.
*/
strats.props =
strats.methods =
strats.inject =
strats.computed = function (
parentVal,
childVal,
vm,
key
) {
if (childVal && "production" !== 'production') {
assertObjectType(key, childVal);
}
if (!parentVal) { return childVal }
var ret = Object.create(null);
extend(ret, parentVal);
if (childVal) { extend(ret, childVal); }
return ret
};
strats.provide = mergeDataOrFn;
/**
* Default strategy.
*/
var defaultStrat = function (parentVal, childVal) {
return childVal === undefined
? parentVal
: childVal
};
/**
* Ensure all props option syntax are normalized into the
* Object-based format.
*/
function normalizeProps (options, vm) {
var props = options.props;
if (!props) { return }
var res = {};
var i, val, name;
if (Array.isArray(props)) {
i = props.length;
while (i--) {
val = props[i];
if (typeof val === 'string') {
name = camelize(val);
res[name] = { type: null };
}
}
} else if (isPlainObject(props)) {
for (var key in props) {
val = props[key];
name = camelize(key);
res[name] = isPlainObject(val)
? val
: { type: val };
}
} else ;
options.props = res;
}
/**
* Normalize all injections into Object-based format
*/
function normalizeInject (options, vm) {
var inject = options.inject;
if (!inject) { return }
var normalized = options.inject = {};
if (Array.isArray(inject)) {
for (var i = 0; i < inject.length; i++) {
normalized[inject[i]] = { from: inject[i] };
}
} else if (isPlainObject(inject)) {
for (var key in inject) {
var val = inject[key];
normalized[key] = isPlainObject(val)
? extend({ from: key }, val)
: { from: val };
}
} else ;
}
/**
* Normalize raw function directives into object format.
*/
function normalizeDirectives (options) {
var dirs = options.directives;
if (dirs) {
for (var key in dirs) {
var def$$1 = dirs[key];
if (typeof def$$1 === 'function') {
dirs[key] = { bind: def$$1, update: def$$1 };
}
}
}
}
function assertObjectType (name, value, vm) {
if (!isPlainObject(value)) {
warn(
"Invalid value for option \"" + name + "\": expected an Object, " +
"but got " + (toRawType(value)) + ".");
}
}
/**
* Merge two option objects into a new one.
* Core utility used in both instantiation and inheritance.
*/
function mergeOptions (
parent,
child,
vm
) {
if (typeof child === 'function') {
child = child.options;
}
normalizeProps(child);
normalizeInject(child);
normalizeDirectives(child);
// Apply extends and mixins on the child options,
// but only if it is a raw options object that isn't
// the result of another mergeOptions call.
// Only merged options has the _base property.
if (!child._base) {
if (child.extends) {
parent = mergeOptions(parent, child.extends, vm);
}
if (child.mixins) {
for (var i = 0, l = child.mixins.length; i < l; i++) {
parent = mergeOptions(parent, child.mixins[i], vm);
}
}
}
var options = {};
var key;
for (key in parent) {
mergeField(key);
}
for (key in child) {
if (!hasOwn(parent, key)) {
mergeField(key);
}
}
function mergeField (key) {
var strat = strats[key] || defaultStrat;
options[key] = strat(parent[key], child[key], vm, key);
}
return options
}
/**
* Resolve an asset.
* This function is used because child instances need access
* to assets defined in its ancestor chain.
*/
function resolveAsset (
options,
type,
id,
warnMissing
) {
/* istanbul ignore if */
if (typeof id !== 'string') {
return
}
var assets = options[type];
// check local registration variations first
if (hasOwn(assets, id)) { return assets[id] }
var camelizedId = camelize(id);
if (hasOwn(assets, camelizedId)) { return assets[camelizedId] }
var PascalCaseId = capitalize(camelizedId);
if (hasOwn(assets, PascalCaseId)) { return assets[PascalCaseId] }
// fallback to prototype chain
var res = assets[id] || assets[camelizedId] || assets[PascalCaseId];
return res
}
/* */
function validateProp (
key,
propOptions,
propsData,
vm
) {
var prop = propOptions[key];
var absent = !hasOwn(propsData, key);
var value = propsData[key];
// boolean casting
var booleanIndex = getTypeIndex(Boolean, prop.type);
if (booleanIndex > -1) {
if (absent && !hasOwn(prop, 'default')) {
value = false;
} else if (value === '' || value === hyphenate(key)) {
// only cast empty string / same name to boolean if
// boolean has higher priority
var stringIndex = getTypeIndex(String, prop.type);
if (stringIndex < 0 || booleanIndex < stringIndex) {
value = true;
}
}
}
// check default value
if (value === undefined) {
value = getPropDefaultValue(vm, prop, key);
// since the default value is a fresh copy,
// make sure to observe it.
var prevShouldObserve = shouldObserve;
toggleObserving(true);
observe(value);
toggleObserving(prevShouldObserve);
}
return value
}
/**
* Get the default value of a prop.
*/
function getPropDefaultValue (vm, prop, key) {
// no default, return undefined
if (!hasOwn(prop, 'default')) {
return undefined
}
var def = prop.default;
// the raw prop value was also undefined from previous render,
// return previous default value to avoid unnecessary watcher trigger
if (vm && vm.$options.propsData &&
vm.$options.propsData[key] === undefined &&
vm._props[key] !== undefined
) {
return vm._props[key]
}
// call factory function for non-Function types
// a value is Function if its prototype is function even across different execution context
return typeof def === 'function' && getType(prop.type) !== 'Function'
? def.call(vm)
: def
}
/**
* Use function string name to check built-in types,
* because a simple equality check will fail when running
* across different vms / iframes.
*/
function getType (fn) {
var match = fn && fn.toString().match(/^\s*function (\w+)/);
return match ? match[1] : ''
}
function isSameType (a, b) {
return getType(a) === getType(b)
}
function getTypeIndex (type, expectedTypes) {
if (!Array.isArray(expectedTypes)) {
return isSameType(expectedTypes, type) ? 0 : -1
}
for (var i = 0, len = expectedTypes.length; i < len; i++) {
if (isSameType(expectedTypes[i], type)) {
return i
}
}
return -1
}
/* */
function handleError (err, vm, info) {
// Deactivate deps tracking while processing error handler to avoid possible infinite rendering.
// See: https://github.com/vuejs/vuex/issues/1505
pushTarget();
try {
if (vm) {
var cur = vm;
while ((cur = cur.$parent)) {
var hooks = cur.$options.errorCaptured;
if (hooks) {
for (var i = 0; i < hooks.length; i++) {
try {
var capture = hooks[i].call(cur, err, vm, info) === false;
if (capture) { return }
} catch (e) {
globalHandleError(e, cur, 'errorCaptured hook');
}
}
}
}
}
globalHandleError(err, vm, info);
} finally {
popTarget();
}
}
function invokeWithErrorHandling (
handler,
context,
args,
vm,
info
) {
var res;
try {
res = args ? handler.apply(context, args) : handler.call(context);
if (res && !res._isVue && isPromise(res) && !res._handled) {
res.catch(function (e) { return handleError(e, vm, info + " (Promise/async)"); });
// issue #9511
// avoid catch triggering multiple times when nested calls
res._handled = true;
}
} catch (e) {
handleError(e, vm, info);
}
return res
}
function globalHandleError (err, vm, info) {
if (config.errorHandler) {
try {
return config.errorHandler.call(null, err, vm, info)
} catch (e) {
// if the user intentionally throws the original error in the handler,
// do not log it twice
if (e !== err) {
logError(e);
}
}
}
logError(err);
}
function logError (err, vm, info) {
/* istanbul ignore else */
if ((inBrowser || inWeex) && typeof console !== 'undefined') {
console.error(err);
} else {
throw err
}
}
/* */
var isUsingMicroTask = false;
var callbacks = [];
var pending = false;
function flushCallbacks () {
pending = false;
var copies = callbacks.slice(0);
callbacks.length = 0;
for (var i = 0; i < copies.length; i++) {
copies[i]();
}
}
// Here we have async deferring wrappers using microtasks.
// In 2.5 we used (macro) tasks (in combination with microtasks).
// However, it has subtle problems when state is changed right before repaint
// (e.g. #6813, out-in transitions).
// Also, using (macro) tasks in event handler would cause some weird behaviors
// that cannot be circumvented (e.g. #7109, #7153, #7546, #7834, #8109).
// So we now use microtasks everywhere, again.
// A major drawback of this tradeoff is that there are some scenarios
// where microtasks have too high a priority and fire in between supposedly
// sequential events (e.g. #4521, #6690, which have workarounds)
// or even between bubbling of the same event (#6566).
var timerFunc;
// The nextTick behavior leverages the microtask queue, which can be accessed
// via either native Promise.then or MutationObserver.
// MutationObserver has wider support, however it is seriously bugged in
// UIWebView in iOS >= 9.3.3 when triggered in touch event handlers. It
// completely stops working after triggering a few times... so, if native
// Promise is available, we will use it:
/* istanbul ignore next, $flow-disable-line */
if (typeof Promise !== 'undefined' && isNative(Promise)) {
var p = Promise.resolve();
timerFunc = function () {
p.then(flushCallbacks);
// In problematic UIWebViews, Promise.then doesn't completely break, but
// it can get stuck in a weird state where callbacks are pushed into the
// microtask queue but the queue isn't being flushed, until the browser
// needs to do some other work, e.g. handle a timer. Therefore we can
// "force" the microtask queue to be flushed by adding an empty timer.
if (isIOS) { setTimeout(noop); }
};
isUsingMicroTask = true;
} else if (!isIE && typeof MutationObserver !== 'undefined' && (
isNative(MutationObserver) ||
// PhantomJS and iOS 7.x
MutationObserver.toString() === '[object MutationObserverConstructor]'
)) {
// Use MutationObserver where native Promise is not available,
// e.g. PhantomJS, iOS7, Android 4.4
// (#6466 MutationObserver is unreliable in IE11)
var counter = 1;
var observer = new MutationObserver(flushCallbacks);
var textNode = document.createTextNode(String(counter));
observer.observe(textNode, {
characterData: true
});
timerFunc = function () {
counter = (counter + 1) % 2;
textNode.data = String(counter);
};
isUsingMicroTask = true;
} else if (typeof setImmediate !== 'undefined' && isNative(setImmediate)) {
// Fallback to setImmediate.
// Technically it leverages the (macro) task queue,
// but it is still a better choice than setTimeout.
timerFunc = function () {
setImmediate(flushCallbacks);
};
} else {
// Fallback to setTimeout.
timerFunc = function () {
setTimeout(flushCallbacks, 0);
};
}
function nextTick (cb, ctx) {
var _resolve;
callbacks.push(function () {
if (cb) {
try {
cb.call(ctx);
} catch (e) {
handleError(e, ctx, 'nextTick');
}
} else if (_resolve) {
_resolve(ctx);
}
});
if (!pending) {
pending = true;
timerFunc();
}
// $flow-disable-line
if (!cb && typeof Promise !== 'undefined') {
return new Promise(function (resolve) {
_resolve = resolve;
})
}
}
/* */
var seenObjects = new _Set();
/**
* Recursively traverse an object to evoke all converted
* getters, so that every nested property inside the object
* is collected as a "deep" dependency.
*/
function traverse (val) {
_traverse(val, seenObjects);
seenObjects.clear();
}
function _traverse (val, seen) {
var i, keys;
var isA = Array.isArray(val);
if ((!isA && !isObject(val)) || Object.isFrozen(val) || val instanceof VNode) {
return
}
if (val.__ob__) {
var depId = val.__ob__.dep.id;
if (seen.has(depId)) {
return
}
seen.add(depId);
}
if (isA) {
i = val.length;
while (i--) { _traverse(val[i], seen); }
} else {
keys = Object.keys(val);
i = keys.length;
while (i--) { _traverse(val[keys[i]], seen); }
}
}
/* */
var normalizeEvent = cached(function (name) {
var passive = name.charAt(0) === '&';
name = passive ? name.slice(1) : name;
var once$$1 = name.charAt(0) === '~'; // Prefixed last, checked first
name = once$$1 ? name.slice(1) : name;
var capture = name.charAt(0) === '!';
name = capture ? name.slice(1) : name;
return {
name: name,
once: once$$1,
capture: capture,
passive: passive
}
});
function createFnInvoker (fns, vm) {
function invoker () {
var arguments$1 = arguments;
var fns = invoker.fns;
if (Array.isArray(fns)) {
var cloned = fns.slice();
for (var i = 0; i < cloned.length; i++) {
invokeWithErrorHandling(cloned[i], null, arguments$1, vm, "v-on handler");
}
} else {
// return handler return value for single handlers
return invokeWithErrorHandling(fns, null, arguments, vm, "v-on handler")
}
}
invoker.fns = fns;
return invoker
}
function updateListeners (
on,
oldOn,
add,
remove$$1,
createOnceHandler,
vm
) {
var name, def$$1, cur, old, event;
for (name in on) {
def$$1 = cur = on[name];
old = oldOn[name];
event = normalizeEvent(name);
if (isUndef(cur)) ; else if (isUndef(old)) {
if (isUndef(cur.fns)) {
cur = on[name] = createFnInvoker(cur, vm);
}
if (isTrue(event.once)) {
cur = on[name] = createOnceHandler(event.name, cur, event.capture);
}
add(event.name, cur, event.capture, event.passive, event.params);
} else if (cur !== old) {
old.fns = cur;
on[name] = old;
}
}
for (name in oldOn) {
if (isUndef(on[name])) {
event = normalizeEvent(name);
remove$$1(event.name, oldOn[name], event.capture);
}
}
}
/* */
function mergeVNodeHook (def, hookKey, hook) {
if (def instanceof VNode) {
def = def.data.hook || (def.data.hook = {});
}
var invoker;
var oldHook = def[hookKey];
function wrappedHook () {
hook.apply(this, arguments);
// important: remove merged hook to ensure it's called only once
// and prevent memory leak
remove(invoker.fns, wrappedHook);
}
if (isUndef(oldHook)) {
// no existing hook
invoker = createFnInvoker([wrappedHook]);
} else {
/* istanbul ignore if */
if (isDef(oldHook.fns) && isTrue(oldHook.merged)) {
// already a merged invoker
invoker = oldHook;
invoker.fns.push(wrappedHook);
} else {
// existing plain hook
invoker = createFnInvoker([oldHook, wrappedHook]);
}
}
invoker.merged = true;
def[hookKey] = invoker;
}
/* */
function extractPropsFromVNodeData (
data,
Ctor,
tag
) {
// we are only extracting raw values here.
// validation and default values are handled in the child
// component itself.
var propOptions = Ctor.options.props;
if (isUndef(propOptions)) {
return
}
var res = {};
var attrs = data.attrs;
var props = data.props;
if (isDef(attrs) || isDef(props)) {
for (var key in propOptions) {
var altKey = hyphenate(key);
checkProp(res, props, key, altKey, true) ||
checkProp(res, attrs, key, altKey, false);
}
}
return res
}
function checkProp (
res,
hash,
key,
altKey,
preserve
) {
if (isDef(hash)) {
if (hasOwn(hash, key)) {
res[key] = hash[key];
if (!preserve) {
delete hash[key];
}
return true
} else if (hasOwn(hash, altKey)) {
res[key] = hash[altKey];
if (!preserve) {
delete hash[altKey];
}
return true
}
}
return false
}
/* */
// The template compiler attempts to minimize the need for normalization by
// statically analyzing the template at compile time.
//
// For plain HTML markup, normalization can be completely skipped because the
// generated render function is guaranteed to return Array<VNode>. There are
// two cases where extra normalization is needed:
// 1. When the children contains components - because a functional component
// may return an Array instead of a single root. In this case, just a simple
// normalization is needed - if any child is an Array, we flatten the whole
// thing with Array.prototype.concat. It is guaranteed to be only 1-level deep
// because functional components already normalize their own children.
function simpleNormalizeChildren (children) {
for (var i = 0; i < children.length; i++) {
if (Array.isArray(children[i])) {
return Array.prototype.concat.apply([], children)
}
}
return children
}
// 2. When the children contains constructs that always generated nested Arrays,
// e.g. <template>, <slot>, v-for, or when the children is provided by user
// with hand-written render functions / JSX. In such cases a full normalization
// is needed to cater to all possible types of children values.
function normalizeChildren (children) {
return isPrimitive(children)
? [createTextVNode(children)]
: Array.isArray(children)
? normalizeArrayChildren(children)
: undefined
}
function isTextNode (node) {
return isDef(node) && isDef(node.text) && isFalse(node.isComment)
}
function normalizeArrayChildren (children, nestedIndex) {
var res = [];
var i, c, lastIndex, last;
for (i = 0; i < children.length; i++) {
c = children[i];
if (isUndef(c) || typeof c === 'boolean') { continue }
lastIndex = res.length - 1;
last = res[lastIndex];
// nested
if (Array.isArray(c)) {
if (c.length > 0) {
c = normalizeArrayChildren(c, ((nestedIndex || '') + "_" + i));
// merge adjacent text nodes
if (isTextNode(c[0]) && isTextNode(last)) {
res[lastIndex] = createTextVNode(last.text + (c[0]).text);
c.shift();
}
res.push.apply(res, c);
}
} else if (isPrimitive(c)) {
if (isTextNode(last)) {
// merge adjacent text nodes
// this is necessary for SSR hydration because text nodes are
// essentially merged when rendered to HTML strings
res[lastIndex] = createTextVNode(last.text + c);
} else if (c !== '') {
// convert primitive to vnode
res.push(createTextVNode(c));
}
} else {
if (isTextNode(c) && isTextNode(last)) {
// merge adjacent text nodes
res[lastIndex] = createTextVNode(last.text + c.text);
} else {
// default key for nested array children (likely generated by v-for)
if (isTrue(children._isVList) &&
isDef(c.tag) &&
isUndef(c.key) &&
isDef(nestedIndex)) {
c.key = "__vlist" + nestedIndex + "_" + i + "__";
}
res.push(c);
}
}
}
return res
}
/* */
function initProvide (vm) {
var provide = vm.$options.provide;
if (provide) {
vm._provided = typeof provide === 'function'
? provide.call(vm)
: provide;
}
}
function initInjections (vm) {
var result = resolveInject(vm.$options.inject, vm);
if (result) {
toggleObserving(false);
Object.keys(result).forEach(function (key) {
/* istanbul ignore else */
{
defineReactive$$1(vm, key, result[key]);
}
});
toggleObserving(true);
}
}
function resolveInject (inject, vm) {
if (inject) {
// inject is :any because flow is not smart enough to figure out cached
var result = Object.create(null);
var keys = hasSymbol
? Reflect.ownKeys(inject)
: Object.keys(inject);
for (var i = 0; i < keys.length; i++) {
var key = keys[i];
// #6574 in case the inject object is observed...
if (key === '__ob__') { continue }
var provideKey = inject[key].from;
var source = vm;
while (source) {
if (source._provided && hasOwn(source._provided, provideKey)) {
result[key] = source._provided[provideKey];
break
}
source = source.$parent;
}
if (!source) {
if ('default' in inject[key]) {
var provideDefault = inject[key].default;
result[key] = typeof provideDefault === 'function'
? provideDefault.call(vm)
: provideDefault;
}
}
}
return result
}
}
/* */
/**
* Runtime helper for resolving raw children VNodes into a slot object.
*/
function resolveSlots (
children,
context
) {
if (!children || !children.length) {
return {}
}
var slots = {};
for (var i = 0, l = children.length; i < l; i++) {
var child = children[i];
var data = child.data;
// remove slot attribute if the node is resolved as a Vue slot node
if (data && data.attrs && data.attrs.slot) {
delete data.attrs.slot;
}
// named slots should only be respected if the vnode was rendered in the
// same context.
if ((child.context === context || child.fnContext === context) &&
data && data.slot != null
) {
var name = data.slot;
var slot = (slots[name] || (slots[name] = []));
if (child.tag === 'template') {
slot.push.apply(slot, child.children || []);
} else {
slot.push(child);
}
} else {
(slots.default || (slots.default = [])).push(child);
}
}
// ignore slots that contains only whitespace
for (var name$1 in slots) {
if (slots[name$1].every(isWhitespace)) {
delete slots[name$1];
}
}
return slots
}
function isWhitespace (node) {
return (node.isComment && !node.asyncFactory) || node.text === ' '
}
/* */
function normalizeScopedSlots (
slots,
normalSlots,
prevSlots
) {
var res;
var hasNormalSlots = Object.keys(normalSlots).length > 0;
var isStable = slots ? !!slots.$stable : !hasNormalSlots;
var key = slots && slots.$key;
if (!slots) {
res = {};
} else if (slots._normalized) {
// fast path 1: child component re-render only, parent did not change
return slots._normalized
} else if (
isStable &&
prevSlots &&
prevSlots !== emptyObject &&
key === prevSlots.$key &&
!hasNormalSlots &&
!prevSlots.$hasNormal
) {
// fast path 2: stable scoped slots w/ no normal slots to proxy,
// only need to normalize once
return prevSlots
} else {
res = {};
for (var key$1 in slots) {
if (slots[key$1] && key$1[0] !== '$') {
res[key$1] = normalizeScopedSlot(normalSlots, key$1, slots[key$1]);
}
}
}
// expose normal slots on scopedSlots
for (var key$2 in normalSlots) {
if (!(key$2 in res)) {
res[key$2] = proxyNormalSlot(normalSlots, key$2);
}
}
// avoriaz seems to mock a non-extensible $scopedSlots object
// and when that is passed down this would cause an error
if (slots && Object.isExtensible(slots)) {
(slots)._normalized = res;
}
def(res, '$stable', isStable);
def(res, '$key', key);
def(res, '$hasNormal', hasNormalSlots);
return res
}
function normalizeScopedSlot(normalSlots, key, fn) {
var normalized = function () {
var res = arguments.length ? fn.apply(null, arguments) : fn({});
res = res && typeof res === 'object' && !Array.isArray(res)
? [res] // single vnode
: normalizeChildren(res);
return res && (
res.length === 0 ||
(res.length === 1 && res[0].isComment) // #9658
) ? undefined
: res
};
// this is a slot using the new v-slot syntax without scope. although it is
// compiled as a scoped slot, render fn users would expect it to be present
// on this.$slots because the usage is semantically a normal slot.
if (fn.proxy) {
Object.defineProperty(normalSlots, key, {
get: normalized,
enumerable: true,
configurable: true
});
}
return normalized
}
function proxyNormalSlot(slots, key) {
return function () { return slots[key]; }
}
/* */
/**
* Runtime helper for rendering v-for lists.
*/
function renderList (
val,
render
) {
var ret, i, l, keys, key;
if (Array.isArray(val) || typeof val === 'string') {
ret = new Array(val.length);
for (i = 0, l = val.length; i < l; i++) {
ret[i] = render(val[i], i);
}
} else if (typeof val === 'number') {
ret = new Array(val);
for (i = 0; i < val; i++) {
ret[i] = render(i + 1, i);
}
} else if (isObject(val)) {
if (hasSymbol && val[Symbol.iterator]) {
ret = [];
var iterator = val[Symbol.iterator]();
var result = iterator.next();
while (!result.done) {
ret.push(render(result.value, ret.length));
result = iterator.next();
}
} else {
keys = Object.keys(val);
ret = new Array(keys.length);
for (i = 0, l = keys.length; i < l; i++) {
key = keys[i];
ret[i] = render(val[key], key, i);
}
}
}
if (!isDef(ret)) {
ret = [];
}
(ret)._isVList = true;
return ret
}
/* */
/**
* Runtime helper for rendering <slot>
*/
function renderSlot (
name,
fallback,
props,
bindObject
) {
var scopedSlotFn = this.$scopedSlots[name];
var nodes;
if (scopedSlotFn) { // scoped slot
props = props || {};
if (bindObject) {
props = extend(extend({}, bindObject), props);
}
nodes = scopedSlotFn(props) || fallback;
} else {
nodes = this.$slots[name] || fallback;
}
var target = props && props.slot;
if (target) {
return this.$createElement('template', { slot: target }, nodes)
} else {
return nodes
}
}
/* */
/**
* Runtime helper for resolving filters
*/
function resolveFilter (id) {
return resolveAsset(this.$options, 'filters', id) || identity
}
/* */
function isKeyNotMatch (expect, actual) {
if (Array.isArray(expect)) {
return expect.indexOf(actual) === -1
} else {
return expect !== actual
}
}
/**
* Runtime helper for checking keyCodes from config.
* exposed as Vue.prototype._k
* passing in eventKeyName as last argument separately for backwards compat
*/
function checkKeyCodes (
eventKeyCode,
key,
builtInKeyCode,
eventKeyName,
builtInKeyName
) {
var mappedKeyCode = config.keyCodes[key] || builtInKeyCode;
if (builtInKeyName && eventKeyName && !config.keyCodes[key]) {
return isKeyNotMatch(builtInKeyName, eventKeyName)
} else if (mappedKeyCode) {
return isKeyNotMatch(mappedKeyCode, eventKeyCode)
} else if (eventKeyName) {
return hyphenate(eventKeyName) !== key
}
}
/* */
/**
* Runtime helper for merging v-bind="object" into a VNode's data.
*/
function bindObjectProps (
data,
tag,
value,
asProp,
isSync
) {
if (value) {
if (!isObject(value)) ; else {
if (Array.isArray(value)) {
value = toObject(value);
}
var hash;
var loop = function ( key ) {
if (
key === 'class' ||
key === 'style' ||
isReservedAttribute(key)
) {
hash = data;
} else {
var type = data.attrs && data.attrs.type;
hash = asProp || config.mustUseProp(tag, type, key)
? data.domProps || (data.domProps = {})
: data.attrs || (data.attrs = {});
}
var camelizedKey = camelize(key);
var hyphenatedKey = hyphenate(key);
if (!(camelizedKey in hash) && !(hyphenatedKey in hash)) {
hash[key] = value[key];
if (isSync) {
var on = data.on || (data.on = {});
on[("update:" + key)] = function ($event) {
value[key] = $event;
};
}
}
};
for (var key in value) loop( key );
}
}
return data
}
/* */
/**
* Runtime helper for rendering static trees.
*/
function renderStatic (
index,
isInFor
) {
var cached = this._staticTrees || (this._staticTrees = []);
var tree = cached[index];
// if has already-rendered static tree and not inside v-for,
// we can reuse the same tree.
if (tree && !isInFor) {
return tree
}
// otherwise, render a fresh tree.
tree = cached[index] = this.$options.staticRenderFns[index].call(
this._renderProxy,
null,
this // for render fns generated for functional component templates
);
markStatic(tree, ("__static__" + index), false);
return tree
}
/**
* Runtime helper for v-once.
* Effectively it means marking the node as static with a unique key.
*/
function markOnce (
tree,
index,
key
) {
markStatic(tree, ("__once__" + index + (key ? ("_" + key) : "")), true);
return tree
}
function markStatic (
tree,
key,
isOnce
) {
if (Array.isArray(tree)) {
for (var i = 0; i < tree.length; i++) {
if (tree[i] && typeof tree[i] !== 'string') {
markStaticNode(tree[i], (key + "_" + i), isOnce);
}
}
} else {
markStaticNode(tree, key, isOnce);
}
}
function markStaticNode (node, key, isOnce) {
node.isStatic = true;
node.key = key;
node.isOnce = isOnce;
}
/* */
function bindObjectListeners (data, value) {
if (value) {
if (!isPlainObject(value)) ; else {
var on = data.on = data.on ? extend({}, data.on) : {};
for (var key in value) {
var existing = on[key];
var ours = value[key];
on[key] = existing ? [].concat(existing, ours) : ours;
}
}
}
return data
}
/* */
function resolveScopedSlots (
fns, // see flow/vnode
res,
// the following are added in 2.6
hasDynamicKeys,
contentHashKey
) {
res = res || { $stable: !hasDynamicKeys };
for (var i = 0; i < fns.length; i++) {
var slot = fns[i];
if (Array.isArray(slot)) {
resolveScopedSlots(slot, res, hasDynamicKeys);
} else if (slot) {
// marker for reverse proxying v-slot without scope on this.$slots
if (slot.proxy) {
slot.fn.proxy = true;
}
res[slot.key] = slot.fn;
}
}
if (contentHashKey) {
(res).$key = contentHashKey;
}
return res
}
/* */
function bindDynamicKeys (baseObj, values) {
for (var i = 0; i < values.length; i += 2) {
var key = values[i];
if (typeof key === 'string' && key) {
baseObj[values[i]] = values[i + 1];
}
}
return baseObj
}
// helper to dynamically append modifier runtime markers to event names.
// ensure only append when value is already string, otherwise it will be cast
// to string and cause the type check to miss.
function prependModifier (value, symbol) {
return typeof value === 'string' ? symbol + value : value
}
/* */
function installRenderHelpers (target) {
target._o = markOnce;
target._n = toNumber;
target._s = toString;
target._l = renderList;
target._t = renderSlot;
target._q = looseEqual;
target._i = looseIndexOf;
target._m = renderStatic;
target._f = resolveFilter;
target._k = checkKeyCodes;
target._b = bindObjectProps;
target._v = createTextVNode;
target._e = createEmptyVNode;
target._u = resolveScopedSlots;
target._g = bindObjectListeners;
target._d = bindDynamicKeys;
target._p = prependModifier;
}
/* */
function FunctionalRenderContext (
data,
props,
children,
parent,
Ctor
) {
var this$1 = this;
var options = Ctor.options;
// ensure the createElement function in functional components
// gets a unique context - this is necessary for correct named slot check
var contextVm;
if (hasOwn(parent, '_uid')) {
contextVm = Object.create(parent);
// $flow-disable-line
contextVm._original = parent;
} else {
// the context vm passed in is a functional context as well.
// in this case we want to make sure we are able to get a hold to the
// real context instance.
contextVm = parent;
// $flow-disable-line
parent = parent._original;
}
var isCompiled = isTrue(options._compiled);
var needNormalization = !isCompiled;
this.data = data;
this.props = props;
this.children = children;
this.parent = parent;
this.listeners = data.on || emptyObject;
this.injections = resolveInject(options.inject, parent);
this.slots = function () {
if (!this$1.$slots) {
normalizeScopedSlots(
data.scopedSlots,
this$1.$slots = resolveSlots(children, parent)
);
}
return this$1.$slots
};
Object.defineProperty(this, 'scopedSlots', ({
enumerable: true,
get: function get () {
return normalizeScopedSlots(data.scopedSlots, this.slots())
}
}));
// support for compiled functional template
if (isCompiled) {
// exposing $options for renderStatic()
this.$options = options;
// pre-resolve slots for renderSlot()
this.$slots = this.slots();
this.$scopedSlots = normalizeScopedSlots(data.scopedSlots, this.$slots);
}
if (options._scopeId) {
this._c = function (a, b, c, d) {
var vnode = createElement(contextVm, a, b, c, d, needNormalization);
if (vnode && !Array.isArray(vnode)) {
vnode.fnScopeId = options._scopeId;
vnode.fnContext = parent;
}
return vnode
};
} else {
this._c = function (a, b, c, d) { return createElement(contextVm, a, b, c, d, needNormalization); };
}
}
installRenderHelpers(FunctionalRenderContext.prototype);
function createFunctionalComponent (
Ctor,
propsData,
data,
contextVm,
children
) {
var options = Ctor.options;
var props = {};
var propOptions = options.props;
if (isDef(propOptions)) {
for (var key in propOptions) {
props[key] = validateProp(key, propOptions, propsData || emptyObject);
}
} else {
if (isDef(data.attrs)) { mergeProps(props, data.attrs); }
if (isDef(data.props)) { mergeProps(props, data.props); }
}
var renderContext = new FunctionalRenderContext(
data,
props,
children,
contextVm,
Ctor
);
var vnode = options.render.call(null, renderContext._c, renderContext);
if (vnode instanceof VNode) {
return cloneAndMarkFunctionalResult(vnode, data, renderContext.parent, options)
} else if (Array.isArray(vnode)) {
var vnodes = normalizeChildren(vnode) || [];
var res = new Array(vnodes.length);
for (var i = 0; i < vnodes.length; i++) {
res[i] = cloneAndMarkFunctionalResult(vnodes[i], data, renderContext.parent, options);
}
return res
}
}
function cloneAndMarkFunctionalResult (vnode, data, contextVm, options, renderContext) {
// #7817 clone node before setting fnContext, otherwise if the node is reused
// (e.g. it was from a cached normal slot) the fnContext causes named slots
// that should not be matched to match.
var clone = cloneVNode(vnode);
clone.fnContext = contextVm;
clone.fnOptions = options;
if (data.slot) {
(clone.data || (clone.data = {})).slot = data.slot;
}
return clone
}
function mergeProps (to, from) {
for (var key in from) {
to[camelize(key)] = from[key];
}
}
/* */
/* */
/* */
/* */
// inline hooks to be invoked on component VNodes during patch
var componentVNodeHooks = {
init: function init (vnode, hydrating) {
if (
vnode.componentInstance &&
!vnode.componentInstance._isDestroyed &&
vnode.data.keepAlive
) {
// kept-alive components, treat as a patch
var mountedNode = vnode; // work around flow
componentVNodeHooks.prepatch(mountedNode, mountedNode);
} else {
var child = vnode.componentInstance = createComponentInstanceForVnode(
vnode,
activeInstance
);
child.$mount(hydrating ? vnode.elm : undefined, hydrating);
}
},
prepatch: function prepatch (oldVnode, vnode) {
var options = vnode.componentOptions;
var child = vnode.componentInstance = oldVnode.componentInstance;
updateChildComponent(
child,
options.propsData, // updated props
options.listeners, // updated listeners
vnode, // new parent vnode
options.children // new children
);
},
insert: function insert (vnode) {
var context = vnode.context;
var componentInstance = vnode.componentInstance;
if (!componentInstance._isMounted) {
componentInstance._isMounted = true;
callHook(componentInstance, 'mounted');
}
if (vnode.data.keepAlive) {
if (context._isMounted) {
// vue-router#1212
// During updates, a kept-alive component's child components may
// change, so directly walking the tree here may call activated hooks
// on incorrect children. Instead we push them into a queue which will
// be processed after the whole patch process ended.
queueActivatedComponent(componentInstance);
} else {
activateChildComponent(componentInstance, true /* direct */);
}
}
},
destroy: function destroy (vnode) {
var componentInstance = vnode.componentInstance;
if (!componentInstance._isDestroyed) {
if (!vnode.data.keepAlive) {
componentInstance.$destroy();
} else {
deactivateChildComponent(componentInstance, true /* direct */);
}
}
}
};
var hooksToMerge = Object.keys(componentVNodeHooks);
function createComponent (
Ctor,
data,
context,
children,
tag
) {
if (isUndef(Ctor)) {
return
}
var baseCtor = context.$options._base;
// plain options object: turn it into a constructor
if (isObject(Ctor)) {
Ctor = baseCtor.extend(Ctor);
}
// if at this stage it's not a constructor or an async component factory,
// reject.
if (typeof Ctor !== 'function') {
return
}
// async component
var asyncFactory;
if (isUndef(Ctor.cid)) {
asyncFactory = Ctor;
Ctor = resolveAsyncComponent(asyncFactory, baseCtor);
if (Ctor === undefined) {
// return a placeholder node for async component, which is rendered
// as a comment node but preserves all the raw information for the node.
// the information will be used for async server-rendering and hydration.
return createAsyncPlaceholder(
asyncFactory,
data,
context,
children,
tag
)
}
}
data = data || {};
// resolve constructor options in case global mixins are applied after
// component constructor creation
resolveConstructorOptions(Ctor);
// transform component v-model data into props & events
if (isDef(data.model)) {
transformModel(Ctor.options, data);
}
// extract props
var propsData = extractPropsFromVNodeData(data, Ctor);
// functional component
if (isTrue(Ctor.options.functional)) {
return createFunctionalComponent(Ctor, propsData, data, context, children)
}
// extract listeners, since these needs to be treated as
// child component listeners instead of DOM listeners
var listeners = data.on;
// replace with listeners with .native modifier
// so it gets processed during parent component patch.
data.on = data.nativeOn;
if (isTrue(Ctor.options.abstract)) {
// abstract components do not keep anything
// other than props & listeners & slot
// work around flow
var slot = data.slot;
data = {};
if (slot) {
data.slot = slot;
}
}
// install component management hooks onto the placeholder node
installComponentHooks(data);
// return a placeholder vnode
var name = Ctor.options.name || tag;
var vnode = new VNode(
("vue-component-" + (Ctor.cid) + (name ? ("-" + name) : '')),
data, undefined, undefined, undefined, context,
{ Ctor: Ctor, propsData: propsData, listeners: listeners, tag: tag, children: children },
asyncFactory
);
return vnode
}
function createComponentInstanceForVnode (
vnode, // we know it's MountedComponentVNode but flow doesn't
parent // activeInstance in lifecycle state
) {
var options = {
_isComponent: true,
_parentVnode: vnode,
parent: parent
};
// check inline-template render functions
var inlineTemplate = vnode.data.inlineTemplate;
if (isDef(inlineTemplate)) {
options.render = inlineTemplate.render;
options.staticRenderFns = inlineTemplate.staticRenderFns;
}
return new vnode.componentOptions.Ctor(options)
}
function installComponentHooks (data) {
var hooks = data.hook || (data.hook = {});
for (var i = 0; i < hooksToMerge.length; i++) {
var key = hooksToMerge[i];
var existing = hooks[key];
var toMerge = componentVNodeHooks[key];
if (existing !== toMerge && !(existing && existing._merged)) {
hooks[key] = existing ? mergeHook$1(toMerge, existing) : toMerge;
}
}
}
function mergeHook$1 (f1, f2) {
var merged = function (a, b) {
// flow complains about extra args which is why we use any
f1(a, b);
f2(a, b);
};
merged._merged = true;
return merged
}
// transform component v-model info (value and callback) into
// prop and event handler respectively.
function transformModel (options, data) {
var prop = (options.model && options.model.prop) || 'value';
var event = (options.model && options.model.event) || 'input'
;(data.attrs || (data.attrs = {}))[prop] = data.model.value;
var on = data.on || (data.on = {});
var existing = on[event];
var callback = data.model.callback;
if (isDef(existing)) {
if (
Array.isArray(existing)
? existing.indexOf(callback) === -1
: existing !== callback
) {
on[event] = [callback].concat(existing);
}
} else {
on[event] = callback;
}
}
/* */
var SIMPLE_NORMALIZE = 1;
var ALWAYS_NORMALIZE = 2;
// wrapper function for providing a more flexible interface
// without getting yelled at by flow
function createElement (
context,
tag,
data,
children,
normalizationType,
alwaysNormalize
) {
if (Array.isArray(data) || isPrimitive(data)) {
normalizationType = children;
children = data;
data = undefined;
}
if (isTrue(alwaysNormalize)) {
normalizationType = ALWAYS_NORMALIZE;
}
return _createElement(context, tag, data, children, normalizationType)
}
function _createElement (
context,
tag,
data,
children,
normalizationType
) {
if (isDef(data) && isDef((data).__ob__)) {
return createEmptyVNode()
}
// object syntax in v-bind
if (isDef(data) && isDef(data.is)) {
tag = data.is;
}
if (!tag) {
// in case of component :is set to falsy value
return createEmptyVNode()
}
// support single function children as default scoped slot
if (Array.isArray(children) &&
typeof children[0] === 'function'
) {
data = data || {};
data.scopedSlots = { default: children[0] };
children.length = 0;
}
if (normalizationType === ALWAYS_NORMALIZE) {
children = normalizeChildren(children);
} else if (normalizationType === SIMPLE_NORMALIZE) {
children = simpleNormalizeChildren(children);
}
var vnode, ns;
if (typeof tag === 'string') {
var Ctor;
ns = (context.$vnode && context.$vnode.ns) || config.getTagNamespace(tag);
if (config.isReservedTag(tag)) {
vnode = new VNode(
config.parsePlatformTagName(tag), data, children,
undefined, undefined, context
);
} else if ((!data || !data.pre) && isDef(Ctor = resolveAsset(context.$options, 'components', tag))) {
// component
vnode = createComponent(Ctor, data, context, children, tag);
} else {
// unknown or unlisted namespaced elements
// check at runtime because it may get assigned a namespace when its
// parent normalizes children
vnode = new VNode(
tag, data, children,
undefined, undefined, context
);
}
} else {
// direct component options / constructor
vnode = createComponent(tag, data, context, children);
}
if (Array.isArray(vnode)) {
return vnode
} else if (isDef(vnode)) {
if (isDef(ns)) { applyNS(vnode, ns); }
if (isDef(data)) { registerDeepBindings(data); }
return vnode
} else {
return createEmptyVNode()
}
}
function applyNS (vnode, ns, force) {
vnode.ns = ns;
if (vnode.tag === 'foreignObject') {
// use default namespace inside foreignObject
ns = undefined;
force = true;
}
if (isDef(vnode.children)) {
for (var i = 0, l = vnode.children.length; i < l; i++) {
var child = vnode.children[i];
if (isDef(child.tag) && (
isUndef(child.ns) || (isTrue(force) && child.tag !== 'svg'))) {
applyNS(child, ns, force);
}
}
}
}
// ref #5318
// necessary to ensure parent re-render when deep bindings like :style and
// :class are used on slot nodes
function registerDeepBindings (data) {
if (isObject(data.style)) {
traverse(data.style);
}
if (isObject(data.class)) {
traverse(data.class);
}
}
/* */
function initRender (vm) {
vm._vnode = null; // the root of the child tree
vm._staticTrees = null; // v-once cached trees
var options = vm.$options;
var parentVnode = vm.$vnode = options._parentVnode; // the placeholder node in parent tree
var renderContext = parentVnode && parentVnode.context;
vm.$slots = resolveSlots(options._renderChildren, renderContext);
vm.$scopedSlots = emptyObject;
// bind the createElement fn to this instance
// so that we get proper render context inside it.
// args order: tag, data, children, normalizationType, alwaysNormalize
// internal version is used by render functions compiled from templates
vm._c = function (a, b, c, d) { return createElement(vm, a, b, c, d, false); };
// normalization is always applied for the public version, used in
// user-written render functions.
vm.$createElement = function (a, b, c, d) { return createElement(vm, a, b, c, d, true); };
// $attrs & $listeners are exposed for easier HOC creation.
// they need to be reactive so that HOCs using them are always updated
var parentData = parentVnode && parentVnode.data;
/* istanbul ignore else */
{
defineReactive$$1(vm, '$attrs', parentData && parentData.attrs || emptyObject, null, true);
defineReactive$$1(vm, '$listeners', options._parentListeners || emptyObject, null, true);
}
}
var currentRenderingInstance = null;
function renderMixin (Vue) {
// install runtime convenience helpers
installRenderHelpers(Vue.prototype);
Vue.prototype.$nextTick = function (fn) {
return nextTick(fn, this)
};
Vue.prototype._render = function () {
var vm = this;
var ref = vm.$options;
var render = ref.render;
var _parentVnode = ref._parentVnode;
if (_parentVnode) {
vm.$scopedSlots = normalizeScopedSlots(
_parentVnode.data.scopedSlots,
vm.$slots,
vm.$scopedSlots
);
}
// set parent vnode. this allows render functions to have access
// to the data on the placeholder node.
vm.$vnode = _parentVnode;
// render self
var vnode;
try {
// There's no need to maintain a stack because all render fns are called
// separately from one another. Nested component's render fns are called
// when parent component is patched.
currentRenderingInstance = vm;
vnode = render.call(vm._renderProxy, vm.$createElement);
} catch (e) {
handleError(e, vm, "render");
// return error render result,
// or previous vnode to prevent render error causing blank component
/* istanbul ignore else */
{
vnode = vm._vnode;
}
} finally {
currentRenderingInstance = null;
}
// if the returned array contains only a single node, allow it
if (Array.isArray(vnode) && vnode.length === 1) {
vnode = vnode[0];
}
// return empty vnode in case the render function errored out
if (!(vnode instanceof VNode)) {
vnode = createEmptyVNode();
}
// set parent
vnode.parent = _parentVnode;
return vnode
};
}
/* */
function ensureCtor (comp, base) {
if (
comp.__esModule ||
(hasSymbol && comp[Symbol.toStringTag] === 'Module')
) {
comp = comp.default;
}
return isObject(comp)
? base.extend(comp)
: comp
}
function createAsyncPlaceholder (
factory,
data,
context,
children,
tag
) {
var node = createEmptyVNode();
node.asyncFactory = factory;
node.asyncMeta = { data: data, context: context, children: children, tag: tag };
return node
}
function resolveAsyncComponent (
factory,
baseCtor
) {
if (isTrue(factory.error) && isDef(factory.errorComp)) {
return factory.errorComp
}
if (isDef(factory.resolved)) {
return factory.resolved
}
var owner = currentRenderingInstance;
if (owner && isDef(factory.owners) && factory.owners.indexOf(owner) === -1) {
// already pending
factory.owners.push(owner);
}
if (isTrue(factory.loading) && isDef(factory.loadingComp)) {
return factory.loadingComp
}
if (owner && !isDef(factory.owners)) {
var owners = factory.owners = [owner];
var sync = true;
var timerLoading = null;
var timerTimeout = null
;(owner).$on('hook:destroyed', function () { return remove(owners, owner); });
var forceRender = function (renderCompleted) {
for (var i = 0, l = owners.length; i < l; i++) {
(owners[i]).$forceUpdate();
}
if (renderCompleted) {
owners.length = 0;
if (timerLoading !== null) {
clearTimeout(timerLoading);
timerLoading = null;
}
if (timerTimeout !== null) {
clearTimeout(timerTimeout);
timerTimeout = null;
}
}
};
var resolve = once(function (res) {
// cache resolved
factory.resolved = ensureCtor(res, baseCtor);
// invoke callbacks only if this is not a synchronous resolve
// (async resolves are shimmed as synchronous during SSR)
if (!sync) {
forceRender(true);
} else {
owners.length = 0;
}
});
var reject = once(function (reason) {
if (isDef(factory.errorComp)) {
factory.error = true;
forceRender(true);
}
});
var res = factory(resolve, reject);
if (isObject(res)) {
if (isPromise(res)) {
// () => Promise
if (isUndef(factory.resolved)) {
res.then(resolve, reject);
}
} else if (isPromise(res.component)) {
res.component.then(resolve, reject);
if (isDef(res.error)) {
factory.errorComp = ensureCtor(res.error, baseCtor);
}
if (isDef(res.loading)) {
factory.loadingComp = ensureCtor(res.loading, baseCtor);
if (res.delay === 0) {
factory.loading = true;
} else {
timerLoading = setTimeout(function () {
timerLoading = null;
if (isUndef(factory.resolved) && isUndef(factory.error)) {
factory.loading = true;
forceRender(false);
}
}, res.delay || 200);
}
}
if (isDef(res.timeout)) {
timerTimeout = setTimeout(function () {
timerTimeout = null;
if (isUndef(factory.resolved)) {
reject(
null
);
}
}, res.timeout);
}
}
}
sync = false;
// return in case resolved synchronously
return factory.loading
? factory.loadingComp
: factory.resolved
}
}
/* */
function isAsyncPlaceholder (node) {
return node.isComment && node.asyncFactory
}
/* */
function getFirstComponentChild (children) {
if (Array.isArray(children)) {
for (var i = 0; i < children.length; i++) {
var c = children[i];
if (isDef(c) && (isDef(c.componentOptions) || isAsyncPlaceholder(c))) {
return c
}
}
}
}
/* */
/* */
function initEvents (vm) {
vm._events = Object.create(null);
vm._hasHookEvent = false;
// init parent attached events
var listeners = vm.$options._parentListeners;
if (listeners) {
updateComponentListeners(vm, listeners);
}
}
var target;
function add (event, fn) {
target.$on(event, fn);
}
function remove$1 (event, fn) {
target.$off(event, fn);
}
function createOnceHandler (event, fn) {
var _target = target;
return function onceHandler () {
var res = fn.apply(null, arguments);
if (res !== null) {
_target.$off(event, onceHandler);
}
}
}
function updateComponentListeners (
vm,
listeners,
oldListeners
) {
target = vm;
updateListeners(listeners, oldListeners || {}, add, remove$1, createOnceHandler, vm);
target = undefined;
}
function eventsMixin (Vue) {
var hookRE = /^hook:/;
Vue.prototype.$on = function (event, fn) {
var vm = this;
if (Array.isArray(event)) {
for (var i = 0, l = event.length; i < l; i++) {
vm.$on(event[i], fn);
}
} else {
(vm._events[event] || (vm._events[event] = [])).push(fn);
// optimize hook:event cost by using a boolean flag marked at registration
// instead of a hash lookup
if (hookRE.test(event)) {
vm._hasHookEvent = true;
}
}
return vm
};
Vue.prototype.$once = function (event, fn) {
var vm = this;
function on () {
vm.$off(event, on);
fn.apply(vm, arguments);
}
on.fn = fn;
vm.$on(event, on);
return vm
};
Vue.prototype.$off = function (event, fn) {
var vm = this;
// all
if (!arguments.length) {
vm._events = Object.create(null);
return vm
}
// array of events
if (Array.isArray(event)) {
for (var i$1 = 0, l = event.length; i$1 < l; i$1++) {
vm.$off(event[i$1], fn);
}
return vm
}
// specific event
var cbs = vm._events[event];
if (!cbs) {
return vm
}
if (!fn) {
vm._events[event] = null;
return vm
}
// specific handler
var cb;
var i = cbs.length;
while (i--) {
cb = cbs[i];
if (cb === fn || cb.fn === fn) {
cbs.splice(i, 1);
break
}
}
return vm
};
Vue.prototype.$emit = function (event) {
var vm = this;
var cbs = vm._events[event];
if (cbs) {
cbs = cbs.length > 1 ? toArray(cbs) : cbs;
var args = toArray(arguments, 1);
var info = "event handler for \"" + event + "\"";
for (var i = 0, l = cbs.length; i < l; i++) {
invokeWithErrorHandling(cbs[i], vm, args, vm, info);
}
}
return vm
};
}
/* */
var activeInstance = null;
function setActiveInstance(vm) {
var prevActiveInstance = activeInstance;
activeInstance = vm;
return function () {
activeInstance = prevActiveInstance;
}
}
function initLifecycle (vm) {
var options = vm.$options;
// locate first non-abstract parent
var parent = options.parent;
if (parent && !options.abstract) {
while (parent.$options.abstract && parent.$parent) {
parent = parent.$parent;
}
parent.$children.push(vm);
}
vm.$parent = parent;
vm.$root = parent ? parent.$root : vm;
vm.$children = [];
vm.$refs = {};
vm._watcher = null;
vm._inactive = null;
vm._directInactive = false;
vm._isMounted = false;
vm._isDestroyed = false;
vm._isBeingDestroyed = false;
}
function lifecycleMixin (Vue) {
Vue.prototype._update = function (vnode, hydrating) {
var vm = this;
var prevEl = vm.$el;
var prevVnode = vm._vnode;
var restoreActiveInstance = setActiveInstance(vm);
vm._vnode = vnode;
// Vue.prototype.__patch__ is injected in entry points
// based on the rendering backend used.
if (!prevVnode) {
// initial render
vm.$el = vm.__patch__(vm.$el, vnode, hydrating, false /* removeOnly */);
} else {
// updates
vm.$el = vm.__patch__(prevVnode, vnode);
}
restoreActiveInstance();
// update __vue__ reference
if (prevEl) {
prevEl.__vue__ = null;
}
if (vm.$el) {
vm.$el.__vue__ = vm;
}
// if parent is an HOC, update its $el as well
if (vm.$vnode && vm.$parent && vm.$vnode === vm.$parent._vnode) {
vm.$parent.$el = vm.$el;
}
// updated hook is called by the scheduler to ensure that children are
// updated in a parent's updated hook.
};
Vue.prototype.$forceUpdate = function () {
var vm = this;
if (vm._watcher) {
vm._watcher.update();
}
};
Vue.prototype.$destroy = function () {
var vm = this;
if (vm._isBeingDestroyed) {
return
}
callHook(vm, 'beforeDestroy');
vm._isBeingDestroyed = true;
// remove self from parent
var parent = vm.$parent;
if (parent && !parent._isBeingDestroyed && !vm.$options.abstract) {
remove(parent.$children, vm);
}
// teardown watchers
if (vm._watcher) {
vm._watcher.teardown();
}
var i = vm._watchers.length;
while (i--) {
vm._watchers[i].teardown();
}
// remove reference from data ob
// frozen object may not have observer.
if (vm._data.__ob__) {
vm._data.__ob__.vmCount--;
}
// call the last hook...
vm._isDestroyed = true;
// invoke destroy hooks on current rendered tree
vm.__patch__(vm._vnode, null);
// fire destroyed hook
callHook(vm, 'destroyed');
// turn off all instance listeners.
vm.$off();
// remove __vue__ reference
if (vm.$el) {
vm.$el.__vue__ = null;
}
// release circular reference (#6759)
if (vm.$vnode) {
vm.$vnode.parent = null;
}
};
}
function mountComponent (
vm,
el,
hydrating
) {
vm.$el = el;
if (!vm.$options.render) {
vm.$options.render = createEmptyVNode;
}
callHook(vm, 'beforeMount');
var updateComponent;
/* istanbul ignore if */
{
updateComponent = function () {
vm._update(vm._render(), hydrating);
};
}
// we set this to vm._watcher inside the watcher's constructor
// since the watcher's initial patch may call $forceUpdate (e.g. inside child
// component's mounted hook), which relies on vm._watcher being already defined
new Watcher(vm, updateComponent, noop, {
before: function before () {
if (vm._isMounted && !vm._isDestroyed) {
callHook(vm, 'beforeUpdate');
}
}
}, true /* isRenderWatcher */);
hydrating = false;
// manually mounted instance, call mounted on self
// mounted is called for render-created child components in its inserted hook
if (vm.$vnode == null) {
vm._isMounted = true;
callHook(vm, 'mounted');
}
return vm
}
function updateChildComponent (
vm,
propsData,
listeners,
parentVnode,
renderChildren
) {
// determine whether component has slot children
// we need to do this before overwriting $options._renderChildren.
// check if there are dynamic scopedSlots (hand-written or compiled but with
// dynamic slot names). Static scoped slots compiled from template has the
// "$stable" marker.
var newScopedSlots = parentVnode.data.scopedSlots;
var oldScopedSlots = vm.$scopedSlots;
var hasDynamicScopedSlot = !!(
(newScopedSlots && !newScopedSlots.$stable) ||
(oldScopedSlots !== emptyObject && !oldScopedSlots.$stable) ||
(newScopedSlots && vm.$scopedSlots.$key !== newScopedSlots.$key)
);
// Any static slot children from the parent may have changed during parent's
// update. Dynamic scoped slots may also have changed. In such cases, a forced
// update is necessary to ensure correctness.
var needsForceUpdate = !!(
renderChildren || // has new static slots
vm.$options._renderChildren || // has old static slots
hasDynamicScopedSlot
);
vm.$options._parentVnode = parentVnode;
vm.$vnode = parentVnode; // update vm's placeholder node without re-render
if (vm._vnode) { // update child tree's parent
vm._vnode.parent = parentVnode;
}
vm.$options._renderChildren = renderChildren;
// update $attrs and $listeners hash
// these are also reactive so they may trigger child update if the child
// used them during render
vm.$attrs = parentVnode.data.attrs || emptyObject;
vm.$listeners = listeners || emptyObject;
// update props
if (propsData && vm.$options.props) {
toggleObserving(false);
var props = vm._props;
var propKeys = vm.$options._propKeys || [];
for (var i = 0; i < propKeys.length; i++) {
var key = propKeys[i];
var propOptions = vm.$options.props; // wtf flow?
props[key] = validateProp(key, propOptions, propsData, vm);
}
toggleObserving(true);
// keep a copy of raw propsData
vm.$options.propsData = propsData;
}
// update listeners
listeners = listeners || emptyObject;
var oldListeners = vm.$options._parentListeners;
vm.$options._parentListeners = listeners;
updateComponentListeners(vm, listeners, oldListeners);
// resolve slots + force update if has children
if (needsForceUpdate) {
vm.$slots = resolveSlots(renderChildren, parentVnode.context);
vm.$forceUpdate();
}
}
function isInInactiveTree (vm) {
while (vm && (vm = vm.$parent)) {
if (vm._inactive) { return true }
}
return false
}
function activateChildComponent (vm, direct) {
if (direct) {
vm._directInactive = false;
if (isInInactiveTree(vm)) {
return
}
} else if (vm._directInactive) {
return
}
if (vm._inactive || vm._inactive === null) {
vm._inactive = false;
for (var i = 0; i < vm.$children.length; i++) {
activateChildComponent(vm.$children[i]);
}
callHook(vm, 'activated');
}
}
function deactivateChildComponent (vm, direct) {
if (direct) {
vm._directInactive = true;
if (isInInactiveTree(vm)) {
return
}
}
if (!vm._inactive) {
vm._inactive = true;
for (var i = 0; i < vm.$children.length; i++) {
deactivateChildComponent(vm.$children[i]);
}
callHook(vm, 'deactivated');
}
}
function callHook (vm, hook) {
// #7573 disable dep collection when invoking lifecycle hooks
pushTarget();
var handlers = vm.$options[hook];
var info = hook + " hook";
if (handlers) {
for (var i = 0, j = handlers.length; i < j; i++) {
invokeWithErrorHandling(handlers[i], vm, null, vm, info);
}
}
if (vm._hasHookEvent) {
vm.$emit('hook:' + hook);
}
popTarget();
}
var queue = [];
var activatedChildren = [];
var has = {};
var waiting = false;
var flushing = false;
var index = 0;
/**
* Reset the scheduler's state.
*/
function resetSchedulerState () {
index = queue.length = activatedChildren.length = 0;
has = {};
waiting = flushing = false;
}
// Async edge case #6566 requires saving the timestamp when event listeners are
// attached. However, calling performance.now() has a perf overhead especially
// if the page has thousands of event listeners. Instead, we take a timestamp
// every time the scheduler flushes and use that for all event listeners
// attached during that flush.
var currentFlushTimestamp = 0;
// Async edge case fix requires storing an event listener's attach timestamp.
var getNow = Date.now;
// Determine what event timestamp the browser is using. Annoyingly, the
// timestamp can either be hi-res (relative to page load) or low-res
// (relative to UNIX epoch), so in order to compare time we have to use the
// same timestamp type when saving the flush timestamp.
// All IE versions use low-res event timestamps, and have problematic clock
// implementations (#9632)
if (inBrowser && !isIE) {
var performance = window.performance;
if (
performance &&
typeof performance.now === 'function' &&
getNow() > document.createEvent('Event').timeStamp
) {
// if the event timestamp, although evaluated AFTER the Date.now(), is
// smaller than it, it means the event is using a hi-res timestamp,
// and we need to use the hi-res version for event listener timestamps as
// well.
getNow = function () { return performance.now(); };
}
}
/**
* Flush both queues and run the watchers.
*/
function flushSchedulerQueue () {
currentFlushTimestamp = getNow();
flushing = true;
var watcher, id;
// Sort queue before flush.
// This ensures that:
// 1. Components are updated from parent to child. (because parent is always
// created before the child)
// 2. A component's user watchers are run before its render watcher (because
// user watchers are created before the render watcher)
// 3. If a component is destroyed during a parent component's watcher run,
// its watchers can be skipped.
queue.sort(function (a, b) { return a.id - b.id; });
// do not cache length because more watchers might be pushed
// as we run existing watchers
for (index = 0; index < queue.length; index++) {
watcher = queue[index];
if (watcher.before) {
watcher.before();
}
id = watcher.id;
has[id] = null;
watcher.run();
}
// keep copies of post queues before resetting state
var activatedQueue = activatedChildren.slice();
var updatedQueue = queue.slice();
resetSchedulerState();
// call component updated and activated hooks
callActivatedHooks(activatedQueue);
callUpdatedHooks(updatedQueue);
// devtool hook
/* istanbul ignore if */
if (devtools && config.devtools) {
devtools.emit('flush');
}
}
function callUpdatedHooks (queue) {
var i = queue.length;
while (i--) {
var watcher = queue[i];
var vm = watcher.vm;
if (vm._watcher === watcher && vm._isMounted && !vm._isDestroyed) {
callHook(vm, 'updated');
}
}
}
/**
* Queue a kept-alive component that was activated during patch.
* The queue will be processed after the entire tree has been patched.
*/
function queueActivatedComponent (vm) {
// setting _inactive to false here so that a render function can
// rely on checking whether it's in an inactive tree (e.g. router-view)
vm._inactive = false;
activatedChildren.push(vm);
}
function callActivatedHooks (queue) {
for (var i = 0; i < queue.length; i++) {
queue[i]._inactive = true;
activateChildComponent(queue[i], true /* true */);
}
}
/**
* Push a watcher into the watcher queue.
* Jobs with duplicate IDs will be skipped unless it's
* pushed when the queue is being flushed.
*/
function queueWatcher (watcher) {
var id = watcher.id;
if (has[id] == null) {
has[id] = true;
if (!flushing) {
queue.push(watcher);
} else {
// if already flushing, splice the watcher based on its id
// if already past its id, it will be run next immediately.
var i = queue.length - 1;
while (i > index && queue[i].id > watcher.id) {
i--;
}
queue.splice(i + 1, 0, watcher);
}
// queue the flush
if (!waiting) {
waiting = true;
nextTick(flushSchedulerQueue);
}
}
}
/* */
var uid$2 = 0;
/**
* A watcher parses an expression, collects dependencies,
* and fires callback when the expression value changes.
* This is used for both the $watch() api and directives.
*/
var Watcher = function Watcher (
vm,
expOrFn,
cb,
options,
isRenderWatcher
) {
this.vm = vm;
if (isRenderWatcher) {
vm._watcher = this;
}
vm._watchers.push(this);
// options
if (options) {
this.deep = !!options.deep;
this.user = !!options.user;
this.lazy = !!options.lazy;
this.sync = !!options.sync;
this.before = options.before;
} else {
this.deep = this.user = this.lazy = this.sync = false;
}
this.cb = cb;
this.id = ++uid$2; // uid for batching
this.active = true;
this.dirty = this.lazy; // for lazy watchers
this.deps = [];
this.newDeps = [];
this.depIds = new _Set();
this.newDepIds = new _Set();
this.expression = '';
// parse expression for getter
if (typeof expOrFn === 'function') {
this.getter = expOrFn;
} else {
this.getter = parsePath(expOrFn);
if (!this.getter) {
this.getter = noop;
}
}
this.value = this.lazy
? undefined
: this.get();
};
/**
* Evaluate the getter, and re-collect dependencies.
*/
Watcher.prototype.get = function get () {
pushTarget(this);
var value;
var vm = this.vm;
try {
value = this.getter.call(vm, vm);
} catch (e) {
if (this.user) {
handleError(e, vm, ("getter for watcher \"" + (this.expression) + "\""));
} else {
throw e
}
} finally {
// "touch" every property so they are all tracked as
// dependencies for deep watching
if (this.deep) {
traverse(value);
}
popTarget();
this.cleanupDeps();
}
return value
};
/**
* Add a dependency to this directive.
*/
Watcher.prototype.addDep = function addDep (dep) {
var id = dep.id;
if (!this.newDepIds.has(id)) {
this.newDepIds.add(id);
this.newDeps.push(dep);
if (!this.depIds.has(id)) {
dep.addSub(this);
}
}
};
/**
* Clean up for dependency collection.
*/
Watcher.prototype.cleanupDeps = function cleanupDeps () {
var i = this.deps.length;
while (i--) {
var dep = this.deps[i];
if (!this.newDepIds.has(dep.id)) {
dep.removeSub(this);
}
}
var tmp = this.depIds;
this.depIds = this.newDepIds;
this.newDepIds = tmp;
this.newDepIds.clear();
tmp = this.deps;
this.deps = this.newDeps;
this.newDeps = tmp;
this.newDeps.length = 0;
};
/**
* Subscriber interface.
* Will be called when a dependency changes.
*/
Watcher.prototype.update = function update () {
/* istanbul ignore else */
if (this.lazy) {
this.dirty = true;
} else if (this.sync) {
this.run();
} else {
queueWatcher(this);
}
};
/**
* Scheduler job interface.
* Will be called by the scheduler.
*/
Watcher.prototype.run = function run () {
if (this.active) {
var value = this.get();
if (
value !== this.value ||
// Deep watchers and watchers on Object/Arrays should fire even
// when the value is the same, because the value may
// have mutated.
isObject(value) ||
this.deep
) {
// set new value
var oldValue = this.value;
this.value = value;
if (this.user) {
try {
this.cb.call(this.vm, value, oldValue);
} catch (e) {
handleError(e, this.vm, ("callback for watcher \"" + (this.expression) + "\""));
}
} else {
this.cb.call(this.vm, value, oldValue);
}
}
}
};
/**
* Evaluate the value of the watcher.
* This only gets called for lazy watchers.
*/
Watcher.prototype.evaluate = function evaluate () {
this.value = this.get();
this.dirty = false;
};
/**
* Depend on all deps collected by this watcher.
*/
Watcher.prototype.depend = function depend () {
var i = this.deps.length;
while (i--) {
this.deps[i].depend();
}
};
/**
* Remove self from all dependencies' subscriber list.
*/
Watcher.prototype.teardown = function teardown () {
if (this.active) {
// remove self from vm's watcher list
// this is a somewhat expensive operation so we skip it
// if the vm is being destroyed.
if (!this.vm._isBeingDestroyed) {
remove(this.vm._watchers, this);
}
var i = this.deps.length;
while (i--) {
this.deps[i].removeSub(this);
}
this.active = false;
}
};
/* */
var sharedPropertyDefinition = {
enumerable: true,
configurable: true,
get: noop,
set: noop
};
function proxy (target, sourceKey, key) {
sharedPropertyDefinition.get = function proxyGetter () {
return this[sourceKey][key]
};
sharedPropertyDefinition.set = function proxySetter (val) {
this[sourceKey][key] = val;
};
Object.defineProperty(target, key, sharedPropertyDefinition);
}
function initState (vm) {
vm._watchers = [];
var opts = vm.$options;
if (opts.props) { initProps(vm, opts.props); }
if (opts.methods) { initMethods(vm, opts.methods); }
if (opts.data) {
initData(vm);
} else {
observe(vm._data = {}, true /* asRootData */);
}
if (opts.computed) { initComputed(vm, opts.computed); }
if (opts.watch && opts.watch !== nativeWatch) {
initWatch(vm, opts.watch);
}
}
function initProps (vm, propsOptions) {
var propsData = vm.$options.propsData || {};
var props = vm._props = {};
// cache prop keys so that future props updates can iterate using Array
// instead of dynamic object key enumeration.
var keys = vm.$options._propKeys = [];
var isRoot = !vm.$parent;
// root instance props should be converted
if (!isRoot) {
toggleObserving(false);
}
var loop = function ( key ) {
keys.push(key);
var value = validateProp(key, propsOptions, propsData, vm);
/* istanbul ignore else */
{
defineReactive$$1(props, key, value);
}
// static props are already proxied on the component's prototype
// during Vue.extend(). We only need to proxy props defined at
// instantiation here.
if (!(key in vm)) {
proxy(vm, "_props", key);
}
};
for (var key in propsOptions) loop( key );
toggleObserving(true);
}
function initData (vm) {
var data = vm.$options.data;
data = vm._data = typeof data === 'function'
? getData(data, vm)
: data || {};
if (!isPlainObject(data)) {
data = {};
}
// proxy data on instance
var keys = Object.keys(data);
var props = vm.$options.props;
var methods = vm.$options.methods;
var i = keys.length;
while (i--) {
var key = keys[i];
if (props && hasOwn(props, key)) ; else if (!isReserved(key)) {
proxy(vm, "_data", key);
}
}
// observe data
observe(data, true /* asRootData */);
}
function getData (data, vm) {
// #7573 disable dep collection when invoking data getters
pushTarget();
try {
return data.call(vm, vm)
} catch (e) {
handleError(e, vm, "data()");
return {}
} finally {
popTarget();
}
}
var computedWatcherOptions = { lazy: true };
function initComputed (vm, computed) {
// $flow-disable-line
var watchers = vm._computedWatchers = Object.create(null);
// computed properties are just getters during SSR
var isSSR = isServerRendering();
for (var key in computed) {
var userDef = computed[key];
var getter = typeof userDef === 'function' ? userDef : userDef.get;
if (!isSSR) {
// create internal watcher for the computed property.
watchers[key] = new Watcher(
vm,
getter || noop,
noop,
computedWatcherOptions
);
}
// component-defined computed properties are already defined on the
// component prototype. We only need to define computed properties defined
// at instantiation here.
if (!(key in vm)) {
defineComputed(vm, key, userDef);
}
}
}
function defineComputed (
target,
key,
userDef
) {
var shouldCache = !isServerRendering();
if (typeof userDef === 'function') {
sharedPropertyDefinition.get = shouldCache
? createComputedGetter(key)
: createGetterInvoker(userDef);
sharedPropertyDefinition.set = noop;
} else {
sharedPropertyDefinition.get = userDef.get
? shouldCache && userDef.cache !== false
? createComputedGetter(key)
: createGetterInvoker(userDef.get)
: noop;
sharedPropertyDefinition.set = userDef.set || noop;
}
Object.defineProperty(target, key, sharedPropertyDefinition);
}
function createComputedGetter (key) {
return function computedGetter () {
var watcher = this._computedWatchers && this._computedWatchers[key];
if (watcher) {
if (watcher.dirty) {
watcher.evaluate();
}
if (Dep.target) {
watcher.depend();
}
return watcher.value
}
}
}
function createGetterInvoker(fn) {
return function computedGetter () {
return fn.call(this, this)
}
}
function initMethods (vm, methods) {
var props = vm.$options.props;
for (var key in methods) {
vm[key] = typeof methods[key] !== 'function' ? noop : bind(methods[key], vm);
}
}
function initWatch (vm, watch) {
for (var key in watch) {
var handler = watch[key];
if (Array.isArray(handler)) {
for (var i = 0; i < handler.length; i++) {
createWatcher(vm, key, handler[i]);
}
} else {
createWatcher(vm, key, handler);
}
}
}
function createWatcher (
vm,
expOrFn,
handler,
options
) {
if (isPlainObject(handler)) {
options = handler;
handler = handler.handler;
}
if (typeof handler === 'string') {
handler = vm[handler];
}
return vm.$watch(expOrFn, handler, options)
}
function stateMixin (Vue) {
// flow somehow has problems with directly declared definition object
// when using Object.defineProperty, so we have to procedurally build up
// the object here.
var dataDef = {};
dataDef.get = function () { return this._data };
var propsDef = {};
propsDef.get = function () { return this._props };
Object.defineProperty(Vue.prototype, '$data', dataDef);
Object.defineProperty(Vue.prototype, '$props', propsDef);
Vue.prototype.$set = set;
Vue.prototype.$delete = del;
Vue.prototype.$watch = function (
expOrFn,
cb,
options
) {
var vm = this;
if (isPlainObject(cb)) {
return createWatcher(vm, expOrFn, cb, options)
}
options = options || {};
options.user = true;
var watcher = new Watcher(vm, expOrFn, cb, options);
if (options.immediate) {
try {
cb.call(vm, watcher.value);
} catch (error) {
handleError(error, vm, ("callback for immediate watcher \"" + (watcher.expression) + "\""));
}
}
return function unwatchFn () {
watcher.teardown();
}
};
}
/* */
var uid$3 = 0;
function initMixin (Vue) {
Vue.prototype._init = function (options) {
var vm = this;
// a uid
vm._uid = uid$3++;
// a flag to avoid this being observed
vm._isVue = true;
// merge options
if (options && options._isComponent) {
// optimize internal component instantiation
// since dynamic options merging is pretty slow, and none of the
// internal component options needs special treatment.
initInternalComponent(vm, options);
} else {
vm.$options = mergeOptions(
resolveConstructorOptions(vm.constructor),
options || {},
vm
);
}
/* istanbul ignore else */
{
vm._renderProxy = vm;
}
// expose real self
vm._self = vm;
initLifecycle(vm);
initEvents(vm);
initRender(vm);
callHook(vm, 'beforeCreate');
initInjections(vm); // resolve injections before data/props
initState(vm);
initProvide(vm); // resolve provide after data/props
callHook(vm, 'created');
if (vm.$options.el) {
vm.$mount(vm.$options.el);
}
};
}
function initInternalComponent (vm, options) {
var opts = vm.$options = Object.create(vm.constructor.options);
// doing this because it's faster than dynamic enumeration.
var parentVnode = options._parentVnode;
opts.parent = options.parent;
opts._parentVnode = parentVnode;
var vnodeComponentOptions = parentVnode.componentOptions;
opts.propsData = vnodeComponentOptions.propsData;
opts._parentListeners = vnodeComponentOptions.listeners;
opts._renderChildren = vnodeComponentOptions.children;
opts._componentTag = vnodeComponentOptions.tag;
if (options.render) {
opts.render = options.render;
opts.staticRenderFns = options.staticRenderFns;
}
}
function resolveConstructorOptions (Ctor) {
var options = Ctor.options;
if (Ctor.super) {
var superOptions = resolveConstructorOptions(Ctor.super);
var cachedSuperOptions = Ctor.superOptions;
if (superOptions !== cachedSuperOptions) {
// super option changed,
// need to resolve new options.
Ctor.superOptions = superOptions;
// check if there are any late-modified/attached options (#4976)
var modifiedOptions = resolveModifiedOptions(Ctor);
// update base extend options
if (modifiedOptions) {
extend(Ctor.extendOptions, modifiedOptions);
}
options = Ctor.options = mergeOptions(superOptions, Ctor.extendOptions);
if (options.name) {
options.components[options.name] = Ctor;
}
}
}
return options
}
function resolveModifiedOptions (Ctor) {
var modified;
var latest = Ctor.options;
var sealed = Ctor.sealedOptions;
for (var key in latest) {
if (latest[key] !== sealed[key]) {
if (!modified) { modified = {}; }
modified[key] = latest[key];
}
}
return modified
}
function Vue (options) {
this._init(options);
}
initMixin(Vue);
stateMixin(Vue);
eventsMixin(Vue);
lifecycleMixin(Vue);
renderMixin(Vue);
/* */
function initUse (Vue) {
Vue.use = function (plugin) {
var installedPlugins = (this._installedPlugins || (this._installedPlugins = []));
if (installedPlugins.indexOf(plugin) > -1) {
return this
}
// additional parameters
var args = toArray(arguments, 1);
args.unshift(this);
if (typeof plugin.install === 'function') {
plugin.install.apply(plugin, args);
} else if (typeof plugin === 'function') {
plugin.apply(null, args);
}
installedPlugins.push(plugin);
return this
};
}
/* */
function initMixin$1 (Vue) {
Vue.mixin = function (mixin) {
this.options = mergeOptions(this.options, mixin);
return this
};
}
/* */
function initExtend (Vue) {
/**
* Each instance constructor, including Vue, has a unique
* cid. This enables us to create wrapped "child
* constructors" for prototypal inheritance and cache them.
*/
Vue.cid = 0;
var cid = 1;
/**
* Class inheritance
*/
Vue.extend = function (extendOptions) {
extendOptions = extendOptions || {};
var Super = this;
var SuperId = Super.cid;
var cachedCtors = extendOptions._Ctor || (extendOptions._Ctor = {});
if (cachedCtors[SuperId]) {
return cachedCtors[SuperId]
}
var name = extendOptions.name || Super.options.name;
var Sub = function VueComponent (options) {
this._init(options);
};
Sub.prototype = Object.create(Super.prototype);
Sub.prototype.constructor = Sub;
Sub.cid = cid++;
Sub.options = mergeOptions(
Super.options,
extendOptions
);
Sub['super'] = Super;
// For props and computed properties, we define the proxy getters on
// the Vue instances at extension time, on the extended prototype. This
// avoids Object.defineProperty calls for each instance created.
if (Sub.options.props) {
initProps$1(Sub);
}
if (Sub.options.computed) {
initComputed$1(Sub);
}
// allow further extension/mixin/plugin usage
Sub.extend = Super.extend;
Sub.mixin = Super.mixin;
Sub.use = Super.use;
// create asset registers, so extended classes
// can have their private assets too.
ASSET_TYPES.forEach(function (type) {
Sub[type] = Super[type];
});
// enable recursive self-lookup
if (name) {
Sub.options.components[name] = Sub;
}
// keep a reference to the super options at extension time.
// later at instantiation we can check if Super's options have
// been updated.
Sub.superOptions = Super.options;
Sub.extendOptions = extendOptions;
Sub.sealedOptions = extend({}, Sub.options);
// cache constructor
cachedCtors[SuperId] = Sub;
return Sub
};
}
function initProps$1 (Comp) {
var props = Comp.options.props;
for (var key in props) {
proxy(Comp.prototype, "_props", key);
}
}
function initComputed$1 (Comp) {
var computed = Comp.options.computed;
for (var key in computed) {
defineComputed(Comp.prototype, key, computed[key]);
}
}
/* */
function initAssetRegisters (Vue) {
/**
* Create asset registration methods.
*/
ASSET_TYPES.forEach(function (type) {
Vue[type] = function (
id,
definition
) {
if (!definition) {
return this.options[type + 's'][id]
} else {
if (type === 'component' && isPlainObject(definition)) {
definition.name = definition.name || id;
definition = this.options._base.extend(definition);
}
if (type === 'directive' && typeof definition === 'function') {
definition = { bind: definition, update: definition };
}
this.options[type + 's'][id] = definition;
return definition
}
};
});
}
/* */
function getComponentName (opts) {
return opts && (opts.Ctor.options.name || opts.tag)
}
function matches (pattern, name) {
if (Array.isArray(pattern)) {
return pattern.indexOf(name) > -1
} else if (typeof pattern === 'string') {
return pattern.split(',').indexOf(name) > -1
} else if (isRegExp(pattern)) {
return pattern.test(name)
}
/* istanbul ignore next */
return false
}
function pruneCache (keepAliveInstance, filter) {
var cache = keepAliveInstance.cache;
var keys = keepAliveInstance.keys;
var _vnode = keepAliveInstance._vnode;
for (var key in cache) {
var cachedNode = cache[key];
if (cachedNode) {
var name = getComponentName(cachedNode.componentOptions);
if (name && !filter(name)) {
pruneCacheEntry(cache, key, keys, _vnode);
}
}
}
}
function pruneCacheEntry (
cache,
key,
keys,
current
) {
var cached$$1 = cache[key];
if (cached$$1 && (!current || cached$$1.tag !== current.tag)) {
cached$$1.componentInstance.$destroy();
}
cache[key] = null;
remove(keys, key);
}
var patternTypes = [String, RegExp, Array];
var KeepAlive = {
name: 'keep-alive',
abstract: true,
props: {
include: patternTypes,
exclude: patternTypes,
max: [String, Number]
},
created: function created () {
this.cache = Object.create(null);
this.keys = [];
},
destroyed: function destroyed () {
for (var key in this.cache) {
pruneCacheEntry(this.cache, key, this.keys);
}
},
mounted: function mounted () {
var this$1 = this;
this.$watch('include', function (val) {
pruneCache(this$1, function (name) { return matches(val, name); });
});
this.$watch('exclude', function (val) {
pruneCache(this$1, function (name) { return !matches(val, name); });
});
},
render: function render () {
var slot = this.$slots.default;
var vnode = getFirstComponentChild(slot);
var componentOptions = vnode && vnode.componentOptions;
if (componentOptions) {
// check pattern
var name = getComponentName(componentOptions);
var ref = this;
var include = ref.include;
var exclude = ref.exclude;
if (
// not included
(include && (!name || !matches(include, name))) ||
// excluded
(exclude && name && matches(exclude, name))
) {
return vnode
}
var ref$1 = this;
var cache = ref$1.cache;
var keys = ref$1.keys;
var key = vnode.key == null
// same constructor may get registered as different local components
// so cid alone is not enough (#3269)
? componentOptions.Ctor.cid + (componentOptions.tag ? ("::" + (componentOptions.tag)) : '')
: vnode.key;
if (cache[key]) {
vnode.componentInstance = cache[key].componentInstance;
// make current key freshest
remove(keys, key);
keys.push(key);
} else {
cache[key] = vnode;
keys.push(key);
// prune oldest entry
if (this.max && keys.length > parseInt(this.max)) {
pruneCacheEntry(cache, keys[0], keys, this._vnode);
}
}
vnode.data.keepAlive = true;
}
return vnode || (slot && slot[0])
}
};
var builtInComponents = {
KeepAlive: KeepAlive
};
/* */
function initGlobalAPI (Vue) {
// config
var configDef = {};
configDef.get = function () { return config; };
Object.defineProperty(Vue, 'config', configDef);
// exposed util methods.
// NOTE: these are not considered part of the public API - avoid relying on
// them unless you are aware of the risk.
Vue.util = {
warn: warn,
extend: extend,
mergeOptions: mergeOptions,
defineReactive: defineReactive$$1
};
Vue.set = set;
Vue.delete = del;
Vue.nextTick = nextTick;
// 2.6 explicit observable API
Vue.observable = function (obj) {
observe(obj);
return obj
};
Vue.options = Object.create(null);
ASSET_TYPES.forEach(function (type) {
Vue.options[type + 's'] = Object.create(null);
});
// this is used to identify the "base" constructor to extend all plain-object
// components with in Weex's multi-instance scenarios.
Vue.options._base = Vue;
extend(Vue.options.components, builtInComponents);
initUse(Vue);
initMixin$1(Vue);
initExtend(Vue);
initAssetRegisters(Vue);
}
initGlobalAPI(Vue);
Object.defineProperty(Vue.prototype, '$isServer', {
get: isServerRendering
});
Object.defineProperty(Vue.prototype, '$ssrContext', {
get: function get () {
/* istanbul ignore next */
return this.$vnode && this.$vnode.ssrContext
}
});
// expose FunctionalRenderContext for ssr runtime helper installation
Object.defineProperty(Vue, 'FunctionalRenderContext', {
value: FunctionalRenderContext
});
Vue.version = '2.6.12';
/* */
// these are reserved for web because they are directly compiled away
// during template compilation
var isReservedAttr = makeMap('style,class');
// attributes that should be using props for binding
var acceptValue = makeMap('input,textarea,option,select,progress');
var mustUseProp = function (tag, type, attr) {
return (
(attr === 'value' && acceptValue(tag)) && type !== 'button' ||
(attr === 'selected' && tag === 'option') ||
(attr === 'checked' && tag === 'input') ||
(attr === 'muted' && tag === 'video')
)
};
var isEnumeratedAttr = makeMap('contenteditable,draggable,spellcheck');
var isValidContentEditableValue = makeMap('events,caret,typing,plaintext-only');
var convertEnumeratedValue = function (key, value) {
return isFalsyAttrValue(value) || value === 'false'
? 'false'
// allow arbitrary string value for contenteditable
: key === 'contenteditable' && isValidContentEditableValue(value)
? value
: 'true'
};
var isBooleanAttr = makeMap(
'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'
);
var xlinkNS = 'http://www.w3.org/1999/xlink';
var isXlink = function (name) {
return name.charAt(5) === ':' && name.slice(0, 5) === 'xlink'
};
var getXlinkProp = function (name) {
return isXlink(name) ? name.slice(6, name.length) : ''
};
var isFalsyAttrValue = function (val) {
return val == null || val === false
};
/* */
function genClassForVnode (vnode) {
var data = vnode.data;
var parentNode = vnode;
var childNode = vnode;
while (isDef(childNode.componentInstance)) {
childNode = childNode.componentInstance._vnode;
if (childNode && childNode.data) {
data = mergeClassData(childNode.data, data);
}
}
while (isDef(parentNode = parentNode.parent)) {
if (parentNode && parentNode.data) {
data = mergeClassData(data, parentNode.data);
}
}
return renderClass(data.staticClass, data.class)
}
function mergeClassData (child, parent) {
return {
staticClass: concat(child.staticClass, parent.staticClass),
class: isDef(child.class)
? [child.class, parent.class]
: parent.class
}
}
function renderClass (
staticClass,
dynamicClass
) {
if (isDef(staticClass) || isDef(dynamicClass)) {
return concat(staticClass, stringifyClass(dynamicClass))
}
/* istanbul ignore next */
return ''
}
function concat (a, b) {
return a ? b ? (a + ' ' + b) : a : (b || '')
}
function stringifyClass (value) {
if (Array.isArray(value)) {
return stringifyArray(value)
}
if (isObject(value)) {
return stringifyObject(value)
}
if (typeof value === 'string') {
return value
}
/* istanbul ignore next */
return ''
}
function stringifyArray (value) {
var res = '';
var stringified;
for (var i = 0, l = value.length; i < l; i++) {
if (isDef(stringified = stringifyClass(value[i])) && stringified !== '') {
if (res) { res += ' '; }
res += stringified;
}
}
return res
}
function stringifyObject (value) {
var res = '';
for (var key in value) {
if (value[key]) {
if (res) { res += ' '; }
res += key;
}
}
return res
}
/* */
var namespaceMap = {
svg: 'http://www.w3.org/2000/svg',
math: 'http://www.w3.org/1998/Math/MathML'
};
var isHTMLTag = makeMap(
'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'
);
// this map is intentionally selective, only covering SVG elements that may
// contain child elements.
var isSVG = makeMap(
'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',
true
);
var isPreTag = function (tag) { return tag === 'pre'; };
var isReservedTag = function (tag) {
return isHTMLTag(tag) || isSVG(tag)
};
function getTagNamespace (tag) {
if (isSVG(tag)) {
return 'svg'
}
// basic support for MathML
// note it doesn't support other MathML elements being component roots
if (tag === 'math') {
return 'math'
}
}
var unknownElementCache = Object.create(null);
function isUnknownElement (tag) {
/* istanbul ignore if */
if (!inBrowser) {
return true
}
if (isReservedTag(tag)) {
return false
}
tag = tag.toLowerCase();
/* istanbul ignore if */
if (unknownElementCache[tag] != null) {
return unknownElementCache[tag]
}
var el = document.createElement(tag);
if (tag.indexOf('-') > -1) {
// http://stackoverflow.com/a/28210364/1070244
return (unknownElementCache[tag] = (
el.constructor === window.HTMLUnknownElement ||
el.constructor === window.HTMLElement
))
} else {
return (unknownElementCache[tag] = /HTMLUnknownElement/.test(el.toString()))
}
}
var isTextInputType = makeMap('text,number,password,search,email,tel,url');
/* */
/**
* Query an element selector if it's not an element already.
*/
function query (el) {
if (typeof el === 'string') {
var selected = document.querySelector(el);
if (!selected) {
return document.createElement('div')
}
return selected
} else {
return el
}
}
/* */
function createElement$1 (tagName, vnode) {
var elm = document.createElement(tagName);
if (tagName !== 'select') {
return elm
}
// false or null will remove the attribute but undefined will not
if (vnode.data && vnode.data.attrs && vnode.data.attrs.multiple !== undefined) {
elm.setAttribute('multiple', 'multiple');
}
return elm
}
function createElementNS (namespace, tagName) {
return document.createElementNS(namespaceMap[namespace], tagName)
}
function createTextNode (text) {
return document.createTextNode(text)
}
function createComment (text) {
return document.createComment(text)
}
function insertBefore (parentNode, newNode, referenceNode) {
parentNode.insertBefore(newNode, referenceNode);
}
function removeChild (node, child) {
node.removeChild(child);
}
function appendChild (node, child) {
node.appendChild(child);
}
function parentNode (node) {
return node.parentNode
}
function nextSibling (node) {
return node.nextSibling
}
function tagName (node) {
return node.tagName
}
function setTextContent (node, text) {
node.textContent = text;
}
function setStyleScope (node, scopeId) {
node.setAttribute(scopeId, '');
}
var nodeOps = /*#__PURE__*/Object.freeze({
createElement: createElement$1,
createElementNS: createElementNS,
createTextNode: createTextNode,
createComment: createComment,
insertBefore: insertBefore,
removeChild: removeChild,
appendChild: appendChild,
parentNode: parentNode,
nextSibling: nextSibling,
tagName: tagName,
setTextContent: setTextContent,
setStyleScope: setStyleScope
});
/* */
var ref = {
create: function create (_, vnode) {
registerRef(vnode);
},
update: function update (oldVnode, vnode) {
if (oldVnode.data.ref !== vnode.data.ref) {
registerRef(oldVnode, true);
registerRef(vnode);
}
},
destroy: function destroy (vnode) {
registerRef(vnode, true);
}
};
function registerRef (vnode, isRemoval) {
var key = vnode.data.ref;
if (!isDef(key)) { return }
var vm = vnode.context;
var ref = vnode.componentInstance || vnode.elm;
var refs = vm.$refs;
if (isRemoval) {
if (Array.isArray(refs[key])) {
remove(refs[key], ref);
} else if (refs[key] === ref) {
refs[key] = undefined;
}
} else {
if (vnode.data.refInFor) {
if (!Array.isArray(refs[key])) {
refs[key] = [ref];
} else if (refs[key].indexOf(ref) < 0) {
// $flow-disable-line
refs[key].push(ref);
}
} else {
refs[key] = ref;
}
}
}
/**
* Virtual DOM patching algorithm based on Snabbdom by
* Simon Friis Vindum (@paldepind)
* Licensed under the MIT License
* https://github.com/paldepind/snabbdom/blob/master/LICENSE
*
* modified by Evan You (@yyx990803)
*
* Not type-checking this because this file is perf-critical and the cost
* of making flow understand it is not worth it.
*/
var emptyNode = new VNode('', {}, []);
var hooks = ['create', 'activate', 'update', 'remove', 'destroy'];
function sameVnode (a, b) {
return (
a.key === b.key && (
(
a.tag === b.tag &&
a.isComment === b.isComment &&
isDef(a.data) === isDef(b.data) &&
sameInputType(a, b)
) || (
isTrue(a.isAsyncPlaceholder) &&
a.asyncFactory === b.asyncFactory &&
isUndef(b.asyncFactory.error)
)
)
)
}
function sameInputType (a, b) {
if (a.tag !== 'input') { return true }
var i;
var typeA = isDef(i = a.data) && isDef(i = i.attrs) && i.type;
var typeB = isDef(i = b.data) && isDef(i = i.attrs) && i.type;
return typeA === typeB || isTextInputType(typeA) && isTextInputType(typeB)
}
function createKeyToOldIdx (children, beginIdx, endIdx) {
var i, key;
var map = {};
for (i = beginIdx; i <= endIdx; ++i) {
key = children[i].key;
if (isDef(key)) { map[key] = i; }
}
return map
}
function createPatchFunction (backend) {
var i, j;
var cbs = {};
var modules = backend.modules;
var nodeOps = backend.nodeOps;
for (i = 0; i < hooks.length; ++i) {
cbs[hooks[i]] = [];
for (j = 0; j < modules.length; ++j) {
if (isDef(modules[j][hooks[i]])) {
cbs[hooks[i]].push(modules[j][hooks[i]]);
}
}
}
function emptyNodeAt (elm) {
return new VNode(nodeOps.tagName(elm).toLowerCase(), {}, [], undefined, elm)
}
function createRmCb (childElm, listeners) {
function remove$$1 () {
if (--remove$$1.listeners === 0) {
removeNode(childElm);
}
}
remove$$1.listeners = listeners;
return remove$$1
}
function removeNode (el) {
var parent = nodeOps.parentNode(el);
// element may have already been removed due to v-html / v-text
if (isDef(parent)) {
nodeOps.removeChild(parent, el);
}
}
function createElm (
vnode,
insertedVnodeQueue,
parentElm,
refElm,
nested,
ownerArray,
index
) {
if (isDef(vnode.elm) && isDef(ownerArray)) {
// This vnode was used in a previous render!
// now it's used as a new node, overwriting its elm would cause
// potential patch errors down the road when it's used as an insertion
// reference node. Instead, we clone the node on-demand before creating
// associated DOM element for it.
vnode = ownerArray[index] = cloneVNode(vnode);
}
vnode.isRootInsert = !nested; // for transition enter check
if (createComponent(vnode, insertedVnodeQueue, parentElm, refElm)) {
return
}
var data = vnode.data;
var children = vnode.children;
var tag = vnode.tag;
if (isDef(tag)) {
vnode.elm = vnode.ns
? nodeOps.createElementNS(vnode.ns, tag)
: nodeOps.createElement(tag, vnode);
setScope(vnode);
/* istanbul ignore if */
{
createChildren(vnode, children, insertedVnodeQueue);
if (isDef(data)) {
invokeCreateHooks(vnode, insertedVnodeQueue);
}
insert(parentElm, vnode.elm, refElm);
}
} else if (isTrue(vnode.isComment)) {
vnode.elm = nodeOps.createComment(vnode.text);
insert(parentElm, vnode.elm, refElm);
} else {
vnode.elm = nodeOps.createTextNode(vnode.text);
insert(parentElm, vnode.elm, refElm);
}
}
function createComponent (vnode, insertedVnodeQueue, parentElm, refElm) {
var i = vnode.data;
if (isDef(i)) {
var isReactivated = isDef(vnode.componentInstance) && i.keepAlive;
if (isDef(i = i.hook) && isDef(i = i.init)) {
i(vnode, false /* hydrating */);
}
// after calling the init hook, if the vnode is a child component
// it should've created a child instance and mounted it. the child
// component also has set the placeholder vnode's elm.
// in that case we can just return the element and be done.
if (isDef(vnode.componentInstance)) {
initComponent(vnode, insertedVnodeQueue);
insert(parentElm, vnode.elm, refElm);
if (isTrue(isReactivated)) {
reactivateComponent(vnode, insertedVnodeQueue, parentElm, refElm);
}
return true
}
}
}
function initComponent (vnode, insertedVnodeQueue) {
if (isDef(vnode.data.pendingInsert)) {
insertedVnodeQueue.push.apply(insertedVnodeQueue, vnode.data.pendingInsert);
vnode.data.pendingInsert = null;
}
vnode.elm = vnode.componentInstance.$el;
if (isPatchable(vnode)) {
invokeCreateHooks(vnode, insertedVnodeQueue);
setScope(vnode);
} else {
// empty component root.
// skip all element-related modules except for ref (#3455)
registerRef(vnode);
// make sure to invoke the insert hook
insertedVnodeQueue.push(vnode);
}
}
function reactivateComponent (vnode, insertedVnodeQueue, parentElm, refElm) {
var i;
// hack for #4339: a reactivated component with inner transition
// does not trigger because the inner node's created hooks are not called
// again. It's not ideal to involve module-specific logic in here but
// there doesn't seem to be a better way to do it.
var innerNode = vnode;
while (innerNode.componentInstance) {
innerNode = innerNode.componentInstance._vnode;
if (isDef(i = innerNode.data) && isDef(i = i.transition)) {
for (i = 0; i < cbs.activate.length; ++i) {
cbs.activate[i](emptyNode, innerNode);
}
insertedVnodeQueue.push(innerNode);
break
}
}
// unlike a newly created component,
// a reactivated keep-alive component doesn't insert itself
insert(parentElm, vnode.elm, refElm);
}
function insert (parent, elm, ref$$1) {
if (isDef(parent)) {
if (isDef(ref$$1)) {
if (nodeOps.parentNode(ref$$1) === parent) {
nodeOps.insertBefore(parent, elm, ref$$1);
}
} else {
nodeOps.appendChild(parent, elm);
}
}
}
function createChildren (vnode, children, insertedVnodeQueue) {
if (Array.isArray(children)) {
for (var i = 0; i < children.length; ++i) {
createElm(children[i], insertedVnodeQueue, vnode.elm, null, true, children, i);
}
} else if (isPrimitive(vnode.text)) {
nodeOps.appendChild(vnode.elm, nodeOps.createTextNode(String(vnode.text)));
}
}
function isPatchable (vnode) {
while (vnode.componentInstance) {
vnode = vnode.componentInstance._vnode;
}
return isDef(vnode.tag)
}
function invokeCreateHooks (vnode, insertedVnodeQueue) {
for (var i$1 = 0; i$1 < cbs.create.length; ++i$1) {
cbs.create[i$1](emptyNode, vnode);
}
i = vnode.data.hook; // Reuse variable
if (isDef(i)) {
if (isDef(i.create)) { i.create(emptyNode, vnode); }
if (isDef(i.insert)) { insertedVnodeQueue.push(vnode); }
}
}
// set scope id attribute for scoped CSS.
// this is implemented as a special case to avoid the overhead
// of going through the normal attribute patching process.
function setScope (vnode) {
var i;
if (isDef(i = vnode.fnScopeId)) {
nodeOps.setStyleScope(vnode.elm, i);
} else {
var ancestor = vnode;
while (ancestor) {
if (isDef(i = ancestor.context) && isDef(i = i.$options._scopeId)) {
nodeOps.setStyleScope(vnode.elm, i);
}
ancestor = ancestor.parent;
}
}
// for slot content they should also get the scopeId from the host instance.
if (isDef(i = activeInstance) &&
i !== vnode.context &&
i !== vnode.fnContext &&
isDef(i = i.$options._scopeId)
) {
nodeOps.setStyleScope(vnode.elm, i);
}
}
function addVnodes (parentElm, refElm, vnodes, startIdx, endIdx, insertedVnodeQueue) {
for (; startIdx <= endIdx; ++startIdx) {
createElm(vnodes[startIdx], insertedVnodeQueue, parentElm, refElm, false, vnodes, startIdx);
}
}
function invokeDestroyHook (vnode) {
var i, j;
var data = vnode.data;
if (isDef(data)) {
if (isDef(i = data.hook) && isDef(i = i.destroy)) { i(vnode); }
for (i = 0; i < cbs.destroy.length; ++i) { cbs.destroy[i](vnode); }
}
if (isDef(i = vnode.children)) {
for (j = 0; j < vnode.children.length; ++j) {
invokeDestroyHook(vnode.children[j]);
}
}
}
function removeVnodes (vnodes, startIdx, endIdx) {
for (; startIdx <= endIdx; ++startIdx) {
var ch = vnodes[startIdx];
if (isDef(ch)) {
if (isDef(ch.tag)) {
removeAndInvokeRemoveHook(ch);
invokeDestroyHook(ch);
} else { // Text node
removeNode(ch.elm);
}
}
}
}
function removeAndInvokeRemoveHook (vnode, rm) {
if (isDef(rm) || isDef(vnode.data)) {
var i;
var listeners = cbs.remove.length + 1;
if (isDef(rm)) {
// we have a recursively passed down rm callback
// increase the listeners count
rm.listeners += listeners;
} else {
// directly removing
rm = createRmCb(vnode.elm, listeners);
}
// recursively invoke hooks on child component root node
if (isDef(i = vnode.componentInstance) && isDef(i = i._vnode) && isDef(i.data)) {
removeAndInvokeRemoveHook(i, rm);
}
for (i = 0; i < cbs.remove.length; ++i) {
cbs.remove[i](vnode, rm);
}
if (isDef(i = vnode.data.hook) && isDef(i = i.remove)) {
i(vnode, rm);
} else {
rm();
}
} else {
removeNode(vnode.elm);
}
}
function updateChildren (parentElm, oldCh, newCh, insertedVnodeQueue, removeOnly) {
var oldStartIdx = 0;
var newStartIdx = 0;
var oldEndIdx = oldCh.length - 1;
var oldStartVnode = oldCh[0];
var oldEndVnode = oldCh[oldEndIdx];
var newEndIdx = newCh.length - 1;
var newStartVnode = newCh[0];
var newEndVnode = newCh[newEndIdx];
var oldKeyToIdx, idxInOld, vnodeToMove, refElm;
// removeOnly is a special flag used only by <transition-group>
// to ensure removed elements stay in correct relative positions
// during leaving transitions
var canMove = !removeOnly;
while (oldStartIdx <= oldEndIdx && newStartIdx <= newEndIdx) {
if (isUndef(oldStartVnode)) {
oldStartVnode = oldCh[++oldStartIdx]; // Vnode has been moved left
} else if (isUndef(oldEndVnode)) {
oldEndVnode = oldCh[--oldEndIdx];
} else if (sameVnode(oldStartVnode, newStartVnode)) {
patchVnode(oldStartVnode, newStartVnode, insertedVnodeQueue, newCh, newStartIdx);
oldStartVnode = oldCh[++oldStartIdx];
newStartVnode = newCh[++newStartIdx];
} else if (sameVnode(oldEndVnode, newEndVnode)) {
patchVnode(oldEndVnode, newEndVnode, insertedVnodeQueue, newCh, newEndIdx);
oldEndVnode = oldCh[--oldEndIdx];
newEndVnode = newCh[--newEndIdx];
} else if (sameVnode(oldStartVnode, newEndVnode)) { // Vnode moved right
patchVnode(oldStartVnode, newEndVnode, insertedVnodeQueue, newCh, newEndIdx);
canMove && nodeOps.insertBefore(parentElm, oldStartVnode.elm, nodeOps.nextSibling(oldEndVnode.elm));
oldStartVnode = oldCh[++oldStartIdx];
newEndVnode = newCh[--newEndIdx];
} else if (sameVnode(oldEndVnode, newStartVnode)) { // Vnode moved left
patchVnode(oldEndVnode, newStartVnode, insertedVnodeQueue, newCh, newStartIdx);
canMove && nodeOps.insertBefore(parentElm, oldEndVnode.elm, oldStartVnode.elm);
oldEndVnode = oldCh[--oldEndIdx];
newStartVnode = newCh[++newStartIdx];
} else {
if (isUndef(oldKeyToIdx)) { oldKeyToIdx = createKeyToOldIdx(oldCh, oldStartIdx, oldEndIdx); }
idxInOld = isDef(newStartVnode.key)
? oldKeyToIdx[newStartVnode.key]
: findIdxInOld(newStartVnode, oldCh, oldStartIdx, oldEndIdx);
if (isUndef(idxInOld)) { // New element
createElm(newStartVnode, insertedVnodeQueue, parentElm, oldStartVnode.elm, false, newCh, newStartIdx);
} else {
vnodeToMove = oldCh[idxInOld];
if (sameVnode(vnodeToMove, newStartVnode)) {
patchVnode(vnodeToMove, newStartVnode, insertedVnodeQueue, newCh, newStartIdx);
oldCh[idxInOld] = undefined;
canMove && nodeOps.insertBefore(parentElm, vnodeToMove.elm, oldStartVnode.elm);
} else {
// same key but different element. treat as new element
createElm(newStartVnode, insertedVnodeQueue, parentElm, oldStartVnode.elm, false, newCh, newStartIdx);
}
}
newStartVnode = newCh[++newStartIdx];
}
}
if (oldStartIdx > oldEndIdx) {
refElm = isUndef(newCh[newEndIdx + 1]) ? null : newCh[newEndIdx + 1].elm;
addVnodes(parentElm, refElm, newCh, newStartIdx, newEndIdx, insertedVnodeQueue);
} else if (newStartIdx > newEndIdx) {
removeVnodes(oldCh, oldStartIdx, oldEndIdx);
}
}
function findIdxInOld (node, oldCh, start, end) {
for (var i = start; i < end; i++) {
var c = oldCh[i];
if (isDef(c) && sameVnode(node, c)) { return i }
}
}
function patchVnode (
oldVnode,
vnode,
insertedVnodeQueue,
ownerArray,
index,
removeOnly
) {
if (oldVnode === vnode) {
return
}
if (isDef(vnode.elm) && isDef(ownerArray)) {
// clone reused vnode
vnode = ownerArray[index] = cloneVNode(vnode);
}
var elm = vnode.elm = oldVnode.elm;
if (isTrue(oldVnode.isAsyncPlaceholder)) {
if (isDef(vnode.asyncFactory.resolved)) {
hydrate(oldVnode.elm, vnode, insertedVnodeQueue);
} else {
vnode.isAsyncPlaceholder = true;
}
return
}
// reuse element for static trees.
// note we only do this if the vnode is cloned -
// if the new node is not cloned it means the render functions have been
// reset by the hot-reload-api and we need to do a proper re-render.
if (isTrue(vnode.isStatic) &&
isTrue(oldVnode.isStatic) &&
vnode.key === oldVnode.key &&
(isTrue(vnode.isCloned) || isTrue(vnode.isOnce))
) {
vnode.componentInstance = oldVnode.componentInstance;
return
}
var i;
var data = vnode.data;
if (isDef(data) && isDef(i = data.hook) && isDef(i = i.prepatch)) {
i(oldVnode, vnode);
}
var oldCh = oldVnode.children;
var ch = vnode.children;
if (isDef(data) && isPatchable(vnode)) {
for (i = 0; i < cbs.update.length; ++i) { cbs.update[i](oldVnode, vnode); }
if (isDef(i = data.hook) && isDef(i = i.update)) { i(oldVnode, vnode); }
}
if (isUndef(vnode.text)) {
if (isDef(oldCh) && isDef(ch)) {
if (oldCh !== ch) { updateChildren(elm, oldCh, ch, insertedVnodeQueue, removeOnly); }
} else if (isDef(ch)) {
if (isDef(oldVnode.text)) { nodeOps.setTextContent(elm, ''); }
addVnodes(elm, null, ch, 0, ch.length - 1, insertedVnodeQueue);
} else if (isDef(oldCh)) {
removeVnodes(oldCh, 0, oldCh.length - 1);
} else if (isDef(oldVnode.text)) {
nodeOps.setTextContent(elm, '');
}
} else if (oldVnode.text !== vnode.text) {
nodeOps.setTextContent(elm, vnode.text);
}
if (isDef(data)) {
if (isDef(i = data.hook) && isDef(i = i.postpatch)) { i(oldVnode, vnode); }
}
}
function invokeInsertHook (vnode, queue, initial) {
// delay insert hooks for component root nodes, invoke them after the
// element is really inserted
if (isTrue(initial) && isDef(vnode.parent)) {
vnode.parent.data.pendingInsert = queue;
} else {
for (var i = 0; i < queue.length; ++i) {
queue[i].data.hook.insert(queue[i]);
}
}
}
// list of modules that can skip create hook during hydration because they
// are already rendered on the client or has no need for initialization
// Note: style is excluded because it relies on initial clone for future
// deep updates (#7063).
var isRenderedModule = makeMap('attrs,class,staticClass,staticStyle,key');
// Note: this is a browser-only function so we can assume elms are DOM nodes.
function hydrate (elm, vnode, insertedVnodeQueue, inVPre) {
var i;
var tag = vnode.tag;
var data = vnode.data;
var children = vnode.children;
inVPre = inVPre || (data && data.pre);
vnode.elm = elm;
if (isTrue(vnode.isComment) && isDef(vnode.asyncFactory)) {
vnode.isAsyncPlaceholder = true;
return true
}
if (isDef(data)) {
if (isDef(i = data.hook) && isDef(i = i.init)) { i(vnode, true /* hydrating */); }
if (isDef(i = vnode.componentInstance)) {
// child component. it should have hydrated its own tree.
initComponent(vnode, insertedVnodeQueue);
return true
}
}
if (isDef(tag)) {
if (isDef(children)) {
// empty element, allow client to pick up and populate children
if (!elm.hasChildNodes()) {
createChildren(vnode, children, insertedVnodeQueue);
} else {
// v-html and domProps: innerHTML
if (isDef(i = data) && isDef(i = i.domProps) && isDef(i = i.innerHTML)) {
if (i !== elm.innerHTML) {
return false
}
} else {
// iterate and compare children lists
var childrenMatch = true;
var childNode = elm.firstChild;
for (var i$1 = 0; i$1 < children.length; i$1++) {
if (!childNode || !hydrate(childNode, children[i$1], insertedVnodeQueue, inVPre)) {
childrenMatch = false;
break
}
childNode = childNode.nextSibling;
}
// if childNode is not null, it means the actual childNodes list is
// longer than the virtual children list.
if (!childrenMatch || childNode) {
return false
}
}
}
}
if (isDef(data)) {
var fullInvoke = false;
for (var key in data) {
if (!isRenderedModule(key)) {
fullInvoke = true;
invokeCreateHooks(vnode, insertedVnodeQueue);
break
}
}
if (!fullInvoke && data['class']) {
// ensure collecting deps for deep class bindings for future updates
traverse(data['class']);
}
}
} else if (elm.data !== vnode.text) {
elm.data = vnode.text;
}
return true
}
return function patch (oldVnode, vnode, hydrating, removeOnly) {
if (isUndef(vnode)) {
if (isDef(oldVnode)) { invokeDestroyHook(oldVnode); }
return
}
var isInitialPatch = false;
var insertedVnodeQueue = [];
if (isUndef(oldVnode)) {
// empty mount (likely as component), create new root element
isInitialPatch = true;
createElm(vnode, insertedVnodeQueue);
} else {
var isRealElement = isDef(oldVnode.nodeType);
if (!isRealElement && sameVnode(oldVnode, vnode)) {
// patch existing root node
patchVnode(oldVnode, vnode, insertedVnodeQueue, null, null, removeOnly);
} else {
if (isRealElement) {
// mounting to a real element
// check if this is server-rendered content and if we can perform
// a successful hydration.
if (oldVnode.nodeType === 1 && oldVnode.hasAttribute(SSR_ATTR)) {
oldVnode.removeAttribute(SSR_ATTR);
hydrating = true;
}
if (isTrue(hydrating)) {
if (hydrate(oldVnode, vnode, insertedVnodeQueue)) {
invokeInsertHook(vnode, insertedVnodeQueue, true);
return oldVnode
}
}
// either not server-rendered, or hydration failed.
// create an empty node and replace it
oldVnode = emptyNodeAt(oldVnode);
}
// replacing existing element
var oldElm = oldVnode.elm;
var parentElm = nodeOps.parentNode(oldElm);
// create new node
createElm(
vnode,
insertedVnodeQueue,
// extremely rare edge case: do not insert if old element is in a
// leaving transition. Only happens when combining transition +
// keep-alive + HOCs. (#4590)
oldElm._leaveCb ? null : parentElm,
nodeOps.nextSibling(oldElm)
);
// update parent placeholder node element, recursively
if (isDef(vnode.parent)) {
var ancestor = vnode.parent;
var patchable = isPatchable(vnode);
while (ancestor) {
for (var i = 0; i < cbs.destroy.length; ++i) {
cbs.destroy[i](ancestor);
}
ancestor.elm = vnode.elm;
if (patchable) {
for (var i$1 = 0; i$1 < cbs.create.length; ++i$1) {
cbs.create[i$1](emptyNode, ancestor);
}
// #6513
// invoke insert hooks that may have been merged by create hooks.
// e.g. for directives that uses the "inserted" hook.
var insert = ancestor.data.hook.insert;
if (insert.merged) {
// start at index 1 to avoid re-invoking component mounted hook
for (var i$2 = 1; i$2 < insert.fns.length; i$2++) {
insert.fns[i$2]();
}
}
} else {
registerRef(ancestor);
}
ancestor = ancestor.parent;
}
}
// destroy old node
if (isDef(parentElm)) {
removeVnodes([oldVnode], 0, 0);
} else if (isDef(oldVnode.tag)) {
invokeDestroyHook(oldVnode);
}
}
}
invokeInsertHook(vnode, insertedVnodeQueue, isInitialPatch);
return vnode.elm
}
}
/* */
var directives = {
create: updateDirectives,
update: updateDirectives,
destroy: function unbindDirectives (vnode) {
updateDirectives(vnode, emptyNode);
}
};
function updateDirectives (oldVnode, vnode) {
if (oldVnode.data.directives || vnode.data.directives) {
_update(oldVnode, vnode);
}
}
function _update (oldVnode, vnode) {
var isCreate = oldVnode === emptyNode;
var isDestroy = vnode === emptyNode;
var oldDirs = normalizeDirectives$1(oldVnode.data.directives, oldVnode.context);
var newDirs = normalizeDirectives$1(vnode.data.directives, vnode.context);
var dirsWithInsert = [];
var dirsWithPostpatch = [];
var key, oldDir, dir;
for (key in newDirs) {
oldDir = oldDirs[key];
dir = newDirs[key];
if (!oldDir) {
// new directive, bind
callHook$1(dir, 'bind', vnode, oldVnode);
if (dir.def && dir.def.inserted) {
dirsWithInsert.push(dir);
}
} else {
// existing directive, update
dir.oldValue = oldDir.value;
dir.oldArg = oldDir.arg;
callHook$1(dir, 'update', vnode, oldVnode);
if (dir.def && dir.def.componentUpdated) {
dirsWithPostpatch.push(dir);
}
}
}
if (dirsWithInsert.length) {
var callInsert = function () {
for (var i = 0; i < dirsWithInsert.length; i++) {
callHook$1(dirsWithInsert[i], 'inserted', vnode, oldVnode);
}
};
if (isCreate) {
mergeVNodeHook(vnode, 'insert', callInsert);
} else {
callInsert();
}
}
if (dirsWithPostpatch.length) {
mergeVNodeHook(vnode, 'postpatch', function () {
for (var i = 0; i < dirsWithPostpatch.length; i++) {
callHook$1(dirsWithPostpatch[i], 'componentUpdated', vnode, oldVnode);
}
});
}
if (!isCreate) {
for (key in oldDirs) {
if (!newDirs[key]) {
// no longer present, unbind
callHook$1(oldDirs[key], 'unbind', oldVnode, oldVnode, isDestroy);
}
}
}
}
var emptyModifiers = Object.create(null);
function normalizeDirectives$1 (
dirs,
vm
) {
var res = Object.create(null);
if (!dirs) {
// $flow-disable-line
return res
}
var i, dir;
for (i = 0; i < dirs.length; i++) {
dir = dirs[i];
if (!dir.modifiers) {
// $flow-disable-line
dir.modifiers = emptyModifiers;
}
res[getRawDirName(dir)] = dir;
dir.def = resolveAsset(vm.$options, 'directives', dir.name);
}
// $flow-disable-line
return res
}
function getRawDirName (dir) {
return dir.rawName || ((dir.name) + "." + (Object.keys(dir.modifiers || {}).join('.')))
}
function callHook$1 (dir, hook, vnode, oldVnode, isDestroy) {
var fn = dir.def && dir.def[hook];
if (fn) {
try {
fn(vnode.elm, dir, vnode, oldVnode, isDestroy);
} catch (e) {
handleError(e, vnode.context, ("directive " + (dir.name) + " " + hook + " hook"));
}
}
}
var baseModules = [
ref,
directives
];
/* */
function updateAttrs (oldVnode, vnode) {
var opts = vnode.componentOptions;
if (isDef(opts) && opts.Ctor.options.inheritAttrs === false) {
return
}
if (isUndef(oldVnode.data.attrs) && isUndef(vnode.data.attrs)) {
return
}
var key, cur, old;
var elm = vnode.elm;
var oldAttrs = oldVnode.data.attrs || {};
var attrs = vnode.data.attrs || {};
// clone observed objects, as the user probably wants to mutate it
if (isDef(attrs.__ob__)) {
attrs = vnode.data.attrs = extend({}, attrs);
}
for (key in attrs) {
cur = attrs[key];
old = oldAttrs[key];
if (old !== cur) {
setAttr(elm, key, cur);
}
}
// #4391: in IE9, setting type can reset value for input[type=radio]
// #6666: IE/Edge forces progress value down to 1 before setting a max
/* istanbul ignore if */
if ((isIE || isEdge) && attrs.value !== oldAttrs.value) {
setAttr(elm, 'value', attrs.value);
}
for (key in oldAttrs) {
if (isUndef(attrs[key])) {
if (isXlink(key)) {
elm.removeAttributeNS(xlinkNS, getXlinkProp(key));
} else if (!isEnumeratedAttr(key)) {
elm.removeAttribute(key);
}
}
}
}
function setAttr (el, key, value) {
if (el.tagName.indexOf('-') > -1) {
baseSetAttr(el, key, value);
} else if (isBooleanAttr(key)) {
// set attribute for blank value
// e.g. <option disabled>Select one</option>
if (isFalsyAttrValue(value)) {
el.removeAttribute(key);
} else {
// technically allowfullscreen is a boolean attribute for <iframe>,
// but Flash expects a value of "true" when used on <embed> tag
value = key === 'allowfullscreen' && el.tagName === 'EMBED'
? 'true'
: key;
el.setAttribute(key, value);
}
} else if (isEnumeratedAttr(key)) {
el.setAttribute(key, convertEnumeratedValue(key, value));
} else if (isXlink(key)) {
if (isFalsyAttrValue(value)) {
el.removeAttributeNS(xlinkNS, getXlinkProp(key));
} else {
el.setAttributeNS(xlinkNS, key, value);
}
} else {
baseSetAttr(el, key, value);
}
}
function baseSetAttr (el, key, value) {
if (isFalsyAttrValue(value)) {
el.removeAttribute(key);
} else {
// #7138: IE10 & 11 fires input event when setting placeholder on
// <textarea>... block the first input event and remove the blocker
// immediately.
/* istanbul ignore if */
if (
isIE && !isIE9 &&
el.tagName === 'TEXTAREA' &&
key === 'placeholder' && value !== '' && !el.__ieph
) {
var blocker = function (e) {
e.stopImmediatePropagation();
el.removeEventListener('input', blocker);
};
el.addEventListener('input', blocker);
// $flow-disable-line
el.__ieph = true; /* IE placeholder patched */
}
el.setAttribute(key, value);
}
}
var attrs = {
create: updateAttrs,
update: updateAttrs
};
/* */
function updateClass (oldVnode, vnode) {
var el = vnode.elm;
var data = vnode.data;
var oldData = oldVnode.data;
if (
isUndef(data.staticClass) &&
isUndef(data.class) && (
isUndef(oldData) || (
isUndef(oldData.staticClass) &&
isUndef(oldData.class)
)
)
) {
return
}
var cls = genClassForVnode(vnode);
// handle transition classes
var transitionClass = el._transitionClasses;
if (isDef(transitionClass)) {
cls = concat(cls, stringifyClass(transitionClass));
}
// set the class
if (cls !== el._prevClass) {
el.setAttribute('class', cls);
el._prevClass = cls;
}
}
var klass = {
create: updateClass,
update: updateClass
};
/* */
var validDivisionCharRE = /[\w).+\-_$\]]/;
function parseFilters (exp) {
var inSingle = false;
var inDouble = false;
var inTemplateString = false;
var inRegex = false;
var curly = 0;
var square = 0;
var paren = 0;
var lastFilterIndex = 0;
var c, prev, i, expression, filters;
for (i = 0; i < exp.length; i++) {
prev = c;
c = exp.charCodeAt(i);
if (inSingle) {
if (c === 0x27 && prev !== 0x5C) { inSingle = false; }
} else if (inDouble) {
if (c === 0x22 && prev !== 0x5C) { inDouble = false; }
} else if (inTemplateString) {
if (c === 0x60 && prev !== 0x5C) { inTemplateString = false; }
} else if (inRegex) {
if (c === 0x2f && prev !== 0x5C) { inRegex = false; }
} else if (
c === 0x7C && // pipe
exp.charCodeAt(i + 1) !== 0x7C &&
exp.charCodeAt(i - 1) !== 0x7C &&
!curly && !square && !paren
) {
if (expression === undefined) {
// first filter, end of expression
lastFilterIndex = i + 1;
expression = exp.slice(0, i).trim();
} else {
pushFilter();
}
} else {
switch (c) {
case 0x22: inDouble = true; break // "
case 0x27: inSingle = true; break // '
case 0x60: inTemplateString = true; break // `
case 0x28: paren++; break // (
case 0x29: paren--; break // )
case 0x5B: square++; break // [
case 0x5D: square--; break // ]
case 0x7B: curly++; break // {
case 0x7D: curly--; break // }
}
if (c === 0x2f) { // /
var j = i - 1;
var p = (void 0);
// find first non-whitespace prev char
for (; j >= 0; j--) {
p = exp.charAt(j);
if (p !== ' ') { break }
}
if (!p || !validDivisionCharRE.test(p)) {
inRegex = true;
}
}
}
}
if (expression === undefined) {
expression = exp.slice(0, i).trim();
} else if (lastFilterIndex !== 0) {
pushFilter();
}
function pushFilter () {
(filters || (filters = [])).push(exp.slice(lastFilterIndex, i).trim());
lastFilterIndex = i + 1;
}
if (filters) {
for (i = 0; i < filters.length; i++) {
expression = wrapFilter(expression, filters[i]);
}
}
return expression
}
function wrapFilter (exp, filter) {
var i = filter.indexOf('(');
if (i < 0) {
// _f: resolveFilter
return ("_f(\"" + filter + "\")(" + exp + ")")
} else {
var name = filter.slice(0, i);
var args = filter.slice(i + 1);
return ("_f(\"" + name + "\")(" + exp + (args !== ')' ? ',' + args : args))
}
}
/* */
/* eslint-disable no-unused-vars */
function baseWarn (msg, range) {
console.error(("[Vue compiler]: " + msg));
}
/* eslint-enable no-unused-vars */
function pluckModuleFunction (
modules,
key
) {
return modules
? modules.map(function (m) { return m[key]; }).filter(function (_) { return _; })
: []
}
function addProp (el, name, value, range, dynamic) {
(el.props || (el.props = [])).push(rangeSetItem({ name: name, value: value, dynamic: dynamic }, range));
el.plain = false;
}
function addAttr (el, name, value, range, dynamic) {
var attrs = dynamic
? (el.dynamicAttrs || (el.dynamicAttrs = []))
: (el.attrs || (el.attrs = []));
attrs.push(rangeSetItem({ name: name, value: value, dynamic: dynamic }, range));
el.plain = false;
}
// add a raw attr (use this in preTransforms)
function addRawAttr (el, name, value, range) {
el.attrsMap[name] = value;
el.attrsList.push(rangeSetItem({ name: name, value: value }, range));
}
function addDirective (
el,
name,
rawName,
value,
arg,
isDynamicArg,
modifiers,
range
) {
(el.directives || (el.directives = [])).push(rangeSetItem({
name: name,
rawName: rawName,
value: value,
arg: arg,
isDynamicArg: isDynamicArg,
modifiers: modifiers
}, range));
el.plain = false;
}
function prependModifierMarker (symbol, name, dynamic) {
return dynamic
? ("_p(" + name + ",\"" + symbol + "\")")
: symbol + name // mark the event as captured
}
function addHandler (
el,
name,
value,
modifiers,
important,
warn,
range,
dynamic
) {
modifiers = modifiers || emptyObject;
// normalize click.right and click.middle since they don't actually fire
// this is technically browser-specific, but at least for now browsers are
// the only target envs that have right/middle clicks.
if (modifiers.right) {
if (dynamic) {
name = "(" + name + ")==='click'?'contextmenu':(" + name + ")";
} else if (name === 'click') {
name = 'contextmenu';
delete modifiers.right;
}
} else if (modifiers.middle) {
if (dynamic) {
name = "(" + name + ")==='click'?'mouseup':(" + name + ")";
} else if (name === 'click') {
name = 'mouseup';
}
}
// check capture modifier
if (modifiers.capture) {
delete modifiers.capture;
name = prependModifierMarker('!', name, dynamic);
}
if (modifiers.once) {
delete modifiers.once;
name = prependModifierMarker('~', name, dynamic);
}
/* istanbul ignore if */
if (modifiers.passive) {
delete modifiers.passive;
name = prependModifierMarker('&', name, dynamic);
}
var events;
if (modifiers.native) {
delete modifiers.native;
events = el.nativeEvents || (el.nativeEvents = {});
} else {
events = el.events || (el.events = {});
}
var newHandler = rangeSetItem({ value: value.trim(), dynamic: dynamic }, range);
if (modifiers !== emptyObject) {
newHandler.modifiers = modifiers;
}
var handlers = events[name];
/* istanbul ignore if */
if (Array.isArray(handlers)) {
important ? handlers.unshift(newHandler) : handlers.push(newHandler);
} else if (handlers) {
events[name] = important ? [newHandler, handlers] : [handlers, newHandler];
} else {
events[name] = newHandler;
}
el.plain = false;
}
function getRawBindingAttr (
el,
name
) {
return el.rawAttrsMap[':' + name] ||
el.rawAttrsMap['v-bind:' + name] ||
el.rawAttrsMap[name]
}
function getBindingAttr (
el,
name,
getStatic
) {
var dynamicValue =
getAndRemoveAttr(el, ':' + name) ||
getAndRemoveAttr(el, 'v-bind:' + name);
if (dynamicValue != null) {
return parseFilters(dynamicValue)
} else if (getStatic !== false) {
var staticValue = getAndRemoveAttr(el, name);
if (staticValue != null) {
return JSON.stringify(staticValue)
}
}
}
// note: this only removes the attr from the Array (attrsList) so that it
// doesn't get processed by processAttrs.
// By default it does NOT remove it from the map (attrsMap) because the map is
// needed during codegen.
function getAndRemoveAttr (
el,
name,
removeFromMap
) {
var val;
if ((val = el.attrsMap[name]) != null) {
var list = el.attrsList;
for (var i = 0, l = list.length; i < l; i++) {
if (list[i].name === name) {
list.splice(i, 1);
break
}
}
}
if (removeFromMap) {
delete el.attrsMap[name];
}
return val
}
function getAndRemoveAttrByRegex (
el,
name
) {
var list = el.attrsList;
for (var i = 0, l = list.length; i < l; i++) {
var attr = list[i];
if (name.test(attr.name)) {
list.splice(i, 1);
return attr
}
}
}
function rangeSetItem (
item,
range
) {
if (range) {
if (range.start != null) {
item.start = range.start;
}
if (range.end != null) {
item.end = range.end;
}
}
return item
}
/* */
/**
* Cross-platform code generation for component v-model
*/
function genComponentModel (
el,
value,
modifiers
) {
var ref = modifiers || {};
var number = ref.number;
var trim = ref.trim;
var baseValueExpression = '$$v';
var valueExpression = baseValueExpression;
if (trim) {
valueExpression =
"(typeof " + baseValueExpression + " === 'string'" +
"? " + baseValueExpression + ".trim()" +
": " + baseValueExpression + ")";
}
if (number) {
valueExpression = "_n(" + valueExpression + ")";
}
var assignment = genAssignmentCode(value, valueExpression);
el.model = {
value: ("(" + value + ")"),
expression: JSON.stringify(value),
callback: ("function (" + baseValueExpression + ") {" + assignment + "}")
};
}
/**
* Cross-platform codegen helper for generating v-model value assignment code.
*/
function genAssignmentCode (
value,
assignment
) {
var res = parseModel(value);
if (res.key === null) {
return (value + "=" + assignment)
} else {
return ("$set(" + (res.exp) + ", " + (res.key) + ", " + assignment + ")")
}
}
/**
* Parse a v-model expression into a base path and a final key segment.
* Handles both dot-path and possible square brackets.
*
* Possible cases:
*
* - test
* - test[key]
* - test[test1[key]]
* - test["a"][key]
* - xxx.test[a[a].test1[key]]
* - test.xxx.a["asa"][test1[key]]
*
*/
var len, str, chr, index$1, expressionPos, expressionEndPos;
function parseModel (val) {
// Fix https://github.com/vuejs/vue/pull/7730
// allow v-model="obj.val " (trailing whitespace)
val = val.trim();
len = val.length;
if (val.indexOf('[') < 0 || val.lastIndexOf(']') < len - 1) {
index$1 = val.lastIndexOf('.');
if (index$1 > -1) {
return {
exp: val.slice(0, index$1),
key: '"' + val.slice(index$1 + 1) + '"'
}
} else {
return {
exp: val,
key: null
}
}
}
str = val;
index$1 = expressionPos = expressionEndPos = 0;
while (!eof()) {
chr = next();
/* istanbul ignore if */
if (isStringStart(chr)) {
parseString(chr);
} else if (chr === 0x5B) {
parseBracket(chr);
}
}
return {
exp: val.slice(0, expressionPos),
key: val.slice(expressionPos + 1, expressionEndPos)
}
}
function next () {
return str.charCodeAt(++index$1)
}
function eof () {
return index$1 >= len
}
function isStringStart (chr) {
return chr === 0x22 || chr === 0x27
}
function parseBracket (chr) {
var inBracket = 1;
expressionPos = index$1;
while (!eof()) {
chr = next();
if (isStringStart(chr)) {
parseString(chr);
continue
}
if (chr === 0x5B) { inBracket++; }
if (chr === 0x5D) { inBracket--; }
if (inBracket === 0) {
expressionEndPos = index$1;
break
}
}
}
function parseString (chr) {
var stringQuote = chr;
while (!eof()) {
chr = next();
if (chr === stringQuote) {
break
}
}
}
// in some cases, the event used has to be determined at runtime
// so we used some reserved tokens during compile.
var RANGE_TOKEN = '__r';
var CHECKBOX_RADIO_TOKEN = '__c';
function model (
el,
dir,
_warn
) {
var value = dir.value;
var modifiers = dir.modifiers;
var tag = el.tag;
var type = el.attrsMap.type;
if (el.component) {
genComponentModel(el, value, modifiers);
// component v-model doesn't need extra runtime
return false
} else if (tag === 'select') {
genSelect(el, value, modifiers);
} else if (tag === 'input' && type === 'checkbox') {
genCheckboxModel(el, value, modifiers);
} else if (tag === 'input' && type === 'radio') {
genRadioModel(el, value, modifiers);
} else if (tag === 'input' || tag === 'textarea') {
genDefaultModel(el, value, modifiers);
} else if (!config.isReservedTag(tag)) {
genComponentModel(el, value, modifiers);
// component v-model doesn't need extra runtime
return false
} else ;
// ensure runtime directive metadata
return true
}
function genCheckboxModel (
el,
value,
modifiers
) {
var number = modifiers && modifiers.number;
var valueBinding = getBindingAttr(el, 'value') || 'null';
var trueValueBinding = getBindingAttr(el, 'true-value') || 'true';
var falseValueBinding = getBindingAttr(el, 'false-value') || 'false';
addProp(el, 'checked',
"Array.isArray(" + value + ")" +
"?_i(" + value + "," + valueBinding + ")>-1" + (
trueValueBinding === 'true'
? (":(" + value + ")")
: (":_q(" + value + "," + trueValueBinding + ")")
)
);
addHandler(el, 'change',
"var $$a=" + value + "," +
'$$el=$event.target,' +
"$$c=$$el.checked?(" + trueValueBinding + "):(" + falseValueBinding + ");" +
'if(Array.isArray($$a)){' +
"var $$v=" + (number ? '_n(' + valueBinding + ')' : valueBinding) + "," +
'$$i=_i($$a,$$v);' +
"if($$el.checked){$$i<0&&(" + (genAssignmentCode(value, '$$a.concat([$$v])')) + ")}" +
"else{$$i>-1&&(" + (genAssignmentCode(value, '$$a.slice(0,$$i).concat($$a.slice($$i+1))')) + ")}" +
"}else{" + (genAssignmentCode(value, '$$c')) + "}",
null, true
);
}
function genRadioModel (
el,
value,
modifiers
) {
var number = modifiers && modifiers.number;
var valueBinding = getBindingAttr(el, 'value') || 'null';
valueBinding = number ? ("_n(" + valueBinding + ")") : valueBinding;
addProp(el, 'checked', ("_q(" + value + "," + valueBinding + ")"));
addHandler(el, 'change', genAssignmentCode(value, valueBinding), null, true);
}
function genSelect (
el,
value,
modifiers
) {
var number = modifiers && modifiers.number;
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 " + (number ? '_n(val)' : 'val') + "})";
var assignment = '$event.target.multiple ? $$selectedVal : $$selectedVal[0]';
var code = "var $$selectedVal = " + selectedVal + ";";
code = code + " " + (genAssignmentCode(value, assignment));
addHandler(el, 'change', code, null, true);
}
function genDefaultModel (
el,
value,
modifiers
) {
var type = el.attrsMap.type;
var ref = modifiers || {};
var lazy = ref.lazy;
var number = ref.number;
var trim = ref.trim;
var needCompositionGuard = !lazy && type !== 'range';
var event = lazy
? 'change'
: type === 'range'
? RANGE_TOKEN
: 'input';
var valueExpression = '$event.target.value';
if (trim) {
valueExpression = "$event.target.value.trim()";
}
if (number) {
valueExpression = "_n(" + valueExpression + ")";
}
var code = genAssignmentCode(value, valueExpression);
if (needCompositionGuard) {
code = "if($event.target.composing)return;" + code;
}
addProp(el, 'value', ("(" + value + ")"));
addHandler(el, event, code, null, true);
if (trim || number) {
addHandler(el, 'blur', '$forceUpdate()');
}
}
/* */
// normalize v-model event tokens that can only be determined at runtime.
// it's important to place the event as the first in the array because
// the whole point is ensuring the v-model callback gets called before
// user-attached handlers.
function normalizeEvents (on) {
/* istanbul ignore if */
if (isDef(on[RANGE_TOKEN])) {
// IE input[type=range] only supports `change` event
var event = isIE ? 'change' : 'input';
on[event] = [].concat(on[RANGE_TOKEN], on[event] || []);
delete on[RANGE_TOKEN];
}
// This was originally intended to fix #4521 but no longer necessary
// after 2.5. Keeping it for backwards compat with generated code from < 2.4
/* istanbul ignore if */
if (isDef(on[CHECKBOX_RADIO_TOKEN])) {
on.change = [].concat(on[CHECKBOX_RADIO_TOKEN], on.change || []);
delete on[CHECKBOX_RADIO_TOKEN];
}
}
var target$1;
function createOnceHandler$1 (event, handler, capture) {
var _target = target$1; // save current target element in closure
return function onceHandler () {
var res = handler.apply(null, arguments);
if (res !== null) {
remove$2(event, onceHandler, capture, _target);
}
}
}
// #9446: Firefox <= 53 (in particular, ESR 52) has incorrect Event.timeStamp
// implementation and does not fire microtasks in between event propagation, so
// safe to exclude.
var useMicrotaskFix = isUsingMicroTask && !(isFF && Number(isFF[1]) <= 53);
function add$1 (
name,
handler,
capture,
passive
) {
// async edge case #6566: inner click event triggers patch, event handler
// attached to outer element during patch, and triggered again. This
// happens because browsers fire microtask ticks between event propagation.
// the solution is simple: we save the timestamp when a handler is attached,
// and the handler would only fire if the event passed to it was fired
// AFTER it was attached.
if (useMicrotaskFix) {
var attachedTimestamp = currentFlushTimestamp;
var original = handler;
handler = original._wrapper = function (e) {
if (
// no bubbling, should always fire.
// this is just a safety net in case event.timeStamp is unreliable in
// certain weird environments...
e.target === e.currentTarget ||
// event is fired after handler attachment
e.timeStamp >= attachedTimestamp ||
// bail for environments that have buggy event.timeStamp implementations
// #9462 iOS 9 bug: event.timeStamp is 0 after history.pushState
// #9681 QtWebEngine event.timeStamp is negative value
e.timeStamp <= 0 ||
// #9448 bail if event is fired in another document in a multi-page
// electron/nw.js app, since event.timeStamp will be using a different
// starting reference
e.target.ownerDocument !== document
) {
return original.apply(this, arguments)
}
};
}
target$1.addEventListener(
name,
handler,
supportsPassive
? { capture: capture, passive: passive }
: capture
);
}
function remove$2 (
name,
handler,
capture,
_target
) {
(_target || target$1).removeEventListener(
name,
handler._wrapper || handler,
capture
);
}
function updateDOMListeners (oldVnode, vnode) {
if (isUndef(oldVnode.data.on) && isUndef(vnode.data.on)) {
return
}
var on = vnode.data.on || {};
var oldOn = oldVnode.data.on || {};
target$1 = vnode.elm;
normalizeEvents(on);
updateListeners(on, oldOn, add$1, remove$2, createOnceHandler$1, vnode.context);
target$1 = undefined;
}
var events = {
create: updateDOMListeners,
update: updateDOMListeners
};
/* */
var svgContainer;
function updateDOMProps (oldVnode, vnode) {
if (isUndef(oldVnode.data.domProps) && isUndef(vnode.data.domProps)) {
return
}
var key, cur;
var elm = vnode.elm;
var oldProps = oldVnode.data.domProps || {};
var props = vnode.data.domProps || {};
// clone observed objects, as the user probably wants to mutate it
if (isDef(props.__ob__)) {
props = vnode.data.domProps = extend({}, props);
}
for (key in oldProps) {
if (!(key in props)) {
elm[key] = '';
}
}
for (key in props) {
cur = props[key];
// ignore children if the node has textContent or innerHTML,
// as these will throw away existing DOM nodes and cause removal errors
// on subsequent patches (#3360)
if (key === 'textContent' || key === 'innerHTML') {
if (vnode.children) { vnode.children.length = 0; }
if (cur === oldProps[key]) { continue }
// #6601 work around Chrome version <= 55 bug where single textNode
// replaced by innerHTML/textContent retains its parentNode property
if (elm.childNodes.length === 1) {
elm.removeChild(elm.childNodes[0]);
}
}
if (key === 'value' && elm.tagName !== 'PROGRESS') {
// store value as _value as well since
// non-string values will be stringified
elm._value = cur;
// avoid resetting cursor position when value is the same
var strCur = isUndef(cur) ? '' : String(cur);
if (shouldUpdateValue(elm, strCur)) {
elm.value = strCur;
}
} else if (key === 'innerHTML' && isSVG(elm.tagName) && isUndef(elm.innerHTML)) {
// IE doesn't support innerHTML for SVG elements
svgContainer = svgContainer || document.createElement('div');
svgContainer.innerHTML = "<svg>" + cur + "</svg>";
var svg = svgContainer.firstChild;
while (elm.firstChild) {
elm.removeChild(elm.firstChild);
}
while (svg.firstChild) {
elm.appendChild(svg.firstChild);
}
} else if (
// skip the update if old and new VDOM state is the same.
// `value` is handled separately because the DOM value may be temporarily
// out of sync with VDOM state due to focus, composition and modifiers.
// This #4521 by skipping the unnecessary `checked` update.
cur !== oldProps[key]
) {
// some property updates can throw
// e.g. `value` on <progress> w/ non-finite value
try {
elm[key] = cur;
} catch (e) {}
}
}
}
// check platforms/web/util/attrs.js acceptValue
function shouldUpdateValue (elm, checkVal) {
return (!elm.composing && (
elm.tagName === 'OPTION' ||
isNotInFocusAndDirty(elm, checkVal) ||
isDirtyWithModifiers(elm, checkVal)
))
}
function isNotInFocusAndDirty (elm, checkVal) {
// return true when textbox (.number and .trim) loses focus and its value is
// not equal to the updated value
var notInFocus = true;
// #6157
// work around IE bug when accessing document.activeElement in an iframe
try { notInFocus = document.activeElement !== elm; } catch (e) {}
return notInFocus && elm.value !== checkVal
}
function isDirtyWithModifiers (elm, newVal) {
var value = elm.value;
var modifiers = elm._vModifiers; // injected by v-model runtime
if (isDef(modifiers)) {
if (modifiers.number) {
return toNumber(value) !== toNumber(newVal)
}
if (modifiers.trim) {
return value.trim() !== newVal.trim()
}
}
return value !== newVal
}
var domProps = {
create: updateDOMProps,
update: updateDOMProps
};
/* */
var parseStyleText = cached(function (cssText) {
var res = {};
var listDelimiter = /;(?![^(]*\))/g;
var propertyDelimiter = /:(.+)/;
cssText.split(listDelimiter).forEach(function (item) {
if (item) {
var tmp = item.split(propertyDelimiter);
tmp.length > 1 && (res[tmp[0].trim()] = tmp[1].trim());
}
});
return res
});
// merge static and dynamic style data on the same vnode
function normalizeStyleData (data) {
var style = normalizeStyleBinding(data.style);
// static style is pre-processed into an object during compilation
// and is always a fresh object, so it's safe to merge into it
return data.staticStyle
? extend(data.staticStyle, style)
: style
}
// normalize possible array / string values into Object
function normalizeStyleBinding (bindingStyle) {
if (Array.isArray(bindingStyle)) {
return toObject(bindingStyle)
}
if (typeof bindingStyle === 'string') {
return parseStyleText(bindingStyle)
}
return bindingStyle
}
/**
* parent component style should be after child's
* so that parent component's style could override it
*/
function getStyle (vnode, checkChild) {
var res = {};
var styleData;
if (checkChild) {
var childNode = vnode;
while (childNode.componentInstance) {
childNode = childNode.componentInstance._vnode;
if (
childNode && childNode.data &&
(styleData = normalizeStyleData(childNode.data))
) {
extend(res, styleData);
}
}
}
if ((styleData = normalizeStyleData(vnode.data))) {
extend(res, styleData);
}
var parentNode = vnode;
while ((parentNode = parentNode.parent)) {
if (parentNode.data && (styleData = normalizeStyleData(parentNode.data))) {
extend(res, styleData);
}
}
return res
}
/* */
var cssVarRE = /^--/;
var importantRE = /\s*!important$/;
var setProp = function (el, name, val) {
/* istanbul ignore if */
if (cssVarRE.test(name)) {
el.style.setProperty(name, val);
} else if (importantRE.test(val)) {
el.style.setProperty(hyphenate(name), val.replace(importantRE, ''), 'important');
} else {
var normalizedName = normalize(name);
if (Array.isArray(val)) {
// Support values array created by autoprefixer, e.g.
// {display: ["-webkit-box", "-ms-flexbox", "flex"]}
// Set them one by one, and the browser will only set those it can recognize
for (var i = 0, len = val.length; i < len; i++) {
el.style[normalizedName] = val[i];
}
} else {
el.style[normalizedName] = val;
}
}
};
var vendorNames = ['Webkit', 'Moz', 'ms'];
var emptyStyle;
var normalize = cached(function (prop) {
emptyStyle = emptyStyle || document.createElement('div').style;
prop = camelize(prop);
if (prop !== 'filter' && (prop in emptyStyle)) {
return prop
}
var capName = prop.charAt(0).toUpperCase() + prop.slice(1);
for (var i = 0; i < vendorNames.length; i++) {
var name = vendorNames[i] + capName;
if (name in emptyStyle) {
return name
}
}
});
function updateStyle (oldVnode, vnode) {
var data = vnode.data;
var oldData = oldVnode.data;
if (isUndef(data.staticStyle) && isUndef(data.style) &&
isUndef(oldData.staticStyle) && isUndef(oldData.style)
) {
return
}
var cur, name;
var el = vnode.elm;
var oldStaticStyle = oldData.staticStyle;
var oldStyleBinding = oldData.normalizedStyle || oldData.style || {};
// if static style exists, stylebinding already merged into it when doing normalizeStyleData
var oldStyle = oldStaticStyle || oldStyleBinding;
var style = normalizeStyleBinding(vnode.data.style) || {};
// store normalized style under a different key for next diff
// make sure to clone it if it's reactive, since the user likely wants
// to mutate it.
vnode.data.normalizedStyle = isDef(style.__ob__)
? extend({}, style)
: style;
var newStyle = getStyle(vnode, true);
for (name in oldStyle) {
if (isUndef(newStyle[name])) {
setProp(el, name, '');
}
}
for (name in newStyle) {
cur = newStyle[name];
if (cur !== oldStyle[name]) {
// ie9 setting to null has no effect, must use empty string
setProp(el, name, cur == null ? '' : cur);
}
}
}
var style = {
create: updateStyle,
update: updateStyle
};
/* */
var whitespaceRE = /\s+/;
/**
* Add class with compatibility for SVG since classList is not supported on
* SVG elements in IE
*/
function addClass (el, cls) {
/* istanbul ignore if */
if (!cls || !(cls = cls.trim())) {
return
}
/* istanbul ignore else */
if (el.classList) {
if (cls.indexOf(' ') > -1) {
cls.split(whitespaceRE).forEach(function (c) { return el.classList.add(c); });
} else {
el.classList.add(cls);
}
} else {
var cur = " " + (el.getAttribute('class') || '') + " ";
if (cur.indexOf(' ' + cls + ' ') < 0) {
el.setAttribute('class', (cur + cls).trim());
}
}
}
/**
* Remove class with compatibility for SVG since classList is not supported on
* SVG elements in IE
*/
function removeClass (el, cls) {
/* istanbul ignore if */
if (!cls || !(cls = cls.trim())) {
return
}
/* istanbul ignore else */
if (el.classList) {
if (cls.indexOf(' ') > -1) {
cls.split(whitespaceRE).forEach(function (c) { return el.classList.remove(c); });
} else {
el.classList.remove(cls);
}
if (!el.classList.length) {
el.removeAttribute('class');
}
} else {
var cur = " " + (el.getAttribute('class') || '') + " ";
var tar = ' ' + cls + ' ';
while (cur.indexOf(tar) >= 0) {
cur = cur.replace(tar, ' ');
}
cur = cur.trim();
if (cur) {
el.setAttribute('class', cur);
} else {
el.removeAttribute('class');
}
}
}
/* */
function resolveTransition (def$$1) {
if (!def$$1) {
return
}
/* istanbul ignore else */
if (typeof def$$1 === 'object') {
var res = {};
if (def$$1.css !== false) {
extend(res, autoCssTransition(def$$1.name || 'v'));
}
extend(res, def$$1);
return res
} else if (typeof def$$1 === 'string') {
return autoCssTransition(def$$1)
}
}
var autoCssTransition = cached(function (name) {
return {
enterClass: (name + "-enter"),
enterToClass: (name + "-enter-to"),
enterActiveClass: (name + "-enter-active"),
leaveClass: (name + "-leave"),
leaveToClass: (name + "-leave-to"),
leaveActiveClass: (name + "-leave-active")
}
});
var hasTransition = inBrowser && !isIE9;
var TRANSITION = 'transition';
var ANIMATION = 'animation';
// Transition property/event sniffing
var transitionProp = 'transition';
var transitionEndEvent = 'transitionend';
var animationProp = 'animation';
var animationEndEvent = 'animationend';
if (hasTransition) {
/* istanbul ignore if */
if (window.ontransitionend === undefined &&
window.onwebkittransitionend !== undefined
) {
transitionProp = 'WebkitTransition';
transitionEndEvent = 'webkitTransitionEnd';
}
if (window.onanimationend === undefined &&
window.onwebkitanimationend !== undefined
) {
animationProp = 'WebkitAnimation';
animationEndEvent = 'webkitAnimationEnd';
}
}
// binding to window is necessary to make hot reload work in IE in strict mode
var raf = inBrowser
? window.requestAnimationFrame
? window.requestAnimationFrame.bind(window)
: setTimeout
: /* istanbul ignore next */ function (fn) { return fn(); };
function nextFrame (fn) {
raf(function () {
raf(fn);
});
}
function addTransitionClass (el, cls) {
var transitionClasses = el._transitionClasses || (el._transitionClasses = []);
if (transitionClasses.indexOf(cls) < 0) {
transitionClasses.push(cls);
addClass(el, cls);
}
}
function removeTransitionClass (el, cls) {
if (el._transitionClasses) {
remove(el._transitionClasses, cls);
}
removeClass(el, cls);
}
function whenTransitionEnds (
el,
expectedType,
cb
) {
var ref = getTransitionInfo(el, expectedType);
var type = ref.type;
var timeout = ref.timeout;
var propCount = ref.propCount;
if (!type) { return cb() }
var event = type === TRANSITION ? transitionEndEvent : animationEndEvent;
var ended = 0;
var end = function () {
el.removeEventListener(event, onEnd);
cb();
};
var onEnd = function (e) {
if (e.target === el) {
if (++ended >= propCount) {
end();
}
}
};
setTimeout(function () {
if (ended < propCount) {
end();
}
}, timeout + 1);
el.addEventListener(event, onEnd);
}
var transformRE = /\b(transform|all)(,|$)/;
function getTransitionInfo (el, expectedType) {
var styles = window.getComputedStyle(el);
// JSDOM may return undefined for transition properties
var transitionDelays = (styles[transitionProp + 'Delay'] || '').split(', ');
var transitionDurations = (styles[transitionProp + 'Duration'] || '').split(', ');
var transitionTimeout = getTimeout(transitionDelays, transitionDurations);
var animationDelays = (styles[animationProp + 'Delay'] || '').split(', ');
var animationDurations = (styles[animationProp + 'Duration'] || '').split(', ');
var animationTimeout = getTimeout(animationDelays, animationDurations);
var type;
var timeout = 0;
var propCount = 0;
/* istanbul ignore if */
if (expectedType === TRANSITION) {
if (transitionTimeout > 0) {
type = TRANSITION;
timeout = transitionTimeout;
propCount = transitionDurations.length;
}
} else if (expectedType === ANIMATION) {
if (animationTimeout > 0) {
type = ANIMATION;
timeout = animationTimeout;
propCount = animationDurations.length;
}
} else {
timeout = Math.max(transitionTimeout, animationTimeout);
type = timeout > 0
? transitionTimeout > animationTimeout
? TRANSITION
: ANIMATION
: null;
propCount = type
? type === TRANSITION
? transitionDurations.length
: animationDurations.length
: 0;
}
var hasTransform =
type === TRANSITION &&
transformRE.test(styles[transitionProp + 'Property']);
return {
type: type,
timeout: timeout,
propCount: propCount,
hasTransform: hasTransform
}
}
function getTimeout (delays, durations) {
/* istanbul ignore next */
while (delays.length < durations.length) {
delays = delays.concat(delays);
}
return Math.max.apply(null, durations.map(function (d, i) {
return toMs(d) + toMs(delays[i])
}))
}
// Old versions of Chromium (below 61.0.3163.100) formats floating pointer numbers
// in a locale-dependent way, using a comma instead of a dot.
// If comma is not replaced with a dot, the input will be rounded down (i.e. acting
// as a floor function) causing unexpected behaviors
function toMs (s) {
return Number(s.slice(0, -1).replace(',', '.')) * 1000
}
/* */
function enter (vnode, toggleDisplay) {
var el = vnode.elm;
// call leave callback now
if (isDef(el._leaveCb)) {
el._leaveCb.cancelled = true;
el._leaveCb();
}
var data = resolveTransition(vnode.data.transition);
if (isUndef(data)) {
return
}
/* istanbul ignore if */
if (isDef(el._enterCb) || el.nodeType !== 1) {
return
}
var css = data.css;
var type = data.type;
var enterClass = data.enterClass;
var enterToClass = data.enterToClass;
var enterActiveClass = data.enterActiveClass;
var appearClass = data.appearClass;
var appearToClass = data.appearToClass;
var appearActiveClass = data.appearActiveClass;
var beforeEnter = data.beforeEnter;
var enter = data.enter;
var afterEnter = data.afterEnter;
var enterCancelled = data.enterCancelled;
var beforeAppear = data.beforeAppear;
var appear = data.appear;
var afterAppear = data.afterAppear;
var appearCancelled = data.appearCancelled;
var duration = data.duration;
// activeInstance will always be the <transition> component managing this
// transition. One edge case to check is when the <transition> is placed
// as the root node of a child component. In that case we need to check
// <transition>'s parent for appear check.
var context = activeInstance;
var transitionNode = activeInstance.$vnode;
while (transitionNode && transitionNode.parent) {
context = transitionNode.context;
transitionNode = transitionNode.parent;
}
var isAppear = !context._isMounted || !vnode.isRootInsert;
if (isAppear && !appear && appear !== '') {
return
}
var startClass = isAppear && appearClass
? appearClass
: enterClass;
var activeClass = isAppear && appearActiveClass
? appearActiveClass
: enterActiveClass;
var toClass = isAppear && appearToClass
? appearToClass
: enterToClass;
var beforeEnterHook = isAppear
? (beforeAppear || beforeEnter)
: beforeEnter;
var enterHook = isAppear
? (typeof appear === 'function' ? appear : enter)
: enter;
var afterEnterHook = isAppear
? (afterAppear || afterEnter)
: afterEnter;
var enterCancelledHook = isAppear
? (appearCancelled || enterCancelled)
: enterCancelled;
var explicitEnterDuration = toNumber(
isObject(duration)
? duration.enter
: duration
);
var expectsCSS = css !== false && !isIE9;
var userWantsControl = getHookArgumentsLength(enterHook);
var cb = el._enterCb = once(function () {
if (expectsCSS) {
removeTransitionClass(el, toClass);
removeTransitionClass(el, activeClass);
}
if (cb.cancelled) {
if (expectsCSS) {
removeTransitionClass(el, startClass);
}
enterCancelledHook && enterCancelledHook(el);
} else {
afterEnterHook && afterEnterHook(el);
}
el._enterCb = null;
});
if (!vnode.data.show) {
// remove pending leave element on enter by injecting an insert hook
mergeVNodeHook(vnode, 'insert', function () {
var parent = el.parentNode;
var pendingNode = parent && parent._pending && parent._pending[vnode.key];
if (pendingNode &&
pendingNode.tag === vnode.tag &&
pendingNode.elm._leaveCb
) {
pendingNode.elm._leaveCb();
}
enterHook && enterHook(el, cb);
});
}
// start enter transition
beforeEnterHook && beforeEnterHook(el);
if (expectsCSS) {
addTransitionClass(el, startClass);
addTransitionClass(el, activeClass);
nextFrame(function () {
removeTransitionClass(el, startClass);
if (!cb.cancelled) {
addTransitionClass(el, toClass);
if (!userWantsControl) {
if (isValidDuration(explicitEnterDuration)) {
setTimeout(cb, explicitEnterDuration);
} else {
whenTransitionEnds(el, type, cb);
}
}
}
});
}
if (vnode.data.show) {
toggleDisplay && toggleDisplay();
enterHook && enterHook(el, cb);
}
if (!expectsCSS && !userWantsControl) {
cb();
}
}
function leave (vnode, rm) {
var el = vnode.elm;
// call enter callback now
if (isDef(el._enterCb)) {
el._enterCb.cancelled = true;
el._enterCb();
}
var data = resolveTransition(vnode.data.transition);
if (isUndef(data) || el.nodeType !== 1) {
return rm()
}
/* istanbul ignore if */
if (isDef(el._leaveCb)) {
return
}
var css = data.css;
var type = data.type;
var leaveClass = data.leaveClass;
var leaveToClass = data.leaveToClass;
var leaveActiveClass = data.leaveActiveClass;
var beforeLeave = data.beforeLeave;
var leave = data.leave;
var afterLeave = data.afterLeave;
var leaveCancelled = data.leaveCancelled;
var delayLeave = data.delayLeave;
var duration = data.duration;
var expectsCSS = css !== false && !isIE9;
var userWantsControl = getHookArgumentsLength(leave);
var explicitLeaveDuration = toNumber(
isObject(duration)
? duration.leave
: duration
);
var cb = el._leaveCb = once(function () {
if (el.parentNode && el.parentNode._pending) {
el.parentNode._pending[vnode.key] = null;
}
if (expectsCSS) {
removeTransitionClass(el, leaveToClass);
removeTransitionClass(el, leaveActiveClass);
}
if (cb.cancelled) {
if (expectsCSS) {
removeTransitionClass(el, leaveClass);
}
leaveCancelled && leaveCancelled(el);
} else {
rm();
afterLeave && afterLeave(el);
}
el._leaveCb = null;
});
if (delayLeave) {
delayLeave(performLeave);
} else {
performLeave();
}
function performLeave () {
// the delayed leave may have already been cancelled
if (cb.cancelled) {
return
}
// record leaving element
if (!vnode.data.show && el.parentNode) {
(el.parentNode._pending || (el.parentNode._pending = {}))[(vnode.key)] = vnode;
}
beforeLeave && beforeLeave(el);
if (expectsCSS) {
addTransitionClass(el, leaveClass);
addTransitionClass(el, leaveActiveClass);
nextFrame(function () {
removeTransitionClass(el, leaveClass);
if (!cb.cancelled) {
addTransitionClass(el, leaveToClass);
if (!userWantsControl) {
if (isValidDuration(explicitLeaveDuration)) {
setTimeout(cb, explicitLeaveDuration);
} else {
whenTransitionEnds(el, type, cb);
}
}
}
});
}
leave && leave(el, cb);
if (!expectsCSS && !userWantsControl) {
cb();
}
}
}
function isValidDuration (val) {
return typeof val === 'number' && !isNaN(val)
}
/**
* Normalize a transition hook's argument length. The hook may be:
* - a merged hook (invoker) with the original in .fns
* - a wrapped component method (check ._length)
* - a plain function (.length)
*/
function getHookArgumentsLength (fn) {
if (isUndef(fn)) {
return false
}
var invokerFns = fn.fns;
if (isDef(invokerFns)) {
// invoker
return getHookArgumentsLength(
Array.isArray(invokerFns)
? invokerFns[0]
: invokerFns
)
} else {
return (fn._length || fn.length) > 1
}
}
function _enter (_, vnode) {
if (vnode.data.show !== true) {
enter(vnode);
}
}
var transition = inBrowser ? {
create: _enter,
activate: _enter,
remove: function remove$$1 (vnode, rm) {
/* istanbul ignore else */
if (vnode.data.show !== true) {
leave(vnode, rm);
} else {
rm();
}
}
} : {};
var platformModules = [
attrs,
klass,
events,
domProps,
style,
transition
];
/* */
// the directive module should be applied last, after all
// built-in modules have been applied.
var modules = platformModules.concat(baseModules);
var patch = createPatchFunction({ nodeOps: nodeOps, modules: modules });
/**
* Not type checking this file because flow doesn't like attaching
* properties to Elements.
*/
/* istanbul ignore if */
if (isIE9) {
// http://www.matts411.com/post/internet-explorer-9-oninput/
document.addEventListener('selectionchange', function () {
var el = document.activeElement;
if (el && el.vmodel) {
trigger(el, 'input');
}
});
}
var directive = {
inserted: function inserted (el, binding, vnode, oldVnode) {
if (vnode.tag === 'select') {
// #6903
if (oldVnode.elm && !oldVnode.elm._vOptions) {
mergeVNodeHook(vnode, 'postpatch', function () {
directive.componentUpdated(el, binding, vnode);
});
} else {
setSelected(el, binding, vnode.context);
}
el._vOptions = [].map.call(el.options, getValue);
} else if (vnode.tag === 'textarea' || isTextInputType(el.type)) {
el._vModifiers = binding.modifiers;
if (!binding.modifiers.lazy) {
el.addEventListener('compositionstart', onCompositionStart);
el.addEventListener('compositionend', onCompositionEnd);
// Safari < 10.2 & UIWebView doesn't fire compositionend when
// switching focus before confirming composition choice
// this also fixes the issue where some browsers e.g. iOS Chrome
// fires "change" instead of "input" on autocomplete.
el.addEventListener('change', onCompositionEnd);
/* istanbul ignore if */
if (isIE9) {
el.vmodel = true;
}
}
}
},
componentUpdated: function componentUpdated (el, binding, vnode) {
if (vnode.tag === 'select') {
setSelected(el, binding, vnode.context);
// in case the options rendered by v-for have changed,
// it's possible that the value is out-of-sync with the rendered options.
// detect such cases and filter out values that no longer has a matching
// option in the DOM.
var prevOptions = el._vOptions;
var curOptions = el._vOptions = [].map.call(el.options, getValue);
if (curOptions.some(function (o, i) { return !looseEqual(o, prevOptions[i]); })) {
// trigger change event if
// no matching option found for at least one value
var needReset = el.multiple
? binding.value.some(function (v) { return hasNoMatchingOption(v, curOptions); })
: binding.value !== binding.oldValue && hasNoMatchingOption(binding.value, curOptions);
if (needReset) {
trigger(el, 'change');
}
}
}
}
};
function setSelected (el, binding, vm) {
actuallySetSelected(el, binding);
/* istanbul ignore if */
if (isIE || isEdge) {
setTimeout(function () {
actuallySetSelected(el, binding);
}, 0);
}
}
function actuallySetSelected (el, binding, vm) {
var value = binding.value;
var isMultiple = el.multiple;
if (isMultiple && !Array.isArray(value)) {
return
}
var selected, option;
for (var i = 0, l = el.options.length; i < l; i++) {
option = el.options[i];
if (isMultiple) {
selected = looseIndexOf(value, getValue(option)) > -1;
if (option.selected !== selected) {
option.selected = selected;
}
} else {
if (looseEqual(getValue(option), value)) {
if (el.selectedIndex !== i) {
el.selectedIndex = i;
}
return
}
}
}
if (!isMultiple) {
el.selectedIndex = -1;
}
}
function hasNoMatchingOption (value, options) {
return options.every(function (o) { return !looseEqual(o, value); })
}
function getValue (option) {
return '_value' in option
? option._value
: option.value
}
function onCompositionStart (e) {
e.target.composing = true;
}
function onCompositionEnd (e) {
// prevent triggering an input event for no reason
if (!e.target.composing) { return }
e.target.composing = false;
trigger(e.target, 'input');
}
function trigger (el, type) {
var e = document.createEvent('HTMLEvents');
e.initEvent(type, true, true);
el.dispatchEvent(e);
}
/* */
// recursively search for possible transition defined inside the component root
function locateNode (vnode) {
return vnode.componentInstance && (!vnode.data || !vnode.data.transition)
? locateNode(vnode.componentInstance._vnode)
: vnode
}
var show = {
bind: function bind (el, ref, vnode) {
var value = ref.value;
vnode = locateNode(vnode);
var transition$$1 = vnode.data && vnode.data.transition;
var originalDisplay = el.__vOriginalDisplay =
el.style.display === 'none' ? '' : el.style.display;
if (value && transition$$1) {
vnode.data.show = true;
enter(vnode, function () {
el.style.display = originalDisplay;
});
} else {
el.style.display = value ? originalDisplay : 'none';
}
},
update: function update (el, ref, vnode) {
var value = ref.value;
var oldValue = ref.oldValue;
/* istanbul ignore if */
if (!value === !oldValue) { return }
vnode = locateNode(vnode);
var transition$$1 = vnode.data && vnode.data.transition;
if (transition$$1) {
vnode.data.show = true;
if (value) {
enter(vnode, function () {
el.style.display = el.__vOriginalDisplay;
});
} else {
leave(vnode, function () {
el.style.display = 'none';
});
}
} else {
el.style.display = value ? el.__vOriginalDisplay : 'none';
}
},
unbind: function unbind (
el,
binding,
vnode,
oldVnode,
isDestroy
) {
if (!isDestroy) {
el.style.display = el.__vOriginalDisplay;
}
}
};
var platformDirectives = {
model: directive,
show: show
};
/* */
var transitionProps = {
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]
};
// in case the child is also an abstract component, e.g. <keep-alive>
// we want to recursively retrieve the real component to be rendered
function getRealChild (vnode) {
var compOptions = vnode && vnode.componentOptions;
if (compOptions && compOptions.Ctor.options.abstract) {
return getRealChild(getFirstComponentChild(compOptions.children))
} else {
return vnode
}
}
function extractTransitionData (comp) {
var data = {};
var options = comp.$options;
// props
for (var key in options.propsData) {
data[key] = comp[key];
}
// events.
// extract listeners and pass them directly to the transition methods
var listeners = options._parentListeners;
for (var key$1 in listeners) {
data[camelize(key$1)] = listeners[key$1];
}
return data
}
function placeholder (h, rawChild) {
if (/\d-keep-alive$/.test(rawChild.tag)) {
return h('keep-alive', {
props: rawChild.componentOptions.propsData
})
}
}
function hasParentTransition (vnode) {
while ((vnode = vnode.parent)) {
if (vnode.data.transition) {
return true
}
}
}
function isSameChild (child, oldChild) {
return oldChild.key === child.key && oldChild.tag === child.tag
}
var isNotTextNode = function (c) { return c.tag || isAsyncPlaceholder(c); };
var isVShowDirective = function (d) { return d.name === 'show'; };
var Transition = {
name: 'transition',
props: transitionProps,
abstract: true,
render: function render (h) {
var this$1 = this;
var children = this.$slots.default;
if (!children) {
return
}
// filter out text nodes (possible whitespaces)
children = children.filter(isNotTextNode);
/* istanbul ignore if */
if (!children.length) {
return
}
var mode = this.mode;
var rawChild = children[0];
// if this is a component root node and the component's
// parent container node also has transition, skip.
if (hasParentTransition(this.$vnode)) {
return rawChild
}
// apply transition data to child
// use getRealChild() to ignore abstract components e.g. keep-alive
var child = getRealChild(rawChild);
/* istanbul ignore if */
if (!child) {
return rawChild
}
if (this._leaving) {
return placeholder(h, rawChild)
}
// ensure a key that is unique to the vnode type and to this transition
// component instance. This key will be used to remove pending leaving nodes
// during entering.
var id = "__transition-" + (this._uid) + "-";
child.key = child.key == null
? child.isComment
? id + 'comment'
: id + child.tag
: isPrimitive(child.key)
? (String(child.key).indexOf(id) === 0 ? child.key : id + child.key)
: child.key;
var data = (child.data || (child.data = {})).transition = extractTransitionData(this);
var oldRawChild = this._vnode;
var oldChild = getRealChild(oldRawChild);
// mark v-show
// so that the transition module can hand over the control to the directive
if (child.data.directives && child.data.directives.some(isVShowDirective)) {
child.data.show = true;
}
if (
oldChild &&
oldChild.data &&
!isSameChild(child, oldChild) &&
!isAsyncPlaceholder(oldChild) &&
// #6687 component root is a comment node
!(oldChild.componentInstance && oldChild.componentInstance._vnode.isComment)
) {
// replace old child transition data with fresh one
// important for dynamic transitions!
var oldData = oldChild.data.transition = extend({}, data);
// handle transition mode
if (mode === 'out-in') {
// return placeholder node and queue update when leave finishes
this._leaving = true;
mergeVNodeHook(oldData, 'afterLeave', function () {
this$1._leaving = false;
this$1.$forceUpdate();
});
return placeholder(h, rawChild)
} else if (mode === 'in-out') {
if (isAsyncPlaceholder(child)) {
return oldRawChild
}
var delayedLeave;
var performLeave = function () { delayedLeave(); };
mergeVNodeHook(data, 'afterEnter', performLeave);
mergeVNodeHook(data, 'enterCancelled', performLeave);
mergeVNodeHook(oldData, 'delayLeave', function (leave) { delayedLeave = leave; });
}
}
return rawChild
}
};
/* */
var props = extend({
tag: String,
moveClass: String
}, transitionProps);
delete props.mode;
var TransitionGroup = {
props: props,
beforeMount: function beforeMount () {
var this$1 = this;
var update = this._update;
this._update = function (vnode, hydrating) {
var restoreActiveInstance = setActiveInstance(this$1);
// force removing pass
this$1.__patch__(
this$1._vnode,
this$1.kept,
false, // hydrating
true // removeOnly (!important, avoids unnecessary moves)
);
this$1._vnode = this$1.kept;
restoreActiveInstance();
update.call(this$1, vnode, hydrating);
};
},
render: function render (h) {
var tag = this.tag || this.$vnode.data.tag || 'span';
var map = Object.create(null);
var prevChildren = this.prevChildren = this.children;
var rawChildren = this.$slots.default || [];
var children = this.children = [];
var transitionData = extractTransitionData(this);
for (var i = 0; i < rawChildren.length; i++) {
var c = rawChildren[i];
if (c.tag) {
if (c.key != null && String(c.key).indexOf('__vlist') !== 0) {
children.push(c);
map[c.key] = c
;(c.data || (c.data = {})).transition = transitionData;
}
}
}
if (prevChildren) {
var kept = [];
var removed = [];
for (var i$1 = 0; i$1 < prevChildren.length; i$1++) {
var c$1 = prevChildren[i$1];
c$1.data.transition = transitionData;
c$1.data.pos = c$1.elm.getBoundingClientRect();
if (map[c$1.key]) {
kept.push(c$1);
} else {
removed.push(c$1);
}
}
this.kept = h(tag, null, kept);
this.removed = removed;
}
return h(tag, null, children)
},
updated: function updated () {
var children = this.prevChildren;
var moveClass = this.moveClass || ((this.name || 'v') + '-move');
if (!children.length || !this.hasMove(children[0].elm, moveClass)) {
return
}
// we divide the work into three loops to avoid mixing DOM reads and writes
// in each iteration - which helps prevent layout thrashing.
children.forEach(callPendingCbs);
children.forEach(recordPosition);
children.forEach(applyTranslation);
// force reflow to put everything in position
// assign to this to avoid being removed in tree-shaking
// $flow-disable-line
this._reflow = document.body.offsetHeight;
children.forEach(function (c) {
if (c.data.moved) {
var el = c.elm;
var s = el.style;
addTransitionClass(el, moveClass);
s.transform = s.WebkitTransform = s.transitionDuration = '';
el.addEventListener(transitionEndEvent, el._moveCb = function cb (e) {
if (e && e.target !== el) {
return
}
if (!e || /transform$/.test(e.propertyName)) {
el.removeEventListener(transitionEndEvent, cb);
el._moveCb = null;
removeTransitionClass(el, moveClass);
}
});
}
});
},
methods: {
hasMove: function hasMove (el, moveClass) {
/* istanbul ignore if */
if (!hasTransition) {
return false
}
/* istanbul ignore if */
if (this._hasMove) {
return this._hasMove
}
// Detect whether an element with the move class applied has
// CSS transitions. Since the element may be inside an entering
// transition at this very moment, we make a clone of it and remove
// all other transition classes applied to ensure only the move class
// is applied.
var clone = el.cloneNode();
if (el._transitionClasses) {
el._transitionClasses.forEach(function (cls) { removeClass(clone, cls); });
}
addClass(clone, moveClass);
clone.style.display = 'none';
this.$el.appendChild(clone);
var info = getTransitionInfo(clone);
this.$el.removeChild(clone);
return (this._hasMove = info.hasTransform)
}
}
};
function callPendingCbs (c) {
/* istanbul ignore if */
if (c.elm._moveCb) {
c.elm._moveCb();
}
/* istanbul ignore if */
if (c.elm._enterCb) {
c.elm._enterCb();
}
}
function recordPosition (c) {
c.data.newPos = c.elm.getBoundingClientRect();
}
function applyTranslation (c) {
var oldPos = c.data.pos;
var newPos = c.data.newPos;
var dx = oldPos.left - newPos.left;
var dy = oldPos.top - newPos.top;
if (dx || dy) {
c.data.moved = true;
var s = c.elm.style;
s.transform = s.WebkitTransform = "translate(" + dx + "px," + dy + "px)";
s.transitionDuration = '0s';
}
}
var platformComponents = {
Transition: Transition,
TransitionGroup: TransitionGroup
};
/* */
// install platform specific utils
Vue.config.mustUseProp = mustUseProp;
Vue.config.isReservedTag = isReservedTag;
Vue.config.isReservedAttr = isReservedAttr;
Vue.config.getTagNamespace = getTagNamespace;
Vue.config.isUnknownElement = isUnknownElement;
// install platform runtime directives & components
extend(Vue.options.directives, platformDirectives);
extend(Vue.options.components, platformComponents);
// install platform patch function
Vue.prototype.__patch__ = inBrowser ? patch : noop;
// public mount method
Vue.prototype.$mount = function (
el,
hydrating
) {
el = el && inBrowser ? query(el) : undefined;
return mountComponent(this, el, hydrating)
};
// devtools global hook
/* istanbul ignore next */
if (inBrowser) {
setTimeout(function () {
if (config.devtools) {
if (devtools) {
devtools.emit('init', Vue);
}
}
}, 0);
}
/* */
var defaultTagRE = /\{\{((?:.|\r?\n)+?)\}\}/g;
var regexEscapeRE = /[-.*+?^${}()|[\]\/\\]/g;
var buildRegex = cached(function (delimiters) {
var open = delimiters[0].replace(regexEscapeRE, '\\$&');
var close = delimiters[1].replace(regexEscapeRE, '\\$&');
return new RegExp(open + '((?:.|\\n)+?)' + close, 'g')
});
function parseText (
text,
delimiters
) {
var tagRE = delimiters ? buildRegex(delimiters) : defaultTagRE;
if (!tagRE.test(text)) {
return
}
var tokens = [];
var rawTokens = [];
var lastIndex = tagRE.lastIndex = 0;
var match, index, tokenValue;
while ((match = tagRE.exec(text))) {
index = match.index;
// push text token
if (index > lastIndex) {
rawTokens.push(tokenValue = text.slice(lastIndex, index));
tokens.push(JSON.stringify(tokenValue));
}
// tag token
var exp = parseFilters(match[1].trim());
tokens.push(("_s(" + exp + ")"));
rawTokens.push({ '@binding': exp });
lastIndex = index + match[0].length;
}
if (lastIndex < text.length) {
rawTokens.push(tokenValue = text.slice(lastIndex));
tokens.push(JSON.stringify(tokenValue));
}
return {
expression: tokens.join('+'),
tokens: rawTokens
}
}
/* */
function transformNode (el, options) {
var warn = options.warn || baseWarn;
var staticClass = getAndRemoveAttr(el, 'class');
if (staticClass) {
el.staticClass = JSON.stringify(staticClass);
}
var classBinding = getBindingAttr(el, 'class', false /* getStatic */);
if (classBinding) {
el.classBinding = classBinding;
}
}
function genData (el) {
var data = '';
if (el.staticClass) {
data += "staticClass:" + (el.staticClass) + ",";
}
if (el.classBinding) {
data += "class:" + (el.classBinding) + ",";
}
return data
}
var klass$1 = {
staticKeys: ['staticClass'],
transformNode: transformNode,
genData: genData
};
/* */
function transformNode$1 (el, options) {
var warn = options.warn || baseWarn;
var staticStyle = getAndRemoveAttr(el, 'style');
if (staticStyle) {
el.staticStyle = JSON.stringify(parseStyleText(staticStyle));
}
var styleBinding = getBindingAttr(el, 'style', false /* getStatic */);
if (styleBinding) {
el.styleBinding = styleBinding;
}
}
function genData$1 (el) {
var data = '';
if (el.staticStyle) {
data += "staticStyle:" + (el.staticStyle) + ",";
}
if (el.styleBinding) {
data += "style:(" + (el.styleBinding) + "),";
}
return data
}
var style$1 = {
staticKeys: ['staticStyle'],
transformNode: transformNode$1,
genData: genData$1
};
/* */
var decoder;
var he = {
decode: function decode (html) {
decoder = decoder || document.createElement('div');
decoder.innerHTML = html;
return decoder.textContent
}
};
/* */
var isUnaryTag = makeMap(
'area,base,br,col,embed,frame,hr,img,input,isindex,keygen,' +
'link,meta,param,source,track,wbr'
);
// Elements that you can, intentionally, leave open
// (and which close themselves)
var canBeLeftOpenTag = makeMap(
'colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr,source'
);
// HTML5 tags https://html.spec.whatwg.org/multipage/indices.html#elements-3
// Phrasing Content https://html.spec.whatwg.org/multipage/dom.html#phrasing-content
var isNonPhrasingTag = makeMap(
'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'
);
/**
* Not type-checking this file because it's mostly vendor code.
*/
// Regular Expressions for parsing tags and attributes
var attribute = /^\s*([^\s"'<>\/=]+)(?:\s*(=)\s*(?:"([^"]*)"+|'([^']*)'+|([^\s"'=<>`]+)))?/;
var dynamicArgAttribute = /^\s*((?:v-[\w-]+:|@|:|#)\[[^=]+\][^\s"'<>\/=]*)(?:\s*(=)\s*(?:"([^"]*)"+|'([^']*)'+|([^\s"'=<>`]+)))?/;
var ncname = "[a-zA-Z_][\\-\\.0-9_a-zA-Z" + (unicodeRegExp.source) + "]*";
var qnameCapture = "((?:" + ncname + "\\:)?" + ncname + ")";
var startTagOpen = new RegExp(("^<" + qnameCapture));
var startTagClose = /^\s*(\/?)>/;
var endTag = new RegExp(("^<\\/" + qnameCapture + "[^>]*>"));
var doctype = /^<!DOCTYPE [^>]+>/i;
// #7298: escape - to avoid being passed as HTML comment when inlined in page
var comment = /^<!\--/;
var conditionalComment = /^<!\[/;
// Special Elements (can contain anything)
var isPlainTextElement = makeMap('script,style,textarea', true);
var reCache = {};
var decodingMap = {
'&lt;': '<',
'&gt;': '>',
'&quot;': '"',
'&amp;': '&',
'&#10;': '\n',
'&#9;': '\t',
'&#39;': "'"
};
var encodedAttr = /&(?:lt|gt|quot|amp|#39);/g;
var encodedAttrWithNewLines = /&(?:lt|gt|quot|amp|#39|#10|#9);/g;
// #5992
var isIgnoreNewlineTag = makeMap('pre,textarea', true);
var shouldIgnoreFirstNewline = function (tag, html) { return tag && isIgnoreNewlineTag(tag) && html[0] === '\n'; };
function decodeAttr (value, shouldDecodeNewlines) {
var re = shouldDecodeNewlines ? encodedAttrWithNewLines : encodedAttr;
return value.replace(re, function (match) { return decodingMap[match]; })
}
function parseHTML (html, options) {
var stack = [];
var expectHTML = options.expectHTML;
var isUnaryTag$$1 = options.isUnaryTag || no;
var canBeLeftOpenTag$$1 = options.canBeLeftOpenTag || no;
var index = 0;
var last, lastTag;
while (html) {
last = html;
// Make sure we're not in a plaintext content element like script/style
if (!lastTag || !isPlainTextElement(lastTag)) {
var textEnd = html.indexOf('<');
if (textEnd === 0) {
// Comment:
if (comment.test(html)) {
var commentEnd = html.indexOf('-->');
if (commentEnd >= 0) {
if (options.shouldKeepComment) {
options.comment(html.substring(4, commentEnd), index, index + commentEnd + 3);
}
advance(commentEnd + 3);
continue
}
}
// http://en.wikipedia.org/wiki/Conditional_comment#Downlevel-revealed_conditional_comment
if (conditionalComment.test(html)) {
var conditionalEnd = html.indexOf(']>');
if (conditionalEnd >= 0) {
advance(conditionalEnd + 2);
continue
}
}
// Doctype:
var doctypeMatch = html.match(doctype);
if (doctypeMatch) {
advance(doctypeMatch[0].length);
continue
}
// End tag:
var endTagMatch = html.match(endTag);
if (endTagMatch) {
var curIndex = index;
advance(endTagMatch[0].length);
parseEndTag(endTagMatch[1], curIndex, index);
continue
}
// Start tag:
var startTagMatch = parseStartTag();
if (startTagMatch) {
handleStartTag(startTagMatch);
if (shouldIgnoreFirstNewline(startTagMatch.tagName, html)) {
advance(1);
}
continue
}
}
var text = (void 0), rest = (void 0), next = (void 0);
if (textEnd >= 0) {
rest = html.slice(textEnd);
while (
!endTag.test(rest) &&
!startTagOpen.test(rest) &&
!comment.test(rest) &&
!conditionalComment.test(rest)
) {
// < in plain text, be forgiving and treat it as text
next = rest.indexOf('<', 1);
if (next < 0) { break }
textEnd += next;
rest = html.slice(textEnd);
}
text = html.substring(0, textEnd);
}
if (textEnd < 0) {
text = html;
}
if (text) {
advance(text.length);
}
if (options.chars && text) {
options.chars(text, index - text.length, index);
}
} else {
var endTagLength = 0;
var stackedTag = lastTag.toLowerCase();
var reStackedTag = reCache[stackedTag] || (reCache[stackedTag] = new RegExp('([\\s\\S]*?)(</' + stackedTag + '[^>]*>)', 'i'));
var rest$1 = html.replace(reStackedTag, function (all, text, endTag) {
endTagLength = endTag.length;
if (!isPlainTextElement(stackedTag) && stackedTag !== 'noscript') {
text = text
.replace(/<!\--([\s\S]*?)-->/g, '$1') // #7298
.replace(/<!\[CDATA\[([\s\S]*?)]]>/g, '$1');
}
if (shouldIgnoreFirstNewline(stackedTag, text)) {
text = text.slice(1);
}
if (options.chars) {
options.chars(text);
}
return ''
});
index += html.length - rest$1.length;
html = rest$1;
parseEndTag(stackedTag, index - endTagLength, index);
}
if (html === last) {
options.chars && options.chars(html);
break
}
}
// Clean up any remaining tags
parseEndTag();
function advance (n) {
index += n;
html = html.substring(n);
}
function parseStartTag () {
var start = html.match(startTagOpen);
if (start) {
var match = {
tagName: start[1],
attrs: [],
start: index
};
advance(start[0].length);
var end, attr;
while (!(end = html.match(startTagClose)) && (attr = html.match(dynamicArgAttribute) || html.match(attribute))) {
attr.start = index;
advance(attr[0].length);
attr.end = index;
match.attrs.push(attr);
}
if (end) {
match.unarySlash = end[1];
advance(end[0].length);
match.end = index;
return match
}
}
}
function handleStartTag (match) {
var tagName = match.tagName;
var unarySlash = match.unarySlash;
if (expectHTML) {
if (lastTag === 'p' && isNonPhrasingTag(tagName)) {
parseEndTag(lastTag);
}
if (canBeLeftOpenTag$$1(tagName) && lastTag === tagName) {
parseEndTag(tagName);
}
}
var unary = isUnaryTag$$1(tagName) || !!unarySlash;
var l = match.attrs.length;
var attrs = new Array(l);
for (var i = 0; i < l; i++) {
var args = match.attrs[i];
var value = args[3] || args[4] || args[5] || '';
var shouldDecodeNewlines = tagName === 'a' && args[1] === 'href'
? options.shouldDecodeNewlinesForHref
: options.shouldDecodeNewlines;
attrs[i] = {
name: args[1],
value: decodeAttr(value, shouldDecodeNewlines)
};
}
if (!unary) {
stack.push({ tag: tagName, lowerCasedTag: tagName.toLowerCase(), attrs: attrs, start: match.start, end: match.end });
lastTag = tagName;
}
if (options.start) {
options.start(tagName, attrs, unary, match.start, match.end);
}
}
function parseEndTag (tagName, start, end) {
var pos, lowerCasedTagName;
if (start == null) { start = index; }
if (end == null) { end = index; }
// Find the closest opened tag of the same type
if (tagName) {
lowerCasedTagName = tagName.toLowerCase();
for (pos = stack.length - 1; pos >= 0; pos--) {
if (stack[pos].lowerCasedTag === lowerCasedTagName) {
break
}
}
} else {
// If no tag name is provided, clean shop
pos = 0;
}
if (pos >= 0) {
// Close all the open elements, up the stack
for (var i = stack.length - 1; i >= pos; i--) {
if (options.end) {
options.end(stack[i].tag, start, end);
}
}
// Remove the open elements from the stack
stack.length = pos;
lastTag = pos && stack[pos - 1].tag;
} else if (lowerCasedTagName === 'br') {
if (options.start) {
options.start(tagName, [], true, start, end);
}
} else if (lowerCasedTagName === 'p') {
if (options.start) {
options.start(tagName, [], false, start, end);
}
if (options.end) {
options.end(tagName, start, end);
}
}
}
}
/* */
var onRE = /^@|^v-on:/;
var dirRE = /^v-|^@|^:|^#/;
var forAliasRE = /([\s\S]*?)\s+(?:in|of)\s+([\s\S]*)/;
var forIteratorRE = /,([^,\}\]]*)(?:,([^,\}\]]*))?$/;
var stripParensRE = /^\(|\)$/g;
var dynamicArgRE = /^\[.*\]$/;
var argRE = /:(.*)$/;
var bindRE = /^:|^\.|^v-bind:/;
var modifierRE = /\.[^.\]]+(?=[^\]]*$)/g;
var slotRE = /^v-slot(:|$)|^#/;
var lineBreakRE = /[\r\n]/;
var whitespaceRE$1 = /\s+/g;
var decodeHTMLCached = cached(he.decode);
var emptySlotScopeToken = "_empty_";
// configurable state
var warn$2;
var delimiters;
var transforms;
var preTransforms;
var postTransforms;
var platformIsPreTag;
var platformMustUseProp;
var platformGetTagNamespace;
function createASTElement (
tag,
attrs,
parent
) {
return {
type: 1,
tag: tag,
attrsList: attrs,
attrsMap: makeAttrsMap(attrs),
rawAttrsMap: {},
parent: parent,
children: []
}
}
/**
* Convert HTML string to AST.
*/
function parse (
template,
options
) {
warn$2 = options.warn || baseWarn;
platformIsPreTag = options.isPreTag || no;
platformMustUseProp = options.mustUseProp || no;
platformGetTagNamespace = options.getTagNamespace || no;
var isReservedTag = options.isReservedTag || no;
transforms = pluckModuleFunction(options.modules, 'transformNode');
preTransforms = pluckModuleFunction(options.modules, 'preTransformNode');
postTransforms = pluckModuleFunction(options.modules, 'postTransformNode');
delimiters = options.delimiters;
var stack = [];
var preserveWhitespace = options.preserveWhitespace !== false;
var whitespaceOption = options.whitespace;
var root;
var currentParent;
var inVPre = false;
var inPre = false;
function closeElement (element) {
trimEndingWhitespace(element);
if (!inVPre && !element.processed) {
element = processElement(element, options);
}
// tree management
if (!stack.length && element !== root) {
// allow root elements with v-if, v-else-if and v-else
if (root.if && (element.elseif || element.else)) {
addIfCondition(root, {
exp: element.elseif,
block: element
});
}
}
if (currentParent && !element.forbidden) {
if (element.elseif || element.else) {
processIfConditions(element, currentParent);
} else {
if (element.slotScope) {
// scoped slot
// keep it in the children list so that v-else(-if) conditions can
// find it as the prev node.
var name = element.slotTarget || '"default"'
;(currentParent.scopedSlots || (currentParent.scopedSlots = {}))[name] = element;
}
currentParent.children.push(element);
element.parent = currentParent;
}
}
// final children cleanup
// filter out scoped slots
element.children = element.children.filter(function (c) { return !(c).slotScope; });
// remove trailing whitespace node again
trimEndingWhitespace(element);
// check pre state
if (element.pre) {
inVPre = false;
}
if (platformIsPreTag(element.tag)) {
inPre = false;
}
// apply post-transforms
for (var i = 0; i < postTransforms.length; i++) {
postTransforms[i](element, options);
}
}
function trimEndingWhitespace (el) {
// remove trailing whitespace node
if (!inPre) {
var lastNode;
while (
(lastNode = el.children[el.children.length - 1]) &&
lastNode.type === 3 &&
lastNode.text === ' '
) {
el.children.pop();
}
}
}
parseHTML(template, {
warn: warn$2,
expectHTML: options.expectHTML,
isUnaryTag: options.isUnaryTag,
canBeLeftOpenTag: options.canBeLeftOpenTag,
shouldDecodeNewlines: options.shouldDecodeNewlines,
shouldDecodeNewlinesForHref: options.shouldDecodeNewlinesForHref,
shouldKeepComment: options.comments,
outputSourceRange: options.outputSourceRange,
start: function start (tag, attrs, unary, start$1, end) {
// check namespace.
// inherit parent ns if there is one
var ns = (currentParent && currentParent.ns) || platformGetTagNamespace(tag);
// handle IE svg bug
/* istanbul ignore if */
if (isIE && ns === 'svg') {
attrs = guardIESVGBug(attrs);
}
var element = createASTElement(tag, attrs, currentParent);
if (ns) {
element.ns = ns;
}
if (isForbiddenTag(element) && !isServerRendering()) {
element.forbidden = true;
}
// apply pre-transforms
for (var i = 0; i < preTransforms.length; i++) {
element = preTransforms[i](element, options) || element;
}
if (!inVPre) {
processPre(element);
if (element.pre) {
inVPre = true;
}
}
if (platformIsPreTag(element.tag)) {
inPre = true;
}
if (inVPre) {
processRawAttrs(element);
} else if (!element.processed) {
// structural directives
processFor(element);
processIf(element);
processOnce(element);
}
if (!root) {
root = element;
}
if (!unary) {
currentParent = element;
stack.push(element);
} else {
closeElement(element);
}
},
end: function end (tag, start, end$1) {
var element = stack[stack.length - 1];
// pop stack
stack.length -= 1;
currentParent = stack[stack.length - 1];
closeElement(element);
},
chars: function chars (text, start, end) {
if (!currentParent) {
return
}
// IE textarea placeholder bug
/* istanbul ignore if */
if (isIE &&
currentParent.tag === 'textarea' &&
currentParent.attrsMap.placeholder === text
) {
return
}
var children = currentParent.children;
if (inPre || text.trim()) {
text = isTextTag(currentParent) ? text : decodeHTMLCached(text);
} else if (!children.length) {
// remove the whitespace-only node right after an opening tag
text = '';
} else if (whitespaceOption) {
if (whitespaceOption === 'condense') {
// in condense mode, remove the whitespace node if it contains
// line break, otherwise condense to a single space
text = lineBreakRE.test(text) ? '' : ' ';
} else {
text = ' ';
}
} else {
text = preserveWhitespace ? ' ' : '';
}
if (text) {
if (!inPre && whitespaceOption === 'condense') {
// condense consecutive whitespaces into single space
text = text.replace(whitespaceRE$1, ' ');
}
var res;
var child;
if (!inVPre && text !== ' ' && (res = parseText(text, delimiters))) {
child = {
type: 2,
expression: res.expression,
tokens: res.tokens,
text: text
};
} else if (text !== ' ' || !children.length || children[children.length - 1].text !== ' ') {
child = {
type: 3,
text: text
};
}
if (child) {
children.push(child);
}
}
},
comment: function comment (text, start, end) {
// adding anything as a sibling to the root node is forbidden
// comments should still be allowed, but ignored
if (currentParent) {
var child = {
type: 3,
text: text,
isComment: true
};
currentParent.children.push(child);
}
}
});
return root
}
function processPre (el) {
if (getAndRemoveAttr(el, 'v-pre') != null) {
el.pre = true;
}
}
function processRawAttrs (el) {
var list = el.attrsList;
var len = list.length;
if (len) {
var attrs = el.attrs = new Array(len);
for (var i = 0; i < len; i++) {
attrs[i] = {
name: list[i].name,
value: JSON.stringify(list[i].value)
};
if (list[i].start != null) {
attrs[i].start = list[i].start;
attrs[i].end = list[i].end;
}
}
} else if (!el.pre) {
// non root node in pre blocks with no attributes
el.plain = true;
}
}
function processElement (
element,
options
) {
processKey(element);
// determine whether this is a plain element after
// removing structural attributes
element.plain = (
!element.key &&
!element.scopedSlots &&
!element.attrsList.length
);
processRef(element);
processSlotContent(element);
processSlotOutlet(element);
processComponent(element);
for (var i = 0; i < transforms.length; i++) {
element = transforms[i](element, options) || element;
}
processAttrs(element);
return element
}
function processKey (el) {
var exp = getBindingAttr(el, 'key');
if (exp) {
el.key = exp;
}
}
function processRef (el) {
var ref = getBindingAttr(el, 'ref');
if (ref) {
el.ref = ref;
el.refInFor = checkInFor(el);
}
}
function processFor (el) {
var exp;
if ((exp = getAndRemoveAttr(el, 'v-for'))) {
var res = parseFor(exp);
if (res) {
extend(el, res);
}
}
}
function parseFor (exp) {
var inMatch = exp.match(forAliasRE);
if (!inMatch) { return }
var res = {};
res.for = inMatch[2].trim();
var alias = inMatch[1].trim().replace(stripParensRE, '');
var iteratorMatch = alias.match(forIteratorRE);
if (iteratorMatch) {
res.alias = alias.replace(forIteratorRE, '').trim();
res.iterator1 = iteratorMatch[1].trim();
if (iteratorMatch[2]) {
res.iterator2 = iteratorMatch[2].trim();
}
} else {
res.alias = alias;
}
return res
}
function processIf (el) {
var exp = getAndRemoveAttr(el, 'v-if');
if (exp) {
el.if = exp;
addIfCondition(el, {
exp: exp,
block: el
});
} else {
if (getAndRemoveAttr(el, 'v-else') != null) {
el.else = true;
}
var elseif = getAndRemoveAttr(el, 'v-else-if');
if (elseif) {
el.elseif = elseif;
}
}
}
function processIfConditions (el, parent) {
var prev = findPrevElement(parent.children);
if (prev && prev.if) {
addIfCondition(prev, {
exp: el.elseif,
block: el
});
}
}
function findPrevElement (children) {
var i = children.length;
while (i--) {
if (children[i].type === 1) {
return children[i]
} else {
children.pop();
}
}
}
function addIfCondition (el, condition) {
if (!el.ifConditions) {
el.ifConditions = [];
}
el.ifConditions.push(condition);
}
function processOnce (el) {
var once$$1 = getAndRemoveAttr(el, 'v-once');
if (once$$1 != null) {
el.once = true;
}
}
// handle content being passed to a component as slot,
// e.g. <template slot="xxx">, <div slot-scope="xxx">
function processSlotContent (el) {
var slotScope;
if (el.tag === 'template') {
slotScope = getAndRemoveAttr(el, 'scope');
el.slotScope = slotScope || getAndRemoveAttr(el, 'slot-scope');
} else if ((slotScope = getAndRemoveAttr(el, 'slot-scope'))) {
el.slotScope = slotScope;
}
// slot="xxx"
var slotTarget = getBindingAttr(el, 'slot');
if (slotTarget) {
el.slotTarget = slotTarget === '""' ? '"default"' : slotTarget;
el.slotTargetDynamic = !!(el.attrsMap[':slot'] || el.attrsMap['v-bind:slot']);
// preserve slot as an attribute for native shadow DOM compat
// only for non-scoped slots.
if (el.tag !== 'template' && !el.slotScope) {
addAttr(el, 'slot', slotTarget, getRawBindingAttr(el, 'slot'));
}
}
// 2.6 v-slot syntax
{
if (el.tag === 'template') {
// v-slot on <template>
var slotBinding = getAndRemoveAttrByRegex(el, slotRE);
if (slotBinding) {
var ref = getSlotName(slotBinding);
var name = ref.name;
var dynamic = ref.dynamic;
el.slotTarget = name;
el.slotTargetDynamic = dynamic;
el.slotScope = slotBinding.value || emptySlotScopeToken; // force it into a scoped slot for perf
}
} else {
// v-slot on component, denotes default slot
var slotBinding$1 = getAndRemoveAttrByRegex(el, slotRE);
if (slotBinding$1) {
// add the component's children to its default slot
var slots = el.scopedSlots || (el.scopedSlots = {});
var ref$1 = getSlotName(slotBinding$1);
var name$1 = ref$1.name;
var dynamic$1 = ref$1.dynamic;
var slotContainer = slots[name$1] = createASTElement('template', [], el);
slotContainer.slotTarget = name$1;
slotContainer.slotTargetDynamic = dynamic$1;
slotContainer.children = el.children.filter(function (c) {
if (!c.slotScope) {
c.parent = slotContainer;
return true
}
});
slotContainer.slotScope = slotBinding$1.value || emptySlotScopeToken;
// remove children as they are returned from scopedSlots now
el.children = [];
// mark el non-plain so data gets generated
el.plain = false;
}
}
}
}
function getSlotName (binding) {
var name = binding.name.replace(slotRE, '');
if (!name) {
if (binding.name[0] !== '#') {
name = 'default';
}
}
return dynamicArgRE.test(name)
// dynamic [name]
? { name: name.slice(1, -1), dynamic: true }
// static name
: { name: ("\"" + name + "\""), dynamic: false }
}
// handle <slot/> outlets
function processSlotOutlet (el) {
if (el.tag === 'slot') {
el.slotName = getBindingAttr(el, 'name');
}
}
function processComponent (el) {
var binding;
if ((binding = getBindingAttr(el, 'is'))) {
el.component = binding;
}
if (getAndRemoveAttr(el, 'inline-template') != null) {
el.inlineTemplate = true;
}
}
function processAttrs (el) {
var list = el.attrsList;
var i, l, name, rawName, value, modifiers, syncGen, isDynamic;
for (i = 0, l = list.length; i < l; i++) {
name = rawName = list[i].name;
value = list[i].value;
if (dirRE.test(name)) {
// mark element as dynamic
el.hasBindings = true;
// modifiers
modifiers = parseModifiers(name.replace(dirRE, ''));
// support .foo shorthand syntax for the .prop modifier
if (modifiers) {
name = name.replace(modifierRE, '');
}
if (bindRE.test(name)) { // v-bind
name = name.replace(bindRE, '');
value = parseFilters(value);
isDynamic = dynamicArgRE.test(name);
if (isDynamic) {
name = name.slice(1, -1);
}
if (modifiers) {
if (modifiers.prop && !isDynamic) {
name = camelize(name);
if (name === 'innerHtml') { name = 'innerHTML'; }
}
if (modifiers.camel && !isDynamic) {
name = camelize(name);
}
if (modifiers.sync) {
syncGen = genAssignmentCode(value, "$event");
if (!isDynamic) {
addHandler(
el,
("update:" + (camelize(name))),
syncGen,
null,
false,
warn$2,
list[i]
);
if (hyphenate(name) !== camelize(name)) {
addHandler(
el,
("update:" + (hyphenate(name))),
syncGen,
null,
false,
warn$2,
list[i]
);
}
} else {
// handler w/ dynamic event name
addHandler(
el,
("\"update:\"+(" + name + ")"),
syncGen,
null,
false,
warn$2,
list[i],
true // dynamic
);
}
}
}
if ((modifiers && modifiers.prop) || (
!el.component && platformMustUseProp(el.tag, el.attrsMap.type, name)
)) {
addProp(el, name, value, list[i], isDynamic);
} else {
addAttr(el, name, value, list[i], isDynamic);
}
} else if (onRE.test(name)) { // v-on
name = name.replace(onRE, '');
isDynamic = dynamicArgRE.test(name);
if (isDynamic) {
name = name.slice(1, -1);
}
addHandler(el, name, value, modifiers, false, warn$2, list[i], isDynamic);
} else { // normal directives
name = name.replace(dirRE, '');
// parse arg
var argMatch = name.match(argRE);
var arg = argMatch && argMatch[1];
isDynamic = false;
if (arg) {
name = name.slice(0, -(arg.length + 1));
if (dynamicArgRE.test(arg)) {
arg = arg.slice(1, -1);
isDynamic = true;
}
}
addDirective(el, name, rawName, value, arg, isDynamic, modifiers, list[i]);
}
} else {
addAttr(el, name, JSON.stringify(value), list[i]);
// #6887 firefox doesn't update muted state if set via attribute
// even immediately after element creation
if (!el.component &&
name === 'muted' &&
platformMustUseProp(el.tag, el.attrsMap.type, name)) {
addProp(el, name, 'true', list[i]);
}
}
}
}
function checkInFor (el) {
var parent = el;
while (parent) {
if (parent.for !== undefined) {
return true
}
parent = parent.parent;
}
return false
}
function parseModifiers (name) {
var match = name.match(modifierRE);
if (match) {
var ret = {};
match.forEach(function (m) { ret[m.slice(1)] = true; });
return ret
}
}
function makeAttrsMap (attrs) {
var map = {};
for (var i = 0, l = attrs.length; i < l; i++) {
map[attrs[i].name] = attrs[i].value;
}
return map
}
// for script (e.g. type="x/template") or style, do not decode content
function isTextTag (el) {
return el.tag === 'script' || el.tag === 'style'
}
function isForbiddenTag (el) {
return (
el.tag === 'style' ||
(el.tag === 'script' && (
!el.attrsMap.type ||
el.attrsMap.type === 'text/javascript'
))
)
}
var ieNSBug = /^xmlns:NS\d+/;
var ieNSPrefix = /^NS\d+:/;
/* istanbul ignore next */
function guardIESVGBug (attrs) {
var res = [];
for (var i = 0; i < attrs.length; i++) {
var attr = attrs[i];
if (!ieNSBug.test(attr.name)) {
attr.name = attr.name.replace(ieNSPrefix, '');
res.push(attr);
}
}
return res
}
/* */
function preTransformNode (el, options) {
if (el.tag === 'input') {
var map = el.attrsMap;
if (!map['v-model']) {
return
}
var typeBinding;
if (map[':type'] || map['v-bind:type']) {
typeBinding = getBindingAttr(el, 'type');
}
if (!map.type && !typeBinding && map['v-bind']) {
typeBinding = "(" + (map['v-bind']) + ").type";
}
if (typeBinding) {
var ifCondition = getAndRemoveAttr(el, 'v-if', true);
var ifConditionExtra = ifCondition ? ("&&(" + ifCondition + ")") : "";
var hasElse = getAndRemoveAttr(el, 'v-else', true) != null;
var elseIfCondition = getAndRemoveAttr(el, 'v-else-if', true);
// 1. checkbox
var branch0 = cloneASTElement(el);
// process for on the main node
processFor(branch0);
addRawAttr(branch0, 'type', 'checkbox');
processElement(branch0, options);
branch0.processed = true; // prevent it from double-processed
branch0.if = "(" + typeBinding + ")==='checkbox'" + ifConditionExtra;
addIfCondition(branch0, {
exp: branch0.if,
block: branch0
});
// 2. add radio else-if condition
var branch1 = cloneASTElement(el);
getAndRemoveAttr(branch1, 'v-for', true);
addRawAttr(branch1, 'type', 'radio');
processElement(branch1, options);
addIfCondition(branch0, {
exp: "(" + typeBinding + ")==='radio'" + ifConditionExtra,
block: branch1
});
// 3. other
var branch2 = cloneASTElement(el);
getAndRemoveAttr(branch2, 'v-for', true);
addRawAttr(branch2, ':type', typeBinding);
processElement(branch2, options);
addIfCondition(branch0, {
exp: ifCondition,
block: branch2
});
if (hasElse) {
branch0.else = true;
} else if (elseIfCondition) {
branch0.elseif = elseIfCondition;
}
return branch0
}
}
}
function cloneASTElement (el) {
return createASTElement(el.tag, el.attrsList.slice(), el.parent)
}
var model$1 = {
preTransformNode: preTransformNode
};
var modules$1 = [
klass$1,
style$1,
model$1
];
/* */
function text (el, dir) {
if (dir.value) {
addProp(el, 'textContent', ("_s(" + (dir.value) + ")"), dir);
}
}
/* */
function html (el, dir) {
if (dir.value) {
addProp(el, 'innerHTML', ("_s(" + (dir.value) + ")"), dir);
}
}
var directives$1 = {
model: model,
text: text,
html: html
};
/* */
var baseOptions = {
expectHTML: true,
modules: modules$1,
directives: directives$1,
isPreTag: isPreTag,
isUnaryTag: isUnaryTag,
mustUseProp: mustUseProp,
canBeLeftOpenTag: canBeLeftOpenTag,
isReservedTag: isReservedTag,
getTagNamespace: getTagNamespace,
staticKeys: genStaticKeys(modules$1)
};
/* */
var isStaticKey;
var isPlatformReservedTag;
var genStaticKeysCached = cached(genStaticKeys$1);
/**
* Goal of the optimizer: walk the generated template AST tree
* and detect sub-trees that are purely static, i.e. parts of
* the DOM that never needs to change.
*
* Once we detect these sub-trees, we can:
*
* 1. Hoist them into constants, so that we no longer need to
* create fresh nodes for them on each re-render;
* 2. Completely skip them in the patching process.
*/
function optimize (root, options) {
if (!root) { return }
isStaticKey = genStaticKeysCached(options.staticKeys || '');
isPlatformReservedTag = options.isReservedTag || no;
// first pass: mark all non-static nodes.
markStatic$1(root);
// second pass: mark static roots.
markStaticRoots(root, false);
}
function genStaticKeys$1 (keys) {
return makeMap(
'type,tag,attrsList,attrsMap,plain,parent,children,attrs,start,end,rawAttrsMap' +
(keys ? ',' + keys : '')
)
}
function markStatic$1 (node) {
node.static = isStatic(node);
if (node.type === 1) {
// do not make component slot content static. this avoids
// 1. components not able to mutate slot nodes
// 2. static slot content fails for hot-reloading
if (
!isPlatformReservedTag(node.tag) &&
node.tag !== 'slot' &&
node.attrsMap['inline-template'] == null
) {
return
}
for (var i = 0, l = node.children.length; i < l; i++) {
var child = node.children[i];
markStatic$1(child);
if (!child.static) {
node.static = false;
}
}
if (node.ifConditions) {
for (var i$1 = 1, l$1 = node.ifConditions.length; i$1 < l$1; i$1++) {
var block = node.ifConditions[i$1].block;
markStatic$1(block);
if (!block.static) {
node.static = false;
}
}
}
}
}
function markStaticRoots (node, isInFor) {
if (node.type === 1) {
if (node.static || node.once) {
node.staticInFor = isInFor;
}
// For a node to qualify as a static root, it should have children that
// are not just static text. Otherwise the cost of hoisting out will
// outweigh the benefits and it's better off to just always render it fresh.
if (node.static && node.children.length && !(
node.children.length === 1 &&
node.children[0].type === 3
)) {
node.staticRoot = true;
return
} else {
node.staticRoot = false;
}
if (node.children) {
for (var i = 0, l = node.children.length; i < l; i++) {
markStaticRoots(node.children[i], isInFor || !!node.for);
}
}
if (node.ifConditions) {
for (var i$1 = 1, l$1 = node.ifConditions.length; i$1 < l$1; i$1++) {
markStaticRoots(node.ifConditions[i$1].block, isInFor);
}
}
}
}
function isStatic (node) {
if (node.type === 2) { // expression
return false
}
if (node.type === 3) { // text
return true
}
return !!(node.pre || (
!node.hasBindings && // no dynamic bindings
!node.if && !node.for && // not v-if or v-for or v-else
!isBuiltInTag(node.tag) && // not a built-in
isPlatformReservedTag(node.tag) && // not a component
!isDirectChildOfTemplateFor(node) &&
Object.keys(node).every(isStaticKey)
))
}
function isDirectChildOfTemplateFor (node) {
while (node.parent) {
node = node.parent;
if (node.tag !== 'template') {
return false
}
if (node.for) {
return true
}
}
return false
}
/* */
var fnExpRE = /^([\w$_]+|\([^)]*?\))\s*=>|^function(?:\s+[\w$]+)?\s*\(/;
var fnInvokeRE = /\([^)]*?\);*$/;
var simplePathRE = /^[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*|\['[^']*?']|\["[^"]*?"]|\[\d+]|\[[A-Za-z_$][\w$]*])*$/;
// KeyboardEvent.keyCode aliases
var keyCodes = {
esc: 27,
tab: 9,
enter: 13,
space: 32,
up: 38,
left: 37,
right: 39,
down: 40,
'delete': [8, 46]
};
// KeyboardEvent.key aliases
var keyNames = {
// #7880: IE11 and Edge use `Esc` for Escape key name.
esc: ['Esc', 'Escape'],
tab: 'Tab',
enter: 'Enter',
// #9112: IE11 uses `Spacebar` for Space key name.
space: [' ', 'Spacebar'],
// #7806: IE11 uses key names without `Arrow` prefix for arrow keys.
up: ['Up', 'ArrowUp'],
left: ['Left', 'ArrowLeft'],
right: ['Right', 'ArrowRight'],
down: ['Down', 'ArrowDown'],
// #9112: IE11 uses `Del` for Delete key name.
'delete': ['Backspace', 'Delete', 'Del']
};
// #4868: modifiers that prevent the execution of the listener
// need to explicitly return null so that we can determine whether to remove
// the listener for .once
var genGuard = function (condition) { return ("if(" + condition + ")return null;"); };
var modifierCode = {
stop: '$event.stopPropagation();',
prevent: '$event.preventDefault();',
self: genGuard("$event.target !== $event.currentTarget"),
ctrl: genGuard("!$event.ctrlKey"),
shift: genGuard("!$event.shiftKey"),
alt: genGuard("!$event.altKey"),
meta: genGuard("!$event.metaKey"),
left: genGuard("'button' in $event && $event.button !== 0"),
middle: genGuard("'button' in $event && $event.button !== 1"),
right: genGuard("'button' in $event && $event.button !== 2")
};
function genHandlers (
events,
isNative
) {
var prefix = isNative ? 'nativeOn:' : 'on:';
var staticHandlers = "";
var dynamicHandlers = "";
for (var name in events) {
var handlerCode = genHandler(events[name]);
if (events[name] && events[name].dynamic) {
dynamicHandlers += name + "," + handlerCode + ",";
} else {
staticHandlers += "\"" + name + "\":" + handlerCode + ",";
}
}
staticHandlers = "{" + (staticHandlers.slice(0, -1)) + "}";
if (dynamicHandlers) {
return prefix + "_d(" + staticHandlers + ",[" + (dynamicHandlers.slice(0, -1)) + "])"
} else {
return prefix + staticHandlers
}
}
function genHandler (handler) {
if (!handler) {
return 'function(){}'
}
if (Array.isArray(handler)) {
return ("[" + (handler.map(function (handler) { return genHandler(handler); }).join(',')) + "]")
}
var isMethodPath = simplePathRE.test(handler.value);
var isFunctionExpression = fnExpRE.test(handler.value);
var isFunctionInvocation = simplePathRE.test(handler.value.replace(fnInvokeRE, ''));
if (!handler.modifiers) {
if (isMethodPath || isFunctionExpression) {
return handler.value
}
return ("function($event){" + (isFunctionInvocation ? ("return " + (handler.value)) : handler.value) + "}") // inline statement
} else {
var code = '';
var genModifierCode = '';
var keys = [];
for (var key in handler.modifiers) {
if (modifierCode[key]) {
genModifierCode += modifierCode[key];
// left/right
if (keyCodes[key]) {
keys.push(key);
}
} else if (key === 'exact') {
var modifiers = (handler.modifiers);
genModifierCode += genGuard(
['ctrl', 'shift', 'alt', 'meta']
.filter(function (keyModifier) { return !modifiers[keyModifier]; })
.map(function (keyModifier) { return ("$event." + keyModifier + "Key"); })
.join('||')
);
} else {
keys.push(key);
}
}
if (keys.length) {
code += genKeyFilter(keys);
}
// Make sure modifiers like prevent and stop get executed after key filtering
if (genModifierCode) {
code += genModifierCode;
}
var handlerCode = isMethodPath
? ("return " + (handler.value) + "($event)")
: isFunctionExpression
? ("return (" + (handler.value) + ")($event)")
: isFunctionInvocation
? ("return " + (handler.value))
: handler.value;
return ("function($event){" + code + handlerCode + "}")
}
}
function genKeyFilter (keys) {
return (
// make sure the key filters only apply to KeyboardEvents
// #9441: can't use 'keyCode' in $event because Chrome autofill fires fake
// key events that do not have keyCode property...
"if(!$event.type.indexOf('key')&&" +
(keys.map(genFilterCode).join('&&')) + ")return null;"
)
}
function genFilterCode (key) {
var keyVal = parseInt(key, 10);
if (keyVal) {
return ("$event.keyCode!==" + keyVal)
}
var keyCode = keyCodes[key];
var keyName = keyNames[key];
return (
"_k($event.keyCode," +
(JSON.stringify(key)) + "," +
(JSON.stringify(keyCode)) + "," +
"$event.key," +
"" + (JSON.stringify(keyName)) +
")"
)
}
/* */
function on (el, dir) {
el.wrapListeners = function (code) { return ("_g(" + code + "," + (dir.value) + ")"); };
}
/* */
function bind$1 (el, dir) {
el.wrapData = function (code) {
return ("_b(" + code + ",'" + (el.tag) + "'," + (dir.value) + "," + (dir.modifiers && dir.modifiers.prop ? 'true' : 'false') + (dir.modifiers && dir.modifiers.sync ? ',true' : '') + ")")
};
}
/* */
var baseDirectives = {
on: on,
bind: bind$1,
cloak: noop
};
/* */
var CodegenState = function CodegenState (options) {
this.options = options;
this.warn = options.warn || baseWarn;
this.transforms = pluckModuleFunction(options.modules, 'transformCode');
this.dataGenFns = pluckModuleFunction(options.modules, 'genData');
this.directives = extend(extend({}, baseDirectives), options.directives);
var isReservedTag = options.isReservedTag || no;
this.maybeComponent = function (el) { return !!el.component || !isReservedTag(el.tag); };
this.onceId = 0;
this.staticRenderFns = [];
this.pre = false;
};
function generate (
ast,
options
) {
var state = new CodegenState(options);
var code = ast ? genElement(ast, state) : '_c("div")';
return {
render: ("with(this){return " + code + "}"),
staticRenderFns: state.staticRenderFns
}
}
function genElement (el, state) {
if (el.parent) {
el.pre = el.pre || el.parent.pre;
}
if (el.staticRoot && !el.staticProcessed) {
return genStatic(el, state)
} else if (el.once && !el.onceProcessed) {
return genOnce(el, state)
} else if (el.for && !el.forProcessed) {
return genFor(el, state)
} else if (el.if && !el.ifProcessed) {
return genIf(el, state)
} else if (el.tag === 'template' && !el.slotTarget && !state.pre) {
return genChildren(el, state) || 'void 0'
} else if (el.tag === 'slot') {
return genSlot(el, state)
} else {
// component or element
var code;
if (el.component) {
code = genComponent(el.component, el, state);
} else {
var data;
if (!el.plain || (el.pre && state.maybeComponent(el))) {
data = genData$2(el, state);
}
var children = el.inlineTemplate ? null : genChildren(el, state, true);
code = "_c('" + (el.tag) + "'" + (data ? ("," + data) : '') + (children ? ("," + children) : '') + ")";
}
// module transforms
for (var i = 0; i < state.transforms.length; i++) {
code = state.transforms[i](el, code);
}
return code
}
}
// hoist static sub-trees out
function genStatic (el, state) {
el.staticProcessed = true;
// Some elements (templates) need to behave differently inside of a v-pre
// node. All pre nodes are static roots, so we can use this as a location to
// wrap a state change and reset it upon exiting the pre node.
var originalPreState = state.pre;
if (el.pre) {
state.pre = el.pre;
}
state.staticRenderFns.push(("with(this){return " + (genElement(el, state)) + "}"));
state.pre = originalPreState;
return ("_m(" + (state.staticRenderFns.length - 1) + (el.staticInFor ? ',true' : '') + ")")
}
// v-once
function genOnce (el, state) {
el.onceProcessed = true;
if (el.if && !el.ifProcessed) {
return genIf(el, state)
} else if (el.staticInFor) {
var key = '';
var parent = el.parent;
while (parent) {
if (parent.for) {
key = parent.key;
break
}
parent = parent.parent;
}
if (!key) {
return genElement(el, state)
}
return ("_o(" + (genElement(el, state)) + "," + (state.onceId++) + "," + key + ")")
} else {
return genStatic(el, state)
}
}
function genIf (
el,
state,
altGen,
altEmpty
) {
el.ifProcessed = true; // avoid recursion
return genIfConditions(el.ifConditions.slice(), state, altGen, altEmpty)
}
function genIfConditions (
conditions,
state,
altGen,
altEmpty
) {
if (!conditions.length) {
return altEmpty || '_e()'
}
var condition = conditions.shift();
if (condition.exp) {
return ("(" + (condition.exp) + ")?" + (genTernaryExp(condition.block)) + ":" + (genIfConditions(conditions, state, altGen, altEmpty)))
} else {
return ("" + (genTernaryExp(condition.block)))
}
// v-if with v-once should generate code like (a)?_m(0):_m(1)
function genTernaryExp (el) {
return altGen
? altGen(el, state)
: el.once
? genOnce(el, state)
: genElement(el, state)
}
}
function genFor (
el,
state,
altGen,
altHelper
) {
var exp = el.for;
var alias = el.alias;
var iterator1 = el.iterator1 ? ("," + (el.iterator1)) : '';
var iterator2 = el.iterator2 ? ("," + (el.iterator2)) : '';
el.forProcessed = true; // avoid recursion
return (altHelper || '_l') + "((" + exp + ")," +
"function(" + alias + iterator1 + iterator2 + "){" +
"return " + ((altGen || genElement)(el, state)) +
'})'
}
function genData$2 (el, state) {
var data = '{';
// directives first.
// directives may mutate the el's other properties before they are generated.
var dirs = genDirectives(el, state);
if (dirs) { data += dirs + ','; }
// key
if (el.key) {
data += "key:" + (el.key) + ",";
}
// ref
if (el.ref) {
data += "ref:" + (el.ref) + ",";
}
if (el.refInFor) {
data += "refInFor:true,";
}
// pre
if (el.pre) {
data += "pre:true,";
}
// record original tag name for components using "is" attribute
if (el.component) {
data += "tag:\"" + (el.tag) + "\",";
}
// module data generation functions
for (var i = 0; i < state.dataGenFns.length; i++) {
data += state.dataGenFns[i](el);
}
// attributes
if (el.attrs) {
data += "attrs:" + (genProps(el.attrs)) + ",";
}
// DOM props
if (el.props) {
data += "domProps:" + (genProps(el.props)) + ",";
}
// event handlers
if (el.events) {
data += (genHandlers(el.events, false)) + ",";
}
if (el.nativeEvents) {
data += (genHandlers(el.nativeEvents, true)) + ",";
}
// slot target
// only for non-scoped slots
if (el.slotTarget && !el.slotScope) {
data += "slot:" + (el.slotTarget) + ",";
}
// scoped slots
if (el.scopedSlots) {
data += (genScopedSlots(el, el.scopedSlots, state)) + ",";
}
// component v-model
if (el.model) {
data += "model:{value:" + (el.model.value) + ",callback:" + (el.model.callback) + ",expression:" + (el.model.expression) + "},";
}
// inline-template
if (el.inlineTemplate) {
var inlineTemplate = genInlineTemplate(el, state);
if (inlineTemplate) {
data += inlineTemplate + ",";
}
}
data = data.replace(/,$/, '') + '}';
// v-bind dynamic argument wrap
// v-bind with dynamic arguments must be applied using the same v-bind object
// merge helper so that class/style/mustUseProp attrs are handled correctly.
if (el.dynamicAttrs) {
data = "_b(" + data + ",\"" + (el.tag) + "\"," + (genProps(el.dynamicAttrs)) + ")";
}
// v-bind data wrap
if (el.wrapData) {
data = el.wrapData(data);
}
// v-on data wrap
if (el.wrapListeners) {
data = el.wrapListeners(data);
}
return data
}
function genDirectives (el, state) {
var dirs = el.directives;
if (!dirs) { return }
var res = 'directives:[';
var hasRuntime = false;
var i, l, dir, needRuntime;
for (i = 0, l = dirs.length; i < l; i++) {
dir = dirs[i];
needRuntime = true;
var gen = state.directives[dir.name];
if (gen) {
// compile-time directive that manipulates AST.
// returns true if it also needs a runtime counterpart.
needRuntime = !!gen(el, dir, state.warn);
}
if (needRuntime) {
hasRuntime = true;
res += "{name:\"" + (dir.name) + "\",rawName:\"" + (dir.rawName) + "\"" + (dir.value ? (",value:(" + (dir.value) + "),expression:" + (JSON.stringify(dir.value))) : '') + (dir.arg ? (",arg:" + (dir.isDynamicArg ? dir.arg : ("\"" + (dir.arg) + "\""))) : '') + (dir.modifiers ? (",modifiers:" + (JSON.stringify(dir.modifiers))) : '') + "},";
}
}
if (hasRuntime) {
return res.slice(0, -1) + ']'
}
}
function genInlineTemplate (el, state) {
var ast = el.children[0];
if (ast && ast.type === 1) {
var inlineRenderFns = generate(ast, state.options);
return ("inlineTemplate:{render:function(){" + (inlineRenderFns.render) + "},staticRenderFns:[" + (inlineRenderFns.staticRenderFns.map(function (code) { return ("function(){" + code + "}"); }).join(',')) + "]}")
}
}
function genScopedSlots (
el,
slots,
state
) {
// by default scoped slots are considered "stable", this allows child
// components with only scoped slots to skip forced updates from parent.
// but in some cases we have to bail-out of this optimization
// for example if the slot contains dynamic names, has v-if or v-for on them...
var needsForceUpdate = el.for || Object.keys(slots).some(function (key) {
var slot = slots[key];
return (
slot.slotTargetDynamic ||
slot.if ||
slot.for ||
containsSlotChild(slot) // is passing down slot from parent which may be dynamic
)
});
// #9534: if a component with scoped slots is inside a conditional branch,
// it's possible for the same component to be reused but with different
// compiled slot content. To avoid that, we generate a unique key based on
// the generated code of all the slot contents.
var needsKey = !!el.if;
// OR when it is inside another scoped slot or v-for (the reactivity may be
// disconnected due to the intermediate scope variable)
// #9438, #9506
// TODO: this can be further optimized by properly analyzing in-scope bindings
// and skip force updating ones that do not actually use scope variables.
if (!needsForceUpdate) {
var parent = el.parent;
while (parent) {
if (
(parent.slotScope && parent.slotScope !== emptySlotScopeToken) ||
parent.for
) {
needsForceUpdate = true;
break
}
if (parent.if) {
needsKey = true;
}
parent = parent.parent;
}
}
var generatedSlots = Object.keys(slots)
.map(function (key) { return genScopedSlot(slots[key], state); })
.join(',');
return ("scopedSlots:_u([" + generatedSlots + "]" + (needsForceUpdate ? ",null,true" : "") + (!needsForceUpdate && needsKey ? (",null,false," + (hash(generatedSlots))) : "") + ")")
}
function hash(str) {
var hash = 5381;
var i = str.length;
while(i) {
hash = (hash * 33) ^ str.charCodeAt(--i);
}
return hash >>> 0
}
function containsSlotChild (el) {
if (el.type === 1) {
if (el.tag === 'slot') {
return true
}
return el.children.some(containsSlotChild)
}
return false
}
function genScopedSlot (
el,
state
) {
var isLegacySyntax = el.attrsMap['slot-scope'];
if (el.if && !el.ifProcessed && !isLegacySyntax) {
return genIf(el, state, genScopedSlot, "null")
}
if (el.for && !el.forProcessed) {
return genFor(el, state, genScopedSlot)
}
var slotScope = el.slotScope === emptySlotScopeToken
? ""
: String(el.slotScope);
var fn = "function(" + slotScope + "){" +
"return " + (el.tag === 'template'
? el.if && isLegacySyntax
? ("(" + (el.if) + ")?" + (genChildren(el, state) || 'undefined') + ":undefined")
: genChildren(el, state) || 'undefined'
: genElement(el, state)) + "}";
// reverse proxy v-slot without scope on this.$slots
var reverseProxy = slotScope ? "" : ",proxy:true";
return ("{key:" + (el.slotTarget || "\"default\"") + ",fn:" + fn + reverseProxy + "}")
}
function genChildren (
el,
state,
checkSkip,
altGenElement,
altGenNode
) {
var children = el.children;
if (children.length) {
var el$1 = children[0];
// optimize single v-for
if (children.length === 1 &&
el$1.for &&
el$1.tag !== 'template' &&
el$1.tag !== 'slot'
) {
var normalizationType = checkSkip
? state.maybeComponent(el$1) ? ",1" : ",0"
: "";
return ("" + ((altGenElement || genElement)(el$1, state)) + normalizationType)
}
var normalizationType$1 = checkSkip
? getNormalizationType(children, state.maybeComponent)
: 0;
var gen = altGenNode || genNode;
return ("[" + (children.map(function (c) { return gen(c, state); }).join(',')) + "]" + (normalizationType$1 ? ("," + normalizationType$1) : ''))
}
}
// determine the normalization needed for the children array.
// 0: no normalization needed
// 1: simple normalization needed (possible 1-level deep nested array)
// 2: full normalization needed
function getNormalizationType (
children,
maybeComponent
) {
var res = 0;
for (var i = 0; i < children.length; i++) {
var el = children[i];
if (el.type !== 1) {
continue
}
if (needsNormalization(el) ||
(el.ifConditions && el.ifConditions.some(function (c) { return needsNormalization(c.block); }))) {
res = 2;
break
}
if (maybeComponent(el) ||
(el.ifConditions && el.ifConditions.some(function (c) { return maybeComponent(c.block); }))) {
res = 1;
}
}
return res
}
function needsNormalization (el) {
return el.for !== undefined || el.tag === 'template' || el.tag === 'slot'
}
function genNode (node, state) {
if (node.type === 1) {
return genElement(node, state)
} else if (node.type === 3 && node.isComment) {
return genComment(node)
} else {
return genText(node)
}
}
function genText (text) {
return ("_v(" + (text.type === 2
? text.expression // no need for () because already wrapped in _s()
: transformSpecialNewlines(JSON.stringify(text.text))) + ")")
}
function genComment (comment) {
return ("_e(" + (JSON.stringify(comment.text)) + ")")
}
function genSlot (el, state) {
var slotName = el.slotName || '"default"';
var children = genChildren(el, state);
var res = "_t(" + slotName + (children ? ("," + children) : '');
var attrs = el.attrs || el.dynamicAttrs
? genProps((el.attrs || []).concat(el.dynamicAttrs || []).map(function (attr) { return ({
// slot props are camelized
name: camelize(attr.name),
value: attr.value,
dynamic: attr.dynamic
}); }))
: null;
var bind$$1 = el.attrsMap['v-bind'];
if ((attrs || bind$$1) && !children) {
res += ",null";
}
if (attrs) {
res += "," + attrs;
}
if (bind$$1) {
res += (attrs ? '' : ',null') + "," + bind$$1;
}
return res + ')'
}
// componentName is el.component, take it as argument to shun flow's pessimistic refinement
function genComponent (
componentName,
el,
state
) {
var children = el.inlineTemplate ? null : genChildren(el, state, true);
return ("_c(" + componentName + "," + (genData$2(el, state)) + (children ? ("," + children) : '') + ")")
}
function genProps (props) {
var staticProps = "";
var dynamicProps = "";
for (var i = 0; i < props.length; i++) {
var prop = props[i];
var value = transformSpecialNewlines(prop.value);
if (prop.dynamic) {
dynamicProps += (prop.name) + "," + value + ",";
} else {
staticProps += "\"" + (prop.name) + "\":" + value + ",";
}
}
staticProps = "{" + (staticProps.slice(0, -1)) + "}";
if (dynamicProps) {
return ("_d(" + staticProps + ",[" + (dynamicProps.slice(0, -1)) + "])")
} else {
return staticProps
}
}
// #3895, #4268
function transformSpecialNewlines (text) {
return text
.replace(/\u2028/g, '\\u2028')
.replace(/\u2029/g, '\\u2029')
}
/* */
// these keywords should not appear inside expressions, but operators like
// typeof, instanceof and in are allowed
var prohibitedKeywordRE = 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');
/* */
function createFunction (code, errors) {
try {
return new Function(code)
} catch (err) {
errors.push({ err: err, code: code });
return noop
}
}
function createCompileToFunctionFn (compile) {
var cache = Object.create(null);
return function compileToFunctions (
template,
options,
vm
) {
options = extend({}, options);
var warn$$1 = options.warn || warn;
delete options.warn;
// check cache
var key = options.delimiters
? String(options.delimiters) + template
: template;
if (cache[key]) {
return cache[key]
}
// compile
var compiled = compile(template, options);
// turn code into functions
var res = {};
var fnGenErrors = [];
res.render = createFunction(compiled.render, fnGenErrors);
res.staticRenderFns = compiled.staticRenderFns.map(function (code) {
return createFunction(code, fnGenErrors)
});
return (cache[key] = res)
}
}
/* */
function createCompilerCreator (baseCompile) {
return function createCompiler (baseOptions) {
function compile (
template,
options
) {
var finalOptions = Object.create(baseOptions);
var errors = [];
var tips = [];
var warn = function (msg, range, tip) {
(tip ? tips : errors).push(msg);
};
if (options) {
// merge custom modules
if (options.modules) {
finalOptions.modules =
(baseOptions.modules || []).concat(options.modules);
}
// merge custom directives
if (options.directives) {
finalOptions.directives = extend(
Object.create(baseOptions.directives || null),
options.directives
);
}
// copy other options
for (var key in options) {
if (key !== 'modules' && key !== 'directives') {
finalOptions[key] = options[key];
}
}
}
finalOptions.warn = warn;
var compiled = baseCompile(template.trim(), finalOptions);
compiled.errors = errors;
compiled.tips = tips;
return compiled
}
return {
compile: compile,
compileToFunctions: createCompileToFunctionFn(compile)
}
}
}
/* */
// `createCompilerCreator` allows creating compilers that use alternative
// parser/optimizer/codegen, e.g the SSR optimizing compiler.
// Here we just export a default compiler using the default parts.
var createCompiler = createCompilerCreator(function baseCompile (
template,
options
) {
var ast = parse(template.trim(), options);
if (options.optimize !== false) {
optimize(ast, options);
}
var code = generate(ast, options);
return {
ast: ast,
render: code.render,
staticRenderFns: code.staticRenderFns
}
});
/* */
var ref$1 = createCompiler(baseOptions);
var compileToFunctions = ref$1.compileToFunctions;
/* */
// check whether current browser encodes a char inside attribute values
var div;
function getShouldDecode (href) {
div = div || document.createElement('div');
div.innerHTML = href ? "<a href=\"\n\"/>" : "<div a=\"\n\"/>";
return div.innerHTML.indexOf('&#10;') > 0
}
// #3663: IE encodes newlines inside attribute values while other browsers don't
var shouldDecodeNewlines = inBrowser ? getShouldDecode(false) : false;
// #6828: chrome encodes content in a[href]
var shouldDecodeNewlinesForHref = inBrowser ? getShouldDecode(true) : false;
/* */
var idToTemplate = cached(function (id) {
var el = query(id);
return el && el.innerHTML
});
var mount = Vue.prototype.$mount;
Vue.prototype.$mount = function (
el,
hydrating
) {
el = el && query(el);
/* istanbul ignore if */
if (el === document.body || el === document.documentElement) {
return this
}
var options = this.$options;
// resolve template/el and convert to render function
if (!options.render) {
var template = options.template;
if (template) {
if (typeof template === 'string') {
if (template.charAt(0) === '#') {
template = idToTemplate(template);
}
} else if (template.nodeType) {
template = template.innerHTML;
} else {
return this
}
} else if (el) {
template = getOuterHTML(el);
}
if (template) {
var ref = compileToFunctions(template, {
outputSourceRange: "production" !== 'production',
shouldDecodeNewlines: shouldDecodeNewlines,
shouldDecodeNewlinesForHref: shouldDecodeNewlinesForHref,
delimiters: options.delimiters,
comments: options.comments
}, this);
var render = ref.render;
var staticRenderFns = ref.staticRenderFns;
options.render = render;
options.staticRenderFns = staticRenderFns;
}
}
return mount.call(this, el, hydrating)
};
/**
* Get outerHTML of elements, taking care
* of SVG elements in IE as well.
*/
function getOuterHTML (el) {
if (el.outerHTML) {
return el.outerHTML
} else {
var container = document.createElement('div');
container.appendChild(el.cloneNode(true));
return container.innerHTML
}
}
Vue.compile = compileToFunctions;
function styleInject(css, ref) {
if ( ref === void 0 ) ref = {};
var insertAt = ref.insertAt;
if (!css || typeof document === 'undefined') { return; }
var head = document.head || document.getElementsByTagName('head')[0];
var style = document.createElement('style');
style.type = 'text/css';
if (insertAt === 'top') {
if (head.firstChild) {
head.insertBefore(style, head.firstChild);
} else {
head.appendChild(style);
}
} else {
head.appendChild(style);
}
if (style.styleSheet) {
style.styleSheet.cssText = css;
} else {
style.appendChild(document.createTextNode(css));
}
}
var css_248z = "/* fallback */\n\n@font-face {\n font-family: 'Material Icons';\n\n font-style: normal;\n\n font-weight: 400;\n\n src: url('../../fonts/icons/MaterialIcons-Regular.eot'); /* For IE6-8 */\n\n src: url('../../fonts/icons/MaterialIcons-Regular.woff2') format('woff2'),\r\n\t\turl('../../fonts/icons/MaterialIcons-Regular.woff') format('woff'),\r\n\t\turl('../../fonts/icons/MaterialIcons-Regular.ttf') format('truetype');\n}\n\n.material-icons {\n font-family: 'Material Icons';\n font-weight: normal;\n font-style: normal;\n font-size: 24px;\n line-height: 1;\n letter-spacing: normal;\n text-transform: none;\n display: inline-block;\n white-space: nowrap;\n word-wrap: normal;\n direction: ltr;\n font-feature-settings: 'liga';\n -webkit-font-smoothing: antialiased;\n}\n\n.material-icons.explicit-icon {\n margin-right: 0.3125em;\n margin-left: -3px;\n color: hsl(240, 5%, 59%);\n}\n\n.material-icons.explicit-icon.explicit-icon--right {\n margin-right: 0px;\n margin-left: 0.3125em;\n}\n\n.material-icons.disabled {\n opacity: 0.5;\n cursor: default;\n}\n\n.material-icons.mirrored {\n transform: scaleX(-1);\n}\r\n";
styleInject(css_248z);
var css_248z$1 = "/* cyrillic-ext */\n\n@font-face {\n font-family: 'Open Sans';\n\n font-style: italic;\n\n font-weight: 300;\n\n font-display: swap;\n\n src: url('../../fonts/OpenSans/memnYaGs126MiZpBA-UFUKWyV9hmIqOjjg.woff2') format('woff2');\n\n unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;\n}\n\n/* cyrillic */\n\n@font-face {\n font-family: 'Open Sans';\n\n font-style: italic;\n\n font-weight: 300;\n\n font-display: swap;\n\n src: url('../../fonts/OpenSans/memnYaGs126MiZpBA-UFUKWyV9hvIqOjjg.woff2') format('woff2');\n\n unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\n}\n\n/* greek-ext */\n\n@font-face {\n font-family: 'Open Sans';\n\n font-style: italic;\n\n font-weight: 300;\n\n font-display: swap;\n\n src: url('../../fonts/OpenSans/memnYaGs126MiZpBA-UFUKWyV9hnIqOjjg.woff2') format('woff2');\n\n unicode-range: U+1F00-1FFF;\n}\n\n/* greek */\n\n@font-face {\n font-family: 'Open Sans';\n\n font-style: italic;\n\n font-weight: 300;\n\n font-display: swap;\n\n src: url('../../fonts/OpenSans/memnYaGs126MiZpBA-UFUKWyV9hoIqOjjg.woff2') format('woff2');\n\n unicode-range: U+0370-03FF;\n}\n\n/* vietnamese */\n\n@font-face {\n font-family: 'Open Sans';\n\n font-style: italic;\n\n font-weight: 300;\n\n font-display: swap;\n\n src: url('../../fonts/OpenSans/memnYaGs126MiZpBA-UFUKWyV9hkIqOjjg.woff2') format('woff2');\n\n unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB;\n}\n\n/* latin-ext */\n\n@font-face {\n font-family: 'Open Sans';\n\n font-style: italic;\n\n font-weight: 300;\n\n font-display: swap;\n\n src: url('../../fonts/OpenSans/memnYaGs126MiZpBA-UFUKWyV9hlIqOjjg.woff2') format('woff2');\n\n unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;\n}\n\n/* latin */\n\n@font-face {\n font-family: 'Open Sans';\n\n font-style: italic;\n\n font-weight: 300;\n\n font-display: swap;\n\n src: url('../../fonts/OpenSans/memnYaGs126MiZpBA-UFUKWyV9hrIqM.woff2') format('woff2');\n\n unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\n}\n\n/* cyrillic-ext */\n\n@font-face {\n font-family: 'Open Sans';\n\n font-style: italic;\n\n font-weight: 400;\n\n font-display: swap;\n\n src: url('../../fonts/OpenSans/mem6YaGs126MiZpBA-UFUK0Udc1UAw.woff2') format('woff2');\n\n unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;\n}\n\n/* cyrillic */\n\n@font-face {\n font-family: 'Open Sans';\n\n font-style: italic;\n\n font-weight: 400;\n\n font-display: swap;\n\n src: url('../../fonts/OpenSans/mem6YaGs126MiZpBA-UFUK0ddc1UAw.woff2') format('woff2');\n\n unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\n}\n\n/* greek-ext */\n\n@font-face {\n font-family: 'Open Sans';\n\n font-style: italic;\n\n font-weight: 400;\n\n font-display: swap;\n\n src: url('../../fonts/OpenSans/mem6YaGs126MiZpBA-UFUK0Vdc1UAw.woff2') format('woff2');\n\n unicode-range: U+1F00-1FFF;\n}\n\n/* greek */\n\n@font-face {\n font-family: 'Open Sans';\n\n font-style: italic;\n\n font-weight: 400;\n\n font-display: swap;\n\n src: url('../../fonts/OpenSans/mem6YaGs126MiZpBA-UFUK0adc1UAw.woff2') format('woff2');\n\n unicode-range: U+0370-03FF;\n}\n\n/* vietnamese */\n\n@font-face {\n font-family: 'Open Sans';\n\n font-style: italic;\n\n font-weight: 400;\n\n font-display: swap;\n\n src: url('../../fonts/OpenSans/mem6YaGs126MiZpBA-UFUK0Wdc1UAw.woff2') format('woff2');\n\n unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB;\n}\n\n/* latin-ext */\n\n@font-face {\n font-family: 'Open Sans';\n\n font-style: italic;\n\n font-weight: 400;\n\n font-display: swap;\n\n src: url('../../fonts/OpenSans/mem6YaGs126MiZpBA-UFUK0Xdc1UAw.woff2') format('woff2');\n\n unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;\n}\n\n/* latin */\n\n@font-face {\n font-family: 'Open Sans';\n\n font-style: italic;\n\n font-weight: 400;\n\n font-display: swap;\n\n src: url('../../fonts/OpenSans/mem6YaGs126MiZpBA-UFUK0Zdc0.woff2') format('woff2');\n\n unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\n}\n\n/* cyrillic-ext */\n\n@font-face {\n font-family: 'Open Sans';\n\n font-style: italic;\n\n font-weight: 600;\n\n font-display: swap;\n\n src: url('../../fonts/OpenSans/memnYaGs126MiZpBA-UFUKXGUdhmIqOjjg.woff2') format('woff2');\n\n unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;\n}\n\n/* cyrillic */\n\n@font-face {\n font-family: 'Open Sans';\n\n font-style: italic;\n\n font-weight: 600;\n\n font-display: swap;\n\n src: url('../../fonts/OpenSans/memnYaGs126MiZpBA-UFUKXGUdhvIqOjjg.woff2') format('woff2');\n\n unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\n}\n\n/* greek-ext */\n\n@font-face {\n font-family: 'Open Sans';\n\n font-style: italic;\n\n font-weight: 600;\n\n font-display: swap;\n\n src: url('../../fonts/OpenSans/memnYaGs126MiZpBA-UFUKXGUdhnIqOjjg.woff2') format('woff2');\n\n unicode-range: U+1F00-1FFF;\n}\n\n/* greek */\n\n@font-face {\n font-family: 'Open Sans';\n\n font-style: italic;\n\n font-weight: 600;\n\n font-display: swap;\n\n src: url('../../fonts/OpenSans/memnYaGs126MiZpBA-UFUKXGUdhoIqOjjg.woff2') format('woff2');\n\n unicode-range: U+0370-03FF;\n}\n\n/* vietnamese */\n\n@font-face {\n font-family: 'Open Sans';\n\n font-style: italic;\n\n font-weight: 600;\n\n font-display: swap;\n\n src: url('../../fonts/OpenSans/memnYaGs126MiZpBA-UFUKXGUdhkIqOjjg.woff2') format('woff2');\n\n unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB;\n}\n\n/* latin-ext */\n\n@font-face {\n font-family: 'Open Sans';\n\n font-style: italic;\n\n font-weight: 600;\n\n font-display: swap;\n\n src: url('../../fonts/OpenSans/memnYaGs126MiZpBA-UFUKXGUdhlIqOjjg.woff2') format('woff2');\n\n unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;\n}\n\n/* latin */\n\n@font-face {\n font-family: 'Open Sans';\n\n font-style: italic;\n\n font-weight: 600;\n\n font-display: swap;\n\n src: url('../../fonts/OpenSans/memnYaGs126MiZpBA-UFUKXGUdhrIqM.woff2') format('woff2');\n\n unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\n}\n\n/* cyrillic-ext */\n\n@font-face {\n font-family: 'Open Sans';\n\n font-style: italic;\n\n font-weight: 700;\n\n font-display: swap;\n\n src: url('../../fonts/OpenSans/memnYaGs126MiZpBA-UFUKWiUNhmIqOjjg.woff2') format('woff2');\n\n unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;\n}\n\n/* cyrillic */\n\n@font-face {\n font-family: 'Open Sans';\n\n font-style: italic;\n\n font-weight: 700;\n\n font-display: swap;\n\n src: url('../../fonts/OpenSans/memnYaGs126MiZpBA-UFUKWiUNhvIqOjjg.woff2') format('woff2');\n\n unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\n}\n\n/* greek-ext */\n\n@font-face {\n font-family: 'Open Sans';\n\n font-style: italic;\n\n font-weight: 700;\n\n font-display: swap;\n\n src: url('../../fonts/OpenSans/memnYaGs126MiZpBA-UFUKWiUNhnIqOjjg.woff2') format('woff2');\n\n unicode-range: U+1F00-1FFF;\n}\n\n/* greek */\n\n@font-face {\n font-family: 'Open Sans';\n\n font-style: italic;\n\n font-weight: 700;\n\n font-display: swap;\n\n src: url('../../fonts/OpenSans/memnYaGs126MiZpBA-UFUKWiUNhoIqOjjg.woff2') format('woff2');\n\n unicode-range: U+0370-03FF;\n}\n\n/* vietnamese */\n\n@font-face {\n font-family: 'Open Sans';\n\n font-style: italic;\n\n font-weight: 700;\n\n font-display: swap;\n\n src: url('../../fonts/OpenSans/memnYaGs126MiZpBA-UFUKWiUNhkIqOjjg.woff2') format('woff2');\n\n unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB;\n}\n\n/* latin-ext */\n\n@font-face {\n font-family: 'Open Sans';\n\n font-style: italic;\n\n font-weight: 700;\n\n font-display: swap;\n\n src: url('../../fonts/OpenSans/memnYaGs126MiZpBA-UFUKWiUNhlIqOjjg.woff2') format('woff2');\n\n unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;\n}\n\n/* latin */\n\n@font-face {\n font-family: 'Open Sans';\n\n font-style: italic;\n\n font-weight: 700;\n\n font-display: swap;\n\n src: url('../../fonts/OpenSans/memnYaGs126MiZpBA-UFUKWiUNhrIqM.woff2') format('woff2');\n\n unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\n}\n\n/* cyrillic-ext */\n\n@font-face {\n font-family: 'Open Sans';\n\n font-style: italic;\n\n font-weight: 800;\n\n font-display: swap;\n\n src: url('../../fonts/OpenSans/memnYaGs126MiZpBA-UFUKW-U9hmIqOjjg.woff2') format('woff2');\n\n unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;\n}\n\n/* cyrillic */\n\n@font-face {\n font-family: 'Open Sans';\n\n font-style: italic;\n\n font-weight: 800;\n\n font-display: swap;\n\n src: url('../../fonts/OpenSans/memnYaGs126MiZpBA-UFUKW-U9hvIqOjjg.woff2') format('woff2');\n\n unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\n}\n\n/* greek-ext */\n\n@font-face {\n font-family: 'Open Sans';\n\n font-style: italic;\n\n font-weight: 800;\n\n font-display: swap;\n\n src: url('../../fonts/OpenSans/memnYaGs126MiZpBA-UFUKW-U9hnIqOjjg.woff2') format('woff2');\n\n unicode-range: U+1F00-1FFF;\n}\n\n/* greek */\n\n@font-face {\n font-family: 'Open Sans';\n\n font-style: italic;\n\n font-weight: 800;\n\n font-display: swap;\n\n src: url('../../fonts/OpenSans/memnYaGs126MiZpBA-UFUKW-U9hoIqOjjg.woff2') format('woff2');\n\n unicode-range: U+0370-03FF;\n}\n\n/* vietnamese */\n\n@font-face {\n font-family: 'Open Sans';\n\n font-style: italic;\n\n font-weight: 800;\n\n font-display: swap;\n\n src: url('../../fonts/OpenSans/memnYaGs126MiZpBA-UFUKW-U9hkIqOjjg.woff2') format('woff2');\n\n unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB;\n}\n\n/* latin-ext */\n\n@font-face {\n font-family: 'Open Sans';\n\n font-style: italic;\n\n font-weight: 800;\n\n font-display: swap;\n\n src: url('../../fonts/OpenSans/memnYaGs126MiZpBA-UFUKW-U9hlIqOjjg.woff2') format('woff2');\n\n unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;\n}\n\n/* latin */\n\n@font-face {\n font-family: 'Open Sans';\n\n font-style: italic;\n\n font-weight: 800;\n\n font-display: swap;\n\n src: url('../../fonts/OpenSans/memnYaGs126MiZpBA-UFUKW-U9hrIqM.woff2') format('woff2');\n\n unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\n}\n\n/* cyrillic-ext */\n\n@font-face {\n font-family: 'Open Sans';\n\n font-style: normal;\n\n font-weight: 300;\n\n font-display: swap;\n\n src: url('../../fonts/OpenSans/mem5YaGs126MiZpBA-UN_r8OX-hpOqc.woff2') format('woff2');\n\n unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;\n}\n\n/* cyrillic */\n\n@font-face {\n font-family: 'Open Sans';\n\n font-style: normal;\n\n font-weight: 300;\n\n font-display: swap;\n\n src: url('../../fonts/OpenSans/mem5YaGs126MiZpBA-UN_r8OVuhpOqc.woff2') format('woff2');\n\n unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\n}\n\n/* greek-ext */\n\n@font-face {\n font-family: 'Open Sans';\n\n font-style: normal;\n\n font-weight: 300;\n\n font-display: swap;\n\n src: url('../../fonts/OpenSans/mem5YaGs126MiZpBA-UN_r8OXuhpOqc.woff2') format('woff2');\n\n unicode-range: U+1F00-1FFF;\n}\n\n/* greek */\n\n@font-face {\n font-family: 'Open Sans';\n\n font-style: normal;\n\n font-weight: 300;\n\n font-display: swap;\n\n src: url('../../fonts/OpenSans/mem5YaGs126MiZpBA-UN_r8OUehpOqc.woff2') format('woff2');\n\n unicode-range: U+0370-03FF;\n}\n\n/* vietnamese */\n\n@font-face {\n font-family: 'Open Sans';\n\n font-style: normal;\n\n font-weight: 300;\n\n font-display: swap;\n\n src: url('../../fonts/OpenSans/mem5YaGs126MiZpBA-UN_r8OXehpOqc.woff2') format('woff2');\n\n unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB;\n}\n\n/* latin-ext */\n\n@font-face {\n font-family: 'Open Sans';\n\n font-style: normal;\n\n font-weight: 300;\n\n font-display: swap;\n\n src: url('../../fonts/OpenSans/mem5YaGs126MiZpBA-UN_r8OXOhpOqc.woff2') format('woff2');\n\n unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;\n}\n\n/* latin */\n\n@font-face {\n font-family: 'Open Sans';\n\n font-style: normal;\n\n font-weight: 300;\n\n font-display: swap;\n\n src: url('../../fonts/OpenSans/mem5YaGs126MiZpBA-UN_r8OUuhp.woff2') format('woff2');\n\n unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\n}\n\n/* cyrillic-ext */\n\n@font-face {\n font-family: 'Open Sans';\n\n font-style: normal;\n\n font-weight: 400;\n\n font-display: swap;\n\n src: url('../../fonts/OpenSans/mem8YaGs126MiZpBA-UFWJ0bbck.woff2') format('woff2');\n\n unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;\n}\n\n/* cyrillic */\n\n@font-face {\n font-family: 'Open Sans';\n\n font-style: normal;\n\n font-weight: 400;\n\n font-display: swap;\n\n src: url('../../fonts/OpenSans/mem8YaGs126MiZpBA-UFUZ0bbck.woff2') format('woff2');\n\n unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\n}\n\n/* greek-ext */\n\n@font-face {\n font-family: 'Open Sans';\n\n font-style: normal;\n\n font-weight: 400;\n\n font-display: swap;\n\n src: url('../../fonts/OpenSans/mem8YaGs126MiZpBA-UFWZ0bbck.woff2') format('woff2');\n\n unicode-range: U+1F00-1FFF;\n}\n\n/* greek */\n\n@font-face {\n font-family: 'Open Sans';\n\n font-style: normal;\n\n font-weight: 400;\n\n font-display: swap;\n\n src: url('../../fonts/OpenSans/mem8YaGs126MiZpBA-UFVp0bbck.woff2') format('woff2');\n\n unicode-range: U+0370-03FF;\n}\n\n/* vietnamese */\n\n@font-face {\n font-family: 'Open Sans';\n\n font-style: normal;\n\n font-weight: 400;\n\n font-display: swap;\n\n src: url('../../fonts/OpenSans/mem8YaGs126MiZpBA-UFWp0bbck.woff2') format('woff2');\n\n unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB;\n}\n\n/* latin-ext */\n\n@font-face {\n font-family: 'Open Sans';\n\n font-style: normal;\n\n font-weight: 400;\n\n font-display: swap;\n\n src: url('../../fonts/OpenSans/mem8YaGs126MiZpBA-UFW50bbck.woff2') format('woff2');\n\n unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;\n}\n\n/* latin */\n\n@font-face {\n font-family: 'Open Sans';\n\n font-style: normal;\n\n font-weight: 400;\n\n font-display: swap;\n\n src: url('../../fonts/OpenSans/mem8YaGs126MiZpBA-UFVZ0b.woff2') format('woff2');\n\n unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\n}\n\n/* cyrillic-ext */\n\n@font-face {\n font-family: 'Open Sans';\n\n font-style: normal;\n\n font-weight: 600;\n\n font-display: swap;\n\n src: url('../../fonts/OpenSans/mem5YaGs126MiZpBA-UNirkOX-hpOqc.woff2') format('woff2');\n\n unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;\n}\n\n/* cyrillic */\n\n@font-face {\n font-family: 'Open Sans';\n\n font-style: normal;\n\n font-weight: 600;\n\n font-display: swap;\n\n src: url('../../fonts/OpenSans/mem5YaGs126MiZpBA-UNirkOVuhpOqc.woff2') format('woff2');\n\n unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\n}\n\n/* greek-ext */\n\n@font-face {\n font-family: 'Open Sans';\n\n font-style: normal;\n\n font-weight: 600;\n\n font-display: swap;\n\n src: url('../../fonts/OpenSans/mem5YaGs126MiZpBA-UNirkOXuhpOqc.woff2') format('woff2');\n\n unicode-range: U+1F00-1FFF;\n}\n\n/* greek */\n\n@font-face {\n font-family: 'Open Sans';\n\n font-style: normal;\n\n font-weight: 600;\n\n font-display: swap;\n\n src: url('../../fonts/OpenSans/mem5YaGs126MiZpBA-UNirkOUehpOqc.woff2') format('woff2');\n\n unicode-range: U+0370-03FF;\n}\n\n/* vietnamese */\n\n@font-face {\n font-family: 'Open Sans';\n\n font-style: normal;\n\n font-weight: 600;\n\n font-display: swap;\n\n src: url('../../fonts/OpenSans/mem5YaGs126MiZpBA-UNirkOXehpOqc.woff2') format('woff2');\n\n unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB;\n}\n\n/* latin-ext */\n\n@font-face {\n font-family: 'Open Sans';\n\n font-style: normal;\n\n font-weight: 600;\n\n font-display: swap;\n\n src: url('../../fonts/OpenSans/mem5YaGs126MiZpBA-UNirkOXOhpOqc.woff2') format('woff2');\n\n unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;\n}\n\n/* latin */\n\n@font-face {\n font-family: 'Open Sans';\n\n font-style: normal;\n\n font-weight: 600;\n\n font-display: swap;\n\n src: url('../../fonts/OpenSans/mem5YaGs126MiZpBA-UNirkOUuhp.woff2') format('woff2');\n\n unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\n}\n\n/* cyrillic-ext */\n\n@font-face {\n font-family: 'Open Sans';\n\n font-style: normal;\n\n font-weight: 700;\n\n font-display: swap;\n\n src: url('../../fonts/OpenSans/mem5YaGs126MiZpBA-UN7rgOX-hpOqc.woff2') format('woff2');\n\n unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;\n}\n\n/* cyrillic */\n\n@font-face {\n font-family: 'Open Sans';\n\n font-style: normal;\n\n font-weight: 700;\n\n font-display: swap;\n\n src: url('../../fonts/OpenSans/mem5YaGs126MiZpBA-UN7rgOVuhpOqc.woff2') format('woff2');\n\n unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\n}\n\n/* greek-ext */\n\n@font-face {\n font-family: 'Open Sans';\n\n font-style: normal;\n\n font-weight: 700;\n\n font-display: swap;\n\n src: url('../../fonts/OpenSans/mem5YaGs126MiZpBA-UN7rgOXuhpOqc.woff2') format('woff2');\n\n unicode-range: U+1F00-1FFF;\n}\n\n/* greek */\n\n@font-face {\n font-family: 'Open Sans';\n\n font-style: normal;\n\n font-weight: 700;\n\n font-display: swap;\n\n src: url('../../fonts/OpenSans/mem5YaGs126MiZpBA-UN7rgOUehpOqc.woff2') format('woff2');\n\n unicode-range: U+0370-03FF;\n}\n\n/* vietnamese */\n\n@font-face {\n font-family: 'Open Sans';\n\n font-style: normal;\n\n font-weight: 700;\n\n font-display: swap;\n\n src: url('../../fonts/OpenSans/mem5YaGs126MiZpBA-UN7rgOXehpOqc.woff2') format('woff2');\n\n unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB;\n}\n\n/* latin-ext */\n\n@font-face {\n font-family: 'Open Sans';\n\n font-style: normal;\n\n font-weight: 700;\n\n font-display: swap;\n\n src: url('../../fonts/OpenSans/mem5YaGs126MiZpBA-UN7rgOXOhpOqc.woff2') format('woff2');\n\n unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;\n}\n\n/* latin */\n\n@font-face {\n font-family: 'Open Sans';\n\n font-style: normal;\n\n font-weight: 700;\n\n font-display: swap;\n\n src: url('../../fonts/OpenSans/mem5YaGs126MiZpBA-UN7rgOUuhp.woff2') format('woff2');\n\n unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\n}\n\n/* cyrillic-ext */\n\n@font-face {\n font-family: 'Open Sans';\n\n font-style: normal;\n\n font-weight: 800;\n\n font-display: swap;\n\n src: url('../../fonts/OpenSans/mem5YaGs126MiZpBA-UN8rsOX-hpOqc.woff2') format('woff2');\n\n unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;\n}\n\n/* cyrillic */\n\n@font-face {\n font-family: 'Open Sans';\n\n font-style: normal;\n\n font-weight: 800;\n\n font-display: swap;\n\n src: url('../../fonts/OpenSans/mem5YaGs126MiZpBA-UN8rsOVuhpOqc.woff2') format('woff2');\n\n unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\n}\n\n/* greek-ext */\n\n@font-face {\n font-family: 'Open Sans';\n\n font-style: normal;\n\n font-weight: 800;\n\n font-display: swap;\n\n src: url('../../fonts/OpenSans/mem5YaGs126MiZpBA-UN8rsOXuhpOqc.woff2') format('woff2');\n\n unicode-range: U+1F00-1FFF;\n}\n\n/* greek */\n\n@font-face {\n font-family: 'Open Sans';\n\n font-style: normal;\n\n font-weight: 800;\n\n font-display: swap;\n\n src: url('../../fonts/OpenSans/mem5YaGs126MiZpBA-UN8rsOUehpOqc.woff2') format('woff2');\n\n unicode-range: U+0370-03FF;\n}\n\n/* vietnamese */\n\n@font-face {\n font-family: 'Open Sans';\n\n font-style: normal;\n\n font-weight: 800;\n\n font-display: swap;\n\n src: url('../../fonts/OpenSans/mem5YaGs126MiZpBA-UN8rsOXehpOqc.woff2') format('woff2');\n\n unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB;\n}\n\n/* latin-ext */\n\n@font-face {\n font-family: 'Open Sans';\n\n font-style: normal;\n\n font-weight: 800;\n\n font-display: swap;\n\n src: url('../../fonts/OpenSans/mem5YaGs126MiZpBA-UN8rsOXOhpOqc.woff2') format('woff2');\n\n unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;\n}\n\n/* latin */\n\n@font-face {\n font-family: 'Open Sans';\n\n font-style: normal;\n\n font-weight: 800;\n\n font-display: swap;\n\n src: url('../../fonts/OpenSans/mem5YaGs126MiZpBA-UN8rsOUuhp.woff2') format('woff2');\n\n unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\n}\r\n";
styleInject(css_248z$1);
var css_248z$2 = "a {\n color: dodgerblue;\n}\n\n.container {\n width: 100%;\n}\n\n@media (min-width: 640px) {\n .container {\n max-width: 640px;\n }\n}\n\n@media (min-width: 768px) {\n .container {\n max-width: 768px;\n }\n}\n\n@media (min-width: 1024px) {\n .container {\n max-width: 1024px;\n }\n}\n\n@media (min-width: 1280px) {\n .container {\n max-width: 1280px;\n }\n}\n\n.space-y-5 > :not(template) ~ :not(template) {\n --space-y-reverse: 0;\n margin-top: calc(1.25rem * calc(1 - var(--space-y-reverse)));\n margin-bottom: calc(1.25rem * var(--space-y-reverse));\n}\n\n.bg-black {\n --bg-opacity: 1;\n background-color: #000;\n background-color: rgba(0, 0, 0, var(--bg-opacity));\n}\n\n.bg-red-600 {\n --bg-opacity: 1;\n background-color: #e53e3e;\n background-color: rgba(229, 62, 62, var(--bg-opacity));\n}\n\n.bg-grayscale-200 {\n --bg-opacity: 1;\n background-color: hsl(0, 0%, 20%);\n background-color: rgba(51, 51, 51, var(--bg-opacity));\n}\n\n.bg-primary {\n --bg-opacity: 1;\n background-color: hsl(210, 100%, 52%);\n background-color: rgba(10.20000000000001, 132.59999999999988, 255, var(--bg-opacity));\n}\n\n.bg-background-main {\n background-color: var(--main-background);\n}\n\n.bg-panels-bg {\n background-color: var(--panels-background);\n}\n\n.hover\\:bg-primary:hover {\n --bg-opacity: 1;\n background-color: hsl(210, 100%, 52%);\n background-color: rgba(10.20000000000001, 132.59999999999988, 255, var(--bg-opacity));\n}\n\n.hover\\:bg-background-main:hover {\n background-color: var(--main-background);\n}\n\n.bg-opacity-50 {\n --bg-opacity: 0.5;\n}\n\n.border-transparent {\n border-color: transparent;\n}\n\n.border-grayscale-500 {\n --border-opacity: 1;\n border-color: hsl(0, 0%, 50%);\n border-color: rgba(127.5, 127.5, 127.5, var(--border-opacity));\n}\n\n.rounded {\n border-radius: 0.25rem;\n}\n\n.rounded-xl {\n border-radius: 0.75rem;\n}\n\n.rounded-full {\n border-radius: 9999px;\n}\n\n.border-solid {\n border-style: solid;\n}\n\n.border-0 {\n border-width: 0;\n}\n\n.border {\n border-width: 1px;\n}\n\n.border-t {\n border-top-width: 1px;\n}\n\n.first\\:border-t-0:first-child {\n border-top-width: 0;\n}\n\n.cursor-default {\n cursor: default;\n}\n\n.cursor-pointer {\n cursor: pointer;\n}\n\n.block {\n display: block;\n}\n\n.inline-block {\n display: inline-block;\n}\n\n.flex {\n display: flex;\n}\n\n.inline-flex {\n display: inline-flex;\n}\n\n.table {\n display: table;\n}\n\n.grid {\n display: grid;\n}\n\n.hidden {\n display: none;\n}\n\n.flex-col {\n flex-direction: column;\n}\n\n.place-items-center {\n place-items: center;\n}\n\n.items-center {\n align-items: center;\n}\n\n.justify-center {\n justify-content: center;\n}\n\n.justify-evenly {\n justify-content: space-evenly;\n}\n\n.flex-1 {\n flex: 1 1 0%;\n}\n\n.flex-shrink {\n flex-shrink: 1;\n}\n\n.float-none {\n float: none;\n}\n\n.h-3 {\n height: 0.75rem;\n}\n\n.h-6 {\n height: 1.5rem;\n}\n\n.h-12 {\n height: 3rem;\n}\n\n.h-16 {\n height: 4rem;\n}\n\n.h-32 {\n height: 8rem;\n}\n\n.h-40 {\n height: 10rem;\n}\n\n.h-full {\n height: 100%;\n}\n\n.h-screen {\n height: 100vh;\n}\n\n.text-xs {\n font-size: 0.75rem;\n}\n\n.text-base {\n font-size: 1rem;\n}\n\n.text-lg {\n font-size: 1.125rem;\n}\n\n.text-xl {\n font-size: 1.25rem;\n}\n\n.text-2xl {\n font-size: 1.5rem;\n}\n\n.text-3xl {\n font-size: 1.875rem;\n}\n\n.text-4xl {\n font-size: 2.25rem;\n}\n\n.text-5xl {\n font-size: 3rem;\n}\n\n.m-0 {\n margin: 0;\n}\n\n.m-1 {\n margin: 0.25rem;\n}\n\n.my-4 {\n margin-top: 1rem;\n margin-bottom: 1rem;\n}\n\n.my-5 {\n margin-top: 1.25rem;\n margin-bottom: 1.25rem;\n}\n\n.mb-1 {\n margin-bottom: 0.25rem;\n}\n\n.ml-1 {\n margin-left: 0.25rem;\n}\n\n.mr-2 {\n margin-right: 0.5rem;\n}\n\n.mb-2 {\n margin-bottom: 0.5rem;\n}\n\n.ml-2 {\n margin-left: 0.5rem;\n}\n\n.mb-3 {\n margin-bottom: 0.75rem;\n}\n\n.mt-4 {\n margin-top: 1rem;\n}\n\n.mr-4 {\n margin-right: 1rem;\n}\n\n.mb-4 {\n margin-bottom: 1rem;\n}\n\n.mt-5 {\n margin-top: 1.25rem;\n}\n\n.mb-5 {\n margin-bottom: 1.25rem;\n}\n\n.ml-5 {\n margin-left: 1.25rem;\n}\n\n.mt-6 {\n margin-top: 1.5rem;\n}\n\n.mb-6 {\n margin-bottom: 1.5rem;\n}\n\n.mb-8 {\n margin-bottom: 2rem;\n}\n\n.ml-auto {\n margin-left: auto;\n}\n\n.-mt-16 {\n margin-top: -4rem;\n}\n\n.-ml-20 {\n margin-left: -5rem;\n}\n\n.opacity-0 {\n opacity: 0;\n}\n\n.opacity-100 {\n opacity: 1;\n}\n\n.overflow-hidden {\n overflow: hidden;\n}\n\n.p-0 {\n padding: 0;\n}\n\n.p-1 {\n padding: 0.25rem;\n}\n\n.p-2 {\n padding: 0.5rem;\n}\n\n.p-3 {\n padding: 0.75rem;\n}\n\n.px-2 {\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n}\n\n.py-5 {\n padding-top: 1.25rem;\n padding-bottom: 1.25rem;\n}\n\n.py-6 {\n padding-top: 1.5rem;\n padding-bottom: 1.5rem;\n}\n\n.pr-2 {\n padding-right: 0.5rem;\n}\n\n.pb-3 {\n padding-bottom: 0.75rem;\n}\n\n.absolute {\n position: absolute;\n}\n\n.relative {\n position: relative;\n}\n\n.sticky {\n position: -webkit-sticky;\n position: sticky;\n}\n\n.top-0 {\n top: 0;\n}\n\n.right-0 {\n right: 0;\n}\n\n.left-0 {\n left: 0;\n}\n\n.text-center {\n text-align: center;\n}\n\n.text-white {\n --text-opacity: 1;\n color: #fff;\n color: rgba(255, 255, 255, var(--text-opacity));\n}\n\n.text-grayscale-870 {\n --text-opacity: 1;\n color: hsl(0, 0%, 87%);\n color: rgba(221.85, 221.85, 221.85, var(--text-opacity));\n}\n\n.text-primary {\n --text-opacity: 1;\n color: hsl(210, 100%, 52%);\n color: rgba(10.20000000000001, 132.59999999999988, 255, var(--text-opacity));\n}\n\n.text-foreground {\n color: var(--foreground);\n}\n\n.hover\\:text-primary:hover {\n --text-opacity: 1;\n color: hsl(210, 100%, 52%);\n color: rgba(10.20000000000001, 132.59999999999988, 255, var(--text-opacity));\n}\n\n.group:hover .group-hover\\:text-primary {\n --text-opacity: 1;\n color: hsl(210, 100%, 52%);\n color: rgba(10.20000000000001, 132.59999999999988, 255, var(--text-opacity));\n}\n\n.capitalize {\n text-transform: capitalize;\n}\n\n.no-underline {\n text-decoration: none;\n}\n\n.hover\\:underline:hover {\n text-decoration: underline;\n}\n\n.visible {\n visibility: visible;\n}\n\n.invisible {\n visibility: hidden;\n}\n\n.whitespace-no-wrap {\n white-space: nowrap;\n}\n\n.break-words {\n word-wrap: break-word;\n overflow-wrap: break-word;\n}\n\n.w-3 {\n width: 0.75rem;\n}\n\n.w-4 {\n width: 1rem;\n}\n\n.w-6 {\n width: 1.5rem;\n}\n\n.w-8 {\n width: 2rem;\n}\n\n.w-16 {\n width: 4rem;\n}\n\n.w-32 {\n width: 8rem;\n}\n\n.w-40 {\n width: 10rem;\n}\n\n.w-64 {\n width: 16rem;\n}\n\n.w-full {\n width: 100%;\n}\n\n.w-screen {\n width: 100vw;\n}\n\n.z-10 {\n z-index: 10;\n}\n\n.z-50 {\n z-index: 50;\n}\n\n.transform {\n --transform-translate-x: 0;\n --transform-translate-y: 0;\n --transform-rotate: 0;\n --transform-skew-x: 0;\n --transform-skew-y: 0;\n --transform-scale-x: 1;\n --transform-scale-y: 1;\n transform: translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y));\n}\n\n.transition-all {\n transition-property: all;\n}\n\n.transition {\n transition-property: background-color, border-color, color, fill, stroke, opacity, box-shadow, transform;\n}\n\n.transition-colors {\n transition-property: background-color, border-color, color, fill, stroke;\n}\n\n.transition-opacity {\n transition-property: opacity;\n}\n\n.ease-out {\n transition-timing-function: cubic-bezier(0, 0, 0.2, 1);\n}\n\n.ease-in-out {\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.duration-150 {\n transition-duration: 150ms;\n}\n\n.duration-200 {\n transition-duration: 200ms;\n}\n\n.duration-500 {\n transition-duration: 500ms;\n}\n\n@-webkit-keyframes spin {\n to {\n transform: rotate(360deg);\n }\n}\n\n@keyframes spin {\n to {\n transform: rotate(360deg);\n }\n}\n\n@-webkit-keyframes ping {\n 75%, 100% {\n transform: scale(2);\n opacity: 0;\n }\n}\n\n@keyframes ping {\n 75%, 100% {\n transform: scale(2);\n opacity: 0;\n }\n}\n\n@-webkit-keyframes pulse {\n 50% {\n opacity: .5;\n }\n}\n\n@keyframes pulse {\n 50% {\n opacity: .5;\n }\n}\n\n@-webkit-keyframes bounce {\n 0%, 100% {\n transform: translateY(-25%);\n -webkit-animation-timing-function: cubic-bezier(0.8,0,1,1);\n animation-timing-function: cubic-bezier(0.8,0,1,1);\n }\n\n 50% {\n transform: none;\n -webkit-animation-timing-function: cubic-bezier(0,0,0.2,1);\n animation-timing-function: cubic-bezier(0,0,0.2,1);\n }\n}\n\n@keyframes bounce {\n 0%, 100% {\n transform: translateY(-25%);\n -webkit-animation-timing-function: cubic-bezier(0.8,0,1,1);\n animation-timing-function: cubic-bezier(0.8,0,1,1);\n }\n\n 50% {\n transform: none;\n -webkit-animation-timing-function: cubic-bezier(0,0,0.2,1);\n animation-timing-function: cubic-bezier(0,0,0.2,1);\n }\n}\n\n:root {\n --main-scroll: hsl(0, 0%, 30%);\n --panels-scroll: hsl(180, 2%, 17%);\n --toast-background: hsla(240, 12%, 16%, 0.85);\n --toast-secondary: hsla(240, 12%, 16%, 0.15);\n --toast-text: hsla(0, 0%, 100%, 0.85);\n --primary-color: hsl(210, 100%, 52%);\n --primary-text: hsl(0, 0%, 87%);\n --secondary-color: hsl(46, 100%, 57%);\n}\n\n:root[data-theme='light'] {\n --main-background: #fff;\n --secondary-background: hsl(0, 0%, 93%);\n --foreground: hsl(0, 0%, 20%);\n --panels-background: hsl(216, 4%, 78%);\n --table-bg: #fff;\n --table-zebra: hsl(0, 0%, 90%);\n --table-highlight: hsl(0, 0%, 84%);\n}\n\n:root[data-theme='dark'] {\n --main-background: hsl(240, 10%, 8%);\n --secondary-background: hsl(240, 12%, 16%);\n --foreground: hsl(0, 0%, 93%);\n --panels-background: hsl(240, 15%, 12%);\n --table-bg: hsl(240, 10%, 8%);\n --table-zebra: hsl(240, 15%, 11%);\n --table-highlight: hsl(240, 10%, 22%);\n}\n\n:root[data-theme='purple'] {\n --main-background: hsl(261, 74%, 6%);\n --secondary-background: hsl(257, 61%, 10%);\n --foreground: hsl(0, 0%, 93%);\n --panels-background: hsl(257, 70%, 9%);\n --table-bg: hsl(261, 74%, 6%);\n --table-zebra: hsl(257, 61%, 10%);\n --table-highlight: hsl(257, 66%, 27%);\n}\n\nhtml {\n height: 100vh;\n}\n\nbody {\n margin: 0px;\n width: 100%;\n height: 100%;\n font-family: 'Open Sans', 'sans-serif';\n overflow: hidden;\n background: var(--main-background);\n color: var(--foreground);\n}\n\n* {\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n}\n\n:root {\n font-size: 16px;\n}\n\ntable,\ncaption,\ntbody,\ntfoot,\nthead,\ntr,\nth,\ntd {\n margin: 0;\n padding: 0;\n border: 0;\n font-size: 100%;\n font: inherit;\n vertical-align: baseline;\n}\n\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\n\n/* Taken from Tailwind Preflight */\n\nbutton,\n[type='button'],\n[type='reset'],\n[type='submit'] {\n -webkit-appearance: button;\n}\n\ninput[type='text'],\ninput[type='password'],\ninput[type='number'],\ninput[type='search'],\ninput[type='checkbox'],\nselect {\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n}\n\n[type='number']::-webkit-inner-spin-button,\n[type='number']::-webkit-outer-spin-button {\n height: auto;\n}\n\nbutton,\n[role='button'] {\n cursor: pointer;\n}\n\np {\n word-break: break-word;\n}\n\n*,\n::before,\n::after {\n border-width: 0;\n border-style: solid;\n}\n\n@keyframes spin {\n 0% {\n transform: rotate(0deg);\n }\n\n 100% {\n transform: rotate(360deg);\n }\n}\n\ninput[type='text'],\ninput[type='password'],\ninput[type='number'] {\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n margin-bottom: 8px;\n border: 0px solid black;\n border-radius: 4px;\n background-color: var(--secondary-background);\n padding: 0px 8px;\n width: calc(100% - 16px);\n line-height: 36px;\n color: var(--foreground);\n}\n\ninput[type='checkbox'] {\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n display: inline-block;\n position: relative;\n opacity: 0.5;\n margin: 3px;\n border: 2px solid gray;\n border-radius: 2px;\n background-color: none;\n padding: 7px;\n}\n\ninput[type='checkbox']:checked {\n opacity: 1;\n margin: 3px;\n border: 0px solid var(--primary-color);\n border-radius: 2px;\n background-color: var(--primary-color);\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' height='18' viewBox='3 3 18 18' width='18'%3E%3Cpath fill='%23ffffff' d='M 10,17 5,12 6.41,10.59 10,14.17 17.59,6.58 19,8 Z'/%3E%3Cpath d='M0 0h24v24H0z' fill='none'/%3E%3C/svg%3E\");\n background-position: center center;\n padding: 9px;\n color: var(--primary-text);\n}\n\nselect {\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n margin-bottom: 8px;\n border: 0px solid black;\n border-radius: 4px;\n background-clip: border-box;\n background-color: var(--secondary-background);\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' height='24' viewBox='0 0 24 24' width='24'%3E%3Cpath style='fill%3A%23000000%3Bfill-opacity%3A0.25' d='M7 10l5 5 5-5z'/%3E%3Cpath d='M0 0h24v24H0z' fill='none'/%3E%3C/svg%3E\");\n background-position: calc(100% - 8px) center;\n background-repeat: no-repeat;\n background-size: 24px;\n padding: 0px 40px 0px 8px;\n width: 100%;\n line-height: 36px;\n color: var(--foreground);\n}\n\n.clickable {\n cursor: pointer !important;\n}\n\n.coverart {\n background-color: var(--secondary-background);\n}\n\n.table {\n width: 100%;\n -webkit-border-horizontal-spacing: 0px;\n -webkit-border-vertical-spacing: 0px;\n /* === Tracks Table === */\n /* === Tracklist Table === */\n /* === Charts Table === */\n}\n\n.table tbody tr:not(.table__row-no-highlight):hover {\n background: var(--table-highlight);\n cursor: default;\n}\n\n.table tr {\n background: var(--table-bg);\n transition: background-color 175ms ease-in-out;\n}\n\n.table tr:nth-child(even) {\n background: var(--table-zebra);\n transition: background-color 175ms ease-in-out;\n}\n\n.table tr:not(:last-child) {\n border-bottom: 1px solid var(--table-highlight);\n}\n\n.table td,\n .table th {\n vertical-align: middle;\n}\n\n.table th .sortable {\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n\n.table th .sort-asc::after,\n .table th .sort-desc::after {\n font-size: 0.7em;\n padding-left: 3px;\n line-height: 0.7em;\n}\n\n.table th .sort-asc::after {\n content: '\\25b2';\n}\n\n.table th .sort-desc::after {\n content: '\\25bc';\n}\n\n.table td {\n padding: 7px 10px;\n}\n\n.table td:first-child {\n padding: 7px 10px 7px 20px;\n}\n\n.table td:last-child {\n padding: 7px 20px 7px 10px;\n}\n\n.table td img {\n vertical-align: middle;\n}\n\n.table--tracks {\n border-collapse: collapse;\n}\n\n.table--tracks thead {\n border-bottom: 2px solid var(--table-highlight);\n}\n\n.table--tracks tr:first-child td:first-child {\n border-top-left-radius: 3px;\n}\n\n.table--tracks tr:first-child td:last-child {\n border-top-right-radius: 3px;\n}\n\n.table--tracks tr:last-child td:first-child {\n border-bottom-left-radius: 3px;\n}\n\n.table--tracks tr:last-child td:last-child {\n border-bottom-right-radius: 3px;\n}\n\n.table--tracklist thead {\n border-bottom: 2px solid var(--table-highlight);\n text-transform: capitalize;\n}\n\n.table--tracklist th {\n height: 45px;\n padding: 7px 10px;\n}\n\n.table--tracklist th:first-child {\n padding: 7px 10px 7px 20px;\n}\n\n.table--tracklist th:last-child {\n padding: 7px 20px 7px 10px;\n}\n\n.table--tracklist td {\n height: 35px;\n}\n\n.table--charts td {\n height: 35px;\n}\n\n.table .table__icon {\n box-sizing: content-box;\n width: 32px;\n}\n\n.table .table__icon--big {\n width: 48px;\n text-align: center;\n}\n\n.table .table__cell--x-small {\n width: 0.32%;\n}\n\n.table .table__cell--small {\n width: 3.2%;\n}\n\n.table .table__cell--medium {\n width: 28.7%;\n}\n\n.table .table__cell--large {\n width: 50%;\n}\n\n.table .table__cell--left {\n text-align: left;\n}\n\n.table .table__cell--center {\n text-align: center;\n}\n\n.table .table__cell--right {\n text-align: right;\n}\n\n.table .table__cell-content.table__cell-content--vertical-center {\n display: flex;\n align-items: center;\n}\n\n.track_row > td > img {\n width: 32px;\n height: 32px;\n}\n\n.track_row > td > a > img {\n width: 56px;\n height: 56px;\n}\n\n.table--tracklist .clickable:hover,\n.table--charts .clickable:hover {\n text-decoration: underline;\n}\n\n.release-grid {\n grid-gap: 1rem;\n gap: 1rem;\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(10rem, 1fr));\n}\n\n.settings-group {\n border-top-width: 1px;\n --border-opacity: 1;\n border-color: hsl(0, 0%, 50%);\n border-color: rgba(127.5, 127.5, 127.5, var(--border-opacity));\n}\n\n.settings-group__header {\n display: inline-flex;\n align-items: center;\n padding-top: 2rem;\n padding-bottom: 2rem;\n font-size: 1.5rem;\n}\n\n.settings-group__header i.material-icons {\n margin-right: 1rem;\n}\n\n.settings-container {\n display: flex;\n}\n\n.settings-container__half {\n width: 50%;\n}\n\n.settings-container__third {\n width: 33%;\n}\n\n.settings-container__third--only-checkbox {\n display: flex;\n flex-direction: column;\n align-items: start;\n justify-content: center;\n}\n\n.settings-container__half > *,\n .settings-container__third > * {\n margin-bottom: 1rem;\n}\n\n.with-checkbox {\n display: flex;\n align-items: center;\n}\n\n.with-checkbox [type='checkbox'] {\n cursor: pointer;\n}\n\n.with-checkbox .checkbox-text {\n margin-left: 10px;\n cursor: pointer;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n\n/* Input group */\n\n.input-group .input-group-text {\n margin-bottom: 0.5rem;\n}\n\n.release {\n display: inline-block;\n width: 156px;\n}\n\n@media (min-width: 640px) {\n}\n\n@media (min-width: 768px) {\n}\n\n@media (min-width: 1024px) {\n}\n\n@media (min-width: 1280px) {\n}\n";
styleInject(css_248z$2);
var css_248z$3 = "/* Button */\n\n.btn {\n position: relative;\n height: 2rem;\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n padding-top: 0;\n padding-bottom: 0;\n font-size: 0.875rem;\n font-weight: 600;\n text-transform: uppercase;\n border-width: 1px;\n border-color: transparent;\n border-style: solid;\n border-radius: 0.25rem;\n --text-opacity: 1;\n color: hsl(0, 0%, 90%);\n color: rgba(229.5, 229.5, 229.5, var(--text-opacity));\n font-family: inherit;\n transition: transform 50ms ease-in-out;\n}\n\n.btn:active {\n transform: scale(0.98);\n}\n\n.btn[disabled] {\n --text-opacity: 1;\n color: #e2e8f0;\n color: rgba(226, 232, 240, var(--text-opacity));\n --bg-opacity: 1;\n background-color: #718096;\n background-color: rgba(113, 128, 150, var(--bg-opacity));\n opacity: 0.75;\n cursor: not-allowed;\n}\n\n.btn-only-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 3rem;\n padding-left: 0.25rem;\n padding-right: 0.25rem;\n padding-top: 0;\n padding-bottom: 0;\n min-width: 24px;\n}\n\n.btn-primary {\n --bg-opacity: 1;\n background-color: hsl(210, 100%, 52%);\n background-color: rgba(10.20000000000001, 132.59999999999988, 255, var(--bg-opacity));\n}\n\n.btn-primary:hover {\n --bg-opacity: 1;\n background-color: #3182ce;\n background-color: rgba(49, 130, 206, var(--bg-opacity));\n border-color: var(--foreground);\n}\n\n/* Section tabs */\n\n.section-tabs {\n display: flex;\n margin-top: 1rem;\n margin-bottom: 1.5rem;\n list-style-type: none;\n cursor: pointer;\n}\n\n.section-tabs__tab {\n flex: 1 1 0%;\n padding: 0.75rem;\n font-size: 1.25rem;\n text-align: center;\n text-transform: capitalize;\n border-top-width: 4px;\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n border-color: var(--foreground);\n background-color: var(--main-background);\n}\n\n.section-tabs__tab.active {\n --text-opacity: 1;\n color: hsl(210, 100%, 52%);\n color: rgba(10.20000000000001, 132.59999999999988, 255, var(--text-opacity));\n --border-opacity: 1;\n border-color: hsl(210, 100%, 52%);\n border-color: rgba(10.20000000000001, 132.59999999999988, 255, var(--border-opacity));\n background-color: var(--main-background);\n}\n\n.section-tabs__tab:hover {\n --text-opacity: 1;\n color: hsl(210, 100%, 52%);\n color: rgba(10.20000000000001, 132.59999999999988, 255, var(--text-opacity));\n --border-opacity: 1;\n border-color: hsl(210, 100%, 52%);\n border-color: rgba(10.20000000000001, 132.59999999999988, 255, var(--border-opacity));\n background-color: var(--secondary-background);\n --bg-opacity: 0.25;\n}\n\n/* Image header */\n\n.image-header header {\n background-size: cover;\n padding-top: 14rem;\n padding-left: 1.5rem;\n padding-right: 1.5rem;\n padding-bottom: 0.5rem;\n border-top-left-radius: 0.5rem;\n border-top-right-radius: 0.5rem;\n background-position: 0% 35%;\n}\n\n/* Fixed footer */\n\n.fixed-footer footer {\n position: -webkit-sticky;\n position: sticky;\n align-items: center;\n display: flex;\n flex-direction: row;\n justify-content: flex-end;\n bottom: 0;\n height: 4rem;\n width: 100%;\n margin-top: 1.5rem;\n}\r\n";
styleInject(css_248z$3);
var css_248z$4 = ".changing-theme {\n transition: all 200ms ease-in-out;\n}\n\n[v-cloak] {\n display: none;\n}\r\n";
styleInject(css_248z$4);
var css_248z$5 = ".primary-text {\n margin-bottom: 0.25rem;\n transition-property: background-color, border-color, color, fill, stroke;\n transition-duration: 200ms;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.primary-text:hover {\n --text-opacity: 1;\n color: hsl(210, 100%, 52%);\n color: rgba(10.20000000000001, 132.59999999999988, 255, var(--text-opacity));\n}\n\n.secondary-text {\n margin-bottom: 0.25rem;\n font-size: 0.875rem;\n opacity: 0.75;\n}\r\n";
styleInject(css_248z$5);
/*!
* vuex v3.5.1
* (c) 2020 Evan You
* @license MIT
*/
function applyMixin (Vue) {
var version = Number(Vue.version.split('.')[0]);
if (version >= 2) {
Vue.mixin({ beforeCreate: vuexInit });
} else {
// override init and inject vuex init procedure
// for 1.x backwards compatibility.
var _init = Vue.prototype._init;
Vue.prototype._init = function (options) {
if ( options === void 0 ) options = {};
options.init = options.init
? [vuexInit].concat(options.init)
: vuexInit;
_init.call(this, options);
};
}
/**
* Vuex init hook, injected into each instances init hooks list.
*/
function vuexInit () {
var options = this.$options;
// store injection
if (options.store) {
this.$store = typeof options.store === 'function'
? options.store()
: options.store;
} else if (options.parent && options.parent.$store) {
this.$store = options.parent.$store;
}
}
}
var target$2 = typeof window !== 'undefined'
? window
: typeof global !== 'undefined'
? global
: {};
var devtoolHook = target$2.__VUE_DEVTOOLS_GLOBAL_HOOK__;
function devtoolPlugin (store) {
if (!devtoolHook) { return }
store._devtoolHook = devtoolHook;
devtoolHook.emit('vuex:init', store);
devtoolHook.on('vuex:travel-to-state', function (targetState) {
store.replaceState(targetState);
});
store.subscribe(function (mutation, state) {
devtoolHook.emit('vuex:mutation', mutation, state);
}, { prepend: true });
store.subscribeAction(function (action, state) {
devtoolHook.emit('vuex:action', action, state);
}, { prepend: true });
}
/**
* Get the first item that pass the test
* by second argument function
*
* @param {Array} list
* @param {Function} f
* @return {*}
*/
function find (list, f) {
return list.filter(f)[0]
}
/**
* Deep copy the given object considering circular structure.
* This function caches all nested objects and its copies.
* If it detects circular structure, use cached copy to avoid infinite loop.
*
* @param {*} obj
* @param {Array<Object>} cache
* @return {*}
*/
function deepCopy (obj, cache) {
if ( cache === void 0 ) cache = [];
// just return if obj is immutable value
if (obj === null || typeof obj !== 'object') {
return obj
}
// if obj is hit, it is in circular structure
var hit = find(cache, function (c) { return c.original === obj; });
if (hit) {
return hit.copy
}
var copy = Array.isArray(obj) ? [] : {};
// put the copy into cache at first
// because we want to refer it in recursive deepCopy
cache.push({
original: obj,
copy: copy
});
Object.keys(obj).forEach(function (key) {
copy[key] = deepCopy(obj[key], cache);
});
return copy
}
/**
* forEach for object
*/
function forEachValue (obj, fn) {
Object.keys(obj).forEach(function (key) { return fn(obj[key], key); });
}
function isObject$1 (obj) {
return obj !== null && typeof obj === 'object'
}
function isPromise$1 (val) {
return val && typeof val.then === 'function'
}
function partial (fn, arg) {
return function () {
return fn(arg)
}
}
// Base data struct for store's module, package with some attribute and method
var Module = function Module (rawModule, runtime) {
this.runtime = runtime;
// Store some children item
this._children = Object.create(null);
// Store the origin module object which passed by programmer
this._rawModule = rawModule;
var rawState = rawModule.state;
// Store the origin module's state
this.state = (typeof rawState === 'function' ? rawState() : rawState) || {};
};
var prototypeAccessors$1 = { namespaced: { configurable: true } };
prototypeAccessors$1.namespaced.get = function () {
return !!this._rawModule.namespaced
};
Module.prototype.addChild = function addChild (key, module) {
this._children[key] = module;
};
Module.prototype.removeChild = function removeChild (key) {
delete this._children[key];
};
Module.prototype.getChild = function getChild (key) {
return this._children[key]
};
Module.prototype.hasChild = function hasChild (key) {
return key in this._children
};
Module.prototype.update = function update (rawModule) {
this._rawModule.namespaced = rawModule.namespaced;
if (rawModule.actions) {
this._rawModule.actions = rawModule.actions;
}
if (rawModule.mutations) {
this._rawModule.mutations = rawModule.mutations;
}
if (rawModule.getters) {
this._rawModule.getters = rawModule.getters;
}
};
Module.prototype.forEachChild = function forEachChild (fn) {
forEachValue(this._children, fn);
};
Module.prototype.forEachGetter = function forEachGetter (fn) {
if (this._rawModule.getters) {
forEachValue(this._rawModule.getters, fn);
}
};
Module.prototype.forEachAction = function forEachAction (fn) {
if (this._rawModule.actions) {
forEachValue(this._rawModule.actions, fn);
}
};
Module.prototype.forEachMutation = function forEachMutation (fn) {
if (this._rawModule.mutations) {
forEachValue(this._rawModule.mutations, fn);
}
};
Object.defineProperties( Module.prototype, prototypeAccessors$1 );
var ModuleCollection = function ModuleCollection (rawRootModule) {
// register root module (Vuex.Store options)
this.register([], rawRootModule, false);
};
ModuleCollection.prototype.get = function get (path) {
return path.reduce(function (module, key) {
return module.getChild(key)
}, this.root)
};
ModuleCollection.prototype.getNamespace = function getNamespace (path) {
var module = this.root;
return path.reduce(function (namespace, key) {
module = module.getChild(key);
return namespace + (module.namespaced ? key + '/' : '')
}, '')
};
ModuleCollection.prototype.update = function update$1 (rawRootModule) {
update([], this.root, rawRootModule);
};
ModuleCollection.prototype.register = function register (path, rawModule, runtime) {
var this$1 = this;
if ( runtime === void 0 ) runtime = true;
var newModule = new Module(rawModule, runtime);
if (path.length === 0) {
this.root = newModule;
} else {
var parent = this.get(path.slice(0, -1));
parent.addChild(path[path.length - 1], newModule);
}
// register nested modules
if (rawModule.modules) {
forEachValue(rawModule.modules, function (rawChildModule, key) {
this$1.register(path.concat(key), rawChildModule, runtime);
});
}
};
ModuleCollection.prototype.unregister = function unregister (path) {
var parent = this.get(path.slice(0, -1));
var key = path[path.length - 1];
var child = parent.getChild(key);
if (!child) {
return
}
if (!child.runtime) {
return
}
parent.removeChild(key);
};
ModuleCollection.prototype.isRegistered = function isRegistered (path) {
var parent = this.get(path.slice(0, -1));
var key = path[path.length - 1];
return parent.hasChild(key)
};
function update (path, targetModule, newModule) {
// update target module
targetModule.update(newModule);
// update nested modules
if (newModule.modules) {
for (var key in newModule.modules) {
if (!targetModule.getChild(key)) {
return
}
update(
path.concat(key),
targetModule.getChild(key),
newModule.modules[key]
);
}
}
}
var Vue$1; // bind on install
var Store = function Store (options) {
var this$1 = this;
if ( options === void 0 ) options = {};
// Auto install if it is not done yet and `window` has `Vue`.
// To allow users to avoid auto-installation in some cases,
// this code should be placed here. See #731
if (!Vue$1 && typeof window !== 'undefined' && window.Vue) {
install(window.Vue);
}
var plugins = options.plugins; if ( plugins === void 0 ) plugins = [];
var strict = options.strict; if ( strict === void 0 ) strict = false;
// store internal state
this._committing = false;
this._actions = Object.create(null);
this._actionSubscribers = [];
this._mutations = Object.create(null);
this._wrappedGetters = Object.create(null);
this._modules = new ModuleCollection(options);
this._modulesNamespaceMap = Object.create(null);
this._subscribers = [];
this._watcherVM = new Vue$1();
this._makeLocalGettersCache = Object.create(null);
// bind commit and dispatch to self
var store = this;
var ref = this;
var dispatch = ref.dispatch;
var commit = ref.commit;
this.dispatch = function boundDispatch (type, payload) {
return dispatch.call(store, type, payload)
};
this.commit = function boundCommit (type, payload, options) {
return commit.call(store, type, payload, options)
};
// strict mode
this.strict = strict;
var state = this._modules.root.state;
// init root module.
// this also recursively registers all sub-modules
// and collects all module getters inside this._wrappedGetters
installModule(this, state, [], this._modules.root);
// initialize the store vm, which is responsible for the reactivity
// (also registers _wrappedGetters as computed properties)
resetStoreVM(this, state);
// apply plugins
plugins.forEach(function (plugin) { return plugin(this$1); });
var useDevtools = options.devtools !== undefined ? options.devtools : Vue$1.config.devtools;
if (useDevtools) {
devtoolPlugin(this);
}
};
var prototypeAccessors$1$1 = { state: { configurable: true } };
prototypeAccessors$1$1.state.get = function () {
return this._vm._data.$$state
};
prototypeAccessors$1$1.state.set = function (v) {
};
Store.prototype.commit = function commit (_type, _payload, _options) {
var this$1 = this;
// check object-style commit
var ref = unifyObjectStyle(_type, _payload, _options);
var type = ref.type;
var payload = ref.payload;
var mutation = { type: type, payload: payload };
var entry = this._mutations[type];
if (!entry) {
return
}
this._withCommit(function () {
entry.forEach(function commitIterator (handler) {
handler(payload);
});
});
this._subscribers
.slice() // shallow copy to prevent iterator invalidation if subscriber synchronously calls unsubscribe
.forEach(function (sub) { return sub(mutation, this$1.state); });
};
Store.prototype.dispatch = function dispatch (_type, _payload) {
var this$1 = this;
// check object-style dispatch
var ref = unifyObjectStyle(_type, _payload);
var type = ref.type;
var payload = ref.payload;
var action = { type: type, payload: payload };
var entry = this._actions[type];
if (!entry) {
return
}
try {
this._actionSubscribers
.slice() // shallow copy to prevent iterator invalidation if subscriber synchronously calls unsubscribe
.filter(function (sub) { return sub.before; })
.forEach(function (sub) { return sub.before(action, this$1.state); });
} catch (e) {
}
var result = entry.length > 1
? Promise.all(entry.map(function (handler) { return handler(payload); }))
: entry[0](payload);
return new Promise(function (resolve, reject) {
result.then(function (res) {
try {
this$1._actionSubscribers
.filter(function (sub) { return sub.after; })
.forEach(function (sub) { return sub.after(action, this$1.state); });
} catch (e) {
}
resolve(res);
}, function (error) {
try {
this$1._actionSubscribers
.filter(function (sub) { return sub.error; })
.forEach(function (sub) { return sub.error(action, this$1.state, error); });
} catch (e) {
}
reject(error);
});
})
};
Store.prototype.subscribe = function subscribe (fn, options) {
return genericSubscribe(fn, this._subscribers, options)
};
Store.prototype.subscribeAction = function subscribeAction (fn, options) {
var subs = typeof fn === 'function' ? { before: fn } : fn;
return genericSubscribe(subs, this._actionSubscribers, options)
};
Store.prototype.watch = function watch (getter, cb, options) {
var this$1 = this;
return this._watcherVM.$watch(function () { return getter(this$1.state, this$1.getters); }, cb, options)
};
Store.prototype.replaceState = function replaceState (state) {
var this$1 = this;
this._withCommit(function () {
this$1._vm._data.$$state = state;
});
};
Store.prototype.registerModule = function registerModule (path, rawModule, options) {
if ( options === void 0 ) options = {};
if (typeof path === 'string') { path = [path]; }
this._modules.register(path, rawModule);
installModule(this, this.state, path, this._modules.get(path), options.preserveState);
// reset store to update getters...
resetStoreVM(this, this.state);
};
Store.prototype.unregisterModule = function unregisterModule (path) {
var this$1 = this;
if (typeof path === 'string') { path = [path]; }
this._modules.unregister(path);
this._withCommit(function () {
var parentState = getNestedState(this$1.state, path.slice(0, -1));
Vue$1.delete(parentState, path[path.length - 1]);
});
resetStore(this);
};
Store.prototype.hasModule = function hasModule (path) {
if (typeof path === 'string') { path = [path]; }
return this._modules.isRegistered(path)
};
Store.prototype.hotUpdate = function hotUpdate (newOptions) {
this._modules.update(newOptions);
resetStore(this, true);
};
Store.prototype._withCommit = function _withCommit (fn) {
var committing = this._committing;
this._committing = true;
fn();
this._committing = committing;
};
Object.defineProperties( Store.prototype, prototypeAccessors$1$1 );
function genericSubscribe (fn, subs, options) {
if (subs.indexOf(fn) < 0) {
options && options.prepend
? subs.unshift(fn)
: subs.push(fn);
}
return function () {
var i = subs.indexOf(fn);
if (i > -1) {
subs.splice(i, 1);
}
}
}
function resetStore (store, hot) {
store._actions = Object.create(null);
store._mutations = Object.create(null);
store._wrappedGetters = Object.create(null);
store._modulesNamespaceMap = Object.create(null);
var state = store.state;
// init all modules
installModule(store, state, [], store._modules.root, true);
// reset vm
resetStoreVM(store, state, hot);
}
function resetStoreVM (store, state, hot) {
var oldVm = store._vm;
// bind store public getters
store.getters = {};
// reset local getters cache
store._makeLocalGettersCache = Object.create(null);
var wrappedGetters = store._wrappedGetters;
var computed = {};
forEachValue(wrappedGetters, function (fn, key) {
// use computed to leverage its lazy-caching mechanism
// direct inline function use will lead to closure preserving oldVm.
// using partial to return function with only arguments preserved in closure environment.
computed[key] = partial(fn, store);
Object.defineProperty(store.getters, key, {
get: function () { return store._vm[key]; },
enumerable: true // for local getters
});
});
// use a Vue instance to store the state tree
// suppress warnings just in case the user has added
// some funky global mixins
var silent = Vue$1.config.silent;
Vue$1.config.silent = true;
store._vm = new Vue$1({
data: {
$$state: state
},
computed: computed
});
Vue$1.config.silent = silent;
// enable strict mode for new vm
if (store.strict) {
enableStrictMode(store);
}
if (oldVm) {
if (hot) {
// dispatch changes in all subscribed watchers
// to force getter re-evaluation for hot reloading.
store._withCommit(function () {
oldVm._data.$$state = null;
});
}
Vue$1.nextTick(function () { return oldVm.$destroy(); });
}
}
function installModule (store, rootState, path, module, hot) {
var isRoot = !path.length;
var namespace = store._modules.getNamespace(path);
// register in namespace map
if (module.namespaced) {
if (store._modulesNamespaceMap[namespace] && ("production" !== 'production')) {
console.error(("[vuex] duplicate namespace " + namespace + " for the namespaced module " + (path.join('/'))));
}
store._modulesNamespaceMap[namespace] = module;
}
// set state
if (!isRoot && !hot) {
var parentState = getNestedState(rootState, path.slice(0, -1));
var moduleName = path[path.length - 1];
store._withCommit(function () {
Vue$1.set(parentState, moduleName, module.state);
});
}
var local = module.context = makeLocalContext(store, namespace, path);
module.forEachMutation(function (mutation, key) {
var namespacedType = namespace + key;
registerMutation(store, namespacedType, mutation, local);
});
module.forEachAction(function (action, key) {
var type = action.root ? key : namespace + key;
var handler = action.handler || action;
registerAction(store, type, handler, local);
});
module.forEachGetter(function (getter, key) {
var namespacedType = namespace + key;
registerGetter(store, namespacedType, getter, local);
});
module.forEachChild(function (child, key) {
installModule(store, rootState, path.concat(key), child, hot);
});
}
/**
* make localized dispatch, commit, getters and state
* if there is no namespace, just use root ones
*/
function makeLocalContext (store, namespace, path) {
var noNamespace = namespace === '';
var local = {
dispatch: noNamespace ? store.dispatch : function (_type, _payload, _options) {
var args = unifyObjectStyle(_type, _payload, _options);
var payload = args.payload;
var options = args.options;
var type = args.type;
if (!options || !options.root) {
type = namespace + type;
}
return store.dispatch(type, payload)
},
commit: noNamespace ? store.commit : function (_type, _payload, _options) {
var args = unifyObjectStyle(_type, _payload, _options);
var payload = args.payload;
var options = args.options;
var type = args.type;
if (!options || !options.root) {
type = namespace + type;
}
store.commit(type, payload, options);
}
};
// getters and state object must be gotten lazily
// because they will be changed by vm update
Object.defineProperties(local, {
getters: {
get: noNamespace
? function () { return store.getters; }
: function () { return makeLocalGetters(store, namespace); }
},
state: {
get: function () { return getNestedState(store.state, path); }
}
});
return local
}
function makeLocalGetters (store, namespace) {
if (!store._makeLocalGettersCache[namespace]) {
var gettersProxy = {};
var splitPos = namespace.length;
Object.keys(store.getters).forEach(function (type) {
// skip if the target getter is not match this namespace
if (type.slice(0, splitPos) !== namespace) { return }
// extract local getter type
var localType = type.slice(splitPos);
// Add a port to the getters proxy.
// Define as getter property because
// we do not want to evaluate the getters in this time.
Object.defineProperty(gettersProxy, localType, {
get: function () { return store.getters[type]; },
enumerable: true
});
});
store._makeLocalGettersCache[namespace] = gettersProxy;
}
return store._makeLocalGettersCache[namespace]
}
function registerMutation (store, type, handler, local) {
var entry = store._mutations[type] || (store._mutations[type] = []);
entry.push(function wrappedMutationHandler (payload) {
handler.call(store, local.state, payload);
});
}
function registerAction (store, type, handler, local) {
var entry = store._actions[type] || (store._actions[type] = []);
entry.push(function wrappedActionHandler (payload) {
var res = handler.call(store, {
dispatch: local.dispatch,
commit: local.commit,
getters: local.getters,
state: local.state,
rootGetters: store.getters,
rootState: store.state
}, payload);
if (!isPromise$1(res)) {
res = Promise.resolve(res);
}
if (store._devtoolHook) {
return res.catch(function (err) {
store._devtoolHook.emit('vuex:error', err);
throw err
})
} else {
return res
}
});
}
function registerGetter (store, type, rawGetter, local) {
if (store._wrappedGetters[type]) {
return
}
store._wrappedGetters[type] = function wrappedGetter (store) {
return rawGetter(
local.state, // local state
local.getters, // local getters
store.state, // root state
store.getters // root getters
)
};
}
function enableStrictMode (store) {
store._vm.$watch(function () { return this._data.$$state }, function () {
}, { deep: true, sync: true });
}
function getNestedState (state, path) {
return path.reduce(function (state, key) { return state[key]; }, state)
}
function unifyObjectStyle (type, payload, options) {
if (isObject$1(type) && type.type) {
options = payload;
payload = type;
type = type.type;
}
return { type: type, payload: payload, options: options }
}
function install (_Vue) {
if (Vue$1 && _Vue === Vue$1) {
return
}
Vue$1 = _Vue;
applyMixin(Vue$1);
}
/**
* Reduce the code which written in Vue.js for getting the state.
* @param {String} [namespace] - Module's namespace
* @param {Object|Array} states # Object's item can be a function which accept state and getters for param, you can do something for state and getters in it.
* @param {Object}
*/
var mapState = normalizeNamespace(function (namespace, states) {
var res = {};
normalizeMap(states).forEach(function (ref) {
var key = ref.key;
var val = ref.val;
res[key] = function mappedState () {
var state = this.$store.state;
var getters = this.$store.getters;
if (namespace) {
var module = getModuleByNamespace(this.$store, 'mapState', namespace);
if (!module) {
return
}
state = module.context.state;
getters = module.context.getters;
}
return typeof val === 'function'
? val.call(this, state, getters)
: state[val]
};
// mark vuex getter for devtools
res[key].vuex = true;
});
return res
});
/**
* Reduce the code which written in Vue.js for committing the mutation
* @param {String} [namespace] - Module's namespace
* @param {Object|Array} mutations # Object's item can be a function which accept `commit` function as the first param, it can accept anthor params. You can commit mutation and do any other things in this function. specially, You need to pass anthor params from the mapped function.
* @return {Object}
*/
var mapMutations = normalizeNamespace(function (namespace, mutations) {
var res = {};
normalizeMap(mutations).forEach(function (ref) {
var key = ref.key;
var val = ref.val;
res[key] = function mappedMutation () {
var args = [], len = arguments.length;
while ( len-- ) args[ len ] = arguments[ len ];
// Get the commit method from store
var commit = this.$store.commit;
if (namespace) {
var module = getModuleByNamespace(this.$store, 'mapMutations', namespace);
if (!module) {
return
}
commit = module.context.commit;
}
return typeof val === 'function'
? val.apply(this, [commit].concat(args))
: commit.apply(this.$store, [val].concat(args))
};
});
return res
});
/**
* Reduce the code which written in Vue.js for getting the getters
* @param {String} [namespace] - Module's namespace
* @param {Object|Array} getters
* @return {Object}
*/
var mapGetters = normalizeNamespace(function (namespace, getters) {
var res = {};
normalizeMap(getters).forEach(function (ref) {
var key = ref.key;
var val = ref.val;
// The namespace has been mutated by normalizeNamespace
val = namespace + val;
res[key] = function mappedGetter () {
if (namespace && !getModuleByNamespace(this.$store, 'mapGetters', namespace)) {
return
}
return this.$store.getters[val]
};
// mark vuex getter for devtools
res[key].vuex = true;
});
return res
});
/**
* Reduce the code which written in Vue.js for dispatch the action
* @param {String} [namespace] - Module's namespace
* @param {Object|Array} actions # Object's item can be a function which accept `dispatch` function as the first param, it can accept anthor params. You can dispatch action and do any other things in this function. specially, You need to pass anthor params from the mapped function.
* @return {Object}
*/
var mapActions = normalizeNamespace(function (namespace, actions) {
var res = {};
normalizeMap(actions).forEach(function (ref) {
var key = ref.key;
var val = ref.val;
res[key] = function mappedAction () {
var args = [], len = arguments.length;
while ( len-- ) args[ len ] = arguments[ len ];
// get dispatch function from store
var dispatch = this.$store.dispatch;
if (namespace) {
var module = getModuleByNamespace(this.$store, 'mapActions', namespace);
if (!module) {
return
}
dispatch = module.context.dispatch;
}
return typeof val === 'function'
? val.apply(this, [dispatch].concat(args))
: dispatch.apply(this.$store, [val].concat(args))
};
});
return res
});
/**
* Rebinding namespace param for mapXXX function in special scoped, and return them by simple object
* @param {String} namespace
* @return {Object}
*/
var createNamespacedHelpers = function (namespace) { return ({
mapState: mapState.bind(null, namespace),
mapGetters: mapGetters.bind(null, namespace),
mapMutations: mapMutations.bind(null, namespace),
mapActions: mapActions.bind(null, namespace)
}); };
/**
* Normalize the map
* normalizeMap([1, 2, 3]) => [ { key: 1, val: 1 }, { key: 2, val: 2 }, { key: 3, val: 3 } ]
* normalizeMap({a: 1, b: 2, c: 3}) => [ { key: 'a', val: 1 }, { key: 'b', val: 2 }, { key: 'c', val: 3 } ]
* @param {Array|Object} map
* @return {Object}
*/
function normalizeMap (map) {
if (!isValidMap(map)) {
return []
}
return Array.isArray(map)
? map.map(function (key) { return ({ key: key, val: key }); })
: Object.keys(map).map(function (key) { return ({ key: key, val: map[key] }); })
}
/**
* Validate whether given map is valid or not
* @param {*} map
* @return {Boolean}
*/
function isValidMap (map) {
return Array.isArray(map) || isObject$1(map)
}
/**
* Return a function expect two param contains namespace and map. it will normalize the namespace and then the param's function will handle the new namespace and the map.
* @param {Function} fn
* @return {Function}
*/
function normalizeNamespace (fn) {
return function (namespace, map) {
if (typeof namespace !== 'string') {
map = namespace;
namespace = '';
} else if (namespace.charAt(namespace.length - 1) !== '/') {
namespace += '/';
}
return fn(namespace, map)
}
}
/**
* Search a special module from store by namespace. if module not exist, print error message.
* @param {Object} store
* @param {String} helper
* @param {String} namespace
* @return {Object}
*/
function getModuleByNamespace (store, helper, namespace) {
var module = store._modulesNamespaceMap[namespace];
return module
}
// Credits: borrowed code from fcomb/redux-logger
function createLogger (ref) {
if ( ref === void 0 ) ref = {};
var collapsed = ref.collapsed; if ( collapsed === void 0 ) collapsed = true;
var filter = ref.filter; if ( filter === void 0 ) filter = function (mutation, stateBefore, stateAfter) { return true; };
var transformer = ref.transformer; if ( transformer === void 0 ) transformer = function (state) { return state; };
var mutationTransformer = ref.mutationTransformer; if ( mutationTransformer === void 0 ) mutationTransformer = function (mut) { return mut; };
var actionFilter = ref.actionFilter; if ( actionFilter === void 0 ) actionFilter = function (action, state) { return true; };
var actionTransformer = ref.actionTransformer; if ( actionTransformer === void 0 ) actionTransformer = function (act) { return act; };
var logMutations = ref.logMutations; if ( logMutations === void 0 ) logMutations = true;
var logActions = ref.logActions; if ( logActions === void 0 ) logActions = true;
var logger = ref.logger; if ( logger === void 0 ) logger = console;
return function (store) {
var prevState = deepCopy(store.state);
if (typeof logger === 'undefined') {
return
}
if (logMutations) {
store.subscribe(function (mutation, state) {
var nextState = deepCopy(state);
if (filter(mutation, prevState, nextState)) {
var formattedTime = getFormattedTime();
var formattedMutation = mutationTransformer(mutation);
var message = "mutation " + (mutation.type) + formattedTime;
startMessage(logger, message, collapsed);
logger.log('%c prev state', 'color: #9E9E9E; font-weight: bold', transformer(prevState));
logger.log('%c mutation', 'color: #03A9F4; font-weight: bold', formattedMutation);
logger.log('%c next state', 'color: #4CAF50; font-weight: bold', transformer(nextState));
endMessage(logger);
}
prevState = nextState;
});
}
if (logActions) {
store.subscribeAction(function (action, state) {
if (actionFilter(action, state)) {
var formattedTime = getFormattedTime();
var formattedAction = actionTransformer(action);
var message = "action " + (action.type) + formattedTime;
startMessage(logger, message, collapsed);
logger.log('%c action', 'color: #03A9F4; font-weight: bold', formattedAction);
endMessage(logger);
}
});
}
}
}
function startMessage (logger, message, collapsed) {
var startMessage = collapsed
? logger.groupCollapsed
: logger.group;
// render
try {
startMessage.call(logger, message);
} catch (e) {
logger.log(message);
}
}
function endMessage (logger) {
try {
logger.groupEnd();
} catch (e) {
logger.log('—— log end ——');
}
}
function getFormattedTime () {
var time = new Date();
return (" @ " + (pad(time.getHours(), 2)) + ":" + (pad(time.getMinutes(), 2)) + ":" + (pad(time.getSeconds(), 2)) + "." + (pad(time.getMilliseconds(), 3)))
}
function repeat (str, times) {
return (new Array(times + 1)).join(str)
}
function pad (num, maxLength) {
return repeat('0', maxLength - num.toString().length) + num
}
var index$2 = {
Store: Store,
install: install,
version: '3.5.1',
mapState: mapState,
mapMutations: mapMutations,
mapGetters: mapGetters,
mapActions: mapActions,
createNamespacedHelpers: createNamespacedHelpers,
createLogger: createLogger
};
const state = {
currentCommit: null,
latestCommit: null,
updateAvailable: false,
deemixVersion: null
};
const actions = {
setAboutInfo({ commit }, payload) {
commit('SET_CURRENT_COMMIT', payload.currentCommit);
commit('SET_LATEST_COMMIT', payload.latestCommit);
commit('SET_UPDATE_AVAILABLE', payload.updateAvailable);
commit('SET_DEEMIX_VERSION', payload.deemixVersion);
}
};
const getters = {
getAboutInfo: state => state
};
const mutations = {
SET_CURRENT_COMMIT: (state, payload) => {
state.currentCommit = payload;
},
SET_LATEST_COMMIT: (state, payload) => {
state.latestCommit = payload;
},
SET_UPDATE_AVAILABLE: (state, payload) => {
state.updateAvailable = payload;
},
SET_DEEMIX_VERSION: (state, payload) => {
state.deemixVersion = payload;
}
};
var about = {
state,
getters,
actions,
mutations
};
const getDefaultState = () => {
return {
arl: localStorage.getItem('arl') || '',
status: null,
user: {
id: null,
name: '',
picture: ''
},
clientMode: false
}
};
const state$1 = getDefaultState();
const actions$1 = {
login({ commit, dispatch }, payload) {
const { arl, user, status } = payload;
dispatch('setARL', { arl });
commit('SET_USER', user);
commit('SET_STATUS', status);
},
logout({ commit }) {
localStorage.removeItem('arl');
commit('RESET_LOGIN');
},
setARL({ commit }, payload) {
let { arl, saveOnLocalStorage } = payload;
saveOnLocalStorage = typeof saveOnLocalStorage === 'undefined' ? true : saveOnLocalStorage;
commit('SET_ARL', arl);
if (saveOnLocalStorage) {
localStorage.setItem('arl', arl);
}
},
removeARL({ commit }) {
commit('SET_ARL', '');
localStorage.removeItem('arl');
},
setUser({ commit }, payload) {
commit('SET_USER', payload);
},
setClientMode({ commit }, payload) {
commit('SET_CLIENT_MODE', payload);
}
};
const getters$1 = {
getARL: state => state.arl,
getUser: state => state.user,
getClientMode: state => state.clientMode,
isLoggedIn: state => !!state.arl
};
const mutations$1 = {
SET_ARL(state, payload) {
state.arl = payload;
},
SET_STATUS(state, payload) {
state.status = payload;
},
SET_USER(state, payload) {
state.user = payload;
},
SET_CLIENT_MODE(state, payload) {
state.clientMode = payload;
},
RESET_LOGIN(state) {
// Needed for reactivity
let clientMode = state.clientMode;
Object.assign(state, getDefaultState());
state.clientMode = clientMode;
}
};
var login = {
state: state$1,
getters: getters$1,
actions: actions$1,
mutations: mutations$1
};
const state$2 = {
artist: '',
bitrate: '',
cover: '',
downloaded: 0,
errors: [],
failed: 0,
id: '',
progress: 0,
silent: true,
size: 0,
title: '',
type: '',
uuid: ''
};
const actions$2 = {
setErrors({ commit }, payload) {
commit('SET_ERRORS', payload);
}
};
const getters$2 = {
getErrors: state => state
};
const mutations$2 = {
SET_ERRORS(state, payload) {
// The payload has useless data for the GUI, so only the needed data is saved in the store
for (const errorName in state) {
if (state.hasOwnProperty(errorName)) {
const error = payload[errorName];
state[errorName] = error;
}
}
}
};
var errors = {
state: state$2,
getters: getters$2,
actions: actions$2,
mutations: mutations$2
};
// Load Vuex
Vue.use(index$2);
// Create store
var store = new index$2.Store({
modules: {
about,
login,
errors
},
strict: "production" !== 'production'
});
const socket = io.connect(window.location.href);
socket.on('init_update', data => {
store.dispatch('setAboutInfo', data);
});
/* script */
/* template */
var __vue_render__ = function (_h,_vm) {var _c=_vm._c;return _c('div',{directives:[{name:"show",rawName:"v-show",value:(!_vm.props.hidden),expression:"!props.hidden"}],staticClass:"flex justify-center items-center flex-col flex-1 h-full",class:_vm.props.additionalClasses},[_c('span',{staticClass:"mb-5"},[_vm._v(_vm._s(_vm.props.text || 'Loading...'))]),_vm._v(" "),_vm._m(0)])};
var __vue_staticRenderFns__ = [function (_h,_vm) {var _c=_vm._c;return _c('div',{staticClass:"lds-ring"},[_c('div'),_vm._v(" "),_c('div'),_vm._v(" "),_c('div'),_vm._v(" "),_c('div')])}];
/* style */
const __vue_inject_styles__ = function (inject) {
if (!inject) return
inject("data-v-20045564_0", { source: ".lds-ring[data-v-20045564]{display:inline-block;position:relative;width:80px;height:80px}.lds-ring div[data-v-20045564]{box-sizing:border-box;display:block;position:absolute;width:64px;height:64px;margin:8px;border:8px solid #fff;border-radius:50%;animation:lds-ring-data-v-20045564 1.2s cubic-bezier(.5,0,.5,1) infinite;border-color:#fff transparent transparent transparent}.lds-ring div[data-v-20045564]:nth-child(1){animation-delay:-.45s}.lds-ring div[data-v-20045564]:nth-child(2){animation-delay:-.3s}.lds-ring div[data-v-20045564]:nth-child(3){animation-delay:-.15s}@keyframes lds-ring-data-v-20045564{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}", map: undefined, media: undefined });
};
/* scoped */
const __vue_scope_id__ = "data-v-20045564";
/* module identifier */
const __vue_module_identifier__ = undefined;
/* functional template */
const __vue_is_functional_template__ = true;
/* component normalizer */
function __vue_normalize__(
template, style, script,
scope, functional, moduleIdentifier,
createInjector, createInjectorSSR
) {
const component = (typeof script === 'function' ? script.options : script) || {};
// For security concerns, we use only base name in production mode.
component.__file = "BaseLoadingPlaceholder.vue";
if (!component.render) {
component.render = template.render;
component.staticRenderFns = template.staticRenderFns;
component._compiled = true;
if (functional) component.functional = true;
}
component._scopeId = scope;
{
let hook;
if (style) {
hook = function(context) {
style.call(this, createInjector(context));
};
}
if (hook !== undefined) {
if (component.functional) {
// register for functional component in vue file
const originalRender = component.render;
component.render = function renderWithStyleInjection(h, context) {
hook.call(context);
return originalRender(h, context)
};
} else {
// inject component registration as beforeCreate hook
const existing = component.beforeCreate;
component.beforeCreate = existing ? [].concat(existing, hook) : [hook];
}
}
}
return component
}
/* style inject */
function __vue_create_injector__() {
const head = document.head || document.getElementsByTagName('head')[0];
const styles = __vue_create_injector__.styles || (__vue_create_injector__.styles = {});
const isOldIE =
typeof navigator !== 'undefined' &&
/msie [6-9]\\b/.test(navigator.userAgent.toLowerCase());
return function addStyle(id, css) {
if (document.querySelector('style[data-vue-ssr-id~="' + id + '"]')) return // SSR styles are present.
const group = isOldIE ? css.media || 'default' : id;
const style = styles[group] || (styles[group] = { ids: [], parts: [], element: undefined });
if (!style.ids.includes(id)) {
let code = css.source;
let index = style.ids.length;
style.ids.push(id);
if ( css.map) {
// https://developer.chrome.com/devtools/docs/javascript-debugging
// this makes source maps inside style tags work properly in Chrome
code += '\n/*# sourceURL=' + css.map.sources[0] + ' */';
// http://stackoverflow.com/a/26603875
code +=
'\n/*# sourceMappingURL=data:application/json;base64,' +
btoa(unescape(encodeURIComponent(JSON.stringify(css.map)))) +
' */';
}
if (isOldIE) {
style.element = style.element || document.querySelector('style[data-group=' + group + ']');
}
if (!style.element) {
const el = style.element = document.createElement('style');
el.type = 'text/css';
if (css.media) el.setAttribute('media', css.media);
if (isOldIE) {
el.setAttribute('data-group', group);
el.setAttribute('data-next-index', '0');
}
head.appendChild(el);
}
if (isOldIE) {
index = parseInt(style.element.getAttribute('data-next-index'));
style.element.setAttribute('data-next-index', index + 1);
}
if (style.element.styleSheet) {
style.parts.push(code);
style.element.styleSheet.cssText = style.parts
.filter(Boolean)
.join('\n');
} else {
const textNode = document.createTextNode(code);
const nodes = style.element.childNodes;
if (nodes[index]) style.element.removeChild(nodes[index]);
if (nodes.length) style.element.insertBefore(textNode, nodes[index]);
else style.element.appendChild(textNode);
}
}
}
}
/* style inject SSR */
var BaseLoadingPlaceholder = __vue_normalize__(
{ render: __vue_render__, staticRenderFns: __vue_staticRenderFns__ },
__vue_inject_styles__,
{},
__vue_scope_id__,
__vue_is_functional_template__,
__vue_module_identifier__,
__vue_create_injector__);
function sendAddToQueue(url, bitrate = null) {
if (!url) throw new Error('No URL given to sendAddToQueue function!')
socket.emit('addToQueue', { url, bitrate }, () => {});
}
function aggregateDownloadLinks(releases) {
let links = [];
releases.forEach(release => {
links.push(release.link);
});
return links.join(';')
}
var Downloads = {
sendAddToQueue
};
/**
* Climbs the DOM until the root is reached, storing every node passed.
* @param {HTMLElement} el
* @return {Array} Contains all the nodes between el and the root
*/
function generatePath(el) {
if (!el) {
throw new Error('No element passed to the generatePath function!')
}
let path = [el];
while ((el = el.parentNode) && el !== document) {
path.push(el);
}
return path
}
function isValidURL(text) {
let lowerCaseText = text.toLowerCase();
if (lowerCaseText.startsWith('http')) {
if (
lowerCaseText.indexOf('deezer.com') >= 0 ||
lowerCaseText.indexOf('deezer.page.link') >= 0 ||
lowerCaseText.indexOf('open.spotify.com') >= 0
) {
return true
}
} else if (lowerCaseText.startsWith('spotify:')) {
return true
}
return false
}
function convertDuration(duration) {
// Convert from seconds only to mm:ss format
let mm, ss;
mm = Math.floor(duration / 60);
ss = duration - mm * 60;
// Add leading zero if ss < 0
if (ss < 10) {
ss = '0' + ss;
}
return mm + ':' + ss
}
function convertDurationSeparated(duration) {
let hh, mm, ss;
mm = Math.floor(duration / 60);
hh = Math.floor(mm / 60);
ss = duration - mm * 60;
mm -= hh * 60;
return [hh, mm, ss]
}
function numberWithDots(x) {
return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, '.')
}
// On scroll event, returns currentTarget = null
// Probably on other events too
function debounce(func, wait, immediate) {
var timeout;
return function() {
var context = this;
var args = arguments;
var later = function() {
timeout = null;
if (!immediate) func.apply(context, args);
};
var callNow = immediate && !timeout;
clearTimeout(timeout);
timeout = setTimeout(later, wait);
if (callNow) func.apply(context, args);
}
}
/**
* Workaround to copy to the clipboard cross-OS by generating a
* ghost input and copying the passed String
*
* @param {string} text Text to copy
*/
function copyToClipboard(text) {
const ghostInput = document.createElement('input');
document.body.appendChild(ghostInput);
ghostInput.setAttribute('type', 'text');
ghostInput.setAttribute('value', text);
ghostInput.select();
ghostInput.setSelectionRange(0, 99999);
document.execCommand('copy');
ghostInput.remove();
}
function getProperty(obj, ...props) {
for (const prop of props) {
// Example: this.is.an.example
let hasDotNotation = /\./.test(prop);
// Searching the properties in the object
let valueToTest = hasDotNotation
? prop.split('.').reduce((o, i) => {
if (o) {
return o[i]
}
}, obj)
: obj[prop];
if ('undefined' !== typeof valueToTest) {
return valueToTest
}
}
return null
}
var Utils = {
isValidURL,
convertDuration,
convertDurationSeparated,
numberWithDots,
debounce
};
const downloadQualities = [
{
objName: 'flac',
label: 'FLAC',
value: 9
},
{
objName: '320kbps',
label: 'MP3 320kbps',
value: 3
},
{
objName: '128kbps',
label: 'MP3 128kbps',
value: 1
},
{
objName: 'realityAudioHQ',
label: '360 Reality Audio [HQ]',
value: 15
},
{
objName: 'realityAudioMQ',
label: '360 Reality Audio [MQ]',
value: 14
},
{
objName: 'realityAudioLQ',
label: '360 Reality Audio [LQ]',
value: 13
}
];
//
var script = {
data() {
return {
menuOpen: false,
xPos: 0,
yPos: 0,
deezerHref: '',
generalHref: '',
imgSrc: ''
}
},
computed: {
options() {
// In the action property:
// Use arrow functions to keep the Vue instance in 'this'
// Use normal functions to keep the object instance in 'this'
const options = {
cut: {
label: this.$t('globals.cut'),
show: false,
position: 1,
action: () => {
document.execCommand('Cut');
}
},
copy: {
label: this.$t('globals.copy'),
show: false,
position: 2,
action: () => {
document.execCommand('Copy');
}
},
copyLink: {
label: this.$t('globals.copyLink'),
show: false,
position: 3,
action: () => {
copyToClipboard(this.generalHref);
}
},
copyImageLink: {
label: this.$t('globals.copyImageLink'),
show: false,
position: 4,
action: () => {
copyToClipboard(this.imgSrc);
}
},
copyDeezerLink: {
label: this.$t('globals.copyDeezerLink'),
show: false,
position: 5,
action: () => {
copyToClipboard(this.deezerHref);
}
},
paste: {
label: this.$t('globals.paste'),
show: false,
position: 6,
action: () => {
// Paste does not always work
if (clipboard in navigator) {
navigator.clipboard.readText().then(text => {
document.execCommand('insertText', undefined, text);
});
} else {
document.execCommand('paste');
}
}
}
};
let nextValuePosition = Object.values(options).length + 1;
downloadQualities.forEach((quality, index) => {
options[quality.objName] = {
label: `${this.$t('globals.download', { thing: quality.label })}`,
show: false,
position: nextValuePosition + index,
action: sendAddToQueue.bind(null, this.deezerHref, quality.value)
};
});
return options
},
/**
* This computed property is used for rendering the options in the wanted order
* while keeping the options computed property an Object to make the properties
* accessible via property name (es this.options.copyLink)
*
* @return {object[]} Options in order according to position property
*/
sortedOptions() {
return Object.values(this.options).sort((first, second) => {
return first.position < second.position ? -1 : 1
})
}
},
mounted() {
document.body.addEventListener('contextmenu', this.showMenu);
document.body.addEventListener('click', this.hideMenu);
},
methods: {
showMenu(contextMenuEvent) {
const { pageX, pageY, target: elementClicked } = contextMenuEvent;
const path = generatePath(elementClicked);
let deezerLink = null;
// Searching for the first element with a data-link attribute
// let deezerLink = this.searchForDataLink(...)
for (let i = 0; i < path.length; i++) {
if (path[i] == document) break
if (path[i].matches('[data-link]')) {
deezerLink = path[i].dataset.link;
break
}
}
const isLink = elementClicked.matches('a');
const isImage = elementClicked.matches('img');
const hasDeezerLink = !!deezerLink;
if (!isLink && !isImage && !hasDeezerLink) return
contextMenuEvent.preventDefault();
this.menuOpen = true;
this.positionMenu(pageX, pageY);
if (isLink) {
// Show 'Copy Link' option
this.generalHref = elementClicked.href;
this.options.copyLink.show = true;
}
if (isImage) {
// Show 'Copy Image Link' option
this.imgSrc = elementClicked.src;
this.options.copyImageLink.show = true;
}
if (deezerLink) {
// Show 'Copy Deezer Link' option
this.deezerHref = deezerLink;
this.showDeezerOptions();
}
},
hideMenu() {
if (!this.menuOpen) return
// Finish all operations before closing (may be not necessary)
this.$nextTick()
.then(() => {
this.menuOpen = false;
this.options.copyLink.show = false;
this.options.copyDeezerLink.show = false;
this.options.copyImageLink.show = false;
downloadQualities.forEach(quality => {
this.options[quality.objName].show = false;
});
})
.catch(err => {
console.error(err);
});
},
positionMenu(newX, newY) {
this.xPos = `${newX}px`;
this.yPos = `${newY}px`;
this.$nextTick().then(() => {
const { innerHeight, innerWidth } = window;
const menuXOffest = newX + this.$refs.contextMenu.getBoundingClientRect().width;
const menuYOffest = newY + this.$refs.contextMenu.getBoundingClientRect().height;
if (menuXOffest > innerWidth) {
const difference = menuXOffest - innerWidth + 15;
this.xPos = `${newX - difference}px`;
}
if (menuYOffest > innerHeight) {
const difference = menuYOffest - innerHeight + 15;
this.yPos = `${newY - difference}px`;
}
});
},
showDeezerOptions() {
this.options.copyDeezerLink.show = true;
downloadQualities.forEach(quality => {
this.options[quality.objName].show = true;
});
}
}
};
/* script */
const __vue_script__ = script;
/* template */
var __vue_render__$1 = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{directives:[{name:"show",rawName:"v-show",value:(_vm.menuOpen),expression:"menuOpen"}],ref:"contextMenu",staticClass:"context-menu",style:({ top: _vm.yPos, left: _vm.xPos })},_vm._l((_vm.sortedOptions),function(option){return _c('button',{directives:[{name:"show",rawName:"v-show",value:(option.show),expression:"option.show"}],key:option.label,staticClass:"btn menu-option",on:{"click":function($event){$event.preventDefault();return option.action($event)}}},[_c('span',{staticClass:"menu-option__text"},[_vm._v(_vm._s(option.label))])])}),0)};
var __vue_staticRenderFns__$1 = [];
/* style */
const __vue_inject_styles__$1 = function (inject) {
if (!inject) return
inject("data-v-b75ae3cc_0", { source: ".context-menu[data-v-b75ae3cc]{position:absolute;top:0;left:0;min-width:100px;border-radius:7px;background:var(--secondary-background);box-shadow:4px 10px 18px 0 rgba(0,0,0,.15);overflow:hidden;z-index:10000}.menu-option[data-v-b75ae3cc]{display:flex;align-items:center;width:100%;height:40px;padding-left:10px;padding-right:10px;color:var(--foreground);cursor:pointer}.menu-option[data-v-b75ae3cc]:hover{background:var(--table-highlight);filter:brightness(150%)}.menu-option__text[data-v-b75ae3cc]{text-transform:capitalize}button[data-v-b75ae3cc]{color:var(--primary-text);color:unset;background-color:var(--primary-color);background-color:unset;min-width:unset;position:unset;border:unset;border-radius:unset;font-family:unset;font-weight:unset;font-size:unset;padding:unset;margin-right:unset;height:unset;text-transform:unset;cursor:unset;transition:unset}button[data-v-b75ae3cc]:focus{outline:0}button[data-v-b75ae3cc]:active{background-color:unset;transform:unset}button[data-v-b75ae3cc]:hover{background:unset;border:unset}", map: undefined, media: undefined });
};
/* scoped */
const __vue_scope_id__$1 = "data-v-b75ae3cc";
/* module identifier */
const __vue_module_identifier__$1 = undefined;
/* functional template */
const __vue_is_functional_template__$1 = false;
/* component normalizer */
function __vue_normalize__$1(
template, style, script,
scope, functional, moduleIdentifier,
createInjector, createInjectorSSR
) {
const component = (typeof script === 'function' ? script.options : script) || {};
// For security concerns, we use only base name in production mode.
component.__file = "TheContextMenu.vue";
if (!component.render) {
component.render = template.render;
component.staticRenderFns = template.staticRenderFns;
component._compiled = true;
if (functional) component.functional = true;
}
component._scopeId = scope;
{
let hook;
if (style) {
hook = function(context) {
style.call(this, createInjector(context));
};
}
if (hook !== undefined) {
if (component.functional) {
// register for functional component in vue file
const originalRender = component.render;
component.render = function renderWithStyleInjection(h, context) {
hook.call(context);
return originalRender(h, context)
};
} else {
// inject component registration as beforeCreate hook
const existing = component.beforeCreate;
component.beforeCreate = existing ? [].concat(existing, hook) : [hook];
}
}
}
return component
}
/* style inject */
function __vue_create_injector__$1() {
const head = document.head || document.getElementsByTagName('head')[0];
const styles = __vue_create_injector__$1.styles || (__vue_create_injector__$1.styles = {});
const isOldIE =
typeof navigator !== 'undefined' &&
/msie [6-9]\\b/.test(navigator.userAgent.toLowerCase());
return function addStyle(id, css) {
if (document.querySelector('style[data-vue-ssr-id~="' + id + '"]')) return // SSR styles are present.
const group = isOldIE ? css.media || 'default' : id;
const style = styles[group] || (styles[group] = { ids: [], parts: [], element: undefined });
if (!style.ids.includes(id)) {
let code = css.source;
let index = style.ids.length;
style.ids.push(id);
if ( css.map) {
// https://developer.chrome.com/devtools/docs/javascript-debugging
// this makes source maps inside style tags work properly in Chrome
code += '\n/*# sourceURL=' + css.map.sources[0] + ' */';
// http://stackoverflow.com/a/26603875
code +=
'\n/*# sourceMappingURL=data:application/json;base64,' +
btoa(unescape(encodeURIComponent(JSON.stringify(css.map)))) +
' */';
}
if (isOldIE) {
style.element = style.element || document.querySelector('style[data-group=' + group + ']');
}
if (!style.element) {
const el = style.element = document.createElement('style');
el.type = 'text/css';
if (css.media) el.setAttribute('media', css.media);
if (isOldIE) {
el.setAttribute('data-group', group);
el.setAttribute('data-next-index', '0');
}
head.appendChild(el);
}
if (isOldIE) {
index = parseInt(style.element.getAttribute('data-next-index'));
style.element.setAttribute('data-next-index', index + 1);
}
if (style.element.styleSheet) {
style.parts.push(code);
style.element.styleSheet.cssText = style.parts
.filter(Boolean)
.join('\n');
} else {
const textNode = document.createTextNode(code);
const nodes = style.element.childNodes;
if (nodes[index]) style.element.removeChild(nodes[index]);
if (nodes.length) style.element.insertBefore(textNode, nodes[index]);
else style.element.appendChild(textNode);
}
}
}
}
/* style inject SSR */
var TheContextMenu = __vue_normalize__$1(
{ render: __vue_render__$1, staticRenderFns: __vue_staticRenderFns__$1 },
__vue_inject_styles__$1,
__vue_script__,
__vue_scope_id__$1,
__vue_is_functional_template__$1,
__vue_module_identifier__$1,
__vue_create_injector__$1);
// https://alligator.io/vuejs/global-event-bus/
var EventBus = new Vue();
// https://stackoverflow.com/questions/7451508/html5-audio-playback-with-fade-in-and-fade-out#answer-13149848
async function adjustVolume(element, newVolume, { duration = 1000, easing = swing, interval = 13 } = {}) {
const originalVolume = element.volume;
const delta = newVolume - originalVolume;
if (!delta || !duration || !easing || !interval) {
element.volume = newVolume;
return Promise.resolve()
}
const ticks = Math.floor(duration / interval);
let tick = 1;
return new Promise(resolve => {
const timer = setInterval(() => {
element.volume = originalVolume + easing(tick / ticks) * delta;
if (++tick === ticks) {
clearInterval(timer);
resolve();
}
}, interval);
})
}
function swing(p) {
return 0.5 - Math.cos(p * Math.PI) / 2
}
//
var script$1 = {
data: () => ({
previewStopped: false
}),
mounted() {
this.$refs.preview.volume = 1;
this.$router.beforeEach((to, from, next) => {
this.stopStackedTabsPreview();
next();
});
EventBus.$on('trackPreview:playPausePreview', this.playPausePreview);
EventBus.$on('trackPreview:previewMouseEnter', this.previewMouseEnter);
EventBus.$on('trackPreview:previewMouseLeave', this.previewMouseLeave);
},
methods: {
async onCanPlay() {
await this.$refs.preview.play();
this.previewStopped = false;
await adjustVolume(this.$refs.preview, window.vol.preview_max_volume / 100, { duration: 500 });
},
async onTimeUpdate() {
// Prevents first time entering in this function
if (isNaN(this.$refs.preview.duration)) return
let duration = this.$refs.preview.duration;
if (!isFinite(duration)) {
duration = 30;
}
if (duration - this.$refs.preview.currentTime >= 1) return
if (this.previewStopped) return
await adjustVolume(this.$refs.preview, 0, { duration: 800 });
this.previewStopped = true;
document.querySelectorAll('a[playing] > .preview_controls').forEach(control => {
control.style.opacity = 0;
});
document.querySelectorAll('*').forEach(el => {
el.removeAttribute('playing');
});
document.querySelectorAll('.preview_controls, .preview_playlist_controls').forEach(el => {
el.textContent = 'play_arrow';
});
},
async playPausePreview(e) {
e.preventDefault();
e.stopPropagation();
const { currentTarget: obj } = e;
var icon = obj.tagName == 'I' ? obj : obj.querySelector('i');
if (obj.hasAttribute('playing')) {
if (this.$refs.preview.paused) {
this.$refs.preview.play();
this.previewStopped = false;
icon.innerText = 'pause';
await adjustVolume(this.$refs.preview, window.vol.preview_max_volume / 100, { duration: 500 });
} else {
this.previewStopped = true;
icon.innerText = 'play_arrow';
await adjustVolume(this.$refs.preview, 0, { duration: 250 });
this.$refs.preview.pause();
}
} else {
document.querySelectorAll('*').forEach(el => {
el.removeAttribute('playing');
});
obj.setAttribute('playing', true);
document.querySelectorAll('.preview_controls, .preview_playlist_controls').forEach(el => {
el.textContent = 'play_arrow';
});
document.querySelectorAll('.preview_controls').forEach(el => {
el.style.opacity = 0;
});
icon.innerText = 'pause';
icon.style.opacity = 1;
this.previewStopped = false;
await adjustVolume(this.$refs.preview, 0, { duration: 250 });
this.$refs.preview.pause();
document.getElementById('preview-track_source').src = obj.getAttribute('data-preview');
this.$refs.preview.load();
}
},
async stopStackedTabsPreview() {
let controls = Array.prototype.slice.call(document.querySelectorAll('.preview_playlist_controls[playing]'));
if (controls.length === 0) return
await adjustVolume(this.$refs.preview, 0, { duration: 250 });
this.$refs.preview.pause();
this.previewStopped = true;
controls.forEach(control => {
control.removeAttribute('playing');
control.innerText = 'play_arrow';
});
},
previewMouseEnter(e) {
e.currentTarget.style.opacity = 1;
},
previewMouseLeave(event) {
const { currentTarget: obj } = event;
const parentIsPlaying = obj.parentElement.hasAttribute('playing');
if ((parentIsPlaying && this.previewStopped) || !parentIsPlaying) {
obj.style.opacity = 0;
}
}
}
};
/* script */
const __vue_script__$1 = script$1;
/* template */
var __vue_render__$2 = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('audio',{ref:"preview",attrs:{"id":"preview-track"},on:{"canplay":_vm.onCanPlay,"timeupdate":_vm.onTimeUpdate}},[_c('source',{attrs:{"id":"preview-track_source","src":"","type":"audio/mpeg"}})])};
var __vue_staticRenderFns__$2 = [];
/* style */
const __vue_inject_styles__$2 = undefined;
/* scoped */
const __vue_scope_id__$2 = undefined;
/* functional template */
const __vue_is_functional_template__$2 = false;
/* component normalizer */
function __vue_normalize__$2(
template, style, script,
scope, functional, moduleIdentifier,
createInjector, createInjectorSSR
) {
const component = (typeof script === 'function' ? script.options : script) || {};
// For security concerns, we use only base name in production mode.
component.__file = "TheTrackPreview.vue";
if (!component.render) {
component.render = template.render;
component.staticRenderFns = template.staticRenderFns;
component._compiled = true;
if (functional) component.functional = true;
}
component._scopeId = scope;
return component
}
/* style inject */
/* style inject SSR */
var TheTrackPreview = __vue_normalize__$2(
{ render: __vue_render__$2, staticRenderFns: __vue_staticRenderFns__$2 },
__vue_inject_styles__$2,
__vue_script__$1,
__vue_scope_id__$2,
__vue_is_functional_template__$2);
//
var script$2 = {
data: () => ({
open: false,
url: ''
}),
mounted() {
this.$root.$on('QualityModal:open', this.openModal);
this.$refs.modal.addEventListener('webkitAnimationEnd', this.handleAnimationEnd);
},
methods: {
tryToDownloadTrack(event) {
const { target } = event;
this.$refs.modal.classList.add('animated', 'fadeOut');
// If true, the click did not happen on a button but outside
if (!target.matches('.quality-button')) return
Downloads.sendAddToQueue(this.url, target.dataset.qualityValue);
},
openModal(link) {
this.url = link;
this.open = true;
this.$refs.modal.classList.add('animated', 'fadeIn');
},
handleAnimationEnd(event) {
const { animationName } = event;
this.$refs.modal.classList.remove('animated', animationName);
if (animationName === 'fadeIn') return
this.open = false;
}
}
};
/* script */
const __vue_script__$2 = script$2;
/* template */
var __vue_render__$3 = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{directives:[{name:"show",rawName:"v-show",value:(_vm.open),expression:"open"}],ref:"modal",staticClass:"smallmodal",attrs:{"id":"modal_quality"},on:{"click":function($event){return _vm.tryToDownloadTrack($event)}}},[_c('div',{staticClass:"smallmodal-content"},[_c('button',{staticClass:"btn btn-primary quality-button",attrs:{"data-quality-value":"9"}},[_vm._v("\n\t\t\t"+_vm._s(_vm.$t('globals.download', { thing: 'FLAC' }))+"\n\t\t")]),_vm._v(" "),_c('button',{staticClass:"btn btn-primary quality-button",attrs:{"data-quality-value":"3"}},[_vm._v("\n\t\t\t"+_vm._s(_vm.$t('globals.download', { thing: 'MP3 320kbps' }))+"\n\t\t")]),_vm._v(" "),_c('button',{staticClass:"btn btn-primary quality-button",attrs:{"data-quality-value":"1"}},[_vm._v("\n\t\t\t"+_vm._s(_vm.$t('globals.download', { thing: 'MP3 128kbps' }))+"\n\t\t")]),_vm._v(" "),_c('button',{staticClass:"btn btn-primary quality-button",attrs:{"data-quality-value":"15"}},[_vm._v("\n\t\t\t"+_vm._s(_vm.$t('globals.download', { thing: '360 Reality Audio [HQ]' }))+"\n\t\t")]),_vm._v(" "),_c('button',{staticClass:"btn btn-primary quality-button",attrs:{"data-quality-value":"14"}},[_vm._v("\n\t\t\t"+_vm._s(_vm.$t('globals.download', { thing: '360 Reality Audio [MQ]' }))+"\n\t\t")]),_vm._v(" "),_c('button',{staticClass:"btn btn-primary quality-button",attrs:{"data-quality-value":"13"}},[_vm._v("\n\t\t\t"+_vm._s(_vm.$t('globals.download', { thing: '360 Reality Audio [LQ]' }))+"\n\t\t")])])])};
var __vue_staticRenderFns__$3 = [];
/* style */
const __vue_inject_styles__$3 = function (inject) {
if (!inject) return
inject("data-v-e99efdea_0", { source: ".smallmodal{position:fixed;z-index:1250;left:0;top:0;width:100%;height:100%;overflow:auto;background-color:rgba(0,0,0,.4);animation-duration:.3s}.smallmodal-content{--modal-content-width:95%;background-color:transparent;margin:auto;width:var(--modal-content-width);position:relative;top:50%;transform:translateY(-50%)}@media only screen and (min-width:601px){.smallmodal-content{--modal-content-width:85%}}@media only screen and (min-width:993px){.smallmodal-content{--modal-content-width:70%}}.smallmodal-content button{width:100%;margin-bottom:8px}", map: undefined, media: undefined });
};
/* scoped */
const __vue_scope_id__$3 = undefined;
/* module identifier */
const __vue_module_identifier__$2 = undefined;
/* functional template */
const __vue_is_functional_template__$3 = false;
/* component normalizer */
function __vue_normalize__$3(
template, style, script,
scope, functional, moduleIdentifier,
createInjector, createInjectorSSR
) {
const component = (typeof script === 'function' ? script.options : script) || {};
// For security concerns, we use only base name in production mode.
component.__file = "TheQualityModal.vue";
if (!component.render) {
component.render = template.render;
component.staticRenderFns = template.staticRenderFns;
component._compiled = true;
if (functional) component.functional = true;
}
component._scopeId = scope;
{
let hook;
if (style) {
hook = function(context) {
style.call(this, createInjector(context));
};
}
if (hook !== undefined) {
if (component.functional) {
// register for functional component in vue file
const originalRender = component.render;
component.render = function renderWithStyleInjection(h, context) {
hook.call(context);
return originalRender(h, context)
};
} else {
// inject component registration as beforeCreate hook
const existing = component.beforeCreate;
component.beforeCreate = existing ? [].concat(existing, hook) : [hook];
}
}
}
return component
}
/* style inject */
function __vue_create_injector__$2() {
const head = document.head || document.getElementsByTagName('head')[0];
const styles = __vue_create_injector__$2.styles || (__vue_create_injector__$2.styles = {});
const isOldIE =
typeof navigator !== 'undefined' &&
/msie [6-9]\\b/.test(navigator.userAgent.toLowerCase());
return function addStyle(id, css) {
if (document.querySelector('style[data-vue-ssr-id~="' + id + '"]')) return // SSR styles are present.
const group = isOldIE ? css.media || 'default' : id;
const style = styles[group] || (styles[group] = { ids: [], parts: [], element: undefined });
if (!style.ids.includes(id)) {
let code = css.source;
let index = style.ids.length;
style.ids.push(id);
if ( css.map) {
// https://developer.chrome.com/devtools/docs/javascript-debugging
// this makes source maps inside style tags work properly in Chrome
code += '\n/*# sourceURL=' + css.map.sources[0] + ' */';
// http://stackoverflow.com/a/26603875
code +=
'\n/*# sourceMappingURL=data:application/json;base64,' +
btoa(unescape(encodeURIComponent(JSON.stringify(css.map)))) +
' */';
}
if (isOldIE) {
style.element = style.element || document.querySelector('style[data-group=' + group + ']');
}
if (!style.element) {
const el = style.element = document.createElement('style');
el.type = 'text/css';
if (css.media) el.setAttribute('media', css.media);
if (isOldIE) {
el.setAttribute('data-group', group);
el.setAttribute('data-next-index', '0');
}
head.appendChild(el);
}
if (isOldIE) {
index = parseInt(style.element.getAttribute('data-next-index'));
style.element.setAttribute('data-next-index', index + 1);
}
if (style.element.styleSheet) {
style.parts.push(code);
style.element.styleSheet.cssText = style.parts
.filter(Boolean)
.join('\n');
} else {
const textNode = document.createTextNode(code);
const nodes = style.element.childNodes;
if (nodes[index]) style.element.removeChild(nodes[index]);
if (nodes.length) style.element.insertBefore(textNode, nodes[index]);
else style.element.appendChild(textNode);
}
}
}
}
/* style inject SSR */
var TheQualityModal = __vue_normalize__$3(
{ render: __vue_render__$3, staticRenderFns: __vue_staticRenderFns__$3 },
__vue_inject_styles__$3,
__vue_script__$2,
__vue_scope_id__$3,
__vue_is_functional_template__$3,
__vue_module_identifier__$2,
__vue_create_injector__$2);
//
var script$3 = {
data() {
return {
appOnline: null,
activeTheme: 'light',
themes: ['purple', 'dark', 'light'],
activeTablink: 'home',
updateAvailable: false,
links: [
{
id: 'main_home_tablink',
name: 'home',
ariaLabel: 'home',
routerName: 'Home',
icon: 'home',
label: 'sidebar.home'
},
{
id: 'main_search_tablink',
name: 'search',
ariaLabel: 'search',
routerName: 'Search',
icon: 'search',
label: 'sidebar.search'
},
{
id: 'main_charts_tablink',
name: 'charts',
ariaLabel: 'charts',
routerName: 'Charts',
icon: 'show_chart',
label: 'sidebar.charts'
},
{
id: 'main_favorites_tablink',
name: 'favorites',
ariaLabel: 'favorites',
routerName: 'Favorites',
icon: 'star',
label: 'sidebar.favorites'
},
{
id: 'main_analyzer_tablink',
name: 'analyzer',
ariaLabel: 'link analyzer',
routerName: 'Link Analyzer',
icon: 'link',
label: 'sidebar.linkAnalyzer'
},
{
id: 'main_settings_tablink',
name: 'settings',
ariaLabel: 'settings',
routerName: 'Settings',
icon: 'settings',
label: 'sidebar.settings'
},
{
id: 'main_about_tablink',
name: 'about',
ariaLabel: 'info',
routerName: 'About',
icon: 'info',
label: 'sidebar.about'
}
]
}
},
mounted() {
/* === Online status handling === */
this.appOnline = navigator.onLine;
window.addEventListener('online', () => {
this.appOnline = true;
});
window.addEventListener('offline', () => {
this.appOnline = false;
});
/* === Current theme handling === */
this.activeTheme = localStorage.getItem('selectedTheme') || 'dark';
this.$router.afterEach((to, from) => {
const linkInSidebar = this.links.find(link => link.routerName === to.name);
if (!linkInSidebar) return
this.activeTablink = linkInSidebar.name;
});
/* === Add update notification near info === */
socket.on('updateAvailable', () => {
this.updateAvailable = true;
});
// Check if download tab has slim entries
if ('true' === localStorage.getItem('slimSidebar')) {
this.$refs.sidebar.classList.add('slim');
}
},
methods: {
changeTheme(newTheme) {
if (newTheme === this.activeTheme) return
this.activeTheme = newTheme;
document.documentElement.setAttribute('data-theme', newTheme);
localStorage.setItem('selectedTheme', newTheme);
// Animating everything to have a smoother theme switch
const allElements = document.querySelectorAll('*');
allElements.forEach(el => {
el.classList.add('changing-theme');
});
document.documentElement.addEventListener('transitionend', function transitionHandler() {
allElements.forEach(el => {
el.classList.remove('changing-theme');
});
document.documentElement.removeEventListener('transitionend', transitionHandler);
});
}
}
};
/* script */
const __vue_script__$3 = script$3;
/* template */
var __vue_render__$4 = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('aside',{ref:"sidebar",staticClass:"top-0 left-0 flex flex-col w-64 h-screen bg-panels-bg text-foreground",attrs:{"id":"sidebar","role":"navigation","aria-label":"sidebar"}},[_vm._l((_vm.links),function(link){return _c('router-link',{key:link.id,staticClass:"relative flex items-center h-16 no-underline group main_tablinks hover:bg-background-main text-foreground",class:{ 'bg-background-main': _vm.activeTablink === link.name },attrs:{"tag":"a","id":link.id,"aria-label":link.ariaLabel,"to":{ name: link.routerName }},nativeOn:{"click":function($event){_vm.activeTablink = link.name;}}},[_c('i',{staticClass:"p-2 text-3xl material-icons side_icon group-hover:text-primary",class:{ 'text-primary': _vm.activeTablink === link.name }},[_vm._v("\n\t\t\t"+_vm._s(link.icon)+"\n\t\t")]),_vm._v(" "),_c('span',{staticClass:"ml-5 overflow-hidden capitalize whitespace-no-wrap main_tablinks_text",staticStyle:{"letter-spacing":"1.3px"}},[_vm._v("\n\t\t\t"+_vm._s(_vm.$t(link.label))+"\n\t\t")]),_vm._v(" "),(link.name === 'about' && _vm.updateAvailable)?_c('span',{staticClass:"w-3 h-3 bg-red-600 rounded-full",attrs:{"id":"update-notification"}}):_vm._e()])}),_vm._v(" "),_c('span',{staticClass:"flex h-12 mt-5",attrs:{"id":"theme_selector","role":"link","aria-label":"theme selector"}},[_c('i',{staticClass:"p-2 text-3xl transition-all duration-500 cursor-default material-icons side_icon side_icon--theme"},[_vm._v("\n\t\t\tbrush\n\t\t")]),_vm._v(" "),_c('div',{staticClass:"relative flex items-center w-full justify-evenly",attrs:{"id":"theme_togglers"}},_vm._l((_vm.themes),function(theme){return _c('div',{key:theme,staticClass:"w-6 h-6 border rounded-full cursor-pointer theme_toggler border-grayscale-500",class:[{ 'theme_toggler--active': _vm.activeTheme === theme }, ("theme_toggler--" + theme)],on:{"click":function($event){return _vm.changeTheme(theme)}}})}),0)]),_vm._v(" "),_c('div',{class:{ online: _vm.appOnline, offline: !_vm.appOnline },attrs:{"id":"network-status"}},[(_vm.appOnline)?_c('i',{staticClass:"material-icons"},[_vm._v("wifi")]):_c('i',{staticClass:"material-icons"},[_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","viewBox":"0 0 24 24"}},[_c('path',{attrs:{"d":"M24 .01c0-.01 0-.01 0 0L0 0v24h24V.01zM0 0h24v24H0V0zm0 0h24v24H0V0z","fill":"none"}}),_vm._v(" "),_c('path',{attrs:{"d":"M22.99 9C19.15 5.16 13.8 3.76 8.84 4.78l2.52 2.52c3.47-.17 6.99 1.05 9.63 3.7l2-2zm-4 4c-1.29-1.29-2.84-2.13-4.49-2.56l3.53 3.53.96-.97zM2 3.05L5.07 6.1C3.6 6.82 2.22 7.78 1 9l1.99 2c1.24-1.24 2.67-2.16 4.2-2.77l2.24 2.24C7.81 10.89 6.27 11.73 5 13v.01L6.99 15c1.36-1.36 3.14-2.04 4.92-2.06L18.98 20l1.27-1.26L3.29 1.79 2 3.05zM9 17l3 3 3-3c-1.65-1.66-4.34-1.66-6 0z"}})])])])],2)};
var __vue_staticRenderFns__$4 = [];
/* style */
const __vue_inject_styles__$4 = function (inject) {
if (!inject) return
inject("data-v-2a652e15_0", { source: "#sidebar.slim[data-v-2a652e15]{width:46px}#sidebar.slim .main_tablinks_text[data-v-2a652e15]{display:none}#sidebar.slim #theme_selector[data-v-2a652e15],#sidebar.slim #theme_togglers[data-v-2a652e15]{display:inline-grid;grid-gap:8px}#network-status[data-v-2a652e15]{display:flex;justify-content:center;align-items:center;position:relative;margin-top:auto;bottom:0}#network-status.online i.material-icons[data-v-2a652e15]{color:#159957}#network-status.offline i.material-icons svg[data-v-2a652e15]{fill:red;width:1em;height:1em}#update-notification[data-v-2a652e15]{position:absolute;left:30px;top:12px}.theme_toggler[data-v-2a652e15]{transition:border .2s ease-in-out}.theme_toggler--active[data-v-2a652e15]{border-width:3px}.theme_toggler--light[data-v-2a652e15]{background-color:#fff}.theme_toggler--dark[data-v-2a652e15]{background-color:#141414}.theme_toggler--purple[data-v-2a652e15]{background:#460eaf}", map: undefined, media: undefined });
};
/* scoped */
const __vue_scope_id__$4 = "data-v-2a652e15";
/* module identifier */
const __vue_module_identifier__$3 = undefined;
/* functional template */
const __vue_is_functional_template__$4 = false;
/* component normalizer */
function __vue_normalize__$4(
template, style, script,
scope, functional, moduleIdentifier,
createInjector, createInjectorSSR
) {
const component = (typeof script === 'function' ? script.options : script) || {};
// For security concerns, we use only base name in production mode.
component.__file = "TheSidebar.vue";
if (!component.render) {
component.render = template.render;
component.staticRenderFns = template.staticRenderFns;
component._compiled = true;
if (functional) component.functional = true;
}
component._scopeId = scope;
{
let hook;
if (style) {
hook = function(context) {
style.call(this, createInjector(context));
};
}
if (hook !== undefined) {
if (component.functional) {
// register for functional component in vue file
const originalRender = component.render;
component.render = function renderWithStyleInjection(h, context) {
hook.call(context);
return originalRender(h, context)
};
} else {
// inject component registration as beforeCreate hook
const existing = component.beforeCreate;
component.beforeCreate = existing ? [].concat(existing, hook) : [hook];
}
}
}
return component
}
/* style inject */
function __vue_create_injector__$3() {
const head = document.head || document.getElementsByTagName('head')[0];
const styles = __vue_create_injector__$3.styles || (__vue_create_injector__$3.styles = {});
const isOldIE =
typeof navigator !== 'undefined' &&
/msie [6-9]\\b/.test(navigator.userAgent.toLowerCase());
return function addStyle(id, css) {
if (document.querySelector('style[data-vue-ssr-id~="' + id + '"]')) return // SSR styles are present.
const group = isOldIE ? css.media || 'default' : id;
const style = styles[group] || (styles[group] = { ids: [], parts: [], element: undefined });
if (!style.ids.includes(id)) {
let code = css.source;
let index = style.ids.length;
style.ids.push(id);
if ( css.map) {
// https://developer.chrome.com/devtools/docs/javascript-debugging
// this makes source maps inside style tags work properly in Chrome
code += '\n/*# sourceURL=' + css.map.sources[0] + ' */';
// http://stackoverflow.com/a/26603875
code +=
'\n/*# sourceMappingURL=data:application/json;base64,' +
btoa(unescape(encodeURIComponent(JSON.stringify(css.map)))) +
' */';
}
if (isOldIE) {
style.element = style.element || document.querySelector('style[data-group=' + group + ']');
}
if (!style.element) {
const el = style.element = document.createElement('style');
el.type = 'text/css';
if (css.media) el.setAttribute('media', css.media);
if (isOldIE) {
el.setAttribute('data-group', group);
el.setAttribute('data-next-index', '0');
}
head.appendChild(el);
}
if (isOldIE) {
index = parseInt(style.element.getAttribute('data-next-index'));
style.element.setAttribute('data-next-index', index + 1);
}
if (style.element.styleSheet) {
style.parts.push(code);
style.element.styleSheet.cssText = style.parts
.filter(Boolean)
.join('\n');
} else {
const textNode = document.createTextNode(code);
const nodes = style.element.childNodes;
if (nodes[index]) style.element.removeChild(nodes[index]);
if (nodes.length) style.element.insertBefore(textNode, nodes[index]);
else style.element.appendChild(textNode);
}
}
}
}
/* style inject SSR */
var TheSidebar = __vue_normalize__$4(
{ render: __vue_render__$4, staticRenderFns: __vue_staticRenderFns__$4 },
__vue_inject_styles__$4,
__vue_script__$3,
__vue_scope_id__$4,
__vue_is_functional_template__$4,
__vue_module_identifier__$3,
__vue_create_injector__$3);
//
var script$4 = {
data() {
return {
lastTextSearch: ''
}
},
created() {
const focusSearchBar = keyEvent => {
if (keyEvent.keyCode === 70 && keyEvent.ctrlKey) {
keyEvent.preventDefault();
this.$refs.searchbar.focus();
}
};
const deleteSearchBarContent = keyEvent => {
if (!(keyEvent.key == 'Backspace' && keyEvent.ctrlKey && keyEvent.shiftKey)) return
this.$refs.searchbar.value = '';
this.$refs.searchbar.focus();
};
document.addEventListener('keydown', focusSearchBar);
document.addEventListener('keyup', deleteSearchBarContent);
this.$on('hook:destroyed', () => {
document.removeEventListener('keydown', focusSearchBar);
document.removeEventListener('keyup', deleteSearchBarContent);
});
},
methods: {
test() {
console.log('test passato');
},
async handleSearchBarKeyup(keyEvent) {
let isEnterPressed = keyEvent.keyCode === 13;
// If not enter do nothing
if (!isEnterPressed) return
let term = this.$refs.searchbar.value;
let isEmptySearch = term === '';
// If empty do nothing
if (isEmptySearch) return
let isSearchingURL = isValidURL(term);
let isCtrlPressed = keyEvent.ctrlKey;
let isShowingAnalyzer = this.$route.name === 'Link Analyzer';
let isShowingSearch = this.$route.name === 'Search';
let sameAsLastSearch = term === this.lastTextSearch;
if (isSearchingURL) {
if (isCtrlPressed) {
this.$root.$emit('QualityModal:open', term);
} else {
if (isShowingAnalyzer) {
socket.emit('analyzeLink', term);
} else {
// ? Open downloads tab ?
sendAddToQueue(term);
}
}
} else {
if (isShowingSearch && sameAsLastSearch) {
// ? Has this any sense since we're not performing any call?
// this.$root.$emit('mainSearch:updateResults', term)
return
}
if (!isShowingSearch) {
await this.$router.push({
name: 'Search'
});
}
if (!sameAsLastSearch) {
this.$root.$emit('updateSearchLoadingState', true);
this.lastTextSearch = term;
}
this.$root.$emit('mainSearch:showNewResults', term);
}
}
}
};
/* script */
const __vue_script__$4 = script$4;
/* template */
var __vue_render__$5 = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('header',{attrs:{"id":"search","aria-label":"searchbar"}},[_vm._m(0),_vm._v(" "),_c('input',{ref:"searchbar",staticClass:"w-full",attrs:{"id":"searchbar","autocomplete":"off","type":"search","name":"searchbar","value":"","placeholder":_vm.$t('searchbar'),"autofocus":""},on:{"keyup":function($event){return _vm.handleSearchBarKeyup($event)}}})])};
var __vue_staticRenderFns__$5 = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:"search__icon"},[_c('i',{staticClass:"material-icons"},[_vm._v("search")])])}];
/* style */
const __vue_inject_styles__$5 = function (inject) {
if (!inject) return
inject("data-v-71c3049b_0", { source: "input[type=search]::-webkit-search-cancel-button{-webkit-appearance:none;width:28px;height:28px;background-color:var(--foreground);-webkit-mask-image:url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' height='28' viewBox='0 0 24 24' width='28'%3E%%3Cpath fill='%23ffffff' d='M22 3H7c-.69 0-1.23.35-1.59.88L0 12l5.41 8.11c.36.53.9.89 1.59.89h15c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-3 12.59L17.59 17 14 13.41 10.41 17 9 15.59 12.59 12 9 8.41 10.41 7 14 10.59 17.59 7 19 8.41 15.41 12 19 15.59z'/%3E3Cpath d='M0 0h24v24H0z' fill='none'/%3E%3C/svg%3E\");mask-image:url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' height='28' viewBox='0 0 24 24' width='28'%3E%%3Cpath fill='%23ffffff' d='M22 3H7c-.69 0-1.23.35-1.59.88L0 12l5.41 8.11c.36.53.9.89 1.59.89h15c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-3 12.59L17.59 17 14 13.41 10.41 17 9 15.59 12.59 12 9 8.41 10.41 7 14 10.59 17.59 7 19 8.41 15.41 12 19 15.59z'/%3E3Cpath d='M0 0h24v24H0z' fill='none'/%3E%3C/svg%3E\")}#search{background-color:var(--secondary-background);padding:0 1em;display:flex;align-items:center;border:1px solid transparent;transition:border .2s ease-in-out;border-radius:15px;margin:10px 10px 20px 10px}#search .search__icon{width:2rem;height:2rem}#search .search__icon i{font-size:2rem;color:var(--foreground)}#search .search__icon i::selection{background:0 0}#search #searchbar{height:45px;padding-left:.5em;border:0;border-radius:0;background-color:var(--secondary-background);color:var(--foreground);font-size:1.2rem;font-family:'Open Sans';font-weight:300;margin-bottom:0}#search #searchbar:focus{outline:0}#search #searchbar::-webkit-search-cancel-button{appearance:none;width:28px;height:28px;background-color:var(--foreground);mask-image:url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' height='28' viewBox='0 0 24 24' width='28'%3E%%3Cpath fill='%23ffffff' d='M22 3H7c-.69 0-1.23.35-1.59.88L0 12l5.41 8.11c.36.53.9.89 1.59.89h15c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-3 12.59L17.59 17 14 13.41 10.41 17 9 15.59 12.59 12 9 8.41 10.41 7 14 10.59 17.59 7 19 8.41 15.41 12 19 15.59z'/%3E3Cpath d='M0 0h24v24H0z' fill='none'/%3E%3C/svg%3E\")}#search #searchbar:-webkit-autofill,#search #searchbar:-webkit-autofill:active,#search #searchbar:-webkit-autofill:focus,#search #searchbar:-webkit-autofill:hover{box-shadow:0 0 0 45px var(--secondary-background) inset!important}#search:focus-within{border:1px solid var(--foreground)}", map: undefined, media: undefined });
};
/* scoped */
const __vue_scope_id__$5 = undefined;
/* module identifier */
const __vue_module_identifier__$4 = undefined;
/* functional template */
const __vue_is_functional_template__$5 = false;
/* component normalizer */
function __vue_normalize__$5(
template, style, script,
scope, functional, moduleIdentifier,
createInjector, createInjectorSSR
) {
const component = (typeof script === 'function' ? script.options : script) || {};
// For security concerns, we use only base name in production mode.
component.__file = "TheSearchBar.vue";
if (!component.render) {
component.render = template.render;
component.staticRenderFns = template.staticRenderFns;
component._compiled = true;
if (functional) component.functional = true;
}
component._scopeId = scope;
{
let hook;
if (style) {
hook = function(context) {
style.call(this, createInjector(context));
};
}
if (hook !== undefined) {
if (component.functional) {
// register for functional component in vue file
const originalRender = component.render;
component.render = function renderWithStyleInjection(h, context) {
hook.call(context);
return originalRender(h, context)
};
} else {
// inject component registration as beforeCreate hook
const existing = component.beforeCreate;
component.beforeCreate = existing ? [].concat(existing, hook) : [hook];
}
}
}
return component
}
/* style inject */
function __vue_create_injector__$4() {
const head = document.head || document.getElementsByTagName('head')[0];
const styles = __vue_create_injector__$4.styles || (__vue_create_injector__$4.styles = {});
const isOldIE =
typeof navigator !== 'undefined' &&
/msie [6-9]\\b/.test(navigator.userAgent.toLowerCase());
return function addStyle(id, css) {
if (document.querySelector('style[data-vue-ssr-id~="' + id + '"]')) return // SSR styles are present.
const group = isOldIE ? css.media || 'default' : id;
const style = styles[group] || (styles[group] = { ids: [], parts: [], element: undefined });
if (!style.ids.includes(id)) {
let code = css.source;
let index = style.ids.length;
style.ids.push(id);
if ( css.map) {
// https://developer.chrome.com/devtools/docs/javascript-debugging
// this makes source maps inside style tags work properly in Chrome
code += '\n/*# sourceURL=' + css.map.sources[0] + ' */';
// http://stackoverflow.com/a/26603875
code +=
'\n/*# sourceMappingURL=data:application/json;base64,' +
btoa(unescape(encodeURIComponent(JSON.stringify(css.map)))) +
' */';
}
if (isOldIE) {
style.element = style.element || document.querySelector('style[data-group=' + group + ']');
}
if (!style.element) {
const el = style.element = document.createElement('style');
el.type = 'text/css';
if (css.media) el.setAttribute('media', css.media);
if (isOldIE) {
el.setAttribute('data-group', group);
el.setAttribute('data-next-index', '0');
}
head.appendChild(el);
}
if (isOldIE) {
index = parseInt(style.element.getAttribute('data-next-index'));
style.element.setAttribute('data-next-index', index + 1);
}
if (style.element.styleSheet) {
style.parts.push(code);
style.element.styleSheet.cssText = style.parts
.filter(Boolean)
.join('\n');
} else {
const textNode = document.createTextNode(code);
const nodes = style.element.childNodes;
if (nodes[index]) style.element.removeChild(nodes[index]);
if (nodes.length) style.element.insertBefore(textNode, nodes[index]);
else style.element.appendChild(textNode);
}
}
}
}
/* style inject SSR */
var TheSearchBar = __vue_normalize__$5(
{ render: __vue_render__$5, staticRenderFns: __vue_staticRenderFns__$5 },
__vue_inject_styles__$5,
__vue_script__$4,
__vue_scope_id__$5,
__vue_is_functional_template__$5,
__vue_module_identifier__$4,
__vue_create_injector__$4);
/* script */
/* template */
var __vue_render__$6 = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('button',{staticClass:"btn-primary border-transparent border-solid flex items-center justify-center p-1 m-0 w-16 h-16 rounded-full z-10",on:{"click":function($event){return _vm.$router.back()}}},[_c('i',{staticClass:"material-icons mirrored text-4xl text-white"},[_vm._v("forward")])])};
var __vue_staticRenderFns__$6 = [];
/* style */
const __vue_inject_styles__$6 = function (inject) {
if (!inject) return
inject("data-v-74f206d4_0", { source: "button[data-v-74f206d4]{transition:background .2s ease-in-out}", map: undefined, media: undefined });
};
/* scoped */
const __vue_scope_id__$6 = "data-v-74f206d4";
/* module identifier */
const __vue_module_identifier__$5 = undefined;
/* functional template */
const __vue_is_functional_template__$6 = false;
/* component normalizer */
function __vue_normalize__$6(
template, style, script,
scope, functional, moduleIdentifier,
createInjector, createInjectorSSR
) {
const component = (typeof script === 'function' ? script.options : script) || {};
// For security concerns, we use only base name in production mode.
component.__file = "BackButton.vue";
if (!component.render) {
component.render = template.render;
component.staticRenderFns = template.staticRenderFns;
component._compiled = true;
if (functional) component.functional = true;
}
component._scopeId = scope;
{
let hook;
if (style) {
hook = function(context) {
style.call(this, createInjector(context));
};
}
if (hook !== undefined) {
if (component.functional) {
// register for functional component in vue file
const originalRender = component.render;
component.render = function renderWithStyleInjection(h, context) {
hook.call(context);
return originalRender(h, context)
};
} else {
// inject component registration as beforeCreate hook
const existing = component.beforeCreate;
component.beforeCreate = existing ? [].concat(existing, hook) : [hook];
}
}
}
return component
}
/* style inject */
function __vue_create_injector__$5() {
const head = document.head || document.getElementsByTagName('head')[0];
const styles = __vue_create_injector__$5.styles || (__vue_create_injector__$5.styles = {});
const isOldIE =
typeof navigator !== 'undefined' &&
/msie [6-9]\\b/.test(navigator.userAgent.toLowerCase());
return function addStyle(id, css) {
if (document.querySelector('style[data-vue-ssr-id~="' + id + '"]')) return // SSR styles are present.
const group = isOldIE ? css.media || 'default' : id;
const style = styles[group] || (styles[group] = { ids: [], parts: [], element: undefined });
if (!style.ids.includes(id)) {
let code = css.source;
let index = style.ids.length;
style.ids.push(id);
if ( css.map) {
// https://developer.chrome.com/devtools/docs/javascript-debugging
// this makes source maps inside style tags work properly in Chrome
code += '\n/*# sourceURL=' + css.map.sources[0] + ' */';
// http://stackoverflow.com/a/26603875
code +=
'\n/*# sourceMappingURL=data:application/json;base64,' +
btoa(unescape(encodeURIComponent(JSON.stringify(css.map)))) +
' */';
}
if (isOldIE) {
style.element = style.element || document.querySelector('style[data-group=' + group + ']');
}
if (!style.element) {
const el = style.element = document.createElement('style');
el.type = 'text/css';
if (css.media) el.setAttribute('media', css.media);
if (isOldIE) {
el.setAttribute('data-group', group);
el.setAttribute('data-next-index', '0');
}
head.appendChild(el);
}
if (isOldIE) {
index = parseInt(style.element.getAttribute('data-next-index'));
style.element.setAttribute('data-next-index', index + 1);
}
if (style.element.styleSheet) {
style.parts.push(code);
style.element.styleSheet.cssText = style.parts
.filter(Boolean)
.join('\n');
} else {
const textNode = document.createTextNode(code);
const nodes = style.element.childNodes;
if (nodes[index]) style.element.removeChild(nodes[index]);
if (nodes.length) style.element.insertBefore(textNode, nodes[index]);
else style.element.appendChild(textNode);
}
}
}
}
/* style inject SSR */
var BackButton = __vue_normalize__$6(
{ render: __vue_render__$6, staticRenderFns: __vue_staticRenderFns__$6 },
__vue_inject_styles__$6,
{},
__vue_scope_id__$6,
__vue_is_functional_template__$6,
__vue_module_identifier__$5,
__vue_create_injector__$5);
//
var script$5 = {
components: {
BaseLoadingPlaceholder,
BackButton
},
data: () => ({
performScrolledSearch: false,
loading: false
}),
computed: {
showBackButton() {
return ['Tracklist', 'Artist', 'Album', 'Playlist', 'Spotify Playlist'].indexOf(this.$route.name) !== -1
}
},
mounted() {
this.$root.$on('updateSearchLoadingState', loading => {
this.loading = loading;
});
this.$router.beforeEach((to, from, next) => {
this.$refs.content.scrollTo(0, 0);
next();
});
},
methods: {
handleContentScroll: debounce(async function () {
if (this.$refs.content.scrollTop + this.$refs.content.clientHeight < this.$refs.content.scrollHeight) return
this.performScrolledSearch = true;
await this.$nextTick();
this.performScrolledSearch = false;
}, 100)
}
};
/* script */
const __vue_script__$5 = script$5;
/* template */
var __vue_render__$7 = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('main',{ref:"content",attrs:{"id":"content","aria-label":"main content"},on:{"scroll":function($event){_vm.$route.name === 'Search' ? _vm.handleContentScroll($event) : null;}}},[_c('div',{attrs:{"id":"container"}},[_c('BaseLoadingPlaceholder',{attrs:{"text":"Searching...","hidden":!_vm.loading}}),_vm._v(" "),(_vm.showBackButton)?_c('BackButton',{staticClass:"sticky -ml-20",staticStyle:{"top":"1rem"}}):_vm._e(),_vm._v(" "),_c('keep-alive',[(!_vm.$route.meta.notKeepAlive)?_c('router-view',{directives:[{name:"show",rawName:"v-show",value:(!_vm.loading),expression:"!loading"}],key:_vm.$route.fullPath,class:{ '-mt-16': _vm.showBackButton },attrs:{"perform-scrolled-search":_vm.performScrolledSearch}}):_vm._e()],1),_vm._v(" "),(_vm.$route.meta.notKeepAlive)?_c('router-view',{directives:[{name:"show",rawName:"v-show",value:(!_vm.loading),expression:"!loading"}],key:_vm.$route.fullPath,class:{ '-mt-16': _vm.showBackButton },attrs:{"perform-scrolled-search":_vm.performScrolledSearch}}):_vm._e()],1)])};
var __vue_staticRenderFns__$7 = [];
/* style */
const __vue_inject_styles__$7 = function (inject) {
if (!inject) return
inject("data-v-62225107_0", { source: "#container{--container-width:95%;margin:0 auto;max-width:1280px;width:var(--container-width);transform:scale(1)}@media only screen and (min-width:601px){#container{--container-width:85%}}@media only screen and (min-width:993px){#container{--container-width:70%}}main{background-color:var(--main-background);padding-right:5px;width:100%;height:calc(100vh - 93px);overflow-y:scroll;overflow-x:hidden}main::-webkit-scrollbar{width:10px}main::-webkit-scrollbar-track{background:var(--main-background)}main::-webkit-scrollbar-thumb{background:var(--main-scroll);border-radius:4px;width:6px;padding:0 2px}", map: undefined, media: undefined });
};
/* scoped */
const __vue_scope_id__$7 = undefined;
/* module identifier */
const __vue_module_identifier__$6 = undefined;
/* functional template */
const __vue_is_functional_template__$7 = false;
/* component normalizer */
function __vue_normalize__$7(
template, style, script,
scope, functional, moduleIdentifier,
createInjector, createInjectorSSR
) {
const component = (typeof script === 'function' ? script.options : script) || {};
// For security concerns, we use only base name in production mode.
component.__file = "TheContent.vue";
if (!component.render) {
component.render = template.render;
component.staticRenderFns = template.staticRenderFns;
component._compiled = true;
if (functional) component.functional = true;
}
component._scopeId = scope;
{
let hook;
if (style) {
hook = function(context) {
style.call(this, createInjector(context));
};
}
if (hook !== undefined) {
if (component.functional) {
// register for functional component in vue file
const originalRender = component.render;
component.render = function renderWithStyleInjection(h, context) {
hook.call(context);
return originalRender(h, context)
};
} else {
// inject component registration as beforeCreate hook
const existing = component.beforeCreate;
component.beforeCreate = existing ? [].concat(existing, hook) : [hook];
}
}
}
return component
}
/* style inject */
function __vue_create_injector__$6() {
const head = document.head || document.getElementsByTagName('head')[0];
const styles = __vue_create_injector__$6.styles || (__vue_create_injector__$6.styles = {});
const isOldIE =
typeof navigator !== 'undefined' &&
/msie [6-9]\\b/.test(navigator.userAgent.toLowerCase());
return function addStyle(id, css) {
if (document.querySelector('style[data-vue-ssr-id~="' + id + '"]')) return // SSR styles are present.
const group = isOldIE ? css.media || 'default' : id;
const style = styles[group] || (styles[group] = { ids: [], parts: [], element: undefined });
if (!style.ids.includes(id)) {
let code = css.source;
let index = style.ids.length;
style.ids.push(id);
if ( css.map) {
// https://developer.chrome.com/devtools/docs/javascript-debugging
// this makes source maps inside style tags work properly in Chrome
code += '\n/*# sourceURL=' + css.map.sources[0] + ' */';
// http://stackoverflow.com/a/26603875
code +=
'\n/*# sourceMappingURL=data:application/json;base64,' +
btoa(unescape(encodeURIComponent(JSON.stringify(css.map)))) +
' */';
}
if (isOldIE) {
style.element = style.element || document.querySelector('style[data-group=' + group + ']');
}
if (!style.element) {
const el = style.element = document.createElement('style');
el.type = 'text/css';
if (css.media) el.setAttribute('media', css.media);
if (isOldIE) {
el.setAttribute('data-group', group);
el.setAttribute('data-next-index', '0');
}
head.appendChild(el);
}
if (isOldIE) {
index = parseInt(style.element.getAttribute('data-next-index'));
style.element.setAttribute('data-next-index', index + 1);
}
if (style.element.styleSheet) {
style.parts.push(code);
style.element.styleSheet.cssText = style.parts
.filter(Boolean)
.join('\n');
} else {
const textNode = document.createTextNode(code);
const nodes = style.element.childNodes;
if (nodes[index]) style.element.removeChild(nodes[index]);
if (nodes.length) style.element.insertBefore(textNode, nodes[index]);
else style.element.appendChild(textNode);
}
}
}
}
/* style inject SSR */
var TheContent = __vue_normalize__$7(
{ render: __vue_render__$7, staticRenderFns: __vue_staticRenderFns__$7 },
__vue_inject_styles__$7,
__vue_script__$5,
__vue_scope_id__$7,
__vue_is_functional_template__$7,
__vue_module_identifier__$6,
__vue_create_injector__$6);
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
const possibleStates = ['converting', 'downloading', 'download finished'];
var script$6 = {
data() {
return {
isLoading: false
}
},
props: {
queueItem: Object
},
computed: {
hasFails() {
return this.queueItem.failed >= 1
},
allFailed() {
let allFailed = false;
if (this.queueItem.status === 'download finished') {
allFailed = this.queueItem.failed === this.queueItem.size;
}
return allFailed
},
finishedWithFails() {
return this.queueItem.status === 'download finished' && this.hasFails
},
isDeterminateStatus() {
return possibleStates.indexOf(this.queueItem.status) !== -1
},
barClass() {
return {
converting: this.queueItem.status === 'converting',
indeterminate: !this.isDeterminateStatus,
determinate: this.isDeterminateStatus
}
},
barStyle() {
let width = 0;
let backgroundColor = 'var(--primary-color)';
if (this.hasFails) {
// Orange
backgroundColor = 'hsl(33, 100%, 47%)';
} else {
// Green
backgroundColor = 'hsl(150, 76%, 34%)';
}
if (this.allFailed) {
// Red
backgroundColor = 'hsl(360, 100%, 35%)';
}
if (this.queueItem.status === 'download finished') {
width = 100;
}
if (this.queueItem.status === 'downloading') {
width = this.queueItem.progress;
}
if (this.queueItem.status === 'converting') {
width = 100 - this.queueItem.conversion;
}
return {
width: `${width}%`,
backgroundColor
}
},
resultIconText() {
let text = 'delete_forever';
if (this.queueItem.status === 'download finished') {
if (!this.hasFails) {
text = 'done';
} else {
if (this.queueItem.failed >= this.queueItem.size) {
text = 'error';
} else {
text = 'warning';
}
}
}
return text
}
},
methods: {
onResultIconClick() {
if (this.isDeterminateStatus) {
if (this.finishedWithFails) {
this.$emit('show-errors', this.queueItem);
}
if (this.queueItem.status === 'downloading') {
this.isLoading = true;
this.$emit('remove-item', this.queueItem.uuid);
}
} else {
this.isLoading = true;
this.$emit('remove-item', this.queueItem.uuid);
}
}
}
};
/* script */
const __vue_script__$6 = script$6;
/* template */
var __vue_render__$8 = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:"download-object"},[_c('div',{staticClass:"download-info"},[_c('img',{staticClass:"rounded coverart",attrs:{"width":"75px","src":_vm.queueItem.cover,"alt":("Cover " + (_vm.queueItem.title))}}),_vm._v(" "),_c('div',{staticClass:"download-info-data"},[_c('span',{staticClass:"download-line"},[_vm._v(_vm._s(_vm.queueItem.title))]),_vm._v(" "),_c('span',{staticClass:"download-slim-separator"},[_vm._v(" - ")]),_vm._v(" "),_c('span',[_vm._v(_vm._s(_vm.queueItem.artist))])]),_vm._v(" "),_c('div',{staticClass:"download-info-status",staticStyle:{"text-align":"center"}},[_c('span',{staticClass:"download-line"},[_vm._v(" "+_vm._s(_vm.queueItem.downloaded + _vm.queueItem.failed)+"/"+_vm._s(_vm.queueItem.size)+" ")]),_vm._v(" "),(_vm.hasFails)?_c('span',{staticClass:"flex items-center",class:{ clickable: _vm.finishedWithFails },staticStyle:{"justify-content":"center"},on:{"click":function($event){_vm.finishedWithFails ? _vm.$emit('show-errors', _vm.queueItem) : null;}}},[_vm._v("\n\t\t\t\t"+_vm._s(_vm.queueItem.failed)+"\n\t\t\t\t"),_c('i',{staticClass:"material-icons"},[_vm._v("error_outline")])]):_vm._e()])]),_vm._v(" "),_c('div',{staticClass:"download-bar"},[_c('div',{staticClass:"progress"},[_c('div',{class:_vm.barClass,style:(_vm.barStyle)})]),_vm._v(" "),(!_vm.isLoading)?_c('i',{staticClass:"material-icons queue_icon",class:{ clickable: _vm.finishedWithFails || _vm.resultIconText === 'delete_forever' },on:{"click":_vm.onResultIconClick}},[_vm._v("\n\t\t\t"+_vm._s(_vm.resultIconText)+"\n\t\t")]):_c('div',{staticClass:"circle-loader"})])])};
var __vue_staticRenderFns__$8 = [];
/* style */
const __vue_inject_styles__$8 = function (inject) {
if (!inject) return
inject("data-v-e19c0a1a_0", { source: ".download-object{padding-bottom:8px}.download-object .download-info{display:flex;align-items:center}.download-object .download-info img{height:75px;flex-shrink:0;flex:0 0 75px}.download-object .download-info .download-line{display:block}.download-object .download-info .download-slim-separator{display:none}.download-object .download-info-data{flex:1 50%;margin-left:8px;overflow:hidden}.download-object .download-info-status{flex:1 15%;margin-left:8px;width:80px}.download-object>.download-bar{display:flex;align-items:center;height:24px}.download-object>.download-bar>.queue_icon{cursor:default;margin-left:8px}.download-object>.download-bar>.progress{margin:0}#download_list:not(.slim) .download-line{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}#download_list.slim>.download-object .download-info{display:block}#download_list.slim>.download-object .download-info img{display:none}#download_list.slim>.download-object .download-info .download-line{display:inline-block}#download_list.slim>.download-object .download-info .download-slim-separator{display:inline-block}#download_list.slim>.download-object .download-info-data{width:calc(80% - 16px);display:inline-block;padding-left:0}#download_list.slim>.download-object .download-info-status{width:20%;display:inline-block;float:right}.progress{position:relative;height:4px;display:block;width:100%;background-color:var(--secondary-background);border-radius:2px;margin:.5rem 0 1rem 0;overflow:hidden}.progress .determinate{position:absolute;top:0;left:0;bottom:0;background-color:var(--primary-color);transition:width .3s linear}.progress .converting{background-color:var(--secondary-color);transition:none!important}.progress .indeterminate{background-color:var(--primary-color)}.progress .indeterminate::before{content:'';position:absolute;background-color:inherit;top:0;left:0;bottom:0;will-change:left,right;animation:indeterminate 2.1s cubic-bezier(.65,.815,.735,.395) infinite}.progress .indeterminate::after{content:'';position:absolute;background-color:inherit;top:0;left:0;bottom:0;will-change:left,right;animation:indeterminate-short 2.1s cubic-bezier(.165,.84,.44,1) infinite;animation-delay:1.15s}@keyframes indeterminate{0%{left:-35%;right:100%}60%{left:100%;right:-90%}100%{left:100%;right:-90%}}@keyframes indeterminate-short{0%{left:-200%;right:100%}60%{left:107%;right:-8%}100%{left:107%;right:-8%}}", map: undefined, media: undefined });
};
/* scoped */
const __vue_scope_id__$8 = undefined;
/* module identifier */
const __vue_module_identifier__$7 = undefined;
/* functional template */
const __vue_is_functional_template__$8 = false;
/* component normalizer */
function __vue_normalize__$8(
template, style, script,
scope, functional, moduleIdentifier,
createInjector, createInjectorSSR
) {
const component = (typeof script === 'function' ? script.options : script) || {};
// For security concerns, we use only base name in production mode.
component.__file = "QueueItem.vue";
if (!component.render) {
component.render = template.render;
component.staticRenderFns = template.staticRenderFns;
component._compiled = true;
if (functional) component.functional = true;
}
component._scopeId = scope;
{
let hook;
if (style) {
hook = function(context) {
style.call(this, createInjector(context));
};
}
if (hook !== undefined) {
if (component.functional) {
// register for functional component in vue file
const originalRender = component.render;
component.render = function renderWithStyleInjection(h, context) {
hook.call(context);
return originalRender(h, context)
};
} else {
// inject component registration as beforeCreate hook
const existing = component.beforeCreate;
component.beforeCreate = existing ? [].concat(existing, hook) : [hook];
}
}
}
return component
}
/* style inject */
function __vue_create_injector__$7() {
const head = document.head || document.getElementsByTagName('head')[0];
const styles = __vue_create_injector__$7.styles || (__vue_create_injector__$7.styles = {});
const isOldIE =
typeof navigator !== 'undefined' &&
/msie [6-9]\\b/.test(navigator.userAgent.toLowerCase());
return function addStyle(id, css) {
if (document.querySelector('style[data-vue-ssr-id~="' + id + '"]')) return // SSR styles are present.
const group = isOldIE ? css.media || 'default' : id;
const style = styles[group] || (styles[group] = { ids: [], parts: [], element: undefined });
if (!style.ids.includes(id)) {
let code = css.source;
let index = style.ids.length;
style.ids.push(id);
if ( css.map) {
// https://developer.chrome.com/devtools/docs/javascript-debugging
// this makes source maps inside style tags work properly in Chrome
code += '\n/*# sourceURL=' + css.map.sources[0] + ' */';
// http://stackoverflow.com/a/26603875
code +=
'\n/*# sourceMappingURL=data:application/json;base64,' +
btoa(unescape(encodeURIComponent(JSON.stringify(css.map)))) +
' */';
}
if (isOldIE) {
style.element = style.element || document.querySelector('style[data-group=' + group + ']');
}
if (!style.element) {
const el = style.element = document.createElement('style');
el.type = 'text/css';
if (css.media) el.setAttribute('media', css.media);
if (isOldIE) {
el.setAttribute('data-group', group);
el.setAttribute('data-next-index', '0');
}
head.appendChild(el);
}
if (isOldIE) {
index = parseInt(style.element.getAttribute('data-next-index'));
style.element.setAttribute('data-next-index', index + 1);
}
if (style.element.styleSheet) {
style.parts.push(code);
style.element.styleSheet.cssText = style.parts
.filter(Boolean)
.join('\n');
} else {
const textNode = document.createTextNode(code);
const nodes = style.element.childNodes;
if (nodes[index]) style.element.removeChild(nodes[index]);
if (nodes.length) style.element.insertBefore(textNode, nodes[index]);
else style.element.appendChild(textNode);
}
}
}
}
/* style inject SSR */
var QueueItem = __vue_normalize__$8(
{ render: __vue_render__$8, staticRenderFns: __vue_staticRenderFns__$8 },
__vue_inject_styles__$8,
__vue_script__$6,
__vue_scope_id__$8,
__vue_is_functional_template__$8,
__vue_module_identifier__$7,
__vue_create_injector__$7);
var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
function createCommonjsModule(fn, basedir, module) {
return module = {
path: basedir,
exports: {},
require: function (path, base) {
return commonjsRequire(path, (base === undefined || base === null) ? module.path : base);
}
}, fn(module, module.exports), module.exports;
}
function commonjsRequire () {
throw new Error('Dynamic requires are not currently supported by @rollup/plugin-commonjs');
}
var toastify = createCommonjsModule(function (module) {
/*!
* Toastify js 1.9.3
* https://github.com/apvarun/toastify-js
* @license MIT licensed
*
* Copyright (C) 2018 Varun A P
*/
(function(root, factory) {
if ( module.exports) {
module.exports = factory();
} else {
root.Toastify = factory();
}
})(commonjsGlobal, function(global) {
// Object initialization
var Toastify = function(options) {
// Returning a new init object
return new Toastify.lib.init(options);
},
// Library version
version = "1.9.3";
// Defining the prototype of the object
Toastify.lib = Toastify.prototype = {
toastify: version,
constructor: Toastify,
// Initializing the object with required parameters
init: function(options) {
// Verifying and validating the input object
if (!options) {
options = {};
}
// Creating the options object
this.options = {};
this.toastElement = null;
// Validating the options
this.options.text = options.text || "Hi there!"; // Display message
this.options.node = options.node; // Display content as node
this.options.duration = options.duration === 0 ? 0 : options.duration || 3000; // Display duration
this.options.selector = options.selector; // Parent selector
this.options.callback = options.callback || function() {}; // Callback after display
this.options.destination = options.destination; // On-click destination
this.options.newWindow = options.newWindow || false; // Open destination in new window
this.options.close = options.close || false; // Show toast close icon
this.options.gravity = options.gravity === "bottom" ? "toastify-bottom" : "toastify-top"; // toast position - top or bottom
this.options.positionLeft = options.positionLeft || false; // toast position - left or right
this.options.position = options.position || ''; // toast position - left or right
this.options.backgroundColor = options.backgroundColor; // toast background color
this.options.avatar = options.avatar || ""; // img element src - url or a path
this.options.className = options.className || ""; // additional class names for the toast
this.options.stopOnFocus = options.stopOnFocus === undefined? true: options.stopOnFocus; // stop timeout on focus
this.options.onClick = options.onClick; // Callback after click
this.options.offset = options.offset || { x: 0, y: 0 }; // toast offset
// Returning the current object for chaining functions
return this;
},
// Building the DOM element
buildToast: function() {
// Validating if the options are defined
if (!this.options) {
throw "Toastify is not initialized";
}
// Creating the DOM object
var divElement = document.createElement("div");
divElement.className = "toastify on " + this.options.className;
// Positioning toast to left or right or center
if (!!this.options.position) {
divElement.className += " toastify-" + this.options.position;
} else {
// To be depreciated in further versions
if (this.options.positionLeft === true) {
divElement.className += " toastify-left";
console.warn('Property `positionLeft` will be depreciated in further versions. Please use `position` instead.');
} else {
// Default position
divElement.className += " toastify-right";
}
}
// Assigning gravity of element
divElement.className += " " + this.options.gravity;
if (this.options.backgroundColor) {
divElement.style.background = this.options.backgroundColor;
}
// Adding the toast message/node
if (this.options.node && this.options.node.nodeType === Node.ELEMENT_NODE) {
// If we have a valid node, we insert it
divElement.appendChild(this.options.node);
} else {
divElement.innerHTML = this.options.text;
if (this.options.avatar !== "") {
var avatarElement = document.createElement("img");
avatarElement.src = this.options.avatar;
avatarElement.className = "toastify-avatar";
if (this.options.position == "left" || this.options.positionLeft === true) {
// Adding close icon on the left of content
divElement.appendChild(avatarElement);
} else {
// Adding close icon on the right of content
divElement.insertAdjacentElement("afterbegin", avatarElement);
}
}
}
// Adding a close icon to the toast
if (this.options.close === true) {
// Create a span for close element
var closeElement = document.createElement("span");
closeElement.innerHTML = "&#10006;";
closeElement.className = "toast-close";
// Triggering the removal of toast from DOM on close click
closeElement.addEventListener(
"click",
function(event) {
event.stopPropagation();
this.removeElement(this.toastElement);
window.clearTimeout(this.toastElement.timeOutValue);
}.bind(this)
);
//Calculating screen width
var width = window.innerWidth > 0 ? window.innerWidth : screen.width;
// Adding the close icon to the toast element
// Display on the right if screen width is less than or equal to 360px
if ((this.options.position == "left" || this.options.positionLeft === true) && width > 360) {
// Adding close icon on the left of content
divElement.insertAdjacentElement("afterbegin", closeElement);
} else {
// Adding close icon on the right of content
divElement.appendChild(closeElement);
}
}
// Clear timeout while toast is focused
if (this.options.stopOnFocus && this.options.duration > 0) {
var self = this;
// stop countdown
divElement.addEventListener(
"mouseover",
function(event) {
window.clearTimeout(divElement.timeOutValue);
}
);
// add back the timeout
divElement.addEventListener(
"mouseleave",
function() {
divElement.timeOutValue = window.setTimeout(
function() {
// Remove the toast from DOM
self.removeElement(divElement);
},
self.options.duration
);
}
);
}
// Adding an on-click destination path
if (typeof this.options.destination !== "undefined") {
divElement.addEventListener(
"click",
function(event) {
event.stopPropagation();
if (this.options.newWindow === true) {
window.open(this.options.destination, "_blank");
} else {
window.location = this.options.destination;
}
}.bind(this)
);
}
if (typeof this.options.onClick === "function" && typeof this.options.destination === "undefined") {
divElement.addEventListener(
"click",
function(event) {
event.stopPropagation();
this.options.onClick();
}.bind(this)
);
}
// Adding offset
if(typeof this.options.offset === "object") {
var x = getAxisOffsetAValue("x", this.options);
var y = getAxisOffsetAValue("y", this.options);
var xOffset = this.options.position == "left" ? x : "-" + x;
var yOffset = this.options.gravity == "toastify-top" ? y : "-" + y;
divElement.style.transform = "translate(" + xOffset + "," + yOffset + ")";
}
// Returning the generated element
return divElement;
},
// Displaying the toast
showToast: function() {
// Creating the DOM object for the toast
this.toastElement = this.buildToast();
// Getting the root element to with the toast needs to be added
var rootElement;
if (typeof this.options.selector === "undefined") {
rootElement = document.body;
} else {
rootElement = document.getElementById(this.options.selector);
}
// Validating if root element is present in DOM
if (!rootElement) {
throw "Root element is not defined";
}
// Adding the DOM element
rootElement.insertBefore(this.toastElement, rootElement.firstChild);
// Repositioning the toasts in case multiple toasts are present
Toastify.reposition();
if (this.options.duration > 0) {
this.toastElement.timeOutValue = window.setTimeout(
function() {
// Remove the toast from DOM
this.removeElement(this.toastElement);
}.bind(this),
this.options.duration
); // Binding `this` for function invocation
}
// Supporting function chaining
return this;
},
hideToast: function() {
if (this.toastElement.timeOutValue) {
clearTimeout(this.toastElement.timeOutValue);
}
this.removeElement(this.toastElement);
},
// Removing the element from the DOM
removeElement: function(toastElement) {
// Hiding the element
// toastElement.classList.remove("on");
toastElement.className = toastElement.className.replace(" on", "");
// Removing the element from DOM after transition end
window.setTimeout(
function() {
// remove options node if any
if (this.options.node && this.options.node.parentNode) {
this.options.node.parentNode.removeChild(this.options.node);
}
// Remove the elemenf from the DOM, only when the parent node was not removed before.
if (toastElement.parentNode) {
toastElement.parentNode.removeChild(toastElement);
}
// Calling the callback function
this.options.callback.call(toastElement);
// Repositioning the toasts again
Toastify.reposition();
}.bind(this),
400
); // Binding `this` for function invocation
},
};
// Positioning the toasts on the DOM
Toastify.reposition = function() {
// Top margins with gravity
var topLeftOffsetSize = {
top: 15,
bottom: 15,
};
var topRightOffsetSize = {
top: 15,
bottom: 15,
};
var offsetSize = {
top: 15,
bottom: 15,
};
// Get all toast messages on the DOM
var allToasts = document.getElementsByClassName("toastify");
var classUsed;
// Modifying the position of each toast element
for (var i = 0; i < allToasts.length; i++) {
// Getting the applied gravity
if (containsClass(allToasts[i], "toastify-top") === true) {
classUsed = "toastify-top";
} else {
classUsed = "toastify-bottom";
}
var height = allToasts[i].offsetHeight;
classUsed = classUsed.substr(9, classUsed.length-1);
// Spacing between toasts
var offset = 15;
var width = window.innerWidth > 0 ? window.innerWidth : screen.width;
// Show toast in center if screen with less than or qual to 360px
if (width <= 360) {
// Setting the position
allToasts[i].style[classUsed] = offsetSize[classUsed] + "px";
offsetSize[classUsed] += height + offset;
} else {
if (containsClass(allToasts[i], "toastify-left") === true) {
// Setting the position
allToasts[i].style[classUsed] = topLeftOffsetSize[classUsed] + "px";
topLeftOffsetSize[classUsed] += height + offset;
} else {
// Setting the position
allToasts[i].style[classUsed] = topRightOffsetSize[classUsed] + "px";
topRightOffsetSize[classUsed] += height + offset;
}
}
}
// Supporting function chaining
return this;
};
// Helper function to get offset.
function getAxisOffsetAValue(axis, options) {
if(options.offset[axis]) {
if(isNaN(options.offset[axis])) {
return options.offset[axis];
}
else {
return options.offset[axis] + 'px';
}
}
return '0px';
}
function containsClass(elem, yourClass) {
if (!elem || typeof yourClass !== "string") {
return false;
} else if (
elem.className &&
elem.className
.trim()
.split(/\s+/gi)
.indexOf(yourClass) > -1
) {
return true;
} else {
return false;
}
}
// Setting up the prototype for the init object
Toastify.lib.init.prototype = Toastify.lib;
// Returning the Toastify function to be assigned to the window object/module
return Toastify;
});
});
var css_248z$6 = "/*!\n * Toastify js 1.9.3\n * https://github.com/apvarun/toastify-js\n * @license MIT licensed\n *\n * Copyright (C) 2018 Varun A P\n */\n\n.toastify {\n padding: 12px 20px;\n color: #ffffff;\n display: inline-block;\n box-shadow: 0 3px 6px -1px rgba(0, 0, 0, 0.12), 0 10px 36px -4px rgba(77, 96, 232, 0.3);\n background: linear-gradient(135deg, #73a5ff, #5477f5);\n position: fixed;\n opacity: 0;\n transition: all 0.4s cubic-bezier(0.215, 0.61, 0.355, 1);\n border-radius: 2px;\n cursor: pointer;\n text-decoration: none;\n max-width: calc(50% - 20px);\n z-index: 2147483647;\n}\n\n.toastify.on {\n opacity: 1;\n}\n\n.toast-close {\n opacity: 0.4;\n padding: 0 5px;\n}\n\n.toastify-right {\n right: 15px;\n}\n\n.toastify-left {\n left: 15px;\n}\n\n.toastify-top {\n top: -150px;\n}\n\n.toastify-bottom {\n bottom: -150px;\n}\n\n.toastify-rounded {\n border-radius: 25px;\n}\n\n.toastify-avatar {\n width: 1.5em;\n height: 1.5em;\n margin: -7px 5px;\n border-radius: 2px;\n}\n\n.toastify-center {\n margin-left: auto;\n margin-right: auto;\n left: 0;\n right: 0;\n max-width: -webkit-fit-content;\n max-width: fit-content;\n max-width: -moz-fit-content;\n}\n\n@media only screen and (max-width: 360px) {\n .toastify-right, .toastify-left {\n margin-left: auto;\n margin-right: auto;\n left: 0;\n right: 0;\n max-width: -webkit-fit-content;\n max-width: -moz-fit-content;\n max-width: fit-content;\n }\n}\n";
styleInject(css_248z$6);
var css_248z$7 = ".toast-icon {\n display: inline-block;\n margin-right: 0.5rem;\n}\n\n.circle-loader {\n display: inline-block;\n width: 1rem;\n height: 1rem;\n border: 2px solid var(--primary-color);\n border-radius: 50%;\n border-bottom: 2px solid var(--secondary-background);\n -webkit-animation: spin 1s linear infinite;\n animation: spin 1s linear infinite;\n}\n\n.toastify {\n display: flex;\n align-items: center;\n box-shadow: 0 3px 6px -1px rgba(0, 0, 0, 0.12), 0 10px 36px -4px rgba(0, 0, 0, 0.3);\n background: var(--toast-background);\n color: var(--toast-text);\n}\n\n.toastify .circle-loader {\n border-bottom-color: var(--toast-secondary);\n}\r\n";
styleInject(css_248z$7);
const sharedOptions = {
gravity: 'bottom',
position: 'left'
};
let toastsWithId = {};
const toast = function(msg, icon = null, dismiss = true, id = null) {
if (toastsWithId[id]) {
let toastObj = toastsWithId[id];
let toastElement = document.querySelectorAll(`div.toastify[toast_id=${id}]`);
if (msg) {
toastElement.forEach(toast => {
const messages = toast.querySelectorAll('.toast-message');
messages.forEach(message => {
message.innerHTML = msg;
});
});
}
if (icon) {
if (icon == 'loading') {
icon = `<div class="circle-loader"></div>`;
} else {
icon = `<i class="material-icons">${icon}</i>`;
}
toastElement.forEach(toast => {
const icons = toast.querySelectorAll('.toast-icon');
icons.forEach(toastIcon => {
toastIcon.innerHTML = icon;
});
});
}
if (dismiss !== null && dismiss) {
toastElement.forEach(toast => {
toast.classList.add('dismissable');
});
setTimeout(() => {
toastObj.hideToast();
delete toastsWithId[id];
}, 3000);
}
} else {
if (icon == null) {
icon = '';
} else if (icon == 'loading') {
icon = `<div class="circle-loader"></div>`;
} else {
icon = `<i class="material-icons">${icon}</i>`;
}
let toastObj = toastify({
...sharedOptions,
text: `<span class="toast-icon">${icon}</span><span class="toast-message">${msg}</toast>`,
duration: dismiss ? 3000 : 0,
className: dismiss ? 'dismissable' : '',
onClick: function() {
let dismissable = true;
if (id) {
let toastClasses = document.querySelector(`div.toastify[toast_id=${id}]`).classList;
if (toastClasses) {
dismissable = Array.prototype.slice.call(toastClasses).indexOf('dismissable') != -1;
}
}
if (toastObj && dismissable) {
toastObj.hideToast();
if (id) {
delete toastsWithId[id];
}
}
},
offset: {
x: 'true' === localStorage.getItem('slimSidebar') ? '3rem': '14rem'
}
}).showToast();
if (id) {
toastsWithId[id] = toastObj;
toastObj.toastElement.setAttribute('toast_id', id);
}
}
};
socket.on('toast', data => {
const { msg, icon, dismiss, id } = data;
toast(msg, icon || null, dismiss !== undefined ? dismiss : true, id || null);
});
//
const tabMinWidth = 250;
const tabMaxWidth = 500;
var script$7 = {
components: {
QueueItem
},
data() {
return {
cachedTabWidth: parseInt(localStorage.getItem('downloadTabWidth')) || 300,
queue: [],
queueList: {},
queueComplete: [],
isExpanded: localStorage.getItem('downloadTabOpen') === 'true'
}
},
computed: {
...mapGetters({
clientMode: 'getClientMode'
})
},
created() {
const checkIfToggleBar = keyEvent => {
if (!(keyEvent.ctrlKey && keyEvent.key === 'b')) return
this.toggleDownloadTab();
};
document.addEventListener('keyup', checkIfToggleBar);
this.$on('hook:destroyed', () => {
document.removeEventListener('keyup', checkIfToggleBar);
});
},
mounted() {
socket.on('startDownload', this.startDownload);
socket.on('startConversion', this.startConversion);
socket.on('init_downloadQueue', this.initQueue);
socket.on('addedToQueue', this.addToQueue);
socket.on('updateQueue', this.updateQueue);
socket.on('removedFromQueue', this.removeFromQueue);
socket.on('finishDownload', this.finishDownload);
socket.on('removedAllDownloads', this.removeAllDownloads);
socket.on('removedFinishedDownloads', this.removedFinishedDownloads);
// Check if download tab has slim entries
if ('true' === localStorage.getItem('slimDownloads')) {
this.$refs.list.classList.add('slim');
}
if (this.isExpanded) {
this.setTabWidth(this.cachedTabWidth);
}
document.addEventListener('mouseup', () => {
document.removeEventListener('mousemove', this.handleDrag);
});
window.addEventListener('beforeunload', () => {
localStorage.setItem('downloadTabWidth', this.cachedTabWidth);
});
},
methods: {
...mapActions(['setErrors']),
onRemoveItem(uuid) {
socket.emit('removeFromQueue', uuid);
},
setTabWidth(newWidth) {
if (undefined === newWidth) {
this.$refs.container.style.width = '';
this.$refs.list.style.width = '';
} else {
this.$refs.container.style.width = newWidth + 'px';
this.$refs.list.style.width = newWidth + 'px';
}
},
initQueue(data) {
const {
queue: initQueue,
queueComplete: initQueueComplete,
currentItem,
queueList: initQueueList,
restored
} = data;
if (initQueueComplete.length) {
initQueueComplete.forEach(item => {
initQueueList[item].silent = true;
this.addToQueue(initQueueList[item]);
});
}
if (currentItem) {
initQueueList[currentItem].silent = true;
this.addToQueue(initQueueList[currentItem], true);
}
initQueue.forEach(item => {
initQueueList[item].silent = true;
this.addToQueue(initQueueList[item]);
});
if (restored) {
toast(this.$t('toasts.queueRestored'), 'done', true, 'restoring_queue');
socket.emit('queueRestored');
}
},
addToQueue(queueItem, current = false) {
if (Array.isArray(queueItem)) {
if (queueItem.length > 1) {
queueItem.forEach((item, i) => {
item.silent = true;
this.addToQueue(item);
});
toast(this.$t('toasts.addedMoreToQueue', { n: queueItem.length }), 'playlist_add_check');
return
} else {
queueItem = queueItem[0];
}
}
// * Here we have only queueItem objects
this.$set(queueItem, 'current', current);
this.$set(this.queueList, queueItem.uuid, queueItem);
// * Used when opening the app in another tab
const itemIsAlreadyDownloaded = queueItem.downloaded + queueItem.failed == queueItem.size;
if (itemIsAlreadyDownloaded) {
const itemIsNotInCompletedQueue = this.queueComplete.indexOf(queueItem.uuid) == -1;
this.$set(this.queueList[queueItem.uuid], 'status', 'download finished');
if (itemIsNotInCompletedQueue) {
// * Add it
this.queueComplete.push(queueItem.uuid);
}
} else {
const itemIsNotInQueue = this.queue.indexOf(queueItem.uuid) == -1;
if (itemIsNotInQueue) {
this.queue.push(queueItem.uuid);
}
}
const needToStartDownload = (queueItem.progress > 0 && queueItem.progress < 100) || current;
if (needToStartDownload) {
this.startDownload(queueItem.uuid);
}
if (!queueItem.silent) {
toast(this.$t('toasts.addedToQueue', { item: queueItem.title }), 'playlist_add_check');
}
},
updateQueue(update) {
// downloaded and failed default to false?
const { uuid, downloaded, failed, progress, conversion, error, data, errid } = update;
if (uuid && this.queue.indexOf(uuid) > -1) {
if (downloaded) {
this.queueList[uuid].downloaded++;
}
if (failed) {
this.queueList[uuid].failed++;
this.queueList[uuid].errors.push({ message: error, data: data, errid: errid });
}
if (progress) {
this.queueList[uuid].progress = progress;
}
if (conversion) {
this.queueList[uuid].conversion = conversion;
}
}
},
removeFromQueue(uuid) {
let index = this.queue.indexOf(uuid);
if (index > -1) {
this.$delete(this.queue, index);
this.$delete(this.queueList, uuid);
}
},
removeAllDownloads(currentItem) {
this.queueComplete = [];
if (!currentItem) {
this.queue = [];
this.queueList = {};
} else {
this.queue = [currentItem];
let tempQueueItem = this.queueList[currentItem];
this.queueList = {};
this.queueList[currentItem] = tempQueueItem;
}
},
removedFinishedDownloads() {
this.queueComplete.forEach(uuid => {
this.$delete(this.queueList, uuid);
});
this.queueComplete = [];
},
toggleDownloadTab() {
this.setTabWidth();
this.$refs.container.style.transition = 'all 250ms ease-in-out';
// Toggle returns a Boolean based on the action it performed
this.isExpanded = !this.isExpanded;
if (this.isExpanded) {
this.setTabWidth(this.cachedTabWidth);
}
localStorage.setItem('downloadTabOpen', this.isExpanded);
},
cleanQueue() {
socket.emit('removeFinishedDownloads');
},
cancelQueue() {
socket.emit('cancelAllDownloads');
},
openDownloadsFolder() {
// if (this.clientMode) {
socket.emit('openDownloadsFolder');
// }
},
handleDrag(event) {
let newWidth = window.innerWidth - event.pageX + 2;
if (newWidth < tabMinWidth) {
newWidth = tabMinWidth;
} else if (newWidth > tabMaxWidth) {
newWidth = tabMaxWidth;
}
this.cachedTabWidth = newWidth;
this.setTabWidth(newWidth);
},
startDrag() {
document.addEventListener('mousemove', this.handleDrag);
},
startDownload(uuid) {
this.$set(this.queueList[uuid], 'status', 'downloading');
},
finishDownload(uuid) {
let isInQueue = this.queue.indexOf(uuid) > -1;
if (!isInQueue) return
this.$set(this.queueList[uuid], 'status', 'download finished');
toast(this.$t('toasts.finishDownload', { item: this.queueList[uuid].title }), 'done');
let index = this.queue.indexOf(uuid);
if (index > -1) {
this.queue.splice(index, 1);
this.queueComplete.push(uuid);
}
if (this.queue.length <= 0) {
toast(this.$t('toasts.allDownloaded'), 'done_all');
}
},
startConversion(uuid) {
this.$set(this.queueList[uuid], 'status', 'converting');
this.$set(this.queueList[uuid], 'conversion', 0);
},
async showErrorsTab(item) {
await this.setErrors(item);
this.$router.push({ name: 'Errors' });
}
}
};
/* script */
const __vue_script__$7 = script$7;
/* template */
var __vue_render__$9 = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('section',{ref:"container",staticClass:"block bg-panels-bg text-foreground h-screen",class:{ 'tab-hidden': !_vm.isExpanded, 'w-8': !_vm.isExpanded },attrs:{"id":"download_tab_container","data-label":_vm.$t('downloads'),"aria-label":"downloads"},on:{"transitionend":function($event){_vm.$refs.container.style.transition = '';}}},[_c('div',{directives:[{name:"show",rawName:"v-show",value:(_vm.isExpanded),expression:"isExpanded"}],staticClass:"absolute w-4 h-full bg-grayscale-200",staticStyle:{"cursor":"ew-resize"},on:{"mousedown":function($event){$event.preventDefault();return _vm.startDrag($event)}}}),_vm._v(" "),_c('i',{ref:"toggler",staticClass:"m-1 text-2xl cursor-pointer material-icons",class:{ 'ml-1': !_vm.isExpanded, 'ml-5': _vm.isExpanded },attrs:{"id":"toggle_download_tab","title":_vm.$t('globals.toggle_download_tab_hint')},on:{"click":function($event){$event.preventDefault();return _vm.toggleDownloadTab($event)}}}),_vm._v(" "),_c('div',{staticClass:"absolute top-0 right-0 transition-all duration-200 ease-in-out",class:{ 'opacity-0 invisible': !_vm.isExpanded, 'opacity-100 visible': _vm.isExpanded }},[(_vm.clientMode)?_c('i',{staticClass:"m-1 text-2xl cursor-pointer material-icons",attrs:{"title":_vm.$t('globals.open_downloads_folder')},on:{"click":_vm.openDownloadsFolder}},[_vm._v("\n\t\t\tfolder_open\n\t\t")]):_vm._e(),_vm._v(" "),_c('i',{staticClass:"m-1 text-2xl cursor-pointer material-icons",attrs:{"title":_vm.$t('globals.clean_queue_hint')},on:{"click":_vm.cleanQueue}},[_vm._v("\n\t\t\tclear_all\n\t\t")]),_vm._v(" "),_c('i',{staticClass:"m-1 text-2xl cursor-pointer material-icons",attrs:{"title":_vm.$t('globals.cancel_queue_hint')},on:{"click":_vm.cancelQueue}},[_vm._v("\n\t\t\tdelete_sweep\n\t\t")])]),_vm._v(" "),_c('div',{directives:[{name:"show",rawName:"v-show",value:(_vm.isExpanded),expression:"isExpanded"}],ref:"list",staticClass:"w-full pr-2",attrs:{"id":"download_list"}},_vm._l((_vm.queueList),function(item){return _c('QueueItem',{key:item.uuid,attrs:{"queue-item":item},on:{"show-errors":_vm.showErrorsTab,"remove-item":_vm.onRemoveItem}})}),1)])};
var __vue_staticRenderFns__$9 = [];
/* style */
const __vue_inject_styles__$9 = function (inject) {
if (!inject) return
inject("data-v-26a07528_0", { source: "#toggle_download_tab[data-v-26a07528]{width:25px;height:25px}#toggle_download_tab[data-v-26a07528]::before{font-family:'Material Icons';font-style:normal;font-weight:400;content:'chevron_right'}#download_tab_container.tab-hidden #toggle_download_tab[data-v-26a07528]::before{content:'chevron_left'}#download_tab_container.tab-hidden[data-v-26a07528]::after{content:attr(data-label);display:flex;align-items:center;text-transform:capitalize;writing-mode:vertical-rl;line-height:2rem}#download_list[data-v-26a07528]{height:calc(100% - 32px);padding-left:28px;overflow-y:scroll}#download_list[data-v-26a07528]::-webkit-scrollbar{width:10px}#download_list[data-v-26a07528]::-webkit-scrollbar-track{background:var(--panels-background)}#download_list[data-v-26a07528]::-webkit-scrollbar-thumb{background:var(--panels-scroll);border-radius:4px;width:6px;padding:0 2px}", map: undefined, media: undefined });
};
/* scoped */
const __vue_scope_id__$9 = "data-v-26a07528";
/* module identifier */
const __vue_module_identifier__$8 = undefined;
/* functional template */
const __vue_is_functional_template__$9 = false;
/* component normalizer */
function __vue_normalize__$9(
template, style, script,
scope, functional, moduleIdentifier,
createInjector, createInjectorSSR
) {
const component = (typeof script === 'function' ? script.options : script) || {};
// For security concerns, we use only base name in production mode.
component.__file = "TheDownloadBar.vue";
if (!component.render) {
component.render = template.render;
component.staticRenderFns = template.staticRenderFns;
component._compiled = true;
if (functional) component.functional = true;
}
component._scopeId = scope;
{
let hook;
if (style) {
hook = function(context) {
style.call(this, createInjector(context));
};
}
if (hook !== undefined) {
if (component.functional) {
// register for functional component in vue file
const originalRender = component.render;
component.render = function renderWithStyleInjection(h, context) {
hook.call(context);
return originalRender(h, context)
};
} else {
// inject component registration as beforeCreate hook
const existing = component.beforeCreate;
component.beforeCreate = existing ? [].concat(existing, hook) : [hook];
}
}
}
return component
}
/* style inject */
function __vue_create_injector__$8() {
const head = document.head || document.getElementsByTagName('head')[0];
const styles = __vue_create_injector__$8.styles || (__vue_create_injector__$8.styles = {});
const isOldIE =
typeof navigator !== 'undefined' &&
/msie [6-9]\\b/.test(navigator.userAgent.toLowerCase());
return function addStyle(id, css) {
if (document.querySelector('style[data-vue-ssr-id~="' + id + '"]')) return // SSR styles are present.
const group = isOldIE ? css.media || 'default' : id;
const style = styles[group] || (styles[group] = { ids: [], parts: [], element: undefined });
if (!style.ids.includes(id)) {
let code = css.source;
let index = style.ids.length;
style.ids.push(id);
if ( css.map) {
// https://developer.chrome.com/devtools/docs/javascript-debugging
// this makes source maps inside style tags work properly in Chrome
code += '\n/*# sourceURL=' + css.map.sources[0] + ' */';
// http://stackoverflow.com/a/26603875
code +=
'\n/*# sourceMappingURL=data:application/json;base64,' +
btoa(unescape(encodeURIComponent(JSON.stringify(css.map)))) +
' */';
}
if (isOldIE) {
style.element = style.element || document.querySelector('style[data-group=' + group + ']');
}
if (!style.element) {
const el = style.element = document.createElement('style');
el.type = 'text/css';
if (css.media) el.setAttribute('media', css.media);
if (isOldIE) {
el.setAttribute('data-group', group);
el.setAttribute('data-next-index', '0');
}
head.appendChild(el);
}
if (isOldIE) {
index = parseInt(style.element.getAttribute('data-next-index'));
style.element.setAttribute('data-next-index', index + 1);
}
if (style.element.styleSheet) {
style.parts.push(code);
style.element.styleSheet.cssText = style.parts
.filter(Boolean)
.join('\n');
} else {
const textNode = document.createTextNode(code);
const nodes = style.element.childNodes;
if (nodes[index]) style.element.removeChild(nodes[index]);
if (nodes.length) style.element.insertBefore(textNode, nodes[index]);
else style.element.appendChild(textNode);
}
}
}
}
/* style inject SSR */
var TheDownloadBar = __vue_normalize__$9(
{ render: __vue_render__$9, staticRenderFns: __vue_staticRenderFns__$9 },
__vue_inject_styles__$9,
__vue_script__$7,
__vue_scope_id__$9,
__vue_is_functional_template__$9,
__vue_module_identifier__$8,
__vue_create_injector__$8);
//
var script$8 = {
data() {
return {
isSocketConnected: false
}
},
components: {
TheSidebar,
TheSearchBar,
TheDownloadBar,
TheTrackPreview,
TheQualityModal,
BaseLoadingPlaceholder,
TheContextMenu,
TheContent
// ConfirmModal
},
mounted() {
socket.on('connect', () => {
this.isSocketConnected = true;
});
}
};
/* script */
const __vue_script__$8 = script$8;
/* template */
var __vue_render__$a = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{"id":"app"}},[_c('div',{staticClass:"app-container"},[_c('TheSidebar'),_vm._v(" "),_c('div',{staticClass:"content-container"},[_c('TheSearchBar'),_vm._v(" "),_c('TheContent')],1),_vm._v(" "),_c('TheDownloadBar')],1),_vm._v(" "),_c('BaseLoadingPlaceholder',{attrs:{"text":"Connecting to the server...","hidden":_vm.isSocketConnected,"additionalClasses":"absolute top-0 left-0 w-screen h-screen bg-black bg-opacity-50 z-50"}}),_vm._v(" "),_c('TheTrackPreview'),_vm._v(" "),_c('TheQualityModal'),_vm._v(" "),_c('TheContextMenu')],1)};
var __vue_staticRenderFns__$a = [];
/* style */
const __vue_inject_styles__$a = function (inject) {
if (!inject) return
inject("data-v-10c22928_0", { source: ".app-container{display:flex}.content-container{width:100%;display:flex;flex-direction:column}", map: undefined, media: undefined });
};
/* scoped */
const __vue_scope_id__$a = undefined;
/* module identifier */
const __vue_module_identifier__$9 = undefined;
/* functional template */
const __vue_is_functional_template__$a = false;
/* component normalizer */
function __vue_normalize__$a(
template, style, script,
scope, functional, moduleIdentifier,
createInjector, createInjectorSSR
) {
const component = (typeof script === 'function' ? script.options : script) || {};
// For security concerns, we use only base name in production mode.
component.__file = "App.vue";
if (!component.render) {
component.render = template.render;
component.staticRenderFns = template.staticRenderFns;
component._compiled = true;
if (functional) component.functional = true;
}
component._scopeId = scope;
{
let hook;
if (style) {
hook = function(context) {
style.call(this, createInjector(context));
};
}
if (hook !== undefined) {
if (component.functional) {
// register for functional component in vue file
const originalRender = component.render;
component.render = function renderWithStyleInjection(h, context) {
hook.call(context);
return originalRender(h, context)
};
} else {
// inject component registration as beforeCreate hook
const existing = component.beforeCreate;
component.beforeCreate = existing ? [].concat(existing, hook) : [hook];
}
}
}
return component
}
/* style inject */
function __vue_create_injector__$9() {
const head = document.head || document.getElementsByTagName('head')[0];
const styles = __vue_create_injector__$9.styles || (__vue_create_injector__$9.styles = {});
const isOldIE =
typeof navigator !== 'undefined' &&
/msie [6-9]\\b/.test(navigator.userAgent.toLowerCase());
return function addStyle(id, css) {
if (document.querySelector('style[data-vue-ssr-id~="' + id + '"]')) return // SSR styles are present.
const group = isOldIE ? css.media || 'default' : id;
const style = styles[group] || (styles[group] = { ids: [], parts: [], element: undefined });
if (!style.ids.includes(id)) {
let code = css.source;
let index = style.ids.length;
style.ids.push(id);
if ( css.map) {
// https://developer.chrome.com/devtools/docs/javascript-debugging
// this makes source maps inside style tags work properly in Chrome
code += '\n/*# sourceURL=' + css.map.sources[0] + ' */';
// http://stackoverflow.com/a/26603875
code +=
'\n/*# sourceMappingURL=data:application/json;base64,' +
btoa(unescape(encodeURIComponent(JSON.stringify(css.map)))) +
' */';
}
if (isOldIE) {
style.element = style.element || document.querySelector('style[data-group=' + group + ']');
}
if (!style.element) {
const el = style.element = document.createElement('style');
el.type = 'text/css';
if (css.media) el.setAttribute('media', css.media);
if (isOldIE) {
el.setAttribute('data-group', group);
el.setAttribute('data-next-index', '0');
}
head.appendChild(el);
}
if (isOldIE) {
index = parseInt(style.element.getAttribute('data-next-index'));
style.element.setAttribute('data-next-index', index + 1);
}
if (style.element.styleSheet) {
style.parts.push(code);
style.element.styleSheet.cssText = style.parts
.filter(Boolean)
.join('\n');
} else {
const textNode = document.createTextNode(code);
const nodes = style.element.childNodes;
if (nodes[index]) style.element.removeChild(nodes[index]);
if (nodes.length) style.element.insertBefore(textNode, nodes[index]);
else style.element.appendChild(textNode);
}
}
}
}
/* style inject SSR */
var App = __vue_normalize__$a(
{ render: __vue_render__$a, staticRenderFns: __vue_staticRenderFns__$a },
__vue_inject_styles__$a,
__vue_script__$8,
__vue_scope_id__$a,
__vue_is_functional_template__$a,
__vue_module_identifier__$9,
__vue_create_injector__$9);
/*!
* vue-i18n v8.22.1
* (c) 2020 kazuya kawaguchi
* Released under the MIT License.
*/
/* */
/**
* constants
*/
var numberFormatKeys = [
'style',
'currency',
'currencyDisplay',
'useGrouping',
'minimumIntegerDigits',
'minimumFractionDigits',
'maximumFractionDigits',
'minimumSignificantDigits',
'maximumSignificantDigits',
'localeMatcher',
'formatMatcher',
'unit'
];
/**
* utilities
*/
function warn$1 (msg, err) {
if (typeof console !== 'undefined') {
console.warn('[vue-i18n] ' + msg);
/* istanbul ignore if */
if (err) {
console.warn(err.stack);
}
}
}
function error (msg, err) {
if (typeof console !== 'undefined') {
console.error('[vue-i18n] ' + msg);
/* istanbul ignore if */
if (err) {
console.error(err.stack);
}
}
}
var isArray = Array.isArray;
function isObject$2 (obj) {
return obj !== null && typeof obj === 'object'
}
function isBoolean (val) {
return typeof val === 'boolean'
}
function isString (val) {
return typeof val === 'string'
}
var toString$1 = Object.prototype.toString;
var OBJECT_STRING = '[object Object]';
function isPlainObject$1 (obj) {
return toString$1.call(obj) === OBJECT_STRING
}
function isNull (val) {
return val === null || val === undefined
}
function isFunction (val) {
return typeof val === 'function'
}
function parseArgs () {
var args = [], len = arguments.length;
while ( len-- ) args[ len ] = arguments[ len ];
var locale = null;
var params = null;
if (args.length === 1) {
if (isObject$2(args[0]) || isArray(args[0])) {
params = args[0];
} else if (typeof args[0] === 'string') {
locale = args[0];
}
} else if (args.length === 2) {
if (typeof args[0] === 'string') {
locale = args[0];
}
/* istanbul ignore if */
if (isObject$2(args[1]) || isArray(args[1])) {
params = args[1];
}
}
return { locale: locale, params: params }
}
function looseClone (obj) {
return JSON.parse(JSON.stringify(obj))
}
function remove$3 (arr, item) {
if (arr.length) {
var index = arr.indexOf(item);
if (index > -1) {
return arr.splice(index, 1)
}
}
}
function includes (arr, item) {
return !!~arr.indexOf(item)
}
var hasOwnProperty$1 = Object.prototype.hasOwnProperty;
function hasOwn$1 (obj, key) {
return hasOwnProperty$1.call(obj, key)
}
function merge (target) {
var arguments$1 = arguments;
var output = Object(target);
for (var i = 1; i < arguments.length; i++) {
var source = arguments$1[i];
if (source !== undefined && source !== null) {
var key = (void 0);
for (key in source) {
if (hasOwn$1(source, key)) {
if (isObject$2(source[key])) {
output[key] = merge(output[key], source[key]);
} else {
output[key] = source[key];
}
}
}
}
}
return output
}
function looseEqual$1 (a, b) {
if (a === b) { return true }
var isObjectA = isObject$2(a);
var isObjectB = isObject$2(b);
if (isObjectA && isObjectB) {
try {
var isArrayA = isArray(a);
var isArrayB = isArray(b);
if (isArrayA && isArrayB) {
return a.length === b.length && a.every(function (e, i) {
return looseEqual$1(e, b[i])
})
} else if (!isArrayA && !isArrayB) {
var keysA = Object.keys(a);
var keysB = Object.keys(b);
return keysA.length === keysB.length && keysA.every(function (key) {
return looseEqual$1(a[key], b[key])
})
} else {
/* istanbul ignore next */
return false
}
} catch (e) {
/* istanbul ignore next */
return false
}
} else if (!isObjectA && !isObjectB) {
return String(a) === String(b)
} else {
return false
}
}
/**
* Sanitizes html special characters from input strings. For mitigating risk of XSS attacks.
* @param rawText The raw input from the user that should be escaped.
*/
function escapeHtml(rawText) {
return rawText
.replace(/</g, '&lt;')
.replace(/>/g, '&gt;')
.replace(/"/g, '&quot;')
.replace(/'/g, '&apos;')
}
/**
* Escapes html tags and special symbols from all provided params which were returned from parseArgs().params.
* This method performs an in-place operation on the params object.
*
* @param {any} params Parameters as provided from `parseArgs().params`.
* May be either an array of strings or a string->any map.
*
* @returns The manipulated `params` object.
*/
function escapeParams(params) {
if(params != null) {
Object.keys(params).forEach(function (key) {
if(typeof(params[key]) == 'string') {
params[key] = escapeHtml(params[key]);
}
});
}
return params
}
/* */
function extend$1 (Vue) {
if (!Vue.prototype.hasOwnProperty('$i18n')) {
// $FlowFixMe
Object.defineProperty(Vue.prototype, '$i18n', {
get: function get () { return this._i18n }
});
}
Vue.prototype.$t = function (key) {
var values = [], len = arguments.length - 1;
while ( len-- > 0 ) values[ len ] = arguments[ len + 1 ];
var i18n = this.$i18n;
return i18n._t.apply(i18n, [ key, i18n.locale, i18n._getMessages(), this ].concat( values ))
};
Vue.prototype.$tc = function (key, choice) {
var values = [], len = arguments.length - 2;
while ( len-- > 0 ) values[ len ] = arguments[ len + 2 ];
var i18n = this.$i18n;
return i18n._tc.apply(i18n, [ key, i18n.locale, i18n._getMessages(), this, choice ].concat( values ))
};
Vue.prototype.$te = function (key, locale) {
var i18n = this.$i18n;
return i18n._te(key, i18n.locale, i18n._getMessages(), locale)
};
Vue.prototype.$d = function (value) {
var ref;
var args = [], len = arguments.length - 1;
while ( len-- > 0 ) args[ len ] = arguments[ len + 1 ];
return (ref = this.$i18n).d.apply(ref, [ value ].concat( args ))
};
Vue.prototype.$n = function (value) {
var ref;
var args = [], len = arguments.length - 1;
while ( len-- > 0 ) args[ len ] = arguments[ len + 1 ];
return (ref = this.$i18n).n.apply(ref, [ value ].concat( args ))
};
}
/* */
var mixin = {
beforeCreate: function beforeCreate () {
var options = this.$options;
options.i18n = options.i18n || (options.__i18n ? {} : null);
if (options.i18n) {
if (options.i18n instanceof VueI18n) {
// init locale messages via custom blocks
if (options.__i18n) {
try {
var localeMessages = options.i18n && options.i18n.messages ? options.i18n.messages : {};
options.__i18n.forEach(function (resource) {
localeMessages = merge(localeMessages, JSON.parse(resource));
});
Object.keys(localeMessages).forEach(function (locale) {
options.i18n.mergeLocaleMessage(locale, localeMessages[locale]);
});
} catch (e) {
}
}
this._i18n = options.i18n;
this._i18nWatcher = this._i18n.watchI18nData();
} else if (isPlainObject$1(options.i18n)) {
var rootI18n = this.$root && this.$root.$i18n && this.$root.$i18n instanceof VueI18n
? this.$root.$i18n
: null;
// component local i18n
if (rootI18n) {
options.i18n.root = this.$root;
options.i18n.formatter = rootI18n.formatter;
options.i18n.fallbackLocale = rootI18n.fallbackLocale;
options.i18n.formatFallbackMessages = rootI18n.formatFallbackMessages;
options.i18n.silentTranslationWarn = rootI18n.silentTranslationWarn;
options.i18n.silentFallbackWarn = rootI18n.silentFallbackWarn;
options.i18n.pluralizationRules = rootI18n.pluralizationRules;
options.i18n.preserveDirectiveContent = rootI18n.preserveDirectiveContent;
}
// init locale messages via custom blocks
if (options.__i18n) {
try {
var localeMessages$1 = options.i18n && options.i18n.messages ? options.i18n.messages : {};
options.__i18n.forEach(function (resource) {
localeMessages$1 = merge(localeMessages$1, JSON.parse(resource));
});
options.i18n.messages = localeMessages$1;
} catch (e) {
}
}
var ref = options.i18n;
var sharedMessages = ref.sharedMessages;
if (sharedMessages && isPlainObject$1(sharedMessages)) {
options.i18n.messages = merge(options.i18n.messages, sharedMessages);
}
this._i18n = new VueI18n(options.i18n);
this._i18nWatcher = this._i18n.watchI18nData();
if (options.i18n.sync === undefined || !!options.i18n.sync) {
this._localeWatcher = this.$i18n.watchLocale();
}
if (rootI18n) {
rootI18n.onComponentInstanceCreated(this._i18n);
}
} else ;
} else if (this.$root && this.$root.$i18n && this.$root.$i18n instanceof VueI18n) {
// root i18n
this._i18n = this.$root.$i18n;
} else if (options.parent && options.parent.$i18n && options.parent.$i18n instanceof VueI18n) {
// parent i18n
this._i18n = options.parent.$i18n;
}
},
beforeMount: function beforeMount () {
var options = this.$options;
options.i18n = options.i18n || (options.__i18n ? {} : null);
if (options.i18n) {
if (options.i18n instanceof VueI18n) {
// init locale messages via custom blocks
this._i18n.subscribeDataChanging(this);
this._subscribing = true;
} else if (isPlainObject$1(options.i18n)) {
this._i18n.subscribeDataChanging(this);
this._subscribing = true;
} else ;
} else if (this.$root && this.$root.$i18n && this.$root.$i18n instanceof VueI18n) {
this._i18n.subscribeDataChanging(this);
this._subscribing = true;
} else if (options.parent && options.parent.$i18n && options.parent.$i18n instanceof VueI18n) {
this._i18n.subscribeDataChanging(this);
this._subscribing = true;
}
},
beforeDestroy: function beforeDestroy () {
if (!this._i18n) { return }
var self = this;
this.$nextTick(function () {
if (self._subscribing) {
self._i18n.unsubscribeDataChanging(self);
delete self._subscribing;
}
if (self._i18nWatcher) {
self._i18nWatcher();
self._i18n.destroyVM();
delete self._i18nWatcher;
}
if (self._localeWatcher) {
self._localeWatcher();
delete self._localeWatcher;
}
});
}
};
/* */
var interpolationComponent = {
name: 'i18n',
functional: true,
props: {
tag: {
type: [String, Boolean, Object],
default: 'span'
},
path: {
type: String,
required: true
},
locale: {
type: String
},
places: {
type: [Array, Object]
}
},
render: function render (h, ref) {
var data = ref.data;
var parent = ref.parent;
var props = ref.props;
var slots = ref.slots;
var $i18n = parent.$i18n;
if (!$i18n) {
return
}
var path = props.path;
var locale = props.locale;
var places = props.places;
var params = slots();
var children = $i18n.i(
path,
locale,
onlyHasDefaultPlace(params) || places
? useLegacyPlaces(params.default, places)
: params
);
var tag = (!!props.tag && props.tag !== true) || props.tag === false ? props.tag : 'span';
return tag ? h(tag, data, children) : children
}
};
function onlyHasDefaultPlace (params) {
var prop;
for (prop in params) {
if (prop !== 'default') { return false }
}
return Boolean(prop)
}
function useLegacyPlaces (children, places) {
var params = places ? createParamsFromPlaces(places) : {};
if (!children) { return params }
// Filter empty text nodes
children = children.filter(function (child) {
return child.tag || child.text.trim() !== ''
});
var everyPlace = children.every(vnodeHasPlaceAttribute);
return children.reduce(
everyPlace ? assignChildPlace : assignChildIndex,
params
)
}
function createParamsFromPlaces (places) {
return Array.isArray(places)
? places.reduce(assignChildIndex, {})
: Object.assign({}, places)
}
function assignChildPlace (params, child) {
if (child.data && child.data.attrs && child.data.attrs.place) {
params[child.data.attrs.place] = child;
}
return params
}
function assignChildIndex (params, child, index) {
params[index] = child;
return params
}
function vnodeHasPlaceAttribute (vnode) {
return Boolean(vnode.data && vnode.data.attrs && vnode.data.attrs.place)
}
/* */
var numberComponent = {
name: 'i18n-n',
functional: true,
props: {
tag: {
type: [String, Boolean, Object],
default: 'span'
},
value: {
type: Number,
required: true
},
format: {
type: [String, Object]
},
locale: {
type: String
}
},
render: function render (h, ref) {
var props = ref.props;
var parent = ref.parent;
var data = ref.data;
var i18n = parent.$i18n;
if (!i18n) {
return null
}
var key = null;
var options = null;
if (isString(props.format)) {
key = props.format;
} else if (isObject$2(props.format)) {
if (props.format.key) {
key = props.format.key;
}
// Filter out number format options only
options = Object.keys(props.format).reduce(function (acc, prop) {
var obj;
if (includes(numberFormatKeys, prop)) {
return Object.assign({}, acc, ( obj = {}, obj[prop] = props.format[prop], obj ))
}
return acc
}, null);
}
var locale = props.locale || i18n.locale;
var parts = i18n._ntp(props.value, locale, key, options);
var values = parts.map(function (part, index) {
var obj;
var slot = data.scopedSlots && data.scopedSlots[part.type];
return slot ? slot(( obj = {}, obj[part.type] = part.value, obj.index = index, obj.parts = parts, obj )) : part.value
});
var tag = (!!props.tag && props.tag !== true) || props.tag === false ? props.tag : 'span';
return tag
? h(tag, {
attrs: data.attrs,
'class': data['class'],
staticClass: data.staticClass
}, values)
: values
}
};
/* */
function bind$2 (el, binding, vnode) {
if (!assert(el, vnode)) { return }
t(el, binding, vnode);
}
function update$1 (el, binding, vnode, oldVNode) {
if (!assert(el, vnode)) { return }
var i18n = vnode.context.$i18n;
if (localeEqual(el, vnode) &&
(looseEqual$1(binding.value, binding.oldValue) &&
looseEqual$1(el._localeMessage, i18n.getLocaleMessage(i18n.locale)))) { return }
t(el, binding, vnode);
}
function unbind (el, binding, vnode, oldVNode) {
var vm = vnode.context;
if (!vm) {
warn$1('Vue instance does not exists in VNode context');
return
}
var i18n = vnode.context.$i18n || {};
if (!binding.modifiers.preserve && !i18n.preserveDirectiveContent) {
el.textContent = '';
}
el._vt = undefined;
delete el['_vt'];
el._locale = undefined;
delete el['_locale'];
el._localeMessage = undefined;
delete el['_localeMessage'];
}
function assert (el, vnode) {
var vm = vnode.context;
if (!vm) {
warn$1('Vue instance does not exists in VNode context');
return false
}
if (!vm.$i18n) {
warn$1('VueI18n instance does not exists in Vue instance');
return false
}
return true
}
function localeEqual (el, vnode) {
var vm = vnode.context;
return el._locale === vm.$i18n.locale
}
function t (el, binding, vnode) {
var ref$1, ref$2;
var value = binding.value;
var ref = parseValue(value);
var path = ref.path;
var locale = ref.locale;
var args = ref.args;
var choice = ref.choice;
if (!path && !locale && !args) {
warn$1('value type not supported');
return
}
if (!path) {
warn$1('`path` is required in v-t directive');
return
}
var vm = vnode.context;
if (choice != null) {
el._vt = el.textContent = (ref$1 = vm.$i18n).tc.apply(ref$1, [ path, choice ].concat( makeParams(locale, args) ));
} else {
el._vt = el.textContent = (ref$2 = vm.$i18n).t.apply(ref$2, [ path ].concat( makeParams(locale, args) ));
}
el._locale = vm.$i18n.locale;
el._localeMessage = vm.$i18n.getLocaleMessage(vm.$i18n.locale);
}
function parseValue (value) {
var path;
var locale;
var args;
var choice;
if (isString(value)) {
path = value;
} else if (isPlainObject$1(value)) {
path = value.path;
locale = value.locale;
args = value.args;
choice = value.choice;
}
return { path: path, locale: locale, args: args, choice: choice }
}
function makeParams (locale, args) {
var params = [];
locale && params.push(locale);
if (args && (Array.isArray(args) || isPlainObject$1(args))) {
params.push(args);
}
return params
}
var Vue$2;
function install$1 (_Vue) {
install$1.installed = true;
Vue$2 = _Vue;
var version = (Vue$2.version && Number(Vue$2.version.split('.')[0])) || -1;
extend$1(Vue$2);
Vue$2.mixin(mixin);
Vue$2.directive('t', { bind: bind$2, update: update$1, unbind: unbind });
Vue$2.component(interpolationComponent.name, interpolationComponent);
Vue$2.component(numberComponent.name, numberComponent);
// use simple mergeStrategies to prevent i18n instance lose '__proto__'
var strats = Vue$2.config.optionMergeStrategies;
strats.i18n = function (parentVal, childVal) {
return childVal === undefined
? parentVal
: childVal
};
}
/* */
var BaseFormatter = function BaseFormatter () {
this._caches = Object.create(null);
};
BaseFormatter.prototype.interpolate = function interpolate (message, values) {
if (!values) {
return [message]
}
var tokens = this._caches[message];
if (!tokens) {
tokens = parse$1(message);
this._caches[message] = tokens;
}
return compile(tokens, values)
};
var RE_TOKEN_LIST_VALUE = /^(?:\d)+/;
var RE_TOKEN_NAMED_VALUE = /^(?:\w)+/;
function parse$1 (format) {
var tokens = [];
var position = 0;
var text = '';
while (position < format.length) {
var char = format[position++];
if (char === '{') {
if (text) {
tokens.push({ type: 'text', value: text });
}
text = '';
var sub = '';
char = format[position++];
while (char !== undefined && char !== '}') {
sub += char;
char = format[position++];
}
var isClosed = char === '}';
var type = RE_TOKEN_LIST_VALUE.test(sub)
? 'list'
: isClosed && RE_TOKEN_NAMED_VALUE.test(sub)
? 'named'
: 'unknown';
tokens.push({ value: sub, type: type });
} else if (char === '%') {
// when found rails i18n syntax, skip text capture
if (format[(position)] !== '{') {
text += char;
}
} else {
text += char;
}
}
text && tokens.push({ type: 'text', value: text });
return tokens
}
function compile (tokens, values) {
var compiled = [];
var index = 0;
var mode = Array.isArray(values)
? 'list'
: isObject$2(values)
? 'named'
: 'unknown';
if (mode === 'unknown') { return compiled }
while (index < tokens.length) {
var token = tokens[index];
switch (token.type) {
case 'text':
compiled.push(token.value);
break
case 'list':
compiled.push(values[parseInt(token.value, 10)]);
break
case 'named':
if (mode === 'named') {
compiled.push((values)[token.value]);
}
break
}
index++;
}
return compiled
}
/* */
/**
* Path parser
* - Inspired:
* Vue.js Path parser
*/
// actions
var APPEND = 0;
var PUSH = 1;
var INC_SUB_PATH_DEPTH = 2;
var PUSH_SUB_PATH = 3;
// states
var BEFORE_PATH = 0;
var IN_PATH = 1;
var BEFORE_IDENT = 2;
var IN_IDENT = 3;
var IN_SUB_PATH = 4;
var IN_SINGLE_QUOTE = 5;
var IN_DOUBLE_QUOTE = 6;
var AFTER_PATH = 7;
var ERROR = 8;
var pathStateMachine = [];
pathStateMachine[BEFORE_PATH] = {
'ws': [BEFORE_PATH],
'ident': [IN_IDENT, APPEND],
'[': [IN_SUB_PATH],
'eof': [AFTER_PATH]
};
pathStateMachine[IN_PATH] = {
'ws': [IN_PATH],
'.': [BEFORE_IDENT],
'[': [IN_SUB_PATH],
'eof': [AFTER_PATH]
};
pathStateMachine[BEFORE_IDENT] = {
'ws': [BEFORE_IDENT],
'ident': [IN_IDENT, APPEND],
'0': [IN_IDENT, APPEND],
'number': [IN_IDENT, APPEND]
};
pathStateMachine[IN_IDENT] = {
'ident': [IN_IDENT, APPEND],
'0': [IN_IDENT, APPEND],
'number': [IN_IDENT, APPEND],
'ws': [IN_PATH, PUSH],
'.': [BEFORE_IDENT, PUSH],
'[': [IN_SUB_PATH, PUSH],
'eof': [AFTER_PATH, PUSH]
};
pathStateMachine[IN_SUB_PATH] = {
"'": [IN_SINGLE_QUOTE, APPEND],
'"': [IN_DOUBLE_QUOTE, APPEND],
'[': [IN_SUB_PATH, INC_SUB_PATH_DEPTH],
']': [IN_PATH, PUSH_SUB_PATH],
'eof': ERROR,
'else': [IN_SUB_PATH, APPEND]
};
pathStateMachine[IN_SINGLE_QUOTE] = {
"'": [IN_SUB_PATH, APPEND],
'eof': ERROR,
'else': [IN_SINGLE_QUOTE, APPEND]
};
pathStateMachine[IN_DOUBLE_QUOTE] = {
'"': [IN_SUB_PATH, APPEND],
'eof': ERROR,
'else': [IN_DOUBLE_QUOTE, APPEND]
};
/**
* Check if an expression is a literal value.
*/
var literalValueRE = /^\s?(?:true|false|-?[\d.]+|'[^']*'|"[^"]*")\s?$/;
function isLiteral (exp) {
return literalValueRE.test(exp)
}
/**
* Strip quotes from a string
*/
function stripQuotes (str) {
var a = str.charCodeAt(0);
var b = str.charCodeAt(str.length - 1);
return a === b && (a === 0x22 || a === 0x27)
? str.slice(1, -1)
: str
}
/**
* Determine the type of a character in a keypath.
*/
function getPathCharType (ch) {
if (ch === undefined || ch === null) { return 'eof' }
var code = ch.charCodeAt(0);
switch (code) {
case 0x5B: // [
case 0x5D: // ]
case 0x2E: // .
case 0x22: // "
case 0x27: // '
return ch
case 0x5F: // _
case 0x24: // $
case 0x2D: // -
return 'ident'
case 0x09: // Tab
case 0x0A: // Newline
case 0x0D: // Return
case 0xA0: // No-break space
case 0xFEFF: // Byte Order Mark
case 0x2028: // Line Separator
case 0x2029: // Paragraph Separator
return 'ws'
}
return 'ident'
}
/**
* Format a subPath, return its plain form if it is
* a literal string or number. Otherwise prepend the
* dynamic indicator (*).
*/
function formatSubPath (path) {
var trimmed = path.trim();
// invalid leading 0
if (path.charAt(0) === '0' && isNaN(path)) { return false }
return isLiteral(trimmed) ? stripQuotes(trimmed) : '*' + trimmed
}
/**
* Parse a string path into an array of segments
*/
function parse$1$1 (path) {
var keys = [];
var index = -1;
var mode = BEFORE_PATH;
var subPathDepth = 0;
var c;
var key;
var newChar;
var type;
var transition;
var action;
var typeMap;
var actions = [];
actions[PUSH] = function () {
if (key !== undefined) {
keys.push(key);
key = undefined;
}
};
actions[APPEND] = function () {
if (key === undefined) {
key = newChar;
} else {
key += newChar;
}
};
actions[INC_SUB_PATH_DEPTH] = function () {
actions[APPEND]();
subPathDepth++;
};
actions[PUSH_SUB_PATH] = function () {
if (subPathDepth > 0) {
subPathDepth--;
mode = IN_SUB_PATH;
actions[APPEND]();
} else {
subPathDepth = 0;
if (key === undefined) { return false }
key = formatSubPath(key);
if (key === false) {
return false
} else {
actions[PUSH]();
}
}
};
function maybeUnescapeQuote () {
var nextChar = path[index + 1];
if ((mode === IN_SINGLE_QUOTE && nextChar === "'") ||
(mode === IN_DOUBLE_QUOTE && nextChar === '"')) {
index++;
newChar = '\\' + nextChar;
actions[APPEND]();
return true
}
}
while (mode !== null) {
index++;
c = path[index];
if (c === '\\' && maybeUnescapeQuote()) {
continue
}
type = getPathCharType(c);
typeMap = pathStateMachine[mode];
transition = typeMap[type] || typeMap['else'] || ERROR;
if (transition === ERROR) {
return // parse error
}
mode = transition[0];
action = actions[transition[1]];
if (action) {
newChar = transition[2];
newChar = newChar === undefined
? c
: newChar;
if (action() === false) {
return
}
}
if (mode === AFTER_PATH) {
return keys
}
}
}
var I18nPath = function I18nPath () {
this._cache = Object.create(null);
};
/**
* External parse that check for a cache hit first
*/
I18nPath.prototype.parsePath = function parsePath (path) {
var hit = this._cache[path];
if (!hit) {
hit = parse$1$1(path);
if (hit) {
this._cache[path] = hit;
}
}
return hit || []
};
/**
* Get path value from path string
*/
I18nPath.prototype.getPathValue = function getPathValue (obj, path) {
if (!isObject$2(obj)) { return null }
var paths = this.parsePath(path);
if (paths.length === 0) {
return null
} else {
var length = paths.length;
var last = obj;
var i = 0;
while (i < length) {
var value = last[paths[i]];
if (value === undefined) {
return null
}
last = value;
i++;
}
return last
}
};
/* */
var htmlTagMatcher = /<\/?[\w\s="/.':;#-\/]+>/;
var linkKeyMatcher = /(?:@(?:\.[a-z]+)?:(?:[\w\-_|.]+|\([\w\-_|.]+\)))/g;
var linkKeyPrefixMatcher = /^@(?:\.([a-z]+))?:/;
var bracketsMatcher = /[()]/g;
var defaultModifiers = {
'upper': function (str) { return str.toLocaleUpperCase(); },
'lower': function (str) { return str.toLocaleLowerCase(); },
'capitalize': function (str) { return ("" + (str.charAt(0).toLocaleUpperCase()) + (str.substr(1))); }
};
var defaultFormatter = new BaseFormatter();
var VueI18n = function VueI18n (options) {
var this$1 = this;
if ( options === void 0 ) options = {};
// Auto install if it is not done yet and `window` has `Vue`.
// To allow users to avoid auto-installation in some cases,
// this code should be placed here. See #290
/* istanbul ignore if */
if (!Vue$2 && typeof window !== 'undefined' && window.Vue) {
install$1(window.Vue);
}
var locale = options.locale || 'en-US';
var fallbackLocale = options.fallbackLocale === false
? false
: options.fallbackLocale || 'en-US';
var messages = options.messages || {};
var dateTimeFormats = options.dateTimeFormats || {};
var numberFormats = options.numberFormats || {};
this._vm = null;
this._formatter = options.formatter || defaultFormatter;
this._modifiers = options.modifiers || {};
this._missing = options.missing || null;
this._root = options.root || null;
this._sync = options.sync === undefined ? true : !!options.sync;
this._fallbackRoot = options.fallbackRoot === undefined
? true
: !!options.fallbackRoot;
this._formatFallbackMessages = options.formatFallbackMessages === undefined
? false
: !!options.formatFallbackMessages;
this._silentTranslationWarn = options.silentTranslationWarn === undefined
? false
: options.silentTranslationWarn;
this._silentFallbackWarn = options.silentFallbackWarn === undefined
? false
: !!options.silentFallbackWarn;
this._dateTimeFormatters = {};
this._numberFormatters = {};
this._path = new I18nPath();
this._dataListeners = [];
this._componentInstanceCreatedListener = options.componentInstanceCreatedListener || null;
this._preserveDirectiveContent = options.preserveDirectiveContent === undefined
? false
: !!options.preserveDirectiveContent;
this.pluralizationRules = options.pluralizationRules || {};
this._warnHtmlInMessage = options.warnHtmlInMessage || 'off';
this._postTranslation = options.postTranslation || null;
this._escapeParameterHtml = options.escapeParameterHtml || false;
/**
* @param choice {number} a choice index given by the input to $tc: `$tc('path.to.rule', choiceIndex)`
* @param choicesLength {number} an overall amount of available choices
* @returns a final choice index
*/
this.getChoiceIndex = function (choice, choicesLength) {
var thisPrototype = Object.getPrototypeOf(this$1);
if (thisPrototype && thisPrototype.getChoiceIndex) {
var prototypeGetChoiceIndex = (thisPrototype.getChoiceIndex);
return (prototypeGetChoiceIndex).call(this$1, choice, choicesLength)
}
// Default (old) getChoiceIndex implementation - english-compatible
var defaultImpl = function (_choice, _choicesLength) {
_choice = Math.abs(_choice);
if (_choicesLength === 2) {
return _choice
? _choice > 1
? 1
: 0
: 1
}
return _choice ? Math.min(_choice, 2) : 0
};
if (this$1.locale in this$1.pluralizationRules) {
return this$1.pluralizationRules[this$1.locale].apply(this$1, [choice, choicesLength])
} else {
return defaultImpl(choice, choicesLength)
}
};
this._exist = function (message, key) {
if (!message || !key) { return false }
if (!isNull(this$1._path.getPathValue(message, key))) { return true }
// fallback for flat key
if (message[key]) { return true }
return false
};
if (this._warnHtmlInMessage === 'warn' || this._warnHtmlInMessage === 'error') {
Object.keys(messages).forEach(function (locale) {
this$1._checkLocaleMessage(locale, this$1._warnHtmlInMessage, messages[locale]);
});
}
this._initVM({
locale: locale,
fallbackLocale: fallbackLocale,
messages: messages,
dateTimeFormats: dateTimeFormats,
numberFormats: numberFormats
});
};
var prototypeAccessors$2 = { vm: { configurable: true },messages: { configurable: true },dateTimeFormats: { configurable: true },numberFormats: { configurable: true },availableLocales: { configurable: true },locale: { configurable: true },fallbackLocale: { configurable: true },formatFallbackMessages: { configurable: true },missing: { configurable: true },formatter: { configurable: true },silentTranslationWarn: { configurable: true },silentFallbackWarn: { configurable: true },preserveDirectiveContent: { configurable: true },warnHtmlInMessage: { configurable: true },postTranslation: { configurable: true } };
VueI18n.prototype._checkLocaleMessage = function _checkLocaleMessage (locale, level, message) {
var paths = [];
var fn = function (level, locale, message, paths) {
if (isPlainObject$1(message)) {
Object.keys(message).forEach(function (key) {
var val = message[key];
if (isPlainObject$1(val)) {
paths.push(key);
paths.push('.');
fn(level, locale, val, paths);
paths.pop();
paths.pop();
} else {
paths.push(key);
fn(level, locale, val, paths);
paths.pop();
}
});
} else if (isArray(message)) {
message.forEach(function (item, index) {
if (isPlainObject$1(item)) {
paths.push(("[" + index + "]"));
paths.push('.');
fn(level, locale, item, paths);
paths.pop();
paths.pop();
} else {
paths.push(("[" + index + "]"));
fn(level, locale, item, paths);
paths.pop();
}
});
} else if (isString(message)) {
var ret = htmlTagMatcher.test(message);
if (ret) {
var msg = "Detected HTML in message '" + message + "' of keypath '" + (paths.join('')) + "' at '" + locale + "'. Consider component interpolation with '<i18n>' to avoid XSS. See https://bit.ly/2ZqJzkp";
if (level === 'warn') {
warn$1(msg);
} else if (level === 'error') {
error(msg);
}
}
}
};
fn(level, locale, message, paths);
};
VueI18n.prototype._initVM = function _initVM (data) {
var silent = Vue$2.config.silent;
Vue$2.config.silent = true;
this._vm = new Vue$2({ data: data });
Vue$2.config.silent = silent;
};
VueI18n.prototype.destroyVM = function destroyVM () {
this._vm.$destroy();
};
VueI18n.prototype.subscribeDataChanging = function subscribeDataChanging (vm) {
this._dataListeners.push(vm);
};
VueI18n.prototype.unsubscribeDataChanging = function unsubscribeDataChanging (vm) {
remove$3(this._dataListeners, vm);
};
VueI18n.prototype.watchI18nData = function watchI18nData () {
var self = this;
return this._vm.$watch('$data', function () {
var i = self._dataListeners.length;
while (i--) {
Vue$2.nextTick(function () {
self._dataListeners[i] && self._dataListeners[i].$forceUpdate();
});
}
}, { deep: true })
};
VueI18n.prototype.watchLocale = function watchLocale () {
/* istanbul ignore if */
if (!this._sync || !this._root) { return null }
var target = this._vm;
return this._root.$i18n.vm.$watch('locale', function (val) {
target.$set(target, 'locale', val);
target.$forceUpdate();
}, { immediate: true })
};
VueI18n.prototype.onComponentInstanceCreated = function onComponentInstanceCreated (newI18n) {
if (this._componentInstanceCreatedListener) {
this._componentInstanceCreatedListener(newI18n, this);
}
};
prototypeAccessors$2.vm.get = function () { return this._vm };
prototypeAccessors$2.messages.get = function () { return looseClone(this._getMessages()) };
prototypeAccessors$2.dateTimeFormats.get = function () { return looseClone(this._getDateTimeFormats()) };
prototypeAccessors$2.numberFormats.get = function () { return looseClone(this._getNumberFormats()) };
prototypeAccessors$2.availableLocales.get = function () { return Object.keys(this.messages).sort() };
prototypeAccessors$2.locale.get = function () { return this._vm.locale };
prototypeAccessors$2.locale.set = function (locale) {
this._vm.$set(this._vm, 'locale', locale);
};
prototypeAccessors$2.fallbackLocale.get = function () { return this._vm.fallbackLocale };
prototypeAccessors$2.fallbackLocale.set = function (locale) {
this._localeChainCache = {};
this._vm.$set(this._vm, 'fallbackLocale', locale);
};
prototypeAccessors$2.formatFallbackMessages.get = function () { return this._formatFallbackMessages };
prototypeAccessors$2.formatFallbackMessages.set = function (fallback) { this._formatFallbackMessages = fallback; };
prototypeAccessors$2.missing.get = function () { return this._missing };
prototypeAccessors$2.missing.set = function (handler) { this._missing = handler; };
prototypeAccessors$2.formatter.get = function () { return this._formatter };
prototypeAccessors$2.formatter.set = function (formatter) { this._formatter = formatter; };
prototypeAccessors$2.silentTranslationWarn.get = function () { return this._silentTranslationWarn };
prototypeAccessors$2.silentTranslationWarn.set = function (silent) { this._silentTranslationWarn = silent; };
prototypeAccessors$2.silentFallbackWarn.get = function () { return this._silentFallbackWarn };
prototypeAccessors$2.silentFallbackWarn.set = function (silent) { this._silentFallbackWarn = silent; };
prototypeAccessors$2.preserveDirectiveContent.get = function () { return this._preserveDirectiveContent };
prototypeAccessors$2.preserveDirectiveContent.set = function (preserve) { this._preserveDirectiveContent = preserve; };
prototypeAccessors$2.warnHtmlInMessage.get = function () { return this._warnHtmlInMessage };
prototypeAccessors$2.warnHtmlInMessage.set = function (level) {
var this$1 = this;
var orgLevel = this._warnHtmlInMessage;
this._warnHtmlInMessage = level;
if (orgLevel !== level && (level === 'warn' || level === 'error')) {
var messages = this._getMessages();
Object.keys(messages).forEach(function (locale) {
this$1._checkLocaleMessage(locale, this$1._warnHtmlInMessage, messages[locale]);
});
}
};
prototypeAccessors$2.postTranslation.get = function () { return this._postTranslation };
prototypeAccessors$2.postTranslation.set = function (handler) { this._postTranslation = handler; };
VueI18n.prototype._getMessages = function _getMessages () { return this._vm.messages };
VueI18n.prototype._getDateTimeFormats = function _getDateTimeFormats () { return this._vm.dateTimeFormats };
VueI18n.prototype._getNumberFormats = function _getNumberFormats () { return this._vm.numberFormats };
VueI18n.prototype._warnDefault = function _warnDefault (locale, key, result, vm, values, interpolateMode) {
if (!isNull(result)) { return result }
if (this._missing) {
var missingRet = this._missing.apply(null, [locale, key, vm, values]);
if (isString(missingRet)) {
return missingRet
}
}
if (this._formatFallbackMessages) {
var parsedArgs = parseArgs.apply(void 0, values);
return this._render(key, interpolateMode, parsedArgs.params, key)
} else {
return key
}
};
VueI18n.prototype._isFallbackRoot = function _isFallbackRoot (val) {
return !val && !isNull(this._root) && this._fallbackRoot
};
VueI18n.prototype._isSilentFallbackWarn = function _isSilentFallbackWarn (key) {
return this._silentFallbackWarn instanceof RegExp
? this._silentFallbackWarn.test(key)
: this._silentFallbackWarn
};
VueI18n.prototype._isSilentFallback = function _isSilentFallback (locale, key) {
return this._isSilentFallbackWarn(key) && (this._isFallbackRoot() || locale !== this.fallbackLocale)
};
VueI18n.prototype._isSilentTranslationWarn = function _isSilentTranslationWarn (key) {
return this._silentTranslationWarn instanceof RegExp
? this._silentTranslationWarn.test(key)
: this._silentTranslationWarn
};
VueI18n.prototype._interpolate = function _interpolate (
locale,
message,
key,
host,
interpolateMode,
values,
visitedLinkStack
) {
if (!message) { return null }
var pathRet = this._path.getPathValue(message, key);
if (isArray(pathRet) || isPlainObject$1(pathRet)) { return pathRet }
var ret;
if (isNull(pathRet)) {
/* istanbul ignore else */
if (isPlainObject$1(message)) {
ret = message[key];
if (!(isString(ret) || isFunction(ret))) {
return null
}
} else {
return null
}
} else {
/* istanbul ignore else */
if (isString(pathRet) || isFunction(pathRet)) {
ret = pathRet;
} else {
return null
}
}
// Check for the existence of links within the translated string
if (isString(ret) && (ret.indexOf('@:') >= 0 || ret.indexOf('@.') >= 0)) {
ret = this._link(locale, message, ret, host, 'raw', values, visitedLinkStack);
}
return this._render(ret, interpolateMode, values, key)
};
VueI18n.prototype._link = function _link (
locale,
message,
str,
host,
interpolateMode,
values,
visitedLinkStack
) {
var ret = str;
// Match all the links within the local
// We are going to replace each of
// them with its translation
var matches = ret.match(linkKeyMatcher);
for (var idx in matches) {
// ie compatible: filter custom array
// prototype method
if (!matches.hasOwnProperty(idx)) {
continue
}
var link = matches[idx];
var linkKeyPrefixMatches = link.match(linkKeyPrefixMatcher);
var linkPrefix = linkKeyPrefixMatches[0];
var formatterName = linkKeyPrefixMatches[1];
// Remove the leading @:, @.case: and the brackets
var linkPlaceholder = link.replace(linkPrefix, '').replace(bracketsMatcher, '');
if (includes(visitedLinkStack, linkPlaceholder)) {
return ret
}
visitedLinkStack.push(linkPlaceholder);
// Translate the link
var translated = this._interpolate(
locale, message, linkPlaceholder, host,
interpolateMode === 'raw' ? 'string' : interpolateMode,
interpolateMode === 'raw' ? undefined : values,
visitedLinkStack
);
if (this._isFallbackRoot(translated)) {
/* istanbul ignore if */
if (!this._root) { throw Error('unexpected error') }
var root = this._root.$i18n;
translated = root._translate(
root._getMessages(), root.locale, root.fallbackLocale,
linkPlaceholder, host, interpolateMode, values
);
}
translated = this._warnDefault(
locale, linkPlaceholder, translated, host,
isArray(values) ? values : [values],
interpolateMode
);
if (this._modifiers.hasOwnProperty(formatterName)) {
translated = this._modifiers[formatterName](translated);
} else if (defaultModifiers.hasOwnProperty(formatterName)) {
translated = defaultModifiers[formatterName](translated);
}
visitedLinkStack.pop();
// Replace the link with the translated
ret = !translated ? ret : ret.replace(link, translated);
}
return ret
};
VueI18n.prototype._createMessageContext = function _createMessageContext (values) {
var _list = isArray(values) ? values : [];
var _named = isObject$2(values) ? values : {};
var list = function (index) { return _list[index]; };
var named = function (key) { return _named[key]; };
return {
list: list,
named: named
}
};
VueI18n.prototype._render = function _render (message, interpolateMode, values, path) {
if (isFunction(message)) {
return message(this._createMessageContext(values))
}
var ret = this._formatter.interpolate(message, values, path);
// If the custom formatter refuses to work - apply the default one
if (!ret) {
ret = defaultFormatter.interpolate(message, values, path);
}
// if interpolateMode is **not** 'string' ('row'),
// return the compiled data (e.g. ['foo', VNode, 'bar']) with formatter
return interpolateMode === 'string' && !isString(ret) ? ret.join('') : ret
};
VueI18n.prototype._appendItemToChain = function _appendItemToChain (chain, item, blocks) {
var follow = false;
if (!includes(chain, item)) {
follow = true;
if (item) {
follow = item[item.length - 1] !== '!';
item = item.replace(/!/g, '');
chain.push(item);
if (blocks && blocks[item]) {
follow = blocks[item];
}
}
}
return follow
};
VueI18n.prototype._appendLocaleToChain = function _appendLocaleToChain (chain, locale, blocks) {
var follow;
var tokens = locale.split('-');
do {
var item = tokens.join('-');
follow = this._appendItemToChain(chain, item, blocks);
tokens.splice(-1, 1);
} while (tokens.length && (follow === true))
return follow
};
VueI18n.prototype._appendBlockToChain = function _appendBlockToChain (chain, block, blocks) {
var follow = true;
for (var i = 0; (i < block.length) && (isBoolean(follow)); i++) {
var locale = block[i];
if (isString(locale)) {
follow = this._appendLocaleToChain(chain, locale, blocks);
}
}
return follow
};
VueI18n.prototype._getLocaleChain = function _getLocaleChain (start, fallbackLocale) {
if (start === '') { return [] }
if (!this._localeChainCache) {
this._localeChainCache = {};
}
var chain = this._localeChainCache[start];
if (!chain) {
if (!fallbackLocale) {
fallbackLocale = this.fallbackLocale;
}
chain = [];
// first block defined by start
var block = [start];
// while any intervening block found
while (isArray(block)) {
block = this._appendBlockToChain(
chain,
block,
fallbackLocale
);
}
// last block defined by default
var defaults;
if (isArray(fallbackLocale)) {
defaults = fallbackLocale;
} else if (isObject$2(fallbackLocale)) {
/* $FlowFixMe */
if (fallbackLocale['default']) {
defaults = fallbackLocale['default'];
} else {
defaults = null;
}
} else {
defaults = fallbackLocale;
}
// convert defaults to array
if (isString(defaults)) {
block = [defaults];
} else {
block = defaults;
}
if (block) {
this._appendBlockToChain(
chain,
block,
null
);
}
this._localeChainCache[start] = chain;
}
return chain
};
VueI18n.prototype._translate = function _translate (
messages,
locale,
fallback,
key,
host,
interpolateMode,
args
) {
var chain = this._getLocaleChain(locale, fallback);
var res;
for (var i = 0; i < chain.length; i++) {
var step = chain[i];
res =
this._interpolate(step, messages[step], key, host, interpolateMode, args, [key]);
if (!isNull(res)) {
if (step !== locale && "production" !== 'production' && !this._isSilentTranslationWarn(key) && !this._isSilentFallbackWarn(key)) {
warn$1(("Fall back to translate the keypath '" + key + "' with '" + step + "' locale."));
}
return res
}
}
return null
};
VueI18n.prototype._t = function _t (key, _locale, messages, host) {
var ref;
var values = [], len = arguments.length - 4;
while ( len-- > 0 ) values[ len ] = arguments[ len + 4 ];
if (!key) { return '' }
var parsedArgs = parseArgs.apply(void 0, values);
if(this._escapeParameterHtml) {
parsedArgs.params = escapeParams(parsedArgs.params);
}
var locale = parsedArgs.locale || _locale;
var ret = this._translate(
messages, locale, this.fallbackLocale, key,
host, 'string', parsedArgs.params
);
if (this._isFallbackRoot(ret)) {
/* istanbul ignore if */
if (!this._root) { throw Error('unexpected error') }
return (ref = this._root).$t.apply(ref, [ key ].concat( values ))
} else {
ret = this._warnDefault(locale, key, ret, host, values, 'string');
if (this._postTranslation && ret !== null && ret !== undefined) {
ret = this._postTranslation(ret, key);
}
return ret
}
};
VueI18n.prototype.t = function t (key) {
var ref;
var values = [], len = arguments.length - 1;
while ( len-- > 0 ) values[ len ] = arguments[ len + 1 ];
return (ref = this)._t.apply(ref, [ key, this.locale, this._getMessages(), null ].concat( values ))
};
VueI18n.prototype._i = function _i (key, locale, messages, host, values) {
var ret =
this._translate(messages, locale, this.fallbackLocale, key, host, 'raw', values);
if (this._isFallbackRoot(ret)) {
if (!this._root) { throw Error('unexpected error') }
return this._root.$i18n.i(key, locale, values)
} else {
return this._warnDefault(locale, key, ret, host, [values], 'raw')
}
};
VueI18n.prototype.i = function i (key, locale, values) {
/* istanbul ignore if */
if (!key) { return '' }
if (!isString(locale)) {
locale = this.locale;
}
return this._i(key, locale, this._getMessages(), null, values)
};
VueI18n.prototype._tc = function _tc (
key,
_locale,
messages,
host,
choice
) {
var ref;
var values = [], len = arguments.length - 5;
while ( len-- > 0 ) values[ len ] = arguments[ len + 5 ];
if (!key) { return '' }
if (choice === undefined) {
choice = 1;
}
var predefined = { 'count': choice, 'n': choice };
var parsedArgs = parseArgs.apply(void 0, values);
parsedArgs.params = Object.assign(predefined, parsedArgs.params);
values = parsedArgs.locale === null ? [parsedArgs.params] : [parsedArgs.locale, parsedArgs.params];
return this.fetchChoice((ref = this)._t.apply(ref, [ key, _locale, messages, host ].concat( values )), choice)
};
VueI18n.prototype.fetchChoice = function fetchChoice (message, choice) {
/* istanbul ignore if */
if (!message || !isString(message)) { return null }
var choices = message.split('|');
choice = this.getChoiceIndex(choice, choices.length);
if (!choices[choice]) { return message }
return choices[choice].trim()
};
VueI18n.prototype.tc = function tc (key, choice) {
var ref;
var values = [], len = arguments.length - 2;
while ( len-- > 0 ) values[ len ] = arguments[ len + 2 ];
return (ref = this)._tc.apply(ref, [ key, this.locale, this._getMessages(), null, choice ].concat( values ))
};
VueI18n.prototype._te = function _te (key, locale, messages) {
var args = [], len = arguments.length - 3;
while ( len-- > 0 ) args[ len ] = arguments[ len + 3 ];
var _locale = parseArgs.apply(void 0, args).locale || locale;
return this._exist(messages[_locale], key)
};
VueI18n.prototype.te = function te (key, locale) {
return this._te(key, this.locale, this._getMessages(), locale)
};
VueI18n.prototype.getLocaleMessage = function getLocaleMessage (locale) {
return looseClone(this._vm.messages[locale] || {})
};
VueI18n.prototype.setLocaleMessage = function setLocaleMessage (locale, message) {
if (this._warnHtmlInMessage === 'warn' || this._warnHtmlInMessage === 'error') {
this._checkLocaleMessage(locale, this._warnHtmlInMessage, message);
}
this._vm.$set(this._vm.messages, locale, message);
};
VueI18n.prototype.mergeLocaleMessage = function mergeLocaleMessage (locale, message) {
if (this._warnHtmlInMessage === 'warn' || this._warnHtmlInMessage === 'error') {
this._checkLocaleMessage(locale, this._warnHtmlInMessage, message);
}
this._vm.$set(this._vm.messages, locale, merge({}, this._vm.messages[locale] || {}, message));
};
VueI18n.prototype.getDateTimeFormat = function getDateTimeFormat (locale) {
return looseClone(this._vm.dateTimeFormats[locale] || {})
};
VueI18n.prototype.setDateTimeFormat = function setDateTimeFormat (locale, format) {
this._vm.$set(this._vm.dateTimeFormats, locale, format);
this._clearDateTimeFormat(locale, format);
};
VueI18n.prototype.mergeDateTimeFormat = function mergeDateTimeFormat (locale, format) {
this._vm.$set(this._vm.dateTimeFormats, locale, merge(this._vm.dateTimeFormats[locale] || {}, format));
this._clearDateTimeFormat(locale, format);
};
VueI18n.prototype._clearDateTimeFormat = function _clearDateTimeFormat (locale, format) {
for (var key in format) {
var id = locale + "__" + key;
if (!this._dateTimeFormatters.hasOwnProperty(id)) {
continue
}
delete this._dateTimeFormatters[id];
}
};
VueI18n.prototype._localizeDateTime = function _localizeDateTime (
value,
locale,
fallback,
dateTimeFormats,
key
) {
var _locale = locale;
var formats = dateTimeFormats[_locale];
var chain = this._getLocaleChain(locale, fallback);
for (var i = 0; i < chain.length; i++) {
var current = _locale;
var step = chain[i];
formats = dateTimeFormats[step];
_locale = step;
// fallback locale
if (isNull(formats) || isNull(formats[key])) {
if (step !== locale && "production" !== 'production' && !this._isSilentTranslationWarn(key) && !this._isSilentFallbackWarn(key)) {
warn$1(("Fall back to '" + step + "' datetime formats from '" + current + "' datetime formats."));
}
} else {
break
}
}
if (isNull(formats) || isNull(formats[key])) {
return null
} else {
var format = formats[key];
var id = _locale + "__" + key;
var formatter = this._dateTimeFormatters[id];
if (!formatter) {
formatter = this._dateTimeFormatters[id] = new Intl.DateTimeFormat(_locale, format);
}
return formatter.format(value)
}
};
VueI18n.prototype._d = function _d (value, locale, key) {
if (!key) {
return new Intl.DateTimeFormat(locale).format(value)
}
var ret =
this._localizeDateTime(value, locale, this.fallbackLocale, this._getDateTimeFormats(), key);
if (this._isFallbackRoot(ret)) {
/* istanbul ignore if */
if (!this._root) { throw Error('unexpected error') }
return this._root.$i18n.d(value, key, locale)
} else {
return ret || ''
}
};
VueI18n.prototype.d = function d (value) {
var args = [], len = arguments.length - 1;
while ( len-- > 0 ) args[ len ] = arguments[ len + 1 ];
var locale = this.locale;
var key = null;
if (args.length === 1) {
if (isString(args[0])) {
key = args[0];
} else if (isObject$2(args[0])) {
if (args[0].locale) {
locale = args[0].locale;
}
if (args[0].key) {
key = args[0].key;
}
}
} else if (args.length === 2) {
if (isString(args[0])) {
key = args[0];
}
if (isString(args[1])) {
locale = args[1];
}
}
return this._d(value, locale, key)
};
VueI18n.prototype.getNumberFormat = function getNumberFormat (locale) {
return looseClone(this._vm.numberFormats[locale] || {})
};
VueI18n.prototype.setNumberFormat = function setNumberFormat (locale, format) {
this._vm.$set(this._vm.numberFormats, locale, format);
this._clearNumberFormat(locale, format);
};
VueI18n.prototype.mergeNumberFormat = function mergeNumberFormat (locale, format) {
this._vm.$set(this._vm.numberFormats, locale, merge(this._vm.numberFormats[locale] || {}, format));
this._clearNumberFormat(locale, format);
};
VueI18n.prototype._clearNumberFormat = function _clearNumberFormat (locale, format) {
for (var key in format) {
var id = locale + "__" + key;
if (!this._numberFormatters.hasOwnProperty(id)) {
continue
}
delete this._numberFormatters[id];
}
};
VueI18n.prototype._getNumberFormatter = function _getNumberFormatter (
value,
locale,
fallback,
numberFormats,
key,
options
) {
var _locale = locale;
var formats = numberFormats[_locale];
var chain = this._getLocaleChain(locale, fallback);
for (var i = 0; i < chain.length; i++) {
var current = _locale;
var step = chain[i];
formats = numberFormats[step];
_locale = step;
// fallback locale
if (isNull(formats) || isNull(formats[key])) {
if (step !== locale && "production" !== 'production' && !this._isSilentTranslationWarn(key) && !this._isSilentFallbackWarn(key)) {
warn$1(("Fall back to '" + step + "' number formats from '" + current + "' number formats."));
}
} else {
break
}
}
if (isNull(formats) || isNull(formats[key])) {
return null
} else {
var format = formats[key];
var formatter;
if (options) {
// If options specified - create one time number formatter
formatter = new Intl.NumberFormat(_locale, Object.assign({}, format, options));
} else {
var id = _locale + "__" + key;
formatter = this._numberFormatters[id];
if (!formatter) {
formatter = this._numberFormatters[id] = new Intl.NumberFormat(_locale, format);
}
}
return formatter
}
};
VueI18n.prototype._n = function _n (value, locale, key, options) {
/* istanbul ignore if */
if (!VueI18n.availabilities.numberFormat) {
return ''
}
if (!key) {
var nf = !options ? new Intl.NumberFormat(locale) : new Intl.NumberFormat(locale, options);
return nf.format(value)
}
var formatter = this._getNumberFormatter(value, locale, this.fallbackLocale, this._getNumberFormats(), key, options);
var ret = formatter && formatter.format(value);
if (this._isFallbackRoot(ret)) {
/* istanbul ignore if */
if (!this._root) { throw Error('unexpected error') }
return this._root.$i18n.n(value, Object.assign({}, { key: key, locale: locale }, options))
} else {
return ret || ''
}
};
VueI18n.prototype.n = function n (value) {
var args = [], len = arguments.length - 1;
while ( len-- > 0 ) args[ len ] = arguments[ len + 1 ];
var locale = this.locale;
var key = null;
var options = null;
if (args.length === 1) {
if (isString(args[0])) {
key = args[0];
} else if (isObject$2(args[0])) {
if (args[0].locale) {
locale = args[0].locale;
}
if (args[0].key) {
key = args[0].key;
}
// Filter out number format options only
options = Object.keys(args[0]).reduce(function (acc, key) {
var obj;
if (includes(numberFormatKeys, key)) {
return Object.assign({}, acc, ( obj = {}, obj[key] = args[0][key], obj ))
}
return acc
}, null);
}
} else if (args.length === 2) {
if (isString(args[0])) {
key = args[0];
}
if (isString(args[1])) {
locale = args[1];
}
}
return this._n(value, locale, key, options)
};
VueI18n.prototype._ntp = function _ntp (value, locale, key, options) {
/* istanbul ignore if */
if (!VueI18n.availabilities.numberFormat) {
return []
}
if (!key) {
var nf = !options ? new Intl.NumberFormat(locale) : new Intl.NumberFormat(locale, options);
return nf.formatToParts(value)
}
var formatter = this._getNumberFormatter(value, locale, this.fallbackLocale, this._getNumberFormats(), key, options);
var ret = formatter && formatter.formatToParts(value);
if (this._isFallbackRoot(ret)) {
/* istanbul ignore if */
if (!this._root) { throw Error('unexpected error') }
return this._root.$i18n._ntp(value, locale, key, options)
} else {
return ret || []
}
};
Object.defineProperties( VueI18n.prototype, prototypeAccessors$2 );
var availabilities;
// $FlowFixMe
Object.defineProperty(VueI18n, 'availabilities', {
get: function get () {
if (!availabilities) {
var intlDefined = typeof Intl !== 'undefined';
availabilities = {
dateTimeFormat: intlDefined && typeof Intl.DateTimeFormat !== 'undefined',
numberFormat: intlDefined && typeof Intl.NumberFormat !== 'undefined'
};
}
return availabilities
}
});
VueI18n.install = install$1;
VueI18n.version = '8.22.1';
const it = {
globals: {
welcome: 'Benvenuto su deemix',
back: 'indietro',
loading: 'caricamento',
download: 'Scarica {thing}',
by: 'di {artist}',
in: 'in {album}',
download_hint: 'Scarica',
play_hint: 'Riproduci',
toggle_download_tab_hint: 'Espandi/Riduci',
clean_queue_hint: 'Pulisci Lista',
cancel_queue_hint: 'Cancella tutti i download',
open_downloads_folder: 'Apri la cartella di download',
cut: 'taglia',
copy: 'copia',
copyLink: 'copia link',
copyImageLink: 'copia link immagine',
copyDeezerLink: 'copia link deezer',
paste: 'incolla',
listTabs: {
all: 'tutto',
top_result: 'miglior risultato',
album: 'album',
artist: 'artista | artisti',
single: 'singolo | singoli',
title: 'titolo | titoli',
track: 'brano | brani',
releaseN: '0 dischi | {n} disco | {n} dischi',
playlist: 'playlist',
compile: 'compilation',
bundle: 'collezione | collezioni',
ep: 'ep',
more: 'Altri album',
featured: 'Compare in',
spotifyPlaylist: 'playlist spotify',
releaseDate: 'data di uscita',
error: 'errore',
empty: '',
trackN: '0 brani | {n} brano | {n} brani',
albumN: '{n} album',
artistN: '0 artisti | {n} artista | {n} artisti',
playlistN: '{n} playlist'
}
},
about: {
updates: {
currentVersion: 'Versione attuale',
currentWebuiVersion: 'Versione WebUI attuale',
versionNotAvailable: 'N/A',
updateAvailable: `Non stai usando l'ultima versione disponibile: {version}`,
deemixVersion: 'Versione libreria deemix'
},
titles: {
usefulLinks: 'Link Utili',
bugReports: 'Segnalazione di bug',
contributing: 'Contribuire al progetto',
donations: 'Donazioni',
license: 'Licenza'
},
subtitles: {
bugReports: "C'è qualcosa di deemix che non funziona? Faccelo sapere!",
contributing: 'Vuoi contribuire a questo progetto? Puoi farlo in più modi!',
donations: 'Vuoi dare una mano economicamente? Puoi fare una donazione!'
},
usesLibrary:
'Questa app utilizza la libreria <strong>deemix</strong>, che puoi utilizzare per creare la tua Interfaccia Utente per deemix.',
thanks: `Un ringraziamento a <strong>rtonno</strong>, <strong>uhwot</strong> e <strong>lollilol</strong> per l'aiuto che mi stanno dando in questo progetto e a <strong>BasCurtiz</strong> e <strong>scarvimane</strong> per aver creato l'icona.`,
upToDate: {
text: `Rimani al passo con gli ultimi aggiornamenti seguendo il {newsChannel} su Telegram.`,
newsChannel: 'canale delle news'
},
officialWebsite: 'Sito Ufficiale',
officialRepo: 'Repository Ufficiale della Libreria',
officialWebuiRepo: `Repository Ufficiale dell'Interfaccia Web`,
officialSubreddit: 'Subreddit Ufficiale',
newsChannel: 'Canale delle news',
questions: {
text: `Se dovessi avere domande o problemi con l'app, cerca prima una soluzione nel {subreddit}. Se non trovi nulla, puoi postare li il tuo problema.`,
subreddit: 'subreddit ufficiale'
},
beforeReporting: `Prima di segnalare un problema controlla che quella che stai usando sia l'ultima versione dell'app e che ciò che vuoi segnalare sia effettivamente un problema e non qualcosa che non funziona solamente a te.`,
beSure: `Assicurati che il problema sia riproducibile su altri PC e <strong>NON</strong> segnalare un problema che è già stato segnalato.`,
duplicateReports: 'Le segnalazioni doppie verranno chiuse, tienilo presente.',
dontOpenIssues: `<strong>NON</strong> aprire issues per porre domande, per quello esiste un subreddit.`,
newUI: {
text: `Se te la cavi in python puoi provare a creare una nuova Interfaccia Utente per l'app usando la libreria base, oppure puoi correggere dei problemi nella libreria con una pull request nella {repo}.`,
repo: 'repo'
},
acceptFeatures: `Accetto anche funzionalità, ma non cose complesse, dato che possono essere implementate direttamente nell'app invece che nella libreria.`,
otherLanguages: `Se te la cavi in altri linguaggi di programmazione, puoi provare a scrivere deemix in quei linguaggi!`,
understandingCode: `Serve aiuto per capire il codice? Scrivi a RemixDev su Telegram o Reddit`,
contributeWebUI: {
text: `Se te la cavi con Vue.js (JavaScript), HTML o CSS, puoi contribuire alla {webui}.`,
webui: 'WebUI'
},
itsFree: `Ricordati che <strong>questo è un progetto gratuito</strong> e che <strong>dovresti supportare gli artisti che ami</strong> prima di supportare gli sviluppatori.`,
notObligated: `Non sentirti obbligato a donare, mi stai simpatico lo stesso!`,
lincensedUnder: {
text: `Questo progetto è sotto la licenza {gpl3}.`,
gpl3: 'GNU General Public License 3.0'
}
},
charts: {
title: 'Classifiche',
changeCountry: 'Cambia Paese',
download: 'Scarica Classifica'
},
errors: {
title: 'Errori riguardanti {name}',
ids: {
invalidURL: 'URL non riconosciuto',
unsupportedURL: 'URL non ancora supportato',
ISRCnotOnDeezer: 'Questo ISRC non è disponibile su Deezer',
notYourPrivatePlaylist: 'Non puoi scaricare le playlist private degli altri.',
spotifyDisabled: 'Spotify Features non è impostato correttamente.',
trackNotOnDeezer: 'Brano non trovato su Deezer!',
albumNotOnDeezer: 'Album non trovato su Deezer!',
notOnDeezer: 'Brano non disponibile su Deezer!',
notEncoded: 'Brano non ancora codificato!',
notEncodedNoAlternative: 'Brano non ancora codificato e nessuna alternativa trovata!',
wrongBitrate: 'Brano non trovato con il bitrate specificato.',
wrongBitrateNoAlternative: 'Brano non trovato con il bitrate specificato e nessuna alternativa trovata!',
no360RA: 'Brano non disponibile in Reality Audio 360.',
notAvailable: 'Brano non presente sui server di Deezer!',
notAvailableNoAlternative: 'Brano non presente sui server di Deezer e nessuna alternativa trovata!',
noSpaceLeft: 'Spazio su disco esaurito!',
albumDoesntExists: 'Il brano non ha nessun album, impossibile ottenere informazioni'
}
},
favorites: {
title: 'Preferiti',
noPlaylists: 'Nessuna Playlist preferita trovata',
noAlbums: 'Nessun Album preferito trovato',
noArtists: 'Nessun Artista preferito trovato',
noTracks: 'Nessun Brano preferito trovato'
},
home: {
needTologin: 'Devi accedere al tuo account Deezer, fino a quel momento non potrai scaricare nulla.',
openSettings: 'Apri le impostazioni',
sections: {
popularPlaylists: 'Playlist Popolari',
popularAlbums: 'Album più riprodotti'
}
},
linkAnalyzer: {
info:
'Puoi utilizzare questa sezione per avere più informazioni riguardanti il link che stai cercando di scaricare.',
useful:
'Ciò può esserti utile se stai cercando di scaricare brani che non sono disponibili nel tuo Paese e vuoi sapere in quale Paese sono invece disponibili, per esempio.',
linkNotSupported: 'Questo link non è ancora supportato',
linkNotSupportedYet: 'Sembra che questo link non sia ancora supportato, prova ad analizzarne un altro.',
table: {
id: 'ID',
isrc: 'ISRC',
upc: 'UPC',
duration: 'Durata',
diskNumber: 'Numero Disco',
trackNumber: 'Numero Traccia',
releaseDate: 'Data di uscita',
bpm: 'BPM',
label: 'Etichetta',
recordType: 'Tipologia di registrazione',
genres: 'Generi',
tracklist: 'Lista tracce'
}
},
search: {
startSearching: 'Inizia a cercare!',
description:
'Puoi cercare un brano, un intero album, un artista, una playlist.... quello che vuoi! Puoi anche incollare un link di Deezer',
fans: '{n} fan',
noResults: 'Nessun risultato',
noResultsTrack: 'Nessun brano trovato',
noResultsAlbum: 'Nessun album trovato',
noResultsArtist: 'Nessun artista trovato',
noResultsPlaylist: 'Nessuna playlist trovata'
},
searchbar: 'Cerca qualsiasi cosa (o incolla semplicemente un link)',
downloads: 'download',
toasts: {
restoringQueue: 'Ripristinando la coda di download...',
queueRestored: 'Coda di download ripristinata!',
addedToQueue: '{item} aggiunto alla coda',
addedMoreToQueue: '{n} oggetti aggiunti alla coda',
alreadyInQueue: '{item} è già nella coda!',
finishDownload: '{item} ha finito di scaricarsi.',
allDownloaded: 'Tutti i download completati!',
refreshFavs: 'Preferiti ricaricati!',
loggingIn: 'Effettuando il login...',
loggedIn: 'Login effettuato',
alreadyLogged: 'Sei già loggato',
loginFailed: 'Impossibile loggarsi',
loggedOut: 'Disconnesso',
cancellingCurrentItem: 'Cancellando download corrente.',
currentItemCancelled: 'Download corrente cancellato.',
startAddingArtist: 'Aggiungendo gli album di {artist} alla coda',
finishAddingArtist: 'Aggiunto gli album di {artist} alla coda',
startConvertingSpotifyPlaylist: 'Convertendo i brani da spotify a deezer',
finishConvertingSpotifyPlaylist: 'Playlist di spotify convertita',
loginNeededToDownload: 'Devi accedere prima di poter scaricare brani!',
deezerNotAvailable: 'Deezer non è disponibile nel tuo paese. Dovresti usare una VPN.',
startGeneratingItems: 'Elaborando {n} oggetti...',
finishGeneratingItems: '{n} oggetti generati.'
},
settings: {
title: 'Impostazioni',
languages: 'Lingue',
login: {
title: 'Login',
loggedIn: 'Sei loggato come {username}',
arl: {
question: 'Come ottengo il mio ARL?',
update: 'Aggiorna ARL'
},
logout: 'Disconnettiti',
login: 'Accedi tramite deezer.com'
},
appearance: {
title: 'Aspetto',
slimDownloadTab: 'Tab dei download slim',
slimSidebar: 'Sidebar slim'
},
downloadPath: {
title: 'Cartella di download'
},
templates: {
title: 'Template',
tracknameTemplate: 'Template nome brano',
albumTracknameTemplate: 'Template nome brano negli Album',
playlistTracknameTemplate: 'Template nome brano nelle Playlist'
},
folders: {
title: 'Cartelle',
createPlaylistFolder: 'Crea cartelle per le Playlist',
playlistNameTemplate: 'Template nome della cartella Playlist',
createArtistFolder: 'Crea cartelle per gli Artisti',
artistNameTemplate: 'Template nome della cartella Artista',
createAlbumFolder: 'Crea cartelle per gli Album',
albumNameTemplate: 'Template nome della cartella Album',
createCDFolder: 'Crea cartelle per i CD',
createStructurePlaylist: 'Crea la struttura di cartelle per le Playlist',
createSingleFolder: 'Crea la struttura di cartelle per i brani singoli'
},
trackTitles: {
title: 'Titoli brani',
padTracks: 'Aggiungi zeri ai numeri di traccia',
paddingSize: 'Sovrascrivi il numero di zeri da aggiungere',
illegalCharacterReplacer: 'Rimpiazza caratteri illegali con'
},
downloads: {
title: 'Download',
queueConcurrency: 'Download simultanei',
maxBitrate: {
title: 'Bitrate preferito',
9: 'FLAC 1411kbps',
3: 'MP3 320kbps',
1: 'MP3 128kbps'
},
overwriteFile: {
title: 'Dovrei sovrascrivere i file già scaricati?',
y: 'Si, sovrascrivi i file',
n: 'No, non sovrascrivere i file',
t: 'Sovrascrivi solo i tag',
b: 'No, mantieni entrambi i file e aggiungi un numero al duplicato',
e: 'No, e non tener conto della estensione del file'
},
fallbackBitrate: 'Utilizza bitrate più bassi se il bitrate preferito non è disponibile',
fallbackSearch: 'Cerca il brano se il link originale non è disponibile',
logErrors: 'Crea file di log per gli errori',
logSearched: 'Crea file di log per le alternative cercate',
syncedLyrics: 'Crea i file .lyr (Testi Sincronizzati)',
createM3U8File: 'Crea i file playlist',
playlistFilenameTemplate: 'Template nome del file playlist',
saveDownloadQueue: "Salva la coda di download quando chiudi l'app"
},
covers: {
title: 'Copertine',
saveArtwork: 'Salva copertina album',
coverImageTemplate: 'Template nome copertina album',
saveArtworkArtist: 'Salva copertina artista',
artistImageTemplate: 'Template nome copertina artista',
localArtworkSize: 'Dimensioni copertine locali',
embeddedArtworkSize: 'Dimensioni copertine incorporate',
localArtworkFormat: {
title: 'Come vuoi salvare le copertine locali?',
jpg: 'In jpeg',
png: 'In png',
both: 'Sia in jpeg che in png'
},
jpegImageQuality: 'Qualità immagine JPEG',
embeddedArtworkPNG: 'Salva copertina incorporata come PNG',
embeddedPNGWarning: 'Le immagini PNG non sono usate ufficialmente da Deezer e potrebbero dare problemi',
imageSizeWarning:
'Dimensioni maggiori di x1200 non sono usate ufficialmente da Deezer, potresti incontrare problemi',
coverDescriptionUTF8: 'Salva la descrizione della copertina in UTF8 (iTunes Cover Fix)'
},
tags: {
head: 'Quali tag salvare',
title: 'Titolo',
artist: 'Artista',
album: 'Album',
cover: 'Copertina',
trackNumber: 'Numero Traccia',
trackTotal: 'Tracce Totali',
discNumber: 'Numero Disco',
discTotal: 'Dischi Totali',
albumArtist: "Artista dell'album",
genre: 'Genere',
year: 'Anno',
date: 'Data',
explicit: 'Testo Esplicito',
isrc: 'ISRC',
length: 'Durata Traccia',
barcode: "Barcode dell'album (UPC)",
bpm: 'BPM',
replayGain: 'Replay gain',
label: 'Casa Discografica',
lyrics: 'Testo non Sincronizzato',
syncedLyrics: 'Testo Sincronizzato',
copyright: 'Copyright',
composer: 'Compositori',
involvedPeople: 'Persone Coinvolte',
source: 'Sorgente e ID brano'
},
other: {
title: 'Altro',
savePlaylistAsCompilation: 'Salva le playlist come Compilation',
useNullSeparator: 'Usa il carattere NULL come separatore',
saveID3v1: "Salva anche l'ID3v1",
multiArtistSeparator: {
title: 'Come vuoi separare gli artisti?',
nothing: "Salva solo l'artista principale",
default: 'Usando la specificazione standard',
andFeat: 'Usando & e feat.',
using: 'Usando "{separator}"'
},
singleAlbumArtist: "Salva solo l'artista dell'album principale",
albumVariousArtists: 'Lascia "Artisti Vari" negli artisti dell\'album',
removeAlbumVersion: 'Rimuovi "Album Version" dal titolo del brano',
removeDuplicateArtists: 'Rimuovi le combinazioni di artisti',
dateFormat: {
title: 'Formato della data per i file FLAC',
year: 'AAAA',
month: 'MM',
day: 'GG'
},
featuredToTitle: {
title: 'Cosa dovrei fare con i feat?',
0: 'Niente',
1: 'Rimuovili dal titolo',
3: "Rimuovili dal titolo e dal nome dell'album",
2: 'Spostali sul titolo'
},
titleCasing: 'Formato testo dei titoli',
artistCasing: 'Formato testo degli artisti',
casing: {
nothing: 'Non cambiare',
upper: 'TUTTO MAIUSCOLO',
lower: 'tutto minuscolo',
start: 'Prima Lettera Maiuscola',
sentence: 'Come una frase'
},
previewVolume: 'Volume Anteprime',
executeCommand: {
title: 'Comando da eseguire dopo il download',
description: 'Lascia vuoto per nessuna azione'
}
},
spotify: {
title: 'Spotify Features',
clientID: 'Spotify clientID',
clientSecret: 'Spotify Client Secret',
username: 'Spotify username',
question: 'Come attivo le Spotify Features?'
},
reset: 'Reimposta Default',
save: 'Salva',
toasts: {
init: 'Impostazioni caricate!',
update: 'Impostazioni aggiornate!',
ARLcopied: 'ARL copiato negli appunti'
}
},
sidebar: {
home: 'home',
search: 'ricerca',
charts: 'classifiche',
favorites: 'preferiti',
linkAnalyzer: 'analizza link',
settings: 'impostazioni',
about: 'info'
},
tracklist: {
downloadSelection: 'Scarica selezionati'
}
};
const en = {
globals: {
welcome: 'Welcome to deemix',
back: 'back',
loading: 'loading',
download: 'Download {thing}',
by: 'by {artist}',
in: 'in {album}',
download_hint: 'Download',
play_hint: 'Play',
toggle_download_tab_hint: 'Expand/Collapse',
clean_queue_hint: 'Clear Finished',
cancel_queue_hint: 'Cancel All',
open_downloads_folder: 'Open Downloads Folder',
cut: 'cut',
copy: 'copy',
copyLink: 'copy link',
copyImageLink: 'copy image link',
copyDeezerLink: 'copy deezer link',
paste: 'paste',
listTabs: {
empty: '',
all: 'all',
top_result: 'top result',
album: 'album | albums',
artist: 'artist | artists',
single: 'single | singles',
title: 'title | titles',
track: 'track | tracks',
releaseN: '0 releases | {n} release | {n} releases',
playlist: 'playlist | playlists',
compile: 'compilation | compilations',
ep: 'ep | eps',
bundle: 'bundle | bundles',
more: 'More albums',
featured: 'Featured in',
spotifyPlaylist: 'spotify playlist | spotify playlists',
releaseDate: 'release date',
error: 'error',
trackN: '0 tracks | {n} track | {n} tracks',
albumN: '0 albums | {n} album | {n} albums',
artistN: '0 artists | {n} artist | {n} artists',
playlistN: '0 playlists | {n} playlist | {n} playlists'
}
},
about: {
updates: {
currentVersion: 'Current Version',
currentWebuiVersion: 'Current WebUI Version',
versionNotAvailable: 'N/A',
updateAvailable: `You're not running the latest version available: {version}`,
deemixVersion: 'deemix lib version'
},
titles: {
usefulLinks: 'Useful Links',
bugReports: 'Bug Reports',
contributing: 'Contributing',
donations: 'Donations',
license: 'License'
},
subtitles: {
bugReports: "Is there something that isn't working in deemix? Tell us!",
contributing: 'You want to contribute to this project? You can do it in different ways!',
donations: 'You want to contribute monetarily? You could make a donation!'
},
usesLibrary: 'This app uses the <strong>deemix</strong> library, which you can use to make your own UI for deemix.',
thanks: `Thanks to <strong>rtonno</strong>, <strong>uhwot</strong> and <strong>lollilol</strong> for helping me with this project and to <strong>BasCurtiz</strong> and <strong>scarvimane</strong> for making the icon.`,
upToDate: {
text: `Stay up to date with the updates by following the {newsChannel} on Telegram.`,
newsChannel: 'news channel'
},
officialWebsite: 'Official Website',
officialRepo: 'Official Library Repository',
officialWebuiRepo: 'Official WebUI Repository',
officialSubreddit: 'Official Subreddit',
newsChannel: 'News Channel',
questions: {
text: `If you have questions or problems with the app, search for a solution on the {subreddit} first. Then, if you don't find anything you can make a post with your issue on the subreddit.`,
subreddit: 'subreddit'
},
beforeReporting: `Before reporting a bug make sure you're running the latest version of the app and that what you want to report is actually a bug and not something that's wrong only on your end.`,
beSure: `Make sure the bug is reproducible on other machines and also <strong>DO NOT</strong> report a bug if it's already been reported.`,
duplicateReports: 'Duplicate bug reports will be closed, so keep an eye out on that.',
dontOpenIssues: `<strong>DO NOT</strong> open issues for asking questions, there is a subreddit for that.`,
newUI: {
text: `If you're fluent in python you could try to make a new UI for the app using the base library, or fix bugs in the library with a pull request on the {repo}.`,
repo: 'repo'
},
acceptFeatures: `I accept features as well, but no complex things, as they can be implementend directly in the app and not the library.`,
otherLanguages: `If you're fluent in another programming language you could try to port deemix into other programming languages!`,
understandingCode: `You need help understanding the code? Just hit RemixDev up on Telegram or Reddit.`,
contributeWebUI: {
text: `If you know Vue.js (JavaScript), HTML or CSS you could contribute to the {webui}.`,
webui: 'WebUI'
},
itsFree: `You should remember that <strong>this is a free project</strong> and <strong>you should support the artists you love</strong> before supporting the developers.`,
notObligated: `Don't feel obligated to donate, I appreciate you anyway!`,
lincensedUnder: {
text: `This work is licensed under the {gpl3}.`,
gpl3: 'GNU General Public License 3.0'
}
},
charts: {
title: 'Charts',
changeCountry: 'Change Country',
download: 'Download Chart'
},
errors: {
title: 'Errors for {name}',
ids: {
invalidURL: 'URL not recognized',
unsupportedURL: 'URL not supported yet',
ISRCnotOnDeezer: 'Track ISRC is not available on Deezer',
notYourPrivatePlaylist: "You can't download others private playlists.",
spotifyDisabled: 'Spotify Features is not setted up correctly.',
trackNotOnDeezer: 'Track not found on Deezer!',
albumNotOnDeezer: 'Album not found on Deezer!',
notOnDeezer: 'Track not available on Deezer!',
notEncoded: 'Track not yet encoded!',
notEncodedNoAlternative: 'Track not yet encoded and no alternative found!',
wrongBitrate: 'Track not found at desired bitrate.',
wrongBitrateNoAlternative: 'Track not found at desired bitrate and no alternative found!',
no360RA: 'Track is not available in Reality Audio 360.',
notAvailable: "Track not available on Deezer's servers!",
notAvailableNoAlternative: "Track not available on Deezer's servers and no alternative found!",
noSpaceLeft: 'No space left on the device!',
albumDoesntExists: "Track's album doesn't exist, failed to gather info"
}
},
favorites: {
title: 'Favorites',
noPlaylists: 'No Playlists found',
noAlbums: 'No Favorite Albums found',
noArtists: 'No Favorite Artists found',
noTracks: 'No Favorite Tracks found'
},
home: {
needTologin: 'You need to log into your Deezer account before you can start downloading.',
openSettings: 'Open Settings',
sections: {
popularPlaylists: 'Popular playlists',
popularAlbums: 'Most streamed albums'
}
},
linkAnalyzer: {
info: 'You can use this section to find more information about the link you are trying to download.',
useful:
"This is useful if you're trying to download some tracks that are not available in your country and want to know where they are available, for instance.",
linkNotSupported: 'This link is not yet supported',
linkNotSupportedYet: 'Seems like this link is not yet supported, try analyzing another one.',
table: {
id: 'ID',
isrc: 'ISRC',
upc: 'UPC',
duration: 'Duration',
diskNumber: 'Disk Number',
trackNumber: 'Track Number',
releaseDate: 'Release Date',
bpm: 'BPM',
label: 'Label',
recordType: 'Record Type',
genres: 'Genres',
tracklist: 'Tracklist'
}
},
search: {
startSearching: 'Start searching!',
description:
'You can search a track, a whole album, an artist, a playlist.... everything! You can also paste a Deezer link',
fans: '{n} fans',
noResults: 'No results',
noResultsTrack: 'No Tracks found',
noResultsAlbum: 'No Albums found',
noResultsArtist: 'No Artists found',
noResultsPlaylist: 'No Playlists found'
},
searchbar: 'Search anything you want (or just paste a link)',
downloads: 'downloads',
toasts: {
restoringQueue: 'Restoring download queue...',
queueRestored: 'Download queue restored!',
addedToQueue: '{item} added to queue',
addedMoreToQueue: '{n} items added to queue',
alreadyInQueue: '{item} is already in queue!',
finishDownload: '{item} finished downloading.',
allDownloaded: 'All downloads completed!',
refreshFavs: 'Refresh completed!',
loggingIn: 'Logging in...',
loggedIn: 'Logged in',
alreadyLogged: 'Already logged in',
loginFailed: "Couldn't log in",
loggedOut: 'Logged out',
cancellingCurrentItem: 'Cancelling current item.',
currentItemCancelled: 'Current item cancelled.',
startAddingArtist: 'Adding {artist} albums to queue',
finishAddingArtist: 'Added {artist} albums to queue',
startConvertingSpotifyPlaylist: 'Converting spotify tracks to Deezer tracks',
finishConvertingSpotifyPlaylist: 'Spotify playlist converted',
loginNeededToDownload: 'You need to log in to download tracks!',
deezerNotAvailable: 'Deezer is not available in your country. You should use a VPN.',
startGeneratingItems: 'Processing {n} items...',
finishGeneratingItems: 'Generated {n} items.'
},
settings: {
title: 'Settings',
languages: 'Languages',
login: {
title: 'Login',
loggedIn: 'You are logged in as {username}',
arl: {
question: 'How do I get my own ARL?',
update: 'Update ARL'
},
logout: 'Logout',
login: 'Login via deezer.com'
},
appearance: {
title: 'Appearance',
slimDownloadTab: 'Slim download tab',
slimSidebar: 'Slim Sidebar'
},
downloadPath: {
title: 'Download Path'
},
templates: {
title: 'Templates',
tracknameTemplate: 'Trackname template',
albumTracknameTemplate: 'Album track template',
playlistTracknameTemplate: 'Playlist track template'
},
folders: {
title: 'Folders',
createPlaylistFolder: 'Create folder for playlists',
playlistNameTemplate: 'Playlist folder template',
createArtistFolder: 'Create folder for artist',
artistNameTemplate: 'Artist folder template',
createAlbumFolder: 'Create folder for album',
albumNameTemplate: 'Album folder template',
createCDFolder: 'Create folder for CDs',
createStructurePlaylist: 'Create folder structure for playlists',
createSingleFolder: 'Create folder structure for singles'
},
trackTitles: {
title: 'Track titles',
padTracks: 'Pad tracks',
paddingSize: 'Overwrite padding size',
illegalCharacterReplacer: 'Illegal Character replacer'
},
downloads: {
title: 'Downloads',
queueConcurrency: 'Concurrent Downloads',
maxBitrate: {
title: 'Preferred Bitrate',
9: 'FLAC 1411kbps',
3: 'MP3 320kbps',
1: 'MP3 128kbps'
},
overwriteFile: {
title: 'Should I overwrite the files?',
y: 'Yes, overwrite the file',
n: "No, don't overwrite the file",
t: 'Overwrite only the tags',
b: 'No, keep both files and add a number to the duplicate',
e: "No, and don't look at the extensions"
},
fallbackBitrate: 'Bitrate fallback',
fallbackSearch: 'Search fallback',
logErrors: 'Create log files for errors',
logSearched: 'Create log files for searched tracks',
createM3U8File: 'Create playlist file',
syncedLyrics: 'Create .lyr files (Sync Lyrics)',
playlistFilenameTemplate: 'Playlist filename template',
saveDownloadQueue: 'Save download queue when closing the app'
},
covers: {
title: 'Album covers',
saveArtwork: 'Save Covers',
coverImageTemplate: 'Cover name template',
saveArtworkArtist: 'Save artist image',
artistImageTemplate: 'Artist image template',
localArtworkSize: 'Local artwork size',
embeddedArtworkSize: 'Embedded artwork size',
localArtworkFormat: {
title: 'What format do you want the local artwork to be?',
jpg: 'A jpeg image',
png: 'A png image',
both: 'Both a jpeg and a png'
},
jpegImageQuality: 'JPEG image quality',
embeddedArtworkPNG: 'Save embedded artwork as PNG',
embeddedPNGWarning: 'PNGs are not officialy supported by Deezer and can be buggy',
imageSizeWarning: 'Anything above x1200 is not officialy used by Deezer, you may encounter issues',
coverDescriptionUTF8: 'Save cover description using UTF8 (iTunes Cover Fix)'
},
tags: {
head: 'Which tags to save',
title: 'Title',
artist: 'Artist',
album: 'Album',
cover: 'Cover',
trackNumber: 'Track Number',
trackTotal: 'Track Total',
discNumber: 'Disc Number',
discTotal: 'Disc Total',
albumArtist: 'Album Artist',
genre: 'Genre',
year: 'Year',
date: 'Date',
explicit: 'Explicit Lyrics',
isrc: 'ISRC',
length: 'Track Length',
barcode: 'Album Barcode (UPC)',
bpm: 'BPM',
replayGain: 'Replay Gain',
label: 'Album Label',
lyrics: 'Unsynchronized Lyrics',
syncedLyrics: 'Synchronized Lyrics',
copyright: 'Copyright',
composer: 'Composer',
involvedPeople: 'Involved People',
source: 'Source and song ID'
},
other: {
title: 'Other',
savePlaylistAsCompilation: 'Save playlists as compilation',
useNullSeparator: 'Use null separator',
saveID3v1: 'Save ID3v1 as well',
multiArtistSeparator: {
title: 'How would you like to separate your artists?',
nothing: 'Save only the main artist',
default: 'Using standard specification',
andFeat: 'Using & and feat.',
using: 'Using "{separator}"'
},
singleAlbumArtist: 'Save only the main album artist',
albumVariousArtists: 'Keep "Various Artists" in the Album Artists',
removeAlbumVersion: 'Remove "Album Version" from track title',
removeDuplicateArtists: 'Remove combinations of artists',
dateFormat: {
title: 'Date format for FLAC files',
year: 'YYYY',
month: 'MM',
day: 'DD'
},
featuredToTitle: {
title: 'What should I do with featured artists?',
0: 'Nothing',
1: 'Remove it from the title',
3: 'Remove it from the title and the album title',
2: 'Move it to the title'
},
titleCasing: 'Title casing',
artistCasing: 'Artist casing',
casing: {
nothing: 'Keep unchanged',
lower: 'lowercase',
upper: 'UPPERCASE',
start: 'Start Of Each Word',
sentence: 'Like a sentence'
},
previewVolume: 'Preview Volume',
executeCommand: {
title: 'Command to execute after download',
description: 'Leave blank for no action'
}
},
spotify: {
title: 'Spotify Features',
clientID: 'Spotify ClientID',
clientSecret: 'Spotify Client Secret',
username: 'Spotify Username',
question: 'How do I enable Spotify Features?'
},
reset: 'Reset to Default',
save: 'Save',
toasts: {
init: 'Settings loaded!',
update: 'Settings updated!',
ARLcopied: 'ARL copied to clipboard'
}
},
sidebar: {
home: 'home',
search: 'search',
charts: 'charts',
favorites: 'favorites',
linkAnalyzer: 'link analyzer',
settings: 'settings',
about: 'about'
},
tracklist: {
downloadSelection: 'Download selection'
}
};
const es = {
globals: {
welcome: 'Bienvenido a deemix',
back: 'atrás',
loading: 'cargando',
download: 'Descarga {thing}',
by: 'por {artist}',
in: 'en {album}',
download_hint: 'Descargar',
play_hint: 'Reproducir',
toggle_download_tab_hint: 'Expandir/Colapsar',
clean_queue_hint: 'Limpieza terminada',
cancel_queue_hint: 'Cancelar todo',
open_downloads_folder: 'Abrir la carpeta de descargas',
cut: 'cortar',
copy: 'copiar',
copyLink: 'copiar vinculo',
copyImageLink: 'copiar el vínculo de la imagen',
copyDeezerLink: 'copiar el vínculo de Deezer',
paste: 'pegar',
listTabs: {
empty: '',
all: 'todo',
top_result: 'mejor resultado',
album: 'álbum | álbumes',
artist: 'artista | artistas',
single: 'single | singles',
title: 'título | títulos',
track: 'pista | pistas',
trackN: '0 pistas | {n} pista | {n} pistas',
releaseN: '0 entregas | {n} entrega | {n} entregas',
playlist: 'lista de reproducción | listas de reproducción',
compile: 'compilación | compilaciones',
ep: 'ep | eps',
more: 'Más álbumes',
featured: 'Aparece en',
spotifyPlaylist: 'lista de reproducción spotify | listas de reproducción spotify',
releaseDate: 'fecha de publicación',
error: 'error'
}
},
about: {
updates: {
currentVersion: 'Versión actual',
versionNotAvailable: 'N/D',
updateAvailable: `No estás ejecutando la última versión disponible: {versión}`,
deemixVersion: 'versión de la biblioteca deemix'
},
titles: {
usefulLinks: 'Enlaces útiles',
bugReports: 'Reportar fallos',
contributing: 'Contribuye',
donations: 'Donaciones',
license: 'Licencia'
},
subtitles: {
bugReports: '¿Hay algo que no funcione en Deemix? ¡Díganoslo!',
contributing: '¿Quieres contribuir a este proyecto? ¡Puedes hacerlo de diferentes maneras!',
donations: '¿Quiere contribuir monetariamente? ¡Puedes hacer una donación!'
},
usesLibrary: 'Esta aplicación usa la biblioteca <strong>deemix</strong>, que puedes usar para hacer tu propia interfaz de usuario para deemix.',
thanks: `Gracias a <strong>rtonno</strong>, <strong>uhwot</strong> y <strong>lollilol</strong> por ayudarme con este proyecto, a <strong>BasCurtiz</strong> y <strong>scarvimane</strong> por hacer el icono.`,
upToDate: {
text: `Mantente al día con las actualizaciones siguiendo el {newsChannel} en Telegram.`,
newsChannel: 'canal de noticias'
},
officialWebsite: 'Página web oficial',
officialRepo: 'Repositorio de la biblioteca oficial',
officialWebuiRepo: 'Repositorio oficial de WebUI',
officialSubreddit: 'Subreddit oficial',
newsChannel: 'Canal de noticias',
questions: {
text: `Si tienes preguntas o problemas con la aplicación, busca una solución en el {subreddit} primero. Luego, si no encuentras nada puedes hacer un post con tu problema en el subreddit.`,
subreddit: 'subreddit'
},
beforeReporting: 'Antes de informar de un error asegúrese de que está ejecutando la última versión de la aplicación y que lo que quiere informar es en realidad un error y no algo que está mal sólo en su extremo.',
beSure: 'Asegúrate de que el fallo es reproducible en otras máquinas y también <strong>NO</strong> reporte un fallo si ya ha sido reportado.',
duplicateReports: 'Los informes de errores duplicados se cerrarán, así que manténgase al tanto de eso.',
dontOpenIssues: '<strong>NO</strong> abra problemas para hacer preguntas, hay un subreddit para eso.',
newUI: {
text: `Si tienes fluidez en Python podrías intentar hacer una nueva interfaz de usuario para la aplicación usando la biblioteca base, o arreglar los errores de la biblioteca con una petición pull en el {repo}.`,
repo: 'repo'
},
acceptFeatures: 'También acepto características, pero no cosas complejas, ya que se pueden implementar directamente en la aplicación y no en la biblioteca.',
otherLanguages: '¡Si dominas otro lenguaje de programación podrías intentar portar Deemix a otros lenguajes de programación!',
understandingCode: '¿Necesitas ayuda para entender el código? Sólo tienes que poner RemixDev en Telegram o Reddit.',
contributeWebUI: {
text: `Si conoces Vue.js (JavaScript), HTML o CSS podrías contribuir a la {webui}.`,
webui: 'WebUI'
},
itsFree: 'Debes recordar que <strong>este es un proyecto libre</strong> y <strong>debes apoyar a los artistas que amas</strong> antes de apoyar a los desarrolladores.',
notObligated: 'No te sientas obligado a donar, ¡te aprecio de todas formas!',
lincensedUnder: {
text: `Esta obra está autorizada bajo una {gpl3}.`,
gpl3: 'GNU Licencia Pública General 3.0'
}
},
charts: {
title: 'Listas',
changeCountry: 'Cambiar país',
download: 'Descargar la lista'
},
errors: {
title: 'Errores para {name}',
ids: {
invalidURL: 'No se reconoce la URL',
unsupportedURL: 'La URL aún no está soportada',
ISRCnotOnDeezer: 'La pista ISRC no está disponible en Deezer',
notYourPrivatePlaylist: 'No puedes descargar otras listas de reproducción privadas.',
spotifyDisabled: 'Las funciones de Spotify no está configurado correctamente.',
trackNotOnDeezer: '¡No se encontró la pista en Deezer!',
albumNotOnDeezer: '¡El álbum no se encuentra en Deezer!',
notOnDeezer: '¡Pista no disponible en Deezer!',
notEncoded: '¡Pista aún no codificada!',
notEncodedNoAlternative: '¡Pista aún no codificada y no se ha encontrado ninguna alternativa!',
wrongBitrate: 'La pista no se encuentra a la velocidad de bitrate deseada.',
wrongBitrateNoAlternative: '¡Pista no encontrada a la tasa de bits deseada y no se ha encontrado ninguna alternativa!',
no360RA: 'La pista no está disponible en Reality Audio 360.',
notAvailable: '¡La pista no está disponible en los servidores de Deezer!',
notAvailableNoAlternative: '¡La pista no está disponible en los servidores de Deezer y no se ha encontrado ninguna alternativa!',
noSpaceLeft: '¡No queda espacio en el dispositivo!'
}
},
favorites: {
title: 'Favoritos',
noPlaylists: 'No se han encontrado listas de reproducción',
noAlbums: 'No se han encontrado álbumes favoritos',
noArtists: 'No se han encontrado artistas favoritos',
noTracks: 'No se han encontrado pistas favoritas'
},
home: {
needTologin: 'Necesitas entrar en tu cuenta de Deezer antes de poder empezar a descargar.',
openSettings: 'Abrir la configuración',
sections: {
popularPlaylists: 'Listas de reproducción populares',
popularAlbums: 'Los álbumes más stremeados'
}
},
linkAnalyzer: {
info: 'Puedes usar esta sección para encontrar más información sobre el enlace que estás tratando de descargar.',
useful: 'Esto es útil si está tratando de descargar algunas pistas que no están disponibles en su país y quiere saber dónde están disponibles, por ejemplo.',
linkNotSupported: 'Este enlace aún no está soportado',
linkNotSupportedYet: 'Parece que este enlace aún no está soportado, intenta analizar otro.',
table: {
id: 'ID',
isrc: 'ISRC',
upc: 'UPC',
duration: 'Duración',
diskNumber: 'Número del disco',
trackNumber: 'Número de la pista',
releaseDate: 'Fecha de lanzamiento',
bpm: 'BPM',
label: 'Etiqueta',
recordType: 'Tipo de grabación',
genres: 'Géneros',
tracklist: 'Lista de pista'
}
},
search: {
startSearching: '¡Comienza a buscar!',
description: 'Puedes buscar un tema, un álbum entero, un artista, una lista de reproducción... ¡todo! También puedes pegar un enlace de Deezer',
fans: '{n} fans',
noResults: 'Ningun resultado',
noResultsTrack: 'No se encontraron pistas',
noResultsAlbum: 'No se encontraron álbumes',
noResultsArtist: 'No se encontraron artistas',
noResultsPlaylist: 'No se encontraron listas de reproducción'
},
searchbar: 'Busca lo que quieras (o simplemente pega un enlace)',
downloads: 'descargas',
toasts: {
restoringQueue: 'Restaurando la cola de descarga...',
queueRestored: '¡Cola de descarga restaurada!',
addedToQueue: '{item} añadidos a la cola',
addedMoreToQueue: '{n} elementos añadidos a la cola',
alreadyInQueue: '¡{item} ya está en la cola!',
finishDownload: '{item} terminado de descargar.',
allDownloaded: '¡Todas las descargas se han completado!',
refreshFavs: '¡Actualización completada!',
loggingIn: 'Conectando...',
loggedIn: 'Conectado',
alreadyLogged: 'Ya está conectado',
loginFailed: 'No se puede conectar',
loggedOut: 'Desconectado',
cancellingCurrentItem: 'Cancelando el elemento actual.',
currentItemCancelled: 'El elemento actual se ha cancelado.',
startAddingArtist: 'Añadiendo los álbumes de {artist} a la cola',
finishAddingArtist: 'Se ha añadido los álbumes de {artist} a la cola',
startConvertingSpotifyPlaylist: 'Convertir las pistas de Spotify en pistas de Deezer',
finishConvertingSpotifyPlaylist: 'Lista de reproducción de Spotify convertida',
loginNeededToDownload: '¡Necesitas iniciar sesión para descargar títulos!',
deezerNotAvailable: 'Deezer no está disponible en su país. Deberías usar una VPN.'
},
settings: {
title: 'Configuración',
languages: 'Idiomas',
login: {
title: 'Iniciar Sesión',
loggedIn: 'Usted está conectado como {nombre de usuario}',
arl: {
question: '¿Cómo consigo mi propio ARL?',
update: 'Actualiza la ARL'
},
logout: 'Cerrar Sesión',
login: 'Inicia sesión a través de deezer.com'
},
appearance: {
title: 'Apariencia',
slimDownloadTab: 'Pestaña de descargas fina'
},
downloadPath: {
title: 'Ruta de descarga'
},
templates: {
title: 'Plantillas',
tracknameTemplate: 'Plantilla de nombres de pista',
albumTracknameTemplate: 'Plantilla de pista del álbum',
playlistTracknameTemplate: 'Plantilla de pista de la lista de reproducción'
},
folders: {
title: 'Carpetas',
createPlaylistFolder: 'Crear una carpeta para las listas de reproducción',
playlistNameTemplate: 'Plantilla de la carpeta de la lista de reproducción',
createArtistFolder: 'Crear carpeta para el artista',
artistNameTemplate: 'Plantilla de la carpeta del artista',
createAlbumFolder: 'Crear carpeta para el álbum',
albumNameTemplate: 'Plantilla de la carpeta del álbum',
createCDFolder: 'Crear una carpeta para los CDs',
createStructurePlaylist: 'Crear una estructura de carpetas para las listas de reproducción',
createSingleFolder: 'Crear una estructura de carpetas para individuales'
},
trackTitles: {
title: 'Títulos de las pistas',
padTracks: 'Pad de pistas',
paddingSize: 'Sobrescribir el tamaño del pad',
illegalCharacterReplacer: 'Reemplazo del carácter ilegal'
},
downloads: {
title: 'Descargas',
queueConcurrency: 'Descargas simultáneas',
maxBitrate: {
title: 'Tasa de bits preferida',
9: 'FLAC 1411kbps',
3: 'MP3 320kbps',
1: 'MP3 128kbps'
},
overwriteFile: {
title: '¿Desea que se sobreescriban los archivos?',
y: 'Sí, sobrescribir el archivo',
n: 'No, no sobrescribir el archivo',
t: 'Sobrescribir sólo las etiquetas',
b: 'No, mantener los dos archivos y agregar un número al archivo duplicado',
e: 'No, y no mirar las extensiones'
},
fallbackBitrate: 'La solución alternativa de bitrate',
fallbackSearch: 'Búsqueda de la segunda opción',
logErrors: 'Crear archivos de registro de errores',
logSearched: 'Crear archivos de registro para las pistas buscadas',
createM3U8File: 'Crear archivo de la lista de reproducción',
syncedLyrics: 'Crear archivos .lyr (lyrics sincronizadas)',
playlistFilenameTemplate: 'Plantilla de nombres de archivos de la lista de reproducción',
saveDownloadQueue: 'Guardar la cola de descarga al cerrar la aplicación'
},
covers: {
title: 'Portadas de álbumes',
saveArtwork: 'Guardar las portadas',
coverImageTemplate: 'Plantilla de nombres de portada',
saveArtworkArtist: 'Guardar imagen de artista',
artistImageTemplate: 'Plantilla de imagen de artista',
localArtworkSize: 'El tamaño de la portada local',
embeddedArtworkSize: 'El tamaño de la portada incorporada',
localArtworkFormat: {
title: '¿Qué formato quieres que tenga la portada local?',
jpg: 'Una imagen jpeg',
png: 'Una imagen png',
both: 'Ambos, jpeg y png'
},
jpegImageQuality: 'Calidad de la imagen JPEG',
embeddedArtworkPNG: 'Guardar las imágenes incrustadas como PNG',
embeddedPNGWarning: 'Las PNG no están oficialmente soportadas por Deezer y puedes encontrar errores.',
imageSizeWarning: 'Nada por encima de x1200 no es usado oficialmente por Deezer, puede que encuentres inconvenientes',
coverDescriptionUTF8: 'Guardar la descripción de la portada usando UTF8 (arregla la portada de iTunes)'
},
tags: {
head: '¿Qué etiquetas guardar?',
title: 'Título',
artist: 'Artista',
album: 'Álbum',
cover: 'Portada',
trackNumber: 'Número de pista',
trackTotal: 'Total de pistas',
discNumber: 'Número del disco',
discTotal: 'Total del disco',
albumArtist: 'Artista del álbum',
genre: 'Género',
year: 'Año',
date: 'Fecha',
explicit: 'Letras explícitas',
isrc: 'ISRC',
length: 'Duración de la pista',
barcode: 'Código de barras del álbum (UPC)',
bpm: 'BPM',
replayGain: 'Ganancia de la reproducción',
label: 'Etiqueta del álbum',
lyrics: 'Lyrics no sincronizadas',
syncedLyrics: 'Lyrics sincronizadas',
copyright: 'Derechos de autor',
composer: 'Compositor',
involvedPeople: 'Personas involucradas'
},
other: {
title: 'Otro',
savePlaylistAsCompilation: 'Guardar las listas de reproducción como una compilación',
useNullSeparator: 'Usar separador nulo',
saveID3v1: 'Guarda la ID3v1 también',
multiArtistSeparator: {
title: '¿Cómo le gustaría separar a sus artistas?',
nothing: 'Guardar sólo el artista principal',
default: 'Usar la especificación estándar',
andFeat: 'Usar & y feat.',
using: 'Usar "{separator}"'
},
singleAlbumArtist: 'Guardar sólo el artista principal del álbum',
albumVariousArtists: 'Mantener "Various Artists" en los artistas del álbum',
removeAlbumVersion: 'Eliminar "Album Version" del título de la pista',
removeDuplicateArtists: 'Eliminar las combinaciones de artistas',
dateFormat: {
title: 'Formato de fecha para los archivos FLAC',
year: 'AAAA',
month: 'MM',
day: 'DD'
},
featuredToTitle: {
title: '¿Qué debo hacer con los artistas destacados?',
0: 'Nada',
1: 'Quitarlo del título',
3: 'Quitarlo del título y del título del álbum',
2: 'Moverlo al título'
},
titleCasing: 'Capitalizar título',
artistCasing: 'Capitalizar artista',
casing: {
nothing: 'Manténer sin cambios',
lower: 'minúsculas',
upper: 'MAYÚSCULAS',
start: 'Al Principio De Cada Palabra',
sentence: 'Como una frase'
},
previewVolume: 'Volumen de previsualización',
executeCommand: {
title: 'Comando a ejecutar después de la descarga',
description: 'Dejar en blanco para no hacer nada'
}
},
spotify: {
title: 'Funciones de Spotify',
clientID: 'ID del cliente de Spotify',
clientSecret: 'Cliente Secreto Spotify',
username: 'Nombre de usuario de Spotify'
},
reset: 'Restablecer el valor por defecto',
save: 'Guardar',
toasts: {
init: '¡Configuraciones cargadas!',
update: '¡Ajustes actualizados!',
ARLcopied: 'ARL copiado al portapapeles'
}
},
sidebar: {
home: 'inicio',
search: 'buscar',
charts: 'charts',
favorites: 'favoritos',
linkAnalyzer: 'analizar enlaces',
settings: 'ajustes',
about: 'acerca de'
},
tracklist: {
downloadSelection: 'Descargar selección'
}
};
const de = {
globals: {
welcome: 'Willkommen bei deemix',
back: 'zurück',
loading: 'lädt',
download: 'Download {thing}',
by: 'von {artist}',
in: 'in {album}',
download_hint: 'Download',
play_hint: 'Play',
toggle_download_tab_hint: 'Erweitern/Minimieren',
clean_queue_hint: 'Entferne vollständige',
cancel_queue_hint: 'Alle abbrechen',
listTabs: {
empty: '',
all: 'alle',
top_result: 'Top Ergebnis',
album: 'Album | Alben',
artist: 'Künstler | Künstler',
single: 'Single | Singles',
title: 'Titel | Titel',
track: 'Track | Tracks',
trackN: '0 Tracks | {n} Track | {n} Tracks',
releaseN: '0 Releases | {n} Release | {n} Releases',
playlist: 'Playlist | Playlists',
compile: 'Sammlung | Sammlungen',
ep: 'EP | EPs',
spotifyPlaylist: 'Spotify Playlist | Spotify Playlists',
releaseDate: 'Veröffentlichungsdatum',
error: 'Fehler'
}
},
about: {
titles: {
usefulLinks: 'Nützliche Links',
bugReports: 'Fehlermeldung',
contributing: 'Mitwirkende',
donations: 'Spenden',
license: 'Lizenz'
},
subtitles: {
bugReports: 'Funktioniert etwas in Deemix nicht? Sag uns bescheid!',
contributing: 'Du möchtest bei dem Projekt helfen? Das kannst du auf verschiedene Arten machen!',
donations: 'Du möchtest deemix finanziell unterstützen? Dann lasse eine kleine Spende da!'
},
usesLibrary: 'Dieses Programm nutzt die <strong>deemix</strong> Bibliothek, die du dazu nutzen kannst deine eigene deemix UI zu erstellen.',
thanks: 'Ein Dankeschön geht an <strong>rtonno</strong>, <strong>uhwot</strong> and <strong>lollilol</strong> für die Hilfe bei diesem Projekt und an <strong>BasCurtiz</strong> and <strong>scarvimane</strong> für die Erstellung des Logos.',
upToDate: {
text: 'Bleib auf dem Laufenden mit den Updates indem du dem {newsChannel} auf Telegram folgst.',
newsChannel: 'News Channel'
},
officialWebsite: 'Offizielle Website',
officialRepo: 'Offizielle Library Repository',
officialWebuiRepo: 'Offizielle WebUI Repository',
officialSubreddit: 'Offizieller Subreddit',
newsChannel: 'News Channel',
questions: {
text:'Bei Fragen oder Problemen mit der App, suche als erstes nach einer Lösung im {subreddit}. Wenn du da nichts findest, kannst du einen Beitrag mit deinen Problem auf dem Subreddit verfassen.',
subreddit: 'Subreddit'
},
beforeReporting: 'Bevor du einen Bug meldest, stelle sicher, dass du die neueste Version der App hast und dass das, was du melden möchtest, tatsächlich ein Bug ist und nicht nur bei dir falsch ist.',
beSure: 'Stelle sicher, dass der Bug auf anderen Computern auch vorhanden ist <strong>MELDEN NICHT</strong> einen Bug, wenn er schon gemeldet worden ist.',
duplicateReports: 'Doppelte Fehlerberichte werden geschlossen, achte darauf.',
dontOpenIssues: '<strong>ERSTELLE KEINE</strong> Fehlermeldungen um Fragen zu stellen, es gibt einen Subreddit dafür.',
newUI: {
text: 'Wenn du Python fließend beherrschst, kannst du versuchen, mit hilfe der base library eine neue Benutzeroberfläche für die App zu erstellen oder Fehler in der Bibliothek mit einem Pull-Request in der {repo} zu beheben.',
repo: 'deemix Repo'
},
acceptFeatures: 'Ich akzeptiere auch Funktionen, aber keine komplexen Dinge, da sie direkt in der App und nicht in der Bibliothek implementiert werden können.',
otherLanguages: 'Wenn du eine andere Programmiersprache fließend beherrschst, kannst du versuchen, deemix in andere Programmiersprachen zu portieren!',
understandingCode: 'Du benötigst Hilfe beim verstehen des Codes? Frag einfach RemixDev auf Telegram oder Reddit.',
contributeWebUI: {
text: 'Wenn du Vue.js (JavaScript) oder HTML und CSS kennst, könntest du etwas zum {webui} beitragen.',
webui: 'WebUI'
},
itsFree: 'Du solltest im Kopf behalten das <strong>dies ein kostenloses Projekt ist</strong> und <strong>Du solltest die Künstler unterstützen, die du magst </strong> bevor du die Entwickler unterstützt.',
notObligated: 'Fühle dich nicht gezwungen zu spenden, danke, dass du deemix verwendest!',
lincensedUnder:{
text: 'Diese Arbeit ist lizensiert unter der {gpl3}.',
gpl3: 'GNU General Public License 3.0'
}
},
charts: {
title: 'Charts',
changeCountry: 'Land wechseln',
download: 'Download Chart'
},
errors: {
title: 'Errors für {name}',
ids: {
invalidURL: 'URL nicht erkannt',
unsupportedURL: 'URL noch nicht unterstützt',
ISRCnotOnDeezer: 'Track ISRC ist auf deezer nicht verfügbar',
notYourPrivatePlaylist: "Du kannst keine privaten Playlisten anderer herunterladen.",
spotifyDisabled: 'Spotify-Funktionen sind nicht richtig eingerichtet',
trackNotOnDeezer: 'Track ist nicht verfügbar auf Deezer!',
albumNotOnDeezer: 'Album auf Deezer nicht gefunden!',
notOnDeezer: 'Track auf Deezer nicht verfügbar!',
notEncoded: 'Track noch nicht codiert!',
notEncodedNoAlternative: 'Track noch nicht codiert und keine Alternative gefunden!',
wrongBitrate: 'Track mit gewünschter Bitrate nicht gefunden.',
wrongBitrateNoAlternative: 'Track mit gewünschter Bitrate nicht gefunden und keine Alternative gefunden!',
no360RA: 'Track ist nicht verfügbar in Reality Audio 360.',
notAvailable: "Track ist noch nicht verfügbar auf den Servern von Deezer!",
notAvailableNoAlternative: "Track ist noch nicht verfügbar auf den Servern von Deezer und keine Alternativen gefunden!!"
}
},
favorites: {
title: 'Favoriten',
noPlaylists: 'Keine Playlist gefunden',
noAlbums: 'Keine favorisierten Alben gefunden',
noArtists: 'Keine favorisierten Künstler gefunden',
noTracks: 'Keine favorisierten Tracks gefunden'
},
home: {
needTologin: 'Du musst dich in deinem Deezer-Account anmelden bevor du mit dem Download starten kannst.',
openSettings: 'Einstellungen öffnen',
sections: {
popularPlaylists: 'Beliebte Playlists',
popularAlbums: 'Meistgestreamte Alben'
}
},
linkAnalyzer: {
info: 'Diesen Abschnitt kannst du nutzen, um weitere Informationen über den gewünschten Link zu erhalten, den du herunterladen möchtest.',
useful: "Dies ist z.B. nützlich, wenn du versuchst einige Titel herunterzuladen, welche in deinem Land nicht verfügbar sind, und du wissen möchtest, wo sie verfügbar sind.",
linkNotSupported: 'Dieser Link wird noch nicht unterstützt',
linkNotSupportedYet: 'Es scheint so, als ob dieser Link noch nicht unterstützt wird. Versuche einen anderen Link zu analysieren.',
table: {
id: 'ID',
isrc: 'ISRC',
upc: 'UPC',
duration: 'Dauer',
diskNumber: 'CD Nummer',
trackNumber: 'Track Nummer',
releaseDate: 'Veröffentlichungsdatum',
bpm: 'BPM',
label: 'Label',
recordType: 'Art der Aufnahme',
genres: 'Genres',
tracklist: 'Trackliste'
}
},
search: {
startSearching: 'Suche starten!',
description: 'Du kannst einen Titel, ein ganzes Album, einen Künstler, eine Playlist suchen ... alles! Du kannst auch einen Deezer-Link einfügen',
fans: '{n} Fans',
noResults: 'Keine Ergebnisse',
noResultsTrack: 'Keine Tracks gefunden',
noResultsAlbum: 'Keine Alben gefunden',
noResultsArtist: 'Keinen Künstler gefunden',
noResultsPlaylist: 'Keine Playlist gefunden'
},
searchbar: 'Suche nach allem, was dir gefällt (oder füge einfach einen Link ein)',
downloads: 'Downloads',
toasts: {
addedToQueue: '{item} zur Warteschlange hinzugefügt',
alreadyInQueue: '{item} ist bereits in der Warteschlange!',
finishDownload: '{item} vollständig heruntergeladen.',
allDownloaded: 'Alle Downloads abgeschlossen!',
refreshFavs: 'Abgeschlossene Downloads neu laden!',
loggingIn: 'Einloggen',
loggedIn: 'Eingeloggt',
alreadyLogged: 'Bereits eingeloggt',
loginFailed: "Login fehlgeschlagen",
loggedOut: 'Ausgeloggt',
cancellingCurrentItem: 'Aktuelle Auswahl abbrechen.',
currentItemCancelled: 'Aktuelle Auswahl wurde abgebrochen',
startAddingArtist: '{artist} Alben werden hinzugefügt',
finishAddingArtist: '{artist} Alben wurden hinzugefügt',
startConvertingSpotifyPlaylist: 'Konvertierern von Spotify-Tracks zu Deezer-Tracks',
finishConvertingSpotifyPlaylist: 'Spotify Playlist convertiert'
},
settings: {
title: 'Einstellungen',
languages: 'Sprachen',
login: {
title: 'Login',
loggedIn: 'Du bist eingeloggt als {username}',
arl: {
question: 'Wie bekomme ich meine eigene ARL?',
update: 'Update ARL'
},
logout: 'Logout'
},
appearance: {
title: 'Design',
slimDownloadTab: 'schmaler Download-Tab'
},
downloadPath: {
title: 'Download Pfad'
},
templates: {
title: 'Vorlagen',
tracknameTemplate: 'Vorlage für den Tracknamen',
albumTracknameTemplate: 'Vorlage für Tracks in einem Album',
playlistTracknameTemplate: 'Vorlage für Tracks in einer Playlist'
},
folders: {
title: 'Folders',
createPlaylistFolder: 'Ordner für Playlist erstellen',
playlistNameTemplate: 'Vorlage für Playlist-Ordner',
createArtistFolder: 'Ordner für Künstler erstellen',
artistNameTemplate: 'Vorlage für Künstler-Ordner',
createAlbumFolder: 'Ordner für Album erstellen',
albumNameTemplate: 'Vorlage für Album-Ordner',
createCDFolder: 'Ordner für CDs erstellen',
createStructurePlaylist: 'Erstellen von Künstler-, Alben- und CD-Ordnern auch für Playlists',
createSingleFolder: 'Ordner für einzelne Titel erstellen'
},
trackTitles: {
title: 'Songtitel',
padTracks: 'Einheitliche Länge der Titelnummern (voranstehende Nullen werden ergänzt)',
paddingSize: 'Innenabstand überschreiben',
illegalCharacterReplacer: 'Unzulässige Zeichen ersetzen'
},
downloads: {
title: 'Downloads',
queueConcurrency: 'Gleichzeitige Downloads',
maxBitrate: {
title: 'Bevorzugte Bitrate',
9: 'FLAC 1411kbps',
3: 'MP3 320kbps',
1: 'MP3 128kbps'
},
overwriteFile: {
title: 'Soll ich die Dateien überchreiben?',
y: 'Ja überschreibe die Dateien',
n: 'Nein überschreibe die Dateien nicht',
t: 'Überschreibe nur die Tags',
b: 'Nein, behalte beide Dateien und füge der Kopie eine Nummer hinzu'
},
fallbackBitrate: 'Falls gewünschte Bitrate nicht verfügbar, auf niedrigere Bitrate zurückgreifen',
fallbackSearch: 'Zur Suche zurückkehren, wenn der Song nicht verfügbar ist',
logErrors: 'Protokolldatei für Fehler im Download-Ordner erstellen',
logSearched: 'Protokolldatei für gesuchte Titel erstellen',
createM3U8File: 'Erstelle Playlist-Datei (M3U8)',
syncedLyrics: 'Erstelle synchrone Lyrics-Datei (.lyr)',
playlistFilenameTemplate: 'Vorlage für den Namen der Playlist',
saveDownloadQueue: 'Download-Warteschlange beim Schließen der App speichern'
},
covers: {
title: 'Album Cover',
saveArtwork: 'Cover speichern',
coverImageTemplate: 'Vorlage für den Covernamen',
saveArtworkArtist: 'Speichere das Künstlerbild',
artistImageTemplate: 'Vorlage des Künstlerbildes',
localArtworkSize: 'Lokale Grafikgröße',
embeddedArtworkSize: 'Eingebettete Grafikgröße',
localArtworkFormat: {
title: 'Welches Datei-Format soll das Cover haben?',
jpg: 'Ein jpg Bild',
png: 'Ein png Bild',
both: 'Beides (jpg + png)'
},
jpegImageQuality: 'JPEG Qualität'
},
tags: {
head: 'Welche Tags sollen gespeichert werden?',
title: 'Titel',
artist: 'Künstler',
album: 'Album',
cover: 'Cover',
trackNumber: 'Titelnummer',
trackTotal: 'Titelanzahl',
discNumber: 'CD Nummer',
discTotal: 'CDs insgesamt',
albumArtist: 'Album Künstler',
genre: 'Genre',
year: 'Jahr',
date: 'Datum',
explicit: 'Explizite Lyrics',
isrc: 'ISRC',
length: 'Titel Länge',
barcode: 'Album Barcode (UPC)',
bpm: 'BPM',
replayGain: 'Wiedergabe Lautstärke',
label: 'Album Plattenlabel',
lyrics: 'Nicht synchronisierte Texte',
copyright: 'Copyright',
composer: 'Komponist',
involvedPeople: 'Mitwirkende Personen'
},
other: {
title: 'Sonstige',
savePlaylistAsCompilation: 'Speichere Playlist als Zusammenstellung',
useNullSeparator: 'Verwende Nulltrennzeichen',
saveID3v1: 'Speichere ID3v1 ebenfalls',
multiArtistSeparator: {
title: 'Wie möchtest du die Künstler trennen?',
nothing: 'Speichere nur den Hauptkünstler',
default: 'Verwende Standard Spezifikationen',
andFeat: 'Verwende & und feat.',
using: 'Verwende "{separator}"'
},
singleAlbumArtist: 'Nur den Hauptkünstler speichern',
albumVariousArtists: 'Verschiedene Künstler" im Album Künstler Tag behalten',
removeAlbumVersion: 'Entferne die "Album Version" vom Songtitel',
removeDuplicateArtists: 'Kombinationen von Künstlern entfernen',
dateFormat: {
title: 'Datumsformatierung für FLAC Dateien',
year: 'JJJJ',
month: 'MM',
day: 'TT'
},
featuredToTitle: {
title: 'Was soll ich mit featured Artists machen?',
0: 'Nichts',
1: 'Vom Titel entfernen',
3: 'Vom Titel und Albumtitel entfernen',
2: 'Zu dem Titel hinzufügen'
},
titleCasing: 'Titel-Schreibweise',
artistCasing: 'Künstler-Schreibweise',
casing: {
nothing: 'Unbearbeitet lassen',
lower: 'klein',
upper: 'GROSS',
start: 'Wortanfang Gross',
sentence: 'Satzanfang gross'
},
previewVolume: 'Vorschau der Lautstärke',
executeCommand: {
title: 'Befehl, der nach dem Download ausgeführt werden soll',
description: 'Leer lassen ohne Aktion'
}
},
spotify: {
title: 'Spotify Features',
clientID: 'Spotify Client ID',
clientSecret: 'Spotify Client Secret',
username: 'Spotify Benutzername'
},
reset: 'Auf Standardwerte zurücksetzen',
save: 'Speichern',
toasts: {
init: 'Einstellungen geladen!',
update: 'Einstellungen aktualisiert!',
ARLcopied: 'ARL wurde in die Zwischenablage kopiert'
}
},
sidebar: {
home: 'Home',
search: 'Suche',
charts: 'Charts',
favorites: 'Favoriten',
linkAnalyzer: 'Link Analyse',
settings: 'Einstellungen',
about: 'Info'
},
tracklist: {
downloadSelection: 'Downloads'
}
};
const fr = {
globals: {
welcome: 'Bienvenue dans deemix',
back: 'retour',
loading: 'chargement en cours',
download: 'Télécharger {thing}',
by: 'par {artist}',
in: 'dans {album}',
download_hint: 'Télécharger',
play_hint: 'Lire',
toggle_download_tab_hint: 'Développer/Réduire',
clean_queue_hint: 'Retirer Les Tâches Terminées',
cancel_queue_hint: 'Tout Annuler',
open_downloads_folder: 'Ouvrir Le Dossier De Téléchargements',
cut: 'couper',
copy: 'copier',
copyLink: 'copier le lien',
copyImageLink: "copier le lien de l'image",
copyDeezerLink: 'copier le lien deezer',
paste: 'coller',
listTabs: {
empty: '',
all: 'tout',
top_result: 'meilleur résultat',
album: 'album | albums',
artist: 'artiste | artistes',
single: 'single | singles',
title: 'titre | titres',
track: 'piste | pistes',
releaseN: '0 sortie | {n} sortie | {n} sorties',
playlist: 'playlist | playlists',
compile: 'compilation | compilations',
ep: 'ep | eps',
bundle: 'bundle | bundles',
more: "Plus d'albums",
featured: 'Apparaît dans',
spotifyPlaylist: 'playlist spotify | playlists spotify',
releaseDate: 'date de sortie',
error: 'erreur',
trackN: '0 piste | {n} piste | {n} pistes',
albumN: '0 album | {n} album | {n} albums',
artistN: '0 artiste | {n} artiste | {n} artistes',
playlistN: '0 playlist | {n} playlist | {n} playlists'
}
},
about: {
updates: {
currentVersion: 'Version Actuelle',
versionNotAvailable: 'N/A',
updateAvailable: "Vous n'utilisez pas la dernière version disponible : {version}",
deemixVersion: 'Version de la bibliothèque deemix'
},
titles: {
usefulLinks: 'Liens Utiles',
bugReports: 'Rapports De Bug',
contributing: 'Contribution',
donations: 'Dons',
license: 'Licence'
},
subtitles: {
bugReports: 'Quelque chose ne fonctionne pas dans deemix ? Contactez-nous !',
contributing: 'Vous souhaitez contribuer à ce projet ? Vous pouvez le faire de différentes manières !',
donations: 'Vous souhaitez contribuer financièrement ? Vous pouvez faire un don !'
},
usesLibrary:
'Cette application utilise la bibliothèque <strong>deemix</strong>, que vous pouvez exploiter afin de créer votre propre interface utilisateur pour deemix.',
thanks:
"Merci à <strong>rtonno</strong>, <strong>uhwot</strong> et <strong>lollilol</strong> de m'avoir aidé dans ce projet ainsi qu'à <strong>BasCurtiz</strong> et <strong>scarvimane</strong> pour la création de l'icône.",
upToDate: {
text: `Restez informé des mises à jour en suivant le {newsChannel} sur Telegram.`,
newsChannel: "canal d'informations"
},
officialWebsite: 'Site Officiel',
officialRepo: 'Répertoire De Dépôt Officiel De La Bibliothèque',
officialWebuiRepo: 'Répertoire De Dépôt Officiel De La WebUI',
officialSubreddit: 'Subreddit Officiel',
newsChannel: "Canal d'Informations",
questions: {
text: `Si vous avez des questions ou des problèmes avec l'application, cherchez d'abord une solution dans le {subreddit}. Ensuite, si la solution ne s'y trouve pas, vous pouvez publier un message dans le subreddit en décrivant votre problème.`,
subreddit: 'subreddit'
},
beforeReporting:
"Avant de signaler un bug, assurez-vous que vous utilisez la version la plus récente de l'application. Vérifiez que vous souhaitez nous rapporter un bug et non quelque chose qui ne fonctionne pas uniquement de votre côté.",
beSure:
"Assurez-vous que le bug soit reproductible sur d'autres appareils mais aussi de <strong>NE PAS</strong> signaler un bug si celui-ci a déjà été recensé.",
duplicateReports: "Les rapports de bug répétitifs seront supprimés, merci d'en prendre bonne note.",
dontOpenIssues:
"<strong>NE PAS</strong> rapporter de problème s'il ne s'agit que de simples questions. Un subreddit existe pour ces questions.",
newUI: {
text: `Si vous maîtrisez python, vous pouvez essayer de créer une nouvelle interface utilisateur pour l'application à l'aide de la bibliothèque de base, ou corriger des bugs dans la bibliothèque à l'aide d'une demande de fusion de branches (pull request) sur le {repo}.`,
repo: 'répertoire de dépôt'
},
acceptFeatures:
"J'accepte également les nouvelles fonctionnalités, mais pas de choses complexes, dans la mesure où elles peuvent être implémentées directement dans l'application et non dans la bibliothèque.",
otherLanguages:
'Si vous maîtrisez un autre langage de programmation, vous pouvez essayer de transposer deemix dans ce dernier !',
understandingCode:
"Vous avez besoin d'aide pour comprendre le code ? Il suffit de contacter RemixDev sur Telegram ou Reddit.",
contributeWebUI: {
text: `Si vous vous y connaissez en Vue.js (JavaScript), HTML ou CSS, vous pouvez contribuer à la {webui}.`,
webui: 'WebUI'
},
itsFree:
"N'oubliez pas que <strong>ce projet est libre</strong> et qu'il est important de <strong>soutenir vos artistes préférés</strong> avant de supporter les développeurs.",
notObligated: 'Ne vous sentez pas obligé de faire un don, vous êtes tout de même apprécié !',
lincensedUnder: {
text: `Ce projet s'inscrit dans le cadre de la {gpl3}.`,
gpl3: 'Licence publique générale GNU, version 3'
}
},
charts: {
title: 'Classements',
changeCountry: 'Changer De Pays',
download: 'Télécharger Le Classement'
},
errors: {
title: 'Erreurs pour {name}',
ids: {
invalidURL: "Cette URL n'est pas reconnue",
unsupportedURL: "Cette URL n'est actuellement pas supportée",
ISRCnotOnDeezer: "L'ISRC de la piste est indisponible sur Deezer",
notYourPrivatePlaylist: "Vous n'êtes pas autorisé à télécharger les playlists privées de quelqu'un d'autre.",
spotifyDisabled: 'Les Fonctionnalités Spotify ne sont pas configurées correctement.',
trackNotOnDeezer: 'La piste est introuvable sur Deezer !',
albumNotOnDeezer: "L'album est introuvable sur Deezer !",
notOnDeezer: 'La piste est indisponible sur Deezer !',
notEncoded: "La piste n'a pas encore été encodée !",
notEncodedNoAlternative: "La piste n'a pas encore été encodée et aucune alternative n'a été trouvée !",
wrongBitrate: 'La piste est introuvable au débit souhaité.',
wrongBitrateNoAlternative: "La piste est introuvable au débit souhaité et aucune alternative n'a été trouvée !",
no360RA: 'La piste est indisponible au format Reality Audio 360.',
notAvailable: 'La piste est indisponible sur les serveurs de Deezer !',
notAvailableNoAlternative:
"La piste est indisponible sur les serveurs de Deezer et aucune alternative n'a été trouvée !",
noSpaceLeft: "L'espace disponible sur cet appareil est insuffisant !",
albumDoesntExists: "Aucun album n'existe pour cette piste, impossible de collecter les informations nécessaires"
}
},
favorites: {
title: 'Favoris',
noPlaylists: "Aucune Playlist n'a été trouvée",
noAlbums: "Aucun Album Favori n'a été trouvé",
noArtists: "Aucun Artiste Favori n'a été trouvé",
noTracks: "Aucune Piste Favorite n'a été trouvée"
},
home: {
needTologin: 'Vous devez vous connecter à votre compte Deezer avant de pouvoir démarrer un téléchargement.',
openSettings: 'Ouvrir Les Paramètres',
sections: {
popularPlaylists: 'Playlists les plus écoutées',
popularAlbums: 'Albums les plus écoutés'
}
},
linkAnalyzer: {
info:
"Vous pouvez utiliser cette section pour obtenir davantage d'informations sur le lien que vous essayez de télécharger.",
useful:
"C'est utile si vous essayez, par exemple, de télécharger des pistes indisponibles dans votre pays et que vous souhaitez savoir où elles sont disponibles.",
linkNotSupported: "Ce lien n'est pas encore pris en charge",
linkNotSupportedYet: "Il semble que ce lien ne soit pas encore pris en charge, essayez d'en analyser un autre.",
table: {
id: 'ID',
isrc: 'ISRC',
upc: 'UPC',
duration: 'Durée',
diskNumber: 'Numéro De Disque',
trackNumber: 'Numéro De Piste',
releaseDate: 'Date De Sortie',
bpm: 'BPM',
label: 'Label',
recordType: "Type d'Enregistrement",
genres: 'Genres',
tracklist: 'Liste Des Pistes'
}
},
search: {
startSearching: 'Démarrer une recherche !',
description:
'Vous pouvez rechercher une piste, un album entier, un artiste, une playlist... tout ce que vous voulez ! Vous pouvez également coller un lien Deezer.',
fans: '{n} fans',
noResults: 'Aucun résultat',
noResultsTrack: "Aucune piste n'a été trouvée",
noResultsAlbum: "Aucun album n'a été trouvé",
noResultsArtist: "Aucun artiste n'a été trouvé",
noResultsPlaylist: "Aucune playlist n'a été trouvée"
},
searchbar: 'Saisissez une requête (ou collez simplement un lien)',
downloads: 'téléchargements',
toasts: {
restoringQueue: "Restauration de la file d'attente de téléchargement...",
queueRestored: "La file d'attente de téléchargement a été restaurée !",
addedToQueue: "{item} ajouté à la file d'attente",
addedMoreToQueue: "{n} éléments ajoutés à la file d'attente",
alreadyInQueue: "{item} est déjà dans la file d'attente !",
finishDownload: '{item} a été téléchargé.',
allDownloaded: 'Tous les téléchargements sont terminés !',
refreshFavs: 'Actualisation terminée !',
loggingIn: 'Connexion en cours...',
loggedIn: 'Connecté',
alreadyLogged: 'Déjà connecté',
loginFailed: 'Connexion impossible',
loggedOut: 'Déconnecté',
cancellingCurrentItem: "Annulation de l'élément actuel.",
currentItemCancelled: 'Élément actuel annulé.',
startAddingArtist: "Ajout des albums de {artist} à la file d'attente",
finishAddingArtist: "Les albums de {artist} ont été ajoutés à la file d'attente",
startConvertingSpotifyPlaylist: 'Conversion de pistes Spotify en équivalents Deezer',
finishConvertingSpotifyPlaylist: 'Playlist Spotify convertie',
loginNeededToDownload: 'Vous devez vous connecter pour pouvoir télécharger des pistes !',
deezerNotAvailable: 'Deezer est indisponible dans votre pays. Vous devez utiliser un VPN.',
startGeneratingItems: 'Traitement de {n} éléments...',
finishGeneratingItems: '{n} éléments ont été générés.'
},
settings: {
title: 'Paramètres',
languages: 'Langues',
login: {
title: 'Connexion',
loggedIn: 'Vous êtes connecté en tant que {username}',
arl: {
question: 'Comment obtenir mon ARL personnel ?',
update: "Mettre à jour l'ARL"
},
logout: 'Déconnexion',
login: 'Connexion via deezer.com'
},
appearance: {
title: 'Apparence',
slimDownloadTab: 'Onglet de téléchargement compact',
slimSidebar: 'Barre latérale compacte'
},
downloadPath: {
title: 'Emplacement De Téléchargement'
},
templates: {
title: 'Modèles',
tracknameTemplate: 'Modèle pour le nom de piste',
albumTracknameTemplate: "Modèle pour le nom de piste de l'album",
playlistTracknameTemplate: 'Modèle pour le nom de piste de la playlist'
},
folders: {
title: 'Dossiers',
createPlaylistFolder: 'Générer des dossiers par playlist',
playlistNameTemplate: 'Modèle pour le nom du dossier de playlist',
createArtistFolder: 'Générer des dossiers par artiste',
artistNameTemplate: "Modèle pour le nom du dossier d'artiste",
createAlbumFolder: 'Générer des dossiers par album',
albumNameTemplate: "Modèle pour le nom du dossier d'album",
createCDFolder: 'Générer des dossiers par CD',
createStructurePlaylist: 'Générer une structure de dossiers pour les playlists',
createSingleFolder: 'Générer une structure de dossiers pour les singles'
},
trackTitles: {
title: 'Titres des pistes',
padTracks:
'Longueur uniforme des numéros de piste (ajoute automatiquement des zéros devant le numéro initial de la piste)',
paddingSize: 'Nombre de zéros à ajouter en permanence devant le numéro initial de la piste',
illegalCharacterReplacer: 'Substitut aux caractères non autorisés (dans les noms de fichiers et de dossiers)'
},
downloads: {
title: 'Téléchargements',
queueConcurrency: 'Téléchargements Simultanés',
maxBitrate: {
title: 'Débit Préféré',
9: 'FLAC 1411kbps',
3: 'MP3 320kbps',
1: 'MP3 128kbps'
},
overwriteFile: {
title: 'Les fichiers doivent-ils être écrasés ?',
y: 'Oui, écraser le fichier',
n: 'Non, ne pas écraser le fichier',
t: 'Écraser uniquement les métadonnées',
b: 'Non, conserver les deux fichiers et ajouter un numéro au doublon',
e: "Non, et ne pas tenir compte de l'extension du fichier"
},
fallbackBitrate: "Recourir à un débit plus faible si le débit préféré n'est pas disponible",
fallbackSearch: "Rechercher la piste si le lien original n'est pas disponible",
logErrors: "Créer un fichier journal d'erreurs",
logSearched: 'Créer un fichier journal des pistes recherchées',
createM3U8File: 'Créer un fichier de playlist',
syncedLyrics: 'Créer des fichiers .lyr (Paroles Synchronisées)',
playlistFilenameTemplate: 'Modèle du nom de fichier de la playlist',
saveDownloadQueue: "Enregistrer la file d'attente de téléchargement à la fermeture de l'application"
},
covers: {
title: "Pochettes d'albums",
saveArtwork: 'Enregistrer Les Pochettes',
coverImageTemplate: 'Modèle pour le nom de la pochette',
saveArtworkArtist: "Enregistrer l'image de l'artiste",
artistImageTemplate: "Modèle pour le nom de l'image de l'artiste",
localArtworkSize: "Taille de l'illustration locale",
embeddedArtworkSize: "Taille de l'illustration incorporée aux fichiers audio",
localArtworkFormat: {
title: "Dans quel format souhaitez-vous l'illustration locale ?",
jpg: 'Une image jpeg',
png: 'Une image png',
both: 'À la fois jpeg et png'
},
jpegImageQuality: "Qualité de l'image JPEG",
embeddedArtworkPNG: "Enregistrer l'illustration incorporée aux fichiers audio en tant que PNG",
embeddedPNGWarning:
'Les images PNG ne sont pas officiellement utilisées par Deezer et pourraient causer des problèmes.',
imageSizeWarning:
"Toute valeur supérieure à x1200 n'est pas officiellement supportée par Deezer, vous pourriez donc rencontrer des problèmes.",
coverDescriptionUTF8: 'Enregistrer la description de la pochette au format UTF8 (iTunes Cover Fix)'
},
tags: {
head: 'Métadonnées à sauvegarder',
title: 'Titre',
artist: 'Artiste',
album: 'Album',
cover: 'Pochette',
trackNumber: 'Numéro De Piste',
trackTotal: 'Nombre De Pistes',
discNumber: 'Numéro Du Disque',
discTotal: 'Nombre De Disques',
albumArtist: "Artiste De l'Album",
genre: 'Genre',
year: 'Année',
date: 'Date',
explicit: 'Paroles Explicites',
isrc: 'ISRC',
length: 'Longueur De La Piste',
barcode: "Code-Barres De l'Album (UPC)",
bpm: 'BPM',
replayGain: 'Gain En Relecture (Replay Gain)',
label: "Label De l'Album",
lyrics: 'Paroles Non-Synchronisées',
syncedLyrics: 'Paroles Synchronisées',
copyright: "Droits d'Auteur (Copyright)",
composer: 'Compositeur',
involvedPeople: 'Personnes Impliquées',
source: 'ID de la source et de la piste'
},
other: {
title: 'Autre',
savePlaylistAsCompilation: 'Enregistrer les playlists en tant que compilation',
useNullSeparator: 'Utiliser le caractère NULL comme séparateur',
saveID3v1: 'Enregistrer également les métadonnées ID3v1',
multiArtistSeparator: {
title: 'Comment aimeriez-vous séparer les artistes ?',
nothing: "Enregistrer uniquement l'artiste principal",
default: 'En utilisant la spécification standard',
andFeat: 'En utilisant & et feat.',
using: 'En utilisant "{separator}"'
},
singleAlbumArtist: "Enregistrer uniquement l'artiste principal de l'album",
albumVariousArtists: `Conserver "Various Artists" dans les Artistes de l'Album`,
removeAlbumVersion: `Supprimer "Album Version" du titre de la piste`,
removeDuplicateArtists: "Supprimer les combinaisons d'artistes",
dateFormat: {
title: 'Format de date pour les fichiers FLAC',
year: 'AAAA',
month: 'MM',
day: 'JJ'
},
featuredToTitle: {
title: 'Que faire des artistes participants (featuring) ?',
0: 'Ne rien faire',
1: 'Les retirer du titre de la piste',
3: "Les supprimer du titre de la piste et du titre de l'album",
2: 'Les déplacer vers le titre de la piste'
},
titleCasing: 'Casse pour le titre',
artistCasing: "Casse pour l'artiste",
casing: {
nothing: 'Conserver inchangé',
lower: 'minuscules',
upper: 'MAJUSCULES',
start: 'Majuscule Au Début De Chaque Mot',
sentence: 'Majuscule seulement au début de la phrase'
},
previewVolume: 'Volume sonore des aperçus de pistes',
executeCommand: {
title: 'Commande à exécuter après le téléchargement',
description: "Laisser vide pour qu'aucune action n'ait lieu"
}
},
spotify: {
title: 'Fonctionnalités Spotify',
clientID: 'clientID Spotify',
clientSecret: 'Client Secret Spotify',
username: "Nom d'utilisateur Spotify",
question: 'Comment activer les Fonctionnalités Spotify ?'
},
reset: 'Rétablir les valeurs par défaut',
save: 'Sauvegarder',
toasts: {
init: 'Paramètres chargés !',
update: 'Paramètres mis à jour !',
ARLcopied: 'ARL copié dans le presse-papier'
}
},
sidebar: {
home: 'accueil',
search: 'recherche',
charts: 'classements',
favorites: 'favoris',
linkAnalyzer: 'analyseur de lien',
settings: 'paramètres',
about: 'à propos'
},
tracklist: {
downloadSelection: 'Télécharger la sélection'
}
};
const id = {
globals: {
welcome: 'Selamat datang di deemix',
back: 'kembali',
loading: 'memuat',
download: 'Mengunduh {thing}',
by: 'oleh {artist}',
in: 'di {album}',
download_hint: 'Unduh',
play_hint: 'Putar',
toggle_download_tab_hint: 'Buka/Tutup',
clean_queue_hint: 'Berhasil Mengosongkan',
cancel_queue_hint: 'Batalkan Semua',
listTabs: {
empty: '',
all: 'semua',
top_result: 'hasil teratas',
album: 'album | album',
artist: 'artis | artis',
single: 'singel | singel',
title: 'judul | judul',
track: 'lagu | lagu',
trackN: '0 lagu | {n} lagu | {n} lagu',
releaseN: '0 rilis | {n} rilis | {n} rilis',
playlist: 'daftar putar | daftar putar',
compile: 'kompilasi | kompilasi',
ep: 'ep | ep',
spotifyPlaylist: 'daftar putar spotify | daftar putar spotify',
releaseDate: 'tanggal rilis',
error: 'galat'
}
},
about: {
titles: {
usefulLinks: 'Tautan Berguna',
bugReports: 'Laporan Kesalahan',
contributing: 'Kontirbutor',
donations: 'Donasi',
license: 'Lisensi'
},
subtitles: {
bugReports: "Ada yang tidak bekerja dengan baik di deemix? Beri tahu kami!",
contributing: 'Mau kontribusi dalam proyek ini? Kamu bisa lakukan dengan banyak hal!',
donations: 'Mau kontribusi secara finansial? Kamu bisa beri donasi!'
},
usesLibrary: 'Aplikasi ini menggunakan pustaka <strong>deemix</strong>, yang bisa kamu gunakan untuk membuat UI deemix milikmu sendiri.',
thanks: `Terima kasih kepada <strong>rtonno</strong>, <strong>uhwot</strong> dan <strong>lollilol</strong> yang telah membantuku dalam proyek ini, serta kepada <strong>BasCurtiz</strong> dan <strong>scarvimane</strong> yang telah membuat ikon.`,
upToDate: {
text: `Ikuti {newsChannel} di Telegram agar tidak ketinggalan berita terbaru.`,
newsChannel: 'kanal berita deemix'
},
officialWebsite: 'Situs Web Resmi',
officialRepo: 'Repositori Pustaka Resmi',
officialWebuiRepo: 'Repositori WebUI Resmi',
officialSubreddit: 'Subreddit Resmi',
newsChannel: 'Kanal Berita',
questions: {
text: `Kalau kamu punya pertanyaan atau masalah dengan aplikasi ini, tolong cari solusinya di {subreddit} kami terlebih dahulu. Kalau memang tidak ada, silakan buat pos baru berisikan persoalan tersebut.`,
subreddit: 'subreddit'
},
beforeReporting: `Sebelum melaporkan masalah, pastikan kamu sudah memakai versi aplikasi terbaru dan hal yang akan kamu laporkan memang bukan kesalahan dari pihak kamu sendiri.`,
beSure: `Pastikan masalah tersebut bisa diemulasikan di mesin lain, dan juga <strong>JANGAN</strong> laporkan masalah yang sudah dilaporkan sebelumnya.`,
duplicateReports: 'Laporan duplikat akan kami tutup, jadi perhatikan baik-baik.',
dontOpenIssues: `<strong>JANGAN</strong> buka issue baru untuk mengirimkan pertanyaan, silakan lakukan di subreddit.`,
newUI: {
text: `Kalau kamu mahir pada python, kamu bisa coba membuat UI baru untuk aplikasi ini menggunakan pustaka dasar, atau membenarkan masalah di pustaka kami dengan melakukan pull request pada {repo} kami.`,
repo: 'repo'
},
acceptFeatures: `Kami juga menerima fitur baru, tapi jangan yang terlalu kompleks, karena hal itu lebih baik diimplementasikan langsung di aplikasi daripada di pustaka.`,
otherLanguages: `Kalau kamu mahir dengan bahasa pemrograman lain, kamu bisa coba mentransfer deemix ke bahasa tersebut!`,
understandingCode: `Butuh bantuan untuk memahami kode deemix? Kontak RemixDev di Telegram atau Reddit.`,
contributeWebUI: {
text: `Kalau kamu paham Vue.js (JavaScript), HTML, atau CSS, kamu bisa berkontribusi pada {webui}.`,
webui: 'WebUI'
},
itsFree: `Perlu diingat bahwa <strong>ini adalah proyek gratis</strong> dan <strong>dukung artis idolamu terlebih dahulu</strong> sebelum mendukung kami sebagai pengembang aplikasi.`,
notObligated: `Jangan merasa terpaksa untuk menyumbang, kami tetap menghargai kamu!`,
lincensedUnder: {
text: `Pekerjaan ini ada di bawah lisensi {gpl3}.`,
gpl3: 'GNU General Public License 3.0'
}
},
charts: {
title: 'Tangga Lagu',
changeCountry: 'Ubah Negara',
download: 'Unduh Tangga Lagu'
},
errors: {
title: 'Galat untuk {name}',
ids: {
invalidURL: 'URL tidak dikenal',
unsupportedURL: 'URL belum didukung',
ISRCnotOnDeezer: 'Lagu ISRC tidak tersedia di deezer',
notYourPrivatePlaylist: "Kamu tidak bisa mengunduh daftar putar privat orang lain.",
spotifyDisabled: 'Fitur Spotify tidak diatur dengan benar.',
trackNotOnDeezer: 'Lagu tidak ditemukan di deezer!',
albumNotOnDeezer: 'Album tidak ditemukan di deezer!',
notOnDeezer: 'Lagu tidak ada di Deezer!',
notEncoded: 'Lagu belum di-encode!',
notEncodedNoAlternative: 'Lagu belum di-encode dan tidak ada alternatif lain!',
wrongBitrate: 'Lagu tidak tersedia pada bitrate yang diinginkan.',
wrongBitrateNoAlternative: 'Lagu tidak tersedia pada bitrate yang diinginkan dan tidak ada alternatif lain!',
no360RA: 'Lagu tidak tersedia pada Reality Audio 360.',
notAvailable: "Lagu tidak tersedia pada server deezer!",
notAvailableNoAlternative: "Lagu tidak tersedia pada server deezer dan tidak ada alternatif lain!"
}
},
favorites: {
title: 'Favorit',
noPlaylists: 'Daftar Putar kosong',
noAlbums: 'Album Favorit kosong',
noArtists: 'Artis Favorit kosong',
noTracks: 'Lagu Favorit kosong'
},
home: {
needTologin: 'Kamu harus masuk ke akun Deezer kamu sebelum bisa memulai pengunduhan.',
openSettings: 'Buka Pengaturan',
sections: {
popularPlaylists: 'Daftar putar populer',
popularAlbums: 'Album paling banyak diputar'
}
},
linkAnalyzer: {
info: 'Di sini, kamu bisa mencari informasi lebih lanjut tentang tautan yang ingin kamu unduh.',
useful:
"Contohnya, ini dapat berguna jika kamu ingin mengunduh lagu yang tidak tersedia di negaramu dan ingin tahu di negara mana lagu itu tersedia.",
linkNotSupported: 'Tautan seperti ini belum didukung',
linkNotSupportedYet: 'Sepertinya tautan ini belum didukung, silakan coba analisa tautan lain.',
table: {
id: 'ID',
isrc: 'ISRC',
upc: 'UPC',
duration: 'Durasi',
diskNumber: 'Nomor Disk',
trackNumber: 'Nomor Lagu',
releaseDate: 'Tanggal Rilis',
bpm: 'BPM',
label: 'Label',
recordType: 'Tipe Rekaman',
genres: 'Genre',
tracklist: 'Daftar Lagu'
}
},
search: {
startSearching: 'Mulai cari!',
description:
'Kamu bisa mencari lagu, album, artis, daftar putar.... apa pun! Kamu juga bisa memberikan tautan Deezer',
fans: '{n} fan',
noResults: 'Tak ada hasil',
noResultsTrack: 'Lagu tidak ditemukan',
noResultsAlbum: 'Album tidak ditemukan',
noResultsArtist: 'Artis tidak ditemukan',
noResultsPlaylist: 'Daftar putar tidak ditemukan'
},
searchbar: 'Cari apa pun yang kamu mau (atau berikan tautannya saja)',
downloads: 'unduhan',
toasts: {
addedToQueue: '{item} ditambah ke antrian',
alreadyInQueue: '{item} sudah ada di antrian!',
finishDownload: '{item} selesai diunduh.',
allDownloaded: 'Seluruh unduhan selesai!',
refreshFavs: 'Penyegaran selesai!',
loggingIn: 'Masuk',
loggedIn: 'Telah masuk',
alreadyLogged: 'Telah masuk',
loginFailed: "Tidak bisa masuk",
loggedOut: 'Belum masuk',
cancellingCurrentItem: 'Membatalkan item.',
currentItemCancelled: 'Item telah dibatalan.',
startAddingArtist: 'Menambahkan {artist} album ke antrian',
finishAddingArtist: '{artist} album telah ditambahkan ke antrian',
startConvertingSpotifyPlaylist: 'Mengonversi lagu spotify ke deezer',
finishConvertingSpotifyPlaylist: 'Daftar putar Spotify selesai dikonversi'
},
settings: {
title: 'Pengaturan',
languages: 'Bahasa',
login: {
title: 'Masuk',
loggedIn: 'Kamu telah masuk sebagai {username}',
arl: {
question: 'Bagaimana cara mendapat ARL?',
update: 'Perbarui ARL'
},
logout: 'Keluar'
},
appearance: {
title: 'Tampilan',
slimDownloadTab: 'Tab unduhan ramping'
},
downloadPath: {
title: 'Direktori Unduhan'
},
templates: {
title: 'Templat',
tracknameTemplate: 'Templat judul lagu',
albumTracknameTemplate: 'Templat judul album',
playlistTracknameTemplate: 'Templat judul daftar putar'
},
folders: {
title: 'Folders',
createPlaylistFolder: 'Buat folder untuk daftar putar',
playlistNameTemplate: 'Templat folder daftar putar',
createArtistFolder: 'Buat folder untuk artis',
artistNameTemplate: 'Templat folder artis',
createAlbumFolder: 'Buat folder untuk album',
albumNameTemplate: 'Templat folder album',
createCDFolder: 'Buat folder untuk CD',
createStructurePlaylist: 'Buat struktur folder untuk daftar putar',
createSingleFolder: 'Buat struktur folder untuk singel'
},
trackTitles: {
title: 'Judul lagu',
padTracks: 'Judul pad',
paddingSize: 'Timpa ukuran padding',
illegalCharacterReplacer: 'Pengubah Simbol Tak Terdukung'
},
downloads: {
title: 'Unduhan',
queueConcurrency: 'Unduhan Bersamaan',
maxBitrate: {
title: 'Bitrate Prioritas',
9: 'FLAC 1411kbps',
3: 'MP3 320kbps',
1: 'MP3 128kbps'
},
overwriteFile: {
title: 'Apakah file mau ditimpa?',
y: 'Ya, silakan',
n: "Tidak, jangan ditimpa",
t: 'Timpa tag-nya saja'
},
fallbackBitrate: 'Rendahkan bitrate',
fallbackSearch: 'Cari bitrate lebih rendah',
logErrors: 'Buat file log untuk galat',
logSearched: 'Buat file log untuk lagu yang dicari',
createM3U8File: 'Buat file daftar putar',
syncedLyrics: 'Buat file .lyr (Sinkronisasikan Lirik)',
playlistFilenameTemplate: 'Templat nama file untuk daftar putar',
saveDownloadQueue: 'Simpan antrian pengunduhan saat menutup aplikasi'
},
covers: {
title: 'Sampul album',
saveArtwork: 'Simpan Sampul',
coverImageTemplate: 'Templat nama sampul',
saveArtworkArtist: 'Simpan gambar artis',
artistImageTemplate: 'Templat gambar artis',
localArtworkSize: 'Ukuran sampul lokal',
embeddedArtworkSize: 'Ukuran sampul tertanam',
localArtworkFormat: {
title: 'Format gambar apa yang kamu mau untuk sampul lokal?',
jpg: 'Gambar JPEG',
png: 'Gambar PNG',
both: 'Keduanya'
},
jpegImageQuality: 'Kualitas gambar JPEG'
},
tags: {
head: 'Tag apa saja yang disimpan?',
title: 'Judul',
artist: 'Artis',
album: 'Album',
cover: 'Sampul',
trackNumber: 'Nomor Lagu',
trackTotal: 'Jumlah Lagu',
discNumber: 'Nomor Disk',
discTotal: 'Jumlah Disk',
albumArtist: 'Artis pada Album',
genre: 'Genre',
year: 'Tahun',
date: 'Tanggal',
explicit: 'Lirik Eksplisit',
isrc: 'ISRC',
length: 'Durasi',
barcode: 'Barcode Album (UPC)',
bpm: 'BPM',
replayGain: 'Replay Gain',
label: 'Label Album',
lyrics: 'Lirik Tak Tersinkronisasi',
copyright: 'Hak Cipta',
composer: 'Komposer',
involvedPeople: 'Orang-Orang Terlibat'
},
other: {
title: 'Lainnya',
savePlaylistAsCompilation: 'Simpan daftar putar sebagai kompilasi',
useNullSeparator: 'Gunakan separator null',
saveID3v1: 'Simpan juga ID3v1',
multiArtistSeparator: {
title: 'Bagaimana kamu mau memisahkan nama artis?',
nothing: 'Simpan artis utamanya saja',
default: 'Gunakan spesifikasi standard',
andFeat: 'Gunakan & dan feat.',
using: 'Gunakan "{separator}"'
},
singleAlbumArtist: 'Simpan artis utama saja',
albumVariousArtists: 'Simpan "Various Artists" sebagai artis',
removeAlbumVersion: 'Hapus "Versi Album" dari judul lagu',
removeDuplicateArtists: 'Hapus kombinasi artis',
dateFormat: {
title: 'Format tanggal untuk file FLAC',
year: 'YYYY',
month: 'MM',
day: 'DD'
},
featuredToTitle: {
title: 'Apa yang harus dilakukan jika ada artis kedua?',
0: 'Biarkan saja',
1: 'Hapus dari judul lagu',
3: 'Hapus dari judul lagu dan judul album',
2: 'Pindahkan ke judul lagu'
},
titleCasing: 'Kapitalisasi judul',
artistCasing: 'Kapitalisasi album',
casing: {
nothing: 'Biarkan seadanya',
lower: 'huruf kecil',
upper: 'HURUF KAPITAL',
start: 'Setiap Awal Kata',
sentence: 'Huruf pertama saja'
},
previewVolume: 'Pratinjau volume',
executeCommand: {
title: 'Perintah yang dijalankan setelah pengunduhan',
description: 'Biarkan kosong jika tidak ada'
}
},
spotify: {
title: 'Fitur Spotify',
clientID: 'clientID Spotify ',
clientSecret: 'Client Secret Spotify ',
username: 'Username Spotify'
},
reset: 'Kembalikan ke Awal',
save: 'Simpan',
toasts: {
init: 'Pengaturan dimuat!',
update: 'Pengaturan diperbarui!',
ARLcopied: 'ARL tersalin ke papan klip'
}
},
sidebar: {
home: 'utama',
search: 'cari',
charts: 'tangga lagu',
favorites: 'favorit',
linkAnalyzer: 'penganalisa tautan',
settings: 'pengaturan',
about: 'tentang'
},
tracklist: {
downloadSelection: 'Seleksi unduhan'
}
};
const pt = {
globals: {
welcome: 'Bem-vindo ao deemix',
back: 'voltar',
loading: 'A carregar',
download: 'Transferir {thing}',
by: 'por {artist}',
in: 'em {album}',
download_hint: 'Transferir',
play_hint: 'Tocar',
toggle_download_tab_hint: 'Expandir/Recolher',
clean_queue_hint: 'Limpar Finalizados',
cancel_queue_hint: 'Cancelar Tudo',
listTabs: {
empty: '',
all: 'Tudo',
top_result: 'melhor resultado',
album: 'álbum | álbums',
artist: 'artista | artistas',
single: 'single | singles',
title: 'título | títulos',
track: 'faixa | faixas',
trackN: '0 faixas | {n} faixa | {n} faixas',
releaseN: '0 lançamentos | {n} lançamento | {n} lançamento',
playlist: 'lista de reprodução | listas de reprodução',
compile: 'compilação | compilações',
ep: 'ep | eps',
spotifyPlaylist: 'lista de reprodução spotify | listas de reprodução spotify',
releaseDate: 'data de lançamento',
error: 'erro'
}
},
about: {
titles: {
usefulLinks: 'Links Úteis',
bugReports: 'Relatório de erros',
contributing: 'Contribuir',
donations: 'Doações',
license: 'Licenças'
},
subtitles: {
bugReports: 'Existe alguma coisa que não funciona no deemix? Informa-nos!',
contributing: 'Queres contribuir para o projecto? Podes fazê-lo de diferentes formas!',
donations: 'Desejas contribuir monetariamente? Faz uma doação!'
},
usesLibrary: 'Esta aplicação usa a biblioteca <strong>deemix</strong>, que poderás usar para desenvolver o teu proprio UI para o deemix.',
thanks: `Agradeço a <strong>rtonno</strong>, <strong>uhwot</strong> and <strong>lollilol</strong> por me ajudarem neste projeto e a <strong>BasCurtiz</strong> and <strong>scarvimane</strong> por elaborarem o ícone.`,
upToDate: {
text: `Mantem-te atualizado seguindo o {newsChannel} no Telegram.`,
newsChannel: 'canal de notícias'
},
officialWebsite: 'Site Oficial',
officialRepo: 'Repositório Oficial da Biblioteca',
officialWebuiRepo: 'Repositório Oficial WebUI',
officialSubreddit: 'Subreddit Oficial',
newsChannel: 'Canal de Notícias',
questions: {
text: `Caso tenhas alguma duvida ou problema com a app, primeiro procura por uma solução no {subreddit}. Caso não encontres nada podes criar um post com a tua questão no subreddit.`,
subreddit: 'subreddit'
},
beforeReporting: `Antes de reportares um bug certifica-te que estás a correr a versão mais recente e que o que queres reportar é mesmo um bug e não algo que apenas não funciona do teu lado.`,
beSure: `Certifica-te que o erro é reprodutivel noutros dispositivos e <strong>NÃO</strong> reportes um bug que já tenha sido reportado.`,
duplicateReports: 'Bug reports duplicados serão fechados, mantém-te atento a isso.',
dontOpenIssues: `<strong>NÃO</strong> abras issues para colocar questões, existe um subreddit para isso.`,
newUI: {
text: `Caso sejas fluente em python podes tentar criar um novo UI para a aplicação recorrendo à biblioteca base , ou corrigir erros na biblioteca com um pull request no {repo}.`,
repo: 'repositório'
},
acceptFeatures: `Também aceito funcionalidades não complexas caso possam ser implementadas directamente na app e não na biblioteca.`,
otherLanguages: `Caso sejas fluente noutra linguagem de programação podes tentar migrar o deemix para outra linguagem de programação!`,
understandingCode: `Precisas de ajuda a entender o código? Acede a RemixDev no Telegram ou no Reddit.`,
contributeWebUI: {
text: `Caso saibas Vue.js (JavaScript), HTML ou CSS podes contribuir para o {webui}.`,
webui: 'WebUI'
},
itsFree: `Deves ter em conta que <strong>que este projecto é gratuito</strong> e <strong>deverás apoiar os artistas que aprecias</strong> antes de apoiares os programadores.`,
notObligated: `Não te sintas obrigado a doar, agradeço-te na mesma!`,
lincensedUnder: {
text: `Este trabalho esta licenciado sobre a {gpl3}.`,
gpl3: 'GNU Licença publica geral 3.0'
}
},
charts: {
title: 'Tabelas',
changeCountry: 'Alterar país',
download: 'Transferir tabela'
},
errors: {
title: 'Erros para {name}',
ids: {
invalidURL: 'URL não reconhecido',
unsupportedURL: 'URL ainda não suportado',
ISRCnotOnDeezer: 'Faixa ISRC não disponível no deezer',
notYourPrivatePlaylist: "Nao podes baixar listas de reprodução privadas de outros.",
spotifyDisabled: 'Funcionalidades do Spotify não estão definidas corretamente.',
trackNotOnDeezer: 'Faixa não encontrada no deezer!',
albumNotOnDeezer: 'Álbum não encontrado no deezer!',
notOnDeezer: 'Faixa não encontrada no Deezer!',
notEncoded: 'Faixa ainda não codificada!',
notEncodedNoAlternative: 'Faixa ainda não codificada e não foi encontrada alternativa!',
wrongBitrate: 'Faixa não encontrada no bitrate desejado.',
wrongBitrateNoAlternative: 'Faixa não encontrada no bitrate desejado e não foi encontrada alternativa!',
no360RA: 'Faixa não disponível em Reality Audio 360.',
notAvailable: 'Faixa não disponível nos servidores do deezer!',
notAvailableNoAlternative: 'Faixa não disponível nos servidores do deezer e não foi encontrada alternativa!'
}
},
favorites: {
title: 'Favoritos',
noPlaylists: 'Listas de reprodução não encontradas',
noAlbums: 'Álbuns favoritos não encontrados',
noArtists: 'Artistas favoritos não encontrados',
noTracks: 'Faixas favoritas não encontradas'
},
home: {
needTologin: 'Antes de iniciar transferências é necessário efectuar autenticação na conta Deezer.',
openSettings: 'Abrir Definições',
sections: {
popularPlaylists: 'Listas de reprodução populares',
popularAlbums: 'Álbuns mais ouvidos'
}
},
linkAnalyzer: {
info: 'Podes usar esta secção para obteres mais informação sobre o link que estás a tentar transferir.',
useful: 'Isto é útil caso estejas a tentar transferir faixas que não estão disponíveis no teu país e queres saber onde estão disponíveis, por exemplo.',
linkNotSupported: 'Este link ainda não é suportado',
linkNotSupportedYet: 'Parece que este link ainda não é suportado, tenta analisar outro.',
table: {
id: 'ID',
isrc: 'ISRC',
upc: 'UPC',
duration: 'Duração',
diskNumber: 'Número do disco',
trackNumber: 'Número da faixa',
releaseDate: 'Data de lançamento',
bpm: 'BPM',
label: 'Editora',
recordType: 'Tipo de Disco',
genres: 'Géneros',
tracklist: 'Lista de faixas'
}
},
search: {
startSearching: 'Começa a pesquisar!',
description: 'Podes perquisar uma música, um álbum inteiro, um artista, uma lista de reprodução... tudo! Também podes colar um link do Deezer',
fans: '{n} fãs',
noResults: 'Sem resultados',
noResultsTrack: 'Faixa não encontrada',
noResultsAlbum: 'Álbum não encontrado',
noResultsArtist: 'Artista não encontrado',
noResultsPlaylist: 'Lista de reprodução não encontrada'
},
searchbar: 'Pesquisa o que quiseres (ou cola um link)',
downloads: 'transferências',
toasts: {
addedToQueue: '{item} adicionados à fila',
alreadyInQueue: '{item} já está na fila!',
finishDownload: '{item} foi transferido.',
allDownloaded: 'Todas as transferências terminadas!',
refreshFavs: 'Actualizar terminados!',
loggingIn: 'A autenticar',
loggedIn: 'Autenticado',
alreadyLogged: 'Já estás autenticado',
loginFailed: "Nao foi possivel iniciar sessão",
loggedOut: 'Desconectado',
cancellingCurrentItem: 'A cancelar item actual.',
currentItemCancelled: 'Item actual cancelado.',
startAddingArtist: 'A adicionar {artist} álbuns à fila',
finishAddingArtist: 'Adicionados {artist} álbuns à fila',
startConvertingSpotifyPlaylist: 'A converter faixas do spotify em faixas do deezer',
finishConvertingSpotifyPlaylist: 'Lista de reprodução do Spotify convertida.'
},
settings: {
title: 'Definições',
languages: 'Idioma',
login: {
title: 'Inicio de Sessão',
loggedIn: 'Estás autenticado como {username}',
arl: {
question: 'Como obter o meu ARL?',
update: 'Actualizar ARL'
},
logout: 'Sair'
},
appearance: {
title: 'Aspecto',
slimDownloadTab: 'Aba de transferências estreita'
},
downloadPath: {
title: 'Caminho das transferências'
},
templates: {
title: 'Formatos',
tracknameTemplate: 'Formato do nome de faixa',
albumTracknameTemplate: 'Formato do nome de Álbum',
playlistTracknameTemplate: 'Formato do nome de lista de reprodução'
},
folders: {
title: 'Pastas',
createPlaylistFolder: 'Criar pasta para lista de reprodução',
playlistNameTemplate: 'Formato da pasta de lista de reprodução',
createArtistFolder: 'Criar pasta para artista',
artistNameTemplate: 'Formato da pasta de artista',
createAlbumFolder: 'Criar pasta para álbum',
albumNameTemplate: 'Formato da pasta de álbum',
createCDFolder: 'Criar pasta para CDs',
createStructurePlaylist: 'Criar estrutura de pastas para listas reprodução',
createSingleFolder: 'Criar estrutura de pastas para singles'
},
trackTitles: {
title: 'Título',
padTracks: 'Bloco de Faixas',
paddingSize: 'Substituir tamanho do preenchimento',
illegalCharacterReplacer: 'Substituir caractere inválido'
},
downloads: {
title: 'Transferências',
queueConcurrency: 'Transferências concorrentes',
maxBitrate: {
title: 'Bitrate preferencial',
9: 'FLAC 1411kbps',
3: 'MP3 320kbps',
1: 'MP3 128kbps'
},
overwriteFile: {
title: 'Ficheiros existentes. Substituir?',
y: 'Sim, substituir o ficheiro',
n: 'Não substituir o ficheiro',
t: 'Subescrever apenas as etiquetas'
},
fallbackBitrate: 'Bitrate fallback',
fallbackSearch: 'Fallback de pesquisa',
logErrors: 'Criar histórico para erros',
logSearched: 'Criar histórico para faixas pesquisadas',
createM3U8File: 'Criar ficheiro de lista de reprodução',
syncedLyrics: 'Criar ficheiro .lyr (Letra Sincronizada)',
playlistFilenameTemplate: 'Formato do nome de ficheiro da lista de reprodução',
saveDownloadQueue: 'Guardar fila de transferências ao fechar a aplicação'
},
covers: {
title: 'Capas do Álbum',
saveArtwork: 'Guardar capas',
coverImageTemplate: 'Modelo do nome da capa',
saveArtworkArtist: 'Salvar imagem do artista',
artistImageTemplate: 'Modelo de imagem do artista',
localArtworkSize: 'Tamanho do trabalho artístico local',
embeddedArtworkSize: 'Tamanho do trabalho artístico incorporado',
localArtworkFormat: {
title: 'Em que formato desejas o trabalho artístico local?',
jpg: 'Em imagem jpeg',
png: 'Em imagem png',
both: 'Em jpeg e em png'
},
jpegImageQuality: 'Qualidade de imagem JPEG'
},
tags: {
head: 'Etiquetas a guardar',
title: 'Título',
artist: 'Artista',
album: 'Álbum',
cover: 'Capa',
trackNumber: 'Número de faixa',
trackTotal: 'Total de faixas',
discNumber: 'Número do Disco',
discTotal: 'Total de Discos',
albumArtist: 'Artista do Álbum',
genre: 'Género',
year: 'Ano',
date: 'Data',
explicit: 'Letra Explícita',
isrc: 'ISRC',
length: 'Duração da faixa',
barcode: 'Código de barras do álbum (UPC)',
bpm: 'BPM',
replayGain: 'ReplayGain',
label: 'Editora do álbum',
lyrics: 'Letra da música não sincronizada',
copyright: 'Direitos de Autor',
composer: 'Compositor',
involvedPeople: 'Pessoas envolvidas'
},
other: {
title: 'Outros',
savePlaylistAsCompilation: 'Guardar listas de reprodução como compilação',
useNullSeparator: 'Usar separador nulo',
saveID3v1: 'Também guardar ID3v1',
multiArtistSeparator: {
title: 'Como queres separarar os artistas?',
nothing: 'Guardar apenas o artista principal',
default: 'Usar especificação padrão',
andFeat: 'Usar & e feat.',
using: 'Usar "{separator}"'
},
singleAlbumArtist: 'Guardar apenas o artista principal do álbum',
albumVariousArtists: 'Manter "Various Artists" nos Artistas do Álbum',
removeAlbumVersion: 'Remover "Album Version" do título da faixa',
removeDuplicateArtists: 'Remover combinação de artistas',
dateFormat: {
title: 'Formato de data nos ficheiros FLAC',
year: 'AAAA',
month: 'MM',
day: 'DD'
},
featuredToTitle: {
title: 'O que devo fazer com artistas convidados/participações?',
0: 'Nada',
1: 'Remover do título',
3: 'Remover do título e do título do album',
2: 'Movê-lo para o título'
},
titleCasing: 'Caixa do Título',
artistCasing: 'Caixa do Artista',
casing: {
nothing: 'Manter inalterado',
lower: 'minusculas',
upper: 'MAIÚSCULAS',
start: 'Início De Cada Palavra',
sentence: 'Como uma frase'
},
previewVolume: 'Volume de Pré-visualização',
executeCommand: {
title: 'Comando a executar após transferir',
description: 'Deixar em branco para nenhuma acção'
}
},
spotify: {
title: 'Funcionalidades Spotify',
clientID: 'Spotify clientID',
clientSecret: 'Spotify Client Secret',
username: 'nome de utilizador Spotify'
},
reset: 'Repor configurações padrão',
save: 'Guardar',
toasts: {
init: 'Configurações carregadas!',
update: 'Configurações actualizadas',
ARLcopied: 'ARL copiado para area de transferencia'
}
},
sidebar: {
home: 'início',
search: 'pesquisa',
charts: 'tabelas',
favorites: 'favoritos',
linkAnalyzer: 'analizador de links',
settings: 'definições',
about: 'sobre'
},
tracklist: {
downloadSelection: 'Transferir seleccionados'
}
};
const pt_br = {
globals: {
welcome: 'bem vindo ao deemix',
back: 'voltar',
loading: 'carregando',
download: 'Baixar {thing}',
by: 'por {artist}',
in: 'em {album}',
download_hint: 'Baixar',
play_hint: 'Reproduzir',
toggle_download_tab_hint: 'Expandir/Diminuir',
clean_queue_hint: 'Limpar',
cancel_queue_hint: 'Cancelar Todos',
listTabs: {
empty: '',
all: 'todos',
top_result: 'resultado principal',
album: 'álbum | álbuns',
artist: 'artista | artistas',
single: 'single | singles',
title: 'título | títulos',
track: 'faixa | faixas',
trackN: '0 faixas | {n} faixa | {n} faixas',
releaseN: '0 lançamento | {n} lançamento | {n} lançamentos',
playlist: 'playlist | playlists',
compile: 'compilação | compilações',
ep: 'ep | eps',
spotifyPlaylist: 'playlist do spotify | playlists do spotify',
releaseDate: 'data de lançamento',
error: 'erro'
}
},
about: {
titles: {
usefulLinks: 'Links Úteis',
bugReports: 'Relatar Bugs',
contributing: 'Contribuições',
donations: 'Doações',
license: 'Licença'
},
subtitles: {
bugReports: 'Há algo não funcionando no deemix? Nos diga!',
contributing: 'Você quer contribuir para este projeto? Você pode fazer isso de diferentes maneiras!',
donations: 'Você quer contribuir monetariamente? Você pode fazer uma doação!'
},
usesLibrary:
'Esse app usa a biblioteca do <strong>deemix</strong>, no qual você pode usar para criar sua própria UI para o deemix',
thanks: `Agradecimentos para <strong>rtonno</strong>, <strong>uhwot</strong> e <strong>lollilol</strong> por ajudar neste projeto, e para <strong>BasCurtiz</strong> e <strong>scarvimane</strong> por fazerem o ícone`,
upToDate: {
text: `Para mais novidades siga o {newsChannel} no Telegram.`,
newsChannel: 'news channel'
},
officialWebsite: 'Site Oficial',
officialRepo: 'Repositório da Biblioteca Oficial',
officialWebuiRepo: 'Repositório da WebUI Oficial',
officialSubreddit: 'Subreddit Oficial',
newsChannel: 'Canal de Notícias',
questions: {
text: `Se você tiver dúvidas ou problemas com o app, procure uma solução em {subreddit} primeiro. Caso você não encontre, você pode fazer um post explicando seu problema no subreddit.`,
subreddit: 'subreddit'
},
beforeReporting: `Antes de reportar um bug, tenha certeza que você está rodando a versão mais recente do app, e o que você quer reportar seja realmente um bug e não algo que esteja acontecendo especialmente com você.`,
beSure: `Certifique-se que o bug é reproduzivel em outras máquinas e também <strong>NÃO</strong> reporte um bug se ele já foi reportado.`,
duplicateReports: 'Reportes de bugs duplicados serão fechados, então fique atento a isso.',
dontOpenIssues: `<strong>NÃO</strong> abra tópicos para fazer perguntas, há o subreddit para isso.`,
newUI: {
text: `Se você é fluente em Phython, você pode tentar fazer uma nova UI para o app usando a biblioteca base, ou consertar bugs da biblioteca com um pull request em {repo}.`,
repo: 'repo'
},
acceptFeatures: `Eu aceito funcionalidades extras também, mas nada de coisas complexas, desde que ela possa ser implementada no app, e não na biblioteca.`,
otherLanguages: `Se você for fluente em outra linguagem de programação, você pode tentar portar o deemix para outra linguagem!`,
understandingCode: `Você precisa de ajuda para entender o código? Mande mensagem no RemixDex pelo Telegram ou pelo Reddit.`,
contributeWebUI: {
text: `Se você souber Vue.js (JavaScript), HTML ou CSS você pode contribuir para o {webui}.`,
webui: 'WebUI'
},
itsFree: `Lembre-se que <strong>este projeto é livre</strong> e <strong>você deve dar suporte aos artistas que você ama</strong> antes de dar suporte aos desenvolvedores.`,
notObligated: `Não se sinta na obrigação de doar, eu agradeço de qualquer maneira!`,
lincensedUnder: {
text: `Esse é um projeto licenciado através da {gpl3}.`,
gpl3: 'GNU General Public License 3.0'
}
},
charts: {
title: 'Charts',
changeCountry: 'Mudar País',
download: 'Download Chart'
},
errors: {
title: 'Erros para {name}',
ids: {
invalidURL: 'URL inválida',
unsupportedURL: 'URL não suportada ainda',
ISRCnotOnDeezer: 'Faixa ISRC não está disponível ainda no deezer',
notYourPrivatePlaylist: 'Você não pode baixar playlists privadas.',
spotifyDisabled: 'Os Recursos do Spotify não foram configurados corretamente.',
trackNotOnDeezer: 'Faixa não encontrada no deezer!',
albumNotOnDeezer: 'Album not found on deezer! Álbum não encontrado no deezer!',
notOnDeezer: 'Faixa indisponível no deezer!',
notEncoded: 'Faixa ainda não codificada!',
notEncodedNoAlternative: 'Faixa ainda não codificada e sem alternativas encontradas!',
wrongBitrate: 'Faixa não encontrada no bitrate desejado.',
wrongBitrateNoAlternative: 'Faixa não encontrada no bitrate desejado e nenhuma outra alternativa encontrada!',
no360RA: 'Faixa não disponível na qualidade Reality Audio 360.',
notAvailable: 'Faixa não disponível nos servidores do deezer!',
notAvailableNoAlternative: 'Faixa não disponível nos servidores do deezer e nenhuma outra alternativa encontrada!'
}
},
favorites: {
title: 'Favoritos',
noPlaylists: 'Nenhuma Playlist encontrada',
noAlbums: 'Nenhum Álbum Favorito encontrado',
noArtists: 'Nenhum Artista Favorito encontrado',
noTracks: 'Nenhuma Faixa Favorita encontrada'
},
home: {
needTologin: 'Você precisa logar na sua conta do deezer antes de começar a baixar músicas.',
openSettings: 'Abrir Configurações',
sections: {
popularPlaylists: 'Playlists Populares',
popularAlbums: 'Álbuns mais ouvidos'
}
},
linkAnalyzer: {
info: 'Você pode usar essa seção para encontrar mais informações sobre o link que você quer baixar.',
useful:
'Isso é útil se você está tentando baixar algumas faixas que não estão disponíveis no seu país, e quer saber onde elas estão disponíveis, por exemplo.',
linkNotSupported: 'Esse link não é suportado ainda',
linkNotSupportedYet: 'Parece que esse link não é suportado ainda, tente analizar outro.',
table: {
id: 'ID',
isrc: 'ISRC',
upc: 'UPC',
duration: 'Duração',
diskNumber: 'Número do Disco',
trackNumber: 'Número da Faixa',
releaseDate: 'Data de Lançamento',
bpm: 'BPM',
label: 'Gravadora',
recordType: 'Tipo de Gravação',
genres: 'Gêneros',
tracklist: 'Tracklist'
}
},
search: {
startSearching: 'Comece pesquisando!',
description:
'Você pode pesquisar uma música, um álbum, um artista, uma playlist.... tudo! Você também pode colar um link do Deezer',
fans: '{n} fãs',
noResults: 'Sem resultados',
noResultsTrack: 'Nenhuma Faixa encontrada',
noResultsAlbum: 'Nenhum Álbum encontrado',
noResultsArtist: 'Nenhum Artista encontrado',
noResultsPlaylist: 'Nenhuma Playlist encontrada'
},
searchbar: 'Pesquise algo (ou apenas cole um link)',
downloads: 'downloads',
toasts: {
addedToQueue: '{item} adicionado à fila',
alreadyInQueue: '{item} já está na fila!',
finishDownload: '{item} download terminado.',
allDownloaded: 'Todos os downloads foram feitos!',
refreshFavs: 'Atualização completa!',
loggingIn: 'Logando',
loggedIn: 'Logado',
alreadyLogged: 'Você já está logado',
loginFailed: 'Não foi possivel entrar',
loggedOut: 'Desconectando',
cancellingCurrentItem: 'Cancelando item atual.',
currentItemCancelled: 'Item atual cancelado.',
startAddingArtist: 'Adicionando {artist} álbuns à fila',
finishAddingArtist: '{artist} álbuns adicionados a fila',
startConvertingSpotifyPlaylist: 'Convertendo faixas do spotify para faixas do deezer',
finishConvertingSpotifyPlaylist: 'Playlists do Spotify convertidas'
},
settings: {
title: 'Configurações',
languages: 'Idiomas',
login: {
title: 'Login',
loggedIn: 'Você está logado como {username}',
arl: {
question: 'Como eu consigo o meu ARL?',
update: 'Atualizar ARL'
},
logout: 'Sair'
},
appearance: {
title: 'Aparência',
slimDownloadTab: 'Aba de download slim'
},
downloadPath: {
title: 'Diretório de Downloads'
},
templates: {
title: 'Templates',
tracknameTemplate: 'Template do nome da faixa',
albumTracknameTemplate: 'Template da faixa do álbum',
playlistTracknameTemplate: 'Template da faixa da playlist'
},
folders: {
title: 'Pastas',
createPlaylistFolder: 'Criar pasta para playlists',
playlistNameTemplate: 'Template da pasta de playlist',
createArtistFolder: 'Criar pasta para os artistas',
artistNameTemplate: 'Template da pasta de artistas',
createAlbumFolder: 'Criar pasta para álbuns',
albumNameTemplate: 'Template da pasta de álbuns',
createCDFolder: 'Criar pasta para CDs',
createStructurePlaylist: 'Criar estrutura de pastas para playlists',
createSingleFolder: 'Criar estrutura de pastas para singles'
},
trackTitles: {
title: 'Título das faixas',
padTracks: 'Faixas com pad',
paddingSize: 'Sobrescrever tamanho do padding',
illegalCharacterReplacer: 'Substituir caracteres inválidos'
},
downloads: {
title: 'Downloads',
queueConcurrency: 'Downloads Simultâneos',
maxBitrate: {
title: 'Escolher Taxa de Bits',
9: 'FLAC 1411kbps',
3: 'MP3 320kbps',
1: 'MP3 128kbps'
},
overwriteFile: {
title: 'Sobrescrever arquivos?',
y: 'Sim, sobrescrever arquivos',
n: 'Não, não sobrescrever arquivos',
t: 'Sobrescrever apenas as tags'
},
fallbackBitrate: 'Taxa de bits reserva',
fallbackSearch: 'Procurar reserva',
logErrors: 'Criar arquivos de log para erros',
logSearched: 'Criar arquivos de log para faixas pesquisadas',
createM3U8File: 'Criar arquivo de playlist',
syncedLyrics: 'Criar arquivos .lyr (Letras)',
playlistFilenameTemplate: 'Template do nome do arquivo da playlist',
saveDownloadQueue: 'Salvar a fila de downloads quando fechar o app'
},
covers: {
title: 'Capa dos álbuns',
saveArtwork: 'Salvar capas',
coverImageTemplate: 'Template do nome da capa',
saveArtworkArtist: 'Salvar imagem do artista',
artistImageTemplate: 'Template da imagem do artista',
localArtworkSize: 'Tamanho da capa local',
embeddedArtworkSize: 'Tamanho da capa embutida',
localArtworkFormat: {
title: 'Qual o formato da imagem que você quer para a capa local?',
jpg: '.jpeg',
png: '.png',
both: 'Ambas, .jpeg e .png'
},
jpegImageQuality: 'Qualidade da imagem JPEG'
},
tags: {
head: 'Quais tags salvar',
title: 'Título',
artist: 'Artista',
album: 'Álbum',
cover: 'Capa',
trackNumber: 'Número da Faixa',
trackTotal: 'Total de Faixas',
discNumber: 'Número de Discos',
discTotal: 'Total de Discos',
albumArtist: 'Artista do Álbum',
genre: 'Gênero',
year: 'Ano',
date: 'Data',
explicit: 'Letras Explícitas',
isrc: 'ISRC',
length: 'Tamanho da Faixa',
barcode: 'Código de Barras do álbum (UPC)',
bpm: 'BPM',
replayGain: 'Replay Gain',
label: 'Gravadora',
lyrics: 'Letras Dessincronizadas',
copyright: 'Copyright',
composer: 'Compositor',
involvedPeople: 'Pessoas Envolvidas'
},
other: {
title: 'Outros',
savePlaylistAsCompilation: 'Salvar playlists como uma compilação',
useNullSeparator: 'Usar separador nulo',
saveID3v1: 'Salvar ID3v1',
multiArtistSeparator: {
title: 'Como você gostaria de separar os artistas?',
nothing: 'Salvar apenas o artista principal',
default: 'Usar a especificação padrão',
andFeat: 'Usar & e feat.',
using: 'Usar "{separator}"'
},
singleAlbumArtist: 'Salvar apenas o artista principal',
albumVariousArtists: 'Manter "Various Artists" nos Artistas do Álbum',
removeAlbumVersion: 'Remover "Album Version" do título da faixa',
removeDuplicateArtists: 'Remover combinação de artistas',
dateFormat: {
title: 'Formato da data para arquivos FLAC',
year: 'AAAA',
month: 'MM',
day: 'DD'
},
featuredToTitle: {
title: 'O que devo fazer com artistas participantes?',
0: 'Nada',
1: 'Remova do título da faixa',
3: 'Remova do título da faixa e do álbum',
2: 'Mover para o título da faixa'
},
titleCasing: 'Formatação do título',
artistCasing: 'Formatação do artista',
casing: {
nothing: 'Manter inalterado',
lower: 'minúsculo',
upper: 'MAIÚSCULO',
start: 'Começo De Cada Palavra',
sentence: 'Como uma frase'
},
previewVolume: 'Prévia do Volume',
executeCommand: {
title: 'Comando para executar depois de baixar',
description: 'Deixe em branco para nenhuma ação'
}
},
spotify: {
title: 'Recursos do Spotify',
clientID: 'Spotify clientID',
clientSecret: 'Spotify Client Secret',
username: 'usuário do Spotify'
},
reset: 'Restaurar para o padrão',
save: 'Salvar',
toasts: {
init: 'Configurações carregadas!',
update: 'Configurações atualizadas!',
ARLcopied: 'ARL copiada para a área de transferência'
}
},
sidebar: {
home: 'início',
search: 'pesquisa',
charts: 'charts',
favorites: 'favoritos',
linkAnalyzer: 'analizador de links',
settings: 'configurações',
about: 'sobre'
},
tracklist: {
downloadSelection: 'Baixar seleção'
}
};
const ru = {
globals: {
welcome: 'Добро пожаловать в deemix',
back: 'назад',
loading: 'загрузка',
download: 'Скачать {thing}',
by: '{artist}',
in: 'из {album}',
download_hint: 'Скачать',
play_hint: 'Прослушать',
toggle_download_tab_hint: 'Показать/Скрыть',
clean_queue_hint: 'Очистить завершённые',
cancel_queue_hint: 'Очистить всё',
open_downloads_folder: 'Открыть папку с загрузками',
cut: 'вырезать',
copy: 'копировать',
copyLink: 'копировать ссылку',
copyImageLink: 'копировать URL картинки',
copyDeezerLink: 'копировать ссылку deezer',
paste: 'вставить',
listTabs: {
empty: '',
all: 'все',
top_result: 'лучший результат',
album: 'альбом | альбомы | альбомы',
artist: 'исполнитель | исполнители | исполнители',
single: 'сингл | синглы | синглы',
title: 'название',
track: 'трек | треки | треки',
trackN: '{n} трек | {n} трека | {n} треков',
releaseN: '{n} релиз | {n} релиза | {n} релизов',
playlist: 'плейлист | плейлисты | плейлисты',
compile: 'сплит | сплиты | сплиты',
ep: 'ep',
bundle: 'бандл | бандлы | бандлы',
more: 'Больше альбомов',
featured: 'Представлено в',
spotifyPlaylist: 'плейлист spotify | плейлисты spotify | плейлисты spotify',
releaseDate: 'Дата выхода',
error: 'ошибка',
albumN: '{n} альбом | {n} альбома | {n} альбомов',
artistN: '{n} исполнитель | {n} исполнителя | {n} исполнителей',
playlistN: '{n} плейлист | {n} плейлиста | {n} плейлистов'
}
},
about: {
updates: {
currentVersion: 'Текущая версия',
versionNotAvailable: 'Н/Д',
updateAvailable: `Вы используете не последнюю доступную версию: {version}`,
deemixVersion: 'Версия библиотеки deemix'
},
titles: {
usefulLinks: 'Полезные ссылки',
bugReports: 'Отчёты об ошибках',
contributing: 'Помощь проекту',
donations: 'Пожертвования',
license: 'Лицензия'
},
subtitles: {
bugReports: "Что-то не работает? Сообщите нам!",
contributing: 'Хотите внести вклад в развитие этого проекта? Это можно сделать разными способами!',
donations: 'Хотите поддержать материально? Можно сделать пожертвование!'
},
usesLibrary: 'Приложение использует библиотеку <strong>deemix</strong>, с помощью которой вы можете разработать собственный UI для deemix.',
thanks: `Спасибо <strong>rtonno</strong>, <strong>uhwot</strong> и <strong>lollilol</strong> за помощь с этим проектом, а также <strong>BasCurtiz</strong> и <strong>scarvimane</strong> за иконку.`,
upToDate: {
text: `Следите за последними обновлениями на {newsChannel} в Telegram.`,
newsChannel: 'канале'
},
officialWebsite: 'Официальный сайт',
officialRepo: 'Официальный репозиторий библиотеки',
officialWebuiRepo: 'Официальный репозиторий WebUI',
officialSubreddit: 'Официальный сабреддит',
newsChannel: 'Канал новостей',
questions: {
text: `Если у вас возникли вопросы или проблемы с приложением, поищите решение на {subreddit}. Если не нашли решение, можете создать новый пост и описать вашу проблему.`,
subreddit: 'сабреддите'
},
beforeReporting: `Перед тем, как сообщать об ошибках, убедитесь, что вы используете последнюю версию приложения и что проблема не на вашей стороне.`,
beSure: `Убедитесь, что ошибка возникает и на других устройствах. Также <strong>НЕ</strong> сообщайте об ошибке, если про неё уже известно.`,
duplicateReports: 'Повторные сообщения об ошибках рассматриваться не будут.',
dontOpenIssues: `<strong>НЕ</strong> используйте репозиторий для вопросов автору, для этого есть сабреддит.`,
newUI: {
text: `Если вы хорошо знаете python, то можете сделать новый UI для приложения с использованием базовой библиотеки или пофиксить в ней баги и сделать pull request в {repo}.`,
repo: 'репозитории'
},
acceptFeatures: `Можете предложить новые функции, но не слишком сложные, так как они будут добавлены в приложение, а не в саму библиотеку.`,
otherLanguages: `Если вы хорошо знаете другой язык программирования, можете портировать на нём deemix!`,
understandingCode: `Не можете разобраться в коде? Свяжитесь с RemixDev в Telegram или на Reddit.`,
contributeWebUI: {
text: `Если вы знаете Vue.js (JavaScript), HTML или CSS, можете внести вклад в развитие {webui}.`,
webui: 'WebUI'
},
itsFree: `Помните, что это <strong>бесплатное приложение</strong> и вам следует <strong>поддерживать понравившихся исполнителей</strong> прежде, чем поддерживать разработчиков.`,
notObligated: `Вы не обязаны делать пожертвования, я всё равно вас ценю!`,
lincensedUnder: {
text: `Проект распространяется под лицензией {gpl3}.`,
gpl3: 'GNU General Public License 3.0'
}
},
charts: {
title: 'Чарты',
changeCountry: 'Сменить страну',
download: 'Скачать чарт'
},
errors: {
title: 'Ошибки {name}',
ids: {
invalidURL: 'URL не распознан',
unsupportedURL: 'URL не поддерживается',
ISRCnotOnDeezer: 'ISRC данного трека недоступен на Deezer',
notYourPrivatePlaylist: "Вы не можете скачивать чужие приватные плейлисты.",
spotifyDisabled: 'Неправильно настроены параметры Spotify.',
trackNotOnDeezer: 'Трек не найден на Deezer!',
albumNotOnDeezer: 'Альбом не найден на Deezer!',
notOnDeezer: 'Трек недоступен на Deezer!',
notEncoded: 'Трек ещё не перекодирован!',
notEncodedNoAlternative: 'Трек не перекодирован, альтернатив не найдено!',
wrongBitrate: 'Данного трека нет в нужном битрейте.',
wrongBitrateNoAlternative: 'Данного трека нет в нужном битрейте. Альтернатив не найдено!',
no360RA: 'Трек недоступен в формате Reality Audio 360.',
notAvailable: "Трек недоступен на серверах Deezer!",
notAvailableNoAlternative: "Трек недоступен на серверах Deezer. Альтернатив не найдено!",
noSpaceLeft: "На устройстве не осталось свободного места!",
albumDoesntExists: "Альбома не существует, информация не получена"
}
},
favorites: {
title: 'Избранное',
noPlaylists: 'Плейлисты не найдены',
noAlbums: 'Избранные альбомы не найдены',
noArtists: 'Избранные исполнители не найдены',
noTracks: 'Избранные треки не найдены'
},
home: {
needTologin: 'Вам необходимо войти под своей учетной записью Deezer, прежде чем вы сможете скачивать.',
openSettings: 'Открыть настройки',
sections: {
popularPlaylists: 'Популярные плейлисты',
popularAlbums: 'Самые прослушиваемые альбомы'
}
},
linkAnalyzer: {
info: 'Используйте этот раздел, чтобы узнать информацию о ссылке, которую требуется скачать.',
useful: "Этот раздел нужен, если вы хотите загрузить треки, недоступные в вашей стране, а также посмотреть, где они доступны.",
linkNotSupported: 'Ссылка не поддерживается',
linkNotSupportedYet: 'Эта ссылка не поддерживается, попробуйте вставить другую.',
table: {
id: 'ID',
isrc: 'ISRC',
upc: 'UPC',
duration: 'Продолжительность',
diskNumber: 'Номер диска',
trackNumber: 'Номер трека',
releaseDate: 'Дата выхода',
bpm: 'BPM',
label: 'Издатель',
recordType: 'Тип',
genres: 'Жанр',
tracklist: 'Треклист'
}
},
search: {
startSearching: 'Начните искать!',
description: 'Здесь можно найти трек, альбом, исполнителя, плейлист... всё! Можно также вставить ссылку Deezer',
fans: '{n} поклонников',
noResults: 'Нет результатов',
noResultsTrack: 'Треков не найдено',
noResultsAlbum: 'Альбомов не найдено',
noResultsArtist: 'Исполнителей не найдено',
noResultsPlaylist: 'Плейлистов не найдено'
},
searchbar: 'Ищите, что хотите (или вставьте ссылку)',
downloads: 'загрузки',
toasts: {
restoringQueue: 'Восстановление очереди загрузок...',
queueRestored: 'Очередь восстановлена!',
addedToQueue: '{item} добавлено в очередь',
addedMoreToQueue: '{n} загрузок добавлены в очередь',
alreadyInQueue: '{item} уже присутствует в очереди!',
finishDownload: 'Загрузка {item} завершена.',
allDownloaded: 'Все загрузки завершены!',
refreshFavs: 'Обновление завершено!',
loggingIn: 'Вход...',
loggedIn: 'Вход выполнен',
alreadyLogged: 'Вход уже выполнен',
loginFailed: "Вход не выполнен",
loggedOut: 'Вы вышли из аккаунта',
cancellingCurrentItem: 'Отмена текущей загрузки.',
currentItemCancelled: 'Отменено.',
startAddingArtist: 'Добавление альбомов {artist} в очередь',
finishAddingArtist: 'Альбомы {artist} добавлены в очередь',
startConvertingSpotifyPlaylist: 'Добавление плейлиста Spotify в очередь',
finishConvertingSpotifyPlaylist: 'Spotify плейлист добавлен в очередь',
loginNeededToDownload: 'Войдите в аккаунт, чтобы скачивать треки!',
deezerNotAvailable: 'Deezer недоступен в вашей стране. Используйте VPN.',
startGeneratingItems: 'Обработка {n} загрузок...',
finishGeneratingItems: 'Обработано {n} загрузок.'
},
settings: {
title: 'Настройки',
languages: 'Язык',
login: {
title: 'Вход',
loggedIn: 'Вы вошли как {username}',
arl: {
question: 'Как узнать свой ARL?',
update: 'Обновить ARL'
},
logout: 'Выйти',
login: 'Войти через deezer.com'
},
appearance: {
title: 'Внешний вид',
slimDownloadTab: 'Компактная вкладка с загрузками',
slimSidebar: 'Компактная левая панель'
},
downloadPath: {
title: 'Путь для сохранения'
},
templates: {
title: 'Шаблоны',
tracknameTemplate: 'Шаблон названия трека',
albumTracknameTemplate: 'Шаблон названия трека альбома',
playlistTracknameTemplate: 'Шаблон названия трека плейлиста'
},
folders: {
title: 'Папки',
createPlaylistFolder: 'Создавать папки для плейлистов',
playlistNameTemplate: 'Название папки плейлиста',
createArtistFolder: 'Создавать папки для исполнителя',
artistNameTemplate: 'Название папки исполнителя',
createAlbumFolder: 'Создавать папки для альбома',
albumNameTemplate: 'Название папки альбома',
createCDFolder: 'Создавать папки для CD',
createStructurePlaylist: 'Создавать структуру папок для плейлистов',
createSingleFolder: 'Создавать структуру папок для синглов'
},
trackTitles: {
title: 'Названия треков',
padTracks: 'Добавлять ноль к номерам треков (01, 02, ...)',
paddingSize: 'Кол-во цифр в номере',
illegalCharacterReplacer: 'Замена для запрещённых в имени символов'
},
downloads: {
title: 'Загрузки',
queueConcurrency: 'Количество одновременных загрузок',
maxBitrate: {
title: 'Предпочитаемый битрейт',
9: 'FLAC 1411kbps',
3: 'MP3 320kbps',
1: 'MP3 128kbps'
},
overwriteFile: {
title: 'Нужно ли перезаписывать файлы?',
y: 'Да, перезаписать файл',
n: "Нет, не перезаписывать",
t: 'Обновить только теги',
b: 'Нет, оставить оба файла и добавить номер к дубликату',
e: "Нет, вне зависимости от расширения"
},
fallbackBitrate: 'Загружать с битрейтом ниже, если текущий недоступен',
fallbackSearch: 'Искать похожий трек, если запрашиваемый недоступен',
logErrors: 'Сохранять логи ошибок',
logSearched: 'Сохранять лог истории поиска',
createM3U8File: 'Создавать файлы плейлистов',
syncedLyrics: 'Создать .lyr файлы (синхронизированная лирика)',
playlistFilenameTemplate: 'Шаблон названия плейлиста',
saveDownloadQueue: 'Сохранять текущую очередь загрузок при закрытии приложения'
},
covers: {
title: 'Обложки',
saveArtwork: 'Сохранять файл обложки',
coverImageTemplate: 'Шаблон названия обложки',
saveArtworkArtist: 'Сохранять файл изображения исполнителя',
artistImageTemplate: 'Шаблон названия изображения',
localArtworkSize: 'Размер сохраненной обложки',
embeddedArtworkSize: 'Размер встроенной в теги обложки',
localArtworkFormat: {
title: 'В каком формате сохранять обложки?',
jpg: 'jpeg',
png: 'png',
both: 'jpeg и png'
},
jpegImageQuality: 'Качество JPEG',
embeddedArtworkPNG: 'Сохранять вложенную обложку в PNG',
embeddedPNGWarning: 'PNG официально не поддерживается в Deezer. Могут быть баги',
imageSizeWarning: 'Обложки с разрешением выше x1200 не поддерживаются в Deezer. Могут быть проблемы',
coverDescriptionUTF8: 'Сохранять описание обложки в UTF8 (iTunes Fix)'
},
tags: {
head: 'Какие теги сохранять',
title: 'Название',
artist: 'Исполнитель',
album: 'Альбом',
cover: 'Обложка',
trackNumber: 'Номер трека',
trackTotal: 'Кол-во треков',
discNumber: 'Номер диска',
discTotal: 'Кол-во дисков',
albumArtist: 'Исполнитель альбома',
genre: 'Жанр',
year: 'Год',
date: 'Дата',
explicit: 'Метка о нецензурной лексике',
isrc: 'Номер записи (ISRC)',
length: 'Продолжительность',
barcode: 'Уникальный код альбома (UPC)',
bpm: 'BPM',
replayGain: 'Replay Gain',
label: 'Издатель',
lyrics: 'Текст песни',
syncedLyrics: 'Синхрон. текст песни',
copyright: 'Права (копирайт)',
composer: 'Композитор',
involvedPeople: 'Вовлечённые люди',
source: 'Источник и ID песни'
},
other: {
title: 'Разное',
savePlaylistAsCompilation: 'Сохранять плейлисты как сборники',
useNullSeparator: 'Использовать null в качестве разделителя',
saveID3v1: 'Сохранять ID3v1',
multiArtistSeparator: {
title: 'Как разделять несколько исполнителей?',
nothing: 'Сохранить только основного',
default: 'Используя стандартную спецификацию',
andFeat: 'Используя & и feat.',
using: 'Используя "{separator}"'
},
singleAlbumArtist: 'Сохранить только основного исполнителя альбома',
albumVariousArtists: 'Оставить "Various Artists" в исполнителях альбома',
removeAlbumVersion: 'Удалить "Album Version" из названия трека',
removeDuplicateArtists: 'Удалить повторяющихся исполнителей',
dateFormat: {
title: 'Формат даты для FLAC файлов',
year: 'ГГГГ',
month: 'ММ',
day: 'ДД'
},
featuredToTitle: {
title: 'Что делать с приглашёнными исполнителями (feat.)?',
0: 'Ничего',
1: 'Удалить из названия трека',
3: 'Удалить из названия трека и альбома',
2: 'Добавить в название трека'
},
titleCasing: 'Регистр названия',
artistCasing: 'Регистр исполнителя',
casing: {
nothing: 'Не менять',
lower: 'в нижнем регистре',
upper: 'В ВЕРХНЕМ РЕГИСТРЕ',
start: 'Каждое Слово С Заглавной Буквы',
sentence: 'Как в предложении'
},
previewVolume: 'Громкость прослушивания',
executeCommand: {
title: 'Выполнять команды по окончании загрузок',
description: 'Оставьте пустым, если ничего не требуется'
}
},
spotify: {
title: 'Настройки Spotify',
clientID: 'Spotify clientID',
clientSecret: 'Spotify Client Secret',
username: 'Spotify username',
question: 'Как включить функции Spotify?'
},
reset: 'По умолчанию',
save: 'Сохранить',
toasts: {
init: 'Настройки загружены!',
update: 'Настройки обновлены!',
ARLcopied: 'ARL скопирован в буфер обмена'
}
},
sidebar: {
home: 'главная',
search: 'поиск',
charts: 'чарты',
favorites: 'избранное',
linkAnalyzer: 'анализ ссылок',
settings: 'настройки',
about: 'о проекте'
},
tracklist: {
downloadSelection: 'Скачать выбранные'
}
};
const tr = {
globals: {
welcome: `Deemix'e hoş geldin.`,
back: `geri`,
loading: `yükleniyor`,
download: 'İndir {thing}',
by: '{artist} tarafından',
in: '{album} içinde',
download_hint: 'İndir',
play_hint: 'Oynat',
toggle_download_tab_hint: 'Genişlet/Daralt',
clean_queue_hint: 'Tamamlananları Temizle',
cancel_queue_hint: 'Hepsini ',
listTabs: {
empty: '',
all: 'Tümü',
top_result: 'top result',
album: 'albüm | albümler',
artist: 'sanatçı | sanatçılar',
single: 'single | singlelar',
title: 'başlık | başlıklar',
track: 'Parça | Parçalar',
trackN: '0 parça | {n} parça | {n} parça',
releaseN: '0 yayınlanan | {n} yayınlanan | {n} yayınlanan',
playlist: 'oynatma listesi | oynatma listeleri',
compile: 'derleme | derlemeler',
ep: 'kayıt | kayıtlar',
spotifyPlaylist: 'spotify oynatma listesi | oynatma listeleri',
releaseDate: 'yayınlanma tarihi',
error: 'hata'
}
},
about: {
titles: {
usefulLinks: 'Yararlı Bağlantılar',
bugReports: 'Hata Raporları',
contributing: 'Katkı Sağlayanlar',
donations: 'Bağışlar',
license: 'Lisans'
},
subtitles: {
bugReports: "Deemix'te çalışmayan bir şey mi var?, Bize bildirin!",
contributing: 'Projeye katkı sağlamak mı istiyorsun? Farklı yollardan sağlayabilirsin!',
donations: 'Bütçe yardımı mı yapmak istiyorsun? Bağış yapabilirsin!'
},
usesLibrary:
'<strong>deemix</strong> kendi kullanıcı arabiriminizi oluşturabileceğiniz, kendine özgü kütüphanesini kullanıyor.',
thanks: ` <strong>rtonno</strong>, <strong>uhwot</strong> ve <strong>lollilol</strong>'a bu projeye yaptığı katkılardan ve <strong>BasCurtiz</strong> ile <strong>scarvimane</strong>'e ikonlardan dolayı teşekkür ederim.`,
upToDate: {
text: `{newsChannel} takip ederek güncellemelerden haberdar olun.`,
newsChannel: 'Telegramdaki haber kanalını'
},
officialWebsite: 'İlgili İnternet Sitemiz',
officialRepo: 'İlgili Kütüphanemiz',
officialWebuiRepo: 'İlgili Web Kullanıcı Arayüzü Kütüphanemiz.',
officialSubreddit: 'İlgili Subreddit adresimiz',
newsChannel: 'Haber Kanalı',
questions: {
text: `Eğer uygulama ile ilgili sorularınız veya bir probleminiz varsa,ilk önce {subreddit} sorununuzu arayın. Eğer bir şey bulamazsanız, sorununuz ile ilgili bir gönderi paylaşabilirsiniz.`,
subreddit: 'subreddit adresinden'
},
beforeReporting: `Bir hatayı bildirmeden önce, uygulamanın son sürümünde olduğunuza veya sorunun sizden kaynaklı olmayıp bir hata olduğuna emin olduktan sonra emin olun.`,
beSure: `Hatanın başka cihazlarda da olduğunu doğrulayın ve <strong>Bildirilen</strong> bir hatayı tekrar bildirmeyin.`,
duplicateReports: 'Birbirinin aynısı olan hata bildirileri kapatılacaktır, o yüzden dikkatli olun.',
dontOpenIssues: `<strong>Soru sormak</strong> için hata bildirisi yollamayın, bunun için bir subreddit adresimiz var.`,
newUI: {
text: `Eğer Phython kullanmakta iyiysen, ana kütüphaneyi kullanan bir kullanıcı arayüzü yapmayı deneyebilir, veya kütüphanedeki hataları düzeltmek için {repo}.`,
repo: 'deposuna değişiklik isteği yollayabilirsin'
},
acceptFeatures: `Yeni özellikleri de kabul ediyorum, fakat karışık şeyleri kütüphaneye değil uygulamaya eklendiği için kabul edemiyorum.`,
otherLanguages: `Eğer diğer programlama dillerinde kendine güveniyorsan, deemix'i farklı dillere port etmeye çalışabilirsin!`,
understandingCode: `Kodu anlamak için yardım mı lazım? Reddit üzerinden veya Telegramdan RemixDev'e ulaş.`,
contributeWebUI: {
text: `Eğer Vue.js (JavaScript), HTML veya CSS biliyorsan, {webui}.`,
webui: 'Web Kullanıcı Arayüzüne katkıda bulanabilirsin'
},
itsFree: `Bunun <strong>ücretsiz bir proje olduğunu</strong> ve <strong>geliştiricilerden önce</strong> sevdiğiniz sanatçıları desteklemeniz gerektiğini unutmayın.`,
notObligated: `Kendinizi bağış yapmak zorunda hissetmeyin!, Sizi her halinizle seviyorum!`,
lincensedUnder: {
text: `Bu çalışma lisanslıdır: {gpl3}.`,
gpl3: 'GNU General Public License 3.0'
}
},
charts: {
title: 'Grafikler',
changeCountry: 'Ülke Değiştir',
download: 'Grafiği İndir'
},
errors: {
title: '{name} Hatalı bulundu',
ids: {
invalidURL: 'URL geçersiz.',
unsupportedURL: 'URL şimdilik desteklenmiyor',
ISRCnotOnDeezer: 'ISRC parça deezerda bulunmuyor',
notYourPrivatePlaylist: 'Başkalarının özel oynatma listelerini indiremezsin.',
spotifyDisabled: 'Spotify Özellikleri doğru şekilde ayarlanmamış.',
trackNotOnDeezer: `Parça Deezer'da bulunamadı!`,
albumNotOnDeezer: `Albüm Deezer'da bulunamadı!`,
notOnDeezer: `Parça Deezer'da yok!`,
notEncoded: `Parça henüz dönüştürülmedi!`,
notEncodedNoAlternative: 'Parça henüz dönüştürülmedi ve alternatifi bulunamadı!',
wrongBitrate: 'Parça, istenen kalitede bulunamadı!',
wrongBitrateNoAlternative: 'Parça veya alternatifler istenen kalitede bulunamadı!',
no360RA: 'Parça 360 Derece gerçekçi ses olarak bulunamadı!',
notAvailable: 'Parça Deezer sunucularında bulunamadı!',
notAvailableNoAlternative: 'Parça veya Alternatifleri Deezer sunucularında bulunamadı.!'
}
},
favorites: {
title: 'Favoriler',
noPlaylists: 'Oynatma listesi bulunamadı.',
noAlbums: 'Favori albümler bulunamadı.',
noArtists: 'Favori sanatçılar bulunamadı.',
noTracks: 'Favori parçalar bulunamadı.'
},
home: {
needTologin: 'İndirmeden önce Deezer hesabına giriş yapmalısın.',
openSettings: 'Ayarları Aç',
sections: {
popularPlaylists: 'Popüler Oynatma Listeleri',
popularAlbums: 'En çok dinlenen albümler'
}
},
linkAnalyzer: {
info: 'İndirmeye çalıştığın link hakkında daha fazla bilgi için burayı kullanabilirsin.',
useful: 'Mesela, ülkende dinlenebilir olmayan parçaların nerelerde var olduğunu bulmak için kullanabilirsin.',
linkNotSupported: 'Bu link şimdilik desteklenmemektedir.',
linkNotSupportedYet: 'Bu link şimdilik desteklenmiyor gibi duruyor, başkasını analiz etmeyi dene.',
table: {
id: 'ID',
isrc: 'ISRC',
upc: 'UPC',
duration: 'Süre',
diskNumber: 'Sıra numarası',
trackNumber: 'Parça numarası',
releaseDate: 'Yayınlanma tarihi',
bpm: 'BPM',
label: 'Etiketi',
recordType: 'Kayıt Şekli',
genres: 'Türü',
tracklist: 'Parça listesi'
}
},
search: {
startSearching: 'Aramayı Başlat!',
description:
'Bir parçayı, tüm albümü, bir sanatçıyı, bir oynatma listesini... kısaca her şeyi aratabilirsin! Ayrıca Deezer Linki de yapıştırabilirsin!',
fans: '{n} Hayranlar',
noResults: 'Sonuç Bulunamadı',
noResultsTrack: 'Parça bulunamadı',
noResultsAlbum: 'Albüm bulunamadı',
noResultsArtist: 'Sanatçı bulunamadı',
noResultsPlaylist: 'Oynatma Listesi bulunamadı'
},
searchbar: 'İstediğin bir şeyi arat (ya da bir link yapıştır.)',
downloads: 'İndirilenler',
toasts: {
addedToQueue: '{item} kuyruğa eklendi',
alreadyInQueue: '{item} çoktan kuyrukta!',
finishDownload: '{item} indirmesi tamamlandı.',
allDownloaded: 'Tüm indirmeler tamamlandı!',
refreshFavs: 'Yenileme tamamlandı.!',
loggingIn: 'Giriş yapılıyor',
loggedIn: 'Giriş yapıldı',
alreadyLogged: 'Çoktan giriş yapıldı',
loginFailed: 'Giriş yapılamadı',
loggedOut: 'Oturum kapatıldı.',
cancellingCurrentItem: 'Geçerli öğe iptal ediliyor.',
currentItemCancelled: 'Geçerli öğe iptal edildi.',
startAddingArtist: '{artist} albüm kuyruğa ekleniyor',
finishAddingArtist: '{artist} albüm kuyruğa eklendi.',
startConvertingSpotifyPlaylist: 'Spotify parçaları deezer parçalarına dönüştürülüyor.',
finishConvertingSpotifyPlaylist: 'Spotify oynatma listesi dönüştürüldü.'
},
settings: {
title: 'Ayarlar',
languages: 'Diller',
login: {
title: 'Giriş',
loggedIn: '{username} olarak giriş yaptın.',
arl: {
question: `Kendi ARL'mi nasıl alırım?`,
update: 'ARL güncelle.'
},
logout: 'Çıkış'
},
appearance: {
title: 'Görünüm',
slimDownloadTab: 'İnce indirme sekmesi'
},
downloadPath: {
title: 'İndirilen dizin'
},
templates: {
title: 'Şablonlar',
tracknameTemplate: 'Parça ismi şablonu',
albumTracknameTemplate: 'Albüm parçası şablonu',
playlistTracknameTemplate: 'Oynatma listesi parça şablonu'
},
folders: {
title: 'Dosyalar',
createPlaylistFolder: 'Oynatma listesi için dosya oluştur',
playlistNameTemplate: 'Oynatma listesi dosyası şablonu',
createArtistFolder: 'Sanatçı için dosya oluştur',
artistNameTemplate: 'Sanatçı dosyası şablonu',
createAlbumFolder: 'Albüm için dosya oluştur',
albumNameTemplate: 'Albüm dosyası şablonu',
createCDFolder: 'CDler için dosya oluştur',
createStructurePlaylist: 'Oynatma listeleri için dosya kökü oluştur',
createSingleFolder: 'Singlelar için dosya kökü oluştur'
},
trackTitles: {
title: 'Parça başlıkları',
padTracks: 'İz Numaraları',
paddingSize: 'İz Numaralarını değiştir',
illegalCharacterReplacer: 'Illegal Karakter Düzenleyici'
},
downloads: {
title: 'İndirilenler',
queueConcurrency: 'Devam eden indirmeler',
maxBitrate: {
title: 'Tercih edilmiş Bitrateler (kaliteler)',
9: 'FLAC 1411kbps',
3: 'MP3 320kbps',
1: 'MP3 128kbps'
},
overwriteFile: {
title: 'Dosyaların üstüne yazmalı mıyım?',
y: 'Evet, üstüne yaz',
n: 'Hayır, üstüne yazma',
t: 'Sadece izleri üstüne yaz'
},
fallbackBitrate: 'Bitrate düşürme',
fallbackSearch: 'Düşürme ara',
logErrors: 'Hatalar için günlük tut',
logSearched: 'Aranmış parçalar için günlük tut',
createM3U8File: 'Oynatma sıra listesi oluştur',
syncedLyrics: '.lyr dosyaları oluştur (Senkronize şarkı sözleri)',
playlistFilenameTemplate: 'Oynatma listesi şablonu',
saveDownloadQueue: 'Uygulamayı kapatırken indirme kuyruğunu kaydet'
},
covers: {
title: 'Albüm kapakları',
saveArtwork: 'Kapakları kaydet',
coverImageTemplate: 'Kapak ismi şablonu',
saveArtworkArtist: 'Sanatçı fotoğrafını kaydet',
artistImageTemplate: 'Şarkıcı fotoğraf şablonu',
localArtworkSize: 'Yerel fotoğraf boyutu',
embeddedArtworkSize: 'Gömülü fotoğraf boyutu',
localArtworkFormat: {
title: 'Yerel fotoğrafın hangi formatta olmasını istersin?',
jpg: 'Jpeg dosyası',
png: 'Png dosyası',
both: 'Her ikisi'
},
jpegImageQuality: 'JPEG görüntü kalitesi'
},
tags: {
head: 'Hangi izler kayıt edilsin?',
title: 'Başlık',
artist: 'Sanatçı',
album: 'Albüm',
cover: 'Kapak',
trackNumber: 'Parça Numarası',
trackTotal: 'Tüm Parça',
discNumber: 'Plak Sayısı',
discTotal: 'Tüm Plak',
albumArtist: 'Sanatçı Albümü',
genre: 'Tür',
year: 'Yıl',
date: 'Tarih',
explicit: 'Cinsel içerikli şarkı sözleri',
isrc: 'ISRC',
length: 'Parça Uzunluğu',
barcode: 'Albüm Barkodu (UPC)',
bpm: 'BPM',
replayGain: 'Ses Yüksekliği Normalleştirici',
label: 'Albüm Etiketi',
lyrics: 'Senkronize edilmemiş şarkı sözleri',
copyright: 'Telif hakkı',
composer: 'Besteleyen',
involvedPeople: 'Alakalı Kişiler'
},
other: {
title: 'Diğer',
savePlaylistAsCompilation: 'Oynatma listelerini derleme olarak kaydet',
useNullSeparator: 'Boşluk ayırıcı kullan',
saveID3v1: 'ID3v1 dosyasını da kaydet',
multiArtistSeparator: {
title: 'Sanatçılarınızı nasıl ayırmak istersiniz?',
nothing: 'Sadece ana sanatçıyı kaydet',
default: 'Genel prosedür uygulansın',
andFeat: 'Kullanılanlar & ve Feat.',
using: 'Kullanılan "{separator}"'
},
singleAlbumArtist: 'Sadece ana albüm sanatçısını kaydet',
albumVariousArtists: '"Çeşitli sanatçılar"ı sanatçı albümlerinde tut',
removeAlbumVersion: '"Albüm Sürümü"nü parça başlığından çıkart',
removeDuplicateArtists: 'Sanatçı topluluğunu çıkart',
dateFormat: {
title: 'FLAC dosyalar için zaman formatı',
year: 'YYYY',
month: 'AA',
day: 'GG'
},
featuredToTitle: {
title: 'Öne çıkan sanatçıları ne yapmalıyım?',
0: 'Elleme',
1: 'Başlıktan çıkart',
3: 'Başlıktan ve albüm başlığından çıkart',
2: 'Başlığa taşı'
},
titleCasing: 'Albüm harfi',
artistCasing: 'Sanatçı harfi',
casing: {
nothing: 'Değiştirmeden bırak',
lower: 'küçük harf',
upper: 'BÜYÜK HARF',
start: 'Kelimenin başı ile başla',
sentence: 'Cümle gibi yap'
},
previewVolume: 'Ses önizlemesi',
executeCommand: {
title: 'İndirdikten sonra komut uygula',
description: 'Bir şey yapmamak için boş bırak'
}
},
spotify: {
title: 'Spotify Özelliği',
clientID: 'Spotify clientID',
clientSecret: 'Spotify Client Secret',
username: 'Spotify Kullanıcı Adı'
},
reset: 'Varsayılana sıfırla',
save: 'Kaydet',
toasts: {
init: 'Ayarlar yüklendi!',
update: 'Ayarlar güncellendi!',
ARLcopied: 'ARL panoya kopyalandı!'
}
},
sidebar: {
home: 'Ana sayfa',
search: 'Ara',
charts: 'Grafikler',
favorites: 'Favoriler',
linkAnalyzer: 'Link Analizörü',
settings: 'Ayarlar',
about: 'Hakkında'
},
tracklist: {
downloadSelection: 'İndirme bölümü'
}
};
const vn = {
globals: {
welcome: 'Chào mừng đến với deemix',
back: 'trở lại',
loading: 'đang tải',
download: 'Tải xuống {thing}',
by: 'bởi {artist}',
in: 'trong {album}',
download_hint: 'Tải xuống',
play_hint: 'Phát',
toggle_download_tab_hint: 'Mở rộng/Giấu',
clean_queue_hint: 'Xóa những file đã tải xong',
cancel_queue_hint: 'Hủy tất cả',
listTabs: {
empty: '',
all: 'tất cả',
top_result: 'kết quả hàng đầu',
album: 'album | album',
artist: 'Nghệ sĩ | Nghệ sĩ',
single: 'đơn | đơn',
title: 'tiêu đề | tiêu đề',
track: 'Bài hát | Bài hát',
trackN: '0 Bài hát | {n} Bài hát | {n} Bài hát',
releaseN: '0 sản phẩm | {n} sản phẩm | {n} sản phẩm',
playlist: 'playlist | playlist',
compile: 'tổng hợp | tổng hợp',
ep: 'ep | ep',
spotifyPlaylist: 'playlist của spotify | playlist của spotify',
releaseDate: 'ngày phát hành',
error: 'lỗi'
}
},
about: {
titles: {
usefulLinks: 'Link hữu dụng',
bugReports: 'Báo lỗi',
contributing: 'Đóng góp',
donations: 'Quyên góp',
license: 'Bằng phép'
},
subtitles: {
bugReports: "Bạn thấy có gì đó không hoạt động trong deemix? Xin hãy báo với chúng tôi!",
contributing: 'Bạn muốn đóng góp cho dự án này? Bạn có thể làm điều đó với nhiều cách khác nhau!',
donations: 'Bạn muốn ủng hộ kinh phí? Bạn có thể quyên góp tại đây!'
},
usesLibrary: 'Ứng dụng này sử dụng thư viện <strong>deemix</strong>, bạn có thể dùng nó để tạo một UI riêng cho deemix.',
thanks: `Cảm ơn <strong>rtonno</strong>, <strong>uhwot</strong> và <strong>lollilol</strong> đã giúp tôi với dự án này và <strong>BasCurtiz</strong> và <strong>scarvimane</strong> với việc thiết kế biểu tượng.`,
upToDate: {
text: `Cập nhật app bằng cách theo dõi {newsChannel} trên Telegram.`,
newsChannel: 'kênh tin tức'
},
officialWebsite: 'Website chính thức',
officialRepo: 'Repo thư viện chính thức',
officialWebuiRepo: 'Repo WebUI chính thức',
officialSubreddit: 'Subreddit chính thức',
newsChannel: 'Kênh tin tức',
questions: {
text: `Nếu bạn có câu hỏi hoặc vấn đề về ứng dụng này, xin hãy tìm giải pháp trên {subreddit} trước. Sau đó, nếu bạn không tìm được gì thì bạn có thể tạo một bài đăng về vấn đề của bạn trên subreddit dó.`,
subreddit: 'subreddit'
},
beforeReporting: `Trước khi báo lỗi hãy đảm bảo bạn đang sử dụng phiên bản mới nhất của ứng dụng và lỗi bạn đang gặp không phải là do bạn.`,
beSure: `Hãy đảm bảo là lỗi này vẫn có thể xảy ra trên các thiết bị khác và <strong>XIN ĐỪNG</strong> báo lỗi đã được báo rồi.`,
duplicateReports: 'Những bản báo lỗi trùng nhau sẽ bị đóng, xin bạn hãy để ý điều này.',
dontOpenIssues: `<strong>XIN ĐỪNG</strong> mở vấn đề để hỏi, bạn có thể dùng subreddit trên cho việc đó.`,
newUI: {
text: `Nếu bạn thành thạo với python bạn có thể tạo một UI mới bằng cách sử dụng thư viện gốc, hoặc sửa lỗi trong thư viện đó với một pull request trên {repo}.`,
repo: 'repo này'
},
acceptFeatures: `Tôi có chấp nhận yêu cầu về tính năng mới nhưng không quá phức tạp bởi vì chúng có thể được triển khai trực tiếp vào ứng dụng thay vì vào thư viện.`,
otherLanguages: `Nếu bạn thành thạo với một ngôn ngữ khác, bạn có thể port deemix sang ngôn ngữ đó!`,
understandingCode: `Bạn muốn hiểu code của deemix? Xin hãy liên lạc RemixDev trên Telegram hoặc Reddit.`,
contributeWebUI: {
text: `Nếu bạn biết Vue.js (JavaScript), HTML hoặc CSS, bạn có thể góp phần phát triển {webui}.`,
webui: 'WebUI'
},
itsFree: `Bạn nên nhớ rằng <strong>đây là một dự án phi lợi nhuận</strong> và <strong>bạn nên ủng hộ những Nghệ sĩ yêu thích của bạn</strong> trước khi ủng hộ nhà phát triển.`,
notObligated: `Đừng nghĩ rằng bạn phải đóng góp tiền, tôi vẫn sẽ rất biết ơn bạn!`,
lincensedUnder: {
text: `Dự án này được cấp phép bởi {gpl3}.`,
gpl3: 'GNU General Public License 3.0'
}
},
charts: {
title: 'Bảng xếp hạng',
changeCountry: 'Thay đổi quốc gia',
download: 'Tải xuống bảng xếp hạng này'
},
errors: {
title: 'Lỗi {name}',
ids: {
invalidURL: 'Không nhận diện được URL',
unsupportedURL: 'URL này chưa được hỗ trợ',
ISRCnotOnDeezer: 'ISRC của bài hát này hiện không có trên Deezer',
notYourPrivatePlaylist: "Bạn không thể tải xuống playlist riêng của người khác.",
spotifyDisabled: 'Chức năng Spotify chưa được thiết lập đúng cách.',
trackNotOnDeezer: 'Bài hát không có trên Deezer!',
albumNotOnDeezer: 'Album không có trên Deezer!',
notOnDeezer: 'Bài hát chưa có trên Deezer!',
notEncoded: 'Bài hát chưa được encode!',
notEncodedNoAlternative: 'Bài hát chưa được encode và không có bản thay thế nào khác!',
wrongBitrate: 'Bài hát này không có ở bitrate bạn muốn.',
wrongBitrateNoAlternative: 'Bài hát này không có ở bitrate bạn muốn và không có bản thay thế nào khác!',
no360RA: 'Bài hát này không có ở dạng Reality Audio 360.',
notAvailable: "Bài hát này không có trên server của Deezer!",
notAvailableNoAlternative: "Bài hát này không có trên server của Deezer và không có bản thay thế nào khác!"
}
},
favorites: {
title: 'Yêu thích',
noPlaylists: 'Không tìm được Playlist',
noAlbums: 'Không tìm được Album Yêu thích',
noArtists: 'Không tìm được Nghệ sĩ Yêu thích',
noTracks: 'Không tìm được Bài hát Yêu thích'
},
home: {
needTologin: 'Bạn cần phải đăng nhập vào tài khoản Deezer trước khi bắt đầu tải xuống.',
openSettings: 'Mở Cài đặt',
sections: {
popularPlaylists: 'Playlist Nổi tiếng',
popularAlbums: 'Album được stream nhiều nhất'
}
},
linkAnalyzer: {
info: 'Bạn có thể sử dụng chức năng này để kiếm thêm thông tin về đường link mà bạn muốn tải xuống.',
useful:
"Chức năng này rất hữu dụng nếu bạn muốn tải các bài hát hiện không có sẵn ở quốc gia của bạn và muốn biết các quốc gia được hỗ trợ.",
linkNotSupported: 'Đường link này chưa được hỗ trợ',
linkNotSupportedYet: 'Đường link này chưa được hỗ trợ, xin hãy thử lại với một đường link khác.',
table: {
id: 'ID',
isrc: 'ISRC',
upc: 'UPC',
duration: 'Thời lượng',
diskNumber: 'Số đĩa',
trackNumber: 'Số bài hát',
releaseDate: 'Ngày phát hành',
bpm: 'BPM',
label: 'Hãng',
recordType: 'Loại Thu âm',
genres: 'Thể loại',
tracklist: 'Danh sách các bài hát'
}
},
search: {
startSearching: 'Bắt đầu tìm kiếm!',
description:
'Bạn có thể tìm một bài hát, album, nghệ sĩ, playlist, v.v...! Bạn cũng có thể dùng link của Deezer',
fans: '{n} người hâm mộ',
noResults: 'Không có kết quả',
noResultsTrack: 'Không tìm được bài hát nào',
noResultsAlbum: 'Không tìm được album nào',
noResultsArtist: 'Không tìm được nghệ sĩ nào',
noResultsPlaylist: 'Không tìm được playlist nào'
},
searchbar: 'Tìm những gì bạn muốn (bạn cũng có thể sữ dụng một đường link)',
downloads: 'Tải xuống',
toasts: {
addedToQueue: '{item} đã được đưa vào hàng chờ',
alreadyInQueue: '{item} đã đang trong hàng chờ!',
finishDownload: '{item} đã tải xong.',
allDownloaded: 'Tất cả các bài hát đã được tải xuống!',
refreshFavs: 'Tải lại hoàn tất!',
loggingIn: 'Đang đăng nhập',
loggedIn: 'Đăng nhập thành công',
alreadyLogged: 'Đã đăng nhập',
loginFailed: "Không thể đăng nhập",
loggedOut: 'Đăng xuất',
cancellingCurrentItem: 'Đang hủy file hiện tại.',
currentItemCancelled: 'File hiện tại đã bị hủy.',
startAddingArtist: 'Đang đưa {artist} album vào hàng chờ',
finishAddingArtist: 'Đã đưa {artist} album vào hàng chờ',
startConvertingSpotifyPlaylist: 'Đang chuyển đổi các bài hát từ Spotify sang Deezer',
finishConvertingSpotifyPlaylist: 'Playlist của Spotify đã được chuyển đổi',
loginNeededToDownload: 'Bạn cần phải đang nhập để tải nhạc!'
},
settings: {
title: 'Cài đặt',
languages: 'Ngôn ngữ',
login: {
title: 'Đăng nhập',
loggedIn: 'Bạn đã đăng nhập với tên {username}',
arl: {
question: 'Làm cách nào để có ARL của tôi?',
update: 'Cập nhật ARL'
},
logout: 'Đăng xuất'
},
appearance: {
title: 'Giao diện',
slimDownloadTab: 'Thanh tải xuống nhỏ'
},
downloadPath: {
title: 'Nơi tải xuống'
},
templates: {
title: 'Bản mẫu',
tracknameTemplate: 'Bài hát mẫu',
albumTracknameTemplate: 'Bài hát trong album mẫu',
playlistTracknameTemplate: 'Bài hát trong playlist mẫu'
},
folders: {
title: 'Thư mục',
createPlaylistFolder: 'Tạo thư mục cho playlist',
playlistNameTemplate: 'Thư mục playlist mẫu',
createArtistFolder: 'Tạo thư mục cho nghệ sĩ',
artistNameTemplate: 'Thư mục Nghệ sĩ mẫu',
createAlbumFolder: 'Tạo thư mục cho album',
albumNameTemplate: 'Thư mục cho album mẫu',
createCDFolder: 'Tạo thư mục cho đĩa CD',
createStructurePlaylist: 'Tạo thư mục có kết cấu cho playlist',
createSingleFolder: 'Tạo thư mục có kết cấu cho đĩa đơn'
},
trackTitles: {
title: 'Tên bài hát',
padTracks: 'Đệm tên bài hát',
paddingSize: 'Ghì đè kích cỡ phần đệm',
illegalCharacterReplacer: 'Thay các kí tự không hợp lệ với'
},
downloads: {
title: 'Tải xuống',
queueConcurrency: 'Số lượng tải xuống cùng lúc',
maxBitrate: {
title: 'Bitrate ưa thích',
9: 'FLAC 1411kbps',
3: 'MP3 320kbps',
1: 'MP3 128kbps'
},
overwriteFile: {
title: 'Tôi có nên ghi đè file này không?',
y: 'Có, hãy ghi đè file này',
n: "Không, đừng ghi đè file này",
t: 'Chỉ ghi đè các tag'
},
fallbackBitrate: 'Bitrate dự phòng',
fallbackSearch: 'Search dự phòng',
logErrors: 'Tạo file log khi có lỗi',
logSearched: 'Tạo file log khi bạn tìm Bài hát',
createM3U8File: 'Tạo file playlist',
syncedLyrics: 'Tạo file .lyr (Lời Bài hát)',
playlistFilenameTemplate: 'Tên playlist mẫu',
saveDownloadQueue: 'Lưu hàng chờ download khi đóng ứng dụng'
},
covers: {
title: 'Bìa album',
saveArtwork: 'Lưu bìa',
coverImageTemplate: 'Tên bìa mẫu',
saveArtworkArtist: 'Lưu hình Nghệ sĩ',
artistImageTemplate: 'Hình nghệ sĩ mẫu',
localArtworkSize: 'Kích cỡ file bìa',
embeddedArtworkSize: 'Kích cỡ bìa trong file bài hát',
localArtworkFormat: {
title: 'Bạn muốn file bìa ở định dạng nào?',
jpg: 'jpg',
png: 'png',
both: 'Cả jpg và png'
},
jpegImageQuality: 'Chất lượng file JPEG'
},
tags: {
head: 'Những tag sẽ được lưu',
title: 'Tiêu đề',
artist: 'Nghệ sĩ',
album: 'Album',
cover: 'Bìa',
trackNumber: 'Số bài hát',
trackTotal: 'Tổng số bài hát',
discNumber: 'Số đĩa',
discTotal: 'Tổng số đĩa',
albumArtist: 'Nghệ sĩ của album',
genre: 'Thể loại',
year: 'Năm',
date: 'Ngày',
explicit: 'Lời explicit',
isrc: 'ISRC',
length: 'Thời lượng',
barcode: 'Mã vạch của album (UPC)',
bpm: 'BPM',
replayGain: 'ReplayGain',
label: 'Nhãn hiệu album',
lyrics: 'Lời',
copyright: 'Bản quyền',
composer: 'Nhà soạn nhạc',
involvedPeople: 'Những người liên quan'
},
other: {
title: 'Khác',
savePlaylistAsCompilation: 'Lưu playlist dưới dạng tuyển tập',
useNullSeparator: 'Dùng dải phân cách null',
saveID3v1: 'Lưu ID3v1',
multiArtistSeparator: {
title: 'Bạn muốn phân cách các nghệ sĩ như thế nào?',
nothing: 'Chỉ lưu nghệ sĩ chính',
default: 'Dùng quy cách tiêu chuẩn',
andFeat: 'Dùng & và feat.',
using: 'Dùng "{separator}"'
},
singleAlbumArtist: 'Chỉ lưu Nghệ sĩ Album chính',
albumVariousArtists: 'Giữ nguyên "Nhiều Nghệ sĩ" trong Nghệ sĩ Album',
removeAlbumVersion: 'Bỏ "Phiên bản Album" khỏi tên bài hát',
removeDuplicateArtists: 'Bỏ các tên nghệ sĩ phối hợp',
dateFormat: {
title: 'Định dạng ngày cho file FLAC ',
year: 'YYYY',
month: 'MM',
day: 'DD'
},
featuredToTitle: {
title: 'Tôi nên làm gì với các nghệ sĩ đóng góp?',
0: 'Không làm gì cả',
1: 'Bỏ chúng khỏi tên bài hát',
3: 'Bỏ chúng khỏi tên bài hát và tên album',
2: 'Đưa chúng vào tên bài hát'
},
titleCasing: 'Định dạng tên bài hát',
artistCasing: 'Định dạng tên nghệ sĩ',
casing: {
nothing: 'Không đổi',
lower: 'chữ thường',
upper: 'CHỮ HOA',
start: 'Viết Hoa Ở Chữ Cái Đầu Tiên Của Mỗi Từ',
sentence: 'Như một câu'
},
previewVolume: 'Âm lượng nghe thử',
executeCommand: {
title: 'Thực hiện những lệnh này khi đã tải xuống xong',
description: 'Để trống nếu bạn không muốn thực hiện lệnh nào'
}
},
spotify: {
title: 'Chức năng Spotify',
clientID: 'ClientID của Spotify',
clientSecret: 'Client Secret của Spotify',
username: 'Tên tài khoản của Spotify'
},
reset: 'Quay trở lại cài đặt mặc định',
save: 'Lưu',
toasts: {
init: 'Cài đặt đã được thiết lập!',
update: 'Cài đặt cập nhật thành công!',
ARLcopied: 'ARL đã được sao chép vào clipboard'
}
},
sidebar: {
home: 'trang chủ',
search: 'tìm kiếm',
charts: 'bảng xếp hạng',
favorites: 'yêu thích',
linkAnalyzer: 'phân tích link',
settings: 'cài đặt',
about: 'thông tin'
},
tracklist: {
downloadSelection: 'Tải xuống những mục đã chọn'
}
};
const hr = {
globals: {
welcome: 'Dobrodošli u deemix',
back: 'nazad',
loading: 'učitavanje',
download: 'Preuzmi {thing}',
by: 'by {artist}',
in: 'u {album}',
download_hint: 'Preuzmi',
play_hint: 'Play',
toggle_download_tab_hint: 'Proširi/Smanji',
clean_queue_hint: 'Čišćenje završeno',
cancel_queue_hint: 'Zaustavi sve',
listTabs: {
empty: '',
all: 'sve',
top_result: 'Najbolji rezultat',
album: 'album | albumi',
artist: 'izvođač | izvođači',
single: 'singl | singlovi',
title: 'naslov | naslovi',
track: 'pjesma | pjesme',
trackN: '0 pjesmi | {n} pjesma | {n} pjesme',
releaseN: '0 izdanja | {n} izdanje | {n} izdanja',
playlist: 'playlista | playliste',
compile: 'kompilacija | kompilacije',
ep: 'ep | eps',
spotifyPlaylist: 'spotify playlista | spotify playliste',
releaseDate: 'datum izdavanja',
error: 'greška'
}
},
about: {
titles: {
usefulLinks: 'Korisne poveznice',
bugReports: 'Prijave grešaka',
contributing: 'Doprinosi',
donations: 'Donacije',
license: 'Licenca'
},
subtitles: {
bugReports: "Postoji nešto što ne radi u deemixu? Reci nam!",
contributing: 'Želiš doprinijeti ovom projektu? Možeš i to čak u više načina!',
donations: 'Želiš doprijeniti odmah? Možeš donirati!'
},
usesLibrary: 'Ova aplikacija koristi <strong>deemix</strong> biblioteku, koju možeš koristiti i ti kako bi napravio svoj UI za demix.',
thanks: `Hvala <strong>rtonno</strong>, <strong>uhwot</strong> i <strong>lollilol</strong> što su mi pomogli s ovim projektom te <strong>BasCurtiz</strong> i <strong>scarvimane</strong> što su napravili ikonu.`,
upToDate: {
text: `Ostani u tijeku s nadogradnjama prateći {newsChannel} na Telegramu.`,
newsChannel: 'kanal s novostima'
},
officialWebsite: 'Službena web stranica',
officialRepo: 'Službeni repozitorij biblioteke',
officialWebuiRepo: 'Službeni WebUI repozitorij',
officialSubreddit: 'Službeni subreddit',
newsChannel: 'Kanal s novostima',
questions: {
text: `Ukoliko imate pitanja o aplikaciji, prvo potražite riješenje na {subreddit}. Tada, ako ne pronađete ništa, možete objaviti svoj problem na subredditu.`,
subreddit: 'subreddit'
},
beforeReporting: `Prije prijavljivanja greške provjerite imate li instaliranu zadnju verziju aplikacije i da to što želite prijaviti je ustvari pogreška, a ne nešto što samo vama ne radi.`,
beSure: `Provjerite može li se pogreška reproducirati i na drugim uređajima i također <strong>NEMOJTE</strong> prijavljivati grešku ako je već prijavljena.`,
duplicateReports: 'Duplicirane prijave o greški bit će zatvorene, tako da pripazite na to.',
dontOpenIssues: `<strong>NEMOJTE</strong> otvarati issue za postavljanje pitanja, za to postoji subreddit.`,
newUI: {
text: `Ako ste vješti u pythonu možete probati napraviti novi UI za aplikaciju koristeći osnovnu biblioteku ili ispraviti pogrešku u biblioteci sa pull zahtjevom na {repo}.`,
repo: 'repozitoriju'
},
acceptFeatures: `Prihavaćam i značajke, ali bez kompleksnih stvari, jer one mogu biti implementirane direktno u aplikaciji, a ne u biblioteci.`,
otherLanguages: `Ako ste vješti u drugom programskom jezikumožete probati portati deemix u drugi programski jezik!`,
understandingCode: `Trebate pomoć s razumijevanjem koda? Samo potraži RemixDev na Telegramu ili Redditu.`,
contributeWebUI: {
text: `Ako znaš Vue.js (JavaScript), HTML ili CSS možete doprinijeti za {webui}.`,
webui: 'WebUI'
},
itsFree: `Trebate zapamtiti da je ovo <strong>besplatni projekt</strong> i <strong>trebali biste podržati autore koje volite</strong> prije podržavanja developera.`,
notObligated: `Nemojte se osjećati obveznim darivati, svejedno vas cijenim!`,
lincensedUnder: {
text: `Ovaj rad licenciran je unutar {gpl3}.`,
gpl3: 'GNU General Public License 3.0'
}
},
charts: {
title: 'Ljestvice',
changeCountry: 'Promijeni državu',
download: 'Preuzmi ljestvicu'
},
errors: {
title: 'Greške za {name}',
ids: {
invalidURL: 'URL nije prepoznat',
unsupportedURL: 'URL još nije podržan',
ISRCnotOnDeezer: 'Zapis ISRC još nije podržan na Deezeru',
notYourPrivatePlaylist: "Ne možete preuzeti tuđe privatne playliste.",
spotifyDisabled: 'Spotify značajke nisu podešene ispravno.',
trackNotOnDeezer: 'Pjesma nije pronađena na Deezeru!',
albumNotOnDeezer: 'Album nije pronađen na Deezeru!',
notOnDeezer: 'Pjesma nije dostupna na Deezeru!',
notEncoded: 'Pjesma još nije enkodirana!',
notEncodedNoAlternative: 'Pjesma još nije enkodirana i nije pronađena alternativa!',
wrongBitrate: 'Pjesma nije pronađena u željenom bitrateu.',
wrongBitrateNoAlternative: 'Pjesma nije pronađena u željenom bitrateu i nije pronađena alternativa!',
no360RA: 'Pjesma nije dostupna u Reality Audio 360.',
notAvailable: "Pjesma nije dostupna na Deezerovim serverima!",
notAvailableNoAlternative: "Pjesma nije dostupna na Deezerovim serverima i alternativa nije pronađena!"
}
},
favorites: {
title: 'Favoriti',
noPlaylists: 'Nisu pronađene playliste',
noAlbums: 'Omiljeni albumi nisu pronađeni',
noArtists: 'Omiljeni glazbenici nisu pronađeni',
noTracks: 'Omiljene pjesme nisu pronađene'
},
home: {
needTologin: 'Trebate se prijaviti sa svojim Deezer računom kako biste mogli početi preuzimati pjesme.',
openSettings: 'Otvori postavke',
sections: {
popularPlaylists: 'Popularne playliste',
popularAlbums: 'Najpreslušaniji album'
}
},
linkAnalyzer: {
info: 'Ovu sekciju možete koristiti kako biste saznali više informacija o linku koji pokušavate preuzeti.',
useful:
"Ovo je korisno ako pokušavate preuzeti pjesme koje još nisu dostupne u vašoj zemlji i želite, na primjer, znati gdje su dostupne.",
linkNotSupported: 'Ovaj link još nije podržan',
linkNotSupportedYet: 'Čini se da ovaj link još nije podržan, pokušaj analizirati neki drugi.',
table: {
id: 'ID',
isrc: 'ISRC',
upc: 'UPC',
duration: 'Trajanje',
diskNumber: 'Broj diska',
trackNumber: 'Broj pjesme',
releaseDate: 'Datum izadavanja',
bpm: 'BPM',
label: 'Izdavačka kuća',
recordType: 'Vrsta zapisa',
genres: 'Žanrovi',
tracklist: 'Popis pjesama'
}
},
search: {
startSearching: 'Počni pretraživati!',
description:
'Možete pretražiti pjesmu, cijeli album, izvođača, playlistu... sve! Također, možete i zalijepiti Deezer link',
fans: '{n} obožavatelja',
noResults: 'Nema rezultata',
noResultsTrack: 'Pjesme nisu pronađene',
noResultsAlbum: 'Albumi nisu pronađeni',
noResultsArtist: 'Izvođači nisu pronađeni',
noResultsPlaylist: 'Playliste nisu pronađene'
},
searchbar: 'Pretraži bilo što (ili samo zalijepi link)',
downloads: 'preuzimanja',
toasts: {
addedToQueue: '{item} dodan u red',
alreadyInQueue: '{item} je već u redu!',
finishDownload: '{item} završeno preuzimanje.',
allDownloaded: 'Sva preuzimanja završena!',
refreshFavs: 'Osvježavanje završeno!',
loggingIn: 'Prijavljivanje...',
loggedIn: 'Prijavljeni',
alreadyLogged: 'Već prijavljeni',
loginFailed: "Prijava nije bila moguća",
loggedOut: 'Odjavljeni',
cancellingCurrentItem: 'Otkazujem trenutnu stavku.',
currentItemCancelled: 'Trenutna stavka otkazana.',
startAddingArtist: 'Dodajem {artist} album u red',
finishAddingArtist: 'Dodan {artist} album u red',
startConvertingSpotifyPlaylist: 'Pretvaram Spotify pjesme u Deezer pjesme',
finishConvertingSpotifyPlaylist: 'Spotify playlista pretvorena',
loginNeededToDownload: 'Trebate se prijaviti kako bi preuzeli pjesme!'
},
settings: {
title: 'Postavke',
languages: 'Jezici',
login: {
title: 'Prijava',
loggedIn: 'Prijavljeni ste kao {username}',
arl: {
question: 'Kako da dobijem svoj ARL?',
update: 'Ažuriraj ARL'
},
logout: 'Odjavi se'
},
appearance: {
title: 'Izgled',
slimDownloadTab: 'Tanka kartica za preuzimanje'
},
downloadPath: {
title: 'Putanja za preuzimanja'
},
templates: {
title: 'Predlošci',
tracknameTemplate: 'Naziv pjesme predložak',
albumTracknameTemplate: 'Pjesma albuma predložak',
playlistTracknameTemplate: 'Pjesma playliste predložak'
},
folders: {
title: 'Mape',
createPlaylistFolder: 'Izradi mapu za playliste',
playlistNameTemplate: 'Mapa za playliste predložak',
createArtistFolder: 'Izradi mapu za izvođača',
artistNameTemplate: 'Izvođač mapa predložak',
createAlbumFolder: 'Izradi mapu za album',
albumNameTemplate: 'Album mapa predložak',
createCDFolder: 'Izradi mapu za CD',
createStructurePlaylist: 'Strkturiraj mape za playliste',
createSingleFolder: 'Strukturiraj mape za singlove'
},
trackTitles: {
title: 'Naslovi pjesama',
padTracks: 'Pad tracks',
paddingSize: 'Prepiši veličinu paddinga',
illegalCharacterReplacer: 'Zamjena za nedozvoljeni znak'
},
downloads: {
title: 'Preuzimanja',
queueConcurrency: 'Istovremena preuzimanja',
maxBitrate: {
title: 'Željeni bitrate',
9: 'FLAC 1411kbps',
3: 'MP3 320kbps',
1: 'MP3 128kbps'
},
overwriteFile: {
title: 'Trebam li prepisati datoteke?',
y: 'Da, prepiši datoteke',
n: "Ne, nemoj prepisati datoteke",
t: 'Prepiši samo oznake',
b: 'Ne, zadrži obje datoteke i dodaj broj duplikatu'
},
fallbackBitrate: 'Bitrate fallback',
fallbackSearch: 'Pretraživanje fallback',
logErrors: 'Izradi zapisnik datoteku za greške',
logSearched: 'Izradi zapisnik datoteku za pretražene pjesme',
createM3U8File: 'Izradi playlist datoteku',
syncedLyrics: 'Izradi .lyr datoteke (sinkronizirani lyrics)',
playlistFilenameTemplate: 'Naziv playliste predložak',
saveDownloadQueue: 'Spremi red za preuzimanje prilikom zatvaranja aplikacije'
},
covers: {
title: 'Omoti albuma',
saveArtwork: 'Spremi omote',
coverImageTemplate: 'Naziv omota predložak',
saveArtworkArtist: 'Spremi sliku izvođača',
artistImageTemplate: 'Slika izvođača predložak',
localArtworkSize: 'Veličina lokalnog omota',
embeddedArtworkSize: 'Veličina ugrađenog omota',
localArtworkFormat: {
title: 'U kojem formatu želite lokalni omot?',
jpg: 'Jpeg slika',
png: 'Png slika',
both: 'I jpeg i png'
},
jpegImageQuality: 'JPEG kvaliteta slike'
},
tags: {
head: 'Koja oznake spremam',
title: 'Naslovi',
artist: 'Izvođač',
album: 'Album',
cover: 'Omot',
trackNumber: 'Broj pjesme',
trackTotal: 'Ukupno pjesama',
discNumber: 'Broj diska',
discTotal: 'Ukupno diskova',
albumArtist: 'Izvođač albuma',
genre: 'Žanr',
year: 'Godina',
date: 'Datum',
explicit: 'Eksplicitni lyrics',
isrc: 'ISRC',
length: 'Dužina pjesme',
barcode: 'Album barkod (UPC)',
bpm: 'BPM',
replayGain: 'Replay Gain',
label: 'Izdavačka kuća albuma',
lyrics: 'Nesinkronizirani lyrics',
copyright: 'Autorska prava',
composer: 'Skladatelj',
involvedPeople: 'Uključeni ljudi'
},
other: {
title: 'Ostalo',
savePlaylistAsCompilation: 'Spremi playliste kao kompilacije',
useNullSeparator: 'Koristi null razdvojnik',
saveID3v1: 'Spremi i ID3v1 također',
multiArtistSeparator: {
title: 'Kako biste željeli razdvojiti izvođače?',
nothing: 'Spremi samo glavnog izvođača',
default: 'Koristeći standardnu specifikaciju',
andFeat: 'Koristeći & i feat.',
using: 'Koristeći "{separator}"'
},
singleAlbumArtist: 'Spremi samo izvođača glavnog albuma',
albumVariousArtists: 'Zadrži "Various Artists" u Izvođačima albuma',
removeAlbumVersion: 'Izbriši "Album Version" iz naziva pjesme',
removeDuplicateArtists: 'Izbriši kombinacije izvođača',
dateFormat: {
title: 'Format datuma za FLAC datoteke',
year: 'YYYY',
month: 'MM',
day: 'DD'
},
featuredToTitle: {
title: 'Što trebam napraviti s istaknutim izvođačima? (feat. i ft.)',
0: 'Ništa',
1: 'Izbriši ih iz naziva',
3: 'Izbriši ih iz naziva i iz naziva albuma',
2: 'Premjesti ih u naziv'
},
titleCasing: 'Veličina slova naslova',
artistCasing: 'Veličina slova izvođača',
casing: {
nothing: 'Zadrži nepromijenjeno',
lower: 'sve malo',
upper: 'sve VELIKO',
start: 'Početak Svake Riječi',
sentence: 'Kao rečenica'
},
previewVolume: 'Volumen pregleda',
executeCommand: {
title: 'Naredba za izvršenje nakon preuzimanja',
description: 'Ostavi prazno za bez akcije'
}
},
spotify: {
title: 'Spotify značajke',
clientID: 'Spotify ClientID',
clientSecret: 'Spotify Client Secret',
username: 'Spotify korisničko ime'
},
reset: 'Resetiraj na zadano',
save: 'Spremi',
toasts: {
init: 'Postavke učitane!',
update: 'Postavke ažurirane!',
ARLcopied: 'ARL kopiran u međuspremnik'
}
},
sidebar: {
home: 'početna',
search: 'pretraživanje',
charts: 'ljestvice',
favorites: 'favoriti',
linkAnalyzer: 'analizator linka',
settings: 'postavke',
about: 'o programu'
},
tracklist: {
downloadSelection: 'Preuzmi selekciju'
}
};
const ar = {
globals: {
welcome: 'مرحبأ بك في ديمكس',
back: 'رجوع',
loading: 'جار التحميل',
download: 'تحميل {thing}',
by: 'بواسطة {artist}',
in: 'في {album}',
download_hint: 'تحميل',
play_hint: 'تشغيل',
toggle_download_tab_hint: 'عرض/اخفاء',
clean_queue_hint: 'تم المسح',
cancel_queue_hint: 'الغاء الكل',
listTabs: {
empty: '',
all: 'الكل',
top_result: 'افضل النتائج',
album: 'البوم | البومات',
artist: 'فنان | فنانون',
single: 'اغنية | اغنية',
title: 'عنوان | عناوين',
track: 'مقطع | مقاطع',
trackN: '0 مقاطع | {n} مقطع | {n} مقطع',
releaseN: '0 اصدار | {n} اصدار | {n} اصدار',
playlist: 'قائمة تشغيل | قوائم تشغيل',
compile: 'مجموعة | مجموعات',
ep: 'ep | eps',
spotifyPlaylist: 'قائمة تشغيل سبوتفاي | قوائم تشغيل سبوتفاي',
releaseDate: 'تاريخ الاصدار',
error: 'خطأ'
}
},
about: {
titles: {
usefulLinks: 'روابط مهمة',
bugReports: 'ابلاغ عن مشكلة',
contributing: 'مساهمة',
donations: 'التبرع',
license: 'الرخصة'
},
subtitles: {
bugReports: "هل هناك شيء لا يعمل في ديمكس؟ أخبرنا",
contributing: 'تريد المساهمة في هذا المشروع؟ يمكنك القيام بذلك بعدة طرق',
donations: 'تريد المساهمة مادياً؟ يمكنك التبرع'
},
usesLibrary: 'هذا البرنامج يستخدم مكتبة <strong>ديمكس</strong> والتي يمكنك استخدامها لإنشاء واجهة مستخدم خاصة بك لديمكس.',
thanks: `شكرا لـ <strong>rtonno</strong>, و <strong>uhwot</strong> و <strong>lollilol</strong> لمساعدتي في هذا المشروع و لـ <strong>BasCurtiz</strong> و <strong>scarvimane</strong> لصنع الايقونة.`,
officialWebsite: 'الموقع الرسمي',
officialRepo: 'مستودع المكتبة الرسمي',
officialWebuiRepo: 'مستودع واجهة الويب الرسمي',
officialSubreddit: 'السب ريدت الرسمي',
newsChannel: 'قناة الاخبار',
beforeReporting: `قبل ان تبلغ عن خطأ، تأكد من أنك تشغل أحدث إصدار من التطبيق وأن ما تريد الإبلاغ عنه هو في الواقع خطأ وليس مشكلة من جهتك.`,
beSure: `تأكد من أن الخطأ يمكن إعادة إنتاجه على أجهزة أخرى و ايضاً <strong>لا</strong> تبلغ علة خطأ تم التبليغ عنه سابقاً.`,
duplicateReports: 'سيتم إغلاق تقارير الأخطاء المكررة ، لذلك ترقب ذلك.',
dontOpenIssues: `<strong>DO NOT</strong> open issues for asking questions, there is a subreddit for that.`,
acceptFeatures: `أقبل اقتراحات الميزات أيضًا ، ولكن لا أشياء معقدة ، فقط اشياء يمكنني تنفيذها مباشرة في التطبيق وليس في المكتبة.`,
otherLanguages: `إذا كنت تجيد لغة برمجة أخرى ، يمكنك محاولة تحويل ديمكس إلى لغات برمجة أخرى!`,
understandingCode: `أنت بحاجة إلى مساعدة في فهم الكود؟ فقط اتصل بـ RemixDev على تيليكرام او ريديت.`,
itsFree: `يجب ان تتذكر ان <strong>هذا هو مشروع مجاني</strong> <strong>و عليك دعم الفنانين المفضلين لك قبل ان تدعم مطورين البرنامج</strong>.`,
notObligated: `لا تشعر بالالتزام بالتبرع ، لكني أقدر ذلك على أي حال!`,
},
charts: {
title: 'قائمة الجداول',
changeCountry: 'تغيير الدولة',
download: 'تحميل قائمة الجدول'
},
errors: {
title: 'خطأ في {name}',
ids: {
invalidURL: 'الرابط غير صحيح',
unsupportedURL: 'الرابط غير متاح حتى الانً',
ISRCnotOnDeezer: 'رمز المقطع غير متوفر في ديزر',
notYourPrivatePlaylist: "لا يمكنك تحميل قوائم التشغيل الخاصة و المخفية.",
spotifyDisabled: 'لم يتم اعداد ميزات سبوتفاي بالطرقة الصحيحة .',
trackNotOnDeezer: 'المقطع لا يوجد في ديزر!',
albumNotOnDeezer: 'الالبوم لا يوجد في ديزر!',
notOnDeezer: 'المقطع لا يوجد في ديزر!',
notEncoded: 'لم يتم تشفير المقطع حتى الانً!',
notEncodedNoAlternative: 'لم يتم تشفير المقطع حتى الآن ولم يتم العثور على بديل!',
wrongBitrate: 'لم يتم العثور على المقطع في الدقة المطلوبة.',
wrongBitrateNoAlternative: 'لم يتم العثور على المقطع في الدقة المطلوبة و لا توجد دقة بديلة!',
no360RA: 'المقطع غير متوفر في Reality Audio 360.',
notAvailable: "المقطع غير متوفر في سيرفرات ديزر!",
notAvailableNoAlternative: "المقطع غير متوفر في سيرفرات ديزر و لا يوجد بديل حتى الان!"
}
},
favorites: {
title: 'المفضلات',
noPlaylists: 'لا يوجد قوائم تشغيل',
noAlbums: 'لم لا توجد البومات مفضلة',
noArtists: 'لا يوجد فنانين مفضلين',
noTracks: 'لا توجد مقاطع مفضلة'
},
home: {
needTologin: 'يجب عليك التسجيل في حساب ديزر قبل بدء التحميل.',
openSettings: 'فتح الاعدادات',
sections: {
popularPlaylists: 'قوائم تشغيل مشهورة',
popularAlbums: 'اكثر الالبومات سماعأ'
}
},
linkAnalyzer: {
info: 'يمكنك استخدام هذا القسم للعثور على مزيد من المعلومات حول الرابط الذي تحاول تنزيله.',
useful:
" كمثال هذا مفيد إذا كنت تحاول تنزيل بعض المقاطع الغير المتاحة في بلدك وتريد معرفة مكان توفرها .",
linkNotSupported: 'هذا الرابط غير معتمد حتى الآن',
linkNotSupportedYet: 'يبدو أن هذا الرابط غير معتمد حتى الآن ، حاول تحليل رابط آخر.',
table: {
id: 'ID',
isrc: 'ISRC',
upc: 'UPC',
duration: 'المدة الزمنية',
diskNumber: 'رقم القرص',
trackNumber: 'رقم المقطع',
releaseDate: 'تاريخ الاصدار',
bpm: 'BPM',
label: 'Label',
recordType: 'نوع التسجيل',
genres: 'النوع الفني',
tracklist: 'قائمة المقاطع'
}
},
search: {
startSearching: 'ابدأ البحث!',
description:
'يمكنك البحث عن مقطع ، ألبوم كامل ، فنان ، قائمة تشغيل .... كل شيء! يمكنك أيضًا لصق رابط ديزر',
fans: '{n} متابعون',
noResults: 'لا يوجد نتائج',
noResultsTrack: 'لم يتم العثور على مقاطع',
noResultsAlbum: 'لم يتم العثور على البومات',
noResultsArtist: 'لم يتم العثور على فنانين',
noResultsPlaylist: 'لم يتم العثور على قوائم تشغيل'
},
searchbar: 'ابحث عن أي شيء تريده (أو الصق رابط)',
downloads: 'التحميلات',
toasts: {
addedToQueue: '{item} تمت إلأضافة إلى قائمة الانتظار',
alreadyInQueue: '{item} حالياً في قائمة الانتظار!',
finishDownload: '{item} انتهى تحميل.',
allDownloaded: 'اكتملت جميع التنزيلات!',
refreshFavs: 'اكتمل التحديث!',
loggingIn: 'جار تسجيل الدخول...',
loggedIn: 'تم تسجيل الدخول',
alreadyLogged: 'تم تسجيل الدخول بالفعل',
loginFailed: "تعذر تسجيل الدخول",
loggedOut: 'تم تسجيل الخروج',
cancellingCurrentItem: 'جار الغاء العنصر الحالي.',
currentItemCancelled: 'تم الغاء العنصر الحالي.',
startAddingArtist: 'جار اضافة {artist} البوم الى قائمة الانتضار',
finishAddingArtist: 'تم اضافة {artist} البوم الى قائمة الانتضار',
startConvertingSpotifyPlaylist: 'جار تحويل مقاطع سبوتفاي الى مقاطع ديزر',
finishConvertingSpotifyPlaylist: 'تم تحويل قائمة تشغيل سبوتفاي',
loginNeededToDownload: 'يجب عليك تسجيل الدخول لتحميل المقاطع!'
},
settings: {
title: 'الاعدادات',
languages: 'اللغات',
login: {
title: 'تسجيل الدخول',
loggedIn: 'تم تسجيل الدخول كـ {username}',
arl: {
question: 'كيفية الحصول علة ARL',
update: 'ارفع ال ARL'
},
logout: 'تسجيل الخروج'
},
appearance: {
title: 'المظهر',
slimDownloadTab: 'لوحة التحميل الرفيعة'
},
downloadPath: {
title: 'مسار التحميل'
},
templates: {
title: 'القوالب',
tracknameTemplate: 'قالب اسم المقطع',
albumTracknameTemplate: 'قالب مقطع الالبوم',
playlistTracknameTemplate: 'قالب مقطع قائمة التشغيل'
},
folders: {
title: 'الملفات',
createPlaylistFolder: 'اصنع ملف لقائمة التشغيل',
playlistNameTemplate: 'قالب ملف قائمة التشغيل',
createArtistFolder: 'اصنع ملف للفنان',
artistNameTemplate: 'قالب ملف الفنان',
createAlbumFolder: 'اصنع ملف للالبوم',
albumNameTemplate: 'قالب ملف الالبوم',
createCDFolder: 'اصنع ملف للاقراص',
createStructurePlaylist: 'اصنع هيكل مجلدات لقوائم التشغيل',
createSingleFolder: 'اصنع هيكل مجلدات لالبومات ذات الاغنية الواحدة'
},
trackTitles: {
title: 'عنوان المقطع',
padTracks: 'Pad tracks',
paddingSize: 'Overwrite padding size',
illegalCharacterReplacer: 'محول الكتابات الغير مسموح بها'
},
downloads: {
title: 'التحميلات',
queueConcurrency: 'التنزيلات المتزامنة',
maxBitrate: {
title: 'الدقة المفضلة',
9: 'FLAC 1411kbps',
3: 'MP3 320kbps',
1: 'MP3 128kbps'
},
overwriteFile: {
title: 'هل يمكنني استبدال الملفات?',
y: 'نعم, استبدال الملفات',
n: "لا, لا تبدل الملفات",
t: 'استبدل العلامات فقط',
b: 'لا ، احتفظ بالملفين وأضف رقمًا إلى الملف المكرر'
},
fallbackBitrate: 'تراجع الدقة',
fallbackSearch: 'تراجع البحث',
logErrors: 'إنشاء ملفات سجل للأخطاء',
logSearched: 'إنشاء ملفات سجل للمقاطع التي تم البحث عنها',
createM3U8File: 'انشاء ملف لقوائم التشغيل',
syncedLyrics: 'انشاء ملف لكلمات الاغنية',
playlistFilenameTemplate: 'قالب اسم ملف قائمة التشغيل',
saveDownloadQueue: 'حفظ قائمة انتظار التنزيل عند إغلاق التطبيق'
},
covers: {
title: 'غلاف الالبوم',
saveArtwork: 'احفظ الغلاف',
coverImageTemplate: 'تغطية قالب الاسم',
saveArtworkArtist: 'احفظ صورة الفنان',
artistImageTemplate: 'قالب صورة الفنان',
localArtworkSize: 'حجم الصورة',
embeddedArtworkSize: 'حجم الصورة المدمجة',
localArtworkFormat: {
title: 'بأي صيغة تريد حفظ الصورة?',
jpg: 'jpeg صورة',
png: 'png صورة',
both: 'الاثنين png و jpeg'
},
jpegImageQuality: 'JPEG دقة صورة'
},
tags: {
head: 'العلامات التي يتم حفظها',
title: 'العنوان',
artist: 'الفنان',
album: 'الالبوم',
cover: 'الغلاف',
trackNumber: 'رقم المقطع',
trackTotal: 'مجموع المقاطع',
discNumber: 'رقم القرص',
discTotal: 'مجموع الاقراص',
albumArtist: 'فنان الالبوم',
genre: 'Genre',
year: 'السنة',
date: 'التاريخ',
explicit: 'كلمات اغنية صريحة للكبار',
isrc: 'ISRC',
length: 'طول المقطع',
barcode: 'Album Barcode (UPC)',
bpm: 'BPM',
replayGain: 'Replay Gain',
label: 'Album Label',
lyrics: 'كلمات غير متزامنة',
copyright: 'حقوق النشر',
composer: 'ملحن',
involvedPeople: 'الناس المشتركون'
},
other: {
title: 'غير',
savePlaylistAsCompilation: 'حفظ قوائم التشغيل كمجموعة',
useNullSeparator: 'استخدم فاصل فارغ',
saveID3v1: 'احفظ ملف ID3v1',
multiArtistSeparator: {
title: 'كيف تريد فصل الفنانين?',
nothing: 'احفظ الفنان الرئيسي فقط',
default: 'استخدام المواصفات القياسية',
andFeat: 'استخدام& و feat.',
using: 'استخدام "{separator}"'
},
singleAlbumArtist: 'احفظ فقط فنان الألبوم الرئيسي',
albumVariousArtists: 'احتفظ بـ "فنانين متنوعين" في ألبوم الفنانين',
removeAlbumVersion: 'إزالة "إصدار الألبوم" من عنوان المسار',
removeDuplicateArtists: 'إزالة مجموعات الفنانين',
dateFormat: {
title: 'صيغة التاريخ لملفات flac',
year: 'س س س س',
month: 'ش ش',
day: 'ي ي'
},
featuredToTitle: {
title: 'ماذا علي أن أفعل مع الفنانين الغير رئيسيين ?',
0: 'لا شيء',
1: 'حذفه من العنوان',
3: 'حذفه من عنوان الاغنية و الالبوم',
2: 'وضعه في العنوان'
},
titleCasing: 'نوع كتابة العناون',
artistCasing: 'نوع كتابة الفنان',
casing: {
nothing: 'بدون تغيير',
lower: 'احرف صغيرة',
upper: 'احرف كبيرة',
start: 'حرف كبير في بداية كل كلمة',
sentence: 'مثل جملة'
},
previewVolume: 'معاينة الحجم',
executeCommand: {
title: 'الأمر للتنفيذ بعد التنزيل',
description: 'اتركه فارغًا بدون إجراء'
}
},
spotify: {
title: 'مميزات سبوتفاي',
clientID: 'معرف عميل سبوتفاي',
clientSecret: 'الكود السري لعميل سبوتفاي',
username: 'اسم مستخدم سبوتفاي'
},
reset: 'إعادة تعيين إلى الافتراضي',
save: 'حفظ',
toasts: {
init: 'تم تحميل الإعدادات!',
update: 'تم تحديث الاعدادات!',
ARLcopied: 'تم نسخ ARL إلى الحافظة'
}
},
sidebar: {
home: 'الرئيسية',
search: 'بحث',
charts: 'قائمة الجداول',
favorites: 'المفضلة',
linkAnalyzer: 'محلل الروابط',
settings: 'الاعدادات',
about: 'حول'
},
tracklist: {
downloadSelection: 'تحميل الاختيار'
}
};
const ko = {
globals: {
welcome: '잘왔다, deemix에',
back: '뒤로',
loading: '불러오는 중',
download: '{thing} 다운로드',
by: 'by {artist}',
in: 'in {album}',
download_hint: '다운로드',
play_hint: '재생',
toggle_download_tab_hint: '펼치기/접기',
clean_queue_hint: '비우기 완료',
cancel_queue_hint: '모두 취소',
open_downloads_folder: '다운로드 폴더 열기',
cut: '잘라내기',
copy: '복사',
copyLink: '링크 복사',
copyImageLink: '이미지 링크 복사',
copyDeezerLink: 'deezer 링크 복사',
paste: '붙여넣기',
listTabs: {
empty: '',
all: '전체',
top_result: '가장 일치하는 결과',
album: '앨범 | 앨범',
artist: '아티스트 | 아티스트',
single: '싱글 | 싱글',
title: '제목 | 제목',
track: '트랙 | 트랙',
trackN: '0 트랙 | {n} 트랙 | {n} 트랙',
releaseN: '0 발매 | {n} 발매 | {n} 발매',
playlist: '재생목록 | 재생목록',
compile: '편찬물 | 편찬물',
ep: 'ep | eps',
more: '더 많은 앨범',
featured: '특집',
spotifyPlaylist: '스포티파이 재생목록 | 스포티파이 재생목록',
releaseDate: '발매일자',
error: '오류'
}
},
about: {
titles: {
usefulLinks: '유용한 링크',
bugReports: '버그 제보',
contributing: '기여자',
donations: '후원',
license: '이용정책'
},
subtitles: {
bugReports: "무언가 안되는 것이 있다고요? 말해주세요!",
contributing: '이 프로젝트에 기여하고 싶다고요? 어렵지 않아요!',
donations: '금전적으로 지원하고 싶다고요? 후원하세요!'
},
usesLibrary: '이 프로그램은 <strong>deemix</strong> 라이브러리를 사용합니다, 해당 라이브러리로 자신만의 deemix를 만들 수 있습니다.',
thanks: `이 프로젝트를 도와준 <strong>rtonno</strong>, <strong>uhwot</strong> 그리고 <strong>lollilol</strong>님과 아이콘을 만들어준 <strong>BasCurtiz</strong> 그리고 <strong>scarvimane</strong>님에게 감사를.`,
upToDate: {
text: `새로운 업데이트 소식을 듣고 싶으면 텔레그램 {newsChannel}을 참고하세요.`,
newsChannel: '새소식 정보통'
},
officialWebsite: '공식 웹사이트',
officialRepo: '공식 라이브러리 저장소',
officialWebuiRepo: '공식 WebUI 저장소',
officialSubreddit: '공식 서브레딧',
newsChannel: '새 소식 알리미',
questions: {
text: `프로그램에 대한 질문이나 문제에 관한 것은, 먼저 {subreddit}에서 답변을 검색해보세요. 그리고, 서브레딧에서 답변을 찾기 못한 경우에 다음 순서를 이용해주세요.`,
subreddit: '서브레딧'
},
beforeReporting: `버그 제보를 하기 전에 먼저 최신 버전의 프로그램을 실행하고 있는지, 제보하고자 하는 것이 버그이지 오로지 당신의 목적을 이루기 위한 요구가 아님을 확인해주세요.`,
beSure: `해당 버그가 다른 장치에서도 재현이 가능한지 확인하고 이미 제보된 버그의 경우에는 중복해서 <strong>보고하지 마세요</strong>.`,
duplicateReports: '중복된 버그 제보의 경우는 해당 요청을 닫을 것이니, 두 눈 뜨고 지켜보세요.',
dontOpenIssues: `질문에 관한 것은 이슈를 <strong>열지 마세요</strong>, 서브레딧이 있습니다.`,
newUI: {
text: `만약 당신이 파이썬에 능통하고 기본적인 라이브러리를 이용하여 새로운 UI를 만들었거나, 라이브러리의 버그를 수정하였다면 {repo}에 풀 리퀘스트 해주세요.`,
repo: '저장소'
},
acceptFeatures: `복잡하지 않은 기능 추가도 받습니다, 라이브러리가 아닌 앱에서 직접 구현할 수 있는 것으로요.`,
otherLanguages: `당신이 다른 프로그램 언어에 능통하면, 이 deemix 프로그램을 다른 프로그래밍 언어로 포팅할 수도 있습니다!`,
understandingCode: `코드를 이해하는 데 도움이 필요합니까? 위에 있는 RemixDev, 텔레그램, 서브레딧 링크를 누르세요.`,
contributeWebUI: {
text: `만약 당신이 Vue.js (JavaScript), HTML 또는 CSS 개발자라면 {webui}에 도움을 주세요.`,
webui: 'WebUI'
},
itsFree: `사용하기 전에 이 프로그램이 <strong>무료 프로젝트</strong>이고 개발자를 지원하기 전에 <strong>예술가들</strong>을 먼저 지원해야 함을 기억하세요.`,
notObligated: `기부는 프로젝트를 지속할 수 있는 동력이 됩니다!`,
lincensedUnder: {
text: `이 작업이 요구하고 있는 라이센스는 아래와 같습니다 {gpl3}.`,
gpl3: 'GNU General Public License 3.0'
}
},
charts: {
title: '차트',
changeCountry: '국가 변경',
download: '차트 다운로드'
},
errors: {
title: '오류 발생: {name}',
ids: {
unsupportedURL: 'URL 지원 누락',
invalidURL: 'URL 인식 실패',
ISRCnotOnDeezer: '트랙 코드 식별이 불가능합니다',
notYourPrivatePlaylist: "다른 사람의 비공개 재생 목록을 다운로드 할 수 없습니다.",
spotifyDisabled: '스포티파이 기능이 올바르게 설정되지 않았습니다.',
trackNotOnDeezer: 'Deezer에서 트랙을 찾을 수 없습니다!',
albumNotOnDeezer: 'Deezer에서 앨범을 찾을 수 없습니다!',
notOnDeezer: 'Deezer에서 트랙을 찾을 수 없습니다!',
notEncoded: '트랙이 아직 변환(encode)되지 않았습니다!',
notEncodedNoAlternative: '트랙이 아직 변환(encode)되지 않았을 뿐더러 대체할 것을 찾지 못했습니다!',
wrongBitrate: '요구하는 비트레이트의 트랙을 찾을 수 없습니다.',
wrongBitrateNoAlternative: '요구하는 비트레이트를 찾을 수 없을 뿐더러 대체할 것을 찾지 못했습니다!',
no360RA: '해당 트랙은 360 리얼리티 오디오에 존재하지 않습니다.',
notAvailable: "해당 트랙은 Deezer 서버에 존재하지 않습니다!",
notAvailableNoAlternative: "해당 트랙은 Deezer 서버에 존재하지 않을 뿐더러 대체할 것을 찾지 못했습니다!",
noSpaceLeft: "장치에 여유 공간이 없습니다!",
albumDoesntExists: "트랙의 앨범이 존재하지 않습니다, 정보 수집에 실패했습니다."
}
},
favorites: {
title: '즐겨듣는 음악',
noPlaylists: '즐겨듣는 재생목록이 없습니다',
noAlbums: '즐겨듣는 앨범이 없습니다',
noArtists: '즐겨듣는 아티스트가 없습니다',
noTracks: '즐겨듣는 트랙이 없습니다'
},
home: {
needTologin: '다운로드를 시작하기 전에 Deezer 계정에 로그인을 해야합니다.',
openSettings: '설정 열기',
sections: {
popularPlaylists: '인기있는 재생목록',
popularAlbums: '가장 많이 재생된 앨범'
}
},
linkAnalyzer: {
info: '이 항목에서는 다운로드를 시도할 링크에 대한 더 많은 정보를 찾을 수 있습니다.',
linkNotSupported: '해당 링크는 아직 지원하지 않습니다',
useful: "접속한 국가에서는 재생할 수 없는 특정 트랙을 다운로드 하기 위해서 가능한 국가를 찾는데 유용하게 쓰입니다.",
linkNotSupportedYet: '해당 링크는 아직 지원하지 않습니다, 다른 링크로 시도해보세요.',
table: {
id: 'ID',
isrc: 'ISRC',
upc: 'UPC',
duration: '길이',
diskNumber: '디스크 번호',
trackNumber: '트랙 번호',
releaseDate: '발매일자',
bpm: 'BPM',
label: '라벨',
recordType: '녹음 종류',
genres: '장르',
tracklist: '트랙목록'
}
},
search: {
startSearching: '검색을 해보세요!',
description: '트랙, 아티스트, 재생목록, Deezer 링크 등으로 검색할 수 있습니다!',
fans: '{n}명의 팬들',
noResults: '결과 없음',
noResultsTrack: '발견된 트랙 없음',
noResultsAlbum: '발견된 앨범 없음',
noResultsArtist: '발견된 아티스트 없음',
noResultsPlaylist: '발견된 재생목록 없음'
},
searchbar: '원하는 것을 검색하세요 (링크를 붙여넣을 수도 있습니다)',
downloads: '다운로드들',
toasts: {
restoringQueue: '다운로드 대기 열 복원중...',
queueRestored: '다운로드 대기 열이 복원되었습니다!',
addedToQueue: '대기열에 {item}(이)가 추가되었습니다',
addedMoreToQueue: '대기열에 {n} 항목이 추가되었습니다',
alreadyInQueue: '{item}(이)가 이미 대기열에 존재합니다!',
finishDownload: '{item} 항목이 다운로드 완료되었습니다.',
allDownloaded: '모든 다운로드가 완료되었습니다!',
refreshFavs: '새로고침이 완료되었습니다!',
loggingIn: '로그인 하는 중...',
loggedIn: '로그인 되었습니다',
alreadyLogged: '이미 로그인되어 있습니다',
loginFailed: "로그인 할 수 없습니다",
loggedOut: '로그아웃 하였습니다',
cancellingCurrentItem: '현재 항목을 취소 중입니다.',
currentItemCancelled: '항목이 취소되었습니다.',
startAddingArtist: '{artist} 앨범을 대기열에 추가 중입니다',
finishAddingArtist: '{artist} 앨범이 대기열에 추가되었습니다',
startConvertingSpotifyPlaylist: '스포티파이 트랙을 Deezer 트랙으로 전환 중입니다',
finishConvertingSpotifyPlaylist: '스프토파이 재생 목록이 전환되었습니다',
loginNeededToDownload: '트랙을 다운로드하려면 로그인이 필요합니다!',
deezerNotAvailable: 'Deezer 사이트는 현재 귀하의 국가에서 사용이 불가능합니다. VPN을 사용하세요.'
},
settings: {
title: '설정',
languages: '언어',
login: {
title: '로그인',
loggedIn: '{username}(으)로 로그인되었습니다',
arl: {
question: 'ARL을 어떻게 확인합니까?',
update: 'ARL 업데이트'
},
logout: '로그아웃',
question: '스포티파이 기능들을 쓰려면 어떻게 해야합니까?'
},
appearance: {
title: '외관',
slimDownloadTab: '얇은 다운로드 탭'
},
downloadPath: {
title: '다운로드 경로'
},
templates: {
title: '템플릿',
tracknameTemplate: '트랙이름 템플릿',
albumTracknameTemplate: '앨범 트랙 템플릿',
playlistTracknameTemplate: '재생목록 트랙 템플릿'
},
folders: {
title: '폴더',
createPlaylistFolder: '재생목록을 위한 폴더 생성',
playlistNameTemplate: '재생목록 폴더 템플릿',
createArtistFolder: '아티스트를 위한 폴더 생성',
artistNameTemplate: '아티스트 폴더 템플릿',
createAlbumFolder: '앨범을 위한 폴더 생성',
albumNameTemplate: '앨범 폴더 템플릿',
createCDFolder: 'CD를 위한 폴더 생성',
createStructurePlaylist: '재생목록을 위한 폴더 구조 생성',
createSingleFolder: '싱글 앨범을 위한 폴더 구조 생성'
},
trackTitles: {
title: '트랙 제목',
padTracks: '트랙 채워넣기',
paddingSize: '채워넣을 크기',
illegalCharacterReplacer: '지원하지 않는 글자 대체'
},
downloads: {
title: '다운로드',
queueConcurrency: '동시 다운로드',
maxBitrate: {
title: '선호하는 비트레이트',
9: 'FLAC 1411kbps',
3: 'MP3 320kbps',
1: 'MP3 128kbps'
},
overwriteFile: {
title: '파일을 덮어쓸까요?',
y: '네, 파일을 덮어쓰세요',
n: "아뇨, 파일을 덮어쓰지 마세요",
t: '태그만 덮어쓰세요',
b: '아뇨, 양쪽 다 놔두고 중복되는 파일에 번호를 추가하세요',
e: "아뇨, 확장명을 변경하세요"
},
fallbackBitrate: '비트레이트 대비책',
fallbackSearch: '검색 대비책',
logErrors: '오류 발생시 로그 파일 생성',
logSearched: '검색한 트랙에 대한 로그 파일 생성',
createM3U8File: '재생목록 파일 생성',
syncedLyrics: '.lyr 파일 생성 (가사 동기화)',
playlistFilenameTemplate: '재생목록 파일이름 템플릿',
saveDownloadQueue: '프로그램을 닫을 때 다운로드 대기열 저장'
},
covers: {
title: '앨범 커버',
saveArtwork: '커버 저장',
coverImageTemplate: '커버 이름 템플릿',
saveArtworkArtist: '아티스트 이미지 저장',
artistImageTemplate: '아티스트 이미지 템플릿',
localArtworkSize: '외부 저장 그림 크기',
embeddedArtworkSize: '내부 저장 그림 크기',
localArtworkFormat: {
title: '별도로 저장할 그림의 형식을 무엇으로 하시겠습니까?',
jpg: 'jpeg 이미지',
png: 'png 이미지',
both: 'jpeg와 png 둘 다'
},
jpegImageQuality: 'JPEG 이미지 품질',
embeddedArtworkPNG: '포함된 그림의 형식을 PNG로 저장합니다',
embeddedPNGWarning: 'PNG는 Deezer에서 공식적으로 지원하지 않기 때문에 버그가 있을 수 있습니다',
imageSizeWarning: 'x1200 크기를 초과해서는 Deezer에서 공식적으로 사용되지 않기 때문에 문제가 생길 수 있습니다',
coverDescriptionUTF8: '커버 설명을 UTF8 포맷을 이용해 저장합니다 (iTunes 커버 오류 해결)'
},
tags: {
head: '저장할 태그를 선택하세요',
title: '제목',
artist: '아티스트',
album: '앨범',
cover: '커버',
trackNumber: '트랙 번호',
trackTotal: '전체 트랙 크기',
discNumber: '디스크 번호',
discTotal: '전체 디스크 수',
albumArtist: '앨범 아티스트',
genre: '장르',
year: '연도',
date: '일자',
explicit: '노골적 가사',
isrc: 'ISRC',
length: '트랙 길이',
barcode: '앨범 바코드 (UPC)',
bpm: 'BPM',
replayGain: '리플레이 게인',
label: '앨범 라벨',
lyrics: '비동기 가사',
copyright: '저작권',
composer: '작곡가',
involvedPeople: '관련있는 사람들'
},
other: {
title: '기타',
savePlaylistAsCompilation: '재생목록을 편찬물로 저장',
useNullSeparator: 'null 구분자 사용',
saveID3v1: 'ID3v1 태그 형식으로 저장',
multiArtistSeparator: {
title: '아티스트를 어떻게 구분하시겠습니까?',
nothing: '주요 아티스트만 저장',
default: '표준 스펙을 사용',
andFeat: '& 기호와 feat 사용.',
using: '"{separator}" 사용'
},
singleAlbumArtist: '주요 앨범 아티스트만 저장',
albumVariousArtists: '앨범 아티스트에 "Various Artists"(다양한 아티스트들) 유지',
removeAlbumVersion: '트랙 제목에 "Album Version"(앨범 버전) 제거',
removeDuplicateArtists: '아티스트들의 협업 제거',
dateFormat: {
title: 'FLAC 파일의 날짜 형식',
year: 'YYYY',
month: 'MM',
day: 'DD'
},
featuredToTitle: {
title: '특집에 참여한 아티스트들에 할 수 있는 것이 무엇이 있나요?',
0: '아무것도 하지 않음',
1: '제목에서 제거',
3: '앨범 제목과 트랙에서 제거',
2: '제목으로 이동'
},
titleCasing: '제목 케이싱',
artistCasing: '아티스트 케이싱',
casing: {
nothing: '변함없이 유지',
lower: '소문자로',
upper: '대문자로',
start: '각 단어 앞 글자를 대문자로',
sentence: '문장처럼'
},
previewVolume: '미리듣기 볼륨',
executeCommand: {
title: '다운로드 후 실행할 명령어',
description: '빈칸으로 두면 아무 일도 없습니다'
}
},
spotify: {
title: '스포티파이 기능',
clientID: 'Spotify ClientID',
clientSecret: 'Spotify Client Secret',
username: 'Spotify 사용자이름'
},
reset: '기본 설정으로 초기화',
save: '저장',
toasts: {
init: '설정을 불러왔습니다!',
update: '새로운 설정으로 갱신되었습니다!',
ARLcopied: 'ARL가 클립보드에 복사되었습니다'
}
},
sidebar: {
home: '홈',
search: '검색',
charts: '차트',
favorites: '즐겨찾기',
linkAnalyzer: '링크 분석기',
settings: '설정',
about: '정보'
},
tracklist: {
downloadSelection: '선택 다운로드'
}
};
const ph = {
globals: {
welcome: 'Welcome sa deemix',
back: 'bumalik',
loading: 'kumakarga',
download: 'I-download {thing}',
by: 'ayon sa {artist}',
in: 'sa {album}',
download_hint: 'I-download',
play_hint: 'I-play',
toggle_download_tab_hint: 'Palakihin/Paliitan',
clean_queue_hint: 'Natapos na ang Pag-alis',
cancel_queue_hint: 'Ikansel Lahat',
open_downloads_folder: 'Buksan ang Polder ng Download',
cut: 'i-cut',
copy: 'kopyahin',
copyLink: 'kopyahin ang link',
copyImageLink: 'kopyahin ang imahe sa link',
copyDeezerLink: 'kopyahin ang link ng deezer',
paste: 'idikit',
listTabs: {
empty: '',
all: 'lahat',
top_result: 'nangungunang resulta',
album: 'album | mga album',
artist: 'artist | mga artist',
single: 'single | mga single',
title: 'pamagat | mga pamagat',
track: 'track | mga track',
trackN: '0 mga track | {n} track | {n} mga track',
releaseN: '0 mga release | {n} release | {n} mga release',
playlist: 'playlist | mga playlist',
compile: 'pinagsama | mga pinagsama',
ep: 'ep | mga ep',
bundle: 'bundle | mga bundle',
more: 'Iba pang mga album',
featured: 'Ibinida sa',
spotifyPlaylist: 'playlist sa spotify | mga playlist sa spotify',
releaseDate: 'petsa ng paglabas',
error: 'error'
}
},
about: {
updates: {
currentVersion: 'Kasalukuyang version',
versionNotAvailable: 'H/P',
updateAvailable: `Hindi mo ginagamit ang pinakabagong version: {version}`,
deemixVersion: 'deemix lib version'
},
titles: {
usefulLinks: 'Nakatutulong na mga Link',
bugReports: 'Report sa Bug',
contributing: 'Pagtulong',
donations: 'Mga donasiyon',
license: 'Lisensiya'
},
subtitles: {
bugReports: "Meron bang hindi gumagana sa deemix? Ipaalam mo sa amin!",
contributing: 'Gusto mo bang tumulong sa proyektong ito? Pwede mong gawin iyan sa maraming paraan!',
donations: 'Gusto mo bang tumulong sa pamamagitan ng pera? Pwede kang magbigay ng donasiyon!'
},
usesLibrary: 'Ang app na ito ay gumagamit ng library galing sa <strong>deemix</strong>, na kung saan ay pwede mong gamitin para gumawa ng sarili mong UI ng deemix.',
thanks: `Salamat kay <strong>rtonno</strong>, <strong>uhwot</strong> at <strong>lollilol</strong> sa pagtulong sa akin para sa proyektong ito at kay <strong>BasCurtiz</strong> at <strong>scarvimane</strong> sa paggawa ng icon.`,
upToDate: {
text: `Huwag magpapahuli sa mga update patungkol dito sa pamamagitan ng pagsali sa {newsChannel} sa Telegram.`,
newsChannel: 'news channel'
},
officialWebsite: 'Opisyal na Website',
officialRepo: 'Opisyal na Library Repository',
officialWebuiRepo: 'Opisyal na Repository ng WebUI',
officialSubreddit: 'Opisyal na Subreddit',
newsChannel: 'News Channel',
questions: {
text: `Kung may tanong ka o problema sa app, maghanap ka muna ng solusiyon sa {subreddit}. Ngayon, kung wala ka talagang mahanap ay pwede kang mag-post patungkol sa iyong isyu doon sa subreddit.`,
subreddit: 'subreddit'
},
beforeReporting: `Bago ka magreport ng bug, siguraduhing pinakabagong version ang ginagamit mo at ang ire-report mo ay talagang bug at hindi dahil sa pagkakamali mo lang ng paggamit.`,
beSure: `Siguraduhing nangyayari rin ang bug sa iba't ibang plataporma at tsaka <strong>HUWAG</strong> mo nang i-report ang bug kung ito ay naipa-alam na ng iba.`,
duplicateReports: 'Isasara namin ang mga magkaparehong report sa bug, kaya alamin mo muna.',
dontOpenIssues: `<strong>HUWAG</strong> kayong magbubukas ng isyu kung magtatanong lang kayo, meron tayong subreddit para diyan.`,
newUI: {
text: `Kung ikaw ay maraming alam sa python, subukan mong gumawa ng bagong UI gamit ng base library, o kaya ayusin ang mga bug sa library sa pamamagitan ng pag-pull ng request sa {repo}.`,
repo: 'repo'
},
acceptFeatures: `Tumatangggap din ako ng mga feature, basta hindi komplikado, dahil diretso ko itong nilalagay sa app at hindi sa library.`,
otherLanguages: `Kung ikaw ay maraming alam sa ibang programming language, maaari mo ring subukan i-port ang deemix sa iba't ibang programming language!`,
understandingCode: `Kailangan mo ba ng tulong para maintindihan ang code? Bisitahin si RemixDev sa Telegram o sa Reddit.`,
contributeWebUI: {
text: `Kung may alam ka sa Vue.js (JavaScript), HTML o kaya CSS, maaari kang sumali at tumulong dito sa {webui}.`,
webui: 'WebUI'
},
itsFree: `Lagi mong tandaang <strong>ang proyektong ito ay libre</strong> at <strong>suportuhanmuna ang minamahal ninyong mga artist</strong> bago ang mga developer.`,
notObligated: `Huwag mong pilitin ang sarili para mag-donate, Naiintindihan ka namin!`,
lincensedUnder: {
text: `Ang aktibidad na ito ay lisensiyado sa {gpl3}.`,
gpl3: 'GNU General Public License 3.0'
}
},
charts: {
title: 'Mga Chart',
changeCountry: 'Palitan ang Country',
download: 'I-download ang Chart'
},
errors: {
title: 'Mga error sa {name}',
ids: {
invalidURL: 'Hindi makilala ang URL',
unsupportedURL: 'Hindi pa suportado ang URL',
ISRCnotOnDeezer: 'Ang Track ISRC ay hindi pwede sa Deezer',
notYourPrivatePlaylist: "Hindi pwedeng i-download ang mga pribadong playlist ng iba.",
spotifyDisabled: 'Hindi mo nai-set nang tama ang Spotify Features.',
trackNotOnDeezer: 'Hindi mahanap ang track sa Deezer!',
albumNotOnDeezer: 'Hindi mahanap ang album sa Deezer!',
notOnDeezer: 'Hindi available ang track sa Deezer!',
notEncoded: 'Hindi pa nae-encode ang track!',
notEncodedNoAlternative: 'Hindi pa nae-encode ang track at walang mahanap na iba!',
wrongBitrate: 'Hindi mahanap ang track sa gusto mong bitrate.',
wrongBitrateNoAlternative: 'Hindi mahanap ang track sa gusto mong bitrate at walang mahanap na iba!',
no360RA: 'Hindi pwede ang track para sa Reality Audio 360.',
notAvailable: "Walang available na track sa server ng Deezer!",
notAvailableNoAlternative: "Walang available na track sa server ng Deezer at walang mahanap na iba!",
noSpaceLeft: "Wala nang natitirang space sa iyong device!"
}
},
favorites: {
title: 'Mga Paborito',
noPlaylists: 'Walang makitang mga Playlist',
noAlbums: 'Walang makitang mga Paboritong Album',
noArtists: 'Walang makitang mga Paboritong Artist',
noTracks: 'Walang makitang mga Paboritong Track'
},
home: {
needTologin: 'Kailangan mong mag-log in sa iyong Deezer account bago ka makasimulang magdownload.',
openSettings: 'Buksan ang Mga Setting',
sections: {
popularPlaylists: 'Mga sikat na playlist',
popularAlbums: 'Pinakamaraming pinakikinggang mga album'
}
},
linkAnalyzer: {
info: 'Pwede gamitin ang section na ito para sa iba pang impormasyon patungkol sa link na gusto mong i-download.',
useful: "Makatutulong ito kung meron kang gustong i-download na track na hindi available sa bansa mo at gusto mong malaman kung meron bang ganito kapag sa iba.",
linkNotSupported: 'Hindi pa suportado ang link',
linkNotSupportedYet: 'Mukhang hindi pa suportado itong link, iba na lang ang ilagay mo.',
table: {
id: 'ID',
isrc: 'ISRC',
upc: 'UPC',
duration: 'Haba',
diskNumber: 'Bilang ng Disk',
trackNumber: 'Bilang ng Track',
releaseDate: 'Petsa ng Release',
bpm: 'BPM',
label: 'Label',
recordType: 'Uri ng Rekord',
genres: 'Mga Genre',
tracklist: 'Listahan ng Track'
}
},
search: {
startSearching: 'Simulang Maghanap!',
description: 'Pwede kang maghanap ng track, buong album, artist, playlist.... kahit ano! Pwede ka ring mag-paste dito ng link na galing sa Deezer',
fans: '{n} mga fan',
noResults: 'Walang resulta',
noResultsTrack: 'Walang mahanap na mga Track',
noResultsAlbum: 'Walang mahanap na mga Album',
noResultsArtist: 'Walang mahanap na mga Artist',
noResultsPlaylist: 'Walang mahanap na mga Playlist'
},
searchbar: 'Maghanap ka ng gusto mo (o mag-paste ka ng link)',
downloads: 'mga download',
toasts: {
restoringQueue: 'Binabalik ang download queue...',
queueRestored: 'Naibalik na ang download queue!',
addedToQueue: '{item} ay naidagdag sa queue',
addedMoreToQueue: '{n} naidagdag rin sa queue',
alreadyInQueue: '{item} ay meron na sa queue!',
finishDownload: '{item} ay natapos nang i-download.',
allDownloaded: 'Nadownload na lahat!',
refreshFavs: 'Narefresh na!',
loggingIn: 'Nagla-log in...',
loggedIn: 'Na-login na',
alreadyLogged: 'Nakalogin ka na',
loginFailed: "Hindi maka-log in",
loggedOut: 'Na-logout na',
cancellingCurrentItem: 'Kinakansel ang item.',
currentItemCancelled: 'Nakansel na ang item.',
startAddingArtist: 'Idinadagdag si {artist} sa queue ng mga album',
finishAddingArtist: 'Naidagdag na si {artist} sa queue ng mga album',
startConvertingSpotifyPlaylist: 'Kino-convert ang mga track sa spotify papuntang Deezer',
finishConvertingSpotifyPlaylist: 'Naconvert na ang playlist sa Spotify',
loginNeededToDownload: 'Kailangan mong mag-login para madownload ang mga track!',
deezerNotAvailable: 'Hindi available ang Deezer sa iyong bansa. Kailangan mong gumamit ng VPN.'
},
settings: {
title: 'Mga Setting',
languages: 'Mga Wika',
login: {
title: 'Login',
loggedIn: 'Ikaw ay naka-login sa pangalang {username}',
arl: {
question: 'Paano ako makakuha ng sariling ARL?',
update: 'I-update ang ARL'
},
logout: 'Logout',
login: 'Mag-login gamit ng deezer.com'
},
appearance: {
title: 'Hitsura',
slimDownloadTab: 'Pinaliit na download tab'
},
downloadPath: {
title: 'Paglalagyan ng Download'
},
templates: {
title: 'Mga Template',
tracknameTemplate: 'Template sa pangalan ng Track',
albumTracknameTemplate: 'Template sa track ng Album',
playlistTracknameTemplate: 'Template sa track ng Playlist'
},
folders: {
title: 'Mga Folder',
createPlaylistFolder: 'Gumawa ng folder para sa mga playlist',
playlistNameTemplate: 'Template sa folder ng Playlist',
createArtistFolder: 'Gumawa ng folder para sa artist',
artistNameTemplate: 'Template sa folder ng Artist',
createAlbumFolder: 'Gumawa ng folder para sa album',
albumNameTemplate: 'Template sa folder ng Album',
createCDFolder: 'Gumawa ng folder para sa mga CD',
createStructurePlaylist: 'Gumawa ng istraktura ng folder para sa mga playlist',
createSingleFolder: 'Gumawa ng istraktura ng folder para sa mga single'
},
trackTitles: {
title: 'Pamagat sa mga track',
padTracks: 'Mga track ng Pad',
paddingSize: 'Patungan ang laki ng padding',
illegalCharacterReplacer: 'Pamalit sa ilegal na Karakter'
},
downloads: {
title: 'Mga Download',
queueConcurrency: 'Mga Kasabay na Download',
maxBitrate: {
title: 'Gustong Bitrate',
9: 'FLAC 1411kbps',
3: 'MP3 320kbps',
1: 'MP3 128kbps'
},
overwriteFile: {
title: 'Papatungan ko ba ang file?',
y: 'Oo, patungan mo ang file',
n: "Hindi, huwag mong patungan ang file",
t: 'Patungan mo lang ang mga tag',
b: 'Hindi, hayaan mo silang dalawa at lagyan mo lang ng numero sa kapareho niya',
e: "Hindi, at huwag mong tignan ang mga extension"
},
fallbackBitrate: 'Binabaang bitrate',
fallbackSearch: 'Maghanap para sa binabaan',
logErrors: 'Gumawa ng log file para sa mga error',
logSearched: 'Gumawa ng log file para sa mga hinanap na track',
createM3U8File: 'Gumawa ng file sa playlist',
syncedLyrics: 'Gumawa ng mga .lyr file (Mga Sync Lyric)',
playlistFilenameTemplate: 'Template sa pangalan ng Playlist file',
saveDownloadQueue: 'I-save ang download queue kapag isasara the app'
},
covers: {
title: 'Mga cover ng album',
saveArtwork: 'I-save ang mga Cover',
coverImageTemplate: 'Template ng pangalan ng cover',
saveArtworkArtist: 'I-save ang imahe ng artist',
artistImageTemplate: 'Template ng imahe ng artist',
localArtworkSize: 'Laki ng lokal na artwork',
embeddedArtworkSize: 'Laki ng Nakadikit na artwork',
localArtworkFormat: {
title: 'Anong gusto mong format para sa mga lokal na artwork?',
jpg: 'jpeg na imahe',
png: 'png na imahe',
both: 'Parehong jpeg at png'
},
jpegImageQuality: 'Kalidad ng JPEG na imahe',
embeddedArtworkPNG: 'I-save ang nakadikit na artwork bilang PNG',
embeddedPNGWarning: 'Ang mga PNG ay hindi opisyal na suportado ng Deezer at maaaring magkaroon ng bug',
imageSizeWarning: 'Lahat ng mas mataas sa x1200 ay hindi opisyal na ginagamit sa Deezer, at posibleng magkaroon ng isyu',
coverDescriptionUTF8: 'I-save ang deskripsyon ng cover gamit ng UTF8 (iTunes Cover Fix)'
},
tags: {
head: 'Aling tag ang ise-save',
title: 'Pamagat',
artist: 'Artist',
album: 'Album',
cover: 'Cover',
trackNumber: 'Bilang ng Track',
trackTotal: 'Kabuuang Track',
discNumber: 'Bilang ng Disk',
discTotal: 'Kabuuang Disk',
albumArtist: 'Album Artist',
genre: 'Genre',
year: 'Taon',
date: 'Petsa',
explicit: 'Mga Explicit na Lyric',
isrc: 'ISRC',
length: 'Haba ng Track',
barcode: 'Barcode ng Album (UPC)',
bpm: 'BPM',
replayGain: 'Replay Gain',
label: 'Label ng Album',
lyrics: 'Unsynchronized na mga Lyric',
syncedLyrics: 'Synchronized na mga Lyric',
copyright: 'Karapatang Ari',
composer: 'Komposer',
involvedPeople: 'Mga Kasamang Tao'
},
other: {
title: 'Iba pa',
savePlaylistAsCompilation: 'I-save ang mga playlist bilang compilation',
useNullSeparator: 'Gumamit ng panghiwalay sa null',
saveID3v1: 'I-save rin ang ID3v1',
multiArtistSeparator: {
title: 'Anong gusto mo para maihanay mga artist?',
nothing: 'I-save lang ang pangunahing artist',
default: 'Gamit ng standard na specification',
andFeat: 'Gamit ng & at feat.',
using: 'Gamit ng "{separator}"'
},
singleAlbumArtist: 'I-save lang ang pangunahing album ng artist',
albumVariousArtists: 'Isama ang "Various Artists" sa mga Album Artist',
removeAlbumVersion: 'Tanggalin ang "Album Version" sa pamagat ng track',
removeDuplicateArtists: 'Tanggalin ang kombinasyon ng mga artist',
dateFormat: {
title: 'Format ng petsa para sa mga FLAC file',
year: 'YYYY',
month: 'MM',
day: 'DD'
},
featuredToTitle: {
title: 'Anong gagawin ko sa mga itinampok na artist',
0: 'Wala',
1: 'Tanggalin mo sila sa Pamagat',
3: 'Tanggalin mo sila sa Pamagat mismo at Pamagat ng Album',
2: 'Ilipat mo sila sa pamagat'
},
titleCasing: 'Pagleletra sa Pamagat',
artistCasing: 'Pagleletra sa Artist',
casing: {
nothing: 'Walang babaguhin',
lower: 'maliliit',
upper: 'MALALAKI',
start: 'Simula Ng Bawata Salita',
sentence: 'Kagaya ng pangungusap'
},
previewVolume: 'Volume ng Preview',
executeCommand: {
title: 'Mga gagawin pagkatapos ng download',
description: 'Hayaan lang na blangko kung wala'
}
},
spotify: {
title: 'Spotify Features',
clientID: 'Spotify ClientID',
clientSecret: 'Spotify Client Secret',
username: 'Spotify Username',
question: 'Paano ma-enable ang Spotify Features?'
},
reset: 'Ibalik sa Dati',
save: 'I-save',
toasts: {
init: 'Ikinarga ang mga Setting!',
update: 'In-update ang mga Setting!',
ARLcopied: 'Kinopya ang ARL sa clipboard'
}
},
sidebar: {
home: 'tahanan',
search: 'maghanap',
charts: 'mga chart',
favorites: 'mga paborito',
linkAnalyzer: 'tagasuri ng link',
settings: 'mga setting',
about: 'tungkol sa'
},
tracklist: {
downloadSelection: 'Pagpipili ng download'
}
};
const zh_tw = {
globals: {
welcome: '歡迎使用 deemix',
back: '返回',
loading: '載入中',
download: '下載 {thing}',
by: '{artist}',
in: '於 {album}',
download_hint: '下載',
play_hint: '播放',
toggle_download_tab_hint: '展開/折疊',
clean_queue_hint: '清除完成',
cancel_queue_hint: '取消全部',
open_downloads_folder: '開啟下載資料夾',
cut: '剪下',
copy: '複製',
copyLink: '複製連結',
copyImageLink: '複製圖片連結',
copyDeezerLink: '複製 deezer 連結',
paste: '貼上',
listTabs: {
empty: '',
all: '所有',
top_result: '最佳結果',
album: '專輯|專輯',
artist: '藝人|藝人',
single: '單曲',
title: '標題|標題',
track: '歌曲|歌曲',
trackN: '0 首歌曲| {n} 首歌曲| {n} 首歌曲',
releaseN: '0 發行| {n} 發行| {n} 發行',
playlist: '播放清單|播放清單',
compile: '合輯|合輯',
ep: '迷你專輯 | 迷你專輯',
bundle: 'bundle | bundles',
more: '更多專輯',
featured: '出現於',
spotifyPlaylist: 'Spotify 播放清單 | Spotify 播放清單',
releaseDate: '發布日期',
error: '錯誤'
}
},
about: {
updates: {
currentVersion: '目前版本',
versionNotAvailable: 'N/A',
updateAvailable: `您尚未更新至最新版本:{version}`,
deemixVersion: 'deemix 函示庫版本'
},
titles: {
usefulLinks: '實用連結',
bugReports: '錯誤報告',
contributing: '貢獻',
donations: '贊助',
license: '使用許可'
},
subtitles: {
bugReports: "使用 deemix 時,遇到了什麼問題嗎?歡迎回報錯誤!",
contributing: '您想替這個專案提出貢獻嗎?您可以透過許多不同的方式來幫忙!',
donations: '您想要捐款嗎?可以贊助我們!'
},
usesLibrary: '本程式基於 <strong>deemix</strong> 函示庫。您可以使用該函示庫來製作自己的前端。',
thanks: `感謝 <strong>rtonno</strong>、<strong>uhwot</strong> 及 <strong>lollilol</strong> 對於本專案的貢獻,另外也感謝 <strong>BasCurtiz</strong> 及 <strong>scarvimane</strong> 幫忙製作本專案的圖示`,
upToDate: {
text: `您可於 Telegram 上關注{newsChannel}以取得最新動態。`,
newsChannel: '最新消息頻道'
},
officialWebsite: '官方網站',
officialRepo: '官方函示版本庫',
officialWebuiRepo: '官方 WebUI 版本庫',
officialSubreddit: '官方 Subreddit',
newsChannel: '最新消息頻道',
questions: {
text: `如果您對本程式有疑問或問題,請先在{subreddit}上搜尋解決方案。如果找不到任何解決方法,則可以在我們的 subreddit 上發布與您問題相關的文章。`,
subreddit: ' subreddit '
},
beforeReporting: `在報告錯誤之前,請確保您正在運行最新版本的程式,並且要報告的內容真的是一個錯誤,而不僅是您自己遇到的問題。`,
beSure: `請確保您所想回報的錯誤可在其他台裝置上再現的,並且<strong>請勿</strong>回報已知錯誤。`,
duplicateReports: '請注意,重複的錯誤報告將被移除。',
dontOpenIssues: `<strong>請勿</strong>透過本版本庫的 Issues 問問題,我們開 subreddit 是有原因的。`,
newUI: {
text: `如果您精通 Python則可以嘗試使用我們的函示庫來建立新的 UI或者透過{repo}提出錯誤相關的 PR。`,
repo: '我們的版本庫'
},
acceptFeatures: `我也歡迎你提交新的功能-但前提是這個功能不能過於複雜-過於複雜的功能,應被新增至程式內而非函示庫內。`,
otherLanguages: `如果您精通其他程式語言,你也可以嘗試將 deemix 移植到其他程式語言中!`,
understandingCode: `你需要幫助了解本專案的程式碼嗎?只需在 Telegram 或 Reddit 上按一下 RemixDev。`,
contributeWebUI: {
text: `如果你熟悉 Vue.jsJavaScript、HTML 或 CSS你也可以參與 {webui} 前端的貢獻。`,
webui: 'WebUI'
},
itsFree: `記得,<strong>這是一個免費的專案</strong><strong>在支持開發人員之前,應該先支持你喜歡的歌手或藝人</ strong>。`,
notObligated: `別認為你有義務捐款,無論如何我們都感謝您!`,
lincensedUnder: {
text: `本作品使用 {gpl3} 許可授權。`,
gpl3: 'GNU General Public License 3.0'
}
},
charts: {
title: '排行榜',
changeCountry: '改變國家',
download: '下載排行榜'
},
errors: {
title: '{name} 的錯誤',
ids: {
invalidURL: '無法識別網址',
unsupportedURL: '尚不支持此網址',
ISRCnotOnDeezer: '無法在 Deezer 上使用單曲 ISRC',
notYourPrivatePlaylist: "您無法下載他人的私人播放清單。",
spotifyDisabled: 'Spotify 功能未正確設定。',
trackNotOnDeezer: '在 Deezer 上找不到此歌曲!',
albumNotOnDeezer: '在 Deezer 上找不到此專輯!',
notOnDeezer: '無法在 Deezer 上載入此歌曲!',
notEncoded: '本歌曲尚未編碼!',
notEncodedNoAlternative: '本歌曲尚未編碼,且無法找到其他替代歌曲!',
wrongBitrate: '找不到符合所設位元率的歌曲。',
wrongBitrateNoAlternative: '找不到符合所設位元率的歌曲,且無法找到其他替代歌曲!',
no360RA: '本歌曲並不支援 Reality Audio 360。',
notAvailable: "無法在 Deezer 伺服器載入此歌曲!",
notAvailableNoAlternative: "無法在 Deezer 伺服器載入此歌曲,且無法找到其他替代歌曲!",
noSpaceLeft: "本裝置可用空間已用盡!",
albumDoesntExists: "本歌曲的專輯不存在,無法取得資訊"
}
},
favorites: {
title: '收藏',
noPlaylists: '尚未收藏任何播放清單',
noAlbums: '尚未收藏任何專輯',
noArtists: '尚未收藏任何藝人',
noTracks: '尚未收藏任何歌曲'
},
home: {
needTologin: '您需要先登入 Deezer 帳戶,然後才能開始下載。',
openSettings: '開啟設定',
sections: {
popularPlaylists: '熱門播放清單',
popularAlbums: '熱門專輯'
}
},
linkAnalyzer: {
info: '您可以透過此工具取得您所想下載的連結的相關資訊。',
useful: "比如,當您所想下載的歌曲無法在您的國家播放,且您想知道哪些國家可以播放此歌曲時,您可使用此工具。",
linkNotSupported: '尚未支援此連結',
linkNotSupportedYet: '我們似乎尚未支援此連結,請改用其他連結。',
table: {
id: 'ID',
isrc: 'ISRC',
upc: 'UPC',
duration: '長度',
diskNumber: '光碟編號',
trackNumber: '歌曲編號',
releaseDate: '發布日期',
bpm: 'BPM',
label: '標籤',
recordType: '媒體類型',
genres: '類型',
tracklist: '歌曲清單'
}
},
search: {
startSearching: '開始搜尋!',
description: '您可以搜索歌曲名稱、專輯、藝人、播放清單...等等。您也可以直接貼上 Deezer 網址。',
fans: '{n} 個粉絲',
noResults: '無搜尋結果',
noResultsTrack: '找不到歌曲',
noResultsAlbum: '找不到專輯',
noResultsArtist: '找不到藝人',
noResultsPlaylist: '找不到播放清單'
},
searchbar: '搜尋任何關鍵字(或貼上連結)',
downloads: '下載',
toasts: {
restoringQueue: '正在恢復下載清單...',
queueRestored: '下載清單已恢復!',
addedToQueue: '已新增 {item} 到下載清單中',
addedMoreToQueue: '已新增 {n} 個項目到下載清單中',
alreadyInQueue: '{item} 已在下載清單中!',
finishDownload: '{item} 已完成下載。',
allDownloaded: '全部下載完成!',
refreshFavs: '刷新完成!',
loggingIn: '登入中...',
loggedIn: '登入',
alreadyLogged: '已登入',
loginFailed: "無法登入",
loggedOut: '登出',
cancellingCurrentItem: '取消當前項目。',
currentItemCancelled: '當前項目已取消。',
startAddingArtist: '已新增 {artist} 個專輯到下載清單中',
finishAddingArtist: '已新增 {artist} 個專輯到下載清單中',
startConvertingSpotifyPlaylist: '將 Spotify 歌曲轉換為 Deezer 歌曲中',
finishConvertingSpotifyPlaylist: '已轉換 Spotify 播放清單',
loginNeededToDownload: '您需要登入才能下載歌曲!',
deezerNotAvailable: 'Deezer 在您所在的國家/地區無法使用。請您使用 VPN。'
},
settings: {
title: '設定',
languages: '語言',
login: {
title: '登入',
loggedIn: '目前以 {username} 的身份登入',
arl: {
question: '如何取得自己的 ARL',
update: '更新 ARL'
},
logout: '登出',
login: '透過 deezer.com 登入'
},
appearance: {
title: '外觀',
slimDownloadTab: '薄型下載分頁'
},
downloadPath: {
title: '下載目錄'
},
templates: {
title: '檔案名稱格式',
tracknameTemplate: '單曲名稱格式',
albumTracknameTemplate: '專輯單曲名稱格式',
playlistTracknameTemplate: '播放清單單曲名稱格式'
},
folders: {
title: '資料夾',
createPlaylistFolder: '替播放清單建立資料夾',
playlistNameTemplate: '播放清單資料夾名稱格式',
createArtistFolder: '替藝人建立資料夾',
artistNameTemplate: '藝人資料夾名稱格式',
createAlbumFolder: '替專輯建立資料夾',
albumNameTemplate: '專輯資料夾名稱格式',
createCDFolder: '替 CD 建立資料夾',
createStructurePlaylist: '建立播放清單資料夾結構',
createSingleFolder: '建立單曲資料夾結構'
},
trackTitles: {
title: '單曲名稱',
padTracks: '歌曲數目字串填充',
paddingSize: '覆蓋數目字串填充長度',
illegalCharacterReplacer: '替換非法字元'
},
downloads: {
title: '下載',
queueConcurrency: '並行下載',
maxBitrate: {
title: '偏好位元率',
9: 'FLAC 1411kbps',
3: 'MP3 320kbps',
1: 'MP3 128kbps'
},
overwriteFile: {
title: '是否要覆蓋檔案?',
y: '是,覆蓋檔案',
n: "否,請勿覆蓋檔案",
t: '僅覆蓋標籤',
b: '否,保留兩個檔案並在重複的檔名中加入一個數字',
e: "否,不顧慮附檔名"
},
fallbackBitrate: '當偏好位元率無法下載時,下載其他版本',
fallbackSearch: '當搜尋結果無法使用時,使用其他搜尋結果',
logErrors: '記錄錯誤至日誌',
logSearched: '記錄搜尋歌曲至日誌',
createM3U8File: '建立播放清單檔案',
syncedLyrics: '建立 .lyr 檔案(同步歌詞)',
playlistFilenameTemplate: '播放清單檔名格式',
saveDownloadQueue: '關閉應用程式時,保存下載清單'
},
covers: {
title: '專輯封面',
saveArtwork: '保存封面',
coverImageTemplate: '封面檔名格式',
saveArtworkArtist: '保存藝人照片',
artistImageTemplate: '藝人照片檔名格式',
localArtworkSize: '本地圖片大小',
embeddedArtworkSize: '嵌入圖片大小',
localArtworkFormat: {
title: '您希望本地圖片採用哪種格式?',
jpg: 'JPEG',
png: 'PNG',
both: 'JPEG 及 PNG'
},
jpegImageQuality: 'JPEG 影像品質',
embeddedArtworkPNG: '將嵌入式圖片存為 PNG',
embeddedPNGWarning: 'Deezer 官方並不支援 PNG結果可能有誤',
imageSizeWarning: 'Deezer 官方並不使用高於 x1200 的圖片,您可能會遇到問題',
coverDescriptionUTF8: '使用 UTF8 保存封面敘述(修正 iTunes 專輯封面)'
},
tags: {
head: '要保存哪些標籤',
title: '標題',
artist: '藝人',
album: '專輯',
cover: '專輯封面',
trackNumber: '單曲編號',
trackTotal: '總計歌曲',
discNumber: '光碟編號',
discTotal: '光碟總數',
albumArtist: '專輯藝人',
genre: '類型',
year: '年',
date: '日期',
explicit: '不良歌詞',
isrc: 'ISRC',
length: '單曲長度',
barcode: '專輯條碼UPC',
bpm: 'BPM',
replayGain: '重播增益Replay Gain',
label: '專輯標籤',
lyrics: '不同步的歌詞',
syncedLyrics: '同步歌詞',
copyright: '版權',
composer: '作曲家',
involvedPeople: '相關藝人'
},
other: {
title: '其他',
savePlaylistAsCompilation: '將播放清單儲存為合輯',
useNullSeparator: '使用空分隔符',
saveID3v1: '保存 ID3v1 標籤',
multiArtistSeparator: {
title: '如何隔開作者名稱?',
nothing: '僅保留主作者',
default: '使用標準規格',
andFeat: '使用 & 及 feat.',
using: '使用 "{separator}"'
},
singleAlbumArtist: '僅儲存專輯主作者名稱',
albumVariousArtists: '於專輯作者欄位中保留「多位藝人 (Various Artists)」字樣',
removeAlbumVersion: '於單曲名稱中移除「專輯版本 (Album Version)」字樣',
removeDuplicateArtists: '移除重複的作者名稱',
dateFormat: {
title: 'FLAC 檔案日期格式',
year: 'YYYY',
month: 'MM',
day: 'DD'
},
featuredToTitle: {
title: '如何處理客串藝人名稱 (如 feat. 等字樣) ',
0: '什麼都不做',
1: '從標題中刪除',
3: '從標題和專輯標題中刪除',
2: '將其移至標題'
},
titleCasing: '歌曲名稱大小寫',
artistCasing: '藝人名稱大小寫',
casing: {
nothing: '保持不變',
lower: '小寫',
upper: '大寫',
start: '字詞開頭大寫',
sentence: '句子大寫'
},
previewVolume: '預覽音量',
executeCommand: {
title: '下載後執行指令',
description: '留空則不執行'
}
},
spotify: {
title: 'Spotify 功能',
clientID: 'Spotify 客戶端 ID',
clientSecret: 'Spotify 客戶端密碼',
username: 'Spotify 用戶名',
question: '如何啟用 Spotify 功能?'
},
reset: '重設至預設',
save: '儲存',
toasts: {
init: '已載入設定!',
update: '已更新設定!',
ARLcopied: '已複製 ARL 到剪貼簿中'
}
},
sidebar: {
home: '首頁',
search: '搜尋',
charts: '排行榜',
favorites: '收藏',
linkAnalyzer: '連結分析',
settings: '設定',
about: '關於'
},
tracklist: {
downloadSelection: '下載所選'
}
};
const pl = {
globals: {
welcome: 'Witaj w deemix',
back: 'wróć',
loading: 'ładowanie',
download: 'Pobierz {thing}',
by: 'od {artist}',
in: 'w {album}',
download_hint: 'Pobierz',
play_hint: 'Odtwórz',
toggle_download_tab_hint: 'Rozszerz/Zwiń',
clean_queue_hint: 'Wyczyść ukończone',
cancel_queue_hint: 'Anuluj wszystkie',
open_downloads_folder: 'Otwórz pobrane',
cut: 'wytnij',
copy: 'kopiuj',
copyLink: 'kopiuj link',
copyImageLink: 'kopiuj link obrazu',
copyDeezerLink: 'kopiuj link deezera',
paste: 'wklej',
listTabs: {
empty: '',
all: 'wszystkie',
top_result: 'najlepszy wynik',
album: 'album | albumy',
artist: 'artysta | artyści',
single: 'singiel | single',
title: 'tytuł | tytuły',
track: 'utwór | utwory',
trackN: '0 utworów | {n} utwór | {n} utworów',
releaseN: '0 wydań | {n} wydanie | {n} wydań',
playlist: 'playlista | playlisty',
compile: 'kompilacja | kompilacje',
ep: 'ep | ep',
bundle: 'zestaw | zestawy',
more: 'Więcej albumów',
featured: 'Występuje w',
spotifyPlaylist: 'playlista spotify | playlisty spotify',
releaseDate: 'data wydania',
error: 'błąd'
}
},
about: {
updates: {
currentVersion: 'Obecna wersja',
versionNotAvailable: 'N/A',
updateAvailable: `Nie masz najnowszej dostępnej wersji: {version}`,
deemixVersion: 'Wersja biblioteki deemix'
},
titles: {
usefulLinks: 'Przydatne linki',
bugReports: 'Zgłoszenia błędów',
contributing: 'Wkład',
donations: 'Dotacje',
license: 'Licencja'
},
subtitles: {
bugReports: "Czy deemix działa inaczej niż powinien? Powiedz nam!",
contributing: 'Chcesz pomóc w tym projekcie? Możesz to zrobić na wiele sposobów!',
donations: 'Chcesz pomóc finansowo? Możesz nas wesprzeć!'
},
usesLibrary: 'Ten program używa biblioteki <strong>deemix</strong>, której możesz użyć do stworzenia własnego interfejsu użytkownika',
thanks: `Podziękowania dla <strong>rtonno</strong>, <strong>uhwot</strong> i <strong>lollilol</strong> za pomoc w tym projekcie oraz dla <strong>BasCurtiz</strong> i <strong>scarvimane</strong> za stworzenie ikony.`,
upToDate: {
text: `Bądź na bieżąco z aktualizacjami dołączając do {newsChannel} na Telegramie.`,
newsChannel: 'kanału wiadomości'
},
officialWebsite: 'Oficjalna strona',
officialRepo: 'Oficjalne repozytorium biblioteki',
officialWebuiRepo: 'Oficjalne repozytorium WebUI',
officialSubreddit: 'Oficjalny subreddit',
newsChannel: 'Kanał wiadomości',
questions: {
text: `Jeżeli masz pytania lub problemy związane z aplikacją, szukaj odpowiedzi na {subreddit}. Jeżeli niczego nie znajdziesz, stwórz post na subreddicie.`,
subreddit: 'subreddicie'
},
beforeReporting: `Przed zgłaszaniem błędu upewnij się, że masz najnowszą wersje aplikacji i to, co chcesz zgłosić jest błędem, a nie usterką z twojej strony.`,
beSure: `Upewnij się, że błąd można odtworzyć na innych urządzeniach i <strong>NIE ZGŁASZAJ</strong> błędów, które zostały już zgłoszone`,
duplicateReports: 'Identyczne zgłoszenia błędów będą zamykane, więc zwróć na to uwagę.',
dontOpenIssues: `<strong>NIE OTWIERAJ</strong> zgłoszeń do zadawania pytań, od tego jest subreddit.`,
newUI: {
text: `Jeżeli dobrze znasz Pythona, możesz spróbować stworzyć nowy interfejs dla aplikacji używając bazowej biblioteki lub naprawiać błędy w bibliotece tworząc pull request w {repo}.`,
repo: 'repozytorium'
},
acceptFeatures: `Przyjmuję nowe funkcje, ale nic złożonego, co mogłoby być zaimplementowane w aplikacji, a nie w bibliotece.`,
otherLanguages: `Jeżeli dobrze znasz inny język programowania, możesz spróbować przeportować deemix do innych języków!`,
understandingCode: `Potrzebujesz pomocy w zrozumieniu kodu? Zapytaj RemixDev na Telegramie lub Reddicie.`,
contributeWebUI: {
text: `Jeżeli znasz Vue.js (JavaScript), HTML lub CSS, możesz pomóc w {webui}.`,
webui: 'WebUI'
},
itsFree: `Pamiętaj, że <strong>ten projekt jest darmowy</strong> i <strong>powinieneś wspierać artystów</strong> przed twórcami aplikacji.`,
notObligated: `Nie czuj potrzeby płacenia, i tak cię doceniam!`,
lincensedUnder: {
text: `Ten projekt jest chroniony licencją {gpl3}.`,
gpl3: 'GNU General Public License 3.0'
}
},
charts: {
title: 'Wykresy',
changeCountry: 'Zmień kraj',
download: 'Pobierz wykres'
},
errors: {
title: 'Błędy dla {name}',
ids: {
invalidURL: 'Nierozpoznany URL',
unsupportedURL: 'Niewspierany URL',
ISRCnotOnDeezer: 'ISRC nie jest dostępne na Deezerze',
notYourPrivatePlaylist: "Nie możesz pobierać czyichś prywatnych playlist.",
spotifyDisabled: 'Funkcje Spotify nie są poprawnie ustawione',
trackNotOnDeezer: 'Nie znaleziono utworu na Deezerze!',
albumNotOnDeezer: 'Nie znaleziono albumu na Deezerze!',
notOnDeezer: 'Utwór nie jest dostępny na Deezerze!',
notEncoded: 'Utwór nie jest jeszcze zakodowany!',
notEncodedNoAlternative: 'Utwór nie jest jeszcze zakodowany i nie można znaleźć alternatywy!',
wrongBitrate: 'Nie znaleziono utworu w wybranym bitrate.',
wrongBitrateNoAlternative: 'Nie znaleziono utworu w wybranym bitrate i nie mozna znaleźć alternatywy!',
no360RA: 'Utwór nie jest dostępny w Reality Audio 360.',
notAvailable: "Utwór nie jest dostępny na serwerach Deezera!",
notAvailableNoAlternative: "Utwór nie jest dostępny na serwerach Deezera i nie można znaleźć alternatywy!"
}
},
favorites: {
title: 'Ulubione',
noPlaylists: 'Nie znaleziono playlist',
noAlbums: 'Nie znaleziono ulubionych albumów',
noArtists: 'Nie znaleziono ulubionych artystów',
noTracks: 'Nie znaleziono ulubonych utworów'
},
home: {
needTologin: 'Musisz się zalogwać do konta na Deezerze zanim zaczniesz pobierać.',
openSettings: 'Otwórz ustawienia',
sections: {
popularPlaylists: 'Popularne playlisty',
popularAlbums: 'Najpopularniejsze albumy'
}
},
linkAnalyzer: {
info: 'Możesz użyć tej sekcji, aby znaleźć więcej informacji o linku, który chcesz pobrać.',
useful: "Jest to przydatne na przykład gdy chcesz pobrać jakieś utwory, które nie są dostępne w twoim kraju i chcesz wiedzieć gdzie są dostępne.",
linkNotSupported: 'Ten link nie jest jeszcze wspierany',
linkNotSupportedYet: 'Wygląda na to, że ten link nie jest jeszcze wspierany. Spróbuj przeanalizować inny.',
table: {
id: 'ID',
isrc: 'ISRC',
upc: 'UPC',
duration: 'Czas',
diskNumber: 'Numer płyty',
trackNumber: 'Numer utworu',
releaseDate: 'Data wydania',
bpm: 'BPM',
label: 'Wytwórnia',
recordType: 'Rodzaj wydania',
genres: 'Gatunki',
tracklist: 'Lista utworów'
}
},
search: {
startSearching: 'Zacznij szukać!',
description: 'Możesz wyszukać utwór, album, artystę, playlistę... wszystko! Możesz też wkleić link do Deezera',
fans: '{n} fanów',
noResults: 'Brak wyników',
noResultsTrack: 'Nie znaleziono utworów',
noResultsAlbum: 'Nie znaleziono albumów',
noResultsArtist: 'Nie znaleziono artystów',
noResultsPlaylist: 'Nie znaleziono playlist'
},
searchbar: 'Szukaj czego chcesz (lub wklej link)',
downloads: 'pobrane',
toasts: {
restoringQueue: 'Przywracanie kolejki pobierania...',
queueRestored: 'Przywrócono kolejkę pobierania!',
addedToQueue: 'Dodano {item} do kolejki',
addedMoreToQueue: 'Dodano {n} przedmiotów do kolejki',
alreadyInQueue: '{item} jest już w kolejce!',
finishDownload: 'Ukończono pobieranie {item}.',
allDownloaded: 'Pobrano wszystkie!',
refreshFavs: 'Ukończono odświeżanie!',
loggingIn: 'Logowanie...',
loggedIn: 'Zalogowano',
alreadyLogged: 'Już zalogowano',
loginFailed: "Nie można zalogować",
loggedOut: 'Wylogowano',
cancellingCurrentItem: 'Anulowanie przedmiotu.',
currentItemCancelled: 'Anulowano przedmiot.',
startAddingArtist: 'Dodawanie {artist} albumów do kolejki',
finishAddingArtist: 'Dodano {artist} albumów do kolejki',
startConvertingSpotifyPlaylist: 'Konwertowanie utworów Spotify na Deezer',
finishConvertingSpotifyPlaylist: 'Przekonwertowano playlistę Spotify',
loginNeededToDownload: 'Musisz się zalogować, aby pobierać utwory!'
},
settings: {
title: 'Ustawienia',
languages: 'Języki',
login: {
title: 'Logowanie',
loggedIn: 'Zalogowano jako {username}',
arl: {
question: 'Jak zdobyć swój własny ARL?',
update: 'Zakualizuj ARL'
},
logout: 'Wyloguj',
login: 'Zaloguj przez deezer.com'
},
appearance: {
title: 'Wygląd',
slimDownloadTab: 'Cienka karta pobranych'
},
downloadPath: {
title: 'Ścieżka pobierania'
},
templates: {
title: 'Szablony',
tracknameTemplate: 'Szablon utworu',
albumTracknameTemplate: 'Szablon utworu z albumu',
playlistTracknameTemplate: 'Szablon utworu z playlisy'
},
folders: {
title: 'Foldery',
createPlaylistFolder: 'Utwórz foldery dla playlist',
playlistNameTemplate: 'Szablon folderu playlisty',
createArtistFolder: 'Utwórz foldery dla artystów',
artistNameTemplate: 'Szablon folderu artysty',
createAlbumFolder: 'Utwórz foldery dla albumów',
albumNameTemplate: 'Szablon folderu albumu',
createCDFolder: 'Utwórz foldery dla płyt',
createStructurePlaylist: 'Utwórz strukturę folderów dla playlist',
createSingleFolder: 'Utwórz strukturę folderów dla singli'
},
trackTitles: {
title: 'Tytuły utworow',
padTracks: 'Wypchaj utwory',
paddingSize: 'Rozmiar wypchania',
illegalCharacterReplacer: 'Zamiennik niedozwolonych znaków'
},
downloads: {
title: 'Pobrane',
queueConcurrency: 'Równoległe pobieranie',
maxBitrate: {
title: 'Bitrate',
9: 'FLAC 1411kbps',
3: 'MP3 320kbps',
1: 'MP3 128kbps'
},
overwriteFile: {
title: 'Nadpisywać pliki?',
y: 'Tak',
n: "Nie",
t: 'Tylko tagi',
b: 'Nie, dodaj numer do drugiego pliku',
e: 'Nie, nie patrz na rozszerzenia'
},
fallbackBitrate: 'Rezerwowy bitrate',
fallbackSearch: 'Rezerwowe wyszukiwanie',
logErrors: 'Utwórz plik dziennika błędów',
logSearched: 'Utwórz plik dziennika wyszukiwanych utworów',
createM3U8File: 'Utwórz plik playlisty',
syncedLyrics: 'Utwórz plik .lyr (synchronizowany tekst)',
playlistFilenameTemplate: 'Szablon pliku playlisty',
saveDownloadQueue: 'Zapisz kolejkę pobierania przy zamykaniu aplikacji'
},
covers: {
title: 'Okładki albumów',
saveArtwork: 'Zapisz okładki',
coverImageTemplate: 'Szablon nazwy okładki',
saveArtworkArtist: 'Zapisz zdjęcie artysty',
artistImageTemplate: 'Szablon zdjęcia artysty',
localArtworkSize: 'Rozmiar lokalnej okładki',
embeddedArtworkSize: 'Rozmiar osadzonej okładki',
localArtworkFormat: {
title: 'W jakim formacie ma zostać zapisana okładka?',
jpg: 'Plik JPEG',
png: 'Plik PNG',
both: 'Pliki JPEG i PNG'
},
jpegImageQuality: 'Jakość JPEG',
embeddedArtworkPNG: 'Zapisz osadzoną okładkę jako PNG',
embeddedPNGWarning: 'PNG nie jest oficjalnie wspierane przez Deezer i może powodować błędy',
imageSizeWarning: 'Wszystko powyżej x1200 nie jest oficjalnie używane przez Deezera, więc mogą wystąpić problemy.'
},
tags: {
head: 'Które tagi zapisać',
title: 'Tytuł',
artist: 'Artysta',
album: 'Album',
cover: 'Okładka',
trackNumber: 'Numer utworu',
trackTotal: 'Liczba utworów',
discNumber: 'Numer płyty',
discTotal: 'Liczba płyt',
albumArtist: 'Album Artist',
genre: 'Gatunek',
year: 'Rok',
date: 'Data',
explicit: 'Wulgarny tekst',
isrc: 'ISRC',
length: 'Długość',
barcode: 'Kod kreskowy albumu (UPC)',
bpm: 'BPM',
replayGain: 'Replay Gain',
label: 'Wytwórnia',
lyrics: 'Niezsynchronizowany tekst',
syncedLyrics: 'Zsynchronizowany tekst',
copyright: 'Prawa autorskie',
composer: 'Kompozytor',
involvedPeople: 'Zaangażowane osoby'
},
other: {
title: 'Inne',
savePlaylistAsCompilation: 'Zapisz playlisty jako kompilacje',
useNullSeparator: 'Użyj separatora null',
saveID3v1: 'Zapisz ID3v1',
multiArtistSeparator: {
title: 'Jak oddzielić artystów?',
nothing: 'Zapisz tylko głównego artystę',
default: 'Standardowa specyfikacja',
andFeat: '& i feat.',
using: 'Używa "{separator}"'
},
singleAlbumArtist: 'Zapisz tylko głównego autora albumu',
albumVariousArtists: 'Zostaw "Various Artists" w autorach albumu',
removeAlbumVersion: 'Usuń "Album Version" z tytułu utworu',
removeDuplicateArtists: 'Usuń kombinacje artystów',
dateFormat: {
title: 'Format daty dla plików FLAC',
year: 'YYYY',
month: 'MM',
day: 'DD'
},
featuredToTitle: {
title: 'Co zrobić z dodatkowymi artystami?',
0: 'Nic',
1: 'Usuń z tytułu',
3: 'Usuń z tytułu i tytułu albumu',
2: 'Przenieś do tytułu'
},
titleCasing: 'Rozmiar liter tytułu',
artistCasing: 'Rozmiar liter artysty',
casing: {
nothing: 'Zostaw',
lower: 'małe litery',
upper: 'DUŻE LITERY',
start: 'Na Początku Każdego Słowa',
sentence: 'Jak w zdaniu'
},
previewVolume: 'Głośność podglądu',
executeCommand: {
title: 'Polecenie do wykonania po pobraniu',
description: 'Zostaw puste, aby nic nie robić'
}
},
spotify: {
title: 'Funkcje Spotify',
clientID: 'Spotify ClientID',
clientSecret: 'Spotify Client Secret',
username: 'Nazwa użytkownika',
question: 'Jak włączyć funkcje Spotify?'
},
reset: 'Przywróć domyślne',
save: 'Zapisz',
toasts: {
init: 'Załadowano ustawienia!',
update: 'Zaktualizowano ustawienia!',
ARLcopied: 'Skopiowano ARL do schowka'
}
},
sidebar: {
home: 'strona główna',
search: 'szukaj',
charts: 'wykresy',
favorites: 'ulubione',
linkAnalyzer: 'analiza linków',
settings: 'ustawienia',
about: 'informacje'
},
tracklist: {
downloadSelection: 'Pobierz wybrane'
}
};
const locales = {
it,
en,
es,
de,
fr,
id,
pt,
pt_br,
ru,
tr,
vn,
hr,
ar,
ko,
ph,
zh_tw,
pl
};
Vue.use(VueI18n);
const storedLocale = localStorage.getItem('locale');
const DEFAULT_LANG = storedLocale || 'en';
document.querySelector('html').setAttribute('lang', DEFAULT_LANG);
const i18n = new VueI18n({
locale: DEFAULT_LANG,
fallbackLocale: 'en',
messages: locales,
pluralizationRules: {
/**
* @param {number} choice A choice index given by the input to $tc: `$tc('path.to.rule', choiceIndex)`
* @param {number} choicesLength An overall amount of available choices
* @returns A final choice index to select plural word by
*/
ru: function(choice, choicesLength) {
var n = Math.abs(choice) % 100;
var n1 = n % 10;
if (n > 10 && n < 20) {
return 2
}
if (n1 > 1 && n1 < 5) {
return 1
}
if (n1 == 1) {
return 0
}
return 2
}
}
});
/*!
* vue-router v3.4.8
* (c) 2020 Evan You
* @license MIT
*/
function extend$2 (a, b) {
for (var key in b) {
a[key] = b[key];
}
return a
}
/* */
var encodeReserveRE = /[!'()*]/g;
var encodeReserveReplacer = function (c) { return '%' + c.charCodeAt(0).toString(16); };
var commaRE = /%2C/g;
// fixed encodeURIComponent which is more conformant to RFC3986:
// - escapes [!'()*]
// - preserve commas
var encode = function (str) { return encodeURIComponent(str)
.replace(encodeReserveRE, encodeReserveReplacer)
.replace(commaRE, ','); };
function decode (str) {
try {
return decodeURIComponent(str)
} catch (err) {
}
return str
}
function resolveQuery (
query,
extraQuery,
_parseQuery
) {
if ( extraQuery === void 0 ) extraQuery = {};
var parse = _parseQuery || parseQuery;
var parsedQuery;
try {
parsedQuery = parse(query || '');
} catch (e) {
parsedQuery = {};
}
for (var key in extraQuery) {
var value = extraQuery[key];
parsedQuery[key] = Array.isArray(value)
? value.map(castQueryParamValue)
: castQueryParamValue(value);
}
return parsedQuery
}
var castQueryParamValue = function (value) { return (value == null || typeof value === 'object' ? value : String(value)); };
function parseQuery (query) {
var res = {};
query = query.trim().replace(/^(\?|#|&)/, '');
if (!query) {
return res
}
query.split('&').forEach(function (param) {
var parts = param.replace(/\+/g, ' ').split('=');
var key = decode(parts.shift());
var val = parts.length > 0 ? decode(parts.join('=')) : null;
if (res[key] === undefined) {
res[key] = val;
} else if (Array.isArray(res[key])) {
res[key].push(val);
} else {
res[key] = [res[key], val];
}
});
return res
}
function stringifyQuery (obj) {
var res = obj
? Object.keys(obj)
.map(function (key) {
var val = obj[key];
if (val === undefined) {
return ''
}
if (val === null) {
return encode(key)
}
if (Array.isArray(val)) {
var result = [];
val.forEach(function (val2) {
if (val2 === undefined) {
return
}
if (val2 === null) {
result.push(encode(key));
} else {
result.push(encode(key) + '=' + encode(val2));
}
});
return result.join('&')
}
return encode(key) + '=' + encode(val)
})
.filter(function (x) { return x.length > 0; })
.join('&')
: null;
return res ? ("?" + res) : ''
}
/* */
var trailingSlashRE = /\/?$/;
function createRoute (
record,
location,
redirectedFrom,
router
) {
var stringifyQuery = router && router.options.stringifyQuery;
var query = location.query || {};
try {
query = clone(query);
} catch (e) {}
var route = {
name: location.name || (record && record.name),
meta: (record && record.meta) || {},
path: location.path || '/',
hash: location.hash || '',
query: query,
params: location.params || {},
fullPath: getFullPath(location, stringifyQuery),
matched: record ? formatMatch(record) : []
};
if (redirectedFrom) {
route.redirectedFrom = getFullPath(redirectedFrom, stringifyQuery);
}
return Object.freeze(route)
}
function clone (value) {
if (Array.isArray(value)) {
return value.map(clone)
} else if (value && typeof value === 'object') {
var res = {};
for (var key in value) {
res[key] = clone(value[key]);
}
return res
} else {
return value
}
}
// the starting route that represents the initial state
var START = createRoute(null, {
path: '/'
});
function formatMatch (record) {
var res = [];
while (record) {
res.unshift(record);
record = record.parent;
}
return res
}
function getFullPath (
ref,
_stringifyQuery
) {
var path = ref.path;
var query = ref.query; if ( query === void 0 ) query = {};
var hash = ref.hash; if ( hash === void 0 ) hash = '';
var stringify = _stringifyQuery || stringifyQuery;
return (path || '/') + stringify(query) + hash
}
function isSameRoute (a, b) {
if (b === START) {
return a === b
} else if (!b) {
return false
} else if (a.path && b.path) {
return (
a.path.replace(trailingSlashRE, '') === b.path.replace(trailingSlashRE, '') &&
a.hash === b.hash &&
isObjectEqual(a.query, b.query)
)
} else if (a.name && b.name) {
return (
a.name === b.name &&
a.hash === b.hash &&
isObjectEqual(a.query, b.query) &&
isObjectEqual(a.params, b.params)
)
} else {
return false
}
}
function isObjectEqual (a, b) {
if ( a === void 0 ) a = {};
if ( b === void 0 ) b = {};
// handle null value #1566
if (!a || !b) { return a === b }
var aKeys = Object.keys(a).sort();
var bKeys = Object.keys(b).sort();
if (aKeys.length !== bKeys.length) {
return false
}
return aKeys.every(function (key, i) {
var aVal = a[key];
var bKey = bKeys[i];
if (bKey !== key) { return false }
var bVal = b[key];
// query values can be null and undefined
if (aVal == null || bVal == null) { return aVal === bVal }
// check nested equality
if (typeof aVal === 'object' && typeof bVal === 'object') {
return isObjectEqual(aVal, bVal)
}
return String(aVal) === String(bVal)
})
}
function isIncludedRoute (current, target) {
return (
current.path.replace(trailingSlashRE, '/').indexOf(
target.path.replace(trailingSlashRE, '/')
) === 0 &&
(!target.hash || current.hash === target.hash) &&
queryIncludes(current.query, target.query)
)
}
function queryIncludes (current, target) {
for (var key in target) {
if (!(key in current)) {
return false
}
}
return true
}
function handleRouteEntered (route) {
for (var i = 0; i < route.matched.length; i++) {
var record = route.matched[i];
for (var name in record.instances) {
var instance = record.instances[name];
var cbs = record.enteredCbs[name];
if (!instance || !cbs) { continue }
delete record.enteredCbs[name];
for (var i$1 = 0; i$1 < cbs.length; i$1++) {
if (!instance._isBeingDestroyed) { cbs[i$1](instance); }
}
}
}
}
var View = {
name: 'RouterView',
functional: true,
props: {
name: {
type: String,
default: 'default'
}
},
render: function render (_, ref) {
var props = ref.props;
var children = ref.children;
var parent = ref.parent;
var data = ref.data;
// used by devtools to display a router-view badge
data.routerView = true;
// directly use parent context's createElement() function
// so that components rendered by router-view can resolve named slots
var h = parent.$createElement;
var name = props.name;
var route = parent.$route;
var cache = parent._routerViewCache || (parent._routerViewCache = {});
// determine current view depth, also check to see if the tree
// has been toggled inactive but kept-alive.
var depth = 0;
var inactive = false;
while (parent && parent._routerRoot !== parent) {
var vnodeData = parent.$vnode ? parent.$vnode.data : {};
if (vnodeData.routerView) {
depth++;
}
if (vnodeData.keepAlive && parent._directInactive && parent._inactive) {
inactive = true;
}
parent = parent.$parent;
}
data.routerViewDepth = depth;
// render previous view if the tree is inactive and kept-alive
if (inactive) {
var cachedData = cache[name];
var cachedComponent = cachedData && cachedData.component;
if (cachedComponent) {
// #2301
// pass props
if (cachedData.configProps) {
fillPropsinData(cachedComponent, data, cachedData.route, cachedData.configProps);
}
return h(cachedComponent, data, children)
} else {
// render previous empty view
return h()
}
}
var matched = route.matched[depth];
var component = matched && matched.components[name];
// render empty node if no matched route or no config component
if (!matched || !component) {
cache[name] = null;
return h()
}
// cache component
cache[name] = { component: component };
// attach instance registration hook
// this will be called in the instance's injected lifecycle hooks
data.registerRouteInstance = function (vm, val) {
// val could be undefined for unregistration
var current = matched.instances[name];
if (
(val && current !== vm) ||
(!val && current === vm)
) {
matched.instances[name] = val;
}
}
// also register instance in prepatch hook
// in case the same component instance is reused across different routes
;(data.hook || (data.hook = {})).prepatch = function (_, vnode) {
matched.instances[name] = vnode.componentInstance;
};
// register instance in init hook
// in case kept-alive component be actived when routes changed
data.hook.init = function (vnode) {
if (vnode.data.keepAlive &&
vnode.componentInstance &&
vnode.componentInstance !== matched.instances[name]
) {
matched.instances[name] = vnode.componentInstance;
}
// if the route transition has already been confirmed then we weren't
// able to call the cbs during confirmation as the component was not
// registered yet, so we call it here.
handleRouteEntered(route);
};
var configProps = matched.props && matched.props[name];
// save route and configProps in cache
if (configProps) {
extend$2(cache[name], {
route: route,
configProps: configProps
});
fillPropsinData(component, data, route, configProps);
}
return h(component, data, children)
}
};
function fillPropsinData (component, data, route, configProps) {
// resolve props
var propsToPass = data.props = resolveProps(route, configProps);
if (propsToPass) {
// clone to prevent mutation
propsToPass = data.props = extend$2({}, propsToPass);
// pass non-declared props as attrs
var attrs = data.attrs = data.attrs || {};
for (var key in propsToPass) {
if (!component.props || !(key in component.props)) {
attrs[key] = propsToPass[key];
delete propsToPass[key];
}
}
}
}
function resolveProps (route, config) {
switch (typeof config) {
case 'undefined':
return
case 'object':
return config
case 'function':
return config(route)
case 'boolean':
return config ? route.params : undefined
}
}
/* */
function resolvePath (
relative,
base,
append
) {
var firstChar = relative.charAt(0);
if (firstChar === '/') {
return relative
}
if (firstChar === '?' || firstChar === '#') {
return base + relative
}
var stack = base.split('/');
// remove trailing segment if:
// - not appending
// - appending to trailing slash (last segment is empty)
if (!append || !stack[stack.length - 1]) {
stack.pop();
}
// resolve relative path
var segments = relative.replace(/^\//, '').split('/');
for (var i = 0; i < segments.length; i++) {
var segment = segments[i];
if (segment === '..') {
stack.pop();
} else if (segment !== '.') {
stack.push(segment);
}
}
// ensure leading slash
if (stack[0] !== '') {
stack.unshift('');
}
return stack.join('/')
}
function parsePath$1 (path) {
var hash = '';
var query = '';
var hashIndex = path.indexOf('#');
if (hashIndex >= 0) {
hash = path.slice(hashIndex);
path = path.slice(0, hashIndex);
}
var queryIndex = path.indexOf('?');
if (queryIndex >= 0) {
query = path.slice(queryIndex + 1);
path = path.slice(0, queryIndex);
}
return {
path: path,
query: query,
hash: hash
}
}
function cleanPath (path) {
return path.replace(/\/\//g, '/')
}
var isarray = Array.isArray || function (arr) {
return Object.prototype.toString.call(arr) == '[object Array]';
};
/**
* Expose `pathToRegexp`.
*/
var pathToRegexp_1 = pathToRegexp;
var parse_1 = parse$2;
var compile_1 = compile$1;
var tokensToFunction_1 = tokensToFunction;
var tokensToRegExp_1 = tokensToRegExp;
/**
* The main path matching regexp utility.
*
* @type {RegExp}
*/
var PATH_REGEXP = new RegExp([
// Match escaped characters that would otherwise appear in future matches.
// This allows the user to escape special characters that won't transform.
'(\\\\.)',
// Match Express-style parameters and un-named parameters with a prefix
// and optional suffixes. Matches appear as:
//
// "/:test(\\d+)?" => ["/", "test", "\d+", undefined, "?", undefined]
// "/route(\\d+)" => [undefined, undefined, undefined, "\d+", undefined, undefined]
// "/*" => ["/", undefined, undefined, undefined, undefined, "*"]
'([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))'
].join('|'), 'g');
/**
* Parse a string for the raw tokens.
*
* @param {string} str
* @param {Object=} options
* @return {!Array}
*/
function parse$2 (str, options) {
var tokens = [];
var key = 0;
var index = 0;
var path = '';
var defaultDelimiter = options && options.delimiter || '/';
var res;
while ((res = PATH_REGEXP.exec(str)) != null) {
var m = res[0];
var escaped = res[1];
var offset = res.index;
path += str.slice(index, offset);
index = offset + m.length;
// Ignore already escaped sequences.
if (escaped) {
path += escaped[1];
continue
}
var next = str[index];
var prefix = res[2];
var name = res[3];
var capture = res[4];
var group = res[5];
var modifier = res[6];
var asterisk = res[7];
// Push the current path onto the tokens.
if (path) {
tokens.push(path);
path = '';
}
var partial = prefix != null && next != null && next !== prefix;
var repeat = modifier === '+' || modifier === '*';
var optional = modifier === '?' || modifier === '*';
var delimiter = res[2] || defaultDelimiter;
var pattern = capture || group;
tokens.push({
name: name || key++,
prefix: prefix || '',
delimiter: delimiter,
optional: optional,
repeat: repeat,
partial: partial,
asterisk: !!asterisk,
pattern: pattern ? escapeGroup(pattern) : (asterisk ? '.*' : '[^' + escapeString(delimiter) + ']+?')
});
}
// Match any characters still remaining.
if (index < str.length) {
path += str.substr(index);
}
// If the path exists, push it onto the end.
if (path) {
tokens.push(path);
}
return tokens
}
/**
* Compile a string to a template function for the path.
*
* @param {string} str
* @param {Object=} options
* @return {!function(Object=, Object=)}
*/
function compile$1 (str, options) {
return tokensToFunction(parse$2(str, options), options)
}
/**
* Prettier encoding of URI path segments.
*
* @param {string}
* @return {string}
*/
function encodeURIComponentPretty (str) {
return encodeURI(str).replace(/[\/?#]/g, function (c) {
return '%' + c.charCodeAt(0).toString(16).toUpperCase()
})
}
/**
* Encode the asterisk parameter. Similar to `pretty`, but allows slashes.
*
* @param {string}
* @return {string}
*/
function encodeAsterisk (str) {
return encodeURI(str).replace(/[?#]/g, function (c) {
return '%' + c.charCodeAt(0).toString(16).toUpperCase()
})
}
/**
* Expose a method for transforming tokens into the path function.
*/
function tokensToFunction (tokens, options) {
// Compile all the tokens into regexps.
var matches = new Array(tokens.length);
// Compile all the patterns before compilation.
for (var i = 0; i < tokens.length; i++) {
if (typeof tokens[i] === 'object') {
matches[i] = new RegExp('^(?:' + tokens[i].pattern + ')$', flags(options));
}
}
return function (obj, opts) {
var path = '';
var data = obj || {};
var options = opts || {};
var encode = options.pretty ? encodeURIComponentPretty : encodeURIComponent;
for (var i = 0; i < tokens.length; i++) {
var token = tokens[i];
if (typeof token === 'string') {
path += token;
continue
}
var value = data[token.name];
var segment;
if (value == null) {
if (token.optional) {
// Prepend partial segment prefixes.
if (token.partial) {
path += token.prefix;
}
continue
} else {
throw new TypeError('Expected "' + token.name + '" to be defined')
}
}
if (isarray(value)) {
if (!token.repeat) {
throw new TypeError('Expected "' + token.name + '" to not repeat, but received `' + JSON.stringify(value) + '`')
}
if (value.length === 0) {
if (token.optional) {
continue
} else {
throw new TypeError('Expected "' + token.name + '" to not be empty')
}
}
for (var j = 0; j < value.length; j++) {
segment = encode(value[j]);
if (!matches[i].test(segment)) {
throw new TypeError('Expected all "' + token.name + '" to match "' + token.pattern + '", but received `' + JSON.stringify(segment) + '`')
}
path += (j === 0 ? token.prefix : token.delimiter) + segment;
}
continue
}
segment = token.asterisk ? encodeAsterisk(value) : encode(value);
if (!matches[i].test(segment)) {
throw new TypeError('Expected "' + token.name + '" to match "' + token.pattern + '", but received "' + segment + '"')
}
path += token.prefix + segment;
}
return path
}
}
/**
* Escape a regular expression string.
*
* @param {string} str
* @return {string}
*/
function escapeString (str) {
return str.replace(/([.+*?=^!:${}()[\]|\/\\])/g, '\\$1')
}
/**
* Escape the capturing group by escaping special characters and meaning.
*
* @param {string} group
* @return {string}
*/
function escapeGroup (group) {
return group.replace(/([=!:$\/()])/g, '\\$1')
}
/**
* Attach the keys as a property of the regexp.
*
* @param {!RegExp} re
* @param {Array} keys
* @return {!RegExp}
*/
function attachKeys (re, keys) {
re.keys = keys;
return re
}
/**
* Get the flags for a regexp from the options.
*
* @param {Object} options
* @return {string}
*/
function flags (options) {
return options && options.sensitive ? '' : 'i'
}
/**
* Pull out keys from a regexp.
*
* @param {!RegExp} path
* @param {!Array} keys
* @return {!RegExp}
*/
function regexpToRegexp (path, keys) {
// Use a negative lookahead to match only capturing groups.
var groups = path.source.match(/\((?!\?)/g);
if (groups) {
for (var i = 0; i < groups.length; i++) {
keys.push({
name: i,
prefix: null,
delimiter: null,
optional: false,
repeat: false,
partial: false,
asterisk: false,
pattern: null
});
}
}
return attachKeys(path, keys)
}
/**
* Transform an array into a regexp.
*
* @param {!Array} path
* @param {Array} keys
* @param {!Object} options
* @return {!RegExp}
*/
function arrayToRegexp (path, keys, options) {
var parts = [];
for (var i = 0; i < path.length; i++) {
parts.push(pathToRegexp(path[i], keys, options).source);
}
var regexp = new RegExp('(?:' + parts.join('|') + ')', flags(options));
return attachKeys(regexp, keys)
}
/**
* Create a path regexp from string input.
*
* @param {string} path
* @param {!Array} keys
* @param {!Object} options
* @return {!RegExp}
*/
function stringToRegexp (path, keys, options) {
return tokensToRegExp(parse$2(path, options), keys, options)
}
/**
* Expose a function for taking tokens and returning a RegExp.
*
* @param {!Array} tokens
* @param {(Array|Object)=} keys
* @param {Object=} options
* @return {!RegExp}
*/
function tokensToRegExp (tokens, keys, options) {
if (!isarray(keys)) {
options = /** @type {!Object} */ (keys || options);
keys = [];
}
options = options || {};
var strict = options.strict;
var end = options.end !== false;
var route = '';
// Iterate over the tokens and create our regexp string.
for (var i = 0; i < tokens.length; i++) {
var token = tokens[i];
if (typeof token === 'string') {
route += escapeString(token);
} else {
var prefix = escapeString(token.prefix);
var capture = '(?:' + token.pattern + ')';
keys.push(token);
if (token.repeat) {
capture += '(?:' + prefix + capture + ')*';
}
if (token.optional) {
if (!token.partial) {
capture = '(?:' + prefix + '(' + capture + '))?';
} else {
capture = prefix + '(' + capture + ')?';
}
} else {
capture = prefix + '(' + capture + ')';
}
route += capture;
}
}
var delimiter = escapeString(options.delimiter || '/');
var endsWithDelimiter = route.slice(-delimiter.length) === delimiter;
// In non-strict mode we allow a slash at the end of match. If the path to
// match already ends with a slash, we remove it for consistency. The slash
// is valid at the end of a path match, not in the middle. This is important
// in non-ending mode, where "/test/" shouldn't match "/test//route".
if (!strict) {
route = (endsWithDelimiter ? route.slice(0, -delimiter.length) : route) + '(?:' + delimiter + '(?=$))?';
}
if (end) {
route += '$';
} else {
// In non-ending mode, we need the capturing groups to match as much as
// possible by using a positive lookahead to the end or next path segment.
route += strict && endsWithDelimiter ? '' : '(?=' + delimiter + '|$)';
}
return attachKeys(new RegExp('^' + route, flags(options)), keys)
}
/**
* Normalize the given path string, returning a regular expression.
*
* An empty array can be passed in for the keys, which will hold the
* placeholder key descriptions. For example, using `/user/:id`, `keys` will
* contain `[{ name: 'id', delimiter: '/', optional: false, repeat: false }]`.
*
* @param {(string|RegExp|Array)} path
* @param {(Array|Object)=} keys
* @param {Object=} options
* @return {!RegExp}
*/
function pathToRegexp (path, keys, options) {
if (!isarray(keys)) {
options = /** @type {!Object} */ (keys || options);
keys = [];
}
options = options || {};
if (path instanceof RegExp) {
return regexpToRegexp(path, /** @type {!Array} */ (keys))
}
if (isarray(path)) {
return arrayToRegexp(/** @type {!Array} */ (path), /** @type {!Array} */ (keys), options)
}
return stringToRegexp(/** @type {string} */ (path), /** @type {!Array} */ (keys), options)
}
pathToRegexp_1.parse = parse_1;
pathToRegexp_1.compile = compile_1;
pathToRegexp_1.tokensToFunction = tokensToFunction_1;
pathToRegexp_1.tokensToRegExp = tokensToRegExp_1;
/* */
// $flow-disable-line
var regexpCompileCache = Object.create(null);
function fillParams (
path,
params,
routeMsg
) {
params = params || {};
try {
var filler =
regexpCompileCache[path] ||
(regexpCompileCache[path] = pathToRegexp_1.compile(path));
// Fix #2505 resolving asterisk routes { name: 'not-found', params: { pathMatch: '/not-found' }}
// and fix #3106 so that you can work with location descriptor object having params.pathMatch equal to empty string
if (typeof params.pathMatch === 'string') { params[0] = params.pathMatch; }
return filler(params, { pretty: true })
} catch (e) {
return ''
} finally {
// delete the 0 if it was added
delete params[0];
}
}
/* */
function normalizeLocation (
raw,
current,
append,
router
) {
var next = typeof raw === 'string' ? { path: raw } : raw;
// named target
if (next._normalized) {
return next
} else if (next.name) {
next = extend$2({}, raw);
var params = next.params;
if (params && typeof params === 'object') {
next.params = extend$2({}, params);
}
return next
}
// relative params
if (!next.path && next.params && current) {
next = extend$2({}, next);
next._normalized = true;
var params$1 = extend$2(extend$2({}, current.params), next.params);
if (current.name) {
next.name = current.name;
next.params = params$1;
} else if (current.matched.length) {
var rawPath = current.matched[current.matched.length - 1].path;
next.path = fillParams(rawPath, params$1, ("path " + (current.path)));
} else ;
return next
}
var parsedPath = parsePath$1(next.path || '');
var basePath = (current && current.path) || '/';
var path = parsedPath.path
? resolvePath(parsedPath.path, basePath, append || next.append)
: basePath;
var query = resolveQuery(
parsedPath.query,
next.query,
router && router.options.parseQuery
);
var hash = next.hash || parsedPath.hash;
if (hash && hash.charAt(0) !== '#') {
hash = "#" + hash;
}
return {
_normalized: true,
path: path,
query: query,
hash: hash
}
}
/* */
// work around weird flow bug
var toTypes = [String, Object];
var eventTypes = [String, Array];
var noop$1 = function () {};
var Link = {
name: 'RouterLink',
props: {
to: {
type: toTypes,
required: true
},
tag: {
type: String,
default: 'a'
},
exact: Boolean,
append: Boolean,
replace: Boolean,
activeClass: String,
exactActiveClass: String,
ariaCurrentValue: {
type: String,
default: 'page'
},
event: {
type: eventTypes,
default: 'click'
}
},
render: function render (h) {
var this$1 = this;
var router = this.$router;
var current = this.$route;
var ref = router.resolve(
this.to,
current,
this.append
);
var location = ref.location;
var route = ref.route;
var href = ref.href;
var classes = {};
var globalActiveClass = router.options.linkActiveClass;
var globalExactActiveClass = router.options.linkExactActiveClass;
// Support global empty active class
var activeClassFallback =
globalActiveClass == null ? 'router-link-active' : globalActiveClass;
var exactActiveClassFallback =
globalExactActiveClass == null
? 'router-link-exact-active'
: globalExactActiveClass;
var activeClass =
this.activeClass == null ? activeClassFallback : this.activeClass;
var exactActiveClass =
this.exactActiveClass == null
? exactActiveClassFallback
: this.exactActiveClass;
var compareTarget = route.redirectedFrom
? createRoute(null, normalizeLocation(route.redirectedFrom), null, router)
: route;
classes[exactActiveClass] = isSameRoute(current, compareTarget);
classes[activeClass] = this.exact
? classes[exactActiveClass]
: isIncludedRoute(current, compareTarget);
var ariaCurrentValue = classes[exactActiveClass] ? this.ariaCurrentValue : null;
var handler = function (e) {
if (guardEvent(e)) {
if (this$1.replace) {
router.replace(location, noop$1);
} else {
router.push(location, noop$1);
}
}
};
var on = { click: guardEvent };
if (Array.isArray(this.event)) {
this.event.forEach(function (e) {
on[e] = handler;
});
} else {
on[this.event] = handler;
}
var data = { class: classes };
var scopedSlot =
!this.$scopedSlots.$hasNormal &&
this.$scopedSlots.default &&
this.$scopedSlots.default({
href: href,
route: route,
navigate: handler,
isActive: classes[activeClass],
isExactActive: classes[exactActiveClass]
});
if (scopedSlot) {
if (scopedSlot.length === 1) {
return scopedSlot[0]
} else if (scopedSlot.length > 1 || !scopedSlot.length) {
return scopedSlot.length === 0 ? h() : h('span', {}, scopedSlot)
}
}
if (this.tag === 'a') {
data.on = on;
data.attrs = { href: href, 'aria-current': ariaCurrentValue };
} else {
// find the first <a> child and apply listener and href
var a = findAnchor(this.$slots.default);
if (a) {
// in case the <a> is a static node
a.isStatic = false;
var aData = (a.data = extend$2({}, a.data));
aData.on = aData.on || {};
// transform existing events in both objects into arrays so we can push later
for (var event in aData.on) {
var handler$1 = aData.on[event];
if (event in on) {
aData.on[event] = Array.isArray(handler$1) ? handler$1 : [handler$1];
}
}
// append new listeners for router-link
for (var event$1 in on) {
if (event$1 in aData.on) {
// on[event] is always a function
aData.on[event$1].push(on[event$1]);
} else {
aData.on[event$1] = handler;
}
}
var aAttrs = (a.data.attrs = extend$2({}, a.data.attrs));
aAttrs.href = href;
aAttrs['aria-current'] = ariaCurrentValue;
} else {
// doesn't have <a> child, apply listener to self
data.on = on;
}
}
return h(this.tag, data, this.$slots.default)
}
};
function guardEvent (e) {
// don't redirect with control keys
if (e.metaKey || e.altKey || e.ctrlKey || e.shiftKey) { return }
// don't redirect when preventDefault called
if (e.defaultPrevented) { return }
// don't redirect on right click
if (e.button !== undefined && e.button !== 0) { return }
// don't redirect if `target="_blank"`
if (e.currentTarget && e.currentTarget.getAttribute) {
var target = e.currentTarget.getAttribute('target');
if (/\b_blank\b/i.test(target)) { return }
}
// this may be a Weex event which doesn't have this method
if (e.preventDefault) {
e.preventDefault();
}
return true
}
function findAnchor (children) {
if (children) {
var child;
for (var i = 0; i < children.length; i++) {
child = children[i];
if (child.tag === 'a') {
return child
}
if (child.children && (child = findAnchor(child.children))) {
return child
}
}
}
}
var _Vue;
function install$2 (Vue) {
if (install$2.installed && _Vue === Vue) { return }
install$2.installed = true;
_Vue = Vue;
var isDef = function (v) { return v !== undefined; };
var registerInstance = function (vm, callVal) {
var i = vm.$options._parentVnode;
if (isDef(i) && isDef(i = i.data) && isDef(i = i.registerRouteInstance)) {
i(vm, callVal);
}
};
Vue.mixin({
beforeCreate: function beforeCreate () {
if (isDef(this.$options.router)) {
this._routerRoot = this;
this._router = this.$options.router;
this._router.init(this);
Vue.util.defineReactive(this, '_route', this._router.history.current);
} else {
this._routerRoot = (this.$parent && this.$parent._routerRoot) || this;
}
registerInstance(this, this);
},
destroyed: function destroyed () {
registerInstance(this);
}
});
Object.defineProperty(Vue.prototype, '$router', {
get: function get () { return this._routerRoot._router }
});
Object.defineProperty(Vue.prototype, '$route', {
get: function get () { return this._routerRoot._route }
});
Vue.component('RouterView', View);
Vue.component('RouterLink', Link);
var strats = Vue.config.optionMergeStrategies;
// use the same hook merging strategy for route hooks
strats.beforeRouteEnter = strats.beforeRouteLeave = strats.beforeRouteUpdate = strats.created;
}
/* */
var inBrowser$1 = typeof window !== 'undefined';
/* */
function createRouteMap (
routes,
oldPathList,
oldPathMap,
oldNameMap
) {
// the path list is used to control path matching priority
var pathList = oldPathList || [];
// $flow-disable-line
var pathMap = oldPathMap || Object.create(null);
// $flow-disable-line
var nameMap = oldNameMap || Object.create(null);
routes.forEach(function (route) {
addRouteRecord(pathList, pathMap, nameMap, route);
});
// ensure wildcard routes are always at the end
for (var i = 0, l = pathList.length; i < l; i++) {
if (pathList[i] === '*') {
pathList.push(pathList.splice(i, 1)[0]);
l--;
i--;
}
}
return {
pathList: pathList,
pathMap: pathMap,
nameMap: nameMap
}
}
function addRouteRecord (
pathList,
pathMap,
nameMap,
route,
parent,
matchAs
) {
var path = route.path;
var name = route.name;
var pathToRegexpOptions =
route.pathToRegexpOptions || {};
var normalizedPath = normalizePath(path, parent, pathToRegexpOptions.strict);
if (typeof route.caseSensitive === 'boolean') {
pathToRegexpOptions.sensitive = route.caseSensitive;
}
var record = {
path: normalizedPath,
regex: compileRouteRegex(normalizedPath, pathToRegexpOptions),
components: route.components || { default: route.component },
instances: {},
enteredCbs: {},
name: name,
parent: parent,
matchAs: matchAs,
redirect: route.redirect,
beforeEnter: route.beforeEnter,
meta: route.meta || {},
props:
route.props == null
? {}
: route.components
? route.props
: { default: route.props }
};
if (route.children) {
route.children.forEach(function (child) {
var childMatchAs = matchAs
? cleanPath((matchAs + "/" + (child.path)))
: undefined;
addRouteRecord(pathList, pathMap, nameMap, child, record, childMatchAs);
});
}
if (!pathMap[record.path]) {
pathList.push(record.path);
pathMap[record.path] = record;
}
if (route.alias !== undefined) {
var aliases = Array.isArray(route.alias) ? route.alias : [route.alias];
for (var i = 0; i < aliases.length; ++i) {
var alias = aliases[i];
var aliasRoute = {
path: alias,
children: route.children
};
addRouteRecord(
pathList,
pathMap,
nameMap,
aliasRoute,
parent,
record.path || '/' // matchAs
);
}
}
if (name) {
if (!nameMap[name]) {
nameMap[name] = record;
}
}
}
function compileRouteRegex (
path,
pathToRegexpOptions
) {
var regex = pathToRegexp_1(path, [], pathToRegexpOptions);
return regex
}
function normalizePath (
path,
parent,
strict
) {
if (!strict) { path = path.replace(/\/$/, ''); }
if (path[0] === '/') { return path }
if (parent == null) { return path }
return cleanPath(((parent.path) + "/" + path))
}
/* */
function createMatcher (
routes,
router
) {
var ref = createRouteMap(routes);
var pathList = ref.pathList;
var pathMap = ref.pathMap;
var nameMap = ref.nameMap;
function addRoutes (routes) {
createRouteMap(routes, pathList, pathMap, nameMap);
}
function match (
raw,
currentRoute,
redirectedFrom
) {
var location = normalizeLocation(raw, currentRoute, false, router);
var name = location.name;
if (name) {
var record = nameMap[name];
if (!record) { return _createRoute(null, location) }
var paramNames = record.regex.keys
.filter(function (key) { return !key.optional; })
.map(function (key) { return key.name; });
if (typeof location.params !== 'object') {
location.params = {};
}
if (currentRoute && typeof currentRoute.params === 'object') {
for (var key in currentRoute.params) {
if (!(key in location.params) && paramNames.indexOf(key) > -1) {
location.params[key] = currentRoute.params[key];
}
}
}
location.path = fillParams(record.path, location.params);
return _createRoute(record, location, redirectedFrom)
} else if (location.path) {
location.params = {};
for (var i = 0; i < pathList.length; i++) {
var path = pathList[i];
var record$1 = pathMap[path];
if (matchRoute(record$1.regex, location.path, location.params)) {
return _createRoute(record$1, location, redirectedFrom)
}
}
}
// no match
return _createRoute(null, location)
}
function redirect (
record,
location
) {
var originalRedirect = record.redirect;
var redirect = typeof originalRedirect === 'function'
? originalRedirect(createRoute(record, location, null, router))
: originalRedirect;
if (typeof redirect === 'string') {
redirect = { path: redirect };
}
if (!redirect || typeof redirect !== 'object') {
return _createRoute(null, location)
}
var re = redirect;
var name = re.name;
var path = re.path;
var query = location.query;
var hash = location.hash;
var params = location.params;
query = re.hasOwnProperty('query') ? re.query : query;
hash = re.hasOwnProperty('hash') ? re.hash : hash;
params = re.hasOwnProperty('params') ? re.params : params;
if (name) {
// resolved named direct
var targetRecord = nameMap[name];
return match({
_normalized: true,
name: name,
query: query,
hash: hash,
params: params
}, undefined, location)
} else if (path) {
// 1. resolve relative redirect
var rawPath = resolveRecordPath(path, record);
// 2. resolve params
var resolvedPath = fillParams(rawPath, params);
// 3. rematch with existing query and hash
return match({
_normalized: true,
path: resolvedPath,
query: query,
hash: hash
}, undefined, location)
} else {
return _createRoute(null, location)
}
}
function alias (
record,
location,
matchAs
) {
var aliasedPath = fillParams(matchAs, location.params);
var aliasedMatch = match({
_normalized: true,
path: aliasedPath
});
if (aliasedMatch) {
var matched = aliasedMatch.matched;
var aliasedRecord = matched[matched.length - 1];
location.params = aliasedMatch.params;
return _createRoute(aliasedRecord, location)
}
return _createRoute(null, location)
}
function _createRoute (
record,
location,
redirectedFrom
) {
if (record && record.redirect) {
return redirect(record, redirectedFrom || location)
}
if (record && record.matchAs) {
return alias(record, location, record.matchAs)
}
return createRoute(record, location, redirectedFrom, router)
}
return {
match: match,
addRoutes: addRoutes
}
}
function matchRoute (
regex,
path,
params
) {
try {
path = decodeURI(path);
} catch (err) {
}
var m = path.match(regex);
if (!m) {
return false
} else if (!params) {
return true
}
for (var i = 1, len = m.length; i < len; ++i) {
var key = regex.keys[i - 1];
if (key) {
// Fix #1994: using * with props: true generates a param named 0
params[key.name || 'pathMatch'] = m[i];
}
}
return true
}
function resolveRecordPath (path, record) {
return resolvePath(path, record.parent ? record.parent.path : '/', true)
}
/* */
// use User Timing api (if present) for more accurate key precision
var Time =
inBrowser$1 && window.performance && window.performance.now
? window.performance
: Date;
function genStateKey () {
return Time.now().toFixed(3)
}
var _key = genStateKey();
function getStateKey () {
return _key
}
function setStateKey (key) {
return (_key = key)
}
/* */
var positionStore = Object.create(null);
function setupScroll () {
// Prevent browser scroll behavior on History popstate
if ('scrollRestoration' in window.history) {
window.history.scrollRestoration = 'manual';
}
// Fix for #1585 for Firefox
// Fix for #2195 Add optional third attribute to workaround a bug in safari https://bugs.webkit.org/show_bug.cgi?id=182678
// Fix for #2774 Support for apps loaded from Windows file shares not mapped to network drives: replaced location.origin with
// window.location.protocol + '//' + window.location.host
// location.host contains the port and location.hostname doesn't
var protocolAndPath = window.location.protocol + '//' + window.location.host;
var absolutePath = window.location.href.replace(protocolAndPath, '');
// preserve existing history state as it could be overriden by the user
var stateCopy = extend$2({}, window.history.state);
stateCopy.key = getStateKey();
window.history.replaceState(stateCopy, '', absolutePath);
window.addEventListener('popstate', handlePopState);
return function () {
window.removeEventListener('popstate', handlePopState);
}
}
function handleScroll (
router,
to,
from,
isPop
) {
if (!router.app) {
return
}
var behavior = router.options.scrollBehavior;
if (!behavior) {
return
}
// wait until re-render finishes before scrolling
router.app.$nextTick(function () {
var position = getScrollPosition();
var shouldScroll = behavior.call(
router,
to,
from,
isPop ? position : null
);
if (!shouldScroll) {
return
}
if (typeof shouldScroll.then === 'function') {
shouldScroll
.then(function (shouldScroll) {
scrollToPosition((shouldScroll), position);
})
.catch(function (err) {
});
} else {
scrollToPosition(shouldScroll, position);
}
});
}
function saveScrollPosition () {
var key = getStateKey();
if (key) {
positionStore[key] = {
x: window.pageXOffset,
y: window.pageYOffset
};
}
}
function handlePopState (e) {
saveScrollPosition();
if (e.state && e.state.key) {
setStateKey(e.state.key);
}
}
function getScrollPosition () {
var key = getStateKey();
if (key) {
return positionStore[key]
}
}
function getElementPosition (el, offset) {
var docEl = document.documentElement;
var docRect = docEl.getBoundingClientRect();
var elRect = el.getBoundingClientRect();
return {
x: elRect.left - docRect.left - offset.x,
y: elRect.top - docRect.top - offset.y
}
}
function isValidPosition (obj) {
return isNumber(obj.x) || isNumber(obj.y)
}
function normalizePosition (obj) {
return {
x: isNumber(obj.x) ? obj.x : window.pageXOffset,
y: isNumber(obj.y) ? obj.y : window.pageYOffset
}
}
function normalizeOffset (obj) {
return {
x: isNumber(obj.x) ? obj.x : 0,
y: isNumber(obj.y) ? obj.y : 0
}
}
function isNumber (v) {
return typeof v === 'number'
}
var hashStartsWithNumberRE = /^#\d/;
function scrollToPosition (shouldScroll, position) {
var isObject = typeof shouldScroll === 'object';
if (isObject && typeof shouldScroll.selector === 'string') {
// getElementById would still fail if the selector contains a more complicated query like #main[data-attr]
// but at the same time, it doesn't make much sense to select an element with an id and an extra selector
var el = hashStartsWithNumberRE.test(shouldScroll.selector) // $flow-disable-line
? document.getElementById(shouldScroll.selector.slice(1)) // $flow-disable-line
: document.querySelector(shouldScroll.selector);
if (el) {
var offset =
shouldScroll.offset && typeof shouldScroll.offset === 'object'
? shouldScroll.offset
: {};
offset = normalizeOffset(offset);
position = getElementPosition(el, offset);
} else if (isValidPosition(shouldScroll)) {
position = normalizePosition(shouldScroll);
}
} else if (isObject && isValidPosition(shouldScroll)) {
position = normalizePosition(shouldScroll);
}
if (position) {
// $flow-disable-line
if ('scrollBehavior' in document.documentElement.style) {
window.scrollTo({
left: position.x,
top: position.y,
// $flow-disable-line
behavior: shouldScroll.behavior
});
} else {
window.scrollTo(position.x, position.y);
}
}
}
/* */
var supportsPushState =
inBrowser$1 &&
(function () {
var ua = window.navigator.userAgent;
if (
(ua.indexOf('Android 2.') !== -1 || ua.indexOf('Android 4.0') !== -1) &&
ua.indexOf('Mobile Safari') !== -1 &&
ua.indexOf('Chrome') === -1 &&
ua.indexOf('Windows Phone') === -1
) {
return false
}
return window.history && typeof window.history.pushState === 'function'
})();
function pushState (url, replace) {
saveScrollPosition();
// try...catch the pushState call to get around Safari
// DOM Exception 18 where it limits to 100 pushState calls
var history = window.history;
try {
if (replace) {
// preserve existing history state as it could be overriden by the user
var stateCopy = extend$2({}, history.state);
stateCopy.key = getStateKey();
history.replaceState(stateCopy, '', url);
} else {
history.pushState({ key: setStateKey(genStateKey()) }, '', url);
}
} catch (e) {
window.location[replace ? 'replace' : 'assign'](url);
}
}
function replaceState (url) {
pushState(url, true);
}
/* */
function runQueue (queue, fn, cb) {
var step = function (index) {
if (index >= queue.length) {
cb();
} else {
if (queue[index]) {
fn(queue[index], function () {
step(index + 1);
});
} else {
step(index + 1);
}
}
};
step(0);
}
// When changing thing, also edit router.d.ts
var NavigationFailureType = {
redirected: 2,
aborted: 4,
cancelled: 8,
duplicated: 16
};
function createNavigationRedirectedError (from, to) {
return createRouterError(
from,
to,
NavigationFailureType.redirected,
("Redirected when going from \"" + (from.fullPath) + "\" to \"" + (stringifyRoute(
to
)) + "\" via a navigation guard.")
)
}
function createNavigationDuplicatedError (from, to) {
var error = createRouterError(
from,
to,
NavigationFailureType.duplicated,
("Avoided redundant navigation to current location: \"" + (from.fullPath) + "\".")
);
// backwards compatible with the first introduction of Errors
error.name = 'NavigationDuplicated';
return error
}
function createNavigationCancelledError (from, to) {
return createRouterError(
from,
to,
NavigationFailureType.cancelled,
("Navigation cancelled from \"" + (from.fullPath) + "\" to \"" + (to.fullPath) + "\" with a new navigation.")
)
}
function createNavigationAbortedError (from, to) {
return createRouterError(
from,
to,
NavigationFailureType.aborted,
("Navigation aborted from \"" + (from.fullPath) + "\" to \"" + (to.fullPath) + "\" via a navigation guard.")
)
}
function createRouterError (from, to, type, message) {
var error = new Error(message);
error._isRouter = true;
error.from = from;
error.to = to;
error.type = type;
return error
}
var propertiesToLog = ['params', 'query', 'hash'];
function stringifyRoute (to) {
if (typeof to === 'string') { return to }
if ('path' in to) { return to.path }
var location = {};
propertiesToLog.forEach(function (key) {
if (key in to) { location[key] = to[key]; }
});
return JSON.stringify(location, null, 2)
}
function isError (err) {
return Object.prototype.toString.call(err).indexOf('Error') > -1
}
function isNavigationFailure (err, errorType) {
return (
isError(err) &&
err._isRouter &&
(errorType == null || err.type === errorType)
)
}
/* */
function resolveAsyncComponents (matched) {
return function (to, from, next) {
var hasAsync = false;
var pending = 0;
var error = null;
flatMapComponents(matched, function (def, _, match, key) {
// if it's a function and doesn't have cid attached,
// assume it's an async component resolve function.
// we are not using Vue's default async resolving mechanism because
// we want to halt the navigation until the incoming component has been
// resolved.
if (typeof def === 'function' && def.cid === undefined) {
hasAsync = true;
pending++;
var resolve = once$1(function (resolvedDef) {
if (isESModule(resolvedDef)) {
resolvedDef = resolvedDef.default;
}
// save resolved on async factory in case it's used elsewhere
def.resolved = typeof resolvedDef === 'function'
? resolvedDef
: _Vue.extend(resolvedDef);
match.components[key] = resolvedDef;
pending--;
if (pending <= 0) {
next();
}
});
var reject = once$1(function (reason) {
var msg = "Failed to resolve async component " + key + ": " + reason;
if (!error) {
error = isError(reason)
? reason
: new Error(msg);
next(error);
}
});
var res;
try {
res = def(resolve, reject);
} catch (e) {
reject(e);
}
if (res) {
if (typeof res.then === 'function') {
res.then(resolve, reject);
} else {
// new syntax in Vue 2.3
var comp = res.component;
if (comp && typeof comp.then === 'function') {
comp.then(resolve, reject);
}
}
}
}
});
if (!hasAsync) { next(); }
}
}
function flatMapComponents (
matched,
fn
) {
return flatten(matched.map(function (m) {
return Object.keys(m.components).map(function (key) { return fn(
m.components[key],
m.instances[key],
m, key
); })
}))
}
function flatten (arr) {
return Array.prototype.concat.apply([], arr)
}
var hasSymbol$1 =
typeof Symbol === 'function' &&
typeof Symbol.toStringTag === 'symbol';
function isESModule (obj) {
return obj.__esModule || (hasSymbol$1 && obj[Symbol.toStringTag] === 'Module')
}
// in Webpack 2, require.ensure now also returns a Promise
// so the resolve/reject functions may get called an extra time
// if the user uses an arrow function shorthand that happens to
// return that Promise.
function once$1 (fn) {
var called = false;
return function () {
var args = [], len = arguments.length;
while ( len-- ) args[ len ] = arguments[ len ];
if (called) { return }
called = true;
return fn.apply(this, args)
}
}
/* */
var History = function History (router, base) {
this.router = router;
this.base = normalizeBase(base);
// start with a route object that stands for "nowhere"
this.current = START;
this.pending = null;
this.ready = false;
this.readyCbs = [];
this.readyErrorCbs = [];
this.errorCbs = [];
this.listeners = [];
};
History.prototype.listen = function listen (cb) {
this.cb = cb;
};
History.prototype.onReady = function onReady (cb, errorCb) {
if (this.ready) {
cb();
} else {
this.readyCbs.push(cb);
if (errorCb) {
this.readyErrorCbs.push(errorCb);
}
}
};
History.prototype.onError = function onError (errorCb) {
this.errorCbs.push(errorCb);
};
History.prototype.transitionTo = function transitionTo (
location,
onComplete,
onAbort
) {
var this$1 = this;
var route;
// catch redirect option https://github.com/vuejs/vue-router/issues/3201
try {
route = this.router.match(location, this.current);
} catch (e) {
this.errorCbs.forEach(function (cb) {
cb(e);
});
// Exception should still be thrown
throw e
}
var prev = this.current;
this.confirmTransition(
route,
function () {
this$1.updateRoute(route);
onComplete && onComplete(route);
this$1.ensureURL();
this$1.router.afterHooks.forEach(function (hook) {
hook && hook(route, prev);
});
// fire ready cbs once
if (!this$1.ready) {
this$1.ready = true;
this$1.readyCbs.forEach(function (cb) {
cb(route);
});
}
},
function (err) {
if (onAbort) {
onAbort(err);
}
if (err && !this$1.ready) {
// Initial redirection should not mark the history as ready yet
// because it's triggered by the redirection instead
// https://github.com/vuejs/vue-router/issues/3225
// https://github.com/vuejs/vue-router/issues/3331
if (!isNavigationFailure(err, NavigationFailureType.redirected) || prev !== START) {
this$1.ready = true;
this$1.readyErrorCbs.forEach(function (cb) {
cb(err);
});
}
}
}
);
};
History.prototype.confirmTransition = function confirmTransition (route, onComplete, onAbort) {
var this$1 = this;
var current = this.current;
this.pending = route;
var abort = function (err) {
// changed after adding errors with
// https://github.com/vuejs/vue-router/pull/3047 before that change,
// redirect and aborted navigation would produce an err == null
if (!isNavigationFailure(err) && isError(err)) {
if (this$1.errorCbs.length) {
this$1.errorCbs.forEach(function (cb) {
cb(err);
});
} else {
console.error(err);
}
}
onAbort && onAbort(err);
};
var lastRouteIndex = route.matched.length - 1;
var lastCurrentIndex = current.matched.length - 1;
if (
isSameRoute(route, current) &&
// in the case the route map has been dynamically appended to
lastRouteIndex === lastCurrentIndex &&
route.matched[lastRouteIndex] === current.matched[lastCurrentIndex]
) {
this.ensureURL();
return abort(createNavigationDuplicatedError(current, route))
}
var ref = resolveQueue(
this.current.matched,
route.matched
);
var updated = ref.updated;
var deactivated = ref.deactivated;
var activated = ref.activated;
var queue = [].concat(
// in-component leave guards
extractLeaveGuards(deactivated),
// global before hooks
this.router.beforeHooks,
// in-component update hooks
extractUpdateHooks(updated),
// in-config enter guards
activated.map(function (m) { return m.beforeEnter; }),
// async components
resolveAsyncComponents(activated)
);
var iterator = function (hook, next) {
if (this$1.pending !== route) {
return abort(createNavigationCancelledError(current, route))
}
try {
hook(route, current, function (to) {
if (to === false) {
// next(false) -> abort navigation, ensure current URL
this$1.ensureURL(true);
abort(createNavigationAbortedError(current, route));
} else if (isError(to)) {
this$1.ensureURL(true);
abort(to);
} else if (
typeof to === 'string' ||
(typeof to === 'object' &&
(typeof to.path === 'string' || typeof to.name === 'string'))
) {
// next('/') or next({ path: '/' }) -> redirect
abort(createNavigationRedirectedError(current, route));
if (typeof to === 'object' && to.replace) {
this$1.replace(to);
} else {
this$1.push(to);
}
} else {
// confirm transition and pass on the value
next(to);
}
});
} catch (e) {
abort(e);
}
};
runQueue(queue, iterator, function () {
// wait until async components are resolved before
// extracting in-component enter guards
var enterGuards = extractEnterGuards(activated);
var queue = enterGuards.concat(this$1.router.resolveHooks);
runQueue(queue, iterator, function () {
if (this$1.pending !== route) {
return abort(createNavigationCancelledError(current, route))
}
this$1.pending = null;
onComplete(route);
if (this$1.router.app) {
this$1.router.app.$nextTick(function () {
handleRouteEntered(route);
});
}
});
});
};
History.prototype.updateRoute = function updateRoute (route) {
this.current = route;
this.cb && this.cb(route);
};
History.prototype.setupListeners = function setupListeners () {
// Default implementation is empty
};
History.prototype.teardown = function teardown () {
// clean up event listeners
// https://github.com/vuejs/vue-router/issues/2341
this.listeners.forEach(function (cleanupListener) {
cleanupListener();
});
this.listeners = [];
// reset current history route
// https://github.com/vuejs/vue-router/issues/3294
this.current = START;
this.pending = null;
};
function normalizeBase (base) {
if (!base) {
if (inBrowser$1) {
// respect <base> tag
var baseEl = document.querySelector('base');
base = (baseEl && baseEl.getAttribute('href')) || '/';
// strip full URL origin
base = base.replace(/^https?:\/\/[^\/]+/, '');
} else {
base = '/';
}
}
// make sure there's the starting slash
if (base.charAt(0) !== '/') {
base = '/' + base;
}
// remove trailing slash
return base.replace(/\/$/, '')
}
function resolveQueue (
current,
next
) {
var i;
var max = Math.max(current.length, next.length);
for (i = 0; i < max; i++) {
if (current[i] !== next[i]) {
break
}
}
return {
updated: next.slice(0, i),
activated: next.slice(i),
deactivated: current.slice(i)
}
}
function extractGuards (
records,
name,
bind,
reverse
) {
var guards = flatMapComponents(records, function (def, instance, match, key) {
var guard = extractGuard(def, name);
if (guard) {
return Array.isArray(guard)
? guard.map(function (guard) { return bind(guard, instance, match, key); })
: bind(guard, instance, match, key)
}
});
return flatten(reverse ? guards.reverse() : guards)
}
function extractGuard (
def,
key
) {
if (typeof def !== 'function') {
// extend now so that global mixins are applied.
def = _Vue.extend(def);
}
return def.options[key]
}
function extractLeaveGuards (deactivated) {
return extractGuards(deactivated, 'beforeRouteLeave', bindGuard, true)
}
function extractUpdateHooks (updated) {
return extractGuards(updated, 'beforeRouteUpdate', bindGuard)
}
function bindGuard (guard, instance) {
if (instance) {
return function boundRouteGuard () {
return guard.apply(instance, arguments)
}
}
}
function extractEnterGuards (
activated
) {
return extractGuards(
activated,
'beforeRouteEnter',
function (guard, _, match, key) {
return bindEnterGuard(guard, match, key)
}
)
}
function bindEnterGuard (
guard,
match,
key
) {
return function routeEnterGuard (to, from, next) {
return guard(to, from, function (cb) {
if (typeof cb === 'function') {
if (!match.enteredCbs[key]) {
match.enteredCbs[key] = [];
}
match.enteredCbs[key].push(cb);
}
next(cb);
})
}
}
/* */
var HTML5History = /*@__PURE__*/(function (History) {
function HTML5History (router, base) {
History.call(this, router, base);
this._startLocation = getLocation(this.base);
}
if ( History ) HTML5History.__proto__ = History;
HTML5History.prototype = Object.create( History && History.prototype );
HTML5History.prototype.constructor = HTML5History;
HTML5History.prototype.setupListeners = function setupListeners () {
var this$1 = this;
if (this.listeners.length > 0) {
return
}
var router = this.router;
var expectScroll = router.options.scrollBehavior;
var supportsScroll = supportsPushState && expectScroll;
if (supportsScroll) {
this.listeners.push(setupScroll());
}
var handleRoutingEvent = function () {
var current = this$1.current;
// Avoiding first `popstate` event dispatched in some browsers but first
// history route not updated since async guard at the same time.
var location = getLocation(this$1.base);
if (this$1.current === START && location === this$1._startLocation) {
return
}
this$1.transitionTo(location, function (route) {
if (supportsScroll) {
handleScroll(router, route, current, true);
}
});
};
window.addEventListener('popstate', handleRoutingEvent);
this.listeners.push(function () {
window.removeEventListener('popstate', handleRoutingEvent);
});
};
HTML5History.prototype.go = function go (n) {
window.history.go(n);
};
HTML5History.prototype.push = function push (location, onComplete, onAbort) {
var this$1 = this;
var ref = this;
var fromRoute = ref.current;
this.transitionTo(location, function (route) {
pushState(cleanPath(this$1.base + route.fullPath));
handleScroll(this$1.router, route, fromRoute, false);
onComplete && onComplete(route);
}, onAbort);
};
HTML5History.prototype.replace = function replace (location, onComplete, onAbort) {
var this$1 = this;
var ref = this;
var fromRoute = ref.current;
this.transitionTo(location, function (route) {
replaceState(cleanPath(this$1.base + route.fullPath));
handleScroll(this$1.router, route, fromRoute, false);
onComplete && onComplete(route);
}, onAbort);
};
HTML5History.prototype.ensureURL = function ensureURL (push) {
if (getLocation(this.base) !== this.current.fullPath) {
var current = cleanPath(this.base + this.current.fullPath);
push ? pushState(current) : replaceState(current);
}
};
HTML5History.prototype.getCurrentLocation = function getCurrentLocation () {
return getLocation(this.base)
};
return HTML5History;
}(History));
function getLocation (base) {
var path = window.location.pathname;
if (base && path.toLowerCase().indexOf(base.toLowerCase()) === 0) {
path = path.slice(base.length);
}
return (path || '/') + window.location.search + window.location.hash
}
/* */
var HashHistory = /*@__PURE__*/(function (History) {
function HashHistory (router, base, fallback) {
History.call(this, router, base);
// check history fallback deeplinking
if (fallback && checkFallback(this.base)) {
return
}
ensureSlash();
}
if ( History ) HashHistory.__proto__ = History;
HashHistory.prototype = Object.create( History && History.prototype );
HashHistory.prototype.constructor = HashHistory;
// this is delayed until the app mounts
// to avoid the hashchange listener being fired too early
HashHistory.prototype.setupListeners = function setupListeners () {
var this$1 = this;
if (this.listeners.length > 0) {
return
}
var router = this.router;
var expectScroll = router.options.scrollBehavior;
var supportsScroll = supportsPushState && expectScroll;
if (supportsScroll) {
this.listeners.push(setupScroll());
}
var handleRoutingEvent = function () {
var current = this$1.current;
if (!ensureSlash()) {
return
}
this$1.transitionTo(getHash(), function (route) {
if (supportsScroll) {
handleScroll(this$1.router, route, current, true);
}
if (!supportsPushState) {
replaceHash(route.fullPath);
}
});
};
var eventType = supportsPushState ? 'popstate' : 'hashchange';
window.addEventListener(
eventType,
handleRoutingEvent
);
this.listeners.push(function () {
window.removeEventListener(eventType, handleRoutingEvent);
});
};
HashHistory.prototype.push = function push (location, onComplete, onAbort) {
var this$1 = this;
var ref = this;
var fromRoute = ref.current;
this.transitionTo(
location,
function (route) {
pushHash(route.fullPath);
handleScroll(this$1.router, route, fromRoute, false);
onComplete && onComplete(route);
},
onAbort
);
};
HashHistory.prototype.replace = function replace (location, onComplete, onAbort) {
var this$1 = this;
var ref = this;
var fromRoute = ref.current;
this.transitionTo(
location,
function (route) {
replaceHash(route.fullPath);
handleScroll(this$1.router, route, fromRoute, false);
onComplete && onComplete(route);
},
onAbort
);
};
HashHistory.prototype.go = function go (n) {
window.history.go(n);
};
HashHistory.prototype.ensureURL = function ensureURL (push) {
var current = this.current.fullPath;
if (getHash() !== current) {
push ? pushHash(current) : replaceHash(current);
}
};
HashHistory.prototype.getCurrentLocation = function getCurrentLocation () {
return getHash()
};
return HashHistory;
}(History));
function checkFallback (base) {
var location = getLocation(base);
if (!/^\/#/.test(location)) {
window.location.replace(cleanPath(base + '/#' + location));
return true
}
}
function ensureSlash () {
var path = getHash();
if (path.charAt(0) === '/') {
return true
}
replaceHash('/' + path);
return false
}
function getHash () {
// We can't use window.location.hash here because it's not
// consistent across browsers - Firefox will pre-decode it!
var href = window.location.href;
var index = href.indexOf('#');
// empty path
if (index < 0) { return '' }
href = href.slice(index + 1);
return href
}
function getUrl (path) {
var href = window.location.href;
var i = href.indexOf('#');
var base = i >= 0 ? href.slice(0, i) : href;
return (base + "#" + path)
}
function pushHash (path) {
if (supportsPushState) {
pushState(getUrl(path));
} else {
window.location.hash = path;
}
}
function replaceHash (path) {
if (supportsPushState) {
replaceState(getUrl(path));
} else {
window.location.replace(getUrl(path));
}
}
/* */
var AbstractHistory = /*@__PURE__*/(function (History) {
function AbstractHistory (router, base) {
History.call(this, router, base);
this.stack = [];
this.index = -1;
}
if ( History ) AbstractHistory.__proto__ = History;
AbstractHistory.prototype = Object.create( History && History.prototype );
AbstractHistory.prototype.constructor = AbstractHistory;
AbstractHistory.prototype.push = function push (location, onComplete, onAbort) {
var this$1 = this;
this.transitionTo(
location,
function (route) {
this$1.stack = this$1.stack.slice(0, this$1.index + 1).concat(route);
this$1.index++;
onComplete && onComplete(route);
},
onAbort
);
};
AbstractHistory.prototype.replace = function replace (location, onComplete, onAbort) {
var this$1 = this;
this.transitionTo(
location,
function (route) {
this$1.stack = this$1.stack.slice(0, this$1.index).concat(route);
onComplete && onComplete(route);
},
onAbort
);
};
AbstractHistory.prototype.go = function go (n) {
var this$1 = this;
var targetIndex = this.index + n;
if (targetIndex < 0 || targetIndex >= this.stack.length) {
return
}
var route = this.stack[targetIndex];
this.confirmTransition(
route,
function () {
var prev = this$1.current;
this$1.index = targetIndex;
this$1.updateRoute(route);
this$1.router.afterHooks.forEach(function (hook) {
hook && hook(route, prev);
});
},
function (err) {
if (isNavigationFailure(err, NavigationFailureType.duplicated)) {
this$1.index = targetIndex;
}
}
);
};
AbstractHistory.prototype.getCurrentLocation = function getCurrentLocation () {
var current = this.stack[this.stack.length - 1];
return current ? current.fullPath : '/'
};
AbstractHistory.prototype.ensureURL = function ensureURL () {
// noop
};
return AbstractHistory;
}(History));
/* */
var VueRouter = function VueRouter (options) {
if ( options === void 0 ) options = {};
this.app = null;
this.apps = [];
this.options = options;
this.beforeHooks = [];
this.resolveHooks = [];
this.afterHooks = [];
this.matcher = createMatcher(options.routes || [], this);
var mode = options.mode || 'hash';
this.fallback =
mode === 'history' && !supportsPushState && options.fallback !== false;
if (this.fallback) {
mode = 'hash';
}
if (!inBrowser$1) {
mode = 'abstract';
}
this.mode = mode;
switch (mode) {
case 'history':
this.history = new HTML5History(this, options.base);
break
case 'hash':
this.history = new HashHistory(this, options.base, this.fallback);
break
case 'abstract':
this.history = new AbstractHistory(this, options.base);
break
}
};
var prototypeAccessors$3 = { currentRoute: { configurable: true } };
VueRouter.prototype.match = function match (raw, current, redirectedFrom) {
return this.matcher.match(raw, current, redirectedFrom)
};
prototypeAccessors$3.currentRoute.get = function () {
return this.history && this.history.current
};
VueRouter.prototype.init = function init (app /* Vue component instance */) {
var this$1 = this;
this.apps.push(app);
// set up app destroyed handler
// https://github.com/vuejs/vue-router/issues/2639
app.$once('hook:destroyed', function () {
// clean out app from this.apps array once destroyed
var index = this$1.apps.indexOf(app);
if (index > -1) { this$1.apps.splice(index, 1); }
// ensure we still have a main app or null if no apps
// we do not release the router so it can be reused
if (this$1.app === app) { this$1.app = this$1.apps[0] || null; }
if (!this$1.app) { this$1.history.teardown(); }
});
// main app previously initialized
// return as we don't need to set up new history listener
if (this.app) {
return
}
this.app = app;
var history = this.history;
if (history instanceof HTML5History || history instanceof HashHistory) {
var handleInitialScroll = function (routeOrError) {
var from = history.current;
var expectScroll = this$1.options.scrollBehavior;
var supportsScroll = supportsPushState && expectScroll;
if (supportsScroll && 'fullPath' in routeOrError) {
handleScroll(this$1, routeOrError, from, false);
}
};
var setupListeners = function (routeOrError) {
history.setupListeners();
handleInitialScroll(routeOrError);
};
history.transitionTo(
history.getCurrentLocation(),
setupListeners,
setupListeners
);
}
history.listen(function (route) {
this$1.apps.forEach(function (app) {
app._route = route;
});
});
};
VueRouter.prototype.beforeEach = function beforeEach (fn) {
return registerHook(this.beforeHooks, fn)
};
VueRouter.prototype.beforeResolve = function beforeResolve (fn) {
return registerHook(this.resolveHooks, fn)
};
VueRouter.prototype.afterEach = function afterEach (fn) {
return registerHook(this.afterHooks, fn)
};
VueRouter.prototype.onReady = function onReady (cb, errorCb) {
this.history.onReady(cb, errorCb);
};
VueRouter.prototype.onError = function onError (errorCb) {
this.history.onError(errorCb);
};
VueRouter.prototype.push = function push (location, onComplete, onAbort) {
var this$1 = this;
// $flow-disable-line
if (!onComplete && !onAbort && typeof Promise !== 'undefined') {
return new Promise(function (resolve, reject) {
this$1.history.push(location, resolve, reject);
})
} else {
this.history.push(location, onComplete, onAbort);
}
};
VueRouter.prototype.replace = function replace (location, onComplete, onAbort) {
var this$1 = this;
// $flow-disable-line
if (!onComplete && !onAbort && typeof Promise !== 'undefined') {
return new Promise(function (resolve, reject) {
this$1.history.replace(location, resolve, reject);
})
} else {
this.history.replace(location, onComplete, onAbort);
}
};
VueRouter.prototype.go = function go (n) {
this.history.go(n);
};
VueRouter.prototype.back = function back () {
this.go(-1);
};
VueRouter.prototype.forward = function forward () {
this.go(1);
};
VueRouter.prototype.getMatchedComponents = function getMatchedComponents (to) {
var route = to
? to.matched
? to
: this.resolve(to).route
: this.currentRoute;
if (!route) {
return []
}
return [].concat.apply(
[],
route.matched.map(function (m) {
return Object.keys(m.components).map(function (key) {
return m.components[key]
})
})
)
};
VueRouter.prototype.resolve = function resolve (
to,
current,
append
) {
current = current || this.history.current;
var location = normalizeLocation(to, current, append, this);
var route = this.match(location, current);
var fullPath = route.redirectedFrom || route.fullPath;
var base = this.history.base;
var href = createHref(base, fullPath, this.mode);
return {
location: location,
route: route,
href: href,
// for backwards compat
normalizedTo: location,
resolved: route
}
};
VueRouter.prototype.addRoutes = function addRoutes (routes) {
this.matcher.addRoutes(routes);
if (this.history.current !== START) {
this.history.transitionTo(this.history.getCurrentLocation());
}
};
Object.defineProperties( VueRouter.prototype, prototypeAccessors$3 );
function registerHook (list, fn) {
list.push(fn);
return function () {
var i = list.indexOf(fn);
if (i > -1) { list.splice(i, 1); }
}
}
function createHref (base, fullPath, mode) {
var path = mode === 'hash' ? '#' + fullPath : fullPath;
return base ? cleanPath(base + '/' + path) : path
}
VueRouter.install = install$2;
VueRouter.version = '3.4.8';
VueRouter.isNavigationFailure = isNavigationFailure;
VueRouter.NavigationFailureType = NavigationFailureType;
if (inBrowser$1 && window.Vue) {
window.Vue.use(VueRouter);
}
var paypal = "<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>\r\n<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->\r\n<svg version=\"1.1\" id=\"Capa_1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"\r\n\t viewBox=\"0 0 512.001 512.001\" style=\"enable-background:new 0 0 512.001 512.001;\" xml:space=\"preserve\">\r\n<path style=\"fill:#03A9F4;\" d=\"M425.457,117.739c-3.121-1.838-6.961-1.966-10.197-0.341c-3.231,1.629-5.416,4.786-5.803,8.384\r\n\tc-0.384,3.499-0.981,6.997-1.728,10.667c-20.885,94.784-62.827,140.885-128.256,140.885h-96c-5.062,0.009-9.42,3.574-10.432,8.533\r\n\tl-32,149.995l-5.717,38.187c-3.287,17.365,8.125,34.107,25.489,37.394c1.915,0.362,3.858,0.549,5.807,0.558h64.213\r\n\tc14.718,0.045,27.55-10,31.04-24.299l25.941-103.701h55.659c65.685,0,111.083-52.373,127.829-147.477l0,0\r\n\tC482.356,191.238,464.068,143.856,425.457,117.739z\"/>\r\n<path style=\"fill:#283593;\" d=\"M405.339,38.017c-21.078-23.909-51.327-37.731-83.2-38.016h-176.64\r\n\tC119.064-0.141,96.558,19.2,92.721,45.355L37.873,411.243c-2.627,17.477,9.41,33.774,26.887,36.402\r\n\tc1.586,0.239,3.189,0.357,4.793,0.356h81.92c5.062-0.009,9.42-3.574,10.432-8.533l30.187-140.8h87.467\r\n\tc75.904,0,126.059-53.056,149.099-157.867c0.926-4.178,1.638-8.4,2.133-12.651C436.139,95.815,426.81,62.778,405.339,38.017z\"/>\r\n<g>\r\n</g>\r\n<g>\r\n</g>\r\n<g>\r\n</g>\r\n<g>\r\n</g>\r\n<g>\r\n</g>\r\n<g>\r\n</g>\r\n<g>\r\n</g>\r\n<g>\r\n</g>\r\n<g>\r\n</g>\r\n<g>\r\n</g>\r\n<g>\r\n</g>\r\n<g>\r\n</g>\r\n<g>\r\n</g>\r\n<g>\r\n</g>\r\n<g>\r\n</g>\r\n</svg>";
var ethereum = "<svg viewBox=\"-116 0 512 512\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"m140.28125 333.582031-140.28125-66.734375 140.28125 245.152344 140.285156-245.152344zm0 0\"/><path d=\"m265.289062 217.117188-125.007812-217.117188-125.148438 217.367188 125.148438-59.367188zm0 0\"/><path d=\"m25.980469 245.535156 114.300781 54.140625 114.492188-54.230469-114.492188-54.136718zm0 0\"/></svg>";
//
var script$9 = {
data() {
return {
paypal,
ethereum,
current: null,
latest: null,
updateAvailable: false,
deemixVersion: null
}
},
computed: {
...mapGetters(['getAboutInfo'])
},
methods: {
initUpdate(data) {
const { currentCommit, latestCommit, updateAvailable, deemixVersion } = data;
this.current = currentCommit;
this.latest = latestCommit;
this.updateAvailable = updateAvailable;
this.deemixVersion = deemixVersion;
}
},
mounted() {
this.initUpdate(this.getAboutInfo);
}
};
/* script */
const __vue_script__$9 = script$9;
/* template */
var __vue_render__$b = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{"id":"about_tab"}},[_c('h1',{staticClass:"mb-8 text-5xl capitalize"},[_vm._v(_vm._s(_vm.$t('sidebar.about')))]),_vm._v(" "),_c('ul',[_c('li',[_vm._v("\n\t\t\t"+_vm._s(_vm.$t('about.updates.currentWebuiVersion'))+":\n\t\t\t"),_c('span',[_vm._v(_vm._s("1.3.0" ))])]),_vm._v(" "),_c('li',[_vm._v("\n\t\t\t"+_vm._s(_vm.$t('about.updates.currentVersion'))+":\n\t\t\t"),_c('span',[_vm._v(_vm._s(_vm.current || _vm.$t('about.updates.versionNotAvailable')))])]),_vm._v(" "),_c('li',[_vm._v(_vm._s(_vm.$t('about.updates.deemixVersion'))+": "+_vm._s(_vm.deemixVersion))]),_vm._v(" "),(_vm.updateAvailable && _vm.latest)?_c('li',[_vm._v(_vm._s(_vm.$t('about.updates.updateAvailable', { version: _vm.latest })))]):_vm._e()]),_vm._v(" "),_c('ul',[_c('li',{domProps:{"innerHTML":_vm._s(_vm.$t('about.usesLibrary'))}}),_vm._v(" "),_c('li',{domProps:{"innerHTML":_vm._s(_vm.$t('about.thanks'))}}),_vm._v(" "),_c('i18n',{attrs:{"path":"about.upToDate.text","tag":"li"}},[_c('a',{attrs:{"place":"newsChannel","href":"https://t.me/RemixDevNews","target":"_blank"}},[_vm._v(_vm._s(_vm.$t('about.upToDate.newsChannel')))])])],1),_vm._v(" "),_c('h2',[_vm._v(_vm._s(_vm.$t('about.titles.usefulLinks')))]),_vm._v(" "),_c('ul',{staticClass:"no-dots"},[_c('li',[_c('a',{attrs:{"href":"https://www.reddit.com/r/deemix","target":"_blank"}},[_vm._v("🤖 "+_vm._s(_vm.$t('about.officialSubreddit')))])]),_vm._v(" "),_c('li',[_c('a',{attrs:{"href":"https://t.me/RemixDevNews","target":"_blank"}},[_vm._v("📰 "+_vm._s(_vm.$t('about.newsChannel')))])])]),_vm._v(" "),_c('h2',[_vm._v("\n\t\t"+_vm._s(_vm.$t('about.titles.bugReports'))+"\n\t\t"),_c('span',{staticClass:"subheading"},[_vm._v("\n\t\t\t"+_vm._s(_vm.$t('about.subtitles.bugReports'))+"\n\t\t")])]),_vm._v(" "),_c('ul',[_c('i18n',{attrs:{"path":"about.questions.text","tag":"li"}},[_c('a',{attrs:{"place":"subreddit","href":"https://www.reddit.com/r/deemix","target":"_blank"}},[_vm._v(_vm._s(_vm.$t('about.questions.subreddit')))])]),_vm._v(" "),_c('li',[_vm._v("\n\t\t\t"+_vm._s(_vm.$t('about.beforeReporting'))+"\n\t\t")]),_vm._v(" "),_c('li',{domProps:{"innerHTML":_vm._s(_vm.$t('about.beSure'))}}),_vm._v(" "),_c('li',[_vm._v("\n\t\t\t"+_vm._s(_vm.$t('about.duplicateReports'))+"\n\t\t")]),_vm._v(" "),_c('li',{domProps:{"innerHTML":_vm._s(_vm.$t('about.dontOpenIssues'))}})],1),_vm._v(" "),_c('h2',[_vm._v("\n\t\t"+_vm._s(_vm.$t('about.titles.contributing'))+"\n\t\t"),_c('span',{staticClass:"subheading"},[_vm._v("\n\t\t\t"+_vm._s(_vm.$t('about.subtitles.contributing'))+"\n\t\t")])]),_vm._v(" "),_c('ul',[_c('i18n',{attrs:{"path":"about.newUI.text","tag":"li"}},[_c('span',{attrs:{"place":"repo"}},[_vm._v(_vm._s(_vm.$t('about.newUI.repo')))])]),_vm._v(" "),_c('li',[_vm._v("\n\t\t\t"+_vm._s(_vm.$t('about.acceptFeatures'))+"\n\t\t")]),_vm._v(" "),_c('i18n',{attrs:{"path":"about.contributeWebUI.text","tag":"li"}},[_c('span',{attrs:{"place":"webui"}},[_vm._v(_vm._s(_vm.$t('about.contributeWebUI.webui')))])]),_vm._v(" "),_c('li',[_vm._v("\n\t\t\t"+_vm._s(_vm.$t('about.otherLanguages'))+"\n\t\t")]),_vm._v(" "),_c('li',[_vm._v("\n\t\t\t"+_vm._s(_vm.$t('about.understandingCode'))+"\n\t\t")])],1),_vm._v(" "),_c('h2',[_vm._v("\n\t\t"+_vm._s(_vm.$t('about.titles.donations'))+"\n\t\t"),_c('span',{staticClass:"subheading"},[_vm._v("\n\t\t\t"+_vm._s(_vm.$t('about.subtitles.donations'))+"\n\t\t")])]),_vm._v(" "),_c('ul',[_c('li',{domProps:{"innerHTML":_vm._s(_vm.$t('about.itsFree'))}}),_vm._v(" "),_c('li',[_vm._v("\n\t\t\t"+_vm._s(_vm.$t('about.notObligated'))+"\n\t\t")])]),_vm._v(" "),_c('ul',[_c('li',[_c('i',{domProps:{"innerHTML":_vm._s(_vm.paypal)}}),_vm._v(" "),_c('strong',[_vm._v("PayPal:")]),_vm._v(" "),_c('a',{attrs:{"href":"https://paypal.me/RemixDev","target":"_blank"}},[_vm._v("PayPal.me/RemixDev")])]),_vm._v(" "),_c('li',[_c('i',{staticClass:"ethereum",domProps:{"innerHTML":_vm._s(_vm.ethereum)}}),_vm._v(" "),_c('strong',[_vm._v("Ethereum:")]),_vm._v(" 0x1d2aa67e671485CD4062289772B662e0A6Ff976c\n\t\t")])]),_vm._v(" "),_c('h2',[_vm._v(_vm._s(_vm.$t('about.titles.license')))]),_vm._v(" "),_vm._m(0),_vm._v(" "),_c('i18n',{attrs:{"path":"about.lincensedUnder.text","tag":"p"}},[_c('a',{attrs:{"place":"gpl3","rel":"license","href":"https://www.gnu.org/licenses/gpl-3.0.en.html","target":"_blank"}},[_vm._v(_vm._s(_vm.$t('about.lincensedUnder.gpl3')))])])],1)};
var __vue_staticRenderFns__$b = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('p',[_c('a',{attrs:{"rel":"license","href":"https://www.gnu.org/licenses/gpl-3.0.en.html","target":"_blank"}},[_c('img',{staticStyle:{"border-width":"0"},attrs:{"alt":"GNU General Public License","src":"https://www.gnu.org/graphics/gplv3-127x51.png"}})])])}];
/* style */
const __vue_inject_styles__$b = function (inject) {
if (!inject) return
inject("data-v-289b6557_0", { source: "@charset \"UTF-8\";a[data-v-289b6557],li[data-v-289b6557],p[data-v-289b6557]{letter-spacing:.4px;font-size:20px;line-height:1.2}i[data-v-289b6557]{vertical-align:middle}i[data-v-289b6557] svg{fill:#fff;width:20px}.ethereum[data-v-289b6557] svg{fill:var(--foreground)}[data-v-289b6557]:link{text-decoration:none}#about_tab[data-v-289b6557]{margin-bottom:40px}h2[data-v-289b6557]{text-transform:capitalize}h2[data-v-289b6557]:not(.page_heading){font-size:2rem;border-bottom:1px solid rgba(51,51,51,.25);padding-top:2rem;padding-bottom:1rem}h2 .subheading[data-v-289b6557]{display:block;font-size:.5em;margin-top:.5em;font-weight:400;opacity:.8;text-transform:none}p[data-v-289b6557]{margin:0!important}ul li[data-v-289b6557]{margin-bottom:7px}h2+ul[data-v-289b6557]{margin-top:1rem}ul+ul[data-v-289b6557]{margin-top:1.25rem}ul.no-dots[data-v-289b6557]{list-style-type:none}ul[data-v-289b6557]:not(.no-dots){list-style-type:none}ul:not(.no-dots) li[data-v-289b6557]{position:relative}ul:not(.no-dots) li[data-v-289b6557]::before{content:'—';position:absolute;left:-30px;opacity:.25}", map: undefined, media: undefined });
};
/* scoped */
const __vue_scope_id__$b = "data-v-289b6557";
/* module identifier */
const __vue_module_identifier__$a = undefined;
/* functional template */
const __vue_is_functional_template__$b = false;
/* component normalizer */
function __vue_normalize__$b(
template, style, script,
scope, functional, moduleIdentifier,
createInjector, createInjectorSSR
) {
const component = (typeof script === 'function' ? script.options : script) || {};
// For security concerns, we use only base name in production mode.
component.__file = "About.vue";
if (!component.render) {
component.render = template.render;
component.staticRenderFns = template.staticRenderFns;
component._compiled = true;
if (functional) component.functional = true;
}
component._scopeId = scope;
{
let hook;
if (style) {
hook = function(context) {
style.call(this, createInjector(context));
};
}
if (hook !== undefined) {
if (component.functional) {
// register for functional component in vue file
const originalRender = component.render;
component.render = function renderWithStyleInjection(h, context) {
hook.call(context);
return originalRender(h, context)
};
} else {
// inject component registration as beforeCreate hook
const existing = component.beforeCreate;
component.beforeCreate = existing ? [].concat(existing, hook) : [hook];
}
}
}
return component
}
/* style inject */
function __vue_create_injector__$a() {
const head = document.head || document.getElementsByTagName('head')[0];
const styles = __vue_create_injector__$a.styles || (__vue_create_injector__$a.styles = {});
const isOldIE =
typeof navigator !== 'undefined' &&
/msie [6-9]\\b/.test(navigator.userAgent.toLowerCase());
return function addStyle(id, css) {
if (document.querySelector('style[data-vue-ssr-id~="' + id + '"]')) return // SSR styles are present.
const group = isOldIE ? css.media || 'default' : id;
const style = styles[group] || (styles[group] = { ids: [], parts: [], element: undefined });
if (!style.ids.includes(id)) {
let code = css.source;
let index = style.ids.length;
style.ids.push(id);
if ( css.map) {
// https://developer.chrome.com/devtools/docs/javascript-debugging
// this makes source maps inside style tags work properly in Chrome
code += '\n/*# sourceURL=' + css.map.sources[0] + ' */';
// http://stackoverflow.com/a/26603875
code +=
'\n/*# sourceMappingURL=data:application/json;base64,' +
btoa(unescape(encodeURIComponent(JSON.stringify(css.map)))) +
' */';
}
if (isOldIE) {
style.element = style.element || document.querySelector('style[data-group=' + group + ']');
}
if (!style.element) {
const el = style.element = document.createElement('style');
el.type = 'text/css';
if (css.media) el.setAttribute('media', css.media);
if (isOldIE) {
el.setAttribute('data-group', group);
el.setAttribute('data-next-index', '0');
}
head.appendChild(el);
}
if (isOldIE) {
index = parseInt(style.element.getAttribute('data-next-index'));
style.element.setAttribute('data-next-index', index + 1);
}
if (style.element.styleSheet) {
style.parts.push(code);
style.element.styleSheet.cssText = style.parts
.filter(Boolean)
.join('\n');
} else {
const textNode = document.createTextNode(code);
const nodes = style.element.childNodes;
if (nodes[index]) style.element.removeChild(nodes[index]);
if (nodes.length) style.element.insertBefore(textNode, nodes[index]);
else style.element.appendChild(textNode);
}
}
}
}
/* style inject SSR */
var About = __vue_normalize__$b(
{ render: __vue_render__$b, staticRenderFns: __vue_staticRenderFns__$b },
__vue_inject_styles__$b,
__vue_script__$9,
__vue_scope_id__$b,
__vue_is_functional_template__$b,
__vue_module_identifier__$a,
__vue_create_injector__$a);
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
var script$a = {};
/* script */
const __vue_script__$a = script$a;
/* template */
var __vue_render__$c = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('h1',{staticClass:"mb-8 text-5xl"},[_vm._v(_vm._s(_vm.$t('settings.login.arl.question')))]),_vm._v(" "),_vm._m(0),_vm._v(" "),_c('h3',{staticClass:"mt-6 text-3xl"},[_vm._v("Chrome (Easy way)")]),_vm._v(" "),_vm._m(1),_vm._v(" "),_c('h3',{staticClass:"mt-6 text-3xl"},[_vm._v("Chrome")]),_vm._v(" "),_vm._m(2),_vm._v(" "),_vm._m(3),_vm._v(" "),_c('h3',{staticClass:"mt-6 text-3xl"},[_vm._v("Firefox")]),_vm._v(" "),_vm._m(4)])};
var __vue_staticRenderFns__$c = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('p',{staticClass:"mb-2 text-base"},[_vm._v("\n\t\tDeezer keeps track of login session by using a cookie called ARL."),_c('br'),_vm._v("\n\t\tdeemix uses that cookie to get the metadata that it needs to download the tracks from Deezer."),_c('br'),_vm._v("\n\t\tARLs last for 3 months, after that Deezer asks you to log in again. The same method is used in deemix"),_c('br'),_vm._v("\n\t\tFollowing one of the guides below you can get your own account ARL.\n\t")])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('ul',{staticClass:"mb-2 text-base"},[_c('li',[_vm._v("Open Chrome")]),_vm._v(" "),_c('li',[_vm._v("Go to www.deezer.com and log into your account")]),_vm._v(" "),_c('li',[_vm._v("Click on the little \"lock\" icon next the URL")]),_vm._v(" "),_c('li',[_vm._v("Click on Cookies > deezer.com > cookies > arl")]),_vm._v(" "),_c('li',[_vm._v("Select the string next to Content, and Copy")]),_vm._v(" "),_c('li',[_vm._v("That's your ARL, now you can use it in the app")])])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('ul',{staticClass:"mb-2 text-base"},[_c('li',[_vm._v("Open Chrome")]),_vm._v(" "),_c('li',[_vm._v("Go to www.deezer.com and log into your account")]),_vm._v(" "),_c('li',[_vm._v("After logging in press F12 to open up Developer Tools")]),_vm._v(" "),_c('li',[_vm._v("Go under the Application tab (if you don't see it click the double arrow)")]),_vm._v(" "),_c('li',[_vm._v("Open the cookie dropdown")]),_vm._v(" "),_c('li',[_vm._v("Select www.deezer.com")]),_vm._v(" "),_c('li',[_vm._v("Find the `arl` cookie (It should be 192 chars long) ")]),_vm._v(" "),_c('li',[_vm._v("That's your ARL, now you can use it in the app")])])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('p',{staticClass:"mb-2 text-base"},[_vm._v("Here's a "),_c('a',{attrs:{"href":"https://youtu.be/O6PRT47_yds","target":"_blank"}},[_vm._v("video guide")])])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('ul',{staticClass:"mb-2 text-base"},[_c('li',[_vm._v("Open Firefox")]),_vm._v(" "),_c('li',[_vm._v("Go to www.deezer.com and log into your account")]),_vm._v(" "),_c('li',[_vm._v("Afer logging in press F12 to open up Developer Tools")]),_vm._v(" "),_c('li',[_vm._v("Go under the Storage tab (if you don't see it click the double arrow)")]),_vm._v(" "),_c('li',[_vm._v("Open the cookie dropdown")]),_vm._v(" "),_c('li',[_vm._v("Select www.deezer.com")]),_vm._v(" "),_c('li',[_vm._v("Find the `arl` cookie (It should be 192 chars long)")]),_vm._v(" "),_c('li',[_vm._v("Make sure only copy the value and not the entire cookie")]),_vm._v(" "),_c('li',[_vm._v("That's your ARL, now you can use it in the app")])])}];
/* style */
const __vue_inject_styles__$c = undefined;
/* scoped */
const __vue_scope_id__$c = undefined;
/* functional template */
const __vue_is_functional_template__$c = false;
/* component normalizer */
function __vue_normalize__$c(
template, style, script,
scope, functional, moduleIdentifier,
createInjector, createInjectorSSR
) {
const component = (typeof script === 'function' ? script.options : script) || {};
// For security concerns, we use only base name in production mode.
component.__file = "InfoArl.vue";
if (!component.render) {
component.render = template.render;
component.staticRenderFns = template.staticRenderFns;
component._compiled = true;
if (functional) component.functional = true;
}
component._scopeId = scope;
return component
}
/* style inject */
/* style inject SSR */
var InfoArl = __vue_normalize__$c(
{ render: __vue_render__$c, staticRenderFns: __vue_staticRenderFns__$c },
__vue_inject_styles__$c,
__vue_script__$a,
__vue_scope_id__$c,
__vue_is_functional_template__$c);
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
var script$b = {};
/* script */
const __vue_script__$b = script$b;
/* template */
var __vue_render__$d = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('h1',{staticClass:"mb-8 text-5xl"},[_vm._v(_vm._s(_vm.$t('settings.spotify.question')))]),_vm._v(" "),_c('p',{staticClass:"mb-2 text-base"},[_vm._v("\n\t\t\"Spotify Features\" is a set of features that lets you convert Spotify tracks and albums links into Deezer ones.\n\t\tIf you provide a Spotify Playlist link the app will autmatically convert all the links of the tracks inside it into deezer tracks.\n\t\tEnabling this set of features will let you see your public Spotify playlists in the favorites tab as well.\n\t")]),_vm._v(" "),_c('p',{staticClass:"mb-2 text-base"},[_vm._v("For security reasons you will need to provide your own Client ID and Secret")]),_vm._v(" "),_c('h2',{staticClass:"mt-6 text-3xl"},[_vm._v("How do I get my Client ID and Secret?")]),_vm._v(" "),_vm._m(0),_vm._v(" "),_vm._m(1),_vm._v(" "),_vm._m(2),_vm._v(" "),_vm._m(3),_vm._v(" "),_c('p',{staticClass:"mb-2 text-base"},[_vm._v("Now you can copy-paste those results in the appropriate fields in the settings.")]),_vm._v(" "),_c('h2',{staticClass:"mt-6 text-3xl"},[_vm._v("How do I get my Spotify Username?")]),_vm._v(" "),_vm._m(4)])};
var __vue_staticRenderFns__$d = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('p',{staticClass:"mb-2 text-base"},[_vm._v("Connect to "),_c('a',{attrs:{"href":"https://developer.spotify.com/dashboard","target":"_blank"}},[_vm._v("Spotify for Developers's Dashboard")]),_vm._v(" and login with your Spotify account.")])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('p',{staticClass:"mb-2 text-base"},[_vm._v("\n\t\tClick on \"Create an App\"."),_c('br'),_vm._v(" "),_c('img',{attrs:{"src":"https://i.imgur.com/YFz7rHj.png","alt":"Create an App button on Spotify for Developers's Dashboard"}})])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('p',{staticClass:"mb-2 text-base"},[_vm._v("\n\t\tFill out the \"App name\" and \"App description\" fields and check both checkboxes. Then click on the \"Create\" button."),_c('br'),_vm._v(" "),_c('img',{attrs:{"src":"https://i.imgur.com/A9cvDkK.png","alt":"Create an app form"}})])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('p',{staticClass:"mb-2 text-base"},[_vm._v("\n\t\tNow you can see the Client ID. If you click on \"Show Client Secret\" the client secret will be revealed."),_c('br'),_vm._v(" "),_c('img',{attrs:{"src":"https://i.imgur.com/foEfIhO.png","alt":"Screen of client ID and Secret"}})])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('p',{staticClass:"mb-2 text-base"},[_vm._v("You can get your Spotify Username from the "),_c('a',{attrs:{"href":"https://www.spotify.com/it/account/overview/","target":"_blank"}},[_vm._v("Overview page on Spotify's Website")]),_vm._v(".")])}];
/* style */
const __vue_inject_styles__$d = undefined;
/* scoped */
const __vue_scope_id__$d = undefined;
/* functional template */
const __vue_is_functional_template__$d = false;
/* component normalizer */
function __vue_normalize__$d(
template, style, script,
scope, functional, moduleIdentifier,
createInjector, createInjectorSSR
) {
const component = (typeof script === 'function' ? script.options : script) || {};
// For security concerns, we use only base name in production mode.
component.__file = "InfoSpotifyFeatures.vue";
if (!component.render) {
component.render = template.render;
component.staticRenderFns = template.staticRenderFns;
component._compiled = true;
if (functional) component.functional = true;
}
component._scopeId = scope;
return component
}
/* style inject */
/* style inject SSR */
var InfoSpotifyFeatures = __vue_normalize__$d(
{ render: __vue_render__$d, staticRenderFns: __vue_staticRenderFns__$d },
__vue_inject_styles__$d,
__vue_script__$b,
__vue_scope_id__$d,
__vue_is_functional_template__$d);
/** Detect free variable `global` from Node.js. */
var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;
/** Detect free variable `self`. */
var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
/** Used as a reference to the global object. */
var root = freeGlobal || freeSelf || Function('return this')();
/** Built-in value references. */
var Symbol$1 = root.Symbol;
/** Used for built-in method references. */
var objectProto = Object.prototype;
/** Used to check objects for own properties. */
var hasOwnProperty$2 = objectProto.hasOwnProperty;
/**
* Used to resolve the
* [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
* of values.
*/
var nativeObjectToString = objectProto.toString;
/** Built-in value references. */
var symToStringTag = Symbol$1 ? Symbol$1.toStringTag : undefined;
/**
* A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.
*
* @private
* @param {*} value The value to query.
* @returns {string} Returns the raw `toStringTag`.
*/
function getRawTag(value) {
var isOwn = hasOwnProperty$2.call(value, symToStringTag),
tag = value[symToStringTag];
try {
value[symToStringTag] = undefined;
var unmasked = true;
} catch (e) {}
var result = nativeObjectToString.call(value);
if (unmasked) {
if (isOwn) {
value[symToStringTag] = tag;
} else {
delete value[symToStringTag];
}
}
return result;
}
/** Used for built-in method references. */
var objectProto$1 = Object.prototype;
/**
* Used to resolve the
* [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
* of values.
*/
var nativeObjectToString$1 = objectProto$1.toString;
/**
* Converts `value` to a string using `Object.prototype.toString`.
*
* @private
* @param {*} value The value to convert.
* @returns {string} Returns the converted string.
*/
function objectToString(value) {
return nativeObjectToString$1.call(value);
}
/** `Object#toString` result references. */
var nullTag = '[object Null]',
undefinedTag = '[object Undefined]';
/** Built-in value references. */
var symToStringTag$1 = Symbol$1 ? Symbol$1.toStringTag : undefined;
/**
* The base implementation of `getTag` without fallbacks for buggy environments.
*
* @private
* @param {*} value The value to query.
* @returns {string} Returns the `toStringTag`.
*/
function baseGetTag(value) {
if (value == null) {
return value === undefined ? undefinedTag : nullTag;
}
return (symToStringTag$1 && symToStringTag$1 in Object(value))
? getRawTag(value)
: objectToString(value);
}
/**
* Checks if `value` is object-like. A value is object-like if it's not `null`
* and has a `typeof` result of "object".
*
* @static
* @memberOf _
* @since 4.0.0
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is object-like, else `false`.
* @example
*
* _.isObjectLike({});
* // => true
*
* _.isObjectLike([1, 2, 3]);
* // => true
*
* _.isObjectLike(_.noop);
* // => false
*
* _.isObjectLike(null);
* // => false
*/
function isObjectLike(value) {
return value != null && typeof value == 'object';
}
/** `Object#toString` result references. */
var symbolTag = '[object Symbol]';
/**
* Checks if `value` is classified as a `Symbol` primitive or object.
*
* @static
* @memberOf _
* @since 4.0.0
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
* @example
*
* _.isSymbol(Symbol.iterator);
* // => true
*
* _.isSymbol('abc');
* // => false
*/
function isSymbol(value) {
return typeof value == 'symbol' ||
(isObjectLike(value) && baseGetTag(value) == symbolTag);
}
/**
* A specialized version of `_.map` for arrays without support for iteratee
* shorthands.
*
* @private
* @param {Array} [array] The array to iterate over.
* @param {Function} iteratee The function invoked per iteration.
* @returns {Array} Returns the new mapped array.
*/
function arrayMap(array, iteratee) {
var index = -1,
length = array == null ? 0 : array.length,
result = Array(length);
while (++index < length) {
result[index] = iteratee(array[index], index, array);
}
return result;
}
/**
* Checks if `value` is classified as an `Array` object.
*
* @static
* @memberOf _
* @since 0.1.0
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is an array, else `false`.
* @example
*
* _.isArray([1, 2, 3]);
* // => true
*
* _.isArray(document.body.children);
* // => false
*
* _.isArray('abc');
* // => false
*
* _.isArray(_.noop);
* // => false
*/
var isArray$1 = Array.isArray;
/** Used as references for various `Number` constants. */
var INFINITY = 1 / 0;
/** Used to convert symbols to primitives and strings. */
var symbolProto = Symbol$1 ? Symbol$1.prototype : undefined,
symbolToString = symbolProto ? symbolProto.toString : undefined;
/**
* The base implementation of `_.toString` which doesn't convert nullish
* values to empty strings.
*
* @private
* @param {*} value The value to process.
* @returns {string} Returns the string.
*/
function baseToString(value) {
// Exit early for strings to avoid a performance hit in some environments.
if (typeof value == 'string') {
return value;
}
if (isArray$1(value)) {
// Recursively convert values (susceptible to call stack limits).
return arrayMap(value, baseToString) + '';
}
if (isSymbol(value)) {
return symbolToString ? symbolToString.call(value) : '';
}
var result = (value + '');
return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
}
/**
* Checks if `value` is the
* [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
* of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
*
* @static
* @memberOf _
* @since 0.1.0
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is an object, else `false`.
* @example
*
* _.isObject({});
* // => true
*
* _.isObject([1, 2, 3]);
* // => true
*
* _.isObject(_.noop);
* // => true
*
* _.isObject(null);
* // => false
*/
function isObject$3(value) {
var type = typeof value;
return value != null && (type == 'object' || type == 'function');
}
/**
* This method returns the first argument it receives.
*
* @static
* @since 0.1.0
* @memberOf _
* @category Util
* @param {*} value Any value.
* @returns {*} Returns `value`.
* @example
*
* var object = { 'a': 1 };
*
* console.log(_.identity(object) === object);
* // => true
*/
function identity$1(value) {
return value;
}
/** `Object#toString` result references. */
var asyncTag = '[object AsyncFunction]',
funcTag = '[object Function]',
genTag = '[object GeneratorFunction]',
proxyTag = '[object Proxy]';
/**
* Checks if `value` is classified as a `Function` object.
*
* @static
* @memberOf _
* @since 0.1.0
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is a function, else `false`.
* @example
*
* _.isFunction(_);
* // => true
*
* _.isFunction(/abc/);
* // => false
*/
function isFunction$1(value) {
if (!isObject$3(value)) {
return false;
}
// The use of `Object#toString` avoids issues with the `typeof` operator
// in Safari 9 which returns 'object' for typed arrays and other constructors.
var tag = baseGetTag(value);
return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;
}
/** Used to detect overreaching core-js shims. */
var coreJsData = root['__core-js_shared__'];
/** Used to detect methods masquerading as native. */
var maskSrcKey = (function() {
var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');
return uid ? ('Symbol(src)_1.' + uid) : '';
}());
/**
* Checks if `func` has its source masked.
*
* @private
* @param {Function} func The function to check.
* @returns {boolean} Returns `true` if `func` is masked, else `false`.
*/
function isMasked(func) {
return !!maskSrcKey && (maskSrcKey in func);
}
/** Used for built-in method references. */
var funcProto = Function.prototype;
/** Used to resolve the decompiled source of functions. */
var funcToString = funcProto.toString;
/**
* Converts `func` to its source code.
*
* @private
* @param {Function} func The function to convert.
* @returns {string} Returns the source code.
*/
function toSource(func) {
if (func != null) {
try {
return funcToString.call(func);
} catch (e) {}
try {
return (func + '');
} catch (e) {}
}
return '';
}
/**
* Used to match `RegExp`
* [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).
*/
var reRegExpChar = /[\\^$.*+?()[\]{}|]/g;
/** Used to detect host constructors (Safari). */
var reIsHostCtor = /^\[object .+?Constructor\]$/;
/** Used for built-in method references. */
var funcProto$1 = Function.prototype,
objectProto$2 = Object.prototype;
/** Used to resolve the decompiled source of functions. */
var funcToString$1 = funcProto$1.toString;
/** Used to check objects for own properties. */
var hasOwnProperty$3 = objectProto$2.hasOwnProperty;
/** Used to detect if a method is native. */
var reIsNative = RegExp('^' +
funcToString$1.call(hasOwnProperty$3).replace(reRegExpChar, '\\$&')
.replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
);
/**
* The base implementation of `_.isNative` without bad shim checks.
*
* @private
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is a native function,
* else `false`.
*/
function baseIsNative(value) {
if (!isObject$3(value) || isMasked(value)) {
return false;
}
var pattern = isFunction$1(value) ? reIsNative : reIsHostCtor;
return pattern.test(toSource(value));
}
/**
* Gets the value at `key` of `object`.
*
* @private
* @param {Object} [object] The object to query.
* @param {string} key The key of the property to get.
* @returns {*} Returns the property value.
*/
function getValue$1(object, key) {
return object == null ? undefined : object[key];
}
/**
* Gets the native function at `key` of `object`.
*
* @private
* @param {Object} object The object to query.
* @param {string} key The key of the method to get.
* @returns {*} Returns the function if it's native, else `undefined`.
*/
function getNative(object, key) {
var value = getValue$1(object, key);
return baseIsNative(value) ? value : undefined;
}
/* Built-in method references that are verified to be native. */
var WeakMap = getNative(root, 'WeakMap');
/** Used as references for various `Number` constants. */
var MAX_SAFE_INTEGER = 9007199254740991;
/** Used to detect unsigned integer values. */
var reIsUint = /^(?:0|[1-9]\d*)$/;
/**
* Checks if `value` is a valid array-like index.
*
* @private
* @param {*} value The value to check.
* @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
* @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
*/
function isIndex(value, length) {
var type = typeof value;
length = length == null ? MAX_SAFE_INTEGER : length;
return !!length &&
(type == 'number' ||
(type != 'symbol' && reIsUint.test(value))) &&
(value > -1 && value % 1 == 0 && value < length);
}
/**
* Performs a
* [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
* comparison between two values to determine if they are equivalent.
*
* @static
* @memberOf _
* @since 4.0.0
* @category Lang
* @param {*} value The value to compare.
* @param {*} other The other value to compare.
* @returns {boolean} Returns `true` if the values are equivalent, else `false`.
* @example
*
* var object = { 'a': 1 };
* var other = { 'a': 1 };
*
* _.eq(object, object);
* // => true
*
* _.eq(object, other);
* // => false
*
* _.eq('a', 'a');
* // => true
*
* _.eq('a', Object('a'));
* // => false
*
* _.eq(NaN, NaN);
* // => true
*/
function eq(value, other) {
return value === other || (value !== value && other !== other);
}
/** Used as references for various `Number` constants. */
var MAX_SAFE_INTEGER$1 = 9007199254740991;
/**
* Checks if `value` is a valid array-like length.
*
* **Note:** This method is loosely based on
* [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).
*
* @static
* @memberOf _
* @since 4.0.0
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
* @example
*
* _.isLength(3);
* // => true
*
* _.isLength(Number.MIN_VALUE);
* // => false
*
* _.isLength(Infinity);
* // => false
*
* _.isLength('3');
* // => false
*/
function isLength(value) {
return typeof value == 'number' &&
value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER$1;
}
/**
* Checks if `value` is array-like. A value is considered array-like if it's
* not a function and has a `value.length` that's an integer greater than or
* equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.
*
* @static
* @memberOf _
* @since 4.0.0
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is array-like, else `false`.
* @example
*
* _.isArrayLike([1, 2, 3]);
* // => true
*
* _.isArrayLike(document.body.children);
* // => true
*
* _.isArrayLike('abc');
* // => true
*
* _.isArrayLike(_.noop);
* // => false
*/
function isArrayLike(value) {
return value != null && isLength(value.length) && !isFunction$1(value);
}
/** Used for built-in method references. */
var objectProto$3 = Object.prototype;
/**
* Checks if `value` is likely a prototype object.
*
* @private
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is a prototype, else `false`.
*/
function isPrototype(value) {
var Ctor = value && value.constructor,
proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto$3;
return value === proto;
}
/**
* The base implementation of `_.times` without support for iteratee shorthands
* or max array length checks.
*
* @private
* @param {number} n The number of times to invoke `iteratee`.
* @param {Function} iteratee The function invoked per iteration.
* @returns {Array} Returns the array of results.
*/
function baseTimes(n, iteratee) {
var index = -1,
result = Array(n);
while (++index < n) {
result[index] = iteratee(index);
}
return result;
}
/** `Object#toString` result references. */
var argsTag = '[object Arguments]';
/**
* The base implementation of `_.isArguments`.
*
* @private
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is an `arguments` object,
*/
function baseIsArguments(value) {
return isObjectLike(value) && baseGetTag(value) == argsTag;
}
/** Used for built-in method references. */
var objectProto$4 = Object.prototype;
/** Used to check objects for own properties. */
var hasOwnProperty$4 = objectProto$4.hasOwnProperty;
/** Built-in value references. */
var propertyIsEnumerable = objectProto$4.propertyIsEnumerable;
/**
* Checks if `value` is likely an `arguments` object.
*
* @static
* @memberOf _
* @since 0.1.0
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is an `arguments` object,
* else `false`.
* @example
*
* _.isArguments(function() { return arguments; }());
* // => true
*
* _.isArguments([1, 2, 3]);
* // => false
*/
var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {
return isObjectLike(value) && hasOwnProperty$4.call(value, 'callee') &&
!propertyIsEnumerable.call(value, 'callee');
};
/**
* This method returns `false`.
*
* @static
* @memberOf _
* @since 4.13.0
* @category Util
* @returns {boolean} Returns `false`.
* @example
*
* _.times(2, _.stubFalse);
* // => [false, false]
*/
function stubFalse() {
return false;
}
/** Detect free variable `exports`. */
var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;
/** Detect free variable `module`. */
var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;
/** Detect the popular CommonJS extension `module.exports`. */
var moduleExports = freeModule && freeModule.exports === freeExports;
/** Built-in value references. */
var Buffer = moduleExports ? root.Buffer : undefined;
/* Built-in method references for those with the same name as other `lodash` methods. */
var nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined;
/**
* Checks if `value` is a buffer.
*
* @static
* @memberOf _
* @since 4.3.0
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is a buffer, else `false`.
* @example
*
* _.isBuffer(new Buffer(2));
* // => true
*
* _.isBuffer(new Uint8Array(2));
* // => false
*/
var isBuffer = nativeIsBuffer || stubFalse;
/** `Object#toString` result references. */
var argsTag$1 = '[object Arguments]',
arrayTag = '[object Array]',
boolTag = '[object Boolean]',
dateTag = '[object Date]',
errorTag = '[object Error]',
funcTag$1 = '[object Function]',
mapTag = '[object Map]',
numberTag = '[object Number]',
objectTag = '[object Object]',
regexpTag = '[object RegExp]',
setTag = '[object Set]',
stringTag = '[object String]',
weakMapTag = '[object WeakMap]';
var arrayBufferTag = '[object ArrayBuffer]',
dataViewTag = '[object DataView]',
float32Tag = '[object Float32Array]',
float64Tag = '[object Float64Array]',
int8Tag = '[object Int8Array]',
int16Tag = '[object Int16Array]',
int32Tag = '[object Int32Array]',
uint8Tag = '[object Uint8Array]',
uint8ClampedTag = '[object Uint8ClampedArray]',
uint16Tag = '[object Uint16Array]',
uint32Tag = '[object Uint32Array]';
/** Used to identify `toStringTag` values of typed arrays. */
var typedArrayTags = {};
typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =
typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =
typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =
typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =
typedArrayTags[uint32Tag] = true;
typedArrayTags[argsTag$1] = typedArrayTags[arrayTag] =
typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =
typedArrayTags[dataViewTag] = typedArrayTags[dateTag] =
typedArrayTags[errorTag] = typedArrayTags[funcTag$1] =
typedArrayTags[mapTag] = typedArrayTags[numberTag] =
typedArrayTags[objectTag] = typedArrayTags[regexpTag] =
typedArrayTags[setTag] = typedArrayTags[stringTag] =
typedArrayTags[weakMapTag] = false;
/**
* The base implementation of `_.isTypedArray` without Node.js optimizations.
*
* @private
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
*/
function baseIsTypedArray(value) {
return isObjectLike(value) &&
isLength(value.length) && !!typedArrayTags[baseGetTag(value)];
}
/**
* The base implementation of `_.unary` without support for storing metadata.
*
* @private
* @param {Function} func The function to cap arguments for.
* @returns {Function} Returns the new capped function.
*/
function baseUnary(func) {
return function(value) {
return func(value);
};
}
/** Detect free variable `exports`. */
var freeExports$1 = typeof exports == 'object' && exports && !exports.nodeType && exports;
/** Detect free variable `module`. */
var freeModule$1 = freeExports$1 && typeof module == 'object' && module && !module.nodeType && module;
/** Detect the popular CommonJS extension `module.exports`. */
var moduleExports$1 = freeModule$1 && freeModule$1.exports === freeExports$1;
/** Detect free variable `process` from Node.js. */
var freeProcess = moduleExports$1 && freeGlobal.process;
/** Used to access faster Node.js helpers. */
var nodeUtil = (function() {
try {
// Use `util.types` for Node.js 10+.
var types = freeModule$1 && freeModule$1.require && freeModule$1.require('util').types;
if (types) {
return types;
}
// Legacy `process.binding('util')` for Node.js < 10.
return freeProcess && freeProcess.binding && freeProcess.binding('util');
} catch (e) {}
}());
/* Node.js helper references. */
var nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;
/**
* Checks if `value` is classified as a typed array.
*
* @static
* @memberOf _
* @since 3.0.0
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
* @example
*
* _.isTypedArray(new Uint8Array);
* // => true
*
* _.isTypedArray([]);
* // => false
*/
var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;
/** Used for built-in method references. */
var objectProto$5 = Object.prototype;
/** Used to check objects for own properties. */
var hasOwnProperty$5 = objectProto$5.hasOwnProperty;
/**
* Creates an array of the enumerable property names of the array-like `value`.
*
* @private
* @param {*} value The value to query.
* @param {boolean} inherited Specify returning inherited property names.
* @returns {Array} Returns the array of property names.
*/
function arrayLikeKeys(value, inherited) {
var isArr = isArray$1(value),
isArg = !isArr && isArguments(value),
isBuff = !isArr && !isArg && isBuffer(value),
isType = !isArr && !isArg && !isBuff && isTypedArray(value),
skipIndexes = isArr || isArg || isBuff || isType,
result = skipIndexes ? baseTimes(value.length, String) : [],
length = result.length;
for (var key in value) {
if ((inherited || hasOwnProperty$5.call(value, key)) &&
!(skipIndexes && (
// Safari 9 has enumerable `arguments.length` in strict mode.
key == 'length' ||
// Node.js 0.10 has enumerable non-index properties on buffers.
(isBuff && (key == 'offset' || key == 'parent')) ||
// PhantomJS 2 has enumerable non-index properties on typed arrays.
(isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||
// Skip index properties.
isIndex(key, length)
))) {
result.push(key);
}
}
return result;
}
/**
* Creates a unary function that invokes `func` with its argument transformed.
*
* @private
* @param {Function} func The function to wrap.
* @param {Function} transform The argument transform.
* @returns {Function} Returns the new function.
*/
function overArg(func, transform) {
return function(arg) {
return func(transform(arg));
};
}
/* Built-in method references for those with the same name as other `lodash` methods. */
var nativeKeys = overArg(Object.keys, Object);
/** Used for built-in method references. */
var objectProto$6 = Object.prototype;
/** Used to check objects for own properties. */
var hasOwnProperty$6 = objectProto$6.hasOwnProperty;
/**
* The base implementation of `_.keys` which doesn't treat sparse arrays as dense.
*
* @private
* @param {Object} object The object to query.
* @returns {Array} Returns the array of property names.
*/
function baseKeys(object) {
if (!isPrototype(object)) {
return nativeKeys(object);
}
var result = [];
for (var key in Object(object)) {
if (hasOwnProperty$6.call(object, key) && key != 'constructor') {
result.push(key);
}
}
return result;
}
/**
* Creates an array of the own enumerable property names of `object`.
*
* **Note:** Non-object values are coerced to objects. See the
* [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
* for more details.
*
* @static
* @since 0.1.0
* @memberOf _
* @category Object
* @param {Object} object The object to query.
* @returns {Array} Returns the array of property names.
* @example
*
* function Foo() {
* this.a = 1;
* this.b = 2;
* }
*
* Foo.prototype.c = 3;
*
* _.keys(new Foo);
* // => ['a', 'b'] (iteration order is not guaranteed)
*
* _.keys('hi');
* // => ['0', '1']
*/
function keys(object) {
return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);
}
/** Used to match property names within property paths. */
var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,
reIsPlainProp = /^\w*$/;
/**
* Checks if `value` is a property name and not a property path.
*
* @private
* @param {*} value The value to check.
* @param {Object} [object] The object to query keys on.
* @returns {boolean} Returns `true` if `value` is a property name, else `false`.
*/
function isKey(value, object) {
if (isArray$1(value)) {
return false;
}
var type = typeof value;
if (type == 'number' || type == 'symbol' || type == 'boolean' ||
value == null || isSymbol(value)) {
return true;
}
return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||
(object != null && value in Object(object));
}
/* Built-in method references that are verified to be native. */
var nativeCreate = getNative(Object, 'create');
/**
* Removes all key-value entries from the hash.
*
* @private
* @name clear
* @memberOf Hash
*/
function hashClear() {
this.__data__ = nativeCreate ? nativeCreate(null) : {};
this.size = 0;
}
/**
* Removes `key` and its value from the hash.
*
* @private
* @name delete
* @memberOf Hash
* @param {Object} hash The hash to modify.
* @param {string} key The key of the value to remove.
* @returns {boolean} Returns `true` if the entry was removed, else `false`.
*/
function hashDelete(key) {
var result = this.has(key) && delete this.__data__[key];
this.size -= result ? 1 : 0;
return result;
}
/** Used to stand-in for `undefined` hash values. */
var HASH_UNDEFINED = '__lodash_hash_undefined__';
/** Used for built-in method references. */
var objectProto$7 = Object.prototype;
/** Used to check objects for own properties. */
var hasOwnProperty$7 = objectProto$7.hasOwnProperty;
/**
* Gets the hash value for `key`.
*
* @private
* @name get
* @memberOf Hash
* @param {string} key The key of the value to get.
* @returns {*} Returns the entry value.
*/
function hashGet(key) {
var data = this.__data__;
if (nativeCreate) {
var result = data[key];
return result === HASH_UNDEFINED ? undefined : result;
}
return hasOwnProperty$7.call(data, key) ? data[key] : undefined;
}
/** Used for built-in method references. */
var objectProto$8 = Object.prototype;
/** Used to check objects for own properties. */
var hasOwnProperty$8 = objectProto$8.hasOwnProperty;
/**
* Checks if a hash value for `key` exists.
*
* @private
* @name has
* @memberOf Hash
* @param {string} key The key of the entry to check.
* @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
*/
function hashHas(key) {
var data = this.__data__;
return nativeCreate ? (data[key] !== undefined) : hasOwnProperty$8.call(data, key);
}
/** Used to stand-in for `undefined` hash values. */
var HASH_UNDEFINED$1 = '__lodash_hash_undefined__';
/**
* Sets the hash `key` to `value`.
*
* @private
* @name set
* @memberOf Hash
* @param {string} key The key of the value to set.
* @param {*} value The value to set.
* @returns {Object} Returns the hash instance.
*/
function hashSet(key, value) {
var data = this.__data__;
this.size += this.has(key) ? 0 : 1;
data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED$1 : value;
return this;
}
/**
* Creates a hash object.
*
* @private
* @constructor
* @param {Array} [entries] The key-value pairs to cache.
*/
function Hash(entries) {
var index = -1,
length = entries == null ? 0 : entries.length;
this.clear();
while (++index < length) {
var entry = entries[index];
this.set(entry[0], entry[1]);
}
}
// Add methods to `Hash`.
Hash.prototype.clear = hashClear;
Hash.prototype['delete'] = hashDelete;
Hash.prototype.get = hashGet;
Hash.prototype.has = hashHas;
Hash.prototype.set = hashSet;
/**
* Removes all key-value entries from the list cache.
*
* @private
* @name clear
* @memberOf ListCache
*/
function listCacheClear() {
this.__data__ = [];
this.size = 0;
}
/**
* Gets the index at which the `key` is found in `array` of key-value pairs.
*
* @private
* @param {Array} array The array to inspect.
* @param {*} key The key to search for.
* @returns {number} Returns the index of the matched value, else `-1`.
*/
function assocIndexOf(array, key) {
var length = array.length;
while (length--) {
if (eq(array[length][0], key)) {
return length;
}
}
return -1;
}
/** Used for built-in method references. */
var arrayProto$1 = Array.prototype;
/** Built-in value references. */
var splice = arrayProto$1.splice;
/**
* Removes `key` and its value from the list cache.
*
* @private
* @name delete
* @memberOf ListCache
* @param {string} key The key of the value to remove.
* @returns {boolean} Returns `true` if the entry was removed, else `false`.
*/
function listCacheDelete(key) {
var data = this.__data__,
index = assocIndexOf(data, key);
if (index < 0) {
return false;
}
var lastIndex = data.length - 1;
if (index == lastIndex) {
data.pop();
} else {
splice.call(data, index, 1);
}
--this.size;
return true;
}
/**
* Gets the list cache value for `key`.
*
* @private
* @name get
* @memberOf ListCache
* @param {string} key The key of the value to get.
* @returns {*} Returns the entry value.
*/
function listCacheGet(key) {
var data = this.__data__,
index = assocIndexOf(data, key);
return index < 0 ? undefined : data[index][1];
}
/**
* Checks if a list cache value for `key` exists.
*
* @private
* @name has
* @memberOf ListCache
* @param {string} key The key of the entry to check.
* @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
*/
function listCacheHas(key) {
return assocIndexOf(this.__data__, key) > -1;
}
/**
* Sets the list cache `key` to `value`.
*
* @private
* @name set
* @memberOf ListCache
* @param {string} key The key of the value to set.
* @param {*} value The value to set.
* @returns {Object} Returns the list cache instance.
*/
function listCacheSet(key, value) {
var data = this.__data__,
index = assocIndexOf(data, key);
if (index < 0) {
++this.size;
data.push([key, value]);
} else {
data[index][1] = value;
}
return this;
}
/**
* Creates an list cache object.
*
* @private
* @constructor
* @param {Array} [entries] The key-value pairs to cache.
*/
function ListCache(entries) {
var index = -1,
length = entries == null ? 0 : entries.length;
this.clear();
while (++index < length) {
var entry = entries[index];
this.set(entry[0], entry[1]);
}
}
// Add methods to `ListCache`.
ListCache.prototype.clear = listCacheClear;
ListCache.prototype['delete'] = listCacheDelete;
ListCache.prototype.get = listCacheGet;
ListCache.prototype.has = listCacheHas;
ListCache.prototype.set = listCacheSet;
/* Built-in method references that are verified to be native. */
var Map = getNative(root, 'Map');
/**
* Removes all key-value entries from the map.
*
* @private
* @name clear
* @memberOf MapCache
*/
function mapCacheClear() {
this.size = 0;
this.__data__ = {
'hash': new Hash,
'map': new (Map || ListCache),
'string': new Hash
};
}
/**
* Checks if `value` is suitable for use as unique object key.
*
* @private
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is suitable, else `false`.
*/
function isKeyable(value) {
var type = typeof value;
return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')
? (value !== '__proto__')
: (value === null);
}
/**
* Gets the data for `map`.
*
* @private
* @param {Object} map The map to query.
* @param {string} key The reference key.
* @returns {*} Returns the map data.
*/
function getMapData(map, key) {
var data = map.__data__;
return isKeyable(key)
? data[typeof key == 'string' ? 'string' : 'hash']
: data.map;
}
/**
* Removes `key` and its value from the map.
*
* @private
* @name delete
* @memberOf MapCache
* @param {string} key The key of the value to remove.
* @returns {boolean} Returns `true` if the entry was removed, else `false`.
*/
function mapCacheDelete(key) {
var result = getMapData(this, key)['delete'](key);
this.size -= result ? 1 : 0;
return result;
}
/**
* Gets the map value for `key`.
*
* @private
* @name get
* @memberOf MapCache
* @param {string} key The key of the value to get.
* @returns {*} Returns the entry value.
*/
function mapCacheGet(key) {
return getMapData(this, key).get(key);
}
/**
* Checks if a map value for `key` exists.
*
* @private
* @name has
* @memberOf MapCache
* @param {string} key The key of the entry to check.
* @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
*/
function mapCacheHas(key) {
return getMapData(this, key).has(key);
}
/**
* Sets the map `key` to `value`.
*
* @private
* @name set
* @memberOf MapCache
* @param {string} key The key of the value to set.
* @param {*} value The value to set.
* @returns {Object} Returns the map cache instance.
*/
function mapCacheSet(key, value) {
var data = getMapData(this, key),
size = data.size;
data.set(key, value);
this.size += data.size == size ? 0 : 1;
return this;
}
/**
* Creates a map cache object to store key-value pairs.
*
* @private
* @constructor
* @param {Array} [entries] The key-value pairs to cache.
*/
function MapCache(entries) {
var index = -1,
length = entries == null ? 0 : entries.length;
this.clear();
while (++index < length) {
var entry = entries[index];
this.set(entry[0], entry[1]);
}
}
// Add methods to `MapCache`.
MapCache.prototype.clear = mapCacheClear;
MapCache.prototype['delete'] = mapCacheDelete;
MapCache.prototype.get = mapCacheGet;
MapCache.prototype.has = mapCacheHas;
MapCache.prototype.set = mapCacheSet;
/** Error message constants. */
var FUNC_ERROR_TEXT = 'Expected a function';
/**
* Creates a function that memoizes the result of `func`. If `resolver` is
* provided, it determines the cache key for storing the result based on the
* arguments provided to the memoized function. By default, the first argument
* provided to the memoized function is used as the map cache key. The `func`
* is invoked with the `this` binding of the memoized function.
*
* **Note:** The cache is exposed as the `cache` property on the memoized
* function. Its creation may be customized by replacing the `_.memoize.Cache`
* constructor with one whose instances implement the
* [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)
* method interface of `clear`, `delete`, `get`, `has`, and `set`.
*
* @static
* @memberOf _
* @since 0.1.0
* @category Function
* @param {Function} func The function to have its output memoized.
* @param {Function} [resolver] The function to resolve the cache key.
* @returns {Function} Returns the new memoized function.
* @example
*
* var object = { 'a': 1, 'b': 2 };
* var other = { 'c': 3, 'd': 4 };
*
* var values = _.memoize(_.values);
* values(object);
* // => [1, 2]
*
* values(other);
* // => [3, 4]
*
* object.a = 2;
* values(object);
* // => [1, 2]
*
* // Modify the result cache.
* values.cache.set(object, ['a', 'b']);
* values(object);
* // => ['a', 'b']
*
* // Replace `_.memoize.Cache`.
* _.memoize.Cache = WeakMap;
*/
function memoize(func, resolver) {
if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {
throw new TypeError(FUNC_ERROR_TEXT);
}
var memoized = function() {
var args = arguments,
key = resolver ? resolver.apply(this, args) : args[0],
cache = memoized.cache;
if (cache.has(key)) {
return cache.get(key);
}
var result = func.apply(this, args);
memoized.cache = cache.set(key, result) || cache;
return result;
};
memoized.cache = new (memoize.Cache || MapCache);
return memoized;
}
// Expose `MapCache`.
memoize.Cache = MapCache;
/** Used as the maximum memoize cache size. */
var MAX_MEMOIZE_SIZE = 500;
/**
* A specialized version of `_.memoize` which clears the memoized function's
* cache when it exceeds `MAX_MEMOIZE_SIZE`.
*
* @private
* @param {Function} func The function to have its output memoized.
* @returns {Function} Returns the new memoized function.
*/
function memoizeCapped(func) {
var result = memoize(func, function(key) {
if (cache.size === MAX_MEMOIZE_SIZE) {
cache.clear();
}
return key;
});
var cache = result.cache;
return result;
}
/** Used to match property names within property paths. */
var rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g;
/** Used to match backslashes in property paths. */
var reEscapeChar = /\\(\\)?/g;
/**
* Converts `string` to a property path array.
*
* @private
* @param {string} string The string to convert.
* @returns {Array} Returns the property path array.
*/
var stringToPath = memoizeCapped(function(string) {
var result = [];
if (string.charCodeAt(0) === 46 /* . */) {
result.push('');
}
string.replace(rePropName, function(match, number, quote, subString) {
result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));
});
return result;
});
/**
* Converts `value` to a string. An empty string is returned for `null`
* and `undefined` values. The sign of `-0` is preserved.
*
* @static
* @memberOf _
* @since 4.0.0
* @category Lang
* @param {*} value The value to convert.
* @returns {string} Returns the converted string.
* @example
*
* _.toString(null);
* // => ''
*
* _.toString(-0);
* // => '-0'
*
* _.toString([1, 2, 3]);
* // => '1,2,3'
*/
function toString$2(value) {
return value == null ? '' : baseToString(value);
}
/**
* Casts `value` to a path array if it's not one.
*
* @private
* @param {*} value The value to inspect.
* @param {Object} [object] The object to query keys on.
* @returns {Array} Returns the cast property path array.
*/
function castPath(value, object) {
if (isArray$1(value)) {
return value;
}
return isKey(value, object) ? [value] : stringToPath(toString$2(value));
}
/** Used as references for various `Number` constants. */
var INFINITY$1 = 1 / 0;
/**
* Converts `value` to a string key if it's not a string or symbol.
*
* @private
* @param {*} value The value to inspect.
* @returns {string|symbol} Returns the key.
*/
function toKey(value) {
if (typeof value == 'string' || isSymbol(value)) {
return value;
}
var result = (value + '');
return (result == '0' && (1 / value) == -INFINITY$1) ? '-0' : result;
}
/**
* The base implementation of `_.get` without support for default values.
*
* @private
* @param {Object} object The object to query.
* @param {Array|string} path The path of the property to get.
* @returns {*} Returns the resolved value.
*/
function baseGet(object, path) {
path = castPath(path, object);
var index = 0,
length = path.length;
while (object != null && index < length) {
object = object[toKey(path[index++])];
}
return (index && index == length) ? object : undefined;
}
/**
* Gets the value at `path` of `object`. If the resolved value is
* `undefined`, the `defaultValue` is returned in its place.
*
* @static
* @memberOf _
* @since 3.7.0
* @category Object
* @param {Object} object The object to query.
* @param {Array|string} path The path of the property to get.
* @param {*} [defaultValue] The value returned for `undefined` resolved values.
* @returns {*} Returns the resolved value.
* @example
*
* var object = { 'a': [{ 'b': { 'c': 3 } }] };
*
* _.get(object, 'a[0].b.c');
* // => 3
*
* _.get(object, ['a', '0', 'b', 'c']);
* // => 3
*
* _.get(object, 'a.b.c', 'default');
* // => 'default'
*/
function get(object, path, defaultValue) {
var result = object == null ? undefined : baseGet(object, path);
return result === undefined ? defaultValue : result;
}
/**
* Appends the elements of `values` to `array`.
*
* @private
* @param {Array} array The array to modify.
* @param {Array} values The values to append.
* @returns {Array} Returns `array`.
*/
function arrayPush(array, values) {
var index = -1,
length = values.length,
offset = array.length;
while (++index < length) {
array[offset + index] = values[index];
}
return array;
}
/**
* Removes all key-value entries from the stack.
*
* @private
* @name clear
* @memberOf Stack
*/
function stackClear() {
this.__data__ = new ListCache;
this.size = 0;
}
/**
* Removes `key` and its value from the stack.
*
* @private
* @name delete
* @memberOf Stack
* @param {string} key The key of the value to remove.
* @returns {boolean} Returns `true` if the entry was removed, else `false`.
*/
function stackDelete(key) {
var data = this.__data__,
result = data['delete'](key);
this.size = data.size;
return result;
}
/**
* Gets the stack value for `key`.
*
* @private
* @name get
* @memberOf Stack
* @param {string} key The key of the value to get.
* @returns {*} Returns the entry value.
*/
function stackGet(key) {
return this.__data__.get(key);
}
/**
* Checks if a stack value for `key` exists.
*
* @private
* @name has
* @memberOf Stack
* @param {string} key The key of the entry to check.
* @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
*/
function stackHas(key) {
return this.__data__.has(key);
}
/** Used as the size to enable large array optimizations. */
var LARGE_ARRAY_SIZE = 200;
/**
* Sets the stack `key` to `value`.
*
* @private
* @name set
* @memberOf Stack
* @param {string} key The key of the value to set.
* @param {*} value The value to set.
* @returns {Object} Returns the stack cache instance.
*/
function stackSet(key, value) {
var data = this.__data__;
if (data instanceof ListCache) {
var pairs = data.__data__;
if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {
pairs.push([key, value]);
this.size = ++data.size;
return this;
}
data = this.__data__ = new MapCache(pairs);
}
data.set(key, value);
this.size = data.size;
return this;
}
/**
* Creates a stack cache object to store key-value pairs.
*
* @private
* @constructor
* @param {Array} [entries] The key-value pairs to cache.
*/
function Stack(entries) {
var data = this.__data__ = new ListCache(entries);
this.size = data.size;
}
// Add methods to `Stack`.
Stack.prototype.clear = stackClear;
Stack.prototype['delete'] = stackDelete;
Stack.prototype.get = stackGet;
Stack.prototype.has = stackHas;
Stack.prototype.set = stackSet;
/**
* A specialized version of `_.filter` for arrays without support for
* iteratee shorthands.
*
* @private
* @param {Array} [array] The array to iterate over.
* @param {Function} predicate The function invoked per iteration.
* @returns {Array} Returns the new filtered array.
*/
function arrayFilter(array, predicate) {
var index = -1,
length = array == null ? 0 : array.length,
resIndex = 0,
result = [];
while (++index < length) {
var value = array[index];
if (predicate(value, index, array)) {
result[resIndex++] = value;
}
}
return result;
}
/**
* This method returns a new empty array.
*
* @static
* @memberOf _
* @since 4.13.0
* @category Util
* @returns {Array} Returns the new empty array.
* @example
*
* var arrays = _.times(2, _.stubArray);
*
* console.log(arrays);
* // => [[], []]
*
* console.log(arrays[0] === arrays[1]);
* // => false
*/
function stubArray() {
return [];
}
/** Used for built-in method references. */
var objectProto$9 = Object.prototype;
/** Built-in value references. */
var propertyIsEnumerable$1 = objectProto$9.propertyIsEnumerable;
/* Built-in method references for those with the same name as other `lodash` methods. */
var nativeGetSymbols = Object.getOwnPropertySymbols;
/**
* Creates an array of the own enumerable symbols of `object`.
*
* @private
* @param {Object} object The object to query.
* @returns {Array} Returns the array of symbols.
*/
var getSymbols = !nativeGetSymbols ? stubArray : function(object) {
if (object == null) {
return [];
}
object = Object(object);
return arrayFilter(nativeGetSymbols(object), function(symbol) {
return propertyIsEnumerable$1.call(object, symbol);
});
};
/**
* The base implementation of `getAllKeys` and `getAllKeysIn` which uses
* `keysFunc` and `symbolsFunc` to get the enumerable property names and
* symbols of `object`.
*
* @private
* @param {Object} object The object to query.
* @param {Function} keysFunc The function to get the keys of `object`.
* @param {Function} symbolsFunc The function to get the symbols of `object`.
* @returns {Array} Returns the array of property names and symbols.
*/
function baseGetAllKeys(object, keysFunc, symbolsFunc) {
var result = keysFunc(object);
return isArray$1(object) ? result : arrayPush(result, symbolsFunc(object));
}
/**
* Creates an array of own enumerable property names and symbols of `object`.
*
* @private
* @param {Object} object The object to query.
* @returns {Array} Returns the array of property names and symbols.
*/
function getAllKeys(object) {
return baseGetAllKeys(object, keys, getSymbols);
}
/* Built-in method references that are verified to be native. */
var DataView = getNative(root, 'DataView');
/* Built-in method references that are verified to be native. */
var Promise$1 = getNative(root, 'Promise');
/* Built-in method references that are verified to be native. */
var Set$1 = getNative(root, 'Set');
/** `Object#toString` result references. */
var mapTag$1 = '[object Map]',
objectTag$1 = '[object Object]',
promiseTag = '[object Promise]',
setTag$1 = '[object Set]',
weakMapTag$1 = '[object WeakMap]';
var dataViewTag$1 = '[object DataView]';
/** Used to detect maps, sets, and weakmaps. */
var dataViewCtorString = toSource(DataView),
mapCtorString = toSource(Map),
promiseCtorString = toSource(Promise$1),
setCtorString = toSource(Set$1),
weakMapCtorString = toSource(WeakMap);
/**
* Gets the `toStringTag` of `value`.
*
* @private
* @param {*} value The value to query.
* @returns {string} Returns the `toStringTag`.
*/
var getTag = baseGetTag;
// Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.
if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag$1) ||
(Map && getTag(new Map) != mapTag$1) ||
(Promise$1 && getTag(Promise$1.resolve()) != promiseTag) ||
(Set$1 && getTag(new Set$1) != setTag$1) ||
(WeakMap && getTag(new WeakMap) != weakMapTag$1)) {
getTag = function(value) {
var result = baseGetTag(value),
Ctor = result == objectTag$1 ? value.constructor : undefined,
ctorString = Ctor ? toSource(Ctor) : '';
if (ctorString) {
switch (ctorString) {
case dataViewCtorString: return dataViewTag$1;
case mapCtorString: return mapTag$1;
case promiseCtorString: return promiseTag;
case setCtorString: return setTag$1;
case weakMapCtorString: return weakMapTag$1;
}
}
return result;
};
}
var getTag$1 = getTag;
/** Built-in value references. */
var Uint8Array = root.Uint8Array;
/** Used to stand-in for `undefined` hash values. */
var HASH_UNDEFINED$2 = '__lodash_hash_undefined__';
/**
* Adds `value` to the array cache.
*
* @private
* @name add
* @memberOf SetCache
* @alias push
* @param {*} value The value to cache.
* @returns {Object} Returns the cache instance.
*/
function setCacheAdd(value) {
this.__data__.set(value, HASH_UNDEFINED$2);
return this;
}
/**
* Checks if `value` is in the array cache.
*
* @private
* @name has
* @memberOf SetCache
* @param {*} value The value to search for.
* @returns {number} Returns `true` if `value` is found, else `false`.
*/
function setCacheHas(value) {
return this.__data__.has(value);
}
/**
*
* Creates an array cache object to store unique values.
*
* @private
* @constructor
* @param {Array} [values] The values to cache.
*/
function SetCache(values) {
var index = -1,
length = values == null ? 0 : values.length;
this.__data__ = new MapCache;
while (++index < length) {
this.add(values[index]);
}
}
// Add methods to `SetCache`.
SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;
SetCache.prototype.has = setCacheHas;
/**
* A specialized version of `_.some` for arrays without support for iteratee
* shorthands.
*
* @private
* @param {Array} [array] The array to iterate over.
* @param {Function} predicate The function invoked per iteration.
* @returns {boolean} Returns `true` if any element passes the predicate check,
* else `false`.
*/
function arraySome(array, predicate) {
var index = -1,
length = array == null ? 0 : array.length;
while (++index < length) {
if (predicate(array[index], index, array)) {
return true;
}
}
return false;
}
/**
* Checks if a `cache` value for `key` exists.
*
* @private
* @param {Object} cache The cache to query.
* @param {string} key The key of the entry to check.
* @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
*/
function cacheHas(cache, key) {
return cache.has(key);
}
/** Used to compose bitmasks for value comparisons. */
var COMPARE_PARTIAL_FLAG = 1,
COMPARE_UNORDERED_FLAG = 2;
/**
* A specialized version of `baseIsEqualDeep` for arrays with support for
* partial deep comparisons.
*
* @private
* @param {Array} array The array to compare.
* @param {Array} other The other array to compare.
* @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
* @param {Function} customizer The function to customize comparisons.
* @param {Function} equalFunc The function to determine equivalents of values.
* @param {Object} stack Tracks traversed `array` and `other` objects.
* @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.
*/
function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {
var isPartial = bitmask & COMPARE_PARTIAL_FLAG,
arrLength = array.length,
othLength = other.length;
if (arrLength != othLength && !(isPartial && othLength > arrLength)) {
return false;
}
// Assume cyclic values are equal.
var stacked = stack.get(array);
if (stacked && stack.get(other)) {
return stacked == other;
}
var index = -1,
result = true,
seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;
stack.set(array, other);
stack.set(other, array);
// Ignore non-index properties.
while (++index < arrLength) {
var arrValue = array[index],
othValue = other[index];
if (customizer) {
var compared = isPartial
? customizer(othValue, arrValue, index, other, array, stack)
: customizer(arrValue, othValue, index, array, other, stack);
}
if (compared !== undefined) {
if (compared) {
continue;
}
result = false;
break;
}
// Recursively compare arrays (susceptible to call stack limits).
if (seen) {
if (!arraySome(other, function(othValue, othIndex) {
if (!cacheHas(seen, othIndex) &&
(arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {
return seen.push(othIndex);
}
})) {
result = false;
break;
}
} else if (!(
arrValue === othValue ||
equalFunc(arrValue, othValue, bitmask, customizer, stack)
)) {
result = false;
break;
}
}
stack['delete'](array);
stack['delete'](other);
return result;
}
/**
* Converts `map` to its key-value pairs.
*
* @private
* @param {Object} map The map to convert.
* @returns {Array} Returns the key-value pairs.
*/
function mapToArray(map) {
var index = -1,
result = Array(map.size);
map.forEach(function(value, key) {
result[++index] = [key, value];
});
return result;
}
/**
* Converts `set` to an array of its values.
*
* @private
* @param {Object} set The set to convert.
* @returns {Array} Returns the values.
*/
function setToArray(set) {
var index = -1,
result = Array(set.size);
set.forEach(function(value) {
result[++index] = value;
});
return result;
}
/** Used to compose bitmasks for value comparisons. */
var COMPARE_PARTIAL_FLAG$1 = 1,
COMPARE_UNORDERED_FLAG$1 = 2;
/** `Object#toString` result references. */
var boolTag$1 = '[object Boolean]',
dateTag$1 = '[object Date]',
errorTag$1 = '[object Error]',
mapTag$2 = '[object Map]',
numberTag$1 = '[object Number]',
regexpTag$1 = '[object RegExp]',
setTag$2 = '[object Set]',
stringTag$1 = '[object String]',
symbolTag$1 = '[object Symbol]';
var arrayBufferTag$1 = '[object ArrayBuffer]',
dataViewTag$2 = '[object DataView]';
/** Used to convert symbols to primitives and strings. */
var symbolProto$1 = Symbol$1 ? Symbol$1.prototype : undefined,
symbolValueOf = symbolProto$1 ? symbolProto$1.valueOf : undefined;
/**
* A specialized version of `baseIsEqualDeep` for comparing objects of
* the same `toStringTag`.
*
* **Note:** This function only supports comparing values with tags of
* `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
*
* @private
* @param {Object} object The object to compare.
* @param {Object} other The other object to compare.
* @param {string} tag The `toStringTag` of the objects to compare.
* @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
* @param {Function} customizer The function to customize comparisons.
* @param {Function} equalFunc The function to determine equivalents of values.
* @param {Object} stack Tracks traversed `object` and `other` objects.
* @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
*/
function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {
switch (tag) {
case dataViewTag$2:
if ((object.byteLength != other.byteLength) ||
(object.byteOffset != other.byteOffset)) {
return false;
}
object = object.buffer;
other = other.buffer;
case arrayBufferTag$1:
if ((object.byteLength != other.byteLength) ||
!equalFunc(new Uint8Array(object), new Uint8Array(other))) {
return false;
}
return true;
case boolTag$1:
case dateTag$1:
case numberTag$1:
// Coerce booleans to `1` or `0` and dates to milliseconds.
// Invalid dates are coerced to `NaN`.
return eq(+object, +other);
case errorTag$1:
return object.name == other.name && object.message == other.message;
case regexpTag$1:
case stringTag$1:
// Coerce regexes to strings and treat strings, primitives and objects,
// as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring
// for more details.
return object == (other + '');
case mapTag$2:
var convert = mapToArray;
case setTag$2:
var isPartial = bitmask & COMPARE_PARTIAL_FLAG$1;
convert || (convert = setToArray);
if (object.size != other.size && !isPartial) {
return false;
}
// Assume cyclic values are equal.
var stacked = stack.get(object);
if (stacked) {
return stacked == other;
}
bitmask |= COMPARE_UNORDERED_FLAG$1;
// Recursively compare objects (susceptible to call stack limits).
stack.set(object, other);
var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);
stack['delete'](object);
return result;
case symbolTag$1:
if (symbolValueOf) {
return symbolValueOf.call(object) == symbolValueOf.call(other);
}
}
return false;
}
/** Used to compose bitmasks for value comparisons. */
var COMPARE_PARTIAL_FLAG$2 = 1;
/** Used for built-in method references. */
var objectProto$a = Object.prototype;
/** Used to check objects for own properties. */
var hasOwnProperty$9 = objectProto$a.hasOwnProperty;
/**
* A specialized version of `baseIsEqualDeep` for objects with support for
* partial deep comparisons.
*
* @private
* @param {Object} object The object to compare.
* @param {Object} other The other object to compare.
* @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
* @param {Function} customizer The function to customize comparisons.
* @param {Function} equalFunc The function to determine equivalents of values.
* @param {Object} stack Tracks traversed `object` and `other` objects.
* @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
*/
function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {
var isPartial = bitmask & COMPARE_PARTIAL_FLAG$2,
objProps = getAllKeys(object),
objLength = objProps.length,
othProps = getAllKeys(other),
othLength = othProps.length;
if (objLength != othLength && !isPartial) {
return false;
}
var index = objLength;
while (index--) {
var key = objProps[index];
if (!(isPartial ? key in other : hasOwnProperty$9.call(other, key))) {
return false;
}
}
// Assume cyclic values are equal.
var stacked = stack.get(object);
if (stacked && stack.get(other)) {
return stacked == other;
}
var result = true;
stack.set(object, other);
stack.set(other, object);
var skipCtor = isPartial;
while (++index < objLength) {
key = objProps[index];
var objValue = object[key],
othValue = other[key];
if (customizer) {
var compared = isPartial
? customizer(othValue, objValue, key, other, object, stack)
: customizer(objValue, othValue, key, object, other, stack);
}
// Recursively compare objects (susceptible to call stack limits).
if (!(compared === undefined
? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))
: compared
)) {
result = false;
break;
}
skipCtor || (skipCtor = key == 'constructor');
}
if (result && !skipCtor) {
var objCtor = object.constructor,
othCtor = other.constructor;
// Non `Object` object instances with different constructors are not equal.
if (objCtor != othCtor &&
('constructor' in object && 'constructor' in other) &&
!(typeof objCtor == 'function' && objCtor instanceof objCtor &&
typeof othCtor == 'function' && othCtor instanceof othCtor)) {
result = false;
}
}
stack['delete'](object);
stack['delete'](other);
return result;
}
/** Used to compose bitmasks for value comparisons. */
var COMPARE_PARTIAL_FLAG$3 = 1;
/** `Object#toString` result references. */
var argsTag$2 = '[object Arguments]',
arrayTag$1 = '[object Array]',
objectTag$2 = '[object Object]';
/** Used for built-in method references. */
var objectProto$b = Object.prototype;
/** Used to check objects for own properties. */
var hasOwnProperty$a = objectProto$b.hasOwnProperty;
/**
* A specialized version of `baseIsEqual` for arrays and objects which performs
* deep comparisons and tracks traversed objects enabling objects with circular
* references to be compared.
*
* @private
* @param {Object} object The object to compare.
* @param {Object} other The other object to compare.
* @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
* @param {Function} customizer The function to customize comparisons.
* @param {Function} equalFunc The function to determine equivalents of values.
* @param {Object} [stack] Tracks traversed `object` and `other` objects.
* @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
*/
function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {
var objIsArr = isArray$1(object),
othIsArr = isArray$1(other),
objTag = objIsArr ? arrayTag$1 : getTag$1(object),
othTag = othIsArr ? arrayTag$1 : getTag$1(other);
objTag = objTag == argsTag$2 ? objectTag$2 : objTag;
othTag = othTag == argsTag$2 ? objectTag$2 : othTag;
var objIsObj = objTag == objectTag$2,
othIsObj = othTag == objectTag$2,
isSameTag = objTag == othTag;
if (isSameTag && isBuffer(object)) {
if (!isBuffer(other)) {
return false;
}
objIsArr = true;
objIsObj = false;
}
if (isSameTag && !objIsObj) {
stack || (stack = new Stack);
return (objIsArr || isTypedArray(object))
? equalArrays(object, other, bitmask, customizer, equalFunc, stack)
: equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);
}
if (!(bitmask & COMPARE_PARTIAL_FLAG$3)) {
var objIsWrapped = objIsObj && hasOwnProperty$a.call(object, '__wrapped__'),
othIsWrapped = othIsObj && hasOwnProperty$a.call(other, '__wrapped__');
if (objIsWrapped || othIsWrapped) {
var objUnwrapped = objIsWrapped ? object.value() : object,
othUnwrapped = othIsWrapped ? other.value() : other;
stack || (stack = new Stack);
return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);
}
}
if (!isSameTag) {
return false;
}
stack || (stack = new Stack);
return equalObjects(object, other, bitmask, customizer, equalFunc, stack);
}
/**
* The base implementation of `_.isEqual` which supports partial comparisons
* and tracks traversed objects.
*
* @private
* @param {*} value The value to compare.
* @param {*} other The other value to compare.
* @param {boolean} bitmask The bitmask flags.
* 1 - Unordered comparison
* 2 - Partial comparison
* @param {Function} [customizer] The function to customize comparisons.
* @param {Object} [stack] Tracks traversed `value` and `other` objects.
* @returns {boolean} Returns `true` if the values are equivalent, else `false`.
*/
function baseIsEqual(value, other, bitmask, customizer, stack) {
if (value === other) {
return true;
}
if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {
return value !== value && other !== other;
}
return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);
}
/** Used to compose bitmasks for value comparisons. */
var COMPARE_PARTIAL_FLAG$4 = 1,
COMPARE_UNORDERED_FLAG$2 = 2;
/**
* The base implementation of `_.isMatch` without support for iteratee shorthands.
*
* @private
* @param {Object} object The object to inspect.
* @param {Object} source The object of property values to match.
* @param {Array} matchData The property names, values, and compare flags to match.
* @param {Function} [customizer] The function to customize comparisons.
* @returns {boolean} Returns `true` if `object` is a match, else `false`.
*/
function baseIsMatch(object, source, matchData, customizer) {
var index = matchData.length,
length = index,
noCustomizer = !customizer;
if (object == null) {
return !length;
}
object = Object(object);
while (index--) {
var data = matchData[index];
if ((noCustomizer && data[2])
? data[1] !== object[data[0]]
: !(data[0] in object)
) {
return false;
}
}
while (++index < length) {
data = matchData[index];
var key = data[0],
objValue = object[key],
srcValue = data[1];
if (noCustomizer && data[2]) {
if (objValue === undefined && !(key in object)) {
return false;
}
} else {
var stack = new Stack;
if (customizer) {
var result = customizer(objValue, srcValue, key, object, source, stack);
}
if (!(result === undefined
? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG$4 | COMPARE_UNORDERED_FLAG$2, customizer, stack)
: result
)) {
return false;
}
}
}
return true;
}
/**
* Checks if `value` is suitable for strict equality comparisons, i.e. `===`.
*
* @private
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` if suitable for strict
* equality comparisons, else `false`.
*/
function isStrictComparable(value) {
return value === value && !isObject$3(value);
}
/**
* Gets the property names, values, and compare flags of `object`.
*
* @private
* @param {Object} object The object to query.
* @returns {Array} Returns the match data of `object`.
*/
function getMatchData(object) {
var result = keys(object),
length = result.length;
while (length--) {
var key = result[length],
value = object[key];
result[length] = [key, value, isStrictComparable(value)];
}
return result;
}
/**
* A specialized version of `matchesProperty` for source values suitable
* for strict equality comparisons, i.e. `===`.
*
* @private
* @param {string} key The key of the property to get.
* @param {*} srcValue The value to match.
* @returns {Function} Returns the new spec function.
*/
function matchesStrictComparable(key, srcValue) {
return function(object) {
if (object == null) {
return false;
}
return object[key] === srcValue &&
(srcValue !== undefined || (key in Object(object)));
};
}
/**
* The base implementation of `_.matches` which doesn't clone `source`.
*
* @private
* @param {Object} source The object of property values to match.
* @returns {Function} Returns the new spec function.
*/
function baseMatches(source) {
var matchData = getMatchData(source);
if (matchData.length == 1 && matchData[0][2]) {
return matchesStrictComparable(matchData[0][0], matchData[0][1]);
}
return function(object) {
return object === source || baseIsMatch(object, source, matchData);
};
}
/**
* The base implementation of `_.hasIn` without support for deep paths.
*
* @private
* @param {Object} [object] The object to query.
* @param {Array|string} key The key to check.
* @returns {boolean} Returns `true` if `key` exists, else `false`.
*/
function baseHasIn(object, key) {
return object != null && key in Object(object);
}
/**
* Checks if `path` exists on `object`.
*
* @private
* @param {Object} object The object to query.
* @param {Array|string} path The path to check.
* @param {Function} hasFunc The function to check properties.
* @returns {boolean} Returns `true` if `path` exists, else `false`.
*/
function hasPath(object, path, hasFunc) {
path = castPath(path, object);
var index = -1,
length = path.length,
result = false;
while (++index < length) {
var key = toKey(path[index]);
if (!(result = object != null && hasFunc(object, key))) {
break;
}
object = object[key];
}
if (result || ++index != length) {
return result;
}
length = object == null ? 0 : object.length;
return !!length && isLength(length) && isIndex(key, length) &&
(isArray$1(object) || isArguments(object));
}
/**
* Checks if `path` is a direct or inherited property of `object`.
*
* @static
* @memberOf _
* @since 4.0.0
* @category Object
* @param {Object} object The object to query.
* @param {Array|string} path The path to check.
* @returns {boolean} Returns `true` if `path` exists, else `false`.
* @example
*
* var object = _.create({ 'a': _.create({ 'b': 2 }) });
*
* _.hasIn(object, 'a');
* // => true
*
* _.hasIn(object, 'a.b');
* // => true
*
* _.hasIn(object, ['a', 'b']);
* // => true
*
* _.hasIn(object, 'b');
* // => false
*/
function hasIn(object, path) {
return object != null && hasPath(object, path, baseHasIn);
}
/** Used to compose bitmasks for value comparisons. */
var COMPARE_PARTIAL_FLAG$5 = 1,
COMPARE_UNORDERED_FLAG$3 = 2;
/**
* The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.
*
* @private
* @param {string} path The path of the property to get.
* @param {*} srcValue The value to match.
* @returns {Function} Returns the new spec function.
*/
function baseMatchesProperty(path, srcValue) {
if (isKey(path) && isStrictComparable(srcValue)) {
return matchesStrictComparable(toKey(path), srcValue);
}
return function(object) {
var objValue = get(object, path);
return (objValue === undefined && objValue === srcValue)
? hasIn(object, path)
: baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG$5 | COMPARE_UNORDERED_FLAG$3);
};
}
/**
* The base implementation of `_.property` without support for deep paths.
*
* @private
* @param {string} key The key of the property to get.
* @returns {Function} Returns the new accessor function.
*/
function baseProperty(key) {
return function(object) {
return object == null ? undefined : object[key];
};
}
/**
* A specialized version of `baseProperty` which supports deep paths.
*
* @private
* @param {Array|string} path The path of the property to get.
* @returns {Function} Returns the new accessor function.
*/
function basePropertyDeep(path) {
return function(object) {
return baseGet(object, path);
};
}
/**
* Creates a function that returns the value at `path` of a given object.
*
* @static
* @memberOf _
* @since 2.4.0
* @category Util
* @param {Array|string} path The path of the property to get.
* @returns {Function} Returns the new accessor function.
* @example
*
* var objects = [
* { 'a': { 'b': 2 } },
* { 'a': { 'b': 1 } }
* ];
*
* _.map(objects, _.property('a.b'));
* // => [2, 1]
*
* _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');
* // => [1, 2]
*/
function property(path) {
return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);
}
/**
* The base implementation of `_.iteratee`.
*
* @private
* @param {*} [value=_.identity] The value to convert to an iteratee.
* @returns {Function} Returns the iteratee.
*/
function baseIteratee(value) {
// Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.
// See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.
if (typeof value == 'function') {
return value;
}
if (value == null) {
return identity$1;
}
if (typeof value == 'object') {
return isArray$1(value)
? baseMatchesProperty(value[0], value[1])
: baseMatches(value);
}
return property(value);
}
/**
* Creates a base function for methods like `_.forIn` and `_.forOwn`.
*
* @private
* @param {boolean} [fromRight] Specify iterating from right to left.
* @returns {Function} Returns the new base function.
*/
function createBaseFor(fromRight) {
return function(object, iteratee, keysFunc) {
var index = -1,
iterable = Object(object),
props = keysFunc(object),
length = props.length;
while (length--) {
var key = props[fromRight ? length : ++index];
if (iteratee(iterable[key], key, iterable) === false) {
break;
}
}
return object;
};
}
/**
* The base implementation of `baseForOwn` which iterates over `object`
* properties returned by `keysFunc` and invokes `iteratee` for each property.
* Iteratee functions may exit iteration early by explicitly returning `false`.
*
* @private
* @param {Object} object The object to iterate over.
* @param {Function} iteratee The function invoked per iteration.
* @param {Function} keysFunc The function to get the keys of `object`.
* @returns {Object} Returns `object`.
*/
var baseFor = createBaseFor();
/**
* The base implementation of `_.forOwn` without support for iteratee shorthands.
*
* @private
* @param {Object} object The object to iterate over.
* @param {Function} iteratee The function invoked per iteration.
* @returns {Object} Returns `object`.
*/
function baseForOwn(object, iteratee) {
return object && baseFor(object, iteratee, keys);
}
/**
* Creates a `baseEach` or `baseEachRight` function.
*
* @private
* @param {Function} eachFunc The function to iterate over a collection.
* @param {boolean} [fromRight] Specify iterating from right to left.
* @returns {Function} Returns the new base function.
*/
function createBaseEach(eachFunc, fromRight) {
return function(collection, iteratee) {
if (collection == null) {
return collection;
}
if (!isArrayLike(collection)) {
return eachFunc(collection, iteratee);
}
var length = collection.length,
index = fromRight ? length : -1,
iterable = Object(collection);
while ((fromRight ? index-- : ++index < length)) {
if (iteratee(iterable[index], index, iterable) === false) {
break;
}
}
return collection;
};
}
/**
* The base implementation of `_.forEach` without support for iteratee shorthands.
*
* @private
* @param {Array|Object} collection The collection to iterate over.
* @param {Function} iteratee The function invoked per iteration.
* @returns {Array|Object} Returns `collection`.
*/
var baseEach = createBaseEach(baseForOwn);
/**
* The base implementation of `_.map` without support for iteratee shorthands.
*
* @private
* @param {Array|Object} collection The collection to iterate over.
* @param {Function} iteratee The function invoked per iteration.
* @returns {Array} Returns the new mapped array.
*/
function baseMap(collection, iteratee) {
var index = -1,
result = isArrayLike(collection) ? Array(collection.length) : [];
baseEach(collection, function(value, key, collection) {
result[++index] = iteratee(value, key, collection);
});
return result;
}
/** `Object#toString` result references. */
var mapTag$3 = '[object Map]',
setTag$3 = '[object Set]';
/** Used for built-in method references. */
var objectProto$c = Object.prototype;
/** Used to check objects for own properties. */
var hasOwnProperty$b = objectProto$c.hasOwnProperty;
/**
* Checks if `value` is an empty object, collection, map, or set.
*
* Objects are considered empty if they have no own enumerable string keyed
* properties.
*
* Array-like values such as `arguments` objects, arrays, buffers, strings, or
* jQuery-like collections are considered empty if they have a `length` of `0`.
* Similarly, maps and sets are considered empty if they have a `size` of `0`.
*
* @static
* @memberOf _
* @since 0.1.0
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is empty, else `false`.
* @example
*
* _.isEmpty(null);
* // => true
*
* _.isEmpty(true);
* // => true
*
* _.isEmpty(1);
* // => true
*
* _.isEmpty([1, 2, 3]);
* // => false
*
* _.isEmpty({ 'a': 1 });
* // => false
*/
function isEmpty(value) {
if (value == null) {
return true;
}
if (isArrayLike(value) &&
(isArray$1(value) || typeof value == 'string' || typeof value.splice == 'function' ||
isBuffer(value) || isTypedArray(value) || isArguments(value))) {
return !value.length;
}
var tag = getTag$1(value);
if (tag == mapTag$3 || tag == setTag$3) {
return !value.size;
}
if (isPrototype(value)) {
return !baseKeys(value).length;
}
for (var key in value) {
if (hasOwnProperty$b.call(value, key)) {
return false;
}
}
return true;
}
/**
* The base implementation of `_.sortBy` which uses `comparer` to define the
* sort order of `array` and replaces criteria objects with their corresponding
* values.
*
* @private
* @param {Array} array The array to sort.
* @param {Function} comparer The function to define sort order.
* @returns {Array} Returns `array`.
*/
function baseSortBy(array, comparer) {
var length = array.length;
array.sort(comparer);
while (length--) {
array[length] = array[length].value;
}
return array;
}
/**
* Compares values to sort them in ascending order.
*
* @private
* @param {*} value The value to compare.
* @param {*} other The other value to compare.
* @returns {number} Returns the sort order indicator for `value`.
*/
function compareAscending(value, other) {
if (value !== other) {
var valIsDefined = value !== undefined,
valIsNull = value === null,
valIsReflexive = value === value,
valIsSymbol = isSymbol(value);
var othIsDefined = other !== undefined,
othIsNull = other === null,
othIsReflexive = other === other,
othIsSymbol = isSymbol(other);
if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) ||
(valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) ||
(valIsNull && othIsDefined && othIsReflexive) ||
(!valIsDefined && othIsReflexive) ||
!valIsReflexive) {
return 1;
}
if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) ||
(othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) ||
(othIsNull && valIsDefined && valIsReflexive) ||
(!othIsDefined && valIsReflexive) ||
!othIsReflexive) {
return -1;
}
}
return 0;
}
/**
* Used by `_.orderBy` to compare multiple properties of a value to another
* and stable sort them.
*
* If `orders` is unspecified, all values are sorted in ascending order. Otherwise,
* specify an order of "desc" for descending or "asc" for ascending sort order
* of corresponding values.
*
* @private
* @param {Object} object The object to compare.
* @param {Object} other The other object to compare.
* @param {boolean[]|string[]} orders The order to sort by for each property.
* @returns {number} Returns the sort order indicator for `object`.
*/
function compareMultiple(object, other, orders) {
var index = -1,
objCriteria = object.criteria,
othCriteria = other.criteria,
length = objCriteria.length,
ordersLength = orders.length;
while (++index < length) {
var result = compareAscending(objCriteria[index], othCriteria[index]);
if (result) {
if (index >= ordersLength) {
return result;
}
var order = orders[index];
return result * (order == 'desc' ? -1 : 1);
}
}
// Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications
// that causes it, under certain circumstances, to provide the same value for
// `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247
// for more details.
//
// This also ensures a stable sort in V8 and other engines.
// See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details.
return object.index - other.index;
}
/**
* The base implementation of `_.orderBy` without param guards.
*
* @private
* @param {Array|Object} collection The collection to iterate over.
* @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.
* @param {string[]} orders The sort orders of `iteratees`.
* @returns {Array} Returns the new sorted array.
*/
function baseOrderBy(collection, iteratees, orders) {
var index = -1;
iteratees = arrayMap(iteratees.length ? iteratees : [identity$1], baseUnary(baseIteratee));
var result = baseMap(collection, function(value, key, collection) {
var criteria = arrayMap(iteratees, function(iteratee) {
return iteratee(value);
});
return { 'criteria': criteria, 'index': ++index, 'value': value };
});
return baseSortBy(result, function(object, other) {
return compareMultiple(object, other, orders);
});
}
/**
* This method is like `_.sortBy` except that it allows specifying the sort
* orders of the iteratees to sort by. If `orders` is unspecified, all values
* are sorted in ascending order. Otherwise, specify an order of "desc" for
* descending or "asc" for ascending sort order of corresponding values.
*
* @static
* @memberOf _
* @since 4.0.0
* @category Collection
* @param {Array|Object} collection The collection to iterate over.
* @param {Array[]|Function[]|Object[]|string[]} [iteratees=[_.identity]]
* The iteratees to sort by.
* @param {string[]} [orders] The sort orders of `iteratees`.
* @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.
* @returns {Array} Returns the new sorted array.
* @example
*
* var users = [
* { 'user': 'fred', 'age': 48 },
* { 'user': 'barney', 'age': 34 },
* { 'user': 'fred', 'age': 40 },
* { 'user': 'barney', 'age': 36 }
* ];
*
* // Sort by `user` in ascending order and by `age` in descending order.
* _.orderBy(users, ['user', 'age'], ['asc', 'desc']);
* // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]
*/
function orderBy(collection, iteratees, orders, guard) {
if (collection == null) {
return [];
}
if (!isArray$1(iteratees)) {
iteratees = iteratees == null ? [] : [iteratees];
}
orders = guard ? undefined : orders;
if (!isArray$1(orders)) {
orders = orders == null ? [] : [orders];
}
return baseOrderBy(collection, iteratees, orders);
}
//
var script$c = {
data() {
return {
currentTab: '',
sortKey: 'release_date',
sortOrder: 'desc',
title: '',
image: '',
type: '',
link: '',
head: null,
body: null
}
},
computed: {
showTable() {
if (this.body) {
if (this.sortKey == 'nb_song')
return orderBy(
this.body[this.currentTab],
function (o) {
return new Number(o.nb_song)
},
this.sortOrder
)
else return orderBy(this.body[this.currentTab], this.sortKey, this.sortOrder)
} else return []
}
},
mounted() {
socket.on('show_artist', this.showArtist);
EventBus.$on('artistTab:updateSelected', this.updateSelected);
EventBus.$on('artistTab:changeTab', this.changeTab);
},
methods: {
reset() {
this.title = 'Loading...';
this.image = '';
this.type = '';
this.currentTab = '';
this.sortKey = 'release_date';
this.sortOrder = 'desc';
this.link = '';
this.head = [];
this.body = null;
},
addToQueue(e) {
e.stopPropagation();
Downloads.sendAddToQueue(e.currentTarget.dataset.link);
},
sortBy(key) {
if (key == this.sortKey) {
this.sortOrder = this.sortOrder == 'asc' ? 'desc' : 'asc';
} else {
this.sortKey = key;
this.sortOrder = 'asc';
}
},
changeTab(tab) {
this.currentTab = tab;
},
updateSelected() {
// Last tab opened logic
},
checkNewRelease(date) {
let g1 = new Date();
let g2 = new Date(date);
g2.setDate(g2.getDate() + 3);
g1.setHours(0, 0, 0, 0);
return g1.getTime() <= g2.getTime()
},
showArtist(data) {
this.reset();
const { name, picture_xl, id, releases } = data;
this.title = name;
this.image = picture_xl;
this.type = 'Artist';
this.link = `https://www.deezer.com/artist/${id}`;
if (this.currentTab === '') this.currentTab = Object.keys(releases)[0];
this.sortKey = 'release_date';
this.sortOrder = 'desc';
this.head = [
{ title: this.$tc('globals.listTabs.title', 1), sortKey: 'title' },
{ title: this.$t('globals.listTabs.releaseDate'), sortKey: 'release_date' },
{ title: this.$tc('globals.listTabs.track', 2), sortKey: 'nb_song' },
{ title: '', width: '32px' }
];
if (isEmpty(releases)) {
this.body = null;
} else {
this.body = releases;
}
}
}
};
/* script */
const __vue_script__$c = script$c;
/* template */
var __vue_render__$e = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:"relative image-header",attrs:{"id":"artist_tab"}},[_c('header',{staticClass:"flex items-center",style:({
'background-image':
'linear-gradient(to bottom, transparent 0%, var(--main-background) 100%), url(\'' + _vm.image + '\')'
})},[_c('h1',{staticClass:"m-0"},[_vm._v(_vm._s(_vm.title))]),_vm._v(" "),_c('div',{staticClass:"grid w-16 h-16 ml-auto rounded-full cursor-pointer bg-primary text-grayscale-870 place-items-center",attrs:{"role":"button","aria-label":"download","data-link":_vm.link},on:{"click":function($event){$event.stopPropagation();return _vm.addToQueue($event)}}},[_c('i',{staticClass:"text-4xl material-icons",attrs:{"title":_vm.$t('globals.download_hint')}},[_vm._v("get_app")])])]),_vm._v(" "),_c('div',{staticClass:"my-4"},_vm._l((_vm.body),function(item,name){return _c('button',{key:name,staticClass:"mr-2 btn bg-background-main",class:{ 'btn-primary': name === _vm.currentTab },attrs:{"href":'#artist_' + name},on:{"click":function($event){return _vm.changeTab(name)}}},[_vm._v("\n\t\t\t"+_vm._s(_vm.$tc(("globals.listTabs." + name), 2))+"\n\t\t")])}),0),_vm._v(" "),_c('table',{staticClass:"table"},[_c('thead',[_c('tr',_vm._l((_vm.head),function(data){return _c('th',{class:{
'sort-asc': data.sortKey == _vm.sortKey && _vm.sortOrder == 'asc',
'sort-desc': data.sortKey == _vm.sortKey && _vm.sortOrder == 'desc',
sortable: data.sortKey,
clickable: data.sortKey
},style:({ width: data.width ? data.width : 'auto' }),on:{"click":function($event){data.sortKey ? _vm.sortBy(data.sortKey) : null;}}},[_vm._v("\n\t\t\t\t\t"+_vm._s(data.title)+"\n\t\t\t\t")])}),0)]),_vm._v(" "),_c('tbody',_vm._l((_vm.showTable),function(release){return _c('tr',{key:release.id},[_c('router-link',{staticClass:"flex items-center clickable",attrs:{"tag":"td","to":{ name: 'Album', params: { id: release.id } }}},[_c('img',{staticClass:"rounded coverart",staticStyle:{"margin-right":"16px","width":"56px","height":"56px"},attrs:{"src":release.cover_small}}),_vm._v(" "),(release.explicit_lyrics)?_c('i',{staticClass:"material-icons explicit-icon"},[_vm._v(" explicit ")]):_vm._e(),_vm._v("\n\t\t\t\t\t"+_vm._s(release.title)+"\n\t\t\t\t\t"),(_vm.checkNewRelease(release.release_date))?_c('i',{staticClass:"material-icons",staticStyle:{"color":"#ff7300"}},[_vm._v("\n\t\t\t\t\t\tfiber_new\n\t\t\t\t\t")]):_vm._e()]),_vm._v(" "),_c('td',[_vm._v(_vm._s(release.release_date))]),_vm._v(" "),_c('td',[_vm._v(_vm._s(release.nb_song))]),_vm._v(" "),_c('td',{staticClass:"clickable",attrs:{"data-link":release.link},on:{"click":function($event){$event.stopPropagation();return _vm.addToQueue($event)}}},[_c('i',{staticClass:"material-icons",attrs:{"title":_vm.$t('globals.download_hint')}},[_vm._v(" file_download ")])])],1)}),0)])])};
var __vue_staticRenderFns__$e = [];
/* style */
const __vue_inject_styles__$e = undefined;
/* scoped */
const __vue_scope_id__$e = undefined;
/* functional template */
const __vue_is_functional_template__$e = false;
/* component normalizer */
function __vue_normalize__$e(
template, style, script,
scope, functional, moduleIdentifier,
createInjector, createInjectorSSR
) {
const component = (typeof script === 'function' ? script.options : script) || {};
// For security concerns, we use only base name in production mode.
component.__file = "Artist.vue";
if (!component.render) {
component.render = template.render;
component.staticRenderFns = template.staticRenderFns;
component._compiled = true;
if (functional) component.functional = true;
}
component._scopeId = scope;
return component
}
/* style inject */
/* style inject SSR */
var Artist = __vue_normalize__$e(
{ render: __vue_render__$e, staticRenderFns: __vue_staticRenderFns__$e },
__vue_inject_styles__$e,
__vue_script__$c,
__vue_scope_id__$e,
__vue_is_functional_template__$e);
let chartsData = {};
let cached$1 = false;
function getChartsData() {
if (cached$1) {
return chartsData
} else {
socket.emit('get_charts_data');
return new Promise((resolve, reject) => {
socket.on('init_charts', data => {
chartsData = data;
cached$1 = true;
socket.off('init_charts');
resolve(data);
});
})
}
}
//
var script$d = {
methods: {
previewMouseEnter(e) {
EventBus.$emit('trackPreview:previewMouseEnter', e);
},
previewMouseLeave(e) {
EventBus.$emit('trackPreview:previewMouseLeave', e);
}
}
};
/* script */
const __vue_script__$d = script$d;
/* template */
var __vue_render__$f = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('i',{staticClass:"absolute top-0 right-0 flex items-center justify-center w-full h-full text-center transition-opacity duration-200 ease-in-out bg-black bg-opacity-50 rounded opacity-0 material-icons preview_controls",attrs:{"title":_vm.$t('globals.play_hint')},on:{"mouseenter":_vm.previewMouseEnter,"mouseleave":_vm.previewMouseLeave}},[_vm._v("\n\tplay_arrow\n")])};
var __vue_staticRenderFns__$f = [];
/* style */
const __vue_inject_styles__$f = undefined;
/* scoped */
const __vue_scope_id__$f = undefined;
/* functional template */
const __vue_is_functional_template__$f = false;
/* component normalizer */
function __vue_normalize__$f(
template, style, script,
scope, functional, moduleIdentifier,
createInjector, createInjectorSSR
) {
const component = (typeof script === 'function' ? script.options : script) || {};
// For security concerns, we use only base name in production mode.
component.__file = "PreviewControls.vue";
if (!component.render) {
component.render = template.render;
component.staticRenderFns = template.staticRenderFns;
component._compiled = true;
if (functional) component.functional = true;
}
component._scopeId = scope;
return component
}
/* style inject */
/* style inject SSR */
var PreviewControls = __vue_normalize__$f(
{ render: __vue_render__$f, staticRenderFns: __vue_staticRenderFns__$f },
__vue_inject_styles__$f,
__vue_script__$d,
__vue_scope_id__$f,
__vue_is_functional_template__$f);
//
var script$e = {
components: {
PreviewControls
},
data() {
return {
country: '',
id: 0,
countries: [],
chart: []
}
},
computed: {
worldwideRelease() {
let worldwideRelease = this.countries.filter(country => {
return country.title === 'Worldwide'
});
return worldwideRelease[0]
}
},
async created() {
socket.on('setChartTracks', this.setTracklist);
this.$on('hook:destroyed', () => {
socket.off('setChartTracks');
});
let chartsData = await getChartsData();
let worldwideChart;
chartsData = chartsData.filter(item => {
if (item.title === 'Worldwide') {
worldwideChart = item;
}
return item.title !== 'Worldwide'
});
chartsData.unshift(worldwideChart);
this.initCharts(chartsData);
},
methods: {
convertDuration,
playPausePreview(e) {
EventBus.$emit('trackPreview:playPausePreview', e);
},
addToQueue(e) {
e.stopPropagation();
sendAddToQueue(e.currentTarget.dataset.link);
},
getTrackList(event) {
document.getElementById('content').scrollTo(0, 0);
const {
currentTarget: {
dataset: { title }
},
currentTarget: {
dataset: { id }
}
} = event;
this.country = title;
localStorage.setItem('chart', this.country);
this.id = id;
socket.emit('getChartTracks', this.id);
},
setTracklist(data) {
this.chart = data;
},
onChangeCountry() {
this.country = '';
this.id = 0;
},
initCharts(chartsData) {
this.countries = chartsData;
this.country = localStorage.getItem('chart') || '';
if (!this.country) return
let i = 0;
for (; i < this.countries.length; i++) {
if (this.countries[i].title == this.country) break
}
if (i !== this.countries.length) {
this.id = this.countries[i].id;
socket.emit('getChartTracks', this.id);
} else {
this.country = '';
localStorage.setItem('chart', this.country);
}
}
}
};
/* script */
const __vue_script__$e = script$e;
/* template */
var __vue_render__$g = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('h1',{staticClass:"mb-8 text-5xl"},[_vm._v(_vm._s(_vm.$t('charts.title')))]),_vm._v(" "),(_vm.country === '')?_c('div',[_c('div',{staticClass:"release-grid"},_vm._l((_vm.countries),function(release){return _c('div',{key:release.id,staticClass:"w-40 h-40 release clickable",attrs:{"role":"button","aria-label":release.title,"data-title":release.title,"data-id":release.id},on:{"click":_vm.getTrackList}},[_c('img',{staticClass:"w-full rounded coverart",attrs:{"src":release.picture_medium}})])}),0)]):_c('div',[_c('button',{staticClass:"btn btn-primary",on:{"click":_vm.onChangeCountry}},[_vm._v(_vm._s(_vm.$t('charts.changeCountry')))]),_vm._v(" "),_c('button',{staticClass:"btn btn-primary",attrs:{"data-link":'https://www.deezer.com/playlist/' + _vm.id},on:{"click":function($event){$event.stopPropagation();return _vm.addToQueue($event)}}},[_vm._v("\n\t\t\t"+_vm._s(_vm.$t('charts.download'))+"\n\t\t")]),_vm._v(" "),_c('table',{staticClass:"table table--charts"},[_c('tbody',_vm._l((_vm.chart),function(track){return _c('tr',{staticClass:"track_row"},[_c('td',{staticClass:"p-3 text-center cursor-default",class:{ first: track.position === 1 }},[_vm._v("\n\t\t\t\t\t\t"+_vm._s(track.position)+"\n\t\t\t\t\t")]),_vm._v(" "),_c('td',{staticClass:"table__icon table__icon--big"},[_c('span',{staticClass:"relative inline-block rounded cursor-pointer",attrs:{"data-preview":track.preview},on:{"click":_vm.playPausePreview}},[(track.preview)?_c('PreviewControls'):_vm._e(),_vm._v(" "),_c('img',{staticClass:"rounded coverart",attrs:{"src":track.album.cover_small}})],1)]),_vm._v(" "),_c('td',{staticClass:"table__cell--large"},[_vm._v("\n\t\t\t\t\t\t"+_vm._s(track.title +
(track.title_version && track.title.indexOf(track.title_version) == -1 ? ' ' + track.title_version : ''))+"\n\t\t\t\t\t")]),_vm._v(" "),_c('router-link',{staticClass:"table__cell table__cell--medium table__cell--center clickable",attrs:{"tag":"td","to":{ name: 'Artist', params: { id: track.artist.id } }}},[_vm._v("\n\t\t\t\t\t\t"+_vm._s(track.artist.name)+"\n\t\t\t\t\t")]),_vm._v(" "),_c('router-link',{staticClass:"table__cell--medium table__cell--center clickable",attrs:{"tag":"td","to":{ name: 'Album', params: { id: track.album.id } }}},[_vm._v("\n\t\t\t\t\t\t"+_vm._s(track.album.title)+"\n\t\t\t\t\t")]),_vm._v(" "),_c('td',{staticClass:"table__cell--small table__cell--center"},[_vm._v("\n\t\t\t\t\t\t"+_vm._s(_vm.convertDuration(track.duration))+"\n\t\t\t\t\t")]),_vm._v(" "),_c('td',{staticClass:"cursor-pointer group",attrs:{"data-link":track.link,"role":"button","aria-label":"download"},on:{"click":function($event){$event.stopPropagation();return _vm.addToQueue($event)}}},[_c('i',{staticClass:"transition-colors duration-150 ease-in-out material-icons group-hover:text-primary",attrs:{"title":_vm.$t('globals.download_hint')}},[_vm._v("\n\t\t\t\t\t\t\tget_app\n\t\t\t\t\t\t")])])],1)}),0)])])])};
var __vue_staticRenderFns__$g = [];
/* style */
const __vue_inject_styles__$g = undefined;
/* scoped */
const __vue_scope_id__$g = undefined;
/* functional template */
const __vue_is_functional_template__$g = false;
/* component normalizer */
function __vue_normalize__$g(
template, style, script,
scope, functional, moduleIdentifier,
createInjector, createInjectorSSR
) {
const component = (typeof script === 'function' ? script.options : script) || {};
// For security concerns, we use only base name in production mode.
component.__file = "Charts.vue";
if (!component.render) {
component.render = template.render;
component.staticRenderFns = template.staticRenderFns;
component._compiled = true;
if (functional) component.functional = true;
}
component._scopeId = scope;
return component
}
/* style inject */
/* style inject SSR */
var Charts = __vue_normalize__$g(
{ render: __vue_render__$g, staticRenderFns: __vue_staticRenderFns__$g },
__vue_inject_styles__$g,
__vue_script__$e,
__vue_scope_id__$g,
__vue_is_functional_template__$g);
//
var script$f = {
computed: {
...mapGetters(['getErrors']),
title() {
return `${this.getErrors.artist} - ${this.getErrors.title}`
},
errors() {
return this.getErrors.errors
}
}
};
/* script */
const __vue_script__$f = script$f;
/* template */
var __vue_render__$h = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('h1',{staticClass:"mb-8 text-5xl"},[_vm._v(_vm._s(_vm.$t('errors.title', { name: _vm.title })))]),_vm._v(" "),_c('table',{staticClass:"table table--tracklist"},[_c('tr',[_c('th',[_vm._v("ID")]),_vm._v(" "),_c('th',[_vm._v(_vm._s(_vm.$tc('globals.listTabs.artist', 1)))]),_vm._v(" "),_c('th',[_vm._v(_vm._s(_vm.$tc('globals.listTabs.title', 1)))]),_vm._v(" "),_c('th',[_vm._v(_vm._s(_vm.$tc('globals.listTabs.error', 1)))])]),_vm._v(" "),_vm._l((_vm.errors),function(error){return _c('tr',{key:error.data.id},[_c('td',[_vm._v(_vm._s(error.data.id))]),_vm._v(" "),_c('td',[_vm._v(_vm._s(error.data.artist))]),_vm._v(" "),_c('td',[_vm._v(_vm._s(error.data.title))]),_vm._v(" "),_c('td',[_vm._v(_vm._s(error.errid ? _vm.$t(("errors.ids." + (error.errid))) : error.message))])])})],2)])};
var __vue_staticRenderFns__$h = [];
/* style */
const __vue_inject_styles__$h = undefined;
/* scoped */
const __vue_scope_id__$h = undefined;
/* functional template */
const __vue_is_functional_template__$h = false;
/* component normalizer */
function __vue_normalize__$h(
template, style, script,
scope, functional, moduleIdentifier,
createInjector, createInjectorSSR
) {
const component = (typeof script === 'function' ? script.options : script) || {};
// For security concerns, we use only base name in production mode.
component.__file = "Errors.vue";
if (!component.render) {
component.render = template.render;
component.staticRenderFns = template.staticRenderFns;
component._compiled = true;
if (functional) component.functional = true;
}
component._scopeId = scope;
return component
}
/* style inject */
/* style inject SSR */
var Errors = __vue_normalize__$h(
{ render: __vue_render__$h, staticRenderFns: __vue_staticRenderFns__$h },
__vue_inject_styles__$h,
__vue_script__$f,
__vue_scope_id__$h,
__vue_is_functional_template__$h);
let favoritesData = {};
let cached$2 = false;
function getFavoritesData() {
if (cached$2) {
return favoritesData
} else {
socket.emit('get_favorites_data');
return new Promise((resolve, reject) => {
socket.on('init_favorites', data => {
favoritesData = data;
cached$2 = true;
socket.off('init_favorites');
resolve(data);
});
})
}
}
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
var script$g = {
inheritAttrs: false,
props: {
cover: {
type: String,
reqired: true
},
isRounded: {
type: Boolean,
required: false
},
isCircle: {
type: Boolean,
required: false
},
link: {
type: String,
reqired: true
}
}
};
/* script */
const __vue_script__$g = script$g;
/* template */
var __vue_render__$i = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:"relative cover-container group"},[_c('img',{staticClass:"block w-full opacity-100 coverart",class:{ rounded: _vm.isRounded, 'rounded-full': _vm.isCircle },attrs:{"aria-hidden":"true","src":_vm.cover}}),_vm._v(" "),_c('button',_vm._g({staticClass:"absolute p-0 text-center bg-black border-0 rounded-full opacity-0 download_overlay hover:bg-primary",attrs:{"role":"button","aria-label":"download","data-link":_vm.link,"tabindex":"0"}},_vm.$listeners),[_c('i',{staticClass:"text-white cursor-pointer material-icons",attrs:{"title":_vm.$t('globals.download_hint')}},[_vm._v("get_app")])])])};
var __vue_staticRenderFns__$i = [];
/* style */
const __vue_inject_styles__$i = function (inject) {
if (!inject) return
inject("data-v-3e6c40e4_0", { source: ".cover-container[data-v-3e6c40e4]{width:156px;height:156px;margin-bottom:10px}.cover-container .coverart[data-v-3e6c40e4]{backface-visibility:hidden;transition:.5s ease;height:auto}.cover-container .download_overlay[data-v-3e6c40e4]{top:50%;left:50%;transform:translate(-50%,-50%);transition:.5s ease;opacity:0;min-width:2rem;height:2.75rem;text-align:center}.cover-container .download_overlay i[data-v-3e6c40e4]{padding:.625rem}.cover-container .download_overlay[data-v-3e6c40e4]:focus{opacity:1}.cover-container:hover .coverart[data-v-3e6c40e4]{opacity:.75}.cover-container:hover .download_overlay[data-v-3e6c40e4]{opacity:1;border:0}", map: undefined, media: undefined });
};
/* scoped */
const __vue_scope_id__$i = "data-v-3e6c40e4";
/* module identifier */
const __vue_module_identifier__$b = undefined;
/* functional template */
const __vue_is_functional_template__$i = false;
/* component normalizer */
function __vue_normalize__$i(
template, style, script,
scope, functional, moduleIdentifier,
createInjector, createInjectorSSR
) {
const component = (typeof script === 'function' ? script.options : script) || {};
// For security concerns, we use only base name in production mode.
component.__file = "CoverContainer.vue";
if (!component.render) {
component.render = template.render;
component.staticRenderFns = template.staticRenderFns;
component._compiled = true;
if (functional) component.functional = true;
}
component._scopeId = scope;
{
let hook;
if (style) {
hook = function(context) {
style.call(this, createInjector(context));
};
}
if (hook !== undefined) {
if (component.functional) {
// register for functional component in vue file
const originalRender = component.render;
component.render = function renderWithStyleInjection(h, context) {
hook.call(context);
return originalRender(h, context)
};
} else {
// inject component registration as beforeCreate hook
const existing = component.beforeCreate;
component.beforeCreate = existing ? [].concat(existing, hook) : [hook];
}
}
}
return component
}
/* style inject */
function __vue_create_injector__$b() {
const head = document.head || document.getElementsByTagName('head')[0];
const styles = __vue_create_injector__$b.styles || (__vue_create_injector__$b.styles = {});
const isOldIE =
typeof navigator !== 'undefined' &&
/msie [6-9]\\b/.test(navigator.userAgent.toLowerCase());
return function addStyle(id, css) {
if (document.querySelector('style[data-vue-ssr-id~="' + id + '"]')) return // SSR styles are present.
const group = isOldIE ? css.media || 'default' : id;
const style = styles[group] || (styles[group] = { ids: [], parts: [], element: undefined });
if (!style.ids.includes(id)) {
let code = css.source;
let index = style.ids.length;
style.ids.push(id);
if ( css.map) {
// https://developer.chrome.com/devtools/docs/javascript-debugging
// this makes source maps inside style tags work properly in Chrome
code += '\n/*# sourceURL=' + css.map.sources[0] + ' */';
// http://stackoverflow.com/a/26603875
code +=
'\n/*# sourceMappingURL=data:application/json;base64,' +
btoa(unescape(encodeURIComponent(JSON.stringify(css.map)))) +
' */';
}
if (isOldIE) {
style.element = style.element || document.querySelector('style[data-group=' + group + ']');
}
if (!style.element) {
const el = style.element = document.createElement('style');
el.type = 'text/css';
if (css.media) el.setAttribute('media', css.media);
if (isOldIE) {
el.setAttribute('data-group', group);
el.setAttribute('data-next-index', '0');
}
head.appendChild(el);
}
if (isOldIE) {
index = parseInt(style.element.getAttribute('data-next-index'));
style.element.setAttribute('data-next-index', index + 1);
}
if (style.element.styleSheet) {
style.parts.push(code);
style.element.styleSheet.cssText = style.parts
.filter(Boolean)
.join('\n');
} else {
const textNode = document.createTextNode(code);
const nodes = style.element.childNodes;
if (nodes[index]) style.element.removeChild(nodes[index]);
if (nodes.length) style.element.insertBefore(textNode, nodes[index]);
else style.element.appendChild(textNode);
}
}
}
}
/* style inject SSR */
var CoverContainer = __vue_normalize__$i(
{ render: __vue_render__$i, staticRenderFns: __vue_staticRenderFns__$i },
__vue_inject_styles__$i,
__vue_script__$g,
__vue_scope_id__$i,
__vue_is_functional_template__$i,
__vue_module_identifier__$b,
__vue_create_injector__$b);
//
var script$h = {
components: {
PreviewControls,
CoverContainer
},
data() {
return {
tracks: [],
albums: [],
artists: [],
playlists: [],
spotifyPlaylists: [],
activeTab: 'playlist',
tabs: ['playlist', 'album', 'artist', 'track']
}
},
computed: {
activeTabEmpty() {
let toCheck = this.getActiveRelease();
return toCheck.length === 0
}
},
async created() {
const favoritesData = await getFavoritesData();
// TODO Change with isLoggedIn vuex getter
if (Object.entries(favoritesData).length === 0) return
this.setFavorites(favoritesData);
},
mounted() {
socket.on('updated_userFavorites', this.updated_userFavorites);
socket.on('updated_userSpotifyPlaylists', this.updated_userSpotifyPlaylists);
socket.on('updated_userPlaylists', this.updated_userPlaylists);
socket.on('updated_userAlbums', this.updated_userAlbums);
socket.on('updated_userArtist', this.updated_userArtist);
socket.on('updated_userTracks', this.updated_userTracks);
this.$on('hook:destroyed', () => {
socket.off('updated_userFavorites');
socket.off('updated_userSpotifyPlaylists');
socket.off('updated_userPlaylists');
socket.off('updated_userAlbums');
socket.off('updated_userArtist');
socket.off('updated_userTracks');
});
},
methods: {
playPausePreview(e) {
EventBus.$emit('trackPreview:playPausePreview', e);
},
convertDuration,
downloadAllOfType() {
try {
let toDownload = this.getActiveRelease();
if (this.activeTab === 'track') {
let lovedTracks = this.getLovedTracksPlaylist();
sendAddToQueue(lovedTracks.link);
} else {
sendAddToQueue(aggregateDownloadLinks(toDownload));
}
} catch (error) {
console.error(error.message);
}
},
addToQueue(e) {
sendAddToQueue(e.currentTarget.dataset.link);
},
updated_userSpotifyPlaylists(data) {
this.spotifyPlaylists = data;
},
updated_userPlaylists(data) {
this.playlists = data;
},
updated_userAlbums(data) {
this.albums = data;
},
updated_userArtist(data) {
this.artists = data;
},
updated_userTracks(data) {
this.tracks = data;
},
reloadTabs() {
this.$refs.reloadButton.classList.add('spin');
socket.emit('update_userFavorites');
if (localStorage.getItem('spotifyUser')) {
socket.emit('update_userSpotifyPlaylists', localStorage.getItem('spotifyUser'));
}
},
updated_userFavorites(data) {
this.setFavorites(data);
// Removing animation class only when the animation has completed an iteration
// Prevents animation ugly stutter
this.$refs.reloadButton.addEventListener(
'animationiteration',
() => {
this.$refs.reloadButton.classList.remove('spin');
toast(this.$t('toasts.refreshFavs'), 'done', true);
},
{ once: true }
);
},
setFavorites(data) {
const { tracks, albums, artists, playlists } = data;
this.tracks = tracks;
this.albums = albums;
this.artists = artists;
this.playlists = playlists;
},
getActiveRelease(tab = this.activeTab) {
let toDownload;
switch (tab) {
case 'playlist':
toDownload = this.playlists;
break
case 'album':
toDownload = this.albums;
break
case 'artist':
toDownload = this.artists;
break
case 'track':
toDownload = this.tracks;
break
}
return toDownload
},
getTabLenght(tab = this.activeTab) {
let total = this[`${tab}s`].length;
// TODO: Add Spotify playlists to downlaod queue as well
//if (tab === "playlist") total += this.spotifyPlaylists.length
return total
},
getLovedTracksPlaylist() {
let lovedTracks = this.playlists.filter(playlist => {
return playlist.is_loved_track
});
if (lovedTracks.length !== 0) {
return lovedTracks[0]
} else {
throw new Error('No loved tracks playlist!')
}
}
}
};
/* script */
const __vue_script__$h = script$h;
/* template */
var __vue_render__$j = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('h1',{staticClass:"mb-8 text-5xl"},[_vm._v("\n\t\t"+_vm._s(_vm.$t('favorites.title'))+"\n\t\t"),_c('div',{ref:"reloadButton",staticClass:"inline-block clickable reload-button",attrs:{"role":"button","aria-label":"reload"},on:{"click":_vm.reloadTabs}},[_c('i',{staticClass:"material-icons"},[_vm._v("sync")])])]),_vm._v(" "),_c('ul',{staticClass:"section-tabs"},_vm._l((_vm.tabs),function(tab){return _c('li',{key:tab,staticClass:"section-tabs__tab favorites_tablinks",class:{ active: _vm.activeTab === tab },on:{"click":function($event){_vm.activeTab = tab;}}},[_vm._v("\n\t\t\t"+_vm._s(_vm.$tc(("globals.listTabs." + tab), 2))+"\n\t\t")])}),0),_vm._v(" "),(!_vm.activeTabEmpty)?_c('button',{staticClass:"btn btn-primary",staticStyle:{"margin-bottom":"2rem"},on:{"click":_vm.downloadAllOfType}},[_vm._v("\n\t\t"+_vm._s(_vm.$t('globals.download', { thing: _vm.$tc(("globals.listTabs." + _vm.activeTab + "N"), _vm.getTabLenght()) }))+"\n\t")]):_vm._e(),_vm._v(" "),_c('div',{staticClass:"favorites_tabcontent",class:{ 'favorites_tabcontent--active': _vm.activeTab === 'playlist' }},[(_vm.playlists.length == 0)?_c('div',[_c('h1',[_vm._v(_vm._s(_vm.$t('favorites.noPlaylists')))])]):_vm._e(),_vm._v(" "),(_vm.playlists.length > 0 || _vm.spotifyPlaylists > 0)?_c('div',{staticClass:"release-grid"},[_vm._l((_vm.playlists),function(release){return _c('div',{key:release.id,staticClass:"release"},[_c('router-link',{staticClass:"cursor-pointer",attrs:{"tag":"div","to":{ name: 'Playlist', params: { id: release.id } }}},[_c('CoverContainer',{attrs:{"is-rounded":"","cover":release.picture_medium,"link":release.link},on:{"click":function($event){$event.stopPropagation();return _vm.addToQueue($event)}}}),_vm._v(" "),_c('p',{staticClass:"primary-text"},[_vm._v(_vm._s(release.title))])],1),_vm._v(" "),_c('p',{staticClass:"secondary-text"},[_vm._v("\n\t\t\t\t\t"+_vm._s(((_vm.$t('globals.by', { artist: release.creator.name })) + " - " + (_vm.$tc(
'globals.listTabs.trackN',
release.nb_tracks
))))+"\n\t\t\t\t")])],1)}),_vm._v(" "),_vm._l((_vm.spotifyPlaylists),function(release){return _c('div',{key:release.id,staticClass:"release"},[_c('router-link',{staticClass:"cursor-pointer",attrs:{"tag":"div","to":{ name: 'Spotify Playlist', params: { id: release.id } }}},[_c('CoverContainer',{attrs:{"is-rounded":"","cover":release.picture_medium,"link":release.link},on:{"click":function($event){$event.stopPropagation();return _vm.addToQueue($event)}}}),_vm._v(" "),_c('p',{staticClass:"primary-text"},[_vm._v(_vm._s(release.title))])],1),_vm._v(" "),_c('p',{staticClass:"secondary-text"},[_vm._v("\n\t\t\t\t\t"+_vm._s(((_vm.$t('globals.by', { artist: release.creator.name })) + " - " + (_vm.$tc(
'globals.listTabs.trackN',
release.nb_tracks
))))+"\n\t\t\t\t")])],1)})],2):_vm._e()]),_vm._v(" "),_c('div',{staticClass:"favorites_tabcontent",class:{ 'favorites_tabcontent--active': _vm.activeTab === 'album' }},[(_vm.albums.length == 0)?_c('div',[_c('h1',[_vm._v(_vm._s(_vm.$t('favorites.noAlbums')))])]):_vm._e(),_vm._v(" "),(_vm.albums.length > 0)?_c('div',{staticClass:"release-grid"},_vm._l((_vm.albums),function(release){return _c('router-link',{key:release.id,staticClass:"release clickable",attrs:{"tag":"div","to":{ name: 'Album', params: { id: release.id } }}},[_c('CoverContainer',{attrs:{"is-rounded":"","cover":release.cover_medium,"link":release.link},on:{"click":function($event){$event.stopPropagation();return _vm.addToQueue($event)}}}),_vm._v(" "),_c('p',{staticClass:"primary-text"},[_vm._v(_vm._s(release.title))]),_vm._v(" "),_c('p',{staticClass:"secondary-text"},[_vm._v(_vm._s(("" + (_vm.$t('globals.by', { artist: release.artist.name })))))])],1)}),1):_vm._e()]),_vm._v(" "),_c('div',{staticClass:"favorites_tabcontent",class:{ 'favorites_tabcontent--active': _vm.activeTab === 'artist' }},[(_vm.artists.length == 0)?_c('div',[_c('h1',[_vm._v(_vm._s(_vm.$t('favorites.noArtists')))])]):_vm._e(),_vm._v(" "),(_vm.artists.length > 0)?_c('div',{staticClass:"release-grid"},_vm._l((_vm.artists),function(release){return _c('router-link',{key:release.id,staticClass:"release clickable",attrs:{"tag":"div","to":{ name: 'Artist', params: { id: release.id } }}},[_c('CoverContainer',{attrs:{"is-circle":"","cover":release.picture_medium,"link":release.link},on:{"click":function($event){$event.stopPropagation();return _vm.addToQueue($event)}}}),_vm._v(" "),_c('p',{staticClass:"primary-text"},[_vm._v(_vm._s(release.name))])],1)}),1):_vm._e()]),_vm._v(" "),_c('div',{staticClass:"favorites_tabcontent",class:{ 'favorites_tabcontent--active': _vm.activeTab === 'track' }},[(_vm.tracks.length == 0)?_c('div',[_c('h1',[_vm._v(_vm._s(_vm.$t('favorites.noTracks')))])]):_vm._e(),_vm._v(" "),(_vm.tracks.length > 0)?_c('table',{staticClass:"table"},_vm._l((_vm.tracks),function(track){return _c('tr',{staticClass:"track_row"},[_c('td',{staticClass:"p-3 text-center cursor-default",class:{ first: track.position === 1 }},[_vm._v("\n\t\t\t\t\t"+_vm._s(track.position)+"\n\t\t\t\t")]),_vm._v(" "),_c('td',[_c('span',{staticClass:"relative inline-block rounded cursor-pointer",attrs:{"data-preview":track.preview},on:{"click":_vm.playPausePreview}},[(track.preview)?_c('PreviewControls'):_vm._e(),_vm._v(" "),_c('img',{staticClass:"rounded coverart",attrs:{"src":track.album.cover_small}})],1)]),_vm._v(" "),_c('td',{staticClass:"table__cell--large"},[_vm._v("\n\t\t\t\t\t"+_vm._s(track.title +
(track.title_version && track.title.indexOf(track.title_version) == -1 ? ' ' + track.title_version : ''))+"\n\t\t\t\t")]),_vm._v(" "),_c('router-link',{staticClass:"table__cell table__cell--medium table__cell--center clickable",attrs:{"tag":"td","to":{ name: 'Artist', params: { id: track.artist.id } }}},[_vm._v("\n\t\t\t\t\t"+_vm._s(track.artist.name)+"\n\t\t\t\t")]),_vm._v(" "),_c('router-link',{staticClass:"table__cell--medium table__cell--center clickable",attrs:{"tag":"td","to":{ name: 'Album', params: { id: track.album.id } }}},[_vm._v("\n\t\t\t\t\t"+_vm._s(track.album.title)+"\n\t\t\t\t")]),_vm._v(" "),_c('td',{staticClass:"table__cell--small"},[_vm._v("\n\t\t\t\t\t"+_vm._s(_vm.convertDuration(track.duration))+"\n\t\t\t\t")]),_vm._v(" "),_c('td',{staticClass:"cursor-pointer group",attrs:{"data-link":track.link,"role":"button","aria-label":"download"},on:{"click":function($event){$event.stopPropagation();return _vm.addToQueue($event)}}},[_c('div',{staticClass:"table__cell-content table__cell-content--vertical-center"},[_c('i',{staticClass:"transition-colors duration-150 ease-in-out material-icons group-hover:text-primary",attrs:{"title":_vm.$t('globals.download_hint')}},[_vm._v("\n\t\t\t\t\t\t\tget_app\n\t\t\t\t\t\t")])])])],1)}),0):_vm._e()])])};
var __vue_staticRenderFns__$j = [];
/* style */
const __vue_inject_styles__$j = function (inject) {
if (!inject) return
inject("data-v-26d194a8_0", { source: ".favorites_tabcontent[data-v-26d194a8]{display:none}.favorites_tabcontent--active[data-v-26d194a8]{display:block}.reload-button.spin i[data-v-26d194a8]{animation:spin .5s infinite ease-out reverse}", map: undefined, media: undefined });
};
/* scoped */
const __vue_scope_id__$j = "data-v-26d194a8";
/* module identifier */
const __vue_module_identifier__$c = undefined;
/* functional template */
const __vue_is_functional_template__$j = false;
/* component normalizer */
function __vue_normalize__$j(
template, style, script,
scope, functional, moduleIdentifier,
createInjector, createInjectorSSR
) {
const component = (typeof script === 'function' ? script.options : script) || {};
// For security concerns, we use only base name in production mode.
component.__file = "Favorites.vue";
if (!component.render) {
component.render = template.render;
component.staticRenderFns = template.staticRenderFns;
component._compiled = true;
if (functional) component.functional = true;
}
component._scopeId = scope;
{
let hook;
if (style) {
hook = function(context) {
style.call(this, createInjector(context));
};
}
if (hook !== undefined) {
if (component.functional) {
// register for functional component in vue file
const originalRender = component.render;
component.render = function renderWithStyleInjection(h, context) {
hook.call(context);
return originalRender(h, context)
};
} else {
// inject component registration as beforeCreate hook
const existing = component.beforeCreate;
component.beforeCreate = existing ? [].concat(existing, hook) : [hook];
}
}
}
return component
}
/* style inject */
function __vue_create_injector__$c() {
const head = document.head || document.getElementsByTagName('head')[0];
const styles = __vue_create_injector__$c.styles || (__vue_create_injector__$c.styles = {});
const isOldIE =
typeof navigator !== 'undefined' &&
/msie [6-9]\\b/.test(navigator.userAgent.toLowerCase());
return function addStyle(id, css) {
if (document.querySelector('style[data-vue-ssr-id~="' + id + '"]')) return // SSR styles are present.
const group = isOldIE ? css.media || 'default' : id;
const style = styles[group] || (styles[group] = { ids: [], parts: [], element: undefined });
if (!style.ids.includes(id)) {
let code = css.source;
let index = style.ids.length;
style.ids.push(id);
if ( css.map) {
// https://developer.chrome.com/devtools/docs/javascript-debugging
// this makes source maps inside style tags work properly in Chrome
code += '\n/*# sourceURL=' + css.map.sources[0] + ' */';
// http://stackoverflow.com/a/26603875
code +=
'\n/*# sourceMappingURL=data:application/json;base64,' +
btoa(unescape(encodeURIComponent(JSON.stringify(css.map)))) +
' */';
}
if (isOldIE) {
style.element = style.element || document.querySelector('style[data-group=' + group + ']');
}
if (!style.element) {
const el = style.element = document.createElement('style');
el.type = 'text/css';
if (css.media) el.setAttribute('media', css.media);
if (isOldIE) {
el.setAttribute('data-group', group);
el.setAttribute('data-next-index', '0');
}
head.appendChild(el);
}
if (isOldIE) {
index = parseInt(style.element.getAttribute('data-next-index'));
style.element.setAttribute('data-next-index', index + 1);
}
if (style.element.styleSheet) {
style.parts.push(code);
style.element.styleSheet.cssText = style.parts
.filter(Boolean)
.join('\n');
} else {
const textNode = document.createTextNode(code);
const nodes = style.element.childNodes;
if (nodes[index]) style.element.removeChild(nodes[index]);
if (nodes.length) style.element.insertBefore(textNode, nodes[index]);
else style.element.appendChild(textNode);
}
}
}
}
/* style inject SSR */
var Favorites = __vue_normalize__$j(
{ render: __vue_render__$j, staticRenderFns: __vue_staticRenderFns__$j },
__vue_inject_styles__$j,
__vue_script__$h,
__vue_scope_id__$j,
__vue_is_functional_template__$j,
__vue_module_identifier__$c,
__vue_create_injector__$c);
let homeData = {};
let cached$3 = false;
function getHomeData() {
if (cached$3) {
return homeData
} else {
socket.emit('get_home_data');
return new Promise((resolve, reject) => {
socket.on('init_home', data => {
homeData = data;
cached$3 = true;
socket.off('init_home');
resolve(data);
});
})
}
}
//
var script$i = {
components: {
CoverContainer
},
data() {
return {
playlists: [],
albums: []
}
},
async created() {
const homeData = await getHomeData();
this.initHome(homeData);
},
computed: {
...mapGetters(['isLoggedIn'])
},
methods: {
addToQueue(e) {
sendAddToQueue(e.currentTarget.dataset.link);
},
initHome(data) {
const {
playlists: { data: playlistData },
albums: { data: albumData }
} = data;
this.playlists = playlistData;
this.albums = albumData;
}
}
};
/* script */
const __vue_script__$i = script$i;
/* template */
var __vue_render__$k = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{"id":"home_tab"}},[_c('h1',{staticClass:"mb-8 text-5xl"},[_vm._v(_vm._s(_vm.$t('globals.welcome')))]),_vm._v(" "),(!_vm.isLoggedIn)?_c('section',{ref:"notLogged",staticClass:"py-6 border-0 border-t border-solid border-grayscale-500"},[_c('p',{staticClass:"mb-4",attrs:{"id":"home_not_logged_text"}},[_vm._v(_vm._s(_vm.$t('home.needTologin')))]),_vm._v(" "),_c('router-link',{staticClass:"btn btn-primary",attrs:{"tag":"button","name":"button","to":{ name: 'Settings' }}},[_vm._v("\n\t\t\t"+_vm._s(_vm.$t('home.openSettings'))+"\n\t\t")])],1):_vm._e(),_vm._v(" "),(_vm.playlists.length)?_c('section',{staticClass:"py-6 border-0 border-t border-solid border-grayscale-500"},[_c('h2',{staticClass:"mb-6 text-3xl"},[_vm._v(_vm._s(_vm.$t('home.sections.popularPlaylists')))]),_vm._v(" "),_c('div',{staticClass:"release-grid"},_vm._l((_vm.playlists),function(release){return _c('router-link',{key:release.id,staticClass:"release clickable",attrs:{"tag":"div","to":{ name: 'Playlist', params: { id: release.id } },"tabindex":"0"},nativeOn:{"keyup":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,"enter",13,$event.key,"Enter")){ return null; }return _vm.$router.push({ name: 'Playlist', params: { id: release.id } })}}},[_c('CoverContainer',{attrs:{"is-rounded":"","cover":release.picture_medium,"link":release.link},on:{"click":function($event){$event.stopPropagation();return _vm.addToQueue($event)}}}),_vm._v(" "),_c('p',{staticClass:"primary-text"},[_vm._v(_vm._s(release.title))]),_vm._v(" "),_c('p',{staticClass:"secondary-text"},[_vm._v("\n\t\t\t\t\t"+_vm._s(((_vm.$t('globals.by', { artist: release.user.name })) + " - " + (_vm.$tc(
'globals.listTabs.trackN',
release.nb_tracks
))))+"\n\t\t\t\t")])],1)}),1)]):_vm._e(),_vm._v(" "),(_vm.albums.length)?_c('section',{staticClass:"py-6 border-0 border-t border-solid border-grayscale-500"},[_c('h2',{staticClass:"mb-6 text-3xl"},[_vm._v(_vm._s(_vm.$t('home.sections.popularAlbums')))]),_vm._v(" "),_c('div',{staticClass:"release-grid"},_vm._l((_vm.albums),function(release){return _c('router-link',{key:release.id,staticClass:"release clickable",attrs:{"tag":"div","to":{ name: 'Album', params: { id: release.id } },"data-id":release.id,"tabindex":"0"},nativeOn:{"keyup":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,"enter",13,$event.key,"Enter")){ return null; }return _vm.$router.push({ name: 'Album', params: { id: release.id } })}}},[_c('CoverContainer',{attrs:{"is-rounded":"","cover":release.cover_medium,"link":release.link},on:{"click":function($event){$event.stopPropagation();return _vm.addToQueue($event)}}}),_vm._v(" "),_c('p',{staticClass:"primary-text"},[_vm._v(_vm._s(release.title))]),_vm._v(" "),_c('p',{staticClass:"secondary-text"},[_vm._v(_vm._s(("" + (_vm.$t('globals.by', { artist: release.artist.name })))))])],1)}),1)]):_vm._e()])};
var __vue_staticRenderFns__$k = [];
/* style */
const __vue_inject_styles__$k = undefined;
/* scoped */
const __vue_scope_id__$k = undefined;
/* functional template */
const __vue_is_functional_template__$k = false;
/* component normalizer */
function __vue_normalize__$k(
template, style, script,
scope, functional, moduleIdentifier,
createInjector, createInjectorSSR
) {
const component = (typeof script === 'function' ? script.options : script) || {};
// For security concerns, we use only base name in production mode.
component.__file = "Home.vue";
if (!component.render) {
component.render = template.render;
component.staticRenderFns = template.staticRenderFns;
component._compiled = true;
if (functional) component.functional = true;
}
component._scopeId = scope;
return component
}
/* style inject */
/* style inject SSR */
var Home = __vue_normalize__$k(
{ render: __vue_render__$k, staticRenderFns: __vue_staticRenderFns__$k },
__vue_inject_styles__$k,
__vue_script__$i,
__vue_scope_id__$k,
__vue_is_functional_template__$k);
const COUNTRIES = {
AF: 'Afghanistan',
AX: '\u00c5land Islands',
AL: 'Albania',
DZ: 'Algeria',
AS: 'American Samoa',
AD: 'Andorra',
AO: 'Angola',
AI: 'Anguilla',
AQ: 'Antarctica',
AG: 'Antigua and Barbuda',
AR: 'Argentina',
AM: 'Armenia',
AW: 'Aruba',
AU: 'Australia',
AT: 'Austria',
AZ: 'Azerbaijan',
BS: 'Bahamas',
BH: 'Bahrain',
BD: 'Bangladesh',
BB: 'Barbados',
BY: 'Belarus',
BE: 'Belgium',
BZ: 'Belize',
BJ: 'Benin',
BM: 'Bermuda',
BT: 'Bhutan',
BO: 'Bolivia, Plurinational State of',
BQ: 'Bonaire, Sint Eustatius and Saba',
BA: 'Bosnia and Herzegovina',
BW: 'Botswana',
BV: 'Bouvet Island',
BR: 'Brazil',
IO: 'British Indian Ocean Territory',
BN: 'Brunei Darussalam',
BG: 'Bulgaria',
BF: 'Burkina Faso',
BI: 'Burundi',
KH: 'Cambodia',
CM: 'Cameroon',
CA: 'Canada',
CV: 'Cape Verde',
KY: 'Cayman Islands',
CF: 'Central African Republic',
TD: 'Chad',
CL: 'Chile',
CN: 'China',
CX: 'Christmas Island',
CC: 'Cocos (Keeling) Islands',
CO: 'Colombia',
KM: 'Comoros',
CG: 'Congo',
CD: 'Congo, the Democratic Republic of the',
CK: 'Cook Islands',
CR: 'Costa Rica',
CI: "C\u00f4te d'Ivoire",
HR: 'Croatia',
CU: 'Cuba',
CW: 'Cura\u00e7ao',
CY: 'Cyprus',
CZ: 'Czech Republic',
DK: 'Denmark',
DJ: 'Djibouti',
DM: 'Dominica',
DO: 'Dominican Republic',
EC: 'Ecuador',
EG: 'Egypt',
SV: 'El Salvador',
GQ: 'Equatorial Guinea',
ER: 'Eritrea',
EE: 'Estonia',
ET: 'Ethiopia',
FK: 'Falkland Islands (Malvinas)',
FO: 'Faroe Islands',
FJ: 'Fiji',
FI: 'Finland',
FR: 'France',
GF: 'French Guiana',
PF: 'French Polynesia',
TF: 'French Southern Territories',
GA: 'Gabon',
GM: 'Gambia',
GE: 'Georgia',
DE: 'Germany',
GH: 'Ghana',
GI: 'Gibraltar',
GR: 'Greece',
GL: 'Greenland',
GD: 'Grenada',
GP: 'Guadeloupe',
GU: 'Guam',
GT: 'Guatemala',
GG: 'Guernsey',
GN: 'Guinea',
GW: 'Guinea-Bissau',
GY: 'Guyana',
HT: 'Haiti',
HM: 'Heard Island and McDonald Islands',
VA: 'Holy See (Vatican City State)',
HN: 'Honduras',
HK: 'Hong Kong',
HU: 'Hungary',
IS: 'Iceland',
IN: 'India',
ID: 'Indonesia',
IR: 'Iran, Islamic Republic of',
IQ: 'Iraq',
IE: 'Ireland',
IM: 'Isle of Man',
IL: 'Israel',
IT: 'Italy',
JM: 'Jamaica',
JP: 'Japan',
JE: 'Jersey',
JO: 'Jordan',
KZ: 'Kazakhstan',
KE: 'Kenya',
KI: 'Kiribati',
KP: "Korea, Democratic People's Republic of",
KR: 'Korea, Republic of',
KW: 'Kuwait',
KG: 'Kyrgyzstan',
LA: "Lao People's Democratic Republic",
LV: 'Latvia',
LB: 'Lebanon',
LS: 'Lesotho',
LR: 'Liberia',
LY: 'Libya',
LI: 'Liechtenstein',
LT: 'Lithuania',
LU: 'Luxembourg',
MO: 'Macao',
MK: 'Macedonia, the Former Yugoslav Republic of',
MG: 'Madagascar',
MW: 'Malawi',
MY: 'Malaysia',
MV: 'Maldives',
ML: 'Mali',
MT: 'Malta',
MH: 'Marshall Islands',
MQ: 'Martinique',
MR: 'Mauritania',
MU: 'Mauritius',
YT: 'Mayotte',
MX: 'Mexico',
FM: 'Micronesia, Federated States of',
MD: 'Moldova, Republic of',
MC: 'Monaco',
MN: 'Mongolia',
ME: 'Montenegro',
MS: 'Montserrat',
MA: 'Morocco',
MZ: 'Mozambique',
MM: 'Myanmar',
NA: 'Namibia',
NR: 'Nauru',
NP: 'Nepal',
NL: 'Netherlands',
NC: 'New Caledonia',
NZ: 'New Zealand',
NI: 'Nicaragua',
NE: 'Niger',
NG: 'Nigeria',
NU: 'Niue',
NF: 'Norfolk Island',
MP: 'Northern Mariana Islands',
NO: 'Norway',
OM: 'Oman',
PK: 'Pakistan',
PW: 'Palau',
PS: 'Palestine, State of',
PA: 'Panama',
PG: 'Papua New Guinea',
PY: 'Paraguay',
PE: 'Peru',
PH: 'Philippines',
PN: 'Pitcairn',
PL: 'Poland',
PT: 'Portugal',
PR: 'Puerto Rico',
QA: 'Qatar',
RE: 'R\u00e9union',
RO: 'Romania',
RU: 'Russian Federation',
RW: 'Rwanda',
BL: 'Saint Barth\u00e9lemy',
SH: 'Saint Helena, Ascension and Tristan da Cunha',
KN: 'Saint Kitts and Nevis',
LC: 'Saint Lucia',
MF: 'Saint Martin (French part)',
PM: 'Saint Pierre and Miquelon',
VC: 'Saint Vincent and the Grenadines',
WS: 'Samoa',
SM: 'San Marino',
ST: 'Sao Tome and Principe',
SA: 'Saudi Arabia',
SN: 'Senegal',
RS: 'Serbia',
SC: 'Seychelles',
SL: 'Sierra Leone',
SG: 'Singapore',
SX: 'Sint Maarten (Dutch part)',
SK: 'Slovakia',
SI: 'Slovenia',
SB: 'Solomon Islands',
SO: 'Somalia',
ZA: 'South Africa',
GS: 'South Georgia and the South Sandwich Islands',
SS: 'South Sudan',
ES: 'Spain',
LK: 'Sri Lanka',
SD: 'Sudan',
SR: 'Suriname',
SJ: 'Svalbard and Jan Mayen',
SZ: 'Swaziland',
SE: 'Sweden',
CH: 'Switzerland',
SY: 'Syrian Arab Republic',
TW: 'Taiwan, Province of China',
TJ: 'Tajikistan',
TZ: 'Tanzania, United Republic of',
TH: 'Thailand',
TL: 'Timor-Leste',
TG: 'Togo',
TK: 'Tokelau',
TO: 'Tonga',
TT: 'Trinidad and Tobago',
TN: 'Tunisia',
TR: 'Turkey',
TM: 'Turkmenistan',
TC: 'Turks and Caicos Islands',
TV: 'Tuvalu',
UG: 'Uganda',
UA: 'Ukraine',
AE: 'United Arab Emirates',
GB: 'United Kingdom',
US: 'United States',
UM: 'United States Minor Outlying Islands',
UY: 'Uruguay',
UZ: 'Uzbekistan',
VU: 'Vanuatu',
VE: 'Venezuela, Bolivarian Republic of',
VN: 'Viet Nam',
VG: 'Virgin Islands, British',
VI: 'Virgin Islands, U.S.',
WF: 'Wallis and Futuna',
EH: 'Western Sahara',
YE: 'Yemen',
ZM: 'Zambia',
ZW: 'Zimbabwe'
};
//
var script$j = {
data() {
return {
link: '',
title: '',
subtitle: '',
image: '',
data: {},
type: '',
id: '0',
countries: []
}
},
methods: {
convertDuration,
reset() {
this.title = 'Loading...';
this.subtitle = '';
this.image = '';
this.data = {};
this.type = '';
this.link = '';
this.countries = [];
},
showTrack(data) {
this.reset();
const {
title,
title_version,
album: { cover_xl },
link,
available_countries,
id
} = data;
this.title = title + (title_version && title.indexOf(title_version) == -1 ? ' ' + title_version : '');
this.image = cover_xl;
this.type = 'track';
this.link = link;
this.id = id;
available_countries.forEach(cc => {
let temp = [];
let chars = [...cc].map(c => c.charCodeAt() + 127397);
temp.push(String.fromCodePoint(...chars));
temp.push(COUNTRIES[cc]);
this.countries.push(temp);
});
this.data = data;
},
showAlbum(data) {
this.reset();
const { title, cover_xl, link, id } = data;
this.title = title;
this.image = cover_xl;
this.type = 'album';
this.link = link;
this.data = data;
this.id = id;
},
notSupported() {
this.link = 'error';
},
addToQueue(e) {
sendAddToQueue(e.currentTarget.dataset.link);
}
},
mounted() {
EventBus.$on('linkAnalyzerTab:reset', this.reset);
socket.on('analyze_track', this.showTrack);
socket.on('analyze_album', this.showAlbum);
socket.on('analyze_notSupported', this.notSupported);
}
};
/* script */
const __vue_script__$j = script$j;
/* template */
var __vue_render__$l = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:"image-header",attrs:{"id":"analyzer_tab"}},[_c('h1',{staticClass:"mb-8 text-5xl capitalize"},[_vm._v(_vm._s(_vm.$t('sidebar.linkAnalyzer')))]),_vm._v(" "),(_vm.link === '')?_c('div',[_c('p',[_vm._v("\n\t\t\t"+_vm._s(_vm.$t('linkAnalyzer.info'))+"\n\t\t")]),_vm._v(" "),_c('p',[_vm._v("\n\t\t\t"+_vm._s(_vm.$t('linkAnalyzer.useful'))+"\n\t\t")])]):(_vm.link === 'error')?_c('div',[_c('h2',[_vm._v(_vm._s(_vm.$t('linkAnalyzer.linkNotSupported')))]),_vm._v(" "),_c('p',[_vm._v(_vm._s(_vm.$t('linkAnalyzer.linkNotSupportedYet')))])]):_c('div',[_c('header',{staticClass:"flex items-center",style:({
'background-image':
'linear-gradient(to bottom, transparent 0%, var(--main-background) 100%), url(\'' + _vm.image + '\')'
})},[_c('div',[_c('h1',{staticClass:"m-0"},[_vm._v(_vm._s(_vm.title))]),_vm._v(" "),(_vm.type === 'track')?_c('h2',{staticClass:"m-0 mb-3 text-lg"},[_c('i18n',{attrs:{"path":"globals.by","tag":"span"}},[_c('router-link',{staticClass:"clickable",attrs:{"tag":"span","place":"artist","to":{ name: 'Artist', params: { id: _vm.data.artist.id } }}},[_vm._v("\n\t\t\t\t\t\t\t"+_vm._s(_vm.data.artist.name)+"\n\t\t\t\t\t\t")])],1),_vm._v("\n\t\t\t\t\t•\n\t\t\t\t\t"),_c('i18n',{attrs:{"path":"globals.in","tag":"span"}},[_c('router-link',{staticClass:"clickable",attrs:{"tag":"span","place":"album","to":{ name: 'Album', params: { id: _vm.data.album.id } }}},[_vm._v("\n\t\t\t\t\t\t\t"+_vm._s(_vm.data.album.title)+"\n\t\t\t\t\t\t")])],1)],1):(_vm.type === 'album')?_c('h2',{staticClass:"m-0 mb-3 text-lg"},[_c('i18n',{attrs:{"path":"globals.by","tag":"span"}},[_c('router-link',{staticClass:"clickable",attrs:{"tag":"span","place":"artist","to":{ name: 'Artist', params: { id: _vm.data.artist.id } }}},[_vm._v("\n\t\t\t\t\t\t\t"+_vm._s(_vm.data.artist.name)+"\n\t\t\t\t\t\t")])],1),_vm._v("\n\t\t\t\t\t"+_vm._s((" • " + (_vm.$tc('globals.listTabs.trackN', _vm.data.nb_tracks))))+"\n\t\t\t\t")],1):_vm._e()]),_vm._v(" "),_c('div',{staticClass:"grid w-16 h-16 ml-auto rounded-full cursor-pointer bg-primary text-grayscale-870 place-items-center",attrs:{"role":"button","aria-label":"download","data-link":_vm.link},on:{"contextmenu":function($event){$event.preventDefault();return _vm.openQualityModal($event)},"click":function($event){$event.stopPropagation();return _vm.addToQueue($event)}}},[_c('i',{staticClass:"text-4xl material-icons",attrs:{"title":_vm.$t('globals.download_hint')}},[_vm._v("get_app")])])]),_vm._v(" "),_c('table',{staticClass:"table"},[(_vm.data.id)?_c('tr',[_c('td',[_vm._v(_vm._s(_vm.$t('linkAnalyzer.table.id')))]),_vm._v(" "),_c('td',[_vm._v(_vm._s(_vm.data.id))])]):_vm._e(),_vm._v(" "),(_vm.data.isrc)?_c('tr',[_c('td',[_vm._v(_vm._s(_vm.$t('linkAnalyzer.table.isrc')))]),_vm._v(" "),_c('td',[_vm._v(_vm._s(_vm.data.isrc))])]):_vm._e(),_vm._v(" "),(_vm.data.upc)?_c('tr',[_c('td',[_vm._v(_vm._s(_vm.$t('linkAnalyzer.table.upc')))]),_vm._v(" "),_c('td',[_vm._v(_vm._s(_vm.data.upc))])]):_vm._e(),_vm._v(" "),(_vm.data.duration)?_c('tr',[_c('td',[_vm._v(_vm._s(_vm.$t('linkAnalyzer.table.duration')))]),_vm._v(" "),_c('td',[_vm._v(_vm._s(_vm.convertDuration(_vm.data.duration)))])]):_vm._e(),_vm._v(" "),(_vm.data.disk_number)?_c('tr',[_c('td',[_vm._v(_vm._s(_vm.$t('linkAnalyzer.table.diskNumber')))]),_vm._v(" "),_c('td',[_vm._v(_vm._s(_vm.data.disk_number))])]):_vm._e(),_vm._v(" "),(_vm.data.track_position)?_c('tr',[_c('td',[_vm._v(_vm._s(_vm.$t('linkAnalyzer.table.trackNumber')))]),_vm._v(" "),_c('td',[_vm._v(_vm._s(_vm.data.track_position))])]):_vm._e(),_vm._v(" "),(_vm.data.release_date)?_c('tr',[_c('td',[_vm._v(_vm._s(_vm.$t('linkAnalyzer.table.releaseDate')))]),_vm._v(" "),_c('td',[_vm._v(_vm._s(_vm.data.release_date))])]):_vm._e(),_vm._v(" "),(_vm.data.bpm)?_c('tr',[_c('td',[_vm._v(_vm._s(_vm.$t('linkAnalyzer.table.bpm')))]),_vm._v(" "),_c('td',[_vm._v(_vm._s(_vm.data.bpm))])]):_vm._e(),_vm._v(" "),(_vm.data.label)?_c('tr',[_c('td',[_vm._v(_vm._s(_vm.$t('linkAnalyzer.table.label')))]),_vm._v(" "),_c('td',[_vm._v(_vm._s(_vm.data.label))])]):_vm._e(),_vm._v(" "),(_vm.data.record_type)?_c('tr',[_c('td',[_vm._v(_vm._s(_vm.$t('linkAnalyzer.table.recordType')))]),_vm._v(" "),_c('td',[_vm._v(_vm._s(_vm.$tc(("globals.listTabs." + (_vm.data.record_type)), 1)))])]):_vm._e(),_vm._v(" "),(_vm.data.genres && _vm.data.genres.data.length)?_c('tr',[_c('td',[_vm._v(_vm._s(_vm.$t('linkAnalyzer.table.genres')))]),_vm._v(" "),_c('td',[_vm._v(_vm._s(_vm.data.genres.data.map(function (x) { return x.name; }).join('; ')))])]):_vm._e()]),_vm._v(" "),(_vm.type == 'album')?_c('div',[_c('router-link',{staticClass:"btn btn-primary",attrs:{"tag":"button","name":"button","to":{ name: 'Album', params: { id: _vm.id } }}},[_vm._v("\n\t\t\t\t"+_vm._s(_vm.$t('linkAnalyzer.table.tracklist'))+"\n\t\t\t")])],1):_vm._e(),_vm._v(" "),(_vm.countries.length)?_c('div',_vm._l((_vm.countries),function(country){return _c('p',[_vm._v(_vm._s(country[0])+" - "+_vm._s(country[1]))])}),0):_vm._e()])])};
var __vue_staticRenderFns__$l = [];
/* style */
const __vue_inject_styles__$l = undefined;
/* scoped */
const __vue_scope_id__$l = undefined;
/* functional template */
const __vue_is_functional_template__$l = false;
/* component normalizer */
function __vue_normalize__$l(
template, style, script,
scope, functional, moduleIdentifier,
createInjector, createInjectorSSR
) {
const component = (typeof script === 'function' ? script.options : script) || {};
// For security concerns, we use only base name in production mode.
component.__file = "LinkAnalyzer.vue";
if (!component.render) {
component.render = template.render;
component.staticRenderFns = template.staticRenderFns;
component._compiled = true;
if (functional) component.functional = true;
}
component._scopeId = scope;
return component
}
/* style inject */
/* style inject SSR */
var LinkAnalyzer = __vue_normalize__$l(
{ render: __vue_render__$l, staticRenderFns: __vue_staticRenderFns__$l },
__vue_inject_styles__$l,
__vue_script__$j,
__vue_scope_id__$l,
__vue_is_functional_template__$l);
/**
* @param {string} text
*/
const upperCaseFirstLowerCaseRest = text => text.charAt(0).toUpperCase() + text.slice(1).toLowerCase();
//
var script$k = {
components: {
CoverContainer
},
methods: {
upperCaseFirstLowerCaseRest
},
computed: {
fansNumber() {
let number;
try {
number = this.$n(this.$attrs.info.nb_fan);
} catch (error) {
number = this.$n(this.$attrs.info.nb_fan, { locale: 'en' });
}
return this.$attrs.info.type == 'artist'
? this.$t('search.fans', { n: number })
: this.$t('globals.by', { artist: this.$attrs.info.artist }) +
' - ' +
this.$tc('globals.listTabs.trackN', this.$attrs.info.nb_song)
}
}
};
/* script */
const __vue_script__$k = script$k;
/* template */
var __vue_render__$m = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:"flex flex-col items-center justify-center"},[_c('router-link',{staticClass:"cursor-pointer",attrs:{"tag":"div","to":{ name: _vm.upperCaseFirstLowerCaseRest(_vm.$attrs.info.type), params: { id: _vm.$attrs.info.id } }}},[_c('CoverContainer',{staticClass:"w-40 h-40",attrs:{"is-rounded":_vm.$attrs.info.type !== 'artist',"is-circle":_vm.$attrs.info.type === 'artist',"cover":_vm.$attrs.info.picture,"link":_vm.$attrs.info.link},on:{"click":function($event){$event.stopPropagation();return _vm.$emit('add-to-queue', $event)}}}),_vm._v(" "),_c('p',{staticClass:"mt-4 mb-1 text-xl text-center transition-colors duration-200 ease-in-out hover:text-primary"},[_vm._v("\n\t\t\t"+_vm._s(_vm.$attrs.info.title)+"\n\t\t")])],1),_vm._v(" "),_c('p',{staticClass:"mb-3 text-center secondary-text"},[_vm._v("\n\t\t"+_vm._s(_vm.fansNumber)+"\n\t")]),_vm._v(" "),_c('span',{staticClass:"p-1 px-2 text-xs text-center capitalize bg-primary rounded-xl"},[_vm._v("\n\t\t"+_vm._s(_vm.$tc(("globals.listTabs." + (_vm.$attrs.info.type)), 1))+"\n\t")])],1)};
var __vue_staticRenderFns__$m = [];
/* style */
const __vue_inject_styles__$m = undefined;
/* scoped */
const __vue_scope_id__$m = undefined;
/* functional template */
const __vue_is_functional_template__$m = false;
/* component normalizer */
function __vue_normalize__$m(
template, style, script,
scope, functional, moduleIdentifier,
createInjector, createInjectorSSR
) {
const component = (typeof script === 'function' ? script.options : script) || {};
// For security concerns, we use only base name in production mode.
component.__file = "TopResult.vue";
if (!component.render) {
component.render = template.render;
component.staticRenderFns = template.staticRenderFns;
component._compiled = true;
if (functional) component.functional = true;
}
component._scopeId = scope;
return component
}
/* style inject */
/* style inject SSR */
var TopResult = __vue_normalize__$m(
{ render: __vue_render__$m, staticRenderFns: __vue_staticRenderFns__$m },
__vue_inject_styles__$m,
__vue_script__$k,
__vue_scope_id__$m,
__vue_is_functional_template__$m);
/**
* @typedef {object} ReducedSearchResult
* @property {FormattedData} data
* @property {boolean} hasLoaded
*/
/**
* @typedef {object} FormattedData
*/
/**
* @typedef {function} Formatter
* @returns {FormattedData} formattedData
*/
/**
* Reduces passed data to a specific format decied by the formatter passed.
*
* @param {object} rawObj
* @param {Formatter} formatFunc
* @returns {null|ReducedSearchResult}
*/
function formatSearchResults(rawObj, formatFunc) {
if (!rawObj.hasLoaded) {
return null
} else {
const { data: rawData } = rawObj;
const formattedData = [];
for (const dataElement of rawData) {
let formatted = formatFunc(dataElement);
formattedData.push(formatted);
}
return {
data: formattedData,
hasLoaded: rawObj.hasLoaded
}
}
}
/**
* @param {FormattedData} track
*/
function formatSingleTrack(track) {
let isTrackExplicit = getProperty(track, 'explicit_lyrics', 'EXPLICIT_LYRICS');
if (typeof isTrackExplicit === 'string') {
isTrackExplicit = isTrackExplicit !== '0';
}
return {
/* Track */
trackTitle: getProperty(track, 'title', 'SNG_TITLE'),
trackTitleVersion: getProperty(track, 'title_version', 'VERSION'),
trackPreview: getProperty(track, 'preview'),
trackDuration: getProperty(track, 'duration', 'DURATION'),
trackLink: getProperty(track, 'link') || `https://www.deezer.com/track/${track.SNG_ID}`,
isTrackExplicit,
/* Artist */
artistID: getProperty(track, 'artist.id', 'ART_ID'),
artistName: getProperty(track, 'artist.name', 'ART_NAME'),
/* Album */
albumID: getProperty(track, 'album.id', 'ALB_ID'),
albumTitle: getProperty(track, 'album.title', 'ALB_TITLE'),
albumPicture:
getProperty(track, 'album.cover_small') ||
`https://e-cdns-images.dzcdn.net/images/cover/${track.ALB_PICTURE}/32x32-000000-80-0-0.jpg`
}
}
function formatAlbums(album) {
let isAlbumExplicit = getProperty(album, 'explicit_lyrics', 'EXPLICIT_ALBUM_CONTENT.EXPLICIT_LYRICS_STATUS');
if ('number' === typeof isAlbumExplicit) {
isAlbumExplicit = isAlbumExplicit === 1;
}
return {
/* Album */
albumID: getProperty(album, 'id', 'ALB_ID'),
albumTitle: getProperty(album, 'title', 'ALB_TITLE'),
albumCoverMedium:
getProperty(album, 'cover_medium') ||
`https://e-cdns-images.dzcdn.net/images/cover/${album.ALB_PICTURE}/156x156-000000-80-0-0.jpg`,
albumLink: getProperty(album, 'link') || `https://deezer.com/album/${album.ALB_ID}`,
albumTracks: getProperty(album, 'nb_tracks', 'NUMBER_TRACK'),
isAlbumExplicit,
/* Artist */
artistName: getProperty(album, 'artist.name', 'ART_NAME')
}
}
function formatArtist(artist) {
return {
/* Artist */
artistID: getProperty(artist, 'id', 'ART_ID'),
artistName: getProperty(artist, 'name', 'ART_NAME'),
artistPictureMedium:
getProperty(artist, 'picture_medium') ||
`https://e-cdns-images.dzcdn.net/images/artist/${artist.ART_PICTURE}/156x156-000000-80-0-0.jpg`,
artistLink: getProperty(artist, 'link') || `https://deezer.com/artist/${artist.ART_ID}`,
// TODO Fix
artistAlbumsNumber: getProperty(artist, 'nb_album', 'NB_FAN')
}
}
function formatPlaylist(playlist) {
return {
/* Playlist */
playlistID: getProperty(playlist, 'id', 'PLAYLIST_ID'),
playlistTitle: getProperty(playlist, 'title', 'TITLE'),
playlistPictureMedium:
getProperty(playlist, 'picture_medium') ||
`https://e-cdns-images.dzcdn.net/images/${playlist.PICTURE_TYPE}/${
playlist.PLAYLIST_PICTURE
}/156x156-000000-80-0-0.jpg`,
playlistLink: getProperty(playlist, 'link') || `https://deezer.com/playlist/${playlist.PLAYLIST_ID}`,
playlistTracksNumber: getProperty(playlist, 'nb_tracks', 'NB_SONG'),
/* Artist */
artistName: getProperty(playlist, 'user.name')
}
}
function formatTitle(track) {
const hasTitleVersion = track.trackTitleVersion && track.trackTitle.indexOf(track.trackTitleVersion) === -1;
return `${track.trackTitle}${hasTitleVersion ? ` ${track.trackTitleVersion}` : ''}`
}
//
var script$l = {
components: {
BaseLoadingPlaceholder,
PreviewControls
},
props: {
viewInfo: {
validator: function (value) {
let isNull = Object.is(value, null);
let isObject = Object.prototype.toString.call(value) === '[object Object]';
return isNull || isObject
},
required: true
},
itemsToShow: {
type: Number,
required: false
},
wantHeaders: {
type: Boolean,
required: false,
default: false
}
},
computed: {
isLoading() {
return !this.viewInfo || !this.viewInfo.hasLoaded
}
},
methods: {
convertDuration,
formatTitle,
playPausePreview(e) {
EventBus.$emit('trackPreview:playPausePreview', e);
}
}
};
/* script */
const __vue_script__$l = script$l;
/* template */
var __vue_render__$n = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('section',[(_vm.isLoading)?_c('BaseLoadingPlaceholder'):[(_vm.viewInfo.data.length === 0)?_c('div',[_c('h1',[_vm._v(_vm._s(_vm.$t('search.noResultsTrack')))])]):_c('table',{staticClass:"table w-full table--tracks"},[(_vm.wantHeaders)?_c('thead',[_c('tr',{staticClass:"capitalize"},[_c('th',{staticClass:"h-12 pb-3",attrs:{"colspan":"2"}},[_vm._v(_vm._s(_vm.$tc('globals.listTabs.title', 1)))]),_vm._v(" "),_c('th',{staticClass:"h-12 pb-3"},[_vm._v(_vm._s(_vm.$tc('globals.listTabs.artist', 1)))]),_vm._v(" "),_c('th',{staticClass:"h-12 pb-3"},[_vm._v(_vm._s(_vm.$tc('globals.listTabs.album', 1)))]),_vm._v(" "),_c('th',{staticClass:"h-12 pb-3"},[_c('i',{staticClass:"material-icons"},[_vm._v("timer")])]),_vm._v(" "),_c('th',{staticClass:"h-12 pb-3",staticStyle:{"width":"3.5rem"}})])]):_vm._e(),_vm._v(" "),_c('tbody',_vm._l((_vm.viewInfo.data.slice(0, _vm.itemsToShow)),function(track){return _c('tr',{key:track.trackLink},[_c('td',{staticClass:"table__icon table__icon--big"},[_c('span',{staticClass:"relative inline-block rounded cursor-pointer",attrs:{"data-preview":track.trackPreview},on:{"click":function($event){return _vm.playPausePreview($event)}}},[(track.trackPreview)?_c('PreviewControls'):_vm._e(),_vm._v(" "),_c('img',{staticClass:"rounded coverart",attrs:{"src":track.albumPicture}})],1)]),_vm._v(" "),_c('td',{staticClass:"table__cell table__cell--large"},[_c('div',{staticClass:"break-words table__cell-content table__cell-content--vertical-center"},[(track.isTrackExplicit)?_c('i',{staticClass:"material-icons explicit-icon"},[_vm._v("explicit")]):_vm._e(),_vm._v("\n\t\t\t\t\t\t\t"+_vm._s(_vm.formatTitle(track))+"\n\t\t\t\t\t\t")])]),_vm._v(" "),_c('router-link',{staticClass:"break-words table__cell table__cell--medium table__cell--center",attrs:{"tag":"td","to":{ name: 'Artist', params: { id: track.artistID } }}},[_c('span',{staticClass:"cursor-pointer hover:underline"},[_vm._v("\n\t\t\t\t\t\t\t"+_vm._s(track.artistName)+"\n\t\t\t\t\t\t")])]),_vm._v(" "),_c('router-link',{staticClass:"break-words table__cell table__cell--medium table__cell--center",attrs:{"tag":"td","to":{ name: 'Album', params: { id: track.albumID } }}},[_c('span',{staticClass:"cursor-pointer hover:underline"},[_vm._v("\n\t\t\t\t\t\t\t"+_vm._s(track.albumTitle)+"\n\t\t\t\t\t\t")])]),_vm._v(" "),_c('td',{staticClass:"table__cell table__cell--small table__cell--center"},[_vm._v("\n\t\t\t\t\t\t"+_vm._s(_vm.convertDuration(track.trackDuration))+"\n\t\t\t\t\t")]),_vm._v(" "),_c('td',{staticClass:"cursor-pointer table__cell--center group",attrs:{"data-link":track.trackLink,"aria-label":"download"},on:{"click":function($event){$event.stopPropagation();return _vm.$emit('add-to-queue', $event)}}},[_c('i',{staticClass:"transition-colors duration-150 ease-in-out material-icons group-hover:text-primary",attrs:{"title":_vm.$t('globals.download_hint')}},[_vm._v("\n\t\t\t\t\t\t\tget_app\n\t\t\t\t\t\t")])])],1)}),0)])]],2)};
var __vue_staticRenderFns__$n = [];
/* style */
const __vue_inject_styles__$n = undefined;
/* scoped */
const __vue_scope_id__$n = undefined;
/* functional template */
const __vue_is_functional_template__$n = false;
/* component normalizer */
function __vue_normalize__$n(
template, style, script,
scope, functional, moduleIdentifier,
createInjector, createInjectorSSR
) {
const component = (typeof script === 'function' ? script.options : script) || {};
// For security concerns, we use only base name in production mode.
component.__file = "ResultsTracks.vue";
if (!component.render) {
component.render = template.render;
component.staticRenderFns = template.staticRenderFns;
component._compiled = true;
if (functional) component.functional = true;
}
component._scopeId = scope;
return component
}
/* style inject */
/* style inject SSR */
var ResultsTracks = __vue_normalize__$n(
{ render: __vue_render__$n, staticRenderFns: __vue_staticRenderFns__$n },
__vue_inject_styles__$n,
__vue_script__$l,
__vue_scope_id__$n,
__vue_is_functional_template__$n);
//
var script$m = {
components: {
BaseLoadingPlaceholder,
CoverContainer
},
props: {
viewInfo: {
validator: function (value) {
let isNull = Object.is(value, null);
let isObject = Object.prototype.toString.call(value) === '[object Object]';
return isNull || isObject
},
required: true
},
itemsToShow: {
type: Number,
required: false
},
wantHeaders: {
type: Boolean,
required: false,
default: false
}
},
computed: {
isLoading() {
return !this.viewInfo || !this.viewInfo.hasLoaded
}
}
};
/* script */
const __vue_script__$m = script$m;
/* template */
var __vue_render__$o = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('section',[(_vm.isLoading)?_c('BaseLoadingPlaceholder'):[(_vm.viewInfo.data.length === 0)?_c('div',[_c('h1',[_vm._v(_vm._s(_vm.$t('search.noResultsAlbum')))])]):_c('div',{staticClass:"release-grid"},_vm._l((_vm.viewInfo.data.slice(0, _vm.itemsToShow)),function(release){return _c('div',{key:release.albumID,staticClass:"w-40 release"},[_c('router-link',{staticClass:"cursor-pointer",attrs:{"tag":"div","to":{ name: 'Album', params: { id: release.albumID } }}},[_c('CoverContainer',{attrs:{"is-rounded":"","cover":release.albumCoverMedium,"link":release.albumLink},on:{"click":function($event){$event.stopPropagation();return _vm.$emit('add-to-queue', $event)}}}),_vm._v(" "),_c('span',{staticClass:"primary-text"},[(release.isAlbumExplicit)?_c('i',{staticClass:"material-icons explicit-icon",staticStyle:{"font-size":"1.0625rem !important"}},[_vm._v("\n\t\t\t\t\t\t\texplicit\n\t\t\t\t\t\t")]):_vm._e(),_vm._v("\n\t\t\t\t\t\t"+_vm._s(release.albumTitle)+"\n\t\t\t\t\t")])],1),_vm._v(" "),_c('p',{staticClass:"secondary-text"},[_vm._v("\n\t\t\t\t\t"+_vm._s(_vm.$t('globals.by', { artist: release.artistName }) +
' - ' +
_vm.$tc('globals.listTabs.trackN', release.albumTracks))+"\n\t\t\t\t")])],1)}),0)]],2)};
var __vue_staticRenderFns__$o = [];
/* style */
const __vue_inject_styles__$o = undefined;
/* scoped */
const __vue_scope_id__$o = undefined;
/* functional template */
const __vue_is_functional_template__$o = false;
/* component normalizer */
function __vue_normalize__$o(
template, style, script,
scope, functional, moduleIdentifier,
createInjector, createInjectorSSR
) {
const component = (typeof script === 'function' ? script.options : script) || {};
// For security concerns, we use only base name in production mode.
component.__file = "ResultsAlbums.vue";
if (!component.render) {
component.render = template.render;
component.staticRenderFns = template.staticRenderFns;
component._compiled = true;
if (functional) component.functional = true;
}
component._scopeId = scope;
return component
}
/* style inject */
/* style inject SSR */
var ResultsAlbums = __vue_normalize__$o(
{ render: __vue_render__$o, staticRenderFns: __vue_staticRenderFns__$o },
__vue_inject_styles__$o,
__vue_script__$m,
__vue_scope_id__$o,
__vue_is_functional_template__$o);
//
var script$n = {
components: {
BaseLoadingPlaceholder,
CoverContainer
},
props: {
viewInfo: {
validator: function (value) {
let isNull = Object.is(value, null);
let isObject = Object.prototype.toString.call(value) === '[object Object]';
return isNull || isObject
},
required: true
},
itemsToShow: {
type: Number,
required: false
},
wantHeaders: {
type: Boolean,
required: false,
default: false
}
},
computed: {
isLoading() {
return !this.viewInfo || !this.viewInfo.hasLoaded
}
}
};
/* script */
const __vue_script__$n = script$n;
/* template */
var __vue_render__$p = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('section',[(_vm.isLoading)?_c('BaseLoadingPlaceholder'):[(_vm.viewInfo.data.length === 0)?_c('div',[_c('h1',[_vm._v(_vm._s(_vm.$t('search.noResultsArtist')))])]):_c('div',{staticClass:"release-grid"},_vm._l((_vm.viewInfo.data.slice(0, _vm.itemsToShow)),function(release){return _c('div',{key:release.artistID,staticClass:"w-40 release"},[_c('router-link',{staticClass:"cursor-pointer",attrs:{"tag":"div","to":{ name: 'Artist', params: { id: release.artistID } }}},[_c('CoverContainer',{attrs:{"is-circle":"","cover":release.artistPictureMedium,"link":release.artistLink},on:{"click":function($event){$event.stopPropagation();return _vm.$emit('add-to-queue', $event)}}}),_vm._v(" "),_c('span',{staticClass:"primary-text"},[_vm._v("\n\t\t\t\t\t\t"+_vm._s(release.artistName)+"\n\t\t\t\t\t")])],1)],1)}),0)]],2)};
var __vue_staticRenderFns__$p = [];
/* style */
const __vue_inject_styles__$p = undefined;
/* scoped */
const __vue_scope_id__$p = undefined;
/* functional template */
const __vue_is_functional_template__$p = false;
/* component normalizer */
function __vue_normalize__$p(
template, style, script,
scope, functional, moduleIdentifier,
createInjector, createInjectorSSR
) {
const component = (typeof script === 'function' ? script.options : script) || {};
// For security concerns, we use only base name in production mode.
component.__file = "ResultsArtists.vue";
if (!component.render) {
component.render = template.render;
component.staticRenderFns = template.staticRenderFns;
component._compiled = true;
if (functional) component.functional = true;
}
component._scopeId = scope;
return component
}
/* style inject */
/* style inject SSR */
var ResultsArtists = __vue_normalize__$p(
{ render: __vue_render__$p, staticRenderFns: __vue_staticRenderFns__$p },
__vue_inject_styles__$p,
__vue_script__$n,
__vue_scope_id__$p,
__vue_is_functional_template__$p);
//
var script$o = {
components: {
BaseLoadingPlaceholder,
CoverContainer
},
props: {
viewInfo: {
validator: function (value) {
let isNull = Object.is(value, null);
let isObject = Object.prototype.toString.call(value) === '[object Object]';
return isNull || isObject
},
required: true
},
itemsToShow: {
type: Number,
required: false
},
wantHeaders: {
type: Boolean,
required: false,
default: false
}
},
computed: {
isLoading() {
return !this.viewInfo || !this.viewInfo.hasLoaded
}
}
};
/* script */
const __vue_script__$o = script$o;
/* template */
var __vue_render__$q = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('section',[(_vm.isLoading)?_c('BaseLoadingPlaceholder'):[(_vm.viewInfo.data.length === 0)?_c('div',[_c('h1',[_vm._v(_vm._s(_vm.$t('search.noResultsPlaylist')))])]):_c('div',{staticClass:"release-grid"},_vm._l((_vm.viewInfo.data.slice(0, _vm.itemsToShow)),function(playlist){return _c('div',{key:playlist.playlistID,staticClass:"w-40 release"},[_c('router-link',{staticClass:"cursor-pointer",attrs:{"tag":"div","to":{ name: 'Playlist', params: { id: playlist.playlistID } }}},[_c('CoverContainer',{attrs:{"is-rounded":"","cover":playlist.playlistPictureMedium,"link":playlist.playlistLink},on:{"click":function($event){$event.stopPropagation();return _vm.$emit('add-to-queue', $event)}}}),_vm._v(" "),_c('span',{staticClass:"primary-text"},[_vm._v("\n\t\t\t\t\t\t"+_vm._s(playlist.playlistTitle)+"\n\t\t\t\t\t")])],1),_vm._v(" "),_c('p',{staticClass:"secondary-text"},[_vm._v("\n\t\t\t\t\t"+_vm._s(((_vm.$t('globals.by', { artist: playlist.artistName })) + " - " + (_vm.$tc(
'globals.listTabs.trackN',
playlist.playlistTracksNumber
))))+"\n\t\t\t\t")])],1)}),0)]],2)};
var __vue_staticRenderFns__$q = [];
/* style */
const __vue_inject_styles__$q = undefined;
/* scoped */
const __vue_scope_id__$q = undefined;
/* functional template */
const __vue_is_functional_template__$q = false;
/* component normalizer */
function __vue_normalize__$q(
template, style, script,
scope, functional, moduleIdentifier,
createInjector, createInjectorSSR
) {
const component = (typeof script === 'function' ? script.options : script) || {};
// For security concerns, we use only base name in production mode.
component.__file = "ResultsPlaylists.vue";
if (!component.render) {
component.render = template.render;
component.staticRenderFns = template.staticRenderFns;
component._compiled = true;
if (functional) component.functional = true;
}
component._scopeId = scope;
return component
}
/* style inject */
/* style inject SSR */
var ResultsPlaylists = __vue_normalize__$q(
{ render: __vue_render__$q, staticRenderFns: __vue_staticRenderFns__$q },
__vue_inject_styles__$q,
__vue_script__$o,
__vue_scope_id__$q,
__vue_is_functional_template__$q);
//
var script$p = {
components: {
TopResult,
ResultsTracks,
ResultsAlbums,
ResultsArtists,
ResultsPlaylists
},
props: {
viewInfo: {
type: Object,
required: false
}
},
computed: {
thereAreResults() {
let areInfosLoaded = !!this.viewInfo;
if (!areInfosLoaded) {
return false
}
let noResultsPresent = this.viewInfo.ORDER.every(section =>
section === 'TOP_RESULT' ? this.viewInfo[section].length === 0 : this.viewInfo[section].data.length === 0
);
return !noResultsPresent
}
},
methods: {
convertDuration,
upperCaseFirstLowerCaseRest,
formatSearchResults,
formatSingleTrack,
formatAlbums,
formatArtist,
formatPlaylist,
checkSectionResults(section) {
if (section === 'TOP_RESULT') {
return !!this.viewInfo.TOP_RESULT[0]
} else {
return !!this.viewInfo[section].data[0]
}
}
}
};
/* script */
const __vue_script__$p = script$p;
/* template */
var __vue_render__$r = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('section',[(!_vm.thereAreResults)?_c('div',[_c('h1',[_vm._v(_vm._s(_vm.$t('search.noResults')))])]):_vm._l((_vm.viewInfo.ORDER),function(section){return _c('section',{key:section,staticClass:"float-none py-5 border-t border-grayscale-500 first:border-t-0"},[(_vm.checkSectionResults(section))?[_c('h2',{staticClass:"mb-6 capitalize",class:{
'text-4xl text-center': section === 'TOP_RESULT',
'inline-block cursor-pointer text-3xl hover:text-primary transition-colors duration-200 ease-in-out':
section !== 'TOP_RESULT'
},on:{"click":function($event){return _vm.$emit('change-search-tab', section)}}},[_vm._v("\n\t\t\t\t\t"+_vm._s(_vm.$tc(("globals.listTabs." + (section.toLowerCase())), 2))+"\n\t\t\t\t")]),_vm._v(" "),(section === 'TOP_RESULT')?_c('TopResult',{attrs:{"info":_vm.viewInfo.TOP_RESULT[0]},on:{"add-to-queue":function($event){return _vm.$emit('add-to-queue', $event)}}}):(section === 'TRACK')?_c('ResultsTracks',{attrs:{"viewInfo":_vm.formatSearchResults(_vm.viewInfo.TRACK, _vm.formatSingleTrack),"itemsToShow":6},on:{"add-to-queue":function($event){return _vm.$emit('add-to-queue', $event)}}}):(section == 'ALBUM')?_c('ResultsAlbums',{attrs:{"viewInfo":_vm.formatSearchResults(_vm.viewInfo.ALBUM, _vm.formatAlbums),"itemsToShow":6},on:{"add-to-queue":function($event){return _vm.$emit('add-to-queue', $event)}}}):(section == 'PLAYLIST')?_c('ResultsPlaylists',{attrs:{"viewInfo":_vm.formatSearchResults(_vm.viewInfo.PLAYLIST, _vm.formatPlaylist),"itemsToShow":6},on:{"add-to-queue":function($event){return _vm.$emit('add-to-queue', $event)}}}):(section === 'ARTIST')?_c('ResultsArtists',{attrs:{"viewInfo":_vm.formatSearchResults(_vm.viewInfo.ARTIST, _vm.formatArtist),"itemsToShow":6},on:{"add-to-queue":function($event){return _vm.$emit('add-to-queue', $event)}}}):_vm._e()]:_vm._e()],2)})],2)};
var __vue_staticRenderFns__$r = [];
/* style */
const __vue_inject_styles__$r = undefined;
/* scoped */
const __vue_scope_id__$r = undefined;
/* functional template */
const __vue_is_functional_template__$r = false;
/* component normalizer */
function __vue_normalize__$r(
template, style, script,
scope, functional, moduleIdentifier,
createInjector, createInjectorSSR
) {
const component = (typeof script === 'function' ? script.options : script) || {};
// For security concerns, we use only base name in production mode.
component.__file = "ResultsAll.vue";
if (!component.render) {
component.render = template.render;
component.staticRenderFns = template.staticRenderFns;
component._compiled = true;
if (functional) component.functional = true;
}
component._scopeId = scope;
return component
}
/* style inject */
/* style inject SSR */
var ResultsAll = __vue_normalize__$r(
{ render: __vue_render__$r, staticRenderFns: __vue_staticRenderFns__$r },
__vue_inject_styles__$r,
__vue_script__$p,
__vue_scope_id__$r,
__vue_is_functional_template__$r);
//
const resetObj = { data: [], next: 0, total: 0, hasLoaded: false };
var script$q = {
components: {
BaseLoadingPlaceholder
},
props: {
performScrolledSearch: {
type: Boolean,
required: false
}
},
data() {
const $t = this.$t.bind(this);
const $tc = this.$tc.bind(this);
return {
currentTab: {
name: '',
searchType: '',
component: {},
viewInfo: '',
formatFunc: () => {}
},
tabs: [
{
name: $t('globals.listTabs.all'),
searchType: 'all',
component: ResultsAll,
viewInfo: 'allTab'
},
{
name: $tc('globals.listTabs.track', 2),
searchType: 'track',
component: ResultsTracks,
viewInfo: 'trackTab',
formatFunc: formatSingleTrack
},
{
name: $tc('globals.listTabs.album', 2),
searchType: 'album',
component: ResultsAlbums,
viewInfo: 'albumTab',
formatFunc: formatAlbums
},
{
name: $tc('globals.listTabs.artist', 2),
searchType: 'artist',
component: ResultsArtists,
viewInfo: 'artistTab',
formatFunc: formatArtist
},
{
name: $tc('globals.listTabs.playlist', 2),
searchType: 'playlist',
component: ResultsPlaylists,
viewInfo: 'playlistTab',
formatFunc: formatPlaylist
}
],
results: {
query: '',
allTab: {
ORDER: [],
TOP_RESULT: [],
ALBUM: {
hasLoaded: false
},
ARTIST: {
hasLoaded: false
},
TRACK: {
hasLoaded: false
},
PLAYLIST: {
hasLoaded: false
}
},
trackTab: { ...resetObj },
albumTab: { ...resetObj },
artistTab: { ...resetObj },
playlistTab: { ...resetObj }
}
}
},
computed: {
showSearchTab() {
return this.results.query !== ''
},
loadedTabs() {
const tabsLoaded = [];
for (const resultKey in this.results) {
if (this.results.hasOwnProperty(resultKey)) {
const currentResult = this.results[resultKey];
if (currentResult.hasLoaded) {
tabsLoaded.push(resultKey.replace(/Tab/g, ''));
}
}
}
return tabsLoaded
}
},
created() {
this.currentTab = this.tabs[0];
},
mounted() {
this.$root.$on('mainSearch:showNewResults', this.checkIfPerformNewMainSearch);
this.$root.$on('mainSearch:updateResults', this.checkIfUpdateResults);
socket.on('mainSearch', this.saveMainSearchResult);
socket.on('search', this.handleSearch);
},
methods: {
numberWithDots,
convertDuration,
addToQueue(e) {
sendAddToQueue(e.currentTarget.dataset.link);
},
getViewInfo() {
if (this.currentTab.searchType === 'all') {
return this.results.allTab
}
return formatSearchResults(this.results[this.currentTab.viewInfo], this.currentTab.formatFunc)
},
changeSearchTab(tabName) {
tabName = tabName.toLowerCase();
const newTab = this.tabs.find(tab => {
return tab.searchType === tabName
});
if (!newTab) {
console.error(`No tab ${tabName} found`);
return
}
window.scrollTo(0, 0);
this.currentTab = newTab;
},
checkIfPerformNewMainSearch(searchTerm) {
let needToPerformNewMainSearch = searchTerm !== this.results.query;
if (needToPerformNewMainSearch) {
this.performNewMainSearch(searchTerm);
}
},
performNewMainSearch(term) {
socket.emit('mainSearch', { term });
// Showing loading placeholder
this.$root.$emit('updateSearchLoadingState', true);
this.currentTab = this.tabs[0];
},
// ! Updates search only if the search term is the same as before AND we're not in the ALL tab. Wtf
checkIfUpdateResults(term) {
let needToUpdateSearch = term === this.results.query && this.currentTab.searchType !== 'all';
if (needToUpdateSearch) {
this.results[this.currentTab.searchType + 'Tab'] = { ...resetObj };
this.search(this.currentTab.searchType);
}
},
search(type) {
socket.emit('search', {
term: this.results.query,
type,
start: this.results[`${type}Tab`].next,
nb: 30
});
},
scrolledSearch() {
if (this.currentTab.searchType === 'all') return
const currentTabKey = `${this.currentTab.searchType}Tab`;
const needToPerformScrolledSearch = this.results[currentTabKey].next < this.results[currentTabKey].total;
if (needToPerformScrolledSearch) {
this.search(this.currentTab.searchType);
}
},
saveMainSearchResult(searchResult) {
// Hide loading placeholder
this.$root.$emit('updateSearchLoadingState', false);
this.results.query = searchResult.QUERY;
this.results.allTab = searchResult;
this.results.allTab.TRACK.hasLoaded = true;
this.results.allTab.ALBUM.hasLoaded = true;
this.results.allTab.ARTIST.hasLoaded = true;
this.results.allTab.PLAYLIST.hasLoaded = true;
this.results.trackTab = { ...resetObj };
this.results.albumTab = { ...resetObj };
this.results.artistTab = { ...resetObj };
this.results.playlistTab = { ...resetObj };
},
handleSearch(result) {
const { next: nextResult, total, type, data: newData } = result;
const currentTabKey = type + 'Tab';
let next = 0;
if (nextResult) {
next = parseInt(nextResult.match(/index=(\d*)/)[1]);
} else {
next = total;
}
if (this.results[currentTabKey].total !== total) {
this.results[currentTabKey].total = total;
}
if (this.results[currentTabKey].next !== next) {
this.results[currentTabKey].next = next;
this.results[currentTabKey].data = this.results[currentTabKey].data.concat(newData);
}
this.results[currentTabKey].hasLoaded = true;
},
isTabLoaded(tab) {
return this.loadedTabs.indexOf(tab.searchType) !== -1 || tab.searchType === 'all'
}
},
watch: {
performScrolledSearch(needToSearch) {
if (!needToSearch) return
this.scrolledSearch(needToSearch);
},
currentTab(newTab) {
if (this.isTabLoaded(newTab)) return
this.search(newTab.searchType);
}
}
};
/* script */
const __vue_script__$q = script$q;
/* template */
var __vue_render__$s = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{"id":"search_tab"}},[_c('div',{directives:[{name:"show",rawName:"v-show",value:(!_vm.showSearchTab),expression:"!showSearchTab"}]},[_c('h2',[_vm._v(_vm._s(_vm.$t('search.startSearching')))]),_vm._v(" "),_c('p',[_vm._v(_vm._s(_vm.$t('search.description')))])]),_vm._v(" "),_c('div',{directives:[{name:"show",rawName:"v-show",value:(_vm.showSearchTab),expression:"showSearchTab"}]},[_c('ul',{staticClass:"section-tabs"},_vm._l((_vm.tabs),function(tab){return _c('li',{key:tab.name,staticClass:"section-tabs__tab",class:{ active: _vm.currentTab.name === tab.name },on:{"click":function($event){_vm.currentTab = tab;}}},[_vm._v("\n\t\t\t\t"+_vm._s(tab.name)+"\n\t\t\t")])}),0),_vm._v(" "),_c('keep-alive',[_c(_vm.currentTab.component,{tag:"component",attrs:{"viewInfo":_vm.getViewInfo(),"want-headers":""},on:{"add-to-queue":_vm.addToQueue,"change-search-tab":_vm.changeSearchTab}})],1)],1)])};
var __vue_staticRenderFns__$s = [];
/* style */
const __vue_inject_styles__$s = undefined;
/* scoped */
const __vue_scope_id__$s = undefined;
/* functional template */
const __vue_is_functional_template__$s = false;
/* component normalizer */
function __vue_normalize__$s(
template, style, script,
scope, functional, moduleIdentifier,
createInjector, createInjectorSSR
) {
const component = (typeof script === 'function' ? script.options : script) || {};
// For security concerns, we use only base name in production mode.
component.__file = "Search.vue";
if (!component.render) {
component.render = template.render;
component.staticRenderFns = template.staticRenderFns;
component._compiled = true;
if (functional) component.functional = true;
}
component._scopeId = scope;
return component
}
/* style inject */
/* style inject SSR */
var Search = __vue_normalize__$s(
{ render: __vue_render__$s, staticRenderFns: __vue_staticRenderFns__$s },
__vue_inject_styles__$s,
__vue_script__$q,
__vue_scope_id__$s,
__vue_is_functional_template__$s);
let settingsData = {};
let defaultSettingsData = {};
let spotifyCredentials = {};
function getSettingsData() {
{
socket.emit('get_settings_data');
return new Promise((resolve, reject) => {
socket.on('init_settings', (settings, credentials, defaults) => {
settingsData = settings;
defaultSettingsData = defaults;
spotifyCredentials = credentials;
// cached = true
socket.off('init_settings');
resolve({ settingsData, defaultSettingsData, spotifyCredentials });
});
})
}
}
var it$1 = "<svg xmlns=\"http://www.w3.org/2000/svg\" id=\"flag-icon-css-it\" viewBox=\"0 0 640 480\">\n <g fill-rule=\"evenodd\" stroke-width=\"1pt\">\n <path fill=\"#fff\" d=\"M0 0h640v480H0z\"/>\n <path fill=\"#009246\" d=\"M0 0h213.3v480H0z\"/>\n <path fill=\"#ce2b37\" d=\"M426.7 0H640v480H426.7z\"/>\n </g>\n</svg>";
var gb = "<svg xmlns=\"http://www.w3.org/2000/svg\" id=\"flag-icon-css-gb\" viewBox=\"0 0 640 480\">\n <path fill=\"#012169\" d=\"M0 0h640v480H0z\"/>\n <path fill=\"#FFF\" d=\"M75 0l244 181L562 0h78v62L400 241l240 178v61h-80L320 301 81 480H0v-60l239-178L0 64V0h75z\"/>\n <path fill=\"#C8102E\" d=\"M424 281l216 159v40L369 281h55zm-184 20l6 35L54 480H0l240-179zM640 0v3L391 191l2-44L590 0h50zM0 0l239 176h-60L0 42V0z\"/>\n <path fill=\"#FFF\" d=\"M241 0v480h160V0H241zM0 160v160h640V160H0z\"/>\n <path fill=\"#C8102E\" d=\"M0 193v96h640v-96H0zM273 0v480h96V0h-96z\"/>\n</svg>";
var es$1 = "<svg xmlns=\"http://www.w3.org/2000/svg\" id=\"flag-icon-css-es\" viewBox=\"0 0 640 480\">\n <path fill=\"#AA151B\" d=\"M0 0h640v480H0z\"/>\n <path fill=\"#F1BF00\" d=\"M0 120h640v240H0z\"/>\n <path fill=\"#ad1519\" d=\"M127.3 213.3l-.8-.1-1-1-.7-.4-.6-.8s-.7-1.1-.4-2c.3-.9.9-1.2 1.4-1.5a12 12 0 011.5-.5l1-.4 1.3-.3.5-.3c.2 0 .7 0 1-.2l1-.2 1.6.1h4.8c.4 0 1.2.3 1.4.4a35 35 0 002 .7c.5.1 1.6.3 2.2.6.5.3.9.7 1.1 1l.5 1v1.1l-.5.8-.6 1-.8.6s-.5.5-1 .4c-.4 0-4.8-.8-7.6-.8s-7.3.9-7.3.9\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-linejoin=\"round\" stroke-width=\".3\" d=\"M127.3 213.3l-.8-.1-1-1-.7-.4-.6-.8s-.7-1.1-.4-2c.3-.9.9-1.2 1.4-1.5a12 12 0 011.5-.5l1-.4 1.3-.3.5-.3c.2 0 .7 0 1-.2l1-.2 1.6.1h4.8c.4 0 1.2.3 1.4.4a35 35 0 002 .7c.5.1 1.6.3 2.2.6.5.3.9.7 1.1 1l.5 1v1.1l-.5.8-.6 1-.8.6s-.5.5-1 .4c-.4 0-4.8-.8-7.6-.8s-7.3.9-7.3.9z\"/>\n <path fill=\"#c8b100\" d=\"M133.3 207c0-1.3.6-2.3 1.3-2.3.8 0 1.4 1 1.4 2.4 0 1.3-.6 2.4-1.4 2.4s-1.3-1.1-1.3-2.5\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M133.3 207c0-1.3.6-2.3 1.3-2.3.8 0 1.4 1 1.4 2.4 0 1.3-.6 2.4-1.4 2.4s-1.3-1.1-1.3-2.5z\"/>\n <path fill=\"#c8b100\" d=\"M134 207c0-1.2.3-2.1.7-2.1.3 0 .6 1 .6 2.1 0 1.3-.3 2.2-.6 2.2-.4 0-.6-1-.6-2.2\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M134 207c0-1.2.3-2.1.7-2.1.3 0 .6 1 .6 2.1 0 1.3-.3 2.2-.6 2.2-.4 0-.6-1-.6-2.2z\"/>\n <path fill=\"#c8b100\" d=\"M133.8 204.5c0-.4.4-.8.8-.8s1 .4 1 .8c0 .5-.5.9-1 .9s-.8-.4-.8-.9\"/>\n <path fill=\"#c8b100\" d=\"M135.3 204.2v.6h-1.4v-.6h.5V203h-.7v-.6h.7v-.5h.5v.5h.6v.6h-.6v1.2h.4\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M135.3 204.2v.6h-1.4v-.6h.5V203h-.7v-.6h.7v-.5h.5v.5h.6v.6h-.6v1.2h.4\"/>\n <path fill=\"#c8b100\" d=\"M135.9 204.2v.6h-2.5v-.6h1V203h-.7v-.6h.7v-.5h.5v.5h.6v.6h-.6v1.2h1\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M135.9 204.2v.6h-2.5v-.6h1V203h-.7v-.6h.7v-.5h.5v.5h.6v.6h-.6v1.2h1\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M134.9 203.7c.4.1.6.4.6.8 0 .5-.4.9-.8.9s-1-.4-1-.9c0-.4.3-.7.7-.8\"/>\n <path fill=\"#c8b100\" d=\"M134.7 213.2H130v-1.1l-.3-1.2-.2-1.5c-1.3-1.7-2.5-2.8-2.9-2.5.1-.3.2-.6.5-.7 1.1-.7 3.5 1 5.2 3.6l.5.7h3.8l.4-.7c1.8-2.7 4.1-4.3 5.2-3.6.3.1.4.4.5.7-.4-.3-1.6.8-2.9 2.5l-.2 1.5-.2 1.2-.1 1.1h-4.7\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M134.7 213.2H130v-1.1l-.3-1.2-.2-1.5c-1.3-1.7-2.5-2.8-2.9-2.5.1-.3.2-.6.5-.7 1.1-.7 3.5 1 5.2 3.6l.5.7h3.8l.4-.7c1.8-2.7 4.1-4.3 5.2-3.6.3.1.4.4.5.7-.4-.3-1.6.8-2.9 2.5l-.2 1.5-.2 1.2-.1 1.1h-4.7z\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M126.8 206.8c1-.5 3 1.1 4.6 3.6m11-3.6c-.8-.5-2.8 1.1-4.5 3.6\"/>\n <path fill=\"#c8b100\" d=\"M127.8 215.3l-.5-1a27.3 27.3 0 0114.7 0l-.5.8a5.7 5.7 0 00-.3.8 22.9 22.9 0 00-6.6-.8c-2.6 0-5.2.3-6.5.8l-.3-.6\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M127.8 215.3l-.5-1a27.3 27.3 0 0114.7 0l-.5.8a5.7 5.7 0 00-.3.8 22.9 22.9 0 00-6.6-.8c-2.6 0-5.2.3-6.5.8l-.3-.6\"/>\n <path fill=\"#c8b100\" d=\"M134.6 217.7c2.4 0 5-.4 5.9-.6.6-.2 1-.5 1-.8 0-.2-.2-.3-.4-.4-1.4-.5-4-.8-6.5-.8s-5 .3-6.4.8c-.2 0-.3.2-.4.3 0 .4.3.7 1 .9 1 .2 3.5.6 5.8.6\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M134.6 217.7c2.4 0 5-.4 5.9-.6.6-.2 1-.5 1-.8 0-.2-.2-.3-.4-.4-1.4-.5-4-.8-6.5-.8s-5 .3-6.4.8c-.2 0-.3.2-.4.3 0 .4.3.7 1 .9 1 .2 3.5.6 5.8.6z\"/>\n <path fill=\"#c8b100\" d=\"M142.1 213.2l-.5-.5s-.6.3-1.3.2c-.6 0-.9-1-.9-1s-.7.7-1.3.7c-.7 0-1-.6-1-.6s-.7.5-1.3.4c-.6 0-1.2-.8-1.2-.8s-.6.8-1.2.8c-.6.1-1-.5-1-.5s-.4.6-1.1.7-1.4-.6-1.4-.6-.5.7-1 1c-.5 0-1.2-.4-1.2-.4l-.2.5-.3.1.2.5a27 27 0 017.2-.9c3 0 5.5.4 7.4 1l.2-.6\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M142.1 213.2l-.5-.5s-.6.3-1.3.2c-.6 0-.9-1-.9-1s-.7.7-1.3.7c-.7 0-1-.6-1-.6s-.7.5-1.3.4c-.6 0-1.2-.8-1.2-.8s-.6.8-1.2.8c-.6.1-1-.5-1-.5s-.4.6-1.1.7-1.4-.6-1.4-.6-.5.7-1 1c-.5 0-1.2-.4-1.2-.4l-.2.5-.3.1.2.5a27 27 0 017.2-.9c3 0 5.5.4 7.4 1l.2-.6z\"/>\n <path fill=\"#c8b100\" d=\"M134.7 210.7h.2a1 1 0 000 .4c0 .6.4 1 1 1a1 1 0 001-.7l.2-.3v.4c.1.5.6.8 1.1.8.6 0 1-.4 1-1v-.1l.4-.4.2.5a.9.9 0 00-.1.4 1 1 0 001 1c.4 0 .7-.2.9-.5l.2-.2v.3c0 .3.1.6.4.7 0 0 .4 0 1-.4l.7-.7v.4s-.5.8-1 1c-.2.2-.5.4-.8.3-.3 0-.6-.3-.7-.6-.2.2-.4.2-.7.2-.6 0-1.2-.3-1.4-.8-.3.3-.7.5-1.1.5a1.6 1.6 0 01-1.2-.6 1.6 1.6 0 01-1 .4 1.6 1.6 0 01-1.3-.6 1.6 1.6 0 01-2.4.2 1.6 1.6 0 01-1.2.6 1.5 1.5 0 01-1.1-.5c-.2.5-.8.8-1.4.8-.2 0-.5 0-.7-.2-.1.3-.4.6-.7.6-.3 0-.6 0-.9-.2l-1-1 .1-.5.8.7c.5.4.9.4.9.4.3 0 .4-.4.4-.7v-.3l.2.2c.2.3.5.5.9.5a1 1 0 001-1 .9.9 0 000-.4v-.5l.4.4a.7.7 0 000 .1c0 .6.5 1 1 1 .6 0 1-.3 1.1-.9v-.3l.2.3c.2.4.6.7 1 .7.7 0 1.1-.4 1.1-1a1 1 0 000-.3h.3\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M134.7 210.7h.2a1 1 0 000 .4c0 .6.4 1 1 1a1 1 0 001-.7l.2-.3v.4c.1.5.6.8 1.1.8.6 0 1-.4 1-1v-.1l.4-.4.2.5a.9.9 0 00-.1.4 1 1 0 001 1c.4 0 .7-.2.9-.5l.2-.2v.3c0 .3.1.6.4.7 0 0 .4 0 1-.4l.7-.7v.4s-.5.8-1 1c-.2.2-.5.4-.8.3-.3 0-.6-.3-.7-.6-.2.2-.4.2-.7.2-.6 0-1.2-.3-1.4-.8-.3.3-.7.5-1.1.5a1.6 1.6 0 01-1.2-.6 1.6 1.6 0 01-1 .4 1.6 1.6 0 01-1.3-.6 1.6 1.6 0 01-2.4.2 1.6 1.6 0 01-1.2.6 1.5 1.5 0 01-1.1-.5c-.2.5-.8.8-1.4.8-.2 0-.5 0-.7-.2-.1.3-.4.6-.7.6-.3 0-.6 0-.9-.2l-1-1 .1-.5.8.7c.5.4.9.4.9.4.3 0 .4-.4.4-.7v-.3l.2.2c.2.3.5.5.9.5a1 1 0 001-1 .9.9 0 000-.4v-.5l.4.4a.7.7 0 000 .1c0 .6.5 1 1 1 .6 0 1-.3 1.1-.9v-.3l.2.3c.2.4.6.7 1 .7.7 0 1.1-.4 1.1-1a1 1 0 000-.3h.3z\"/>\n <path fill=\"#c8b100\" d=\"M134.6 213.3c-2.9 0-5.5.4-7.3 1l-.3-.2.1-.3a27 27 0 017.5-1c3 0 5.7.4 7.6 1 0 0 .2.2.1.3l-.3.2a27.3 27.3 0 00-7.4-1\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-linejoin=\"round\" stroke-width=\".3\" d=\"M134.6 213.3c-2.9 0-5.5.4-7.3 1l-.3-.2.1-.3a27 27 0 017.5-1c3 0 5.7.4 7.6 1 0 0 .2.2.1.3l-.3.2a27.3 27.3 0 00-7.4-1z\"/>\n <path fill=\"#fff\" d=\"M131.8 214.4c0-.3.2-.4.5-.4a.4.4 0 01.4.4c0 .2-.2.4-.4.4a.4.4 0 01-.5-.4\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M131.8 214.4c0-.3.2-.4.5-.4a.4.4 0 01.4.4c0 .2-.2.4-.4.4a.4.4 0 01-.5-.4z\"/>\n <path fill=\"#ad1519\" d=\"M134.7 214.5h-1c-.1 0-.3 0-.3-.3l.3-.3h2a.3.3 0 01.2.3.3.3 0 01-.3.3h-1\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M134.7 214.5h-1c-.1 0-.3 0-.3-.3l.3-.3h2a.3.3 0 01.2.3.3.3 0 01-.3.3h-1\"/>\n <path fill=\"#058e6e\" d=\"M130 214.9h-.7c-.1 0-.3 0-.3-.2a.3.3 0 01.2-.3l.7-.1.7-.1c.2 0 .3 0 .4.2a.3.3 0 01-.3.4h-.7\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M130 214.9h-.7c-.1 0-.3 0-.3-.2a.3.3 0 01.2-.3l.7-.1.7-.1c.2 0 .3 0 .4.2a.3.3 0 01-.3.4h-.7\"/>\n <path fill=\"#ad1519\" d=\"M127.3 215.3l.3-.4h.7l-.4.6-.6-.2\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M127.3 215.3l.3-.4h.7l-.4.6-.6-.2\"/>\n <path fill=\"#fff\" d=\"M136.6 214.4c0-.3.2-.4.4-.4a.4.4 0 01.5.4.4.4 0 01-.5.4.4.4 0 01-.4-.4\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M136.6 214.4c0-.3.2-.4.4-.4a.4.4 0 01.5.4.4.4 0 01-.5.4.4.4 0 01-.4-.4z\"/>\n <path fill=\"#058e6e\" d=\"M139.3 214.9h.6a.3.3 0 00.4-.2.3.3 0 00-.3-.3l-.6-.1-.7-.1c-.2 0-.3 0-.4.2 0 .2.1.3.3.4h.7\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M139.3 214.9h.6a.3.3 0 00.4-.2.3.3 0 00-.3-.3l-.6-.1-.7-.1c-.2 0-.3 0-.4.2 0 .2.1.3.3.4h.7\"/>\n <path fill=\"#ad1519\" d=\"M142 215.4l-.3-.5h-.7l.3.6.6-.1\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M142 215.4l-.3-.5h-.7l.3.6.6-.1\"/>\n <path fill=\"#ad1519\" d=\"M134.6 217.1a25 25 0 01-6-.6 25.5 25.5 0 0112.1 0c-1.6.4-3.7.6-6 .6\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-linejoin=\"round\" stroke-width=\".3\" d=\"M134.6 217.1a25 25 0 01-6-.6 25.5 25.5 0 0112.1 0c-1.6.4-3.7.6-6 .6z\"/>\n <path fill=\"#c8b100\" d=\"M142 212l-.1-.3c-.2 0-.3 0-.4.2 0 .2 0 .4.2.4 0 0 .2 0 .3-.3\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M142 212l-.1-.3c-.2 0-.3 0-.4.2 0 .2 0 .4.2.4 0 0 .2 0 .3-.3z\"/>\n <path fill=\"#c8b100\" d=\"M137.3 211.2c0-.2 0-.4-.2-.4 0 0-.2.1-.2.3 0 .2 0 .4.2.4l.3-.3\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M137.3 211.2c0-.2 0-.4-.2-.4 0 0-.2.1-.2.3 0 .2 0 .4.2.4l.3-.3z\"/>\n <path fill=\"#c8b100\" d=\"M132 211.2l.1-.4c.2 0 .3.1.3.3 0 .2 0 .4-.2.4l-.2-.3\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M132 211.2l.1-.4c.2 0 .3.1.3.3 0 .2 0 .4-.2.4l-.2-.3z\"/>\n <path fill=\"#c8b100\" d=\"M127.3 212l.1-.3c.2 0 .3 0 .4.2 0 .2 0 .4-.2.4 0 0-.2 0-.3-.3\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M127.3 212l.1-.3c.2 0 .3 0 .4.2 0 .2 0 .4-.2.4 0 0-.2 0-.3-.3z\"/>\n <path fill=\"#c8b100\" d=\"M134.6 208.5l-.8.5.6 1.3.2.1.2-.1.7-1.3-.9-.5\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M134.6 208.5l-.8.5.6 1.3.2.1.2-.1.7-1.3-.9-.5\"/>\n <path fill=\"#c8b100\" d=\"M132.8 210.5l.4.5 1.3-.4.1-.2-.1-.2-1.3-.3-.4.6\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M132.8 210.5l.4.5 1.3-.4.1-.2-.1-.2-1.3-.3-.4.6\"/>\n <path fill=\"#c8b100\" d=\"M136.4 210.5l-.3.5-1.3-.4-.2-.2.2-.2 1.3-.3.3.6\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M136.4 210.5l-.3.5-1.3-.4-.2-.2.2-.2 1.3-.3.3.6\"/>\n <path fill=\"#c8b100\" d=\"M129.3 209l-.7.7.9 1 .2.1.1-.1.3-1.3-.8-.3\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M129.3 209l-.7.7.9 1 .2.1.1-.1.3-1.3-.8-.3\"/>\n <path fill=\"#c8b100\" d=\"M128 211.2l.4.5 1.2-.6v-.2l-.1-.2-1.3-.1-.3.6\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M128 211.2l.4.5 1.2-.6v-.2l-.1-.2-1.3-.1-.3.6\"/>\n <path fill=\"#c8b100\" d=\"M131.5 210.5l-.3.6H130l-.2-.2.1-.3 1.2-.6.5.5\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M131.5 210.5l-.3.6H130l-.2-.2.1-.3 1.2-.6.5.5\"/>\n <path fill=\"#c8b100\" d=\"M126.6 211.4v.6l-1.4.2-.2-.1v-.2l1-.9.6.4\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M126.6 211.4v.6l-1.4.2-.2-.1v-.2l1-.9.6.4\"/>\n <path fill=\"#c8b100\" d=\"M129.2 210.9c0-.3.2-.5.5-.5s.5.2.5.5a.5.5 0 01-.5.4.5.5 0 01-.5-.4\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M129.2 210.9c0-.3.2-.5.5-.5s.5.2.5.5a.5.5 0 01-.5.4.5.5 0 01-.5-.4z\"/>\n <path fill=\"#c8b100\" d=\"M140 209l.7.7-.9 1-.2.1-.1-.1-.3-1.3.8-.3\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M140 209l.7.7-.9 1-.2.1-.1-.1-.3-1.3.8-.3\"/>\n <path fill=\"#c8b100\" d=\"M141.4 211.2l-.5.5-1.2-.6v-.2l.1-.2 1.3-.1.3.6\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M141.4 211.2l-.5.5-1.2-.6v-.2l.1-.2 1.3-.1.3.6\"/>\n <path fill=\"#c8b100\" d=\"M137.8 210.5l.3.6h1.3l.2-.2-.1-.3-1.2-.6-.5.5\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M137.8 210.5l.3.6h1.3l.2-.2-.1-.3-1.2-.6-.5.5\"/>\n <path fill=\"#c8b100\" d=\"M142.5 211.4l.1.6 1.3.2.2-.1v-.2l-1-.9-.6.4\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M142.5 211.4l.1.6 1.3.2.2-.1v-.2l-1-.9-.6.4\"/>\n <path fill=\"#c8b100\" d=\"M134.2 210.4a.5.5 0 01.4-.4c.3 0 .5.2.5.4a.5.5 0 01-.5.5.5.5 0 01-.4-.5\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M134.2 210.4a.5.5 0 01.4-.4c.3 0 .5.2.5.4a.5.5 0 01-.5.5.5.5 0 01-.4-.5z\"/>\n <path fill=\"#c8b100\" d=\"M139.1 210.9c0-.3.3-.5.5-.5a.5.5 0 01.5.5.5.5 0 01-.5.4.5.5 0 01-.5-.4\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M139.1 210.9c0-.3.3-.5.5-.5a.5.5 0 01.5.5.5.5 0 01-.5.4.5.5 0 01-.5-.4z\"/>\n <path fill=\"#c8b100\" d=\"M124.8 212.2l-.6-.7c-.2-.2-.7-.3-.7-.3 0-.1.3-.3.6-.3a.5.5 0 01.4.2v-.2s.3 0 .4.3v1\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M124.8 212.2l-.6-.7c-.2-.2-.7-.3-.7-.3 0-.1.3-.3.6-.3a.5.5 0 01.4.2v-.2s.3 0 .4.3v1z\"/>\n <path fill=\"#c8b100\" d=\"M124.8 212c.1-.2.4-.2.5 0 .2.1.3.3.2.5l-.5-.1c-.2-.1-.3-.4-.2-.5\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M124.8 212c.1-.2.4-.2.5 0 .2.1.3.3.2.5l-.5-.1c-.2-.1-.3-.4-.2-.5z\"/>\n <path fill=\"#c8b100\" d=\"M144.3 212.2l.6-.7c.2-.2.7-.3.7-.3 0-.1-.3-.3-.6-.3a.6.6 0 00-.4.2v-.2s-.3 0-.4.3v.7l.1.3\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M144.3 212.2l.6-.7c.2-.2.7-.3.7-.3 0-.1-.3-.3-.6-.3a.6.6 0 00-.4.2v-.2s-.3 0-.4.3v.7l.1.3z\"/>\n <path fill=\"#c8b100\" d=\"M144.3 212c0-.2-.3-.2-.5 0-.2.1-.2.3-.1.5l.5-.1c.2-.1.2-.4.1-.5\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M144.3 212c0-.2-.3-.2-.5 0-.2.1-.2.3-.1.5l.5-.1c.2-.1.2-.4.1-.5z\"/>\n <path fill=\"#c8b100\" d=\"M124 223h21.4v-5.5H124v5.6z\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M124 223h21.4v-5.5H124v5.6z\"/>\n <path fill=\"#c8b100\" d=\"M126.2 226.8a1 1 0 01.4 0h16.5a1.4 1.4 0 01-1-1.2c0-.6.5-1.1 1-1.3a1.7 1.7 0 01-.4 0h-16a1.4 1.4 0 01-.5 0c.6.2 1 .7 1 1.3a1.3 1.3 0 01-1 1.2\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-linejoin=\"round\" stroke-width=\".4\" d=\"M126.2 226.8a1 1 0 01.4 0h16.5a1.4 1.4 0 01-1-1.2c0-.6.5-1.1 1-1.3a1.7 1.7 0 01-.4 0h-16a1.4 1.4 0 01-.5 0c.6.2 1 .7 1 1.3a1.3 1.3 0 01-1 1.2z\"/>\n <path fill=\"#c8b100\" d=\"M126.6 226.8h16c.6 0 1 .3 1 .7 0 .4-.4.8-1 .8h-16c-.5 0-1-.4-1-.8s.5-.8 1-.8\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M126.6 226.8h16c.6 0 1 .3 1 .7 0 .4-.4.8-1 .8h-16c-.5 0-1-.4-1-.8s.5-.8 1-.8z\"/>\n <path fill=\"#c8b100\" d=\"M126.6 223h16c.6 0 1 .4 1 .7 0 .4-.4.6-1 .6h-16c-.5 0-1-.2-1-.6 0-.3.5-.6 1-.6\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M126.6 223h16c.6 0 1 .4 1 .7 0 .4-.4.6-1 .6h-16c-.5 0-1-.2-1-.6 0-.3.5-.6 1-.6z\"/>\n <path fill=\"#005bbf\" d=\"M149.6 317.4c-1.4 0-2.8-.3-3.7-.8a8.4 8.4 0 00-3.8-.8c-1.4 0-2.7.3-3.7.8a8.3 8.3 0 01-3.8.8c-1.5 0-2.8-.3-3.7-.8a8.4 8.4 0 00-3.7-.8 8 8 0 00-3.7.8 8.3 8.3 0 01-3.8.8v2.4c1.5 0 2.8-.4 3.8-.9a8.2 8.2 0 013.7-.8c1.4 0 2.7.3 3.7.8s2.2.9 3.7.9a8.4 8.4 0 003.8-.9c1-.5 2.3-.8 3.7-.8 1.5 0 2.8.3 3.8.8s2.2.9 3.7.9v-2.4\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M149.6 317.4c-1.4 0-2.8-.3-3.7-.8a8.4 8.4 0 00-3.8-.8c-1.4 0-2.7.3-3.7.8a8.3 8.3 0 01-3.8.8c-1.5 0-2.8-.3-3.7-.8a8.4 8.4 0 00-3.7-.8 8 8 0 00-3.7.8 8.3 8.3 0 01-3.8.8v2.4c1.5 0 2.8-.4 3.8-.9a8.2 8.2 0 013.7-.8c1.4 0 2.7.3 3.7.8s2.2.9 3.7.9a8.4 8.4 0 003.8-.9c1-.5 2.3-.8 3.7-.8 1.5 0 2.8.3 3.8.8s2.2.9 3.7.9v-2.4z\"/>\n <path fill=\"#ccc\" d=\"M149.6 319.8a8 8 0 01-3.7-.9 8.3 8.3 0 00-3.8-.8c-1.4 0-2.7.3-3.7.8s-2.3.9-3.8.9-2.8-.4-3.7-.9a8.4 8.4 0 00-3.7-.8 8.2 8.2 0 00-3.7.8c-1 .5-2.3.9-3.8.9v2.3c1.5 0 2.8-.4 3.8-.9a8.1 8.1 0 013.7-.7c1.4 0 2.7.2 3.7.7a8.3 8.3 0 007.5 0 8.5 8.5 0 017.5.1 8.1 8.1 0 003.7.8v-2.3\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M149.6 319.8a8 8 0 01-3.7-.9 8.3 8.3 0 00-3.8-.8c-1.4 0-2.7.3-3.7.8s-2.3.9-3.8.9-2.8-.4-3.7-.9a8.4 8.4 0 00-3.7-.8 8.2 8.2 0 00-3.7.8c-1 .5-2.3.9-3.8.9v2.3c1.5 0 2.8-.4 3.8-.9a8.1 8.1 0 013.7-.7c1.4 0 2.7.2 3.7.7a8.3 8.3 0 007.5 0 8.5 8.5 0 017.5.1 8.1 8.1 0 003.7.8v-2.3\"/>\n <path fill=\"#005bbf\" d=\"M149.6 322a7 7 0 01-3.7-.8 8.3 8.3 0 00-3.8-.7c-1.4 0-2.7.2-3.7.7-1 .6-2.3.9-3.8.9s-2.8-.4-3.7-.9a8.4 8.4 0 00-3.7-.8 8 8 0 00-3.7.8c-1 .5-2.3.9-3.8.9v2.3c1.5 0 2.8-.3 3.8-.9a10.2 10.2 0 017.4 0 7 7 0 003.7.9 8.4 8.4 0 003.8-.8c1-.5 2.3-.8 3.7-.8 1.5 0 2.8.3 3.8.8s2.2.8 3.7.8V322\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M149.6 322a7 7 0 01-3.7-.8 8.3 8.3 0 00-3.8-.7c-1.4 0-2.7.2-3.7.7-1 .6-2.3.9-3.8.9s-2.8-.4-3.7-.9a8.4 8.4 0 00-3.7-.8 8 8 0 00-3.7.8c-1 .5-2.3.9-3.8.9v2.3c1.5 0 2.8-.3 3.8-.9a10.2 10.2 0 017.4 0 7 7 0 003.7.9 8.4 8.4 0 003.8-.8c1-.5 2.3-.8 3.7-.8 1.5 0 2.8.3 3.8.8s2.2.8 3.7.8V322\"/>\n <path fill=\"#ccc\" d=\"M149.6 326.7a8 8 0 01-3.7-.8c-1-.5-2.3-.8-3.7-.8a8.4 8.4 0 00-3.8.8c-1 .5-2.3.8-3.8.8a7 7 0 01-3.7-.9 8.4 8.4 0 00-3.7-.7c-1.4 0-2.7.3-3.7.8s-2.3.8-3.8.8v-2.3a8.3 8.3 0 003.8-.9 10.2 10.2 0 017.4 0 8 8 0 003.7.9 8.4 8.4 0 003.8-.8c1-.5 2.3-.8 3.8-.8 1.4 0 2.7.3 3.7.8s2.3.8 3.7.8v2.3\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M149.6 326.7a8 8 0 01-3.7-.8c-1-.5-2.3-.8-3.7-.8a8.4 8.4 0 00-3.8.8c-1 .5-2.3.8-3.8.8a7 7 0 01-3.7-.9 8.4 8.4 0 00-3.7-.7c-1.4 0-2.7.3-3.7.8s-2.3.8-3.8.8v-2.3a8.3 8.3 0 003.8-.9 10.2 10.2 0 017.4 0 8 8 0 003.7.9 8.4 8.4 0 003.8-.8c1-.5 2.3-.8 3.8-.8 1.4 0 2.7.3 3.7.8s2.3.8 3.7.8v2.3\"/>\n <path fill=\"#005bbf\" d=\"M149.6 329a8.1 8.1 0 01-3.7-.8c-1-.5-2.3-.8-3.7-.8a8.4 8.4 0 00-3.8.8c-1 .5-2.3.8-3.8.8a7 7 0 01-3.7-.9 8.4 8.4 0 00-3.7-.7c-1.4 0-2.7.3-3.7.8s-2.3.8-3.8.8v-2.3a8.3 8.3 0 003.8-.8c1-.5 2.3-.8 3.7-.8 1.4 0 2.7.3 3.7.7a8.4 8.4 0 007.5 0c1-.4 2.3-.7 3.8-.7 1.4 0 2.7.3 3.7.8s2.2.8 3.7.8v2.3\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M149.6 329a8.1 8.1 0 01-3.7-.8c-1-.5-2.3-.8-3.7-.8a8.4 8.4 0 00-3.8.8c-1 .5-2.3.8-3.8.8a7 7 0 01-3.7-.9 8.4 8.4 0 00-3.7-.7c-1.4 0-2.7.3-3.7.8s-2.3.8-3.8.8v-2.3a8.3 8.3 0 003.8-.8c1-.5 2.3-.8 3.7-.8 1.4 0 2.7.3 3.7.7a8.4 8.4 0 007.5 0c1-.4 2.3-.7 3.8-.7 1.4 0 2.7.3 3.7.8s2.2.8 3.7.8v2.3z\"/>\n <path fill=\"#c8b100\" d=\"M126.2 308l.2.5c0 1.5-1.3 2.6-2.7 2.6h22a2.7 2.7 0 01-2.7-2.6v-.5a1.3 1.3 0 01-.3 0h-16a1.4 1.4 0 01-.5 0\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-linejoin=\"round\" stroke-width=\".4\" d=\"M126.2 308l.2.5c0 1.5-1.3 2.6-2.7 2.6h22a2.7 2.7 0 01-2.7-2.6v-.5a1.3 1.3 0 01-.3 0h-16a1.4 1.4 0 01-.5 0z\"/>\n <path fill=\"#c8b100\" d=\"M126.6 306.5h16c.6 0 1 .3 1 .8 0 .4-.4.7-1 .7h-16c-.5 0-1-.3-1-.8 0-.4.5-.7 1-.7\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M126.6 306.5h16c.6 0 1 .3 1 .8 0 .4-.4.7-1 .7h-16c-.5 0-1-.3-1-.8 0-.4.5-.7 1-.7z\"/>\n <path fill=\"#c8b100\" d=\"M123.7 316.7h22V311h-22v5.6z\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M123.7 316.7h22V311h-22v5.6z\"/>\n <path fill=\"#ad1519\" d=\"M122 286.7c-2.2 1.2-3.7 2.5-3.4 3.2 0 .6.8 1 1.8 1.6 1.5 1.1 2.5 3 1.7 4a5.5 5.5 0 00-.1-8.8\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M122 286.7c-2.2 1.2-3.7 2.5-3.4 3.2 0 .6.8 1 1.8 1.6 1.5 1.1 2.5 3 1.7 4a5.5 5.5 0 00-.1-8.8z\"/>\n <path fill=\"#ccc\" d=\"M126.8 305.6h15.6V229h-15.6v76.5z\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M138 229.2v76.3m1.7-76.3v76.3m-12.9 0h15.6v-76.4h-15.6v76.5z\"/>\n <path fill=\"#ad1519\" d=\"M158.4 257.7a49.6 49.6 0 00-23.3-2c-9.4 1.6-16.5 5.3-15.9 8.4v.2l-3.5-8.2c-.6-3.3 7.2-7.5 17.6-9.2a43 43 0 019.2-.7c6.6 0 12.4.8 15.8 2.1v9.4\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-linejoin=\"round\" stroke-width=\".4\" d=\"M158.4 257.7a49.6 49.6 0 00-23.3-2c-9.4 1.6-16.5 5.3-15.9 8.4v.2l-3.5-8.2c-.6-3.3 7.2-7.5 17.6-9.2a43 43 0 019.2-.7c6.6 0 12.4.8 15.8 2.1v9.4\"/>\n <path fill=\"#ad1519\" d=\"M126.8 267.3c-4.3-.3-7.3-1.4-7.6-3.2-.3-1.5 1.2-3 3.8-4.5 1.2.1 2.5.3 3.8.3v7.4\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M126.8 267.3c-4.3-.3-7.3-1.4-7.6-3.2-.3-1.5 1.2-3 3.8-4.5 1.2.1 2.5.3 3.8.3v7.4\"/>\n <path fill=\"#ad1519\" d=\"M142.5 261.5c2.7.4 4.7 1 5.7 1.9l.1.2c.5 1-1.9 3-5.9 5.4v-7.5\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M142.5 261.5c2.7.4 4.7 1 5.7 1.9l.1.2c.5 1-1.9 3-5.9 5.4v-7.5\"/>\n <path fill=\"#ad1519\" d=\"M117.1 282c-.4-1.2 3.8-3.6 9.8-5.8l7.8-3.2c8.3-3.7 14.4-7.9 13.6-9.4v-.2c.4.4 1 8 1 8 .8 1.3-4.8 5.5-12.4 9.1-2.5 1.2-7.6 3-10 4-4.4 1.4-8.7 4.3-8.3 5.3l-1.5-7.7\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-linejoin=\"round\" stroke-width=\".4\" d=\"M117.1 282c-.4-1.2 3.8-3.6 9.8-5.8l7.8-3.2c8.3-3.7 14.4-7.9 13.6-9.4v-.2c.4.4 1 8 1 8 .8 1.3-4.8 5.5-12.4 9.1-2.5 1.2-7.6 3-10 4-4.4 1.4-8.7 4.3-8.3 5.3l-1.5-7.7z\"/>\n <path fill=\"#c8b100\" d=\"M125.8 254c1.9-.6 3.1-1.5 2.5-3-.4-1-1.4-1-2.8-.6l-2.6 1 2.3 5.8.8-.3.8-.3-1-2.5zm-1.2-2.7l.7-.3c.5-.2 1.2.1 1.4.8.2.5.2 1-.5 1.5a4.4 4.4 0 01-.6.3l-1-2.3m7.3-2.5l-.9.3h-.8l1.3 6.1 4.3-.8-.2-.4v-.4l-2.5.6-1.2-5.3m8.4 5.2c.8-2.2 1.7-4.3 2.7-6.4a5.3 5.3 0 01-1 0 54.8 54.8 0 01-1.8 4.6l-2.4-4.3-1 .1h-1a131.4 131.4 0 013.5 6h1m8.8-4.7l.4-.9a3.4 3.4 0 00-1.7-.6c-1.7-.1-2.7.6-2.8 1.7-.2 2.1 3.2 2 3 3.4 0 .6-.7.9-1.4.8-.8 0-1.4-.5-1.4-1.2h-.3a7.3 7.3 0 01-.4 1.1 4 4 0 001.8.6c1.7.2 3-.5 3.2-1.7.2-2-3.3-2.1-3.1-3.4 0-.5.4-.8 1.3-.7.7 0 1 .4 1.2.9h.2\"/>\n <path fill=\"#ad1519\" d=\"M277.9 211.6s-.7.8-1.3.9c-.5 0-1.1-.5-1.1-.5s-.5.5-1 .6c-.6.1-1.4-.6-1.4-.6l-1 1c-.6 0-1.1-.3-1.1-.3s-.3.4-.7.6h-.4l-.6-.4-.7-.7-.5-.3-.4-1v-.5c-.1-.6.8-1.4 2.2-1.7a3.9 3.9 0 012 0c.5-.5 1.7-.8 3-.8s2.4.3 3 .7a5.5 5.5 0 012.9-.7c1.3 0 2.5.3 3 .8.5-.2 1.2-.2 2 0 1.4.3 2.3 1 2.2 1.7v.5l-.4 1-.6.3-.6.7-.6.3s-.3.2-.4 0c-.4-.1-.7-.5-.7-.5s-.6.4-1 .2c-.5-.2-1-1-1-1s-.9.8-1.4.7c-.6-.1-1-.6-1-.6s-.7.6-1.2.5c-.5-.1-1.2-.9-1.2-.9\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M277.9 211.6s-.7.8-1.3.9c-.5 0-1.1-.5-1.1-.5s-.5.5-1 .6c-.6.1-1.4-.6-1.4-.6l-1 1c-.6 0-1.1-.3-1.1-.3s-.3.4-.7.6h-.4l-.6-.4-.7-.7-.5-.3-.4-1v-.5c-.1-.6.8-1.4 2.2-1.7a3.9 3.9 0 012 0c.5-.5 1.7-.8 3-.8s2.4.3 3 .7a5.5 5.5 0 012.9-.7c1.3 0 2.5.3 3 .8.5-.2 1.2-.2 2 0 1.4.3 2.3 1 2.2 1.7v.5l-.4 1-.6.3-.6.7-.6.3s-.3.2-.4 0c-.4-.1-.7-.5-.7-.5s-.6.4-1 .2c-.5-.2-1-1-1-1s-.9.8-1.4.7c-.6-.1-1-.6-1-.6s-.7.6-1.2.5c-.5-.1-1.2-.9-1.2-.9z\"/>\n <path fill=\"#c8b100\" d=\"M276.5 207.6c0-1 .6-2 1.3-2 .8 0 1.3 1 1.3 2s-.5 1.8-1.3 1.8c-.7 0-1.3-.8-1.3-1.9\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M276.5 207.6c0-1 .6-2 1.3-2 .8 0 1.3 1 1.3 2s-.5 1.8-1.3 1.8c-.7 0-1.3-.8-1.3-1.9z\"/>\n <path fill=\"#c8b100\" d=\"M277.3 207.6c0-1 .2-1.8.5-1.8.4 0 .7.8.7 1.8s-.3 1.7-.6 1.7c-.4 0-.6-.8-.6-1.8\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M277.3 207.6c0-1 .2-1.8.5-1.8.4 0 .7.8.7 1.8s-.3 1.7-.6 1.7c-.4 0-.6-.8-.6-1.8z\"/>\n <path fill=\"#c8b100\" d=\"M271 215.3a4.5 4.5 0 00-.5-1 27.4 27.4 0 0114.8 0l-.6.8a5.2 5.2 0 00-.3.8 22.9 22.9 0 00-6.6-.8c-2.6 0-5.2.3-6.6.8l-.2-.6\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M271 215.3a4.5 4.5 0 00-.5-1 27.4 27.4 0 0114.8 0l-.6.8a5.2 5.2 0 00-.3.8 22.9 22.9 0 00-6.6-.8c-2.6 0-5.2.3-6.6.8l-.2-.6\"/>\n <path fill=\"#c8b100\" d=\"M277.8 217.7c2.4 0 5-.4 5.9-.6.6-.2 1-.5 1-.8 0-.2-.2-.3-.4-.4a24.1 24.1 0 00-6.5-.8c-2.5 0-5 .3-6.4.8-.2 0-.3.2-.4.3 0 .4.3.7 1 .9 1 .2 3.5.6 5.8.6\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M277.8 217.7c2.4 0 5-.4 5.9-.6.6-.2 1-.5 1-.8 0-.2-.2-.3-.4-.4a24.1 24.1 0 00-6.5-.8c-2.5 0-5 .3-6.4.8-.2 0-.3.2-.4.3 0 .4.3.7 1 .9 1 .2 3.5.6 5.8.6z\"/>\n <path fill=\"#fff\" d=\"M283.5 208.4c0-.2.2-.4.4-.4s.5.2.5.4-.2.4-.5.4a.4.4 0 01-.4-.4\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".2\" d=\"M283.5 208.4c0-.2.2-.4.4-.4s.5.2.5.4-.2.4-.5.4a.4.4 0 01-.4-.4zm-.2-1.4a.4.4 0 01.4-.4c.2 0 .4.1.4.4s-.2.4-.4.4a.4.4 0 01-.4-.4zm-1.1-1c0-.2.2-.3.4-.3s.4.1.4.4c0 .2-.2.4-.4.4a.4.4 0 01-.4-.5zm-1.4-.4c0-.2.2-.4.4-.4.3 0 .5.2.5.4s-.2.4-.4.4-.5-.2-.5-.4zm-1.4 0c0-.2.2-.3.5-.3s.4.1.4.4c0 .2-.2.4-.4.4a.4.4 0 01-.5-.4z\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-linecap=\"round\" stroke-width=\".3\" d=\"M287.8 211.2l.2-1a2.7 2.7 0 00-2.7-2.8c-.5 0-1 .1-1.3.3\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M283 209.2l.2-.8c0-1.1-1.1-2-2.5-2-.6 0-1.2.2-1.6.4\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".2\" d=\"M288.2 210c0-.3.2-.5.4-.5s.4.2.4.4c0 .3-.2.4-.4.4s-.4-.1-.4-.4zm-.2-1.6c0-.2.2-.4.4-.4a.4.4 0 01.5.4c0 .2-.2.4-.4.4-.3 0-.5-.2-.5-.4zm-1-1.1a.4.4 0 01.5-.4c.2 0 .4.1.4.4a.4.4 0 01-.4.4.4.4 0 01-.5-.4zm-1.3-.7c0-.2.2-.4.5-.4s.4.2.4.4c0 .3-.2.5-.4.5a.4.4 0 01-.5-.5zm-1.4.1c0-.2.2-.4.5-.4s.4.2.4.4-.2.4-.4.4-.5-.2-.5-.4z\"/>\n <path fill=\"#c8b100\" d=\"M285.3 213.2l-.5-.5s-.6.3-1.3.2c-.6 0-.9-1-.9-1s-.7.7-1.3.7c-.7 0-1-.6-1-.6s-.7.5-1.3.4c-.6 0-1.2-.8-1.2-.8s-.6.8-1.2.8c-.6.1-1-.5-1-.5s-.3.6-1.1.7-1.4-.6-1.4-.6-.4.7-1 1c-.5 0-1.2-.4-1.2-.4l-.1.5-.3.1.1.5a27 27 0 017.3-.9c2.8 0 5.4.4 7.3 1l.2-.6\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M285.3 213.2l-.5-.5s-.6.3-1.3.2c-.6 0-.9-1-.9-1s-.7.7-1.3.7c-.7 0-1-.6-1-.6s-.7.5-1.3.4c-.6 0-1.2-.8-1.2-.8s-.6.8-1.2.8c-.6.1-1-.5-1-.5s-.3.6-1.1.7-1.4-.6-1.4-.6-.4.7-1 1c-.5 0-1.2-.4-1.2-.4l-.1.5-.3.1.1.5a27 27 0 017.3-.9c2.8 0 5.4.4 7.3 1l.2-.6z\"/>\n <path fill=\"#fff\" d=\"M271.3 208.4c0-.2.2-.4.4-.4s.4.2.4.4a.4.4 0 01-.4.4.4.4 0 01-.4-.4\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".2\" d=\"M271.3 208.4c0-.2.2-.4.4-.4s.4.2.4.4a.4.4 0 01-.4.4.4.4 0 01-.4-.4zm.2-1.4c0-.3.2-.4.4-.4s.5.1.5.4-.2.4-.5.4a.4.4 0 01-.4-.4zm1-1c0-.2.3-.3.5-.3s.5.1.5.4c0 .2-.2.4-.5.4a.4.4 0 01-.4-.5zm1.4-.4c0-.2.2-.4.5-.4s.4.2.4.4-.2.4-.4.4-.5-.2-.5-.4zm1.4 0c0-.2.2-.3.5-.3.2 0 .4.1.4.4 0 .2-.2.4-.4.4a.4.4 0 01-.5-.4z\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-linecap=\"round\" stroke-width=\".3\" d=\"M267.8 211.2a2.8 2.8 0 01-.2-1 2.7 2.7 0 012.7-2.8c.5 0 1 .1 1.4.3\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M272.7 209.2a1.7 1.7 0 01-.3-.8c0-1 1.2-2 2.6-2a3 3 0 011.5.4\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".2\" d=\"M266.6 210c0-.3.2-.5.4-.5.3 0 .4.2.4.4a.4.4 0 01-.4.4c-.2 0-.4-.1-.4-.4zm.1-1.6c0-.2.3-.4.5-.4s.4.2.4.4-.2.4-.4.4-.4-.2-.4-.4zm1-1.1c0-.3.2-.4.5-.4a.4.4 0 01.4.4.4.4 0 01-.4.4.4.4 0 01-.5-.4zm1.3-.7c0-.2.2-.4.5-.4.2 0 .4.2.4.4 0 .3-.2.5-.4.5a.4.4 0 01-.5-.5zm1.4.1c0-.2.2-.4.5-.4a.4.4 0 01.4.4.4.4 0 01-.4.4c-.3 0-.5-.2-.5-.4z\"/>\n <path fill=\"#c8b100\" d=\"M277.9 210.7h.2a1 1 0 000 .4c0 .6.5 1 1 1a1 1 0 001-.7l.2-.3v.4c.1.5.6.8 1.1.8.6 0 1-.4 1-1a.7.7 0 000-.1l.4-.4.2.5a1 1 0 00-.1.4 1 1 0 001 1c.4 0 .7-.2.9-.5l.2-.2v.3c0 .3.1.6.4.7 0 0 .4 0 1-.4s.7-.7.7-.7v.4s-.5.8-1 1c-.2.2-.5.4-.8.3-.3 0-.6-.3-.7-.6a1.5 1.5 0 01-.7.2c-.6 0-1.2-.3-1.4-.8a1.5 1.5 0 01-1.1.5c-.5 0-1-.2-1.2-.6a1.5 1.5 0 01-1 .4c-.6 0-1-.2-1.4-.6-.2.4-.7.6-1.2.6-.4 0-.8-.1-1-.4a1.6 1.6 0 01-1.3.6c-.4 0-.8-.2-1.1-.5-.2.5-.8.8-1.4.8-.2 0-.5 0-.7-.2-.1.3-.4.6-.7.6-.3 0-.6 0-.9-.2a4.2 4.2 0 01-1-1l.1-.5.8.7c.5.4.9.4.9.4.3 0 .4-.4.4-.7v-.3l.2.2c.2.3.5.5.9.5a1 1 0 001-1 1 1 0 000-.4v-.5l.4.4v.1c0 .6.5 1 1 1 .6 0 1-.3 1.1-.9v-.3l.2.3c.2.4.6.7 1 .7.6 0 1.1-.4 1.1-1a1 1 0 000-.3h.2\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M277.9 210.7h.2a1 1 0 000 .4c0 .6.5 1 1 1a1 1 0 001-.7l.2-.3v.4c.1.5.6.8 1.1.8.6 0 1-.4 1-1a.7.7 0 000-.1l.4-.4.2.5a1 1 0 00-.1.4 1 1 0 001 1c.4 0 .7-.2.9-.5l.2-.2v.3c0 .3.1.6.4.7 0 0 .4 0 1-.4s.7-.7.7-.7v.4s-.5.8-1 1c-.2.2-.5.4-.8.3-.3 0-.6-.3-.7-.6a1.5 1.5 0 01-.7.2c-.6 0-1.2-.3-1.4-.8a1.5 1.5 0 01-1.1.5c-.5 0-1-.2-1.2-.6a1.5 1.5 0 01-1 .4c-.6 0-1-.2-1.4-.6-.2.4-.7.6-1.2.6-.4 0-.8-.1-1-.4a1.6 1.6 0 01-1.3.6c-.4 0-.8-.2-1.1-.5-.2.5-.8.8-1.4.8-.2 0-.5 0-.7-.2-.1.3-.4.6-.7.6-.3 0-.6 0-.9-.2a4.2 4.2 0 01-1-1l.1-.5.8.7c.5.4.9.4.9.4.3 0 .4-.4.4-.7v-.3l.2.2c.2.3.5.5.9.5a1 1 0 001-1 1 1 0 000-.4v-.5l.4.4v.1c0 .6.5 1 1 1 .6 0 1-.3 1.1-.9v-.3l.2.3c.2.4.6.7 1 .7.6 0 1.1-.4 1.1-1a1 1 0 000-.3h.2z\"/>\n <path fill=\"#c8b100\" d=\"M277.8 213.3c-2.9 0-5.5.4-7.3 1l-.3-.2.1-.3c2-.6 4.6-1 7.5-1 3 0 5.7.4 7.6 1 0 0 .2.2.1.3l-.3.2a27 27 0 00-7.4-1\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M277.8 213.3c-2.9 0-5.5.4-7.3 1l-.3-.2.1-.3c2-.6 4.6-1 7.5-1 3 0 5.7.4 7.6 1 0 0 .2.2.1.3l-.3.2a27 27 0 00-7.4-1z\"/>\n <path fill=\"#fff\" d=\"M275 214.4c0-.3.2-.4.5-.4a.4.4 0 01.4.4.4.4 0 01-.4.4c-.3 0-.5-.2-.5-.4\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M275 214.4c0-.3.2-.4.5-.4a.4.4 0 01.4.4.4.4 0 01-.4.4c-.3 0-.5-.2-.5-.4z\"/>\n <path fill=\"#ad1519\" d=\"M277.9 214.5h-1c-.1 0-.3 0-.3-.3l.3-.3h2a.3.3 0 01.2.3.3.3 0 01-.3.3h-1\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M277.9 214.5h-1c-.1 0-.3 0-.3-.3l.3-.3h2a.3.3 0 01.2.3.3.3 0 01-.3.3h-1\"/>\n <path fill=\"#058e6e\" d=\"M273.2 214.9h-.6a.3.3 0 01-.4-.2.3.3 0 01.3-.3l.6-.1.7-.1c.2 0 .3 0 .4.2a.3.3 0 01-.3.4h-.7\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M273.2 214.9h-.6a.3.3 0 01-.4-.2.3.3 0 01.3-.3l.6-.1.7-.1c.2 0 .3 0 .4.2a.3.3 0 01-.3.4h-.7\"/>\n <path fill=\"#ad1519\" d=\"M270.5 215.3l.3-.4h.7l-.4.6-.6-.2\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M270.5 215.3l.3-.4h.7l-.4.6-.6-.2\"/>\n <path fill=\"#fff\" d=\"M279.8 214.4c0-.3.2-.4.4-.4.3 0 .5.1.5.4 0 .2-.2.4-.5.4a.4.4 0 01-.4-.4\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M279.8 214.4c0-.3.2-.4.4-.4.3 0 .5.1.5.4 0 .2-.2.4-.5.4a.4.4 0 01-.4-.4z\"/>\n <path fill=\"#058e6e\" d=\"M282.5 214.9h.7a.3.3 0 00.3-.2.3.3 0 00-.2-.3l-.7-.1-.7-.1c-.2 0-.3 0-.4.2 0 .2.1.3.3.4h.7\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M282.5 214.9h.7a.3.3 0 00.3-.2.3.3 0 00-.2-.3l-.7-.1-.7-.1c-.2 0-.3 0-.4.2 0 .2.1.3.3.4h.7\"/>\n <path fill=\"#ad1519\" d=\"M285.1 215.4l-.2-.5h-.7l.3.6.6-.1\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M285.1 215.4l-.2-.5h-.7l.3.6.6-.1\"/>\n <path fill=\"#ad1519\" d=\"M277.8 217.1a25 25 0 01-6-.6 25.4 25.4 0 016-.7c2.4 0 4.5.3 6.1.7-1.6.4-3.7.6-6 .6\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-linejoin=\"round\" stroke-width=\".3\" d=\"M277.8 217.1a25 25 0 01-6-.6 25.4 25.4 0 016-.7c2.4 0 4.5.3 6.1.7-1.6.4-3.7.6-6 .6z\"/>\n <path fill=\"#c8b100\" d=\"M285.2 212l-.1-.3c-.2 0-.3 0-.4.2l.1.4c.2 0 .3 0 .4-.3\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M285.2 212l-.1-.3c-.2 0-.3 0-.4.2l.1.4c.2 0 .3 0 .4-.3z\"/>\n <path fill=\"#c8b100\" d=\"M280.6 211.2c0-.2-.1-.4-.3-.4 0 0-.2.1-.2.3 0 .2 0 .4.2.4l.3-.3\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M280.6 211.2c0-.2-.1-.4-.3-.4 0 0-.2.1-.2.3 0 .2 0 .4.2.4l.3-.3z\"/>\n <path fill=\"#c8b100\" d=\"M275.2 211.2c0-.2 0-.4.2-.4l.3.3-.2.4c-.2 0-.3-.2-.3-.3\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M275.2 211.2c0-.2 0-.4.2-.4l.3.3-.2.4c-.2 0-.3-.2-.3-.3z\"/>\n <path fill=\"#c8b100\" d=\"M270.5 212l.1-.3c.2 0 .3 0 .4.2l-.1.4c-.2 0-.3 0-.4-.3\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M270.5 212l.1-.3c.2 0 .3 0 .4.2l-.1.4c-.2 0-.3 0-.4-.3z\"/>\n <path fill=\"#c8b100\" d=\"M277.8 208.5l-.8.5.6 1.3.2.1.3-.1.6-1.3-.9-.5\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M277.8 208.5l-.8.5.6 1.3.2.1.3-.1.6-1.3-.9-.5\"/>\n <path fill=\"#c8b100\" d=\"M276 210.5l.4.5 1.3-.4.1-.2-.1-.2-1.3-.3-.4.6\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M276 210.5l.4.5 1.3-.4.1-.2-.1-.2-1.3-.3-.4.6\"/>\n <path fill=\"#c8b100\" d=\"M279.6 210.5l-.3.5-1.3-.4-.1-.2v-.2l1.4-.3.4.6\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M279.6 210.5l-.3.5-1.3-.4-.1-.2v-.2l1.4-.3.4.6\"/>\n <path fill=\"#c8b100\" d=\"M272.5 209l-.7.7.9 1 .2.1.2-.1.2-1.3-.8-.3\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M272.5 209l-.7.7.9 1 .2.1.2-.1.2-1.3-.8-.3\"/>\n <path fill=\"#c8b100\" d=\"M271.1 211.2l.5.5 1.2-.6v-.2l-.1-.2-1.3-.1-.3.6\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M271.1 211.2l.5.5 1.2-.6v-.2l-.1-.2-1.3-.1-.3.6\"/>\n <path fill=\"#c8b100\" d=\"M274.7 210.5l-.3.6h-1.3l-.2-.2.1-.3 1.2-.6.5.5\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M274.7 210.5l-.3.6h-1.3l-.2-.2.1-.3 1.2-.6.5.5\"/>\n <path fill=\"#c8b100\" d=\"M269.8 211.4v.6l-1.4.2-.2-.1v-.2l1-.9.6.4\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M269.8 211.4v.6l-1.4.2-.2-.1v-.2l1-.9.6.4\"/>\n <path fill=\"#c8b100\" d=\"M272.4 210.9c0-.3.2-.5.5-.5a.5.5 0 01.5.5.5.5 0 01-.5.4.5.5 0 01-.5-.4\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M272.4 210.9c0-.3.2-.5.5-.5a.5.5 0 01.5.5.5.5 0 01-.5.4.5.5 0 01-.5-.4z\"/>\n <path fill=\"#c8b100\" d=\"M283.2 209l.7.7-.9 1-.2.1-.1-.1-.3-1.3.8-.3\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M283.2 209l.7.7-.9 1-.2.1-.1-.1-.3-1.3.8-.3\"/>\n <path fill=\"#c8b100\" d=\"M284.6 211.2l-.5.5-1.2-.6v-.2l.1-.2 1.3-.1.3.6\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M284.6 211.2l-.5.5-1.2-.6v-.2l.1-.2 1.3-.1.3.6\"/>\n <path fill=\"#c8b100\" d=\"M281 210.5l.3.6h1.3l.2-.2-.1-.3-1.2-.6-.5.5\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M281 210.5l.3.6h1.3l.2-.2-.1-.3-1.2-.6-.5.5\"/>\n <path fill=\"#c8b100\" d=\"M285.7 211.4v.6l1.4.2.2-.1v-.2l-1-.9-.6.4\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M285.7 211.4v.6l1.4.2.2-.1v-.2l-1-.9-.6.4\"/>\n <path fill=\"#c8b100\" d=\"M277.4 210.4c0-.2.2-.4.5-.4.2 0 .4.2.4.4 0 .3-.2.5-.4.5a.5.5 0 01-.5-.5\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M277.4 210.4c0-.2.2-.4.5-.4.2 0 .4.2.4.4 0 .3-.2.5-.4.5a.5.5 0 01-.5-.5z\"/>\n <path fill=\"#c8b100\" d=\"M282.3 210.9c0-.3.3-.5.5-.5.3 0 .5.2.5.5s-.2.4-.5.4a.5.5 0 01-.5-.4\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M282.3 210.9c0-.3.3-.5.5-.5.3 0 .5.2.5.5s-.2.4-.5.4a.5.5 0 01-.5-.4z\"/>\n <path fill=\"#c8b100\" d=\"M277 205.4c0-.5.4-.8.8-.8s1 .3 1 .8-.5.8-1 .8a.9.9 0 01-.8-.8\"/>\n <path fill=\"#c8b100\" d=\"M278.5 205.1v.6H277v-.6h.4v-1.3h-.5v-.5h.5v-.6h.6v.6h.6v.6h-.6v1.2h.4\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M278.5 205.1v.6H277v-.6h.4v-1.3h-.5v-.5h.5v-.6h.6v.6h.6v.6h-.6v1.2h.4z\"/>\n <path fill=\"#c8b100\" d=\"M279 205.1v.6h-2.4v-.6h1v-1.3h-.7v-.5h.6v-.6h.6v.6h.6v.6h-.6v1.2h1\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M278.1 204.6c.4 0 .6.4.6.8 0 .5-.4.8-.9.8a.9.9 0 01-.8-.8c0-.4.2-.7.6-.8\"/>\n <path fill=\"#c8b100\" d=\"M268 212.2l-.6-.7a2.3 2.3 0 00-.7-.3c0-.1.3-.3.6-.3.2 0 .3 0 .4.2v-.2s.3 0 .4.3v1\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M268 212.2l-.6-.7a2.3 2.3 0 00-.7-.3c0-.1.3-.3.6-.3.2 0 .3 0 .4.2v-.2s.3 0 .4.3v1z\"/>\n <path fill=\"#c8b100\" d=\"M268 212c.1-.2.4-.2.5 0 .2.1.3.3.1.5l-.5-.1c-.1-.1-.2-.4 0-.5\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M268 212c.1-.2.4-.2.5 0 .2.1.3.3.1.5l-.5-.1c-.1-.1-.2-.4 0-.5z\"/>\n <path fill=\"#c8b100\" d=\"M287.5 212.2l.6-.7c.2-.2.7-.3.7-.3 0-.1-.3-.3-.6-.3a.6.6 0 00-.4.2v-.2s-.3 0-.4.3v.7l.1.3\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M287.5 212.2l.6-.7c.2-.2.7-.3.7-.3 0-.1-.3-.3-.6-.3a.6.6 0 00-.4.2v-.2s-.3 0-.4.3v.7l.1.3z\"/>\n <path fill=\"#c8b100\" d=\"M287.5 212c-.1-.2-.3-.2-.5 0-.2.1-.2.3-.1.5l.5-.1c.2-.1.2-.4.1-.5\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M287.5 212c-.1-.2-.3-.2-.5 0-.2.1-.2.3-.1.5l.5-.1c.2-.1.2-.4.1-.5z\"/>\n <path fill=\"#c8b100\" d=\"M267.2 223h21.4v-5.5h-21.4v5.6z\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M267.2 223h21.4v-5.5h-21.4v5.6z\"/>\n <path fill=\"#c8b100\" d=\"M286.3 226.8a1 1 0 00-.4 0h-16.5c.6-.2 1-.7 1-1.2 0-.6-.4-1.1-1-1.3h17-.1c-.6.2-1 .7-1 1.3 0 .5.4 1 1 1.2\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-linejoin=\"round\" stroke-width=\".4\" d=\"M286.3 226.8a1 1 0 00-.4 0h-16.5c.6-.2 1-.7 1-1.2 0-.6-.4-1.1-1-1.3h17-.1c-.6.2-1 .7-1 1.3 0 .5.4 1 1 1.2z\"/>\n <path fill=\"#c8b100\" d=\"M269.9 226.8h16c.6 0 1 .3 1 .7 0 .4-.4.8-1 .8h-16c-.6 0-1-.4-1-.8s.5-.8 1-.8\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M269.9 226.8h16c.6 0 1 .3 1 .7 0 .4-.4.8-1 .8h-16c-.6 0-1-.4-1-.8s.5-.8 1-.8z\"/>\n <path fill=\"#c8b100\" d=\"M269.9 223h16c.6 0 1 .4 1 .7 0 .4-.4.6-1 .6h-16c-.6 0-1-.2-1-.6 0-.3.4-.6 1-.6\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M269.9 223h16c.6 0 1 .4 1 .7 0 .4-.4.6-1 .6h-16c-.6 0-1-.2-1-.6 0-.3.4-.6 1-.6z\"/>\n <path fill=\"#005bbf\" d=\"M263 317.4c1.4 0 2.7-.3 3.7-.8a8.4 8.4 0 013.7-.8c1.4 0 2.8.3 3.8.8s2.3.8 3.7.8c1.5 0 2.8-.3 3.8-.8a8.4 8.4 0 013.6-.8 8 8 0 013.7.8c1 .5 2.4.8 3.8.8v2.4a8.3 8.3 0 01-3.8-.9 8.2 8.2 0 00-3.7-.8c-1.4 0-2.7.3-3.6.8-1 .5-2.3.9-3.8.9a8 8 0 01-3.7-.9 8.4 8.4 0 00-3.8-.8 8.3 8.3 0 00-3.7.8c-1 .5-2.3.9-3.8.9v-2.4\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M263 317.4c1.4 0 2.7-.3 3.7-.8a8.4 8.4 0 013.7-.8c1.4 0 2.8.3 3.8.8s2.3.8 3.7.8c1.5 0 2.8-.3 3.8-.8a8.4 8.4 0 013.6-.8 8 8 0 013.7.8c1 .5 2.4.8 3.8.8v2.4a8.3 8.3 0 01-3.8-.9 8.2 8.2 0 00-3.7-.8c-1.4 0-2.7.3-3.6.8-1 .5-2.3.9-3.8.9a8 8 0 01-3.7-.9 8.4 8.4 0 00-3.8-.8 8.3 8.3 0 00-3.7.8c-1 .5-2.3.9-3.8.9v-2.4z\"/>\n <path fill=\"#ccc\" d=\"M263 319.8c1.4 0 2.7-.4 3.7-.9s2.3-.8 3.7-.8c1.4 0 2.8.3 3.8.8s2.3.9 3.7.9a8.2 8.2 0 003.8-.9 8.4 8.4 0 013.6-.8c1.5 0 2.8.3 3.7.8 1 .5 2.4.9 3.8.9v2.3a8.3 8.3 0 01-3.8-.9 8.1 8.1 0 00-3.7-.7c-1.4 0-2.7.2-3.6.7-1 .5-2.3.9-3.8.9a7 7 0 01-3.7-.9c-1-.4-2.3-.7-3.8-.7a8.3 8.3 0 00-3.7.7 8.1 8.1 0 01-3.8.9v-2.3\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M263 319.8c1.4 0 2.7-.4 3.7-.9s2.3-.8 3.7-.8c1.4 0 2.8.3 3.8.8s2.3.9 3.7.9a8.2 8.2 0 003.8-.9 8.4 8.4 0 013.6-.8c1.5 0 2.8.3 3.7.8 1 .5 2.4.9 3.8.9v2.3a8.3 8.3 0 01-3.8-.9 8.1 8.1 0 00-3.7-.7c-1.4 0-2.7.2-3.6.7-1 .5-2.3.9-3.8.9a7 7 0 01-3.7-.9c-1-.4-2.3-.7-3.8-.7a8.3 8.3 0 00-3.7.7 8.1 8.1 0 01-3.8.9v-2.3\"/>\n <path fill=\"#005bbf\" d=\"M263 322c1.4 0 2.7-.2 3.7-.8 1-.4 2.3-.7 3.7-.7 1.4 0 2.8.2 3.8.7s2.3.9 3.7.9a8.2 8.2 0 003.8-.9 8.4 8.4 0 013.6-.8 8 8 0 013.7.8c1 .5 2.4.9 3.8.9v2.3a8.3 8.3 0 01-3.8-.9 8.2 8.2 0 00-3.7-.7c-1.4 0-2.7.3-3.6.7-1 .6-2.3.9-3.8.9-1.4 0-2.8-.3-3.7-.8a8.4 8.4 0 00-3.8-.8 8.3 8.3 0 00-3.7.8c-1 .5-2.3.8-3.8.8V322\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M263 322c1.4 0 2.7-.2 3.7-.8 1-.4 2.3-.7 3.7-.7 1.4 0 2.8.2 3.8.7s2.3.9 3.7.9a8.2 8.2 0 003.8-.9 8.4 8.4 0 013.6-.8 8 8 0 013.7.8c1 .5 2.4.9 3.8.9v2.3a8.3 8.3 0 01-3.8-.9 8.2 8.2 0 00-3.7-.7c-1.4 0-2.7.3-3.6.7-1 .6-2.3.9-3.8.9-1.4 0-2.8-.3-3.7-.8a8.4 8.4 0 00-3.8-.8 8.3 8.3 0 00-3.7.8c-1 .5-2.3.8-3.8.8V322\"/>\n <path fill=\"#ccc\" d=\"M263 326.7a8 8 0 003.7-.8c1-.5 2.3-.8 3.7-.8 1.4 0 2.8.3 3.8.8s2.3.8 3.7.8c1.5 0 2.8-.3 3.8-.9a8.4 8.4 0 013.6-.7c1.5 0 2.8.3 3.7.8a8.3 8.3 0 003.8.8v-2.3a8.3 8.3 0 01-3.8-.9 8.2 8.2 0 00-3.7-.7c-1.4 0-2.7.3-3.6.7-1 .5-2.3.9-3.8.9-1.4 0-2.8-.3-3.7-.8a8.4 8.4 0 00-3.8-.8 8.3 8.3 0 00-3.7.8c-1 .5-2.3.8-3.8.8v2.3\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M263 326.7a8 8 0 003.7-.8c1-.5 2.3-.8 3.7-.8 1.4 0 2.8.3 3.8.8s2.3.8 3.7.8c1.5 0 2.8-.3 3.8-.9a8.4 8.4 0 013.6-.7c1.5 0 2.8.3 3.7.8a8.3 8.3 0 003.8.8v-2.3a8.3 8.3 0 01-3.8-.9 8.2 8.2 0 00-3.7-.7c-1.4 0-2.7.3-3.6.7-1 .5-2.3.9-3.8.9-1.4 0-2.8-.3-3.7-.8a8.4 8.4 0 00-3.8-.8 8.3 8.3 0 00-3.7.8c-1 .5-2.3.8-3.8.8v2.3\"/>\n <path fill=\"#005bbf\" d=\"M263 329a8.1 8.1 0 003.7-.8c1-.5 2.3-.8 3.7-.8 1.4 0 2.8.3 3.8.8s2.3.8 3.7.8a8.2 8.2 0 003.8-.9 8.4 8.4 0 013.6-.7c1.5 0 2.8.3 3.7.8 1 .5 2.4.8 3.8.8v-2.3a8.3 8.3 0 01-3.8-.8 8.2 8.2 0 00-3.7-.8 8.4 8.4 0 00-3.6.7 8.2 8.2 0 01-3.8.9c-1.4 0-2.8-.3-3.7-.8-1-.5-2.3-.8-3.8-.8-1.4 0-2.7.3-3.7.8s-2.3.8-3.8.8v2.3\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M263 329a8.1 8.1 0 003.7-.8c1-.5 2.3-.8 3.7-.8 1.4 0 2.8.3 3.8.8s2.3.8 3.7.8a8.2 8.2 0 003.8-.9 8.4 8.4 0 013.6-.7c1.5 0 2.8.3 3.7.8 1 .5 2.4.8 3.8.8v-2.3a8.3 8.3 0 01-3.8-.8 8.2 8.2 0 00-3.7-.8 8.4 8.4 0 00-3.6.7 8.2 8.2 0 01-3.8.9c-1.4 0-2.8-.3-3.7-.8-1-.5-2.3-.8-3.8-.8-1.4 0-2.7.3-3.7.8s-2.3.8-3.8.8v2.3z\"/>\n <path fill=\"#c8b100\" d=\"M286.3 308l-.1.5c0 1.5 1.2 2.6 2.7 2.6h-22c1.5 0 2.7-1.2 2.7-2.6l-.1-.5h16.8\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-linejoin=\"round\" stroke-width=\".4\" d=\"M286.3 308l-.1.5c0 1.5 1.2 2.6 2.7 2.6h-22c1.5 0 2.7-1.2 2.7-2.6l-.1-.5h16.8z\"/>\n <path fill=\"#c8b100\" d=\"M269.9 306.5h16c.6 0 1 .3 1 .8 0 .4-.4.7-1 .7h-16c-.6 0-1-.3-1-.8 0-.4.5-.7 1-.7\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M269.9 306.5h16c.6 0 1 .3 1 .8 0 .4-.4.7-1 .7h-16c-.6 0-1-.3-1-.8 0-.4.5-.7 1-.7z\"/>\n <path fill=\"#c8b100\" d=\"M266.9 316.7h22V311h-22v5.6z\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M266.9 316.7h22V311h-22v5.6z\"/>\n <path fill=\"#ad1519\" d=\"M290.6 286.7c2.1 1.2 3.6 2.5 3.4 3.2-.1.6-.8 1-1.8 1.6-1.6 1.1-2.5 3-1.8 4a5.5 5.5 0 01.2-8.8\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M290.6 286.7c2.1 1.2 3.6 2.5 3.4 3.2-.1.6-.8 1-1.8 1.6-1.6 1.1-2.5 3-1.8 4a5.5 5.5 0 01.2-8.8z\"/>\n <path fill=\"#ccc\" d=\"M270.1 305.6h15.6V229h-15.6v76.5z\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M281.4 229.1v76.3m1.8-76.3v76.3m-13 .2h15.5V229h-15.6v76.5z\"/>\n <path fill=\"#ad1519\" d=\"M254.2 257.7a49.6 49.6 0 0123.3-2c9.3 1.6 16.4 5.3 15.9 8.4v.2l3.5-8.2c.6-3.3-7.3-7.5-17.6-9.2a53.5 53.5 0 00-9.2-.7c-6.7 0-12.4.8-15.9 2.1v9.4\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-linejoin=\"round\" stroke-width=\".4\" d=\"M254.2 257.7a49.6 49.6 0 0123.3-2c9.3 1.6 16.4 5.3 15.9 8.4v.2l3.5-8.2c.6-3.3-7.3-7.5-17.6-9.2a53.5 53.5 0 00-9.2-.7c-6.7 0-12.4.8-15.9 2.1v9.4\"/>\n <path fill=\"#ad1519\" d=\"M285.7 267.3c4.4-.3 7.3-1.4 7.7-3.2.2-1.5-1.2-3-3.8-4.5-1.2.1-2.5.3-3.9.3v7.4\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M285.7 267.3c4.4-.3 7.3-1.4 7.7-3.2.2-1.5-1.2-3-3.8-4.5-1.2.1-2.5.3-3.9.3v7.4\"/>\n <path fill=\"#ad1519\" d=\"M270 261.5a13 13 0 00-5.7 1.9v.2c-.5 1 1.8 3 5.8 5.4v-7.5\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M270 261.5a13 13 0 00-5.7 1.9v.2c-.5 1 1.8 3 5.8 5.4v-7.5\"/>\n <path fill=\"#ad1519\" d=\"M295.4 282c.4-1.2-3.8-3.6-9.7-5.8-2.8-1-5-2-7.8-3.2-8.3-3.7-14.4-7.9-13.6-9.4v-.2c-.4.4-1 8-1 8-.8 1.3 4.8 5.5 12.4 9.1 2.4 1.2 7.6 3 10 4 4.3 1.4 8.7 4.3 8.3 5.3l1.4-7.7\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-linejoin=\"round\" stroke-width=\".4\" d=\"M295.4 282c.4-1.2-3.8-3.6-9.7-5.8-2.8-1-5-2-7.8-3.2-8.3-3.7-14.4-7.9-13.6-9.4v-.2c-.4.4-1 8-1 8-.8 1.3 4.8 5.5 12.4 9.1 2.4 1.2 7.6 3 10 4 4.3 1.4 8.7 4.3 8.3 5.3l1.4-7.7z\"/>\n <path fill=\"#c8b100\" d=\"M263.9 254.4c.6-2.3 1.4-4.4 2.1-6.6h-.5a5.2 5.2 0 01-.5.1 52.8 52.8 0 01-1.4 4.8c-1-1.4-2-2.7-2.7-4.1l-1 .2h-1a131.3 131.3 0 014 5.7h.5l.5-.1m6-6.6h-1a8 8 0 01-.8 0v6.2h4.2v-.7h-2.6l.1-5.5m6.8 1l2 .3v-.7l-5.8-.5v.8a19.3 19.3 0 012 0l-.4 5.6h1.6l.5-5.4m2.4 6c.3 0 .5 0 .8.2l.8.2.7-2.9.6 1.2.8 2.1 1 .2c.4 0 .7.2 1 .3l-.3-.7c-.4-1-1-1.9-1.3-2.9 1 0 1.9-.3 2.1-1.2.1-.6 0-1-.7-1.5-.4-.3-1.2-.4-1.7-.5l-2.4-.5-1.4 6m3-5.2c.7.2 1.5.3 1.5 1v.5c-.3.9-1 1.2-2 .9l.5-2.4m8 7l-.2 2 .8.5.9.5.5-7a3.4 3.4 0 01-.7-.3l-6.1 3.8.5.3.4.2 1.7-1.2 2.3 1.3zm-1.7-1.5l2-1.4-.2 2.3-1.8-1\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".1\" d=\"M182.2 192.4c0-1 1-2 2-2s2.2 1 2.2 2c0 1.1-1 2-2.1 2a2 2 0 01-2.1-2z\"/>\n <path fill=\"#ad1519\" stroke=\"#000\" stroke-width=\".3\" d=\"M205.7 175.4c6.3 0 12 1 15.7 2.4a31.7 31.7 0 0014.6 2.3c2.7 0 6.5.8 10.3 2.4a27.3 27.3 0 017.4 4.7l-1.5 1.4-.4 3.8-4.1 4.7-2 1.8-5 3.9-2.5.2-.7 2.1-31.6-3.7-31.7 3.7-.8-2.1-2.5-.2-4.9-4-2-1.7-4.1-4.7-.5-3.8-1.5-1.4a27.6 27.6 0 017.5-4.7 26 26 0 0110.2-2.4c2 .2 4.2.1 6.6-.2a30 30 0 008-2c3.7-1.5 9-2.5 15.5-2.5z\"/>\n <path fill=\"#c8b100\" stroke=\"#000\" stroke-width=\".4\" d=\"M206.2 217.1c-11.8 0-22.4-1.4-29.9-3.6a1.1 1.1 0 01-.8-1.2c0-.5.3-1 .8-1.2a109 109 0 0129.9-3.6c11.7 0 22.3 1.4 29.8 3.6a1.3 1.3 0 010 2.4c-7.5 2.2-18 3.6-29.8 3.6\"/>\n <path fill=\"#ad1519\" d=\"M206.1 215.6c-10.6 0-20.2-1.2-27.5-3.1 7.3-2 16.9-3 27.5-3.1a115 115 0 0127.6 3c-7.3 2-17 3.2-27.6 3.2\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".1\" d=\"M206.9 215.7v-6.3m-1.7 6.3v-6.3\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".2\" d=\"M203.6 215.7v-6.3m-1.6 6.3v-6.3\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M200.6 215.7v-6.3m-2.8 5.9v-5.7m1.3 5.8v-6m-3.8 5.6v-5.2m1.3 5.4v-5.6\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M192 214.8V210m1 4.7V210m1.2 5v-5m-3.4 4.7v-4.5\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".5\" d=\"M189.7 214.5v-4.2m-1.2 4.1v-4\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".6\" d=\"M186 214v-3m1.3 3.2v-3.5m-2.5 3.1V211\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".7\" d=\"M183.7 213.6v-2.3m-1.3 2v-1.8m-1.2 1.6v-1.3\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".9\" d=\"M179.8 212.8v-.7\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".1\" d=\"M213.7 215.3v-5.8m-2.9 6v-6.1m-2.1 6.2v-6.3\"/>\n <path fill=\"#c8b100\" stroke=\"#000\" stroke-width=\".4\" d=\"M206 207.4a108 108 0 00-30 3.9c.6-.3.5-1-.3-3-1-2.5-2.4-2.4-2.4-2.4 8.3-2.5 20-4 32.8-4a123 123 0 0133 4s-1.5-.1-2.5 2.3c-.8 2-.8 2.8-.2 3-7.5-2.2-18.4-3.7-30.3-3.7\"/>\n <path fill=\"#c8b100\" stroke=\"#000\" stroke-width=\".4\" d=\"M206.1 201.9c-12.9 0-24.5 1.5-32.8 4a1 1 0 01-1.3-.6 1 1 0 01.7-1.3 121 121 0 0133.4-4.2c13.2 0 25.2 1.7 33.5 4.2.6.2.9.8.7 1.3-.2.5-.8.8-1.3.6-8.4-2.5-20-4-32.9-4\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-linejoin=\"round\" stroke-width=\".4\" d=\"M206.1 215.6c-10.6 0-20.2-1.2-27.5-3.1 7.3-2 16.9-3 27.5-3.1a115 115 0 0127.6 3c-7.3 2-17 3.2-27.6 3.2z\"/>\n <path fill=\"#fff\" stroke=\"#000\" stroke-width=\".4\" d=\"M197 204.8c0-.5.4-1 1-1 .5 0 1 .5 1 1s-.4 1-1 1a1 1 0 01-1-1\"/>\n <path fill=\"#ad1519\" stroke=\"#000\" stroke-width=\".4\" d=\"M206.1 205.6H203a1 1 0 010-2h6.4c.5 0 1 .5 1 1s-.5 1-1 1h-3.2\"/>\n <path fill=\"#058e6e\" stroke=\"#000\" stroke-width=\".4\" d=\"M190.3 206.5l-2.3.2c-.6.1-1-.3-1.2-.8a1 1 0 011-1.1l2.2-.3 2.4-.3c.5 0 1 .3 1.1.9.1.5-.3 1-.9 1l-2.3.4\"/>\n <path fill=\"#fff\" stroke=\"#000\" stroke-width=\".4\" d=\"M181 206.7c0-.6.5-1 1.1-1 .6 0 1 .4 1 1 0 .5-.4 1-1 1a1 1 0 01-1-1\"/>\n <path fill=\"#ad1519\" stroke=\"#000\" stroke-width=\".4\" d=\"M174 208.5l1.2-1.6 3.3.4-2.6 2-1.8-.8\"/>\n <path fill=\"#058e6e\" stroke=\"#000\" stroke-width=\".4\" d=\"M222 206.5l2.3.2c.5.1 1-.3 1.1-.8a1 1 0 00-.9-1.1l-2.2-.3-2.4-.3a1 1 0 00-1.1.9c-.1.5.3 1 .9 1l2.3.4\"/>\n <path fill=\"#fff\" stroke=\"#000\" stroke-width=\".4\" d=\"M213.3 204.8c0-.5.4-1 1-1s1 .5 1 1-.4 1-1 1a1 1 0 01-1-1m15.8 1.9c0-.6.5-1 1-1 .6 0 1.1.4 1.1 1 0 .5-.4 1-1 1a1 1 0 01-1-1\"/>\n <path fill=\"#ad1519\" stroke=\"#000\" stroke-width=\".4\" d=\"M238.2 208.5l-1.1-1.6-3.3.4 2.6 2 1.8-.8\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M177.3 212.8c7.4-2.1 17.6-3.4 28.8-3.4 11.3 0 21.4 1.3 28.9 3.4\"/>\n <path fill=\"#c8b100\" d=\"M182.3 183.8l1.4 1 2-3.2a7.4 7.4 0 01-3.6-7.2c.2-4.1 5.2-7.6 11.7-7.6 3.3 0 6.3 1 8.5 2.4 0-.6 0-1.2.2-1.8a17.4 17.4 0 00-8.7-2.1c-7.4 0-13.2 4.1-13.5 9.1a8.9 8.9 0 003 7.6l-1 1.8\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M182.3 183.8l1.4 1 2-3.2a7.4 7.4 0 01-3.6-7.2c.2-4.1 5.2-7.6 11.7-7.6 3.3 0 6.3 1 8.5 2.4 0-.6 0-1.2.2-1.8a17.4 17.4 0 00-8.7-2.1c-7.4 0-13.2 4.1-13.5 9.1a8.9 8.9 0 003 7.6l-1 1.8\"/>\n <path fill=\"#c8b100\" d=\"M182.4 183.8a9.3 9.3 0 01-4-7.3c0-3.2 2-6.1 5.3-8a8.5 8.5 0 00-3.4 6.8 8.9 8.9 0 003 6.7l-.9 1.8\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M182.4 183.8a9.3 9.3 0 01-4-7.3c0-3.2 2-6.1 5.3-8a8.5 8.5 0 00-3.4 6.8 8.9 8.9 0 003 6.7l-.9 1.8\"/>\n <path fill=\"#c8b100\" d=\"M160.1 187.1a8.8 8.8 0 01-2.3-5.9c0-1.3.3-2.6 1-3.8 2-4.2 8.4-7.2 16-7.2 2 0 4 .2 5.9.6l-1 1.4a25.5 25.5 0 00-4.9-.4c-7 0-12.8 2.7-14.5 6.3a7 7 0 00-.7 3.1 7.3 7.3 0 002.7 5.6l-2.6 4.1-1.3-1 1.7-2.8\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M160.1 187.1a8.8 8.8 0 01-2.3-5.9c0-1.3.3-2.6 1-3.8 2-4.2 8.4-7.2 16-7.2 2 0 4 .2 5.9.6l-1 1.4a25.5 25.5 0 00-4.9-.4c-7 0-12.8 2.7-14.5 6.3a7 7 0 00-.7 3.1 7.3 7.3 0 002.7 5.6l-2.6 4.1-1.3-1 1.7-2.8z\"/>\n <path fill=\"#c8b100\" d=\"M162.7 173.3a10.5 10.5 0 00-4 4.1 8.6 8.6 0 00-.9 3.8c0 2.3.9 4.3 2.3 5.9l-1.5 2.5a10.4 10.4 0 01-2.3-6.5c0-4 2.5-7.5 6.4-9.8\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M162.7 173.3a10.5 10.5 0 00-4 4.1 8.6 8.6 0 00-.9 3.8c0 2.3.9 4.3 2.3 5.9l-1.5 2.5a10.4 10.4 0 01-2.3-6.5c0-4 2.5-7.5 6.4-9.8z\"/>\n <path fill=\"#c8b100\" d=\"M206 164.4c1.7 0 3.2 1.1 3.5 2.6.3 1.4.4 2.9.4 4.5v1.1c.1 3.3.6 6.3 1.3 8.1l-5.2 5-5.2-5c.7-1.8 1.2-4.8 1.3-8.1v-1.1c0-1.6.2-3.1.4-4.5.3-1.5 1.8-2.6 3.5-2.6\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M206 164.4c1.7 0 3.2 1.1 3.5 2.6.3 1.4.4 2.9.4 4.5v1.1c.1 3.3.6 6.3 1.3 8.1l-5.2 5-5.2-5c.7-1.8 1.2-4.8 1.3-8.1v-1.1c0-1.6.2-3.1.4-4.5.3-1.5 1.8-2.6 3.5-2.6z\"/>\n <path fill=\"#c8b100\" d=\"M206 166c1 0 1.7.6 1.8 1.4.2 1.2.4 2.6.4 4.2v1c.1 3.2.6 6 1.2 7.7l-3.4 3.2-3.4-3.2c.7-1.7 1.1-4.5 1.2-7.7v-1a28.1 28.1 0 01.4-4.2 2 2 0 011.8-1.4\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M206 166c1 0 1.7.6 1.8 1.4.2 1.2.4 2.6.4 4.2v1c.1 3.2.6 6 1.2 7.7l-3.4 3.2-3.4-3.2c.7-1.7 1.1-4.5 1.2-7.7v-1a28.1 28.1 0 01.4-4.2 2 2 0 011.8-1.4z\"/>\n <path fill=\"#c8b100\" d=\"M229.7 183.8l-1.3 1-2-3.2a7.4 7.4 0 003.6-6.3 7 7 0 000-.9c-.2-4.1-5.3-7.6-11.7-7.6a15 15 0 00-8.5 2.4 23 23 0 00-.2-1.8 17.4 17.4 0 018.7-2.1c7.4 0 13.2 4.1 13.4 9.1a8.9 8.9 0 01-3 7.6l1 1.8\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M229.7 183.8l-1.3 1-2-3.2a7.4 7.4 0 003.6-6.3 7 7 0 000-.9c-.2-4.1-5.3-7.6-11.7-7.6a15 15 0 00-8.5 2.4 23 23 0 00-.2-1.8 17.4 17.4 0 018.7-2.1c7.4 0 13.2 4.1 13.4 9.1a8.9 8.9 0 01-3 7.6l1 1.8\"/>\n <path fill=\"#c8b100\" d=\"M229.6 183.8a9.1 9.1 0 004.1-7.3c0-3.2-2.1-6.1-5.3-8a8.5 8.5 0 013.4 6.8 8.9 8.9 0 01-3.2 6.7l1 1.8\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M229.6 183.8a9.1 9.1 0 004.1-7.3c0-3.2-2.1-6.1-5.3-8a8.5 8.5 0 013.4 6.8 8.9 8.9 0 01-3.2 6.7l1 1.8\"/>\n <path fill=\"#c8b100\" d=\"M252 187.1a8.8 8.8 0 002.2-5.9 8.7 8.7 0 00-.9-3.8c-2-4.2-8.4-7.2-16-7.2a29 29 0 00-6 .6l1 1.4a25.4 25.4 0 015-.4c7 0 12.8 2.7 14.4 6.3.5 1 .7 2 .7 3.1a7.3 7.3 0 01-2.6 5.6l2.5 4.1 1.3-1-1.7-2.8\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M252 187.1a8.8 8.8 0 002.2-5.9 8.7 8.7 0 00-.9-3.8c-2-4.2-8.4-7.2-16-7.2a29 29 0 00-6 .6l1 1.4a25.4 25.4 0 015-.4c7 0 12.8 2.7 14.4 6.3.5 1 .7 2 .7 3.1a7.3 7.3 0 01-2.6 5.6l2.5 4.1 1.3-1-1.7-2.8z\"/>\n <path fill=\"#c8b100\" d=\"M249.3 173.3a10.6 10.6 0 014 4.1 8.7 8.7 0 01.9 3.8 8.8 8.8 0 01-2.3 5.9l1.6 2.5a10.4 10.4 0 002.3-6.5c0-4-2.6-7.5-6.5-9.8\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M249.3 173.3a10.6 10.6 0 014 4.1 8.7 8.7 0 01.9 3.8 8.8 8.8 0 01-2.3 5.9l1.6 2.5a10.4 10.4 0 002.3-6.5c0-4-2.6-7.5-6.5-9.8z\"/>\n <path fill=\"#fff\" d=\"M204.2 181.4c0-1 .8-1.8 1.8-1.8s1.9.8 1.9 1.8-.9 1.7-1.9 1.7a1.8 1.8 0 01-1.8-1.7\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M204.2 181.4c0-1 .8-1.8 1.8-1.8s1.9.8 1.9 1.8-.9 1.7-1.9 1.7a1.8 1.8 0 01-1.8-1.7z\"/>\n <path fill=\"#fff\" stroke=\"#000\" stroke-width=\".4\" d=\"M204.2 178c0-1 .8-1.8 1.8-1.8s1.9.8 1.9 1.8-.9 1.7-1.9 1.7a1.8 1.8 0 01-1.8-1.7m.4-3.7c0-.7.6-1.3 1.4-1.3.8 0 1.5.6 1.5 1.3 0 .8-.7 1.4-1.5 1.4s-1.4-.6-1.4-1.4m.4-3.3c0-.5.4-1 1-1s1 .5 1 1-.4 1-1 1a1 1 0 01-1-1m.2-2.8c0-.5.4-.8.8-.8.5 0 .9.3.9.8 0 .4-.4.8-.9.8a.8.8 0 01-.8-.8\"/>\n <path fill=\"#c8b100\" stroke=\"#000\" stroke-width=\".4\" d=\"M206.2 191.8l1.2.2a4.6 4.6 0 004.5 6 4.7 4.7 0 004.4-3c.1 0 .5-1.7.7-1.7.2 0 .1 1.8.2 1.7.3 2.3 2.4 3.8 4.7 3.8a4.6 4.6 0 004.7-5l1.5-1.5.7 2a4 4 0 00-.4 1.9 4.4 4.4 0 004.5 4.2c1.6 0 3-.7 3.8-1.9l.9-1.2v1.5c0 1.5.6 2.8 2 3 0 0 1.7.1 4-1.6 2.1-1.7 3.3-3.1 3.3-3.1l.2 1.7s-1.8 2.8-3.8 4c-1 .6-2.7 1.3-4 1-1.4-.2-2.4-1.3-3-2.6a6.7 6.7 0 01-3.3 1 6.5 6.5 0 01-6.1-3.7 7 7 0 01-10.4-.3 7 7 0 01-4.6 1.8 6.9 6.9 0 01-5.7-3 6.9 6.9 0 01-5.7 3 7 7 0 01-4.7-1.8 7 7 0 01-10.4.3 6.5 6.5 0 01-6 3.7 6.7 6.7 0 01-3.4-1c-.6 1.3-1.5 2.4-3 2.7-1.2.2-2.9-.5-4-1.1-2-1.2-3.8-4-3.8-4l.2-1.7s1.2 1.4 3.4 3.1c2.2 1.8 3.9 1.6 3.9 1.6 1.4-.2 2-1.5 2-3v-1.5l1 1.2a4.6 4.6 0 003.7 2c2.5 0 4.5-2 4.5-4.3a4 4 0 00-.4-2l.8-1.9 1.5 1.5a4.4 4.4 0 000 .6c0 2.4 2 4.4 4.6 4.4 2.4 0 4.4-1.5 4.7-3.8 0 0 0-1.6.2-1.7.2 0 .6 1.7.7 1.6a4.7 4.7 0 004.5 3.1 4.6 4.6 0 004.5-6l1.2-.2\"/>\n <path fill=\"#fff\" stroke=\"#000\" stroke-width=\".4\" d=\"M238.6 197.7c.3-.8 0-1.6-.6-1.8-.5-.2-1.2.3-1.5 1.1-.3.8 0 1.6.6 1.8.5.2 1.2-.3 1.5-1.1m-20.5-4c0-.8-.3-1.6-1-1.6-.5-.1-1 .5-1.2 1.4-.1.8.3 1.5.9 1.6.6 0 1.2-.6 1.3-1.4m-23.9 0c0-.8.4-1.6 1-1.6.6-.1 1.1.5 1.2 1.4.1.8-.3 1.5-.9 1.6-.6 0-1.1-.6-1.2-1.4m-20.6 4c-.2-.8 0-1.6.6-1.8.6-.2 1.2.3 1.5 1.1.3.8 0 1.6-.5 1.8-.6.2-1.3-.3-1.6-1.1\"/>\n <path fill=\"#c8b100\" stroke=\"#000\" stroke-width=\".4\" d=\"M182.7 184a5.1 5.1 0 012.2 2.9s0-.3.6-.6 1-.3 1-.3l-.1 1.3-.3 2.2a7.4 7.4 0 01-.7 1.6 1.9 1.9 0 00-1.5-.4 1.8 1.8 0 00-1.2.9s-.7-.6-1.2-1.3l-1.1-2-.7-1.1s.5-.2 1.1 0c.6 0 .8.2.8.2a4.9 4.9 0 011-3.4m.4 9.8a1.8 1.8 0 01-.6-1c0-.5 0-.9.3-1.2 0 0-.9-.5-1.8-.7-.7-.2-2-.2-2.3-.2h-1l.2.5c.2.5.5.7.5.7a5 5 0 00-3 2 5.3 5.3 0 003.5 1l-.2.8v.6l1-.4c.3-.1 1.5-.5 2-1 .8-.4 1.5-1.1 1.5-1.1m2.7-.5a1.6 1.6 0 00.2-1.1 1.7 1.7 0 00-.6-1l1.4-1.3a10 10 0 012-.9l1.1-.4v.6a5.7 5.7 0 01-.2.8 5 5 0 013.4 1 5 5 0 01-2.9 2 6.4 6.4 0 00.7 1.2h-1c-.4 0-1.6 0-2.3-.2a11 11 0 01-1.8-.7\"/>\n <path fill=\"#ad1519\" stroke=\"#000\" stroke-width=\".4\" d=\"M182.2 192.4c0-1 1-2 2-2s2.2 1 2.2 2c0 1.1-1 2-2.1 2a2 2 0 01-2.1-2\"/>\n <path fill=\"#c8b100\" stroke=\"#000\" stroke-width=\".4\" d=\"M206.1 180.8a5.7 5.7 0 011.9 3.7s.2-.3.9-.5c.7-.3 1.2-.2 1.2-.2l-.5 1.4-.8 2.4a8.2 8.2 0 01-1 1.7 2.1 2.1 0 00-1.7-.7c-.6 0-1.2.3-1.6.7 0 0-.6-.7-1-1.7l-.8-2.4-.5-1.4 1.2.2c.7.2.9.5.9.5 0-1.4.8-2.8 1.8-3.7\"/>\n <path fill=\"#c8b100\" stroke=\"#000\" stroke-width=\".4\" d=\"M204.6 191.8a2 2 0 01-.5-1.2c0-.5.1-1 .4-1.3 0 0-.8-.7-1.8-1-.7-.4-2-.7-2.5-.7l-1.2-.2.2.6.4.9a5.9 5.9 0 00-3.7 1.7c1 .9 2.3 1.6 3.7 1.6l-.4 1-.2.6 1.2-.2c.4-.1 1.8-.4 2.5-.7 1-.4 1.9-1 1.9-1m3 0a1.9 1.9 0 00.1-2.6s.9-.7 1.8-1a8 8 0 012.5-.7l1.2-.3-.1.7-.4.9c1.4 0 2.7.8 3.6 1.7a5.9 5.9 0 01-3.6 1.6 6.9 6.9 0 00.5 1.6l-1.2-.2-2.5-.7c-1-.4-1.8-1-1.8-1m22-8a5.2 5.2 0 00-2.2 3l-.7-.6c-.6-.3-1-.3-1-.3l.2 1.3c0 .3 0 1.3.3 2.2.2 1 .6 1.6.6 1.6a2 2 0 011.5-.4c.6.1 1 .5 1.3.9l1.1-1.3c.6-.8 1-1.7 1.1-2l.7-1.1s-.4-.2-1 0c-.7 0-1 .2-1 .2a4.9 4.9 0 00-1-3.4m-.3 9.8c.3-.3.5-.6.6-1a1.6 1.6 0 00-.2-1.2s.8-.5 1.7-.7c.7-.2 2-.2 2.3-.2h1.1l-.3.5a6.2 6.2 0 01-.4.7 5 5 0 012.9 2 5.3 5.3 0 01-3.5 1l.2.8v.6l-1-.4c-.3-.1-1.4-.5-2-1-.8-.4-1.4-1.1-1.4-1.1m-2.8-.5a1.7 1.7 0 01-.2-1.1c0-.5.3-.8.6-1 0 0-.6-.8-1.4-1.3-.6-.4-1.7-.8-2-.9a171.4 171.4 0 01-1-.4v.6c0 .5.2.8.2.8a5.2 5.2 0 00-3.5 1c.7.9 1.7 1.7 3 2 0 0-.3.2-.5.7l-.3.5h1c.4 0 1.7 0 2.3-.2a11.1 11.1 0 001.8-.7\"/>\n <path fill=\"#ad1519\" stroke=\"#000\" stroke-width=\".4\" d=\"M226 192.4c0-1 1-2 2-2s2.1 1 2.1 2a2 2 0 01-2 2 2 2 0 01-2.1-2m23.2 4.4c-.4-.5-1.4-.4-2.2.2-.8.7-1 1.6-.5 2.2.5.5 1.5.4 2.3-.3.7-.6 1-1.6.5-2\"/>\n <path fill=\"#c8b100\" stroke=\"#000\" stroke-width=\".4\" d=\"M246.3 198l.7-1c.7-.6 1.8-.7 2.3-.2l.1.2s1-2 2.3-2.6c1.3-.7 3.4-.5 3.4-.5a2.8 2.8 0 00-2.9-2.8 3 3 0 00-2.4 1l-.2-1s-1.3.3-1.9 1.8c-.6 1.5 0 3.6 0 3.6s-.3-.9-.7-1.5a8 8 0 00-2.4-1.6l-1.3-.7-.1.5a5 5 0 000 .8 7.9 7.9 0 00-3.7.5 4.7 4.7 0 002.5 2.2l-.8.7a4 4 0 00-.4.5l1.3.2 2.5.2a14.5 14.5 0 001.7-.2m-80.3 0c0-.4-.3-.7-.7-1-.7-.7-1.7-.8-2.2-.3l-.2.3s-1-2-2.3-2.7c-1.2-.7-3.3-.5-3.3-.5a2.8 2.8 0 012.8-2.8c1 0 1.9.4 2.4 1l.2-1s1.3.3 2 1.8c.5 1.5-.1 3.6-.1 3.6s.3-.9.8-1.5a8 8 0 012.4-1.6l1.3-.7v1.3a7.9 7.9 0 013.7.5 4.7 4.7 0 01-2.5 2.2l.8.7.4.5-1.2.2-2.6.2a14.7 14.7 0 01-1.7-.2\"/>\n <path fill=\"#ad1519\" stroke=\"#000\" stroke-width=\".4\" d=\"M163 196.8c.6-.5 1.6-.4 2.4.3.7.6 1 1.5.4 2-.5.6-1.5.5-2.2-.2-.8-.6-1-1.6-.5-2m41-6.3c0-1.1.9-2 2-2s2.1.9 2.1 2c0 1-1 2-2 2a2 2 0 01-2.1-2\"/>\n <path fill=\"#005bbf\" stroke=\"#000\" stroke-width=\".3\" d=\"M201.8 160.6c0-2.2 1.9-4 4.3-4s4.2 1.8 4.2 4-1.9 4-4.3 4a4.1 4.1 0 01-4.2-4\"/>\n <path fill=\"#c8b100\" stroke=\"#000\" stroke-width=\".3\" d=\"M205 149.3v2.2h-2.4v2.2h2.3v6.3H202l-.2.6c0 .6.1 1.1.3 1.6h7.9c.2-.5.3-1 .3-1.6l-.2-.6h-2.8v-6.3h2.3v-2.2h-2.3v-2.2h-2.4z\"/>\n <path fill=\"#ccc\" d=\"M206.5 330.6a82 82 0 01-35.5-8.2 22.7 22.7 0 01-12.8-20.4v-32h96.4v32a22.7 22.7 0 01-12.8 20.4 81 81 0 01-35.3 8.2\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".5\" d=\"M206.5 330.6a82 82 0 01-35.5-8.2 22.7 22.7 0 01-12.8-20.4v-32h96.4v32a22.7 22.7 0 01-12.8 20.4 81 81 0 01-35.3 8.2z\"/>\n <path fill=\"#ccc\" d=\"M206.3 270h48.3v-53.5h-48.3V270z\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".5\" d=\"M206.3 270h48.3v-53.5h-48.3V270z\"/>\n <path fill=\"#ad1519\" d=\"M206.3 302c0 12.6-10.7 22.9-24 22.9s-24.2-10.3-24.2-23v-32h48.2v32\"/>\n <path fill=\"#c8b100\" stroke=\"#000\" stroke-width=\".5\" d=\"M168.6 320.9c1.5.8 3.6 2 5.8 2.6l-.1-54.7h-5.7v52z\"/>\n <path fill=\"#c8b100\" stroke=\"#000\" stroke-linejoin=\"round\" stroke-width=\".5\" d=\"M158 301.6a24.4 24.4 0 005.5 15v-47.5h-5.4v32.5z\"/>\n <path fill=\"#c7b500\" stroke=\"#000\" stroke-width=\".5\" d=\"M179.4 324.7a26.6 26.6 0 005.6 0v-55.9h-5.6v56z\"/>\n <path fill=\"#c8b100\" stroke=\"#000\" stroke-width=\".5\" d=\"M190 323.5a19 19 0 005.8-2.5v-52.2H190l-.1 54.7z\"/>\n <path fill=\"#ad1519\" d=\"M158.1 270h48.2v-53.5H158V270z\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".5\" d=\"M158.1 270h48.2v-53.5H158V270z\"/>\n <path fill=\"#c8b100\" stroke=\"#000\" stroke-width=\".5\" d=\"M201 316c2.4-2 4.6-6.8 5.4-12.2l.1-35H201l.1 47.3z\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".5\" d=\"M206.3 302c0 12.6-10.7 22.9-24 22.9s-24.2-10.3-24.2-23v-32h48.2v32\"/>\n <path fill=\"#ad1519\" d=\"M254.6 270v32c0 12.6-10.8 22.9-24.1 22.9s-24.2-10.3-24.2-23v-32h48.3\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".5\" d=\"M254.6 270v32c0 12.6-10.8 22.9-24.1 22.9s-24.2-10.3-24.2-23v-32h48.3\"/>\n <path fill=\"#c8b100\" d=\"M215.1 294.1l.1.5c0 .6-.5 1-1.1 1a1 1 0 01-1.1-1v-.5h-1.5a2.5 2.5 0 001.8 2.9v3.9h1.6V297a2.6 2.6 0 001.7-1.6h4.4v-1.2h-6m21.8 0v1.2h-4a2.5 2.5 0 01-.3.6l4.6 5.2-1.2 1-4.6-5.3-.2.1v8.7h-1.6V297h-.2l-4.8 5.2-1.2-1 4.7-5.3a2.1 2.1 0 01-.2-.4h-4V294h13zm2.6 0v1.2h4.4c.3.8.9 1.4 1.7 1.6v3.9h1.6V297a2.5 2.5 0 001.8-2.4 2 2 0 000-.5h-1.6l.1.5c0 .6-.5 1-1 1-.7 0-1.2-.4-1.2-1a1 1 0 01.1-.5h-5.9m-6.7 22.1a15.6 15.6 0 003.7-1l.8 1.4a17.6 17.6 0 01-4.3 1.2 2.6 2.6 0 01-2.6 2 2.6 2.6 0 01-2.5-2 17.5 17.5 0 01-4.6-1.2l.8-1.4c1.3.5 2.6.9 4 1a2.5 2.5 0 011.5-1.3v-6.7h1.6v6.7c.7.2 1.3.7 1.6 1.4zm-11-2.2l-.8 1.4a16.6 16.6 0 01-3.6-3.1c-.9.2-1.8 0-2.5-.5a2.4 2.4 0 01-.3-3.5l.1-.1a15.3 15.3 0 01-1.3-4.8h1.7a13.1 13.1 0 001 4c.5 0 1 0 1.4.2l4.1-4.5 1.3 1-4.1 4.5c.5.9.5 2-.1 2.8a15.2 15.2 0 003.1 2.6zm-6-4.8c.3-.4 1-.5 1.5 0s.5 1 .1 1.4a1.2 1.2 0 01-1.6.1 1 1 0 010-1.5zm-2.2-4.5l-1.6-.3-.3-4.3 1.7-.6v2.5c0 1 0 1.8.2 2.7zm1.4-5.3l1.7.4v2.2c0-.8.3 2.1.3 2.1l-1.7.6a14 14 0 01-.3-2.7v-2.6zm5.6 13.7a15.7 15.7 0 004.8 2.6l.4-1.6a13.7 13.7 0 01-4-2l-1.2 1m-.8 1.4a17.4 17.4 0 004.8 2.6l-1.2 1.1a18.7 18.7 0 01-4-2l.4-1.7m2.2-9.4l1.6.7 3-3.3-1-1.4-3.6 4m-1.3-1l-1-1.4 3-3.3 1.6.7-3.6 4m18.1 9.9l.8 1.4a16.7 16.7 0 003.6-3.1c.9.2 1.8 0 2.5-.5a2.4 2.4 0 00.3-3.5l-.1-.1a15 15 0 001.3-4.8h-1.7a13.3 13.3 0 01-1 4 3 3 0 00-1.4.2l-4.1-4.5-1.3 1 4.1 4.5a2.4 2.4 0 00.1 2.8 15 15 0 01-3.1 2.6zm6-4.8a1.2 1.2 0 00-1.5 0 1 1 0 00-.1 1.4 1.2 1.2 0 001.6.1 1 1 0 000-1.5zm2.2-4.5l1.6-.3.3-4.3-1.7-.6v2.5c0 1 0 1.9-.2 2.8zm-1.4-5.3l-1.7.4v2.2c0-.8-.3 2.1-.3 2.1l1.7.6.3-2.7v-2.6m-5.6 13.7a15.7 15.7 0 01-4.8 2.6l-.4-1.6a13.7 13.7 0 004-2l1.2 1m.8 1.4a17.4 17.4 0 01-4.8 2.6l1.2 1.1a18.6 18.6 0 004-2l-.4-1.7m-2.2-9.4l-1.6.7-2.9-3.3 1-1.4 3.5 4m1.3-1l1-1.4-3-3.3-1.6.7 3.6 4m-20.1-8.7l.5 1.6h4.5l.5-1.6h-5.5m21.1 0l-.5 1.6h-4.5l-.5-1.6h5.5m-11.6 21.9c0-.6.5-1 1.1-1a1 1 0 011.1 1c0 .6-.5 1-1 1a1.1 1.1 0 01-1.2-1zm1.9-7.8l1.7-.4v-4.3l-1.7-.5v5.2m-1.6 0l-1.7-.4v-4.3l1.7-.5v5.2\"/>\n <path fill=\"#c8b100\" d=\"M211.5 294.2c.2-1 1-1.6 1.8-2V287h1.6v5.3c.8.3 1.5.9 1.7 1.6h4.4v.3h-6a1.2 1.2 0 00-1-.6c-.4 0-.7.3-1 .6h-1.5m12.2 0v-.3h4.1a2.4 2.4 0 01.2-.3l-5-5.7 1.2-1 5 5.6.2-.1V285h1.6v7.3h.3l4.9-5.5 1.2 1-4.9 5.5.3.6h4v.3h-13zm21.6 0a1.1 1.1 0 011-.6c.5 0 .8.3 1 .6h1.6c-.2-1-.9-1.6-1.8-2V287h-1.6v5.3c-.8.3-1.4.8-1.7 1.6h-4.4v.3h6m-30.2-15l6 6.8 1.3-1-6.1-6.7.3-.6h4.4V276h-4.4a2.6 2.6 0 00-2.5-1.7 2.6 2.6 0 00-2.7 2.5 2.5 2.5 0 001.8 2.4v5.2h1.6v-5.2h.3zm32 0v5.3h-1.7v-5.2a2.5 2.5 0 01-.4-.2l-6 6.8-1.3-1 6.2-6.9-.1-.3h-4.5V276h4.5a2.6 2.6 0 012.4-1.7 2.6 2.6 0 012.7 2.5 2.5 2.5 0 01-1.9 2.4zm-16.1 0v3.3h-1.7v-3.2a2.6 2.6 0 01-1.7-1.6h-4V276h4a2.6 2.6 0 012.5-1.7c1.2 0 2.2.7 2.5 1.7h4v1.6h-4a2.5 2.5 0 01-1.6 1.6zm-17.8 4l-1.7.4v4.3l1.7.5v-5.2m1.6 0l1.7.4v4.3l-1.7.5v-5.2m30.6 0l-1.7.4v4.3l1.7.5v-5.2m1.6 0l1.7.4v4.3l-1.7.5v-5.2m-25.5.8l1.6-.7 2.9 3.3-1 1.4-3.5-4m-1.3 1l-1 1.4 3 3.3 1.6-.7-3.6-4m18.5-1.1l-1.6-.7-3 3.3 1 1.4 3.6-4m1.2 1l1 1.4-3 3.3-1.5-.7 3.5-4m-20.3 9l.5-1.6h4.5l.5 1.6h-5.5m-6.7-17c0-.6.5-1 1.2-1a1 1 0 011 1c0 .6-.4 1-1 1a1.1 1.1 0 01-1.2-1zm12.1.8l-.5 1.6h-4.5l-.5-1.6h5.5m0-1.6l-.5-1.6h-4.5l-.5 1.6h5.5m15.7 17.8l-.5-1.6h-4.5l-.5 1.6h5.5m4.4-17c0-.6.5-1 1.1-1a1 1 0 011.1 1c0 .6-.5 1-1 1a1.1 1.1 0 01-1.2-1zm-16.1 0c0-.6.5-1 1.1-1a1 1 0 011.1 1c0 .6-.5 1-1.1 1a1.1 1.1 0 01-1.1-1zm6.2.8l.5 1.6h4.6l.5-1.6h-5.6m0-1.6l.5-1.6h4.6l.5 1.6h-5.6m-5.9 5l-1.7.5v4.3l1.7.5V281m1.7 0l1.6.5v4.3l-1.6.5V281\"/>\n <path fill=\"none\" stroke=\"#c8b100\" stroke-width=\".3\" d=\"M232.7 316.3a15.6 15.6 0 003.7-1.1l.8 1.4a17.6 17.6 0 01-4.3 1.2 2.6 2.6 0 01-2.6 2 2.6 2.6 0 01-2.5-2 17.5 17.5 0 01-4.6-1.2l.8-1.4c1.3.5 2.6.9 4 1a2.5 2.5 0 011.5-1.3v-6.7h1.6v6.7c.7.2 1.3.7 1.6 1.4zm-4.7-20.4a2.3 2.3 0 01-.2-.5h-4V294h4a2.6 2.6 0 01.2-.4l-5-5.6 1.2-1 5 5.5a2.2 2.2 0 01.2 0V285h1.7v7.3h.2l4.9-5.5 1.2 1-4.9 5.5.3.6h4v1.5h-4c0 .2-.2.4-.3.5l4.7 5.3-1.3 1-4.6-5.3-.2.1v8.7h-1.6V297l-.2-.1-4.8 5.3-1.2-1 4.7-5.3m-12.8-16.7l6 6.8 1.3-1-6.1-6.7.3-.6h4.4V276h-4.4a2.6 2.6 0 00-2.5-1.7 2.6 2.6 0 00-2.6 2.5 2.5 2.5 0 001.7 2.4v5.2h1.6v-5.2h.3zm6.5 34.8l-.8 1.4a16.6 16.6 0 01-3.6-3.1c-.9.2-1.8 0-2.5-.5a2.4 2.4 0 01-.3-3.5l.1-.1a15.3 15.3 0 01-1.2-4.8h1.6a13.1 13.1 0 001 4c.5 0 1 0 1.4.2l4.1-4.5 1.3 1-4.1 4.5c.6.9.5 2-.1 2.8a15.2 15.2 0 003.1 2.6zm-8.4-13.1V297a2.5 2.5 0 01-1.8-2.4c0-1 .8-2 1.8-2.4V287h1.6v5.3c.8.2 1.5.8 1.7 1.6h4.4v1.5h-4.4a2.6 2.6 0 01-1.6 1.6v3.9h-1.7m2.3 8.3c.4-.4 1.1-.5 1.6 0s.5 1 .1 1.4a1.2 1.2 0 01-1.6.1 1 1 0 010-1.5zm-2-4.5l-1.7-.3-.3-4.3 1.7-.6v2.5c0 1 0 1.8.3 2.7zm1.4-5.3l1.6.4v2.2c0-.8.3 2.1.3 2.1l-1.7.6-.3-2.7v-2.6zm5.5 13.7a15.7 15.7 0 004.8 2.6l.4-1.6a13.7 13.7 0 01-4-2l-1.2 1m-.8 1.4a17.4 17.4 0 004.8 2.6l-1.2 1.1a18.7 18.7 0 01-4-2l.4-1.7\"/>\n <path fill=\"none\" stroke=\"#c8b100\" stroke-width=\".3\" d=\"M221.9 305.1l1.6.7 3-3.3-1-1.4-3.6 4m-1.3-1l-1-1.4 3-3.3 1.6.7-3.6 4m-7.6-9.5c0-.6.5-1 1-1 .7 0 1.2.5 1.2 1 0 .6-.5 1.1-1.1 1.1a1 1 0 01-1.1-1zm25.7 19.4l.8 1.4a16.7 16.7 0 003.6-3.1c.9.2 1.8 0 2.6-.5a2.4 2.4 0 00.2-3.5l-.1-.1a15 15 0 001.3-4.8h-1.7a13.3 13.3 0 01-1 4 3 3 0 00-1.4.2l-4.1-4.5-1.3 1 4.1 4.5a2.4 2.4 0 00.1 2.8 15 15 0 01-3 2.6zm8.4-13.1V297a2.5 2.5 0 001.8-2.4c0-1-.7-2-1.8-2.4V287h-1.6v5.3c-.8.2-1.4.8-1.7 1.6h-4.4v1.5h4.4c.3.8.9 1.3 1.7 1.6v3.9h1.6zm-2.3 8.3a1.2 1.2 0 00-1.6 0 1 1 0 00-.1 1.4 1.2 1.2 0 001.6.1 1 1 0 000-1.5zm2-4.5l1.7-.3.3-4.3-1.7-.6v2.5c0 1 0 1.8-.2 2.7zm-1.3-5.3l-1.7.4v2.2c0-.8-.3 2.1-.3 2.1l1.7.6.3-2.7v-2.6m1.6-20.1v5.2h-1.6v-5.2a2.3 2.3 0 01-.4-.2l-6 6.8-1.2-1 6-7v-.2h-4.5V276h4.4a2.6 2.6 0 012.5-1.7 2.6 2.6 0 012.6 2.5 2.5 2.5 0 01-1.8 2.4zm-16 0v3.2h-1.7v-3.2a2.6 2.6 0 01-1.7-1.6h-4V276h4c.4-1 1.3-1.7 2.5-1.7s2.2.7 2.5 1.7h4v1.6h-4a2.5 2.5 0 01-1.6 1.6zm8.8 33.8a15.7 15.7 0 01-4.8 2.6l-.4-1.6a13.7 13.7 0 004-2l1.2 1m.8 1.4a17.4 17.4 0 01-4.8 2.6l1.2 1.1a18.7 18.7 0 004-2l-.4-1.7m-27.4-31.4l-1.7.5v4.3l1.7.5v-5.2m1.7 0l1.6.4v4.3l-1.6.5V283m30.5 0l-1.7.5v4.3l1.7.5V283\"/>\n <path fill=\"none\" stroke=\"#c8b100\" stroke-width=\".3\" d=\"M247.1 283.1l1.7.5v4.3l-1.7.5V283m-8.6 22l-1.6.7-2.9-3.3 1-1.4 3.5 4m1.3-1l1-1.4-3-3.3-1.6.7 3.6 4m-18.2-20l1.6-.7 3 3.3-1 1.4-3.6-4m-1.3 1l-1 1.4 3 3.3 1.6-.7-3.6-4m18.5-1.1l-1.6-.7-3 3.3 1 1.4 3.6-4m1.2 1l1 1.4-3 3.2-1.5-.6 3.5-4m-20.3 9l.5-1.6h4.5l.5 1.6h-5.5m0 1.5l.5 1.6h4.5l.5-1.6h-5.5M213 277c0-.6.5-1 1.2-1 .6 0 1 .4 1 1s-.4 1-1 1a1 1 0 01-1.2-1zm12.1.8l-.5 1.6h-4.5l-.5-1.6h5.5m0-1.6l-.5-1.6h-4.5l-.5 1.6h5.5m20.1 18.5c0-.5.5-1 1.1-1 .6 0 1.1.5 1.1 1 0 .6-.5 1.1-1 1.1a1 1 0 01-1.2-1zm-4.4-.7l-.5-1.6h-4.5l-.5 1.6h5.5m0 1.5l-.5 1.6h-4.5l-.5-1.6h5.5m-11.6 21.9c0-.6.5-1 1.1-1 .6 0 1.1.4 1.1 1s-.5 1-1 1a1.1 1.1 0 01-1.2-1zm1.9-7.8l1.7-.4v-4.3l-1.7-.5v5.2m-1.6 0l-1.7-.4v-4.3l1.7-.5v5.2m15.7-32.6c0-.6.5-1 1.1-1a1 1 0 011.1 1c0 .6-.5 1-1 1a1.1 1.1 0 01-1.2-1zm-16.1 0c0-.6.5-1 1.1-1a1 1 0 011.1 1c0 .6-.5 1-1 1a1.1 1.1 0 01-1.2-1zm6.2.8l.5 1.6h4.6l.5-1.6h-5.5m0-1.6l.4-1.6h4.6l.5 1.6h-5.5m-6 5l-1.6.5v4.3l1.6.5V281m1.7 0l1.6.5v4.3l-1.6.5V281\"/>\n <path fill=\"#058e6e\" d=\"M227.7 294.7a2.6 2.6 0 012.6-2.5 2.6 2.6 0 012.6 2.5 2.6 2.6 0 01-2.6 2.4c-1.4 0-2.6-1-2.6-2.4\"/>\n <path fill=\"#db4446\" d=\"M230.9 229.7v-.6l.1-.3-2.3-.1a5.9 5.9 0 01-2.3-1.2c-.8-.7-1.1-1-1.6-1.2-1.3-.2-2.3.4-2.3.4s1 .4 1.7 1.3 1.5 1.3 1.8 1.4c.6.2 2.6 0 3.1.1l1.8.2\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M230.9 229.7v-.6l.1-.3-2.3-.1a5.9 5.9 0 01-2.3-1.2c-.8-.7-1.1-1-1.6-1.2-1.3-.2-2.3.4-2.3.4s1 .4 1.7 1.3 1.5 1.3 1.8 1.4c.6.2 2.6 0 3.1.1l1.8.2z\"/>\n <path fill=\"#ed72aa\" stroke=\"#000\" stroke-width=\".4\" d=\"M238.1 227.5v1.4c.2.6-.1 1.2 0 1.5 0 .4.1.6.3.9l.2.9-.7-.5-.6-.4v1c.1.2.3.8.6 1.1l1 1.3c.2.5.1 1.4.1 1.4s-.4-.7-.8-.8l-1.2-.7s.7.8.7 1.5c0 .8-.3 1.6-.3 1.6s-.3-.7-.8-1.1l-1-.9s.4 1.2.4 2v2.3l-.9-1-1-.7c0-.2.5.6.6 1.1 0 .5.3 2.3 1.8 4.5 1 1.3 2.3 3.6 5.3 2.9 3-.8 1.9-4.8 1.3-6.7a16.8 16.8 0 01-1-4.6c0-.8.6-2.9.5-3.3a8 8 0 01.2-3.1c.4-1.3.7-1.8.9-2.3.2-.6.4-.9.4-1.3l.1-1.3.7 1.3.1 1.5s.1-1 1-1.6c.8-.6 1.8-1.1 2-1.4.3-.3.3-.5.3-.5s0 1.8-.6 2.6l-1.7 2s.7-.3 1.2-.3h.9s-.6.4-1.4 1.6c-.8 1-.5 1.2-1 2.1-.6 1-1 1-1.7 1.5-1 .8-.5 4.2-.4 4.7.2.5 2 4.5 2 5.5s.2 3.2-1.5 4.6c-1.1 1-3 1-3.4 1.2-.4.3-1.2 1.1-1.2 2.8 0 1.7.6 2 1 2.4.6.5 1.2.2 1.3.6.2.3.2.5.5.7.2.2.3.4.2.8 0 .3-.8 1.1-1.1 1.7l-.8 2.4c0 .2-.1 1 .1 1.3 0 0 .9 1 .3 1.2-.4.2-.8-.2-1-.2l-.9.5c-.3-.1-.3-.3-.4-.8l-.1-.7c-.2 0-.3.2-.4.5 0 .2 0 .8-.3.8-.2 0-.5-.4-.8-.5-.2 0-.8-.2-.8-.4 0-.3.4-.9.7-1 .4 0 .8-.3.5-.5s-.5-.2-.7 0-.8 0-.7-.2v-.8c0-.2-.4-.5.1-.8.6-.3.8.2 1.4.1.6 0 .8-.3 1-.6.2-.3.2-1-.2-1.4-.4-.5-.7-.5-.9-.8l-.3-.9v2.2l-.7-.8c-.3-.3-.6-1.3-.6-1.3v1.3c0 .4.3.7.2.8-.1.1-.8-.7-1-.8a3.7 3.7 0 01-1-1l-.4-1.4a4.2 4.2 0 010-1.5l.4-1h-1.4c-.7 0-1.2-.3-1.5.2-.3.5-.2 1.5.2 2.8.3 1.2.5 1.9.4 2.1a3 3 0 01-.7.8h-.9a2.5 2.5 0 00-1.2-.3h-1.3l-1.1-.3c-.3.1-.8.3-.6.7.2.6-.2.7-.5.7l-.9-.2c-.4-.1-.9 0-.8-.4 0-.4.2-.4.4-.7.2-.3.2-.5 0-.5h-.6c-.2.2-.5.5-.8.4-.2-.1-.4-.4-.4-1s-.7-1.2 0-1.1c.5 0 1.3.4 1.4 0 .2-.3 0-.4-.2-.7s-.8-.4-.3-.7l.7-.5c.1-.2.4-.8.7-.6.6.2 0 .7.6 1.3.6.7 1 1 2 .8 1 0 1.3-.2 1.3-.5l-.1-1v-1s-.4.3-.5.6l-.4.8v-2a8 8 0 00-.2-.8l-.3.9-.1 1s-.7-.5-.5-1.5c.1-.7-.1-1.6.1-2 .2-.3.7-1.5 2-1.6h2.6l2-.3s-2.8-1.4-3.5-1.9a9.5 9.5 0 01-2-2l-.6-1.6s-.5 0-1 .3a5 5 0 00-1.2 1l-.7 1 .1-1.2v-.8s-.4 1.2-1 1.7l-1.4 1v-.8l.2-1s-.4.8-1.1 1c-.7 0-1.8 0-1.9.4 0 .5.2 1 0 1.4 0 .3-.4.5-.4.5l-.8-.4c-.4 0-.7.2-.7.2s-.3-.4-.2-.7c.1-.2.7-.6.5-.8l-.8.2c-.3.1-.8.3-.8-.2 0-.4.2-.7 0-1 0-.3 0-.5.2-.6l1.2-.1c0-.2-.2-.5-.8-.6-.6-.1-.8-.5-.5-.8.3-.2.3-.3.5-.6.1-.2.2-.7.7-.5.5.3.4.8 1 1a4 4 0 002-.2l1.5-1 1.5-1-1-.8c-.3-.3-.7-.9-1-1a8.3 8.3 0 00-1.8-.6 9 9 0 01-1.7-.5l.8-.3c.2-.2.6-.6.8-.6h.3-1.4c-.3-.1-1-.6-1.3-.6l-.8.1s.8-.4 1.4-.5l1-.1s-.9-.3-1.1-.6l-.6-1c-.2-.1-.3-.5-.6-.5l-1 .3c-.4 0-.6-.2-.6-.6l-.1-.5c-.2-.3-.6-.8-.2-1h1.4c0-.2-.5-.6-.8-.8-.4-.2-1-.5-.7-.8l.8-.5c.2-.3.3-1 .7-.7.4.2.8 1.2 1.1 1.1.3 0 .3-.8.3-1 0-.4 0-1 .2-.9.3 0 .5.4 1 .5.4 0 1-.1 1 .2 0 .3-.3.7-.6 1-.3.3-.4 1-.3 1.4.2.5.7 1.2 1.2 1.4.4.3 1.2.5 1.7.9.5.3 1.7 1.2 2.1 1.3l.8.4s.5-.2 1.1-.2c.7 0 2.1 0 2.6-.2.6-.2 1.3-.6 1-1-.1-.6-1.3-1-1.2-1.4 0-.4.5-.4 1.2-.4.8 0 1.8.1 2-1 .2-1 .2-1.5-.8-1.8-1-.2-1.8-.2-2-1-.2-.7-.4-.9-.2-1.1.3-.2.6-.3 1.4-.4.8 0 1.6 0 1.9-.2.2-.2.3-.7.6-.9.3-.2 1.4-.4 1.4-.4s1.4.7 2.7 1.7a15 15 0 012.2 2.1\"/>\n <path d=\"M228.1 226.8l-.2-.6v-.3s.8 0 .7.3c0 .2-.2.2-.3.3l-.2.3\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M228.1 226.8l-.2-.6v-.3s.8 0 .7.3c0 .2-.2.2-.3.3l-.2.3z\"/>\n <path d=\"M232 225.4v-.4s.7 0 1 .3c.5.4.9 1 .9 1l-.8-.4h-.5l-.3-.1v-.3h-.3\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".1\" d=\"M232 225.4v-.4s.7 0 1 .3c.5.4.9 1 .9 1l-.8-.4h-.5l-.3-.1v-.3h-.3z\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M237.3 231.3l-.4-.7a8 8 0 01-.3-.4\"/>\n <path fill=\"#db4446\" d=\"M217.4 226.6s.5.4.8.4h.8s.2-.5.1-.8c-.2-1.2-1.2-1.4-1.2-1.4s.3.7.1 1a2 2 0 01-.6.8\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M217.4 226.6s.5.4.8.4h.8s.2-.5.1-.8c-.2-1.2-1.2-1.4-1.2-1.4s.3.7.1 1a2 2 0 01-.6.8z\"/>\n <path fill=\"#db4446\" d=\"M215.2 227.6s-.4-.7-1.3-.6c-.8 0-1.4.8-1.4.8h1.2c.3.3.4 1 .4 1l.7-.6a7.2 7.2 0 00.4-.6\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M215.2 227.6s-.4-.7-1.3-.6c-.8 0-1.4.8-1.4.8h1.2c.3.3.4 1 .4 1l.7-.6a7.2 7.2 0 00.4-.6z\"/>\n <path fill=\"#db4446\" d=\"M214.2 230.6s-.8.1-1.2.6c-.4.5-.3 1.3-.3 1.3s.4-.5.9-.5l1 .2-.1-.8-.3-.8\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M214.2 230.6s-.8.1-1.2.6c-.4.5-.3 1.3-.3 1.3s.4-.5.9-.5l1 .2-.1-.8-.3-.8z\"/>\n <path d=\"M228.2 230.5l.3-.5.3.5h-.7\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M228.2 230.5l.3-.5.3.5h-.7\"/>\n <path d=\"M229 230.5l.3-.5.4.5h-.8\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M229 230.5l.3-.5.4.5h-.8\"/>\n <path d=\"M228.6 227.3l.8.3-.7.4-.1-.6\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M228.6 227.3l.8.3-.7.4-.1-.6\"/>\n <path d=\"M229.5 227.6l.7.2-.5.4-.2-.6\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M229.5 227.6l.7.2-.5.4-.2-.6\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M224.2 233.7s-.7.2-1 .6c-.4.5-.3 1-.3 1s.6-.5 1.5-.3l1.2.3 1.3-.3s-.7.8-.7 1.3l.2 1.1c0 .7-.6 1.6-.6 1.6l1-.3a4.6 4.6 0 001.7-.8l.9-1s-.2 1 0 1.4l.2 1.6.8-.6c.2-.1.7-.4.9-.7l.3-1s0 .8.4 1.3l.6 1.6s.3-.8.6-1.1c.3-.4.7-.8.7-1a4.3 4.3 0 00-.1-.9l.4.8m-11 .6s.5-.8 1-1l1.1-.8.9-.4m1 5l1.3-.8a4 4 0 001-1\"/>\n <path fill=\"#db4446\" d=\"M216.6 240.4s-.4-.5-1.1-.3c-.7 0-1.2.9-1.2.9s.6-.2 1-.1.6.4.6.4l.4-.4.3-.6\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M216.6 240.4s-.4-.5-1.1-.3c-.7 0-1.2.9-1.2.9s.6-.2 1-.1.6.4.6.4l.4-.4.3-.6z\"/>\n <path fill=\"#db4446\" d=\"M215.8 243.2s-.6 0-1.1.3c-.5.4-.5 1.2-.5 1.2s.4-.4.8-.3l.9.2v-.6c.2-.4-.1-.8-.1-.8\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M215.8 243.2s-.6 0-1.1.3c-.5.4-.5 1.2-.5 1.2s.4-.4.8-.3l.9.2v-.6c.2-.4-.1-.8-.1-.8z\"/>\n <path fill=\"#db4446\" d=\"M217.2 245.8s0 .8.3 1.3c.4.5 1.1.5 1.1.5l-.3-.7c0-.4.3-.8.3-.8s-.3-.3-.7-.3h-.7\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M217.2 245.8s0 .8.3 1.3c.4.5 1.1.5 1.1.5l-.3-.7c0-.4.3-.8.3-.8s-.3-.3-.7-.3h-.7zm16 1.3s2 1.2 1.9 2.2c0 1-1 2.3-1 2.3\"/>\n <path fill=\"#db4446\" d=\"M224.2 252.6s-.4-.6-1.1-.6c-.7 0-1.4.7-1.4.7s.8-.1 1 .2l.5.6.5-.3.5-.6\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M224.2 252.6s-.4-.6-1.1-.6c-.7 0-1.4.7-1.4.7s.8-.1 1 .2l.5.6.5-.3.5-.6z\"/>\n <path fill=\"#db4446\" d=\"M222.2 255.3s-1-.1-1.4.3c-.4.5-.4 1.3-.4 1.3s.6-.6 1-.5c.5 0 1 .3 1 .3v-.7l-.3-.7\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M222.2 255.3s-1-.1-1.4.3c-.4.5-.4 1.3-.4 1.3s.6-.6 1-.5c.5 0 1 .3 1 .3v-.7l-.3-.7z\"/>\n <path fill=\"#db4446\" d=\"M224 258.1s-.3.7 0 1.1c.3.5 1 .8 1 .8s-.3-.4-.2-.8c.1-.3.7-.8.7-.8l-1.4-.2\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M224 258.1s-.3.7 0 1.1c.3.5 1 .8 1 .8s-.3-.4-.2-.8c.1-.3.7-.8.7-.8l-1.4-.2z\"/>\n <path fill=\"#db4446\" d=\"M236 259.3s-.8-.2-1.2 0c-.5.3-.8 1.4-.8 1.4s.7-.6 1.2-.5c.5 0 1 .3 1 .3v-.8l-.2-.4\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M236 259.3s-.8-.2-1.2 0c-.5.3-.8 1.4-.8 1.4s.7-.6 1.2-.5c.5 0 1 .3 1 .3v-.8l-.2-.4z\"/>\n <path fill=\"#db4446\" d=\"M236.4 262.2s-.6.6-.4 1.1l.6 1s0-.7.2-1l1-.3-.7-.5a15.8 15.8 0 01-.7-.3\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M236.4 262.2s-.6.6-.4 1.1l.6 1s0-.7.2-1l1-.3-.7-.5a15.8 15.8 0 01-.7-.3z\"/>\n <path fill=\"#db4446\" d=\"M239.4 263s-.3.8.2 1.3c.6.5 1 .5 1 .5s-.3-.7-.2-1.1c.1-.5.5-.7.5-.7l-.8-.2-.7.3\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M239.4 263s-.3.8.2 1.3c.6.5 1 .5 1 .5s-.3-.7-.2-1.1c.1-.5.5-.7.5-.7l-.8-.2-.7.3z\"/>\n <path fill=\"#ffd691\" stroke=\"#000\" stroke-width=\".5\" d=\"M208.8 316.4c2 .6 3 2 3 3.8 0 2.3-2.2 4-5 4-3 0-5.3-1.7-5.3-4 0-1.7 1-3.6 3-3.8l-.2-.4-.7-.7h1.2l.8.5.5-.7c.3-.4.6-.5.6-.5l.6.6.3.5.7-.4.8-.3s0 .4-.2.7l-.1.7\"/>\n <path fill=\"#058e6e\" stroke=\"#000\" stroke-width=\".5\" d=\"M206.3 326.7s-3.8-2.6-5.5-3c-2-.4-4.5 0-5.5 0 0 0 1.2.8 1.8 1.4.5.5 2.3 1.5 3.3 1.8 3 .8 6-.2 6-.2m1 .2s2.4-2.5 5-2.9c3-.4 5 .3 6.2.6l-1.5.8c-.5.3-2 1.5-4 1.6-2 0-4.4-.3-4.8-.2l-.9.1\"/>\n <path fill=\"#ad1519\" stroke=\"#000\" stroke-width=\".5\" d=\"M206.7 323.8a4.8 4.8 0 010-7.1 4.8 4.8 0 011.5 3.5 4.9 4.9 0 01-1.5 3.6\"/>\n <path fill=\"#058e6e\" stroke=\"#000\" stroke-width=\".5\" d=\"M205.7 329s.6-1.5.6-2.7l-.1-2.1h.8s.3 1.1.3 2l-.1 2.4-.7.1-.8.3\"/>\n <path fill=\"#fff\" d=\"M254 190.7c0-.5.5-1 1-1 .6 0 1.1.5 1.1 1 0 .6-.5 1-1 1a1 1 0 01-1-1\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M254 190.7c0-.5.5-1 1-1 .6 0 1.1.5 1.1 1 0 .6-.5 1-1 1a1 1 0 01-1-1z\"/>\n <path fill=\"#fff\" d=\"M255.4 188.2c0-.6.5-1 1.1-1 .6 0 1 .4 1 1s-.4 1-1 1a1 1 0 01-1-1\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M255.4 188.2c0-.6.5-1 1.1-1 .6 0 1 .4 1 1s-.4 1-1 1a1 1 0 01-1-1z\"/>\n <path fill=\"#fff\" d=\"M256.4 185.2c0-.5.5-1 1-1 .6 0 1.1.5 1.1 1s-.5 1-1 1a1 1 0 01-1.1-1\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M256.4 185.2c0-.5.5-1 1-1 .6 0 1.1.5 1.1 1s-.5 1-1 1a1 1 0 01-1.1-1z\"/>\n <path fill=\"#fff\" d=\"M256.5 182c0-.5.5-1 1-1 .6 0 1.1.5 1.1 1 0 .6-.5 1-1 1a1 1 0 01-1-1\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M256.5 182c0-.5.5-1 1-1 .6 0 1.1.5 1.1 1 0 .6-.5 1-1 1a1 1 0 01-1-1z\"/>\n <path fill=\"#fff\" d=\"M255.7 179c0-.6.5-1 1-1 .7 0 1.2.4 1.2 1s-.5 1-1.1 1a1 1 0 01-1-1\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M255.7 179c0-.6.5-1 1-1 .7 0 1.2.4 1.2 1s-.5 1-1.1 1a1 1 0 01-1-1z\"/>\n <path fill=\"#fff\" d=\"M254.1 176.1c0-.5.5-1 1-1 .7 0 1.1.5 1.1 1s-.4 1-1 1a1 1 0 01-1-1\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M254.1 176.1c0-.5.5-1 1-1 .7 0 1.1.5 1.1 1s-.4 1-1 1a1 1 0 01-1-1z\"/>\n <path fill=\"#fff\" d=\"M252 173.8c0-.6.4-1 1-1s1 .4 1 1-.4 1-1 1a1 1 0 01-1-1\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M252 173.8c0-.6.4-1 1-1s1 .4 1 1-.4 1-1 1a1 1 0 01-1-1z\"/>\n <path fill=\"#fff\" d=\"M249.4 171.8c0-.5.5-1 1.1-1a1 1 0 010 2c-.6 0-1-.4-1-1\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M249.4 171.8c0-.5.5-1 1.1-1a1 1 0 010 2c-.6 0-1-.4-1-1z\"/>\n <path fill=\"#fff\" d=\"M246.5 170.3c0-.6.4-1 1-1s1 .4 1 1-.4 1-1 1a1 1 0 01-1-1\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M246.5 170.3c0-.6.4-1 1-1s1 .4 1 1-.4 1-1 1a1 1 0 01-1-1z\"/>\n <path fill=\"#fff\" d=\"M243.3 169.1c0-.5.5-1 1.1-1a1 1 0 010 2 1 1 0 01-1-1\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M243.3 169.1c0-.5.5-1 1.1-1a1 1 0 010 2 1 1 0 01-1-1z\"/>\n <path fill=\"#fff\" d=\"M239.9 168.5c0-.5.4-1 1-1s1 .5 1 1-.4 1-1 1a1 1 0 01-1-1\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M239.9 168.5c0-.5.4-1 1-1s1 .5 1 1-.4 1-1 1a1 1 0 01-1-1z\"/>\n <path fill=\"#fff\" d=\"M236.6 168.3c0-.5.4-1 1-1s1 .5 1 1-.4 1-1 1a1 1 0 01-1-1\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M236.6 168.3c0-.5.4-1 1-1s1 .5 1 1-.4 1-1 1a1 1 0 01-1-1z\"/>\n <path fill=\"#fff\" d=\"M233.3 168.5c0-.6.5-1 1-1 .7 0 1.1.4 1.1 1s-.4 1-1 1a1 1 0 01-1-1\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M233.3 168.5c0-.6.5-1 1-1 .7 0 1.1.4 1.1 1s-.4 1-1 1a1 1 0 01-1-1z\"/>\n <path fill=\"#fff\" d=\"M230.1 168.5c0-.6.5-1 1-1 .6 0 1.1.4 1.1 1s-.5 1-1 1a1 1 0 01-1.1-1\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M230.1 168.5c0-.6.5-1 1-1 .6 0 1.1.4 1.1 1s-.5 1-1 1a1 1 0 01-1.1-1z\"/>\n <path fill=\"#fff\" stroke=\"#000\" stroke-width=\".4\" d=\"M231.7 171.2c0-.5.5-1 1-1 .7 0 1.1.5 1.1 1s-.4 1-1 1a1 1 0 01-1-1m.6 3.1c0-.6.4-1 1-1s1 .4 1 1c0 .5-.4 1-1 1a1 1 0 01-1-1m0 3c0-.5.6-1 1.1-1a1 1 0 010 2 1 1 0 01-1-1m-1 2.8c0-.5.5-1 1-1 .7 0 1.1.5 1.1 1 0 .6-.4 1-1 1a1 1 0 01-1-1m-1.9 2.6c0-.5.5-1 1-1 .7 0 1.2.5 1.2 1s-.5 1-1.1 1c-.6 0-1-.4-1-1\"/>\n <path fill=\"#fff\" d=\"M227.6 166.5c0-.5.5-1 1.1-1a1 1 0 010 2 1 1 0 01-1-1\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M227.6 166.5c0-.5.5-1 1.1-1a1 1 0 010 2 1 1 0 01-1-1z\"/>\n <path fill=\"#fff\" d=\"M224.8 165c0-.6.4-1 1-1s1 .4 1 1-.4 1-1 1a1 1 0 01-1-1\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M224.8 165c0-.6.4-1 1-1s1 .4 1 1-.4 1-1 1a1 1 0 01-1-1z\"/>\n <path fill=\"#fff\" d=\"M221.6 164c0-.6.5-1 1-1 .6 0 1.1.4 1.1 1 0 .5-.5 1-1 1-.6 0-1.1-.5-1.1-1\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M221.6 164c0-.6.5-1 1-1 .6 0 1.1.4 1.1 1 0 .5-.5 1-1 1-.6 0-1.1-.5-1.1-1z\"/>\n <path fill=\"#fff\" d=\"M218.3 163.4c0-.5.5-1 1-1 .6 0 1.1.5 1.1 1s-.5 1-1 1a1 1 0 01-1.1-1\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M218.3 163.4c0-.5.5-1 1-1 .6 0 1.1.5 1.1 1s-.5 1-1 1a1 1 0 01-1.1-1z\"/>\n <path fill=\"#fff\" d=\"M215 163.5c0-.6.5-1 1.1-1 .6 0 1 .4 1 1 0 .5-.4 1-1 1a1 1 0 01-1-1\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M215 163.5c0-.6.5-1 1.1-1 .6 0 1 .4 1 1 0 .5-.4 1-1 1a1 1 0 01-1-1z\"/>\n <path fill=\"#fff\" d=\"M211.7 164c0-.5.5-1 1-1 .7 0 1.1.5 1.1 1s-.4 1-1 1a1 1 0 01-1-1\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M211.7 164c0-.5.5-1 1-1 .7 0 1.1.5 1.1 1s-.4 1-1 1a1 1 0 01-1-1z\"/>\n <path fill=\"#fff\" d=\"M208.6 165.1c0-.5.5-1 1-1 .6 0 1.1.5 1.1 1s-.5 1-1 1a1 1 0 01-1.1-1\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M208.6 165.1c0-.5.5-1 1-1 .6 0 1.1.5 1.1 1s-.5 1-1 1a1 1 0 01-1.1-1z\"/>\n <path fill=\"#fff\" d=\"M156 190.7c0-.5.4-1 1-1s1 .5 1 1c0 .6-.4 1-1 1a1 1 0 01-1-1\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M156 190.7c0-.5.4-1 1-1s1 .5 1 1c0 .6-.4 1-1 1a1 1 0 01-1-1z\"/>\n <path fill=\"#fff\" d=\"M154.5 188.2c0-.6.5-1 1-1 .6 0 1 .4 1 1s-.4 1-1 1a1 1 0 01-1-1\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M154.5 188.2c0-.6.5-1 1-1 .6 0 1 .4 1 1s-.4 1-1 1a1 1 0 01-1-1z\"/>\n <path fill=\"#fff\" d=\"M153.5 185.2c0-.5.5-1 1-1 .7 0 1.1.5 1.1 1s-.4 1-1 1a1 1 0 01-1-1\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M153.5 185.2c0-.5.5-1 1-1 .7 0 1.1.5 1.1 1s-.4 1-1 1a1 1 0 01-1-1z\"/>\n <path fill=\"#fff\" d=\"M153.4 182c0-.5.5-1 1-1 .6 0 1.1.5 1.1 1 0 .6-.5 1-1 1a1 1 0 01-1-1\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M153.4 182c0-.5.5-1 1-1 .6 0 1.1.5 1.1 1 0 .6-.5 1-1 1a1 1 0 01-1-1z\"/>\n <path fill=\"#fff\" d=\"M154.2 179c0-.6.5-1 1-1 .6 0 1 .4 1 1s-.4 1-1 1a1 1 0 01-1-1\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M154.2 179c0-.6.5-1 1-1 .6 0 1 .4 1 1s-.4 1-1 1a1 1 0 01-1-1z\"/>\n <path fill=\"#fff\" d=\"M155.8 176.1c0-.5.5-1 1-1 .6 0 1.1.5 1.1 1s-.5 1-1 1a1 1 0 01-1-1\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M155.8 176.1c0-.5.5-1 1-1 .6 0 1.1.5 1.1 1s-.5 1-1 1a1 1 0 01-1-1z\"/>\n <path fill=\"#fff\" d=\"M158 173.8c0-.6.4-1 1-1s1 .4 1 1-.4 1-1 1a1 1 0 01-1-1\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M158 173.8c0-.6.4-1 1-1s1 .4 1 1-.4 1-1 1a1 1 0 01-1-1z\"/>\n <path fill=\"#fff\" d=\"M160.5 171.8c0-.5.4-1 1-1s1 .5 1 1-.4 1-1 1a1 1 0 01-1-1\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M160.5 171.8c0-.5.4-1 1-1s1 .5 1 1-.4 1-1 1a1 1 0 01-1-1z\"/>\n <path fill=\"#fff\" d=\"M163.5 170.3c0-.6.4-1 1-1s1 .4 1 1-.4 1-1 1a1 1 0 01-1-1\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M163.5 170.3c0-.6.4-1 1-1s1 .4 1 1-.4 1-1 1a1 1 0 01-1-1z\"/>\n <path fill=\"#fff\" d=\"M166.6 169.1c0-.5.5-1 1-1a1 1 0 010 2 1 1 0 01-1-1\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M166.6 169.1c0-.5.5-1 1-1a1 1 0 010 2 1 1 0 01-1-1z\"/>\n <path fill=\"#fff\" d=\"M170 168.5c0-.5.5-1 1.1-1a1 1 0 010 2c-.6 0-1-.4-1-1\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M170 168.5c0-.5.5-1 1.1-1a1 1 0 010 2c-.6 0-1-.4-1-1z\"/>\n <path fill=\"#fff\" d=\"M173.4 168.3c0-.5.4-1 1-1s1 .5 1 1-.4 1-1 1a1 1 0 01-1-1\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M173.4 168.3c0-.5.4-1 1-1s1 .5 1 1-.4 1-1 1a1 1 0 01-1-1z\"/>\n <path fill=\"#fff\" d=\"M176.6 168.5c0-.6.5-1 1-1 .6 0 1.1.4 1.1 1s-.5 1-1 1a1 1 0 01-1.1-1\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M176.6 168.5c0-.6.5-1 1-1 .6 0 1.1.4 1.1 1s-.5 1-1 1a1 1 0 01-1.1-1z\"/>\n <path fill=\"#fff\" d=\"M179.8 168.5c0-.6.5-1 1-1 .7 0 1.2.4 1.2 1s-.5 1-1.1 1a1 1 0 01-1-1\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M179.8 168.5c0-.6.5-1 1-1 .7 0 1.2.4 1.2 1s-.5 1-1.1 1a1 1 0 01-1-1z\"/>\n <path fill=\"#fff\" stroke=\"#000\" stroke-width=\".4\" d=\"M178.2 171.2c0-.5.5-1 1-1 .7 0 1.1.5 1.1 1s-.4 1-1 1a1 1 0 01-1-1m-.7 3.1c0-.6.4-1 1-1s1 .4 1 1c0 .5-.4 1-1 1a1 1 0 01-1-1m-.2 3c0-.5.5-1 1-1 .7 0 1.1.5 1.1 1s-.4 1-1 1a1 1 0 01-1-1m.9 2.8c0-.5.5-1 1-1 .6 0 1.1.5 1.1 1 0 .6-.5 1-1 1a1 1 0 01-1.1-1m1.8 2.6c0-.5.5-1 1-1a1 1 0 010 2 1 1 0 01-1-1\"/>\n <path fill=\"#fff\" d=\"M182.3 166.5c0-.5.5-1 1-1a1 1 0 010 2 1 1 0 01-1-1\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M182.3 166.5c0-.5.5-1 1-1a1 1 0 010 2 1 1 0 01-1-1z\"/>\n <path fill=\"#fff\" d=\"M185.2 165c0-.6.4-1 1-1s1 .4 1 1-.4 1-1 1a1 1 0 01-1-1\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M185.2 165c0-.6.4-1 1-1s1 .4 1 1-.4 1-1 1a1 1 0 01-1-1z\"/>\n <path fill=\"#fff\" d=\"M188.3 164c0-.6.5-1 1-1 .7 0 1.1.4 1.1 1 0 .5-.4 1-1 1s-1-.5-1-1\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M188.3 164c0-.6.5-1 1-1 .7 0 1.1.4 1.1 1 0 .5-.4 1-1 1s-1-.5-1-1z\"/>\n <path fill=\"#fff\" d=\"M191.6 163.4c0-.5.5-1 1-1 .7 0 1.1.5 1.1 1s-.4 1-1 1a1 1 0 01-1-1\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M191.6 163.4c0-.5.5-1 1-1 .7 0 1.1.5 1.1 1s-.4 1-1 1a1 1 0 01-1-1z\"/>\n <path fill=\"#fff\" d=\"M194.9 163.5c0-.6.4-1 1-1s1 .4 1 1c0 .5-.4 1-1 1a1 1 0 01-1-1\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M194.9 163.5c0-.6.4-1 1-1s1 .4 1 1c0 .5-.4 1-1 1a1 1 0 01-1-1z\"/>\n <path fill=\"#fff\" d=\"M198.2 164c0-.5.5-1 1-1 .7 0 1.1.5 1.1 1s-.4 1-1 1a1 1 0 01-1-1\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M198.2 164c0-.5.5-1 1-1 .7 0 1.1.5 1.1 1s-.4 1-1 1a1 1 0 01-1-1z\"/>\n <path fill=\"#fff\" d=\"M201.3 165.1c0-.5.5-1 1-1 .7 0 1.1.5 1.1 1s-.4 1-1 1a1 1 0 01-1-1\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".4\" d=\"M201.3 165.1c0-.5.5-1 1-1 .7 0 1.1.5 1.1 1s-.4 1-1 1a1 1 0 01-1-1z\"/>\n <path fill=\"#c8b100\" stroke=\"#000\" stroke-width=\".4\" d=\"M174.7 228.9h-1v-1h-1.5v3.6h1.6v2.5h-3.4v7h1.8v14.3h-3.5v7.3h27.2v-7.3h-3.5V241h1.8v-7h-3.4v-2.5h1.6V228h-1.6v.9h-.8v-1h-1.6v1h-1.1v-1h-1.6v3.6h1.6v2.5H184v-7.8h1.7v-3.5H184v.9h-1v-1h-1.5v1h-.9v-1H179v3.6h1.7v7.8h-3.3v-2.5h1.6V228h-1.6v.9h-.9v-1h-1.8v1zm-6 33.7H196m-27.3-1.8H196m-27.3-1.8H196m-27.3-1.7H196m-27.3-2H196m-23.8-1.6h20.2m-20.2-1.8h20.2m-20.2-2h20.2m-20.2-1.7h20.2m-20.2-1.8h20.2m-20.2-1.8h20.2m-20.2-1.7h20.2m-22-1.8h23.8m-23.8-1.8h23.8m-23.8-1.8h23.8m-23.8-1.8h23.8m-20.4-1.7h17m-10.2-1.8h3.4m-3.4-1.8h3.4m-3.4-1.8h3.4m-3.4-1.7h3.4m-5.1-2.2h6.8m-12 7.5h3.6m-5-2.2h6.6m-6.7 32.6v-1.8m0-1.8v-1.7m-1.8 1.7v1.8m3.4 0V259m1.7 3.6v-1.8m0-1.8v-1.7m0-2v-1.6m0-1.8v-2m-1.7 7.4v-2m-3.4 2v-2m7 0v2m1.5-2v-1.6m-5.1-1.8v1.8m3.5-1.8v1.8m3.3-1.8v1.8M179 252v-2m1.7-1.7v1.7m0-5.3v1.8m-1.7-3.6v1.8m1.7-3.5v1.7m-3.3-1.7v1.7m-3.5-1.7v1.7m-1.6-3.5v1.8m3.3-1.8v1.8m3.4-1.8v1.8m1.7-3.6v1.8m-3.3-1.8v1.8m-3.5-1.8v1.8m-1.6-3.6v1.8m6.7-1.8v1.8m-3.4-5.3v1.8m15.3-1.8h-3.5m5-2.2h-6.6m6.7 32.6v-1.8m0-1.8v-1.7m1.8 1.7v1.8m-3.4 0V259m-1.7 3.6v-1.8m0-1.8v-1.7m0-2v-1.6m0-1.8v-2m1.7 7.4v-2m3.4 2v-2m-7 0v2m-1.5-2v-1.6m5.1-1.8v1.8m-3.5-1.8v1.8m-3.3-1.8v1.8m1.7-1.8v-2m-1.7-1.7v1.7m0-5.3v1.8m1.7-3.6v1.8m-1.7-3.5v1.7m3.3-1.7v1.7m3.5-1.7v1.7m1.6-3.5v1.8m-3.3-1.8v1.8m-3.4-1.8v1.8m-1.7-3.6v1.8m3.3-1.8v1.8m3.5-1.8v1.8m1.6-3.6v1.8m-6.7-1.8v1.8m3.4-5.3v1.8m-7 18v-2m0-5.4v-1.8m0 5.4v-1.8m0-5.3v-1.8m0-1.8v-1.7m0-3.6v-1.8m0-1.7v-1.8m-8.3 4.6h3.5m3.3-5.3h3.4m3.3 5.3h3.5\"/>\n <path fill=\"#c8b100\" stroke=\"#000\" stroke-width=\".4\" d=\"M186.8 262.6v-4.7c0-.8-.4-3.5-4.6-3.5-4 0-4.4 2.7-4.4 3.5v4.7h9z\"/>\n <path fill=\"#c8b100\" stroke=\"#000\" stroke-width=\".4\" d=\"M179.3 258.2l-2.2-.3c0-.9.2-2.2.9-2.6l2 1.5c-.3.2-.7 1-.7 1.4zm6 0l2.2-.3c0-.9-.2-2.2-.9-2.6l-2 1.5c.3.2.7 1 .7 1.4zm-2.2-2.3l1-2a5.3 5.3 0 00-2-.4l-1.7.4 1.1 2h1.6zm-4.2-5.5v-4.9c0-1.3-1-2.4-2.5-2.4s-2.4 1-2.4 2.4v4.9h4.9zm6.8 0v-4.9c0-1.3 1-2.4 2.5-2.4s2.4 1 2.4 2.4v4.9h-4.9zm-1.7-12l.4-4.4h-4.2l.2 4.4h3.6zm3.3 0l-.4-4.4h4.4l-.5 4.4h-3.5zm-10 0l.2-4.4h-4.2l.5 4.4h3.5z\"/>\n <path fill=\"#0039f0\" d=\"M185.3 262.6v-4c0-.7-.5-2.7-3.1-2.7-2.4 0-2.9 2-2.9 2.7v4h6zm-6.9-12.7v-4.2c0-1-.6-2.2-2-2.2s-2 1.1-2 2.2v4.3h4zm7.8 0v-4.2c0-1 .7-2.2 2-2.2s2 1.1 2 2.2v4.3h-4z\"/>\n <path fill=\"#ad1519\" d=\"M190.8 269.8c0-9.7 7-17.6 15.6-17.6s15.6 7.9 15.6 17.6-7 17.5-15.6 17.5-15.6-7.8-15.6-17.5\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".6\" d=\"M190.8 269.8c0-9.7 7-17.6 15.6-17.6s15.6 7.9 15.6 17.6-7 17.5-15.6 17.5-15.6-7.8-15.6-17.5z\"/>\n <path fill=\"#005bbf\" d=\"M195.4 269.7c0-7 5-12.8 11-12.8s11 5.7 11 12.8c0 7.2-5 13-11 13s-11-5.8-11-13\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".6\" d=\"M195.4 269.7c0-7 5-12.8 11-12.8s11 5.7 11 12.8c0 7.2-5 13-11 13s-11-5.8-11-13z\"/>\n <path fill=\"#c8b100\" d=\"M201.2 260.9s-1.3 1.4-1.3 2.7a6 6 0 00.6 2.4c-.2-.5-.8-.8-1.4-.8-.8 0-1.4.6-1.4 1.3l.2.8.5.9c.1-.3.5-.5 1-.5s1 .4 1 1a.9.9 0 010 .2h-1.2v1h1l-.8 1.5 1-.4.8.9.8-.9 1 .4-.7-1.5h1v-1h-1.1a.9.9 0 010-.3 1 1 0 011-1c.4 0 .7.3 1 .6l.4-1 .2-.7a1.4 1.4 0 00-1.4-1.3c-.7 0-1.2.3-1.4.9 0 0 .6-1.2.6-2.5s-1.4-2.7-1.4-2.7\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-linejoin=\"round\" stroke-width=\".3\" d=\"M201.2 260.9s-1.3 1.4-1.3 2.7a6 6 0 00.6 2.4c-.2-.5-.8-.8-1.4-.8-.8 0-1.4.6-1.4 1.3l.2.8.5.9c.1-.3.5-.5 1-.5s1 .4 1 1a.9.9 0 010 .2h-1.2v1h1l-.8 1.5 1-.4.8.9.8-.9 1 .4-.7-1.5h1v-1h-1.1a.9.9 0 010-.3 1 1 0 011-1c.4 0 .7.3 1 .6l.4-1 .2-.7a1.4 1.4 0 00-1.4-1.3c-.7 0-1.2.3-1.4.9 0 0 .6-1.2.6-2.5s-1.4-2.7-1.4-2.7z\"/>\n <path fill=\"#c8b100\" d=\"M199.2 269.9h4.1v-1h-4.1v1z\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M199.2 269.9h4.1v-1h-4.1v1z\"/>\n <path fill=\"#c8b100\" d=\"M211.4 260.9s-1.3 1.4-1.3 2.7c0 1.3.6 2.4.6 2.4-.2-.5-.7-.8-1.4-.8-.8 0-1.4.6-1.4 1.3l.2.8.5.9c.2-.3.5-.5 1-.5a1 1 0 011 1 .9.9 0 010 .2h-1.2v1h1l-.8 1.5 1-.4.8.9.8-.9 1 .4-.7-1.5h1v-1h-1.1a.8.8 0 010-.3 1 1 0 011-1c.4 0 .8.3 1 .6l.4-1 .2-.7a1.4 1.4 0 00-1.4-1.3c-.6 0-1.2.3-1.4.9 0 0 .6-1.2.6-2.5s-1.4-2.7-1.4-2.7\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-linejoin=\"round\" stroke-width=\".3\" d=\"M211.4 260.9s-1.3 1.4-1.3 2.7c0 1.3.6 2.4.6 2.4-.2-.5-.7-.8-1.4-.8-.8 0-1.4.6-1.4 1.3l.2.8.5.9c.2-.3.5-.5 1-.5a1 1 0 011 1 .9.9 0 010 .2h-1.2v1h1l-.8 1.5 1-.4.8.9.8-.9 1 .4-.7-1.5h1v-1h-1.1a.8.8 0 010-.3 1 1 0 011-1c.4 0 .8.3 1 .6l.4-1 .2-.7a1.4 1.4 0 00-1.4-1.3c-.6 0-1.2.3-1.4.9 0 0 .6-1.2.6-2.5s-1.4-2.7-1.4-2.7z\"/>\n <path fill=\"#c8b100\" d=\"M209.4 269.9h4.1v-1h-4.1v1z\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M209.4 269.9h4.1v-1h-4.1v1z\"/>\n <path fill=\"#c8b100\" d=\"M206.3 269.6s-1.3 1.5-1.3 2.8.6 2.4.6 2.4c-.2-.5-.7-.9-1.4-.9-.8 0-1.4.6-1.4 1.4l.2.7.5 1c.1-.4.5-.6 1-.6a1 1 0 011 1 .9.9 0 010 .3h-1.2v1h1l-.8 1.5 1-.4.8.9.8-1 1 .5-.7-1.5h1v-1h-1.1a.9.9 0 010-.3 1 1 0 011-1c.4 0 .7.2.9.6l.5-1 .2-.7a1.4 1.4 0 00-1.4-1.4c-.7 0-1.2.4-1.4 1 0 0 .6-1.2.6-2.5s-1.4-2.7-1.4-2.7\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-linejoin=\"round\" stroke-width=\".3\" d=\"M206.3 269.6s-1.3 1.5-1.3 2.8.6 2.4.6 2.4c-.2-.5-.7-.9-1.4-.9-.8 0-1.4.6-1.4 1.4l.2.7.5 1c.1-.4.5-.6 1-.6a1 1 0 011 1 .9.9 0 010 .3h-1.2v1h1l-.8 1.5 1-.4.8.9.8-1 1 .5-.7-1.5h1v-1h-1.1a.9.9 0 010-.3 1 1 0 011-1c.4 0 .7.2.9.6l.5-1 .2-.7a1.4 1.4 0 00-1.4-1.4c-.7 0-1.2.4-1.4 1 0 0 .6-1.2.6-2.5s-1.4-2.7-1.4-2.7z\"/>\n <path fill=\"#c8b100\" d=\"M204.3 278.6h4.1v-1h-4.1v1z\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M204.3 278.6h4.1v-1h-4.1v1z\"/>\n <path fill=\"#c8b100\" d=\"M237.6 223.4h-.3a1.5 1.5 0 01-.3.4c-.2.2-.6.2-.8 0a.5.5 0 01-.1-.4.5.5 0 01-.5 0c-.3-.1-.3-.5-.1-.7v-.5h-.3l-.1.2c-.2.3-.5.3-.7.2a.6.6 0 010-.2h-.3c-.5.2-.7-1-.7-1.2l-.2.2s.2.7.1 1.2c0 .6-.3 1.2-.3 1.2a9 9 0 012.9 1.6 9 9 0 012.2 2.3l1.2-.5c.6-.2 1.3-.2 1.3-.2l.2-.2c-.3 0-1.5.1-1.5-.4v-.2a.7.7 0 01-.2 0c-.2-.2-.2-.4 0-.7l.2-.1v-.3h-.3l-.2.1c-.2.3-.6.3-.8 0a.4.4 0 01-.1-.4.6.6 0 01-.5 0c-.2-.2-.3-.5 0-.8l.2-.3v-.3\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M237.6 223.4h-.3a1.5 1.5 0 01-.3.4c-.2.2-.6.2-.8 0a.5.5 0 01-.1-.4.5.5 0 01-.5 0c-.3-.1-.3-.5-.1-.7v-.5h-.3l-.1.2c-.2.3-.5.3-.7.2a.6.6 0 010-.2h-.3c-.5.2-.7-1-.7-1.2l-.2.2s.2.7.1 1.2c0 .6-.3 1.2-.3 1.2a9 9 0 012.9 1.6 9 9 0 012.2 2.3l1.2-.5c.6-.2 1.3-.2 1.3-.2l.2-.2c-.3 0-1.5.1-1.5-.4v-.2a.7.7 0 01-.2 0c-.2-.2-.2-.4 0-.7l.2-.1v-.3h-.3l-.2.1c-.2.3-.6.3-.8 0a.4.4 0 01-.1-.4.6.6 0 01-.5 0c-.2-.2-.3-.5 0-.8l.2-.3v-.3z\"/>\n <path d=\"M235.4 224h.2v.3h-.1c-.1 0-.1-.2 0-.2\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".1\" d=\"M235.4 224h.2v.3h-.1c-.1 0-.1-.2 0-.2z\"/>\n <path d=\"M236.3 224.8l-.3-.2v-.2h.1l.4.3.3.2v.2h-.2l-.3-.3\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".1\" d=\"M236.3 224.8l-.3-.2v-.2h.1l.4.3.3.2v.2h-.2l-.3-.3\"/>\n <path d=\"M234.6 223.7l-.2-.2s-.1 0 0-.1l.3.1.3.1v.2h-.1l-.3-.1\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".1\" d=\"M234.6 223.7l-.2-.2s-.1 0 0-.1l.3.1.3.1v.2h-.1l-.3-.1\"/>\n <path d=\"M233.7 223h.2v.2h-.2s-.1-.1 0-.2\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".1\" d=\"M233.7 223h.2v.2h-.2s-.1-.1 0-.2z\"/>\n <path d=\"M237.3 225.5v-.2h-.3l.1.2h.2\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".1\" d=\"M237.3 225.5v-.2h-.3l.1.2h.2z\"/>\n <path d=\"M237.9 226.2l.2.2h.1c.1 0 0-.1 0-.2l-.2-.2-.2-.2h-.1v.2l.2.2\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".1\" d=\"M237.9 226.2l.2.2h.1c.1 0 0-.1 0-.2l-.2-.2-.2-.2h-.1v.2l.2.2\"/>\n <path d=\"M238.8 227v-.3h-.3v.2h.3\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".1\" d=\"M238.8 227v-.3h-.3v.2h.3z\"/>\n <path fill=\"#c8b100\" d=\"M236.2 221.1h-.6l-.1.9v.1h.2l.7-.5-.3-.5\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M236.2 221.1h-.6l-.1.9v.1h.2l.7-.5-.3-.5\"/>\n <path fill=\"#c8b100\" d=\"M234.6 221.6v.5l.9.1h.1v-.2l-.5-.7-.5.3\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M234.6 221.6v.5l.9.1h.1v-.2l-.5-.7-.5.3\"/>\n <path fill=\"#c8b100\" d=\"M236.4 222.6l-.4.3-.6-.7v-.1h1.1v.5\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M236.4 222.6l-.4.3-.6-.7v-.1h1.1v.5\"/>\n <path fill=\"#c8b100\" d=\"M235.3 222a.3.3 0 01.4 0 .3.3 0 010 .3.3.3 0 01-.3 0 .3.3 0 01-.1-.3\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M235.3 222a.3.3 0 01.4 0 .3.3 0 010 .3.3.3 0 01-.3 0 .3.3 0 01-.1-.3z\"/>\n <path fill=\"#c8b100\" d=\"M233.2 221.1l-.2-.7-.4-.4s.4-.2.8.1c.4.3 0 .9 0 .9l-.2.1\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M233.2 221.1l-.2-.7-.4-.4s.4-.2.8.1c.4.3 0 .9 0 .9l-.2.1z\"/>\n <path fill=\"#c8b100\" d=\"M234.2 221.4l-.4.4-.6-.6v-.2h1v.4\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M234.2 221.4l-.4.4-.6-.6v-.2h1v.4\"/>\n <path fill=\"#c8b100\" d=\"M233.1 221l.3-.1v.3c0 .2-.1.2-.2.2l-.1-.3\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M233.1 221l.3-.1v.3c0 .2-.1.2-.2.2l-.1-.3z\"/>\n <path fill=\"#c8b100\" d=\"M238.3 222.5h-.5l-.3.7v.2h.2l.8-.4-.2-.5\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M238.3 222.5h-.5l-.3.7v.2h.2l.8-.4-.2-.5\"/>\n <path fill=\"#c8b100\" d=\"M236.7 222.8v.5l.8.2h.1v-.2l-.4-.7-.5.2\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M236.7 222.8v.5l.8.2h.1v-.2l-.4-.7-.5.2\"/>\n <path fill=\"#c8b100\" d=\"M238.4 224l-.5.2-.4-.7v-.2h.1l.9.2-.1.5\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M238.4 224l-.5.2-.4-.7v-.2h.1l.9.2-.1.5\"/>\n <path fill=\"#c8b100\" d=\"M237.3 223.2h.4a.3.3 0 010 .4.3.3 0 01-.3 0 .3.3 0 010-.4\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M237.3 223.2h.4a.3.3 0 010 .4.3.3 0 01-.3 0 .3.3 0 010-.4z\"/>\n <path fill=\"#c8b100\" d=\"M240.2 224.3l.1.5-.8.3h-.2v-.2l.4-.8.5.2\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M240.2 224.3l.1.5-.8.3h-.2v-.2l.4-.8.5.2\"/>\n <path fill=\"#c8b100\" d=\"M240 225.8l-.5.1-.3-.8v-.1h.2l.8.3-.1.5\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M240 225.8l-.5.1-.3-.8v-.1h.2l.8.3-.1.5\"/>\n <path fill=\"#c8b100\" d=\"M238.6 224.3l-.2.5.9.3h.1v-.1l-.3-.8-.5.1\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M238.6 224.3l-.2.5.9.3h.1v-.1l-.3-.8-.5.1\"/>\n <path fill=\"#c8b100\" d=\"M239.5 225.2a.3.3 0 000-.3.3.3 0 00-.4 0 .3.3 0 000 .3.3.3 0 00.4 0\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M239.5 225.2a.3.3 0 000-.3.3.3 0 00-.4 0 .3.3 0 000 .3.3.3 0 00.4 0z\"/>\n <path fill=\"#c8b100\" d=\"M240.8 227h.8l.5.3s.1-.4-.3-.7c-.3-.3-.8.2-.8.2l-.2.2\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M240.8 227h.8l.5.3s.1-.4-.3-.7c-.3-.3-.8.2-.8.2l-.2.2z\"/>\n <path fill=\"#c8b100\" d=\"M240.3 226.1l-.3.5.8.5v-.1h.2l-.1-1-.6.1\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M240.3 226.1l-.3.5.8.5v-.1h.2l-.1-1-.6.1\"/>\n <path fill=\"#c8b100\" d=\"M241 227s.1-.1 0-.2h-.3c-.2 0-.2.1-.1.2h.3\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".3\" d=\"M241 227s.1-.1 0-.2h-.3c-.2 0-.2.1-.1.2h.3zm38-21.9v.6h-2.4v-.6h1v-1.3h-.7v-.5h.6v-.6h.6v.6h.6v.6h-.6v1.2h1\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\"0\" d=\"M134.4 217.1v-1.2m-.4 1.2v-1.2m-.2 1.2v-1.2m-.3 1.2v-1.2\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".1\" d=\"M133.2 217.1v-1.2m-.5 1.1v-1m.2 1v-1m-.7 1v-1m.2 1v-1m-.9 1v-1m.2 1v-1m.3 1v-1m-.7 1v-1m-.3.9v-.8m-.1.8v-.8m-.5.7v-.6m.2.6v-.6m-.4.5v-.5m-.2.5v-.4m-.3.3v-.3m-.3.3v-.2\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".2\" d=\"M129.2 216.6v-.2\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\"0\" d=\"M135.7 217v-1m-.5 1v-1m-.4 1.2V216m143 1.1V216m-.4 1.1V216m-.3 1.1V216m-.3 1.2V216\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".1\" d=\"M276.6 217.1V216m-.6 1v-1m.3 1v-1m-.8 1v-1m.3 1v-1m-.9 1v-1m.2 1v-1m.2 1v-1m-.6 1v-1m-.3.9v-.8m-.2.8v-.8m-.4.7v-.6m.2.6v-.6m-.5.6v-.6m-.2.5v-.4m-.3.4v-.4m-.2.3v-.2\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\".2\" d=\"M272.6 216.6v-.2\"/>\n <path fill=\"none\" stroke=\"#000\" stroke-width=\"0\" d=\"M279.1 217v-1m-.6 1v-1m-.4 1.1V216\"/>\n</svg>";
var de$1 = "<svg xmlns=\"http://www.w3.org/2000/svg\" id=\"flag-icon-css-de\" viewBox=\"0 0 640 480\">\n <path fill=\"#ffce00\" d=\"M0 320h640v160H0z\"/>\n <path d=\"M0 0h640v160H0z\"/>\n <path fill=\"#d00\" d=\"M0 160h640v160H0z\"/>\n</svg>";
var fr$1 = "<svg xmlns=\"http://www.w3.org/2000/svg\" id=\"flag-icon-css-fr\" viewBox=\"0 0 640 480\">\n <g fill-rule=\"evenodd\" stroke-width=\"1pt\">\n <path fill=\"#fff\" d=\"M0 0h640v480H0z\"/>\n <path fill=\"#00267f\" d=\"M0 0h213.3v480H0z\"/>\n <path fill=\"#f31830\" d=\"M426.7 0H640v480H426.7z\"/>\n </g>\n</svg>";
var id$1 = "<svg xmlns=\"http://www.w3.org/2000/svg\" id=\"flag-icon-css-id\" viewBox=\"0 0 640 480\">\n <g fill-rule=\"evenodd\" stroke-width=\"1pt\">\n <path fill=\"#e70011\" d=\"M0 0h640v249H0z\"/>\n <path fill=\"#fff\" d=\"M0 240h640v240H0z\"/>\n </g>\n</svg>";
var pt$1 = "<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" id=\"flag-icon-css-pt\" viewBox=\"0 0 640 480\">\n <path fill=\"red\" d=\"M256 0h384v480H256z\"/>\n <path fill=\"#060\" d=\"M0 0h256v480H0z\"/>\n <g fill=\"#ff0\" fill-rule=\"evenodd\" stroke=\"#000\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\".6\">\n <path d=\"M339.5 306.2c-32.3-1-180-93.2-181-108l8.1-13.5c14.7 21.3 165.7 111 180.6 107.8l-7.7 13.7\"/>\n <path d=\"M164.9 182.8c-2.9 7.8 38.6 33.4 88.4 63.8 49.9 30.3 92.9 49 96 46.4l1.5-2.8c-.6 1-2 1.3-4.3.6-13.5-3.9-48.6-20-92.1-46.4-43.6-26.4-81.4-50.7-87.3-61a6.3 6.3 0 01-.6-3.1h-.2l-1.2 2.2-.2.3zm175.3 123.8c-.5 1-1.6 1-3.5.8-12-1.3-48.6-19.1-91.9-45-50.4-30.2-92-57.6-87.4-64.8l1.2-2.2.2.1c-4 12.2 82.1 61.4 87.2 64.6 49.8 30.8 91.8 48.9 95.5 44.2l-1.3 2.3z\"/>\n <path d=\"M256.2 207.2c32.2-.3 72-4.4 95-13.6l-5-8c-13.5 7.5-53.5 12.5-90.3 13.2-43.4-.4-74.1-4.5-89.5-14.8l-4.6 8.6c28.2 12 57.2 14.5 94.4 14.6\"/>\n <path d=\"M352.5 193.8c-.8 1.3-15.8 6.4-37.8 10.2a381.2 381.2 0 01-58.6 4.3 416.1 416.1 0 01-56.2-3.6c-23.1-3.6-35-8.6-39.5-10.4l1.1-2.2c12.7 5 24.7 8 38.7 10.2A411.5 411.5 0 00256 206a391.8 391.8 0 0058.3-4.3c22.5-3.7 34.8-8.4 36.6-10.5l1.6 2.7zm-4.4-8.1c-2.4 2-14.6 6.3-36 9.7a388.2 388.2 0 01-55.8 4c-22 0-40.1-1.6-53.8-3.6-21.8-2.8-33.4-8-37.6-9.4l1.3-2.2c3.3 1.7 14.4 6.2 36.5 9.3a385 385 0 0053.6 3.4 384 384 0 0055.4-4c21.5-3 33.1-8.4 34.9-9.8l1.5 2.6zM150.3 246c19.8 10.7 63.9 16 105.6 16.4 38 .1 87.4-5.8 105.9-15.6l-.5-10.7c-5.8 9-58.8 17.7-105.8 17.4-47-.4-90.7-7.6-105.3-17v9.5\"/>\n <path d=\"M362.8 244.5v2.5c-2.8 3.4-20.2 8.4-42 12a434 434 0 01-65.4 4.4 400 400 0 01-62-4.3 155 155 0 01-44.4-12v-2.9c9.7 6.4 35.9 11.2 44.7 12.6 15.8 2.4 36.1 4.2 61.7 4.2 26.9 0 48.4-1.9 65-4.4 15.7-2.3 38-8.2 42.4-12.1zm0-9v2.5c-2.8 3.3-20.2 8.3-42 11.9a434 434 0 01-65.4 4.5 414 414 0 01-62-4.3 155 155 0 01-44.4-12v-3c9.7 6.5 36 11.2 44.7 12.6a408 408 0 0061.7 4.3c26.9 0 48.5-2 65-4.5 15.7-2.2 38-8.1 42.4-12zm-107 68.8c-45.6-.2-84.7-12.4-93-14.4l6 9.4a249.8 249.8 0 0087.4 14.3c34.7-1 65-3.7 86.3-14.1l6.2-9.8c-14.5 6.9-64 14.6-93 14.6\"/>\n <path d=\"M344.9 297.3a143 143 0 01-2.8 4c-10 3.6-26 7.4-32.6 8.4a295.5 295.5 0 01-53.7 5c-40.4-.6-73.5-8.5-89-15.3l-1.3-2.1.2-.4 2.1.9a286.5 286.5 0 0088.2 14.5c18.8 0 37.5-2.1 52.6-4.8 23.2-4.7 32.6-8.2 35.5-9.8l.7-.4zm5.3-8.8a287.2 287.2 0 01-2 3.5c-5.4 2-20 6.2-41.3 9.2-14 1.9-22.7 3.8-50.6 4.3a347.4 347.4 0 01-94.2-14L161 289a390 390 0 0095.4 14c25.5-.5 36.4-2.4 50.3-4.3 24.8-3.8 37.3-8 41-9.1a2.9 2.9 0 000-.2l2.6-1z\"/>\n <path d=\"M350.8 237.6c.1 30-15.3 57-27.6 68.8a99.3 99.3 0 01-67.8 28.2c-30.3.5-58.8-19.2-66.5-27.9a101 101 0 01-27.5-67.4c1.8-32.8 14.7-55.6 33.3-71.3a99.6 99.6 0 0164.2-22.7 98.2 98.2 0 0171 35.6c12.5 15.2 18 31.7 20.9 56.7zM255.6 135a106 106 0 01106 105.2 105.6 105.6 0 11-211.4 0c-.1-58 47.3-105.2 105.4-105.2\"/>\n <path d=\"M255.9 134.5c58.2 0 105.6 47.4 105.6 105.6S314.1 345.7 256 345.7s-105.6-47.4-105.6-105.6c0-58.2 47.4-105.6 105.6-105.6zM152.6 240c0 56.8 46.7 103.3 103.3 103.3 56.6 0 103.3-46.5 103.3-103.3s-46.7-103.3-103.3-103.3S152.6 183.2 152.6 240z\"/>\n <path d=\"M256 143.3a97 97 0 0196.7 96.7 97.1 97.1 0 01-96.7 96.8c-53 0-96.7-43.6-96.7-96.8a97.1 97.1 0 0196.7-96.7zM161.6 240c0 52 42.6 94.4 94.4 94.4s94.4-42.5 94.4-94.4c0-52-42.6-94.4-94.4-94.4a94.8 94.8 0 00-94.4 94.4z\"/>\n <path d=\"M260.3 134h-9.1v212.3h9z\"/>\n <path d=\"M259.3 132.8h2.3v214.7h-2.2V132.8zm-9 0h2.4v214.7h-2.3V132.8z\"/>\n <path d=\"M361.6 244.2v-7.8l-6.4-6-36.3-9.6-52.2-5.3-63 3.2-44.8 10.6-9 6.7v7.9l22.9-10.3 54.4-8.5h52.3l38.4 4.2 26.6 6.4z\"/>\n <path d=\"M256 223.8c24.9 0 49 2.3 68.3 6 19.8 4 33.7 9 38.5 14.5v2.8c-5.8-7-24.5-12-39-15-19-3.6-43-6-67.9-6-26.1 0-50.5 2.6-69.3 6.2-15 3-35.1 9-37.6 14.8v-2.9c1.3-4 16.3-10 37.3-14.3 18.9-3.7 43.3-6.1 69.6-6.1zm0-9.1a383 383 0 0168.3 6c19.8 4 33.7 9 38.5 14.6v2.7c-5.8-6.9-24.5-12-39-14.9-19-3.7-43-6-67.9-6a376 376 0 00-69.2 6.2c-14.5 2.7-35.4 8.9-37.7 14.7v-2.8c1.4-4 16.6-10.3 37.3-14.3 19-3.7 43.3-6.2 69.7-6.2zm-.6-46.2c39.3-.2 73.6 5.5 89.3 13.5l5.7 10c-13.6-7.4-50.6-15-94.9-14-36.1.3-74.7 4-94 14.4l6.8-11.4c15.9-8.3 53.3-12.5 87.1-12.5\"/>\n <path d=\"M256 176.7a354 354 0 0161.3 4.3c16 3 31.3 7.4 33.5 9.8l1.7 3c-5.3-3.4-18.6-7.3-35.6-10.5s-38.7-4.3-61-4.2c-25.3-.1-45 1.2-61.8 4.2a108.9 108.9 0 00-33.3 10.3l1.7-3.1c6-3 15.3-6.7 31.1-9.6 17.5-3.2 37.4-4.1 62.4-4.2zm0-9c21.4-.2 42.6 1 59.1 4a96 96 0 0130.6 10l2.5 4c-4.2-4.7-20-9.2-34.1-11.6-16.4-2.9-36.7-4-58.1-4.2a361 361 0 00-59.5 4.4 97.3 97.3 0 00-29.6 9.1l2.2-3.3c5.8-3 15.2-5.8 27-8.1a357 357 0 0159.9-4.4zM308.4 284a276.4 276.4 0 00-52.5-4c-65.5.8-86.6 13.5-89.2 17.3l-5-8c16.8-12 52.4-18.8 94.6-18.2 21.9.4 40.8 1.9 56.6 5l-4.5 8\"/>\n <path d=\"M255.6 278.9c18.2.3 36 1 53.3 4.2l-1.2 2.2c-16-3-33.2-4-52-4-24.3-.2-48.7 2.1-70 8.2-6.7 1.9-17.8 6.2-19 9.8l-1.2-2c.4-2.2 7-6.6 19.6-10 24.4-7 47.2-8.3 70.5-8.4zm.8-9.2a327 327 0 0157.3 5l-1.3 2.3a299 299 0 00-56-4.9c-24.2 0-49.9 1.8-73.3 8.6-7.5 2.2-20.6 7-21 10.7l-1.2-2.2c.2-3.4 11.5-7.9 21.7-10.8 23.5-6.9 49.3-8.6 73.8-8.7z\"/>\n <path d=\"M349.4 290.5l-7.8 12.3-22.7-20.1-58.6-39.5-66.2-36.3-34.3-11.7 7.3-13.6 2.5-1.3 21.3 5.3 70.4 36.3 40.6 25.6L336 272l13.9 16z\"/>\n <path d=\"M158.6 195.5c6-4 50.2 15.6 96.6 43.6 46.1 28 90.3 59.6 86.3 65.5l-1.3 2.1-.6.5c.1-.1.8-1 0-3.1-2-6.5-33.4-31.5-85.3-62.9-50.7-30.1-92.9-48.3-97-43.1l1.3-2.6zM351 290.4c3.8-7.6-37.2-38.5-88.1-68.6-52-29.5-89.6-46.9-96.5-41.7L165 183c0 .1 0-.2.4-.5 1.2-1 3.3-1 4.2-1 11.8.2 45.5 15.7 92.8 42.8 20.8 12 87.6 55 87.3 67 0 1 .1 1.2-.3 1.8l1.7-2.6z\"/>\n </g>\n <g transform=\"translate(0 26.7) scale(1.06667)\">\n <path fill=\"#fff\" stroke=\"#000\" stroke-width=\".7\" d=\"M180.6 211a58.7 58.7 0 0017.5 41.7 59 59 0 0041.8 17.6 59.4 59.4 0 0042-17.4 59 59 0 0017.4-41.8v-79.2l-118.7-.2V211z\"/>\n <path fill=\"red\" stroke=\"#000\" stroke-width=\".5\" d=\"M182.8 211.1a56.4 56.4 0 0016.8 40 57 57 0 0040.2 16.8 56.9 56.9 0 0040.2-16.6 56.4 56.4 0 0016.7-40v-77H183v76.8m91-53.7v48.9l-.1 5.1a33.2 33.2 0 01-10 24 34 34 0 01-24 10c-9.4 0-17.7-4-23.9-10.2a34 34 0 01-10-24v-54l68 .2z\"/>\n <g id=\"e\">\n <g id=\"d\" fill=\"#ff0\" stroke=\"#000\" stroke-width=\".5\">\n <path stroke=\"none\" d=\"M190.2 154.4c.1-5.5 4-6.8 4-6.8.1 0 4.3 1.4 4.3 6.9h-8.3\"/>\n <path d=\"M186.8 147.7l-.7 6.3h4.2c0-5.2 4-6 4-6 .1 0 4 1.1 4.1 6h4.2l-.8-6.4h-15zm-1 6.4h17c.3 0 .6.3.6.7 0 .5-.3.8-.6.8h-17c-.3 0-.6-.3-.6-.8 0-.4.3-.7.7-.7z\"/>\n <path d=\"M192 154c0-3.3 2.3-4.2 2.3-4.2s2.3 1 2.3 4.2H192m-5.8-9h16.3c.3 0 .6.4.6.8 0 .3-.3.6-.6.6h-16.3c-.3 0-.6-.3-.6-.7 0-.3.3-.6.6-.6zm.4 1.5H202c.3 0 .6.3.6.7 0 .4-.3.7-.6.7h-15.5c-.4 0-.6-.3-.6-.7 0-.4.2-.7.6-.7zm5-10.6h1.2v.8h.9v-.8h1.3v.9h.9v-1h1.2v2c0 .4-.2.6-.5.6h-4.4c-.3 0-.6-.2-.6-.5v-2zm4.6 2.7l.3 6.4h-4.3l.3-6.5h3.7\"/>\n <path id=\"a\" d=\"M191 141.6v3.4h-4v-3.4h4z\"/>\n <use width=\"100%\" height=\"100%\" x=\"10.6\" xlink:href=\"#a\"/>\n <path id=\"b\" d=\"M186.3 139h1.2v1h.9v-1h1.2v1h.9v-1h1.2v2c0 .4-.2.6-.5.6h-4.3a.6.6 0 01-.6-.6v-2z\"/>\n <use width=\"100%\" height=\"100%\" x=\"10.6\" xlink:href=\"#b\"/>\n <path fill=\"#000\" stroke=\"none\" d=\"M193.9 140.6c0-.6.9-.6.9 0v1.6h-.9v-1.6\"/>\n <path id=\"c\" fill=\"#000\" stroke=\"none\" d=\"M188.6 142.8c0-.6.8-.6.8 0v1.2h-.8v-1.2\"/>\n <use width=\"100%\" height=\"100%\" x=\"10.6\" xlink:href=\"#c\"/>\n </g>\n <use width=\"100%\" height=\"100%\" y=\"46.3\" xlink:href=\"#d\"/>\n <use width=\"100%\" height=\"100%\" transform=\"rotate(-45.2 312.8 180)\" xlink:href=\"#d\"/>\n </g>\n <use width=\"100%\" height=\"100%\" x=\"45.7\" xlink:href=\"#d\"/>\n <use width=\"100%\" height=\"100%\" transform=\"matrix(-1 0 0 1 479.8 0)\" xlink:href=\"#e\"/>\n <g id=\"f\" fill=\"#fff\">\n <path fill=\"#039\" d=\"M232.6 202.4a8.3 8.3 0 002.2 5.7 7.2 7.2 0 005.3 2.4c2.1 0 4-1 5.3-2.4a8.3 8.3 0 002.2-5.7v-10.8h-15v10.8\"/>\n <circle cx=\"236.1\" cy=\"195.7\" r=\"1.5\"/>\n <circle cx=\"244.4\" cy=\"195.7\" r=\"1.5\"/>\n <circle cx=\"240.2\" cy=\"199.7\" r=\"1.5\"/>\n <circle cx=\"236.1\" cy=\"203.9\" r=\"1.5\"/>\n <circle cx=\"244.4\" cy=\"203.9\" r=\"1.5\"/>\n </g>\n <use width=\"100%\" height=\"100%\" y=\"-26\" xlink:href=\"#f\"/>\n <use width=\"100%\" height=\"100%\" x=\"-20.8\" xlink:href=\"#f\"/>\n <use width=\"100%\" height=\"100%\" x=\"20.8\" xlink:href=\"#f\"/>\n <use width=\"100%\" height=\"100%\" y=\"25.8\" xlink:href=\"#f\"/>\n </g>\n</svg>";
var br = "<svg xmlns=\"http://www.w3.org/2000/svg\" id=\"flag-icon-css-br\" viewBox=\"0 0 640 480\">\n <g stroke-width=\"1pt\">\n <path fill=\"#229e45\" fill-rule=\"evenodd\" d=\"M0 0h640v480H0z\"/>\n <path fill=\"#f8e509\" fill-rule=\"evenodd\" d=\"M321.4 436l301.5-195.7L319.6 44 17.1 240.7 321.4 436z\"/>\n <path fill=\"#2b49a3\" fill-rule=\"evenodd\" d=\"M452.8 240c0 70.3-57.1 127.3-127.6 127.3A127.4 127.4 0 11452.8 240z\"/>\n <path fill=\"#ffffef\" fill-rule=\"evenodd\" d=\"M283.3 316.3l-4-2.3-4 2 .9-4.5-3.2-3.4 4.5-.5 2.2-4 1.9 4.2 4.4.8-3.3 3m86 26.3l-3.9-2.3-4 2 .8-4.5-3.1-3.3 4.5-.5 2.1-4.1 2 4.2 4.4.8-3.4 3.1m-36.2-30l-3.4-2-3.5 1.8.8-3.9-2.8-2.9 4-.4 1.8-3.6 1.6 3.7 3.9.7-3 2.7m87-8.5l-3.4-2-3.5 1.8.8-3.9-2.7-2.8 3.9-.4 1.8-3.5 1.6 3.6 3.8.7-2.9 2.6m-87.3-22l-4-2.2-4 2 .8-4.6-3.1-3.3 4.5-.5 2.1-4.1 2 4.2 4.4.8-3.4 3.2m-104.6-35l-4-2.2-4 2 1-4.6-3.3-3.3 4.6-.5 2-4.1 2 4.2 4.4.8-3.3 3.1m13.3 57.2l-4-2.3-4 2 .9-4.5-3.2-3.3 4.5-.6 2.1-4 2 4.2 4.4.8-3.3 3.1m132-67.3l-3.6-2-3.6 1.8.8-4-2.8-3 4-.5 1.9-3.6 1.7 3.8 4 .7-3 2.7m-6.7 38.3l-2.7-1.6-2.9 1.4.6-3.2-2.2-2.3 3.2-.4 1.5-2.8 1.3 3 3 .5-2.2 2.2m-142.2 50.4l-2.7-1.5-2.7 1.3.6-3-2.1-2.2 3-.4 1.4-2.7 1.3 2.8 3 .6-2.3 2M419 299.8l-2.2-1.1-2.2 1 .5-2.3-1.7-1.6 2.4-.3 1.2-2 1 2 2.5.5-1.9 1.5\"/>\n <path fill=\"#ffffef\" fill-rule=\"evenodd\" d=\"M219.3 287.6l-2.7-1.5-2.7 1.3.6-3-2.1-2.2 3-.4 1.4-2.7 1.3 2.8 3 .6-2.3 2\"/>\n <path fill=\"#ffffef\" fill-rule=\"evenodd\" d=\"M219.3 287.6l-2.7-1.5-2.7 1.3.6-3-2.1-2.2 3-.4 1.4-2.7 1.3 2.8 3 .6-2.3 2m42.3 3l-2.6-1.4-2.7 1.3.6-3-2.1-2.2 3-.4 1.4-2.7 1.3 2.8 3 .5-2.3 2.1m-4.8 17l-2.6-1.5-2.7 1.4.6-3-2.1-2.3 3-.4 1.4-2.7 1.3 2.8 3 .6-2.3 2m87.4-22.2l-2.6-1.6-2.8 1.4.6-3-2-2.3 3-.3 1.4-2.7 1.2 2.8 3 .5-2.2 2.1m-25.1 3l-2.7-1.5-2.7 1.4.6-3-2-2.3 3-.3 1.4-2.8 1.2 2.9 3 .5-2.2 2.1m-68.8-5.8l-1.7-1-1.7.8.4-1.9-1.3-1.4 1.9-.2.8-1.7.8 1.8 1.9.3-1.4 1.3m167.8 45.4l-2.6-1.5-2.7 1.4.6-3-2.1-2.3 3-.4 1.4-2.7 1.3 2.8 3 .6-2.3 2m-20.8 6l-2.2-1.4-2.3 1.2.5-2.6-1.7-1.8 2.5-.3 1.2-2.3 1 2.4 2.5.4-1.9 1.8m10.4 2.3l-2-1.2-2.1 1 .4-2.3-1.6-1.7 2.3-.3 1.1-2 1 2 2.3.5-1.7 1.6m29.1-22.8l-2-1-2 1 .5-2.3-1.6-1.7 2.3-.3 1-2 1 2.1 2.1.4-1.6 1.6m-38.8 41.8l-2.5-1.4-2.7 1.2.6-2.8-2-2 3-.3 1.3-2.5 1.2 2.6 3 .5-2.3 1.9m.6 14.2l-2.4-1.4-2.4 1.3.6-2.8-1.9-2 2.7-.4 1.2-2.5 1.1 2.6 2.7.5-2 2m-19-23.1l-1.9-1.2-2 1 .4-2.2-1.5-1.7 2.2-.2 1-2 1 2 2.2.4-1.6 1.6m-17.8 2.3l-2-1.2-2 1 .5-2.2-1.6-1.7 2.3-.2 1-2 1 2 2.1.4-1.6 1.6m-30.4-24.6l-2-1.1-2 1 .5-2.3-1.6-1.6 2.2-.3 1-2 1 2 2.2.5-1.6 1.5m3.7 57l-1.6-.9-1.8.9.4-2-1.3-1.4 1.9-.2.9-1.7.8 1.8 1.9.3-1.4 1.3m-46.2-86.6l-4-2.3-4 2 .9-4.5-3.2-3.3 4.5-.6 2.2-4 1.9 4.2 4.4.8-3.3 3.1\"/>\n <path fill=\"#fff\" fill-rule=\"evenodd\" d=\"M444.4 285.8a124.6 124.6 0 005.8-19.8c-67.8-59.5-143.3-90-238.7-83.7a124.5 124.5 0 00-8.5 20.9c113-10.8 196 39.2 241.4 82.6z\"/>\n <path fill=\"#309e3a\" d=\"M414 252.4l2.3 1.3a3.4 3.4 0 00-.3 2.2 3 3 0 001.4 1.7c.7.5 1.4.8 2 .7.6 0 1-.3 1.3-.7a1.3 1.3 0 00.2-.9 2.3 2.3 0 00-.5-1c-.2-.3-.7-1-1.5-1.8a7.7 7.7 0 01-1.8-3 3.7 3.7 0 012-4.4 3.8 3.8 0 012.3-.2 7 7 0 012.6 1.2c1.4 1 2.3 2 2.6 3.2a4.1 4.1 0 01-.6 3.3l-2.4-1.5c.3-.6.4-1.2.2-1.7-.1-.5-.5-1-1.2-1.4a3.2 3.2 0 00-1.8-.7 1 1 0 00-.9.5c-.2.3-.2.6-.1 1s.6 1.2 1.6 2.2c1 1 1.6 1.9 2 2.5a3.9 3.9 0 01-.3 4.2 4.1 4.1 0 01-1.9 1.5 4 4 0 01-2.4.3c-.9-.2-1.8-.6-2.8-1.3-1.5-1-2.4-2.1-2.7-3.3a5.4 5.4 0 01.6-4zm-11.6-7.6l2.5 1.3a3.4 3.4 0 00-.2 2.2 3 3 0 001.4 1.6c.8.5 1.4.7 2 .6.6 0 1-.3 1.3-.8a1.3 1.3 0 00.2-.8c0-.3-.2-.7-.5-1a34.6 34.6 0 00-1.6-1.8c-1.1-1.1-1.8-2-2-2.8a3.7 3.7 0 01.4-3.1 3.6 3.6 0 011.6-1.4 3.8 3.8 0 012.2-.3 7 7 0 012.6 1c1.5 1 2.4 2 2.7 3.1a4.1 4.1 0 01-.4 3.4l-2.5-1.4c.3-.7.4-1.2.2-1.7s-.6-1-1.3-1.4a3.2 3.2 0 00-1.9-.6 1 1 0 00-.8.5c-.2.3-.2.6-.1 1s.7 1.2 1.7 2.2c1 1 1.7 1.8 2 2.4a3.9 3.9 0 010 4.2 4.2 4.2 0 01-1.8 1.6 4 4 0 01-2.4.3 8 8 0 01-2.9-1.1 6 6 0 01-2.8-3.2 5.4 5.4 0 01.4-4zm-14.2-3.8l7.3-12 8.8 5.5-1.2 2-6.4-4-1.6 2.7 6 3.7-1.3 2-6-3.7-2 3.3 6.7 4-1.2 2-9-5.5zm-20.7-17l1.1-2 5.4 2.7-2.5 5c-.8.2-1.8.3-3 .2a9.4 9.4 0 01-3.3-1 7.7 7.7 0 01-3-2.6 6 6 0 01-1-3.5 8.6 8.6 0 011-3.7 8 8 0 012.6-3 6.2 6.2 0 013.6-1.1c1 0 2 .3 3.2 1 1.6.7 2.6 1.7 3.1 2.8a5 5 0 01.3 3.5l-2.7-.8a3 3 0 00-.2-2c-.3-.6-.8-1-1.6-1.4a3.8 3.8 0 00-3.1-.3c-1 .3-1.9 1.2-2.6 2.6-.7 1.4-1 2.7-.7 3.8a3.7 3.7 0 002 2.4c.5.3 1.1.5 1.7.5a6 6 0 001.8 0l.8-1.6-2.9-1.5zm-90.2-22.3l2-14 4.2.7 1.1 9.8 3.9-9 4.2.6-2 13.8-2.7-.4 1.7-10.9-4.4 10.5-2.7-.4-1.1-11.3-1.6 11-2.6-.4zm-14.1-1.7l1.3-14 10.3 1-.2 2.4-7.5-.7-.3 3 7 .7-.3 2.4-7-.7-.3 3.8 7.8.7-.2 2.4-10.6-1z\"/>\n <g stroke-opacity=\".5\">\n <path fill=\"#309e3a\" d=\"M216.5 191.3c0-1.5.3-2.6.7-3.6a6.7 6.7 0 011.4-1.9 5.4 5.4 0 011.8-1.2c1-.3 2-.5 3-.5 2.1 0 3.7.8 5 2a7.4 7.4 0 011.6 5.5c0 2.2-.7 4-2 5.3a6.5 6.5 0 01-5 1.7 6.6 6.6 0 01-4.8-2 7.3 7.3 0 01-1.7-5.3z\"/>\n <path fill=\"#f7ffff\" d=\"M219.4 191.3c0 1.5.3 2.7 1 3.6.7.8 1.6 1.3 2.8 1.3a3.5 3.5 0 002.8-1.1c.7-.8 1-2 1.1-3.7 0-1.6-.2-2.8-1-3.6a3.5 3.5 0 00-2.7-1.3 3.6 3.6 0 00-2.8 1.2c-.8.8-1.1 2-1.2 3.6z\"/>\n </g>\n <g stroke-opacity=\".5\">\n <path fill=\"#309e3a\" d=\"M233 198.5l.2-14h6c1.5 0 2.5.2 3.2.5.7.2 1.2.7 1.6 1.3s.6 1.4.6 2.3a3.8 3.8 0 01-1 2.6 4.5 4.5 0 01-2.7 1.2l1.5 1.2c.4.4.9 1.2 1.5 2.3l1.7 2.8h-3.4l-2-3.2-1.4-2a2.1 2.1 0 00-.9-.6 5 5 0 00-1.4-.2h-.6v5.8H233z\"/>\n <path fill=\"#fff\" d=\"M236 190.5h2c1.4 0 2.3 0 2.6-.2.3 0 .6-.3.8-.5s.3-.7.3-1c0-.6-.1-1-.4-1.2-.2-.3-.6-.5-1-.6h-2l-2.3-.1v3.5z\"/>\n </g>\n <g stroke-opacity=\".5\">\n <path fill=\"#309e3a\" d=\"M249 185.2l5.2.3c1.1 0 2 .1 2.6.3a4.7 4.7 0 012 1.4 6 6 0 011.2 2.4c.3.9.4 2 .3 3.3a9.3 9.3 0 01-.5 3c-.4 1-1 1.8-1.7 2.4a5 5 0 01-2 1c-.6.2-1.5.2-2.5.2l-5.3-.3.7-14z\"/>\n <path fill=\"#fff\" d=\"M251.7 187.7l-.5 9.3h3.8c.5 0 .9-.2 1.2-.5.3-.3.6-.7.8-1.3.2-.6.4-1.5.4-2.6l-.1-2.5a3.2 3.2 0 00-.8-1.4 2.7 2.7 0 00-1.2-.7 13 13 0 00-2.3-.3h-1.3z\"/>\n </g>\n <g stroke-opacity=\".5\">\n <path fill=\"#309e3a\" d=\"M317.6 210.2l3.3-13.6 4.4 1 3.2 1c.7.4 1.3 1 1.6 1.9.4.8.4 1.7.2 2.8-.2.8-.5 1.5-1 2a3.9 3.9 0 01-3 1.4c-.7 0-1.7-.2-3-.5l-1.7-.5-1.2 5.2-2.8-.7z\"/>\n <path fill=\"#fff\" d=\"M323 199.6l-.8 3.8 1.5.4c1 .2 1.8.4 2.2.3a1.9 1.9 0 001.6-1.5c0-.5 0-.9-.2-1.3a2 2 0 00-1-.9l-1.9-.5-1.3-.3z\"/>\n </g>\n <g stroke-opacity=\".5\">\n <path fill=\"#309e3a\" d=\"M330.6 214.1l4.7-13.2 5.5 2c1.5.5 2.4 1 3 1.4.5.5.9 1 1 1.8s.2 1.5 0 2.3c-.4 1-1 1.7-1.8 2.2-.8.4-1.8.5-3 .3.4.5.8 1 1 1.6l.8 2.7.6 3.1-3.1-1.1-1-3.6a19.5 19.5 0 00-.7-2.4 2.1 2.1 0 00-.6-.8c-.2-.3-.6-.5-1.3-.7l-.5-.2-2 5.6-2.6-1z\"/>\n <path fill=\"#fff\" d=\"M336 207.4l1.9.7c1.3.5 2.1.7 2.5.7.3 0 .6 0 .9-.3.3-.2.5-.5.6-.9.2-.4.2-.8 0-1.2a1.7 1.7 0 00-.8-.9l-2-.7-2-.7-1.2 3.3z\"/>\n </g>\n <g stroke-opacity=\".5\">\n <path fill=\"#309e3a\" d=\"M347 213.6a9 9 0 011.7-3.2 6.6 6.6 0 011.8-1.5 6 6 0 012-.7c1 0 2 0 3.1.4a6.5 6.5 0 014.2 3.3c.8 1.6.8 3.5.2 5.7a7.4 7.4 0 01-3.4 4.5c-1.5.9-3.3 1-5.2.4a6.6 6.6 0 01-4.2-3.3 7.3 7.3 0 01-.2-5.6z\"/>\n <path fill=\"#fff\" d=\"M349.8 214.4c-.4 1.5-.5 2.8 0 3.8s1.2 1.6 2.3 2c1 .3 2 .2 3-.4 1-.5 1.6-1.6 2.1-3.2.5-1.5.5-2.7 0-3.7a3.5 3.5 0 00-2.2-2 3.6 3.6 0 00-3 .3c-1 .6-1.7 1.6-2.2 3.2z\"/>\n </g>\n <g stroke-opacity=\".5\">\n <path fill=\"#309e3a\" d=\"M374.3 233.1l6.4-12.4 5.3 2.7a10 10 0 012.7 1.9c.5.5.8 1.1.8 1.9s0 1.5-.4 2.2a3.8 3.8 0 01-2 2c-1 .2-2 .2-3.1-.2.4.6.6 1.2.8 1.7.2.6.3 1.5.4 2.8l.2 3.2-3-1.5-.4-3.7a20 20 0 00-.3-2.5 2 2 0 00-.5-1l-1.2-.7-.5-.3-2.7 5.2-2.5-1.3z\"/>\n <path fill=\"#fff\" d=\"M380.5 227.2l1.9 1c1.2.6 2 1 2.3 1 .3 0 .7 0 1-.2.3-.1.5-.4.7-.8.2-.4.3-.8.2-1.2a2 2 0 00-.7-1 23.7 23.7 0 00-1.8-1l-2-1-1.6 3.2z\"/>\n </g>\n <g stroke-opacity=\".5\">\n <path fill=\"#309e3a\" d=\"M426.1 258.7a8.9 8.9 0 012.5-2.6 6.6 6.6 0 012.2-.9 5.5 5.5 0 012.2 0c1 .2 1.9.6 2.8 1.2a6.6 6.6 0 013 4.4c.3 1.7-.2 3.6-1.4 5.5a7.3 7.3 0 01-4.5 3.3 6.5 6.5 0 01-5.2-1.1 6.6 6.6 0 01-3-4.4c-.3-1.8.2-3.6 1.4-5.4z\"/>\n <path fill=\"#fff\" d=\"M428.6 260.3c-1 1.3-1.3 2.5-1.1 3.6a3.6 3.6 0 001.6 2.5c1 .7 2 .9 3 .6 1-.3 2-1 2.9-2.4.9-1.4 1.3-2.6 1.1-3.6-.1-1-.7-1.9-1.6-2.6s-2-.8-3-.5c-1 .2-2 1-3 2.4z\"/>\n </g>\n <path fill=\"#309e3a\" d=\"M301.8 204.5l2.3-9.8 7.2 1.7-.3 1.6-5.3-1.2-.5 2.2 4.9 1.1-.4 1.7-4.9-1.2-.6 2.7 5.5 1.3-.4 1.6-7.5-1.7z\"/>\n </g>\n</svg>";
var ru$1 = "<svg xmlns=\"http://www.w3.org/2000/svg\" id=\"flag-icon-css-ru\" viewBox=\"0 0 640 480\">\n <g fill-rule=\"evenodd\" stroke-width=\"1pt\">\n <path fill=\"#fff\" d=\"M0 0h640v480H0z\"/>\n <path fill=\"#0039a6\" d=\"M0 160h640v320H0z\"/>\n <path fill=\"#d52b1e\" d=\"M0 320h640v160H0z\"/>\n </g>\n</svg>";
var tr$1 = "<svg xmlns=\"http://www.w3.org/2000/svg\" id=\"flag-icon-css-tr\" viewBox=\"0 0 640 480\">\n <g fill-rule=\"evenodd\">\n <path fill=\"#e30a17\" d=\"M0 0h640v480H0z\"/>\n <path fill=\"#fff\" d=\"M407 247.5c0 66.2-54.6 119.9-122 119.9s-122-53.7-122-120 54.6-119.8 122-119.8 122 53.7 122 119.9z\"/>\n <path fill=\"#e30a17\" d=\"M413 247.5c0 53-43.6 95.9-97.5 95.9s-97.6-43-97.6-96 43.7-95.8 97.6-95.8 97.6 42.9 97.6 95.9z\"/>\n <path fill=\"#fff\" d=\"M430.7 191.5l-1 44.3-41.3 11.2 40.8 14.5-1 40.7 26.5-31.8 40.2 14-23.2-34.1 28.3-33.9-43.5 12-25.8-37z\"/>\n </g>\n</svg>";
var vn$1 = "<svg xmlns=\"http://www.w3.org/2000/svg\" id=\"flag-icon-css-vn\" viewBox=\"0 0 640 480\">\n <defs>\n <clipPath id=\"vn-a\">\n <path fill-opacity=\".7\" d=\"M-85.3 0h682.6v512H-85.3z\"/>\n </clipPath>\n </defs>\n <g fill-rule=\"evenodd\" clip-path=\"url(#vn-a)\" transform=\"translate(80) scale(.9375)\">\n <path fill=\"#ec0015\" d=\"M-128 0h768v512h-768z\"/>\n <path fill=\"#ff0\" d=\"M349.6 381L260 314.3l-89 67.3L204 272l-89-67.7 110.1-1 34.2-109.4L294 203l110.1.1-88.5 68.4 33.9 109.6z\"/>\n </g>\n</svg>";
var hr$1 = "<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" id=\"flag-icon-css-hr\" viewBox=\"0 0 640 480\">\n <path fill=\"#171796\" d=\"M0 0h640v480H0z\"/>\n <path fill=\"#fff\" d=\"M0 0h640v320H0z\"/>\n <path fill=\"red\" d=\"M0 0h640v160H0zm320 364.1c51.3 0 93.3-42 93.3-93.3V160H226.7v110.8c0 51.4 42 93.4 93.3 93.4z\"/>\n <path fill=\"#fff\" d=\"M320 362.6a91.8 91.8 0 0091.6-91.5V161.8H228.5V271a91.8 91.8 0 0091.5 91.5z\"/>\n <g fill=\"red\">\n <path d=\"M267.1 165.2H232v38.7h35.2zm0 77.4h35.3v-38.7H267zM232 270.9c0 3.5.2 7 .6 10.4h34.6v-38.7H232v28.3zm105.7-28.3h-35.2v38.7h35.2zm0 77.4h35.2v-38.7h-35.2zm35.2 21.2A89.2 89.2 0 00393 320h-20v21.2zM267.1 320h35.3v-38.7H267zm-20.1 0a89.2 89.2 0 0020.1 21.2V320H247zm79.1 38.7c4-.3 7.7-.8 11.5-1.6V320h-35.2v37.1a87 87 0 0011.4 1.6c4.1.3 8.2.2 12.3 0z\"/>\n <path d=\"M407.4 281.3c.4-3.4.6-6.9.6-10.4v-28.3h-35.2v38.7h34.6zm-69.8-38.7h35.2v-38.7h-35.2zm0-77.4h-35.2v38.7h35.2zm70.4 38.7v-38.7h-35.2v38.7z\"/>\n </g>\n <path fill=\"#fff\" d=\"M410 158.8l21.8-49.5-16.6-26.8-27.6 10.2-19.4-22.2-25.4 14.7L320 66.5l-22.7 18.6-25.5-14.6-19.4 22.2-27.6-10.3-16.6 27 21.8 49.4a217.8 217.8 0 0190-19.3c32 0 62.5 6.9 90 19.3z\"/>\n <path fill=\"#0093dd\" d=\"M253 94.8l-27.4-10-15.3 24.7 5.9 13.3 14.8 33.7a219.7 219.7 0 0134.6-12L253 94.8z\"/>\n <path fill=\"#fff\" stroke=\"#000\" stroke-width=\".3\" d=\"M251.4 119.3a13.3 13.3 0 011.6 6.2c0 7.3-6 13.3-13.4 13.3a13.4 13.4 0 01-13.1-10.8 13.4 13.4 0 0011.7 6.9 13.4 13.4 0 0013.2-15.6z\"/>\n <path d=\"M227.6 114l1-4.9-3.8-3.2-.1-.1.2-.1 4.6-1.6 1-4.8v-.2l.2.1 3.7 3.2 4.6-1.6h.2v.2l-1 4.8 3.7 3.2.2.2h-.3l-4.6 1.6-1 4.8v.2l-.1-.1-3.7-3.2-4.6 1.6h-.3z\"/>\n <path fill=\"#f7db17\" d=\"M233.6 107.6l3.5 3 4.3-1.5zm0-.2l7.8 1.6-3.4-3zm-8.3-1.6l7.8 1.5-3.5-3zm7.8 1.7l-7.8-1.5 3.4 3zm.4-.3l5.2-6-4.3 1.5zm-5.6 6.4l5.2-6-4.3 1.5zm5.3-5.9l-5.2 6 4.3-1.5zm5.6-6.4l-5.2 6 4.3-1.5zm-5.6 6l-2.6-7.6-.9 4.5zm2.7 8l-2.5-7.5-.9 4.5zm-2.4-7.6l2.6 7.5.9-4.5zm-2.7-8l2.5 7.5 1-4.5z\"/>\n <path fill=\"#171796\" d=\"M297.5 87.4L272.1 73 253 94.9l12.6 49.6a219.8 219.8 0 0136.1-6l-4.2-51.1z\"/>\n <path fill=\"red\" d=\"M262.5 132.2a232.3 232.3 0 0138.2-6.4l-1-12.9a245.6 245.6 0 00-40.4 6.7l3.2 12.6zm-6.3-25a258 258 0 0142.4-7l-1.1-12.7a270.7 270.7 0 00-44.5 7.4l3.2 12.3z\"/>\n <g transform=\"translate(-160) scale(.00237)\">\n <path fill=\"#0093dd\" d=\"M212105 36890l-23 13-9517-7794-9497 7778 1788 21560c2543-210 5113-322 7709-322 2608 0 5190 113 7744 325l1795-21560z\"/>\n <g id=\"a\">\n <path d=\"M202545 46585c-18-2-44 10-69 45-186 250-359 469-545 720-195 61-242 180-167 348-261-26-291 193-302 432-250-379-522-482-814-307-11-230-187-338-439-392-180-10-319-65-436-145-60-42-110-64-170-106-126-88-226-5-172 74 267 434 535 868 802 1302-14 80 6 151 88 204 47 133 93 265 140 397-11 38-21 75-32 113-221-105-443-118-664-133-170-8-287-50-361-137-54-63-91-26-92 82-3 534 162 1014 599 1492-231 4-462 11-694 21-79 6-95 39-73 104 126 304 339 579 822 766-208 112-327 285-357 520-9 224-75 382-212 455-60 32-81 65-24 106 253 185 565 193 895 112-157 270-226 553-198 850 208 56 412 15 614-52-29 61-44 175-52 309-7 115-41 229-104 343-32 33-65 84 4 102 336 91 648 52 915-47 0 243 2 487 76 727 18 58 70 102 125 26 155-214 322-396 527-517 31 90 75 168 156 215 96 55 147 170 153 343 0 30-2 60 35 90 149 7 514-380 589-597 206 121 284 246 439 461 55 76 99 29 128-25 62-243 67-481 66-724 267 99 579 138 915 47 69-19 36-70 4-102-62-114-105-250-113-365-9-133-14-226-43-287 202 68 405 108 614 52 29-297-53-579-211-850 330 80 655 73 908-112 57-41 35-74-24-106-136-73-203-231-212-455-30-235-149-409-357-520 483-187 696-463 822-766 22-66 6-99-73-104-231-10-480-24-711-27 437-478 606-961 604-1495-1-108-38-146-92-82-74 87-179 137-348 146-222 15-435 24-656 128-11-38-21-75-32-113 46-132 106-260 153-393 82-53 102-123 88-204 267-434 513-868 781-1302 54-79-46-162-171-74-60 42-110 64-170 106-117 80-257 134-437 145-251 54-417 167-428 397-293-175-564-73-814 307-11-239-41-457-302-432 75-168 17-291-178-352-186-250-458-470-644-720-31-35-51-47-69-45z\"/>\n <g fill=\"#f7db17\">\n <path d=\"M205075 47978c-51-26-124 17-162 95s-33 170 19 196c40 20 84-6 119-56l22-36c2-3 4-6 5-9 38-78 49-163-2-188zm-5008 0c52-26 124 17 162 95s39 165-13 191-103-24-141-102-60-158-9-184zm4539 905c-32 0-59 27-59 59s26 59 59 59 59-26 59-59c0-32-26-59-59-59zm-4032 0a59.1 59.1 0 10.2 118.2 59.1 59.1 0 00-.2-118.2zm4294-304c-754-91-1506-133-2260-133s-1509 41-2269 115c-26 8-21 90 14 86 756-73 1507-113 2256-113 743 0 1485 40 2228 129 39 4 54-80 32-84z\"/>\n <path d=\"M200319 48495c768-75 1530-117 2289-116 754 0 1507 42 2261 133l111-184c-32 10-62 9-90-5-76-38-92-161-36-274 56-114 164-175 240-138 39 19 62 62 68 114l446-739c-204 130-328 214-581 252-281 41-409 139-368 307 38 156-57 133-201 54-314-171-541 71-652 353-73 186-159 181-168-13-4-70 0-131-7-200-21-223-89-286-216-224-161 78-175 25-137-58 28-60 86-128 66-221-9-67-66-92-151-98-182-244-467-483-649-727-182 244-374 483-556 727-86 5-142 30-152 98-20 93 52 157 80 217 38 82 23 135-137 57-127-61-186-3-207 220-7 69-10 139-13 209-9 194-95 199-168 13-111-282-352-524-667-353-145 79-203 102-182-54 23-172-107-266-388-307-253-37-377-122-581-252l419 682c12-25 29-45 53-57 76-38 184 24 240 138 56 113 40 237-36 274-10 5-21 8-32 10l100 163zm4389 911c-7 3-7 4-24 11-46 19-80 66-134 124-57 60-128 125-211 188-12 10-25 19-44-6s-7-35 6-44c80-62 149-124 204-182 30-32 56-63 77-92-95-11-190-21-284-30-79 24-157 55-222 95-59 35-107 77-137 125-8 14-16 27-44 11-27-16-19-30-11-44 35-58 91-107 158-147 33-20 69-38 106-54-107-9-214-18-321-25-22 13-42 29-61 47-20 19-39 42-56 67-9 13-18 26-44 8s-18-31-8-44c19-29 41-54 64-77l9-9c-80-5-161-10-241-14-2 2-5 5-8 7a340.4 340.4 0 00-93 126c-6 15-12 29-41 18-29-12-23-26-17-41 12-29 27-55 45-81 8-11 18-22 27-33-115-5-230-9-344-12-4 5-9 8-14 11-25 15-47 32-66 51s-35 40-48 63c-8 14-16 28-43 12-28-16-20-29-12-43 16-28 35-54 59-77 7-7 14-13 21-19-122-2-244-4-365-4-120 0-240 1-360 3 8 7 15 13 22 20 23 23 42 49 59 77 8 14 16 27-12 43s-35 2-44-12c-13-23-29-44-48-63s-41-36-66-51c-6-3-12-7-15-12-115 2-230 6-345 11 11 11 20 23 29 35 19 25 33 52 45 81 6 15 12 29-17 41s-35-3-41-18c-9-24-22-46-38-67-15-21-34-41-55-59-4-3-7-6-10-10-81 4-162 8-243 13 4 4 9 8 13 12 24 23 45 48 64 77 9 13 18 26-8 44s-35 5-44-8c-18-26-36-48-56-67s-41-35-64-49c-1-1-3-2-5-3-110 7-220 14-330 23 43 18 85 38 122 61 67 40 124 89 158 147 8 14 16 27-11 44-27 16-35 3-44-11-29-48-78-90-137-125-72-44-159-77-246-102h-2c-90 7-179 15-268 24 22 33 51 68 86 106 55 58 124 120 204 182 13 9 25 19 6 44s-32 15-44 6c-83-64-155-128-211-188-37-38-99-111-135-140-196-90-354-127-575-147-153-14-318-9-458-79 36 85 75 164 126 229 53 68 120 121 209 147 8 2 21 16 22 25 28 157 84 286 169 386 52 60 114 110 188 149-75-81-132-166-172-251-67-142-90-286-77-420 1-16 3-32 34-29 32 3 30 19 29 35-11 123 9 256 72 387 56 118 159 237 291 346 24 19 0 63-29 55-154-44-290-123-383-231-89-104-149-237-180-397-94-32-165-90-222-164-47-60-85-131-118-205 28 428 182 801 456 1137 61 75 165 182 255 216 92 35 95 100-20 101-34 1-69 1-105 1 84 31 164 66 233 105 127 73 217 162 224 273 1 16 2 32-29 34-32 2-33-14-34-29-6-86-82-160-192-223-113-65-259-117-402-160-154 0-312-1-459 3 39 28 80 57 131 84 82 44 188 86 343 122 89 21 166 52 233 91 71 42 130 93 177 150 10 12 20 25-5 45s-34 8-45-5c-42-52-95-98-159-135-61-36-133-64-216-84-161-38-272-81-358-128-75-40-131-82-184-123 180 393 450 573 835 689 23 7 43 13 61 19 3 1 6 1 9 2 86 21 175 40 266 55 92 15 166 28 261 37 16 1 32 3 29 34-3 32-19 30-34 29-99-9-174-22-266-38-58-10-115-21-171-33-26 6-64 9-107 12-232 14-420 225-435 494 0 5 0 11-1 16 88-80 179-157 273-212 117-68 239-103 364-69 15 4 31 8 22 39-8 31-23 27-39 22-106-28-212 3-316 63-108 63-213 158-315 253-24 147-82 285-205 377 61 34 104 65 163 45 86-39 172-78 261-108 91-31 184-52 282-57 16-1 32-1 33 31s-14 32-31 33c-91 4-179 24-264 53-75 26-149 58-222 91 221 47 460-1 667-79 60-22 105-42 133-41 51-30 112-53 172-79 66-28 132-51 182-57 16-2 32-4 35 28 4 32-12 33-28 35-112 13-127 21-222 79 0 21-66 57-126 96-36 24-70 52-87 67-95 86-144 181-188 287-29 70-52 145-68 224 55-108 121-211 201-303 94-108 208-201 345-265 14-7 29-13 42 15 13 29-1 35-15 42-129 60-236 147-324 250-90 103-161 222-219 345-31 64-8 1-42 86 110-122 212-224 323-307 132-100 283-157 418-133 15 3 31 6 26 37s-21 28-37 26c-116-21-250 32-369 121-121 92-244 223-366 361 184 26 366-26 542-85 91-30 183-135 239-152 19-24 38-46 57-67 33-37 67-71 102-100 12-10 24-20 45 4s8 34-4 45c-33 28-65 60-96 94-32 35-62 73-92 113-6 8-13 17-24 16-60 70-151 162-172 240-57 210-25 370-122 576 71-38 128-81 175-134 53-60 94-135 128-230 37-104 95-195 167-270 75-77 165-136 261-172 15-5 30-11 41 19s-4 35-19 41c-87 32-169 86-238 157-66 68-119 151-153 247-37 102-81 183-141 250-44 50-95 91-156 127 52-3 78-10 121-7 79-6 211-66 279-119 66-51 116-120 154-206 6-15 13-29 42-16s23 27 16 42c-42 96-99 174-173 231-56 43-121 75-196 93 161-5 311-42 467-100 65-24 87-168 127-208 32-58 66-112 105-158 47-56 101-101 164-127 15-6 29-12 41 18 12 29-3 35-17 41-52 21-98 60-139 108-36 42-68 93-98 147 10 73-51 228-53 305-7 205-2 409 53 612 53-71 107-134 162-192 0-5 0-10 1-15 18-106 33-219 40-332 7-112 7-223-6-329-2-16-4-32 27-35 32-4 34 12 35 28 14 111 14 226 7 340-6 90-16 180-30 269 54-51 53-51 77-103 37-80 59-159 67-237 9-80 5-157-13-230-4-15-7-31 24-38s35 8 38 24c19 80 25 165 14 252-8 65-24 132-49 199 56-42 114-82 178-122-4-75-5-153-3-227 2-68 7-134 18-190 4-20 7-40 47-33s37 27 33 48c-9 50-14 111-16 177-2 78 0 162 4 243 5 82 49 185 125 230 103 62 158 163 186 274 16-145 17-280 3-400-17-143-55-267-114-368-8-14-16-27 12-44 27-16 35-2 43 12 63 110 104 241 122 393 17 146 13 310-13 488 102-82 381-258 352-594-7-27-16-52-28-75-7-14-14-28 14-42s35 0 42 14c17 33 30 69 39 110 5 24 8 49 11 76 13-7 45-43 51-39 24 16 58 38 80 54-21-60-35-120-42-178-10-87-5-172 14-252 4-15 7-31 38-24s27 23 24 38c-18 73-22 151-13 230 9 77 31 157 67 237 4 8 8 16 5 25 24 21 47 42 70 65-13-84-22-170-28-255-8-115-7-230 7-341 2-16 4-32 35-28s29 20 27 35c-13 106-13 217-6 329 7 113 22 225 40 332 1 2 1 5 1 7 54 59 95 120 152 196 55-203 73-407 66-612-2-76-69-227-65-302-30-55-63-107-100-151-41-49-87-87-139-108-15-6-29-12-18-41 12-29 27-24 41-18 62 26 117 71 164 127 38 45 72 98 103 154 57 7 78 179 143 212 154 57 298 94 453 100-75-19-140-50-195-93-74-57-131-135-173-231-6-15-13-29 16-42s35 2 42 16c38 86 88 156 154 206 85 66 289 124 400 127-61-37-113-78-157-128-59-67-104-148-141-250-34-95-87-179-153-247a642 642 0 00-238-157c-15-6-29-11-19-41 11-29 26-24 41-19 96 36 186 94 261 172 72 74 130 166 167 270 34 95 75 169 128 230 47 54 105 98 177 135-98-207-66-367-122-577-35-129-232-277-193-320 45-51 133 88 248 127 175 59 357 111 540 85-122-138-244-269-366-361-119-90-237-140-352-120-16 3-31 6-37-26-5-31 10-34 26-37 135-24 269 32 401 132 111 84 201 175 311 298-18-47 0-14-30-77-59-123-130-241-220-345-89-102-196-189-324-250-14-7-28-13-15-42 13-28 28-22 42-15 137 65 251 157 345 265 81 93 147 198 203 307-15-81-39-157-68-227-44-106-93-201-188-287-62-56-209-140-208-179-29-15-33-11-63-24-61-26-121-46-164-52-16-2-32-4-28-35 4-32 19-30 35-28 50 6 115 28 182 56 33 14 66 43 98 60 53 4 139 47 208 74 206 78 446 126 666 79-73-33-147-65-223-91-85-29-172-49-264-53-16-1-32-1-31-33s17-31 33-31c98 4 191 26 282 57 89 30 175 69 261 108 59 27 101-7 163-45-123-92-181-230-205-376l-2-2c-102-95-207-190-315-253-104-60-210-91-316-63-15 4-31 8-39-22-8-31 7-35 22-39 125-33 247 1 364 69 94 55 186 132 274 213 0-6-1-11-1-17-15-270-203-480-435-494-78-5-189 21-186-32 4-59 97-44 234-86 385-116 655-296 836-690-54 41-110 83-186 124-86 47-198 91-358 128-82 19-154 48-216 84-64 38-117 84-159 135-10 12-20 25-45 5s-14-32-5-45c47-57 106-108 177-150 67-39 145-70 233-91 155-36 261-78 343-122 51-27 92-55 131-84-148-4-305-3-459-3-143 44-289 96-402 160-110 63-186 136-192 223-1 16-2 32-34 29-32-2-31-18-29-34 8-111 97-200 224-273 69-39 149-74 233-105-35 0-70 0-104-1-116-2-112-66-20-101 90-34 190-141 251-216 271-334 412-714 456-1130-33 72-69 140-115 198-57 73-128 131-222 164-31 160-91 293-180 397-92 108-216 185-369 230-29 8-52-35-29-55 132-109 221-226 278-344 62-131 83-264 72-387-1-16-3-32 29-35 31-3 33 13 34 29 12 134-10 278-78 420-40 85-97 170-172 251 73-39 136-89 187-149 85-100 141-229 170-386 1-8 14-22 22-25 89-27 155-79 209-147 51-65 90-143 126-228-140 69-304 64-457 78-213 19-369 68-554 152z\"/>\n <path d=\"M204649 49231c-680-88-1359-113-2041-114-684 0-1369 40-2058 112-20 6-15 33-14 46 2 28 37 35 121 27 643-60 1285-93 1932-93 674 0 1351 21 2038 102 33 9 77-85 22-81z\"/>\n <path fill-rule=\"evenodd\" d=\"M200570 49160c683-71 1362-110 2038-110 675 0 1349 40 2025 127l31-127c-17 9-37 15-58 15a123 123 0 11113-171l60-170c-724-84-1446-122-2171-122-729 0-1459 38-2193 107l58 164c22-32 59-54 101-54a123 123 0 110 246c-12 0-25-2-36-6l33 94-2 7zm3067-416a123 123 0 100 246 123 123 0 100-246zm0 64a59.1 59.1 0 000 118c32 0 59-27 59-59s-26-59-59-59zm-1082-91a123 123 0 10123 123c0-68-55-123-123-123zm0 64a59.1 59.1 0 10.2 118.2 59.1 59.1 0 00-.2-118.2zm-1064-40a123 123 0 10-.2 245.8 123 123 0 00.2-245.8zm0 64c-33 0-59 26-59 59s26 59 59 59a59.1 59.1 0 000-118z\"/>\n </g>\n <path d=\"M202601 47974c-14-68-49-129-100-175-51-47-116-78-187-88-33-4-39-58-7-68 60-20 114-67 157-133 45-69 79-157 95-256 5-34 64-35 69-1 15 84 51 153 97 208 55 66 125 112 193 138 31 12 25 63-8 68-59 9-105 42-141 87-50 62-81 145-100 221-8 33-62 31-69-2zm33-118c20-52 47-103 81-146 28-34 60-64 99-84-51-30-100-70-143-120-28-34-53-73-73-116-19 59-45 112-75 158-31 47-67 86-108 116 50 19 95 47 134 82 34 31 63 68 85 110zm799 5115l-515 206c-17 7-35 14-48-21-14-34 4-41 21-48l515-206c17-7 35-14 48 21 14 34-4 41-21 48zm59-326l-604 328c-16 9-33 18-51-15s-1-42 15-51l604-328c16-9 33-18 51 15s1 42-15 51zm-1826-65l604 328c16 9 33 18 15 51s-34 24-51 15l-604-328c-16-9-33-18-15-51s34-24 51-15zm51 322l515 206c18 7 35 14 21 48-14 35-31 28-49 21l-515-206c-17-7-34-14-21-48 14-35 31-28 48-21zm224 434c137 33 261 48 358 31 88-16 155-60 191-146v-493c-107-1-212-15-303-41-109-31-170-98-201-178-41-107-27-235-4-329 5-18 9-36 45-27s32 27 27 45c-20 82-33 194 1 284 23 60 69 110 152 133 91 25 198 38 307 38 107 0 214-13 304-40 82-24 148-69 192-123s65-117 57-176c-5-36-24-62-49-80-34-24-82-35-128-37-47-2-94 7-142 16-25 5-50 9-77 13-19 2-37 5-42-32s14-40 32-42c23-3 48-8 73-12 52-10 105-20 159-18 60 2 121 18 168 51 42 29 72 72 80 131 11 80-16 163-73 233-53 65-131 119-229 147-83 24-178 38-274 42v483c3 5 3 11 2 16 37 82 102 125 188 141 97 18 221 2 358-31 18-5 36-9 45 27 8 37-9 41-28 45-146 35-279 51-388 32-92-17-165-58-215-132-49 74-124 115-215 132-109 20-242 4-388-32-18-4-37-8-28-45 8-36 27-32 45-27zm356 210l402-9c19 0 38-1 38 37 1 38-18 38-37 38l-402 9c-19 0-37 1-38-37s18-38 37-38zm593-3082c151-125 293-227 423-297 133-72 254-111 359-106 19 1 37 1 36 39-1 37-20 37-39 36-92-4-200 32-322 97-125 67-263 166-410 289-14 12-29 24-53-5s-9-41 5-53zm-605 56c-141-130-298-240-445-314-139-71-268-108-363-100-19 2-37 4-40-34-4-37 15-39 34-40 110-10 252 31 404 107 152 77 315 191 461 325 14 13 28 25 2 53-25 27-39 15-53 2zm-213 1004c37-83 83-155 136-219 53-63 112-119 174-170 14-12 29-24 52 5 24 29 9 41-5 53-59 48-114 101-164 160-49 59-91 125-125 201-8 17-15 34-49 19s-27-32-19-49zm371-1734c49 66 88 139 114 223 26 82 40 175 39 279 5 80 6 165-7 249-13 86-42 170-97 246-43 60-101 97-165 113-53 13-109 10-164-7 29 100 51 208 6 308-8 18-33 27-51 18-43-22-86-43-128-62s-84-36-127-51l-1-1c-95-37-173-73-236-112-65-39-115-80-150-124l1 2c-44-49-72-106-88-170-14-55-20-114-22-174-72-39-138-78-194-116-64-43-118-87-161-131-13-14-26-27 1-53s40-12 53 1c39 40 89 80 150 121 60 40 128 81 204 121 124 13 247 51 370 109 106 50 211 115 317 192 13 7 19 16 27 20 8 6 16 13 25 19 51 22 104 28 152 16 47-11 90-39 122-84 48-66 72-139 84-214 12-77 11-157 6-234v-2c1-97-12-183-35-258-24-76-58-142-102-201-11-15-22-30 7-52s41-7 52 7zm-375 1047c-104-77-207-141-311-190-105-49-210-83-314-98 2 48 8 93 18 135 13 52 35 99 71 138l1 1c30 37 73 72 130 107 60 36 134 71 225 106l-1-1c45 16 89 34 133 54 31 14 61 28 93 44 19-83-10-179-37-267-2-8-5-15-9-29zm776-1003c-44 59-79 125-102 201-24 76-36 161-35 258v2c-5 77-6 158 6 234 12 75 37 148 84 214 32 45 75 72 122 84 48 12 101 6 152-16l25-19c6-4 13-12 27-20 105-77 211-143 317-192 123-58 246-95 370-109 75-40 144-80 204-121s111-81 149-121c13-13 26-27 53-1s14 39 0 53c-43 44-97 88-161 131-57 38-122 77-194 116-2 61-8 119-22 174-16 63-44 121-88 170l1-2c-35 44-85 85-150 124-63 38-141 75-237 112l-1 1c-43 15-85 32-127 51-43 19-85 40-128 62-18 9-43 0-51-18-45-100-23-208 6-308-55 18-111 20-164 7-64-15-122-53-165-113-55-76-84-160-97-246-13-85-12-169-7-249-1-104 13-196 39-279 26-84 65-158 114-223 11-15 22-30 52-7 30 22 19 37 7 52zm940 715c-105 15-209 49-314 98-104 49-207 113-311 190-4 13-6 21-8 29-27 88-56 184-37 267 31-15 62-30 93-44 44-20 87-38 133-54l-1 1c91-35 165-70 225-106 58-34 100-70 131-107l1-1c35-39 57-86 71-138 11-42 16-87 19-135z\"/>\n <path fill-rule=\"evenodd\" d=\"M203459 50602a216.4 216.4 0 000 433 216.6 216.6 0 000-433zm0 69c-81 0-147 66-147 147s66 147 147 147 147-66 147-147-66-147-147-147zm0 60a87 87 0 10.1 174.1 87 87 0 00-.1-174.1zm-1697-124c119 0 217 97 217 216s-97 217-217 217a216.6 216.6 0 010-433zm0 69c81 0 147 66 147 147s-66 147-147 147-147-66-147-147 66-147 147-147zm0 60a87 87 0 11-.1 174.1 87 87 0 01.1-174.1z\"/>\n </g>\n <use width=\"100%\" height=\"100%\" transform=\"rotate(-2.2 -55532.8 156275.8)\" xlink:href=\"#a\"/>\n <use width=\"100%\" height=\"100%\" transform=\"rotate(2.2 459865.8 156275.8)\" xlink:href=\"#a\"/>\n </g>\n <path fill=\"#171796\" d=\"M387.2 94.9l-19.3-22-25.2 14.5-4.3 51.1a219.7 219.7 0 0136.2 6L387.2 95z\"/>\n <path d=\"M347.7 98c.8-.2 1.7-.2 2.6.3.3.1.6.3.8.6.4-.3.7-.6 1.2-.8a4 4 0 011.8-1c.9-.5 1.8-.8 2.7-.9h2.8c.8 0 1.6.2 2.3.6l2 1c.8.4 1.5.8 2.2 1a9.1 9.1 0 004.5.5c.4-.2.7.1.2.4-3.3 2-5.9.2-8.1-.6a16.2 16.2 0 012.1 1.7c.8.8 1.8 1.6 3.5 2.4a8.4 8.4 0 005 .7l.4.1-.1.5a4.8 4.8 0 01-2.6.7 10 10 0 01-5.2-1.3c-1.4-.7-2.3-1.6-3.3-2.4a7.5 7.5 0 00-3-1.4 6 6 0 00-2.9 0c.3.1.5.2.6.4.5.3 1 .4 2 .5.4 0 .2.3-.5.7a2 2 0 01-1.6.8c-1 .6-1.3.2-1.7-.2 0 .3 0 .5-.2.8a.6.6 0 010 .4l.2.7c0 .2 0 .3.2.4.2.2.3.4.3.7 0 .2.1.3.3.4l.6.6c.6.2.8.7 1 1.2.4.2.6.5.7.9.2 0 .4.2.6.4l2.6.1c.8.1 1.4.6 2 1.2h1.2a4 4 0 011.3-.3h2.3c.5.2.9.4 1.2.8.5.5 1.2.4 1.8.2a2.7 2.7 0 012.4 0 2.3 2.3 0 011-.2c.4-.3.7-.4 1-.4.6 0 1 0 .9.8 0 .2-.2.4-.3.4-.3.6-.7.7-1.3.7-.1.4-.3.7-.5.8.3.9 0 1.3-.7 1.2 0 .3-.3.4-.6.4a1.4 1.4 0 01-1 .5l.4.6c.4.7-.2 1-.8 1v1.2c.7.4.8.8.2 1.2.4.7.3 1.3-.5 1.6 0 .4 0 .8-.3 1-.2.2-.5.3-.3.6.3.5.2 1.1-.2 1.2l-.2.1-.2.2a9.6 9.6 0 00-1.5 1c-.1 0-.2.1-.2 0a9.6 9.6 0 01-1.8 2.4c0 .5-.4 1-1 1.1a.4.4 0 01-.3.4c.3.3.5.6.2 1a3 3 0 01-1.3.8c-1 .3-1.7.2-2-.2-.4-.3-.3-.6 0-.7-.7 0-.8-.2-.8-.7 0-.2.1-.2.3-.1.4 0 .7-.2 1-.3l.5-.6c0-.7.5-1 1.1-1.3.5-.2 1-.6 1.4-1.2l.9-1.5a1.2 1.2 0 01-.3-.7 1.5 1.5 0 01-.5-.6c-.5 0-.7-.2-.7-.5a1.1 1.1 0 01-.3 0c-.3.1-.5.3-.7.2a6.9 6.9 0 01-1.1 1c-.2.3-.4.5-.7.5-1 .1-1.5 1.2-2 1.7-.2.1-.3.4-.4.7 0 .6-.1 1-.4 1h-.4a1.2 1.2 0 00-.4 0c.3.3.3.6 0 .9-.1.3-.4.4-.8.4a3.6 3.6 0 01-1.6-.2c-.4-.2-.5-.5-.5-.7-.3-.2-.4-.3-.3-.5 0-.2.2-.3.4-.2l.6-.2a5.2 5.2 0 011.8-1.4 3 3 0 01.7-.7c0-.5.5-1 1-1.4l.1-.6v-.3c-.2-.3-.3-.7-.1-1a1.3 1.3 0 010-.6c-1.1.6-1.5.4-1.6-.1-.4.3-.8.5-1 0-.4.1-.8.3-1.2.1l-.8.2-.4.7c0 .5-.2 1-.5 1.5a9.3 9.3 0 01-.7 1.5 1 1 0 01-.1.5c0 .6-.2.9-.5 1a2.4 2.4 0 01-.4.8v.2c.1.3.1.7-.2 1l-1 .6h-1c-.4-.3-.4-.4-.3-.6a.6.6 0 01-.5 0l-.4-.3c-.1-.2-.1-.4.1-.5l.9-.6c0-.2.2-.3.4-.4.2-.4.4-.6.6-.7l.7-1.5c.1-.1.2-.3.1-.4l.1-.3s.2-.1 0-.2a1.4 1.4 0 01.2-1.2c.3-.4.6-1.4.3-2v-.8h-.3c-.2-.2-.4 0-.6.2l-.4.6c-.1.8-.5 1.5-1 1.6v1.2c0 .4 0 .7-.2.7s-.4.2-.5.5a1 1 0 00-.1.3c.3.3.2.7-.1 1-.6.6-1.4.5-2.2.3-.6-.3-.8-.5-.7-.8-.8 0-.7-.7 0-.9.8-.2 1.4-.7 1.9-1.4 0-.8.2-1.3.7-1.4 0-.5.2-1 .4-1.4.2-.4.3-.8.2-1.3-.4-.3-.4-.6 0-1 .1 0 .1 0 0-.2-.3 0-.3-.3-.3-.5s0-.2-.2-.2c-.6-.1-.5-.4-.2-.7.1 0 .2-.3 0-.4l-.1-.4c-.4-.3-.2-.6 0-.9l-.4-.8c-.7 0-1-.4-.6-.9a3.4 3.4 0 01.7-.6c.1-.3.3-.6.2-.8-.2-.6.5-1 1-1.4a.9.9 0 01-.1-.4c-.3-.3-.2-.6.1-.8a1 1 0 01-.1-.5c-.8.2-.8-.3-.4-1-.5-.3-.4-.8.5-1.5a1 1 0 010-.4 2 2 0 00-1 .3c-.3.3-.6.2-.9.1a1.5 1.5 0 00-.4-.4.6.6 0 01-.2-.6c-1 0-1.1-.7-.6-1 .3-.3.6-.6.7-.9.2-.6.7-1 1.3-1.5v-.5a1.6 1.6 0 00-.7-.3 1.2 1.2 0 00-.6-.7c-.1 0-.2-.2 0-.4-.6-.4-.5-.7-.3-1z\"/>\n <g fill=\"#f7db17\">\n <path d=\"M364.5 122a1.4 1.4 0 01-.2 0 8.4 8.4 0 01-.8.7c-.2-.3-.5 0-.2.1l-.2.2c0 .3-.2.4-.5.4h-.1a3 3 0 010-.3 3.5 3.5 0 010-.4 3.9 3.9 0 00-.1.4 2.8 2.8 0 000 .4c-.8.3-1.3 1.1-1.9 1.7l-.4.8c0 .2 0 .9-.3.9h-.2c0-.1-.2-.1-.4 0h-1c-.2.2.4.2.7.3.1.1.2.3.1.5-.2.7-1.8.5-2.3.2-.2-.1-.2-.3-.2-.5h.3c.2 0 .4 0 .5-.2 0 0 .1 0 0-.1 0-.1 0-.1 0 0a1.3 1.3 0 01-.5 0 2.6 2.6 0 01-.5 0h-.2c0-.1.2 0 .2 0l.7-.3a5.3 5.3 0 011.9-1.4l.8-.7c0-.7.4-1 .8-1.5l.3-.7v-.3c-.2-.4-.3-.7-.1-1a1.5 1.5 0 010-.8.3.3 0 000-.1 6.2 6.2 0 01.8-.6v.8a1.3 1.3 0 00-.2.3.5.5 0 000 .2v.1a.4.4 0 010-.3l.3-.2.7-.4.7-.6v1l-.6.7v.1h.1a2.3 2.3 0 01.5-.7 3.2 3.2 0 011-.6v1a1.5 1.5 0 00.5.9z\"/>\n <path d=\"M349 113l.2-.2.4-.6a4 4 0 01.5-.6 4 4 0 00-.4.7 5.8 5.8 0 00-.4.5v.2c.1.3.1.5.3.7l.3-.4a1.6 1.6 0 01.4-.4 1.8 1.8 0 00.5-.6h.1l-.2.4a2 2 0 01-.3.3l-.4.3a1.3 1.3 0 00-.2.4v.3c-.2.3-.5.5 0 .7a.6.6 0 00.1.5l-.1.7c-.3.2 0 .2.1.2l.4-.4a4.3 4.3 0 01.3-.4l.4-.5.1-.5h.1a1.4 1.4 0 01-.1.6 2 2 0 01-.5.5 3.8 3.8 0 00-.2.4 2.6 2.6 0 00-.3.4c.2.1.2.4.2.7h.1l.2-.2.2-.4h.1l-.2.4-.2.3c.2.1.2.3 0 .5-.4.3-.3.4 0 .7v1.2l.1.3h-.1v-.3c-.4.7-.6 1.1-.7 1.8-.6.1-.5.8-.6 1.3a3.9 3.9 0 01-1.9 1.5c-.1 0-.5.1-.5.3 0 .1.2.3.4.2.4-.5.7-.2.2.2v.3c.5.4 1.6.5 2.2.2.3-.3.5-.5.2-.9 0-.5.2-1 .8-1.2v-.4l.1-1.3.2-.1c.2 0 .6-.7.7-1.3v-.4c.1-.2.2-.2.3 0 0-.2 0-.3.2-.4.2-.3.5-.6.8-.4a3 3 0 01-.1-.8 2.7 2.7 0 010-1l.2-.2.3-.7.3-.7h.1l-.3.7-.3.8v.1a2.5 2.5 0 00-.1 1l.2.9.2.4v.6c.4.6 0 1.7-.3 2.2a1 1 0 00-.1.8c.2.2 0 .4-.1.6v.1c0 .2 0 .4-.2.5l-.7 1.6c-.4.1-.5.3-.6.7-.3.1-.3.2-.4.4a2.7 2.7 0 01-.9.6c-.3.1 0 .2.2.4.2.1.4-.2.6-.4.2-.3.3-.2.2 0a2 2 0 00-.2.7l.7.3c.4 0 .9-.4 1.2-.6.3-.2.2-.5.1-.8a2 2 0 01-.5 0 3.4 3.4 0 01-.5-.3 2.8 2.8 0 001 .2v-.3a2.7 2.7 0 00.5-.8c.4-.2.4-.4.4-.9l.1-.5a10 10 0 00.7-1.6c.4-.4.5-.9.5-1.4 0-.2.1-.3.3-.3a3.8 3.8 0 00.3-.5l.1-.4a.8.8 0 01.2-.2 1 1 0 000-.5 1.1 1.1 0 00-.1-.4.5.5 0 01-.1-.2v-.2h.1c.1 0 0 0 0 0v.1a.5.5 0 000 .2c.2.2.2.3.2.5a1 1 0 010 .5.7.7 0 00-.2.2 1.7 1.7 0 000 .3l.6-.1.4-.5.2-.6c.1 0 0 0 0 0a2 2 0 01-.1.7l-.3.3c.4.2.7 0 1 0V119l.4-.7c.1 0 .1 0 0 0l-.2.8v1c.1.4.2.5.5.3l.4-.2v-.1a18.2 18.2 0 011.8-1.6c.1.1 0 .1 0 .1a6.5 6.5 0 00-.8.7l-.8.7v.3c0 .3.1.5.6.3l.6-.2a1.3 1.3 0 01.3-.2 8 8 0 01.5-.3l.5-.3a3 3 0 01.1-.6l.7-1.3a2.3 2.3 0 001.1-1.1h.1l-.4.7a2.5 2.5 0 01-.7.5l-.7 1.2a2.7 2.7 0 00-.1.5v.1a2.8 2.8 0 000 .8c.2 0 .4 0 .7-.3l.7-.7a1.7 1.7 0 01.2-.5 1 1 0 01.4-.4h.1v.1a.9.9 0 00-.4.3 1.7 1.7 0 00-.2.5v1.1l1-.5v1c0 .3.2.6.4.8a2.8 2.8 0 01.5-.6l.3-.3.2-.2.3-.2-.2.3-.2.2-.3.2v.5h.6c0 .5 0 .6.5.6a3.2 3.2 0 010-.5l.1-.5h.1a1.9 1.9 0 00-.1.5 3.1 3.1 0 000 .5c.2.3.3.4.7.6l.2-.5a1.4 1.4 0 000-.4h.1v.5l-.3.5v.5a3 3 0 01.2-.3l.3-.4c.1 0 .1 0 0 0 0 .2 0 .3-.2.4a4 4 0 00-.2.4l.2.2c-.6 1-1.3 2.5-2.5 3-.6.2-.9.5-1 1.2a1 1 0 00-.5.6l-1.2.3c0 .3 0 .4.3.4l.7-.3c.1 0 0 .5-.5.8v.1c.4.6 1.4.4 1.9.2.4 0 1-.5 1.2-.9.1-.2 0-.4-.2-.6-.8.1-.6-.6 0-.3.2 0 .3 0 .3-.3.6-.2.9-.5 1-1 .6-.7 1.2-1.4 1.6-2.1.1-.2.2-.4.1-.5a1 1 0 00.2-.5l.1-.4h.1v.5a4.5 4.5 0 01-.2.3c0 .1 0 .2.2.2l1.5-1c0-.3.2-.4.4-.4l.2-.1c.1-.4 0-.6-.2-.8-.1-.4.1-.5.4-.7.2-.2.2-.7.2-1v-.2a2.6 2.6 0 000-.3l.1.3v.1c.3-.1.6-.3.7-.6 0-.3-.1-.6-.3-.8a9.6 9.6 0 01-.6.2 10.2 10.2 0 00.7-.4 1.3 1.3 0 00.3-.2c.2-.3-.3-.5-.5-.6l-.7-.7v-.1l.7.6v-1.1l-.2-.4a1.1 1.1 0 01-.5-.4 1 1 0 01-.1-.5l.2.4.4.4h1c.3-.3-.2-.7-.3-.9l-.1-.5h.1a1 1 0 00-.2-.2.6.6 0 00-.1 0v-.2a.7.7 0 01.2.1l.2.2a.9.9 0 00.1 0c.3 0 .5-.2.7-.5a3.6 3.6 0 00-.3-.4 10 10 0 00-.5-.3v-.1h.1a4 4 0 01.8.8c.4 0 .4 0 .6-.3a1.5 1.5 0 00-.2-.4 2.5 2.5 0 00-.3-.4c0-.1 0 0 0 0 .2 0 .3.2.4.3l.2.5.4-.1c.3-.2 0-.8 0-1a2.8 2.8 0 00-.1 0l-.2-.2c0-.1 0 0 0 0h.2l.2.1.4-.6c0-.4 0-.2.5-.3.4 0 .6 0 .9-.6.1 0 .2 0 .2-.3s0-.4-.3-.4c-.5 0-.8 0-1 .3v.3c0 .1 0 0 0 0l-.2-.2c-.4 0-.7 0-1.1.2h-.2l.2.3.1.4a1 1 0 00-.2-.4 1.8 1.8 0 00-.3-.4 2.6 2.6 0 00-1-.2l.2.1.2.2v.1a7.7 7.7 0 01-.2-.2 6.5 6.5 0 01-.2-.2 2.7 2.7 0 00-.9.2l-.6.2.4.5.2.6a2.1 2.1 0 00-.3-.6 1.9 1.9 0 00-.4-.4 1.8 1.8 0 01-.5 0l.2.3-.3-.4a1.4 1.4 0 01-.5-.2 8.3 8.3 0 01.2 1.5 7.8 7.8 0 00-.2-.9 4.7 4.7 0 00-.1-.7 1.7 1.7 0 01-.2-.2 2.1 2.1 0 00-.6-.4 1 1 0 01-.2.7c-.1 0 0 0 0 0a.8.8 0 00.1-.8 3.1 3.1 0 00-1-.2 5.3 5.3 0 01.5.8l.3.5v.5a2 2 0 00-.1-.5.7.7 0 00-.3-.4 5.6 5.6 0 00-.3-.5 4.6 4.6 0 00-.3-.4h-.4.1a.6.6 0 010 .3.5.5 0 000-.2.7.7 0 00-.2-.1h-.8a5 5 0 011 2.3 4.8 4.8 0 00-.4-1.2 5.1 5.1 0 00-.7-1h-.6a1.7 1.7 0 01.4.4c0 .1 0 .1 0 0a1.6 1.6 0 00-.3-.1 2.4 2.4 0 00-.3-.2 5 5 0 00-.3 0l-.1.1a4.7 4.7 0 011 1.1c0 .1 0 0 0 0a3.8 3.8 0 00-.6-.6 4.7 4.7 0 00-.6-.4h-.6a5 5 0 01.5 1.7h-.1a3.5 3.5 0 00-.2-.8 6.2 6.2 0 00-.3-.9 8 8 0 01-.4 0 9.1 9.1 0 01.3 1.6v.1a9.3 9.3 0 00-.2-1 9.3 9.3 0 00-.3-.8 3.9 3.9 0 00-1.3-1 1.7 1.7 0 01.4 1.1v.1a1.6 1.6 0 00-.2-.7 1.7 1.7 0 00-.4-.6 2 2 0 00-.3 0 15.6 15.6 0 00-1 0c.2.1.4.4.4.6 0-.2-.3-.5-.6-.7h-.6l.3.3.2.5.2.6.4.4s.1 0 0 0c0 .1 0 .1 0 0a1.1 1.1 0 01-.5-.3 1.5 1.5 0 01-.2-.7 1.3 1.3 0 00-.2-.4 2.7 2.7 0 00-.3-.4h-.7l.2.8.1 1h-.1a7.1 7.1 0 000-1 4.5 4.5 0 00-.3-.8 1 1 0 00-.6-.5.6.6 0 010 .3h-.1a.5.5 0 000-.3c-.2-.5-.3-.7-.6-.8v.4l-.2.4h-.1l.1-.5v-.4c0-.6-.2-1-.8-1.2v.2l-.1.5h-.1v-.5a1.9 1.9 0 000-.3l-.5-.5a2.3 2.3 0 010 .7 3 3 0 01-.4.8h-.1a3 3 0 00.3-.8 2.2 2.2 0 00.1-.8 1 1 0 01-.2-.3v.2h-.1v-.2l.1-.1v-.1a.7.7 0 00-.3-.5 1.5 1.5 0 01-.2.5h-.1c-.1 0 0 0 0 0l.1-.3.1-.3a1 1 0 01-.1-.2.8.8 0 01-.1.2 1.2 1.2 0 01-.2.2c-.1-.1 0-.1 0-.1l.1-.2a.7.7 0 00.1-.2v-.2c0-.3 0-.4-.2-.7a.9.9 0 00-.3 0 2.8 2.8 0 00-.5.4v-.1a3.2 3.2 0 01.4-.3.9.9 0 01.4-.1.4.4 0 000-.2l-1 .3a1.6 1.6 0 01-.9-.2h.8c.3 0 .7 0 1.1-.2l.2-.6a1.7 1.7 0 01-.5 0l.6-.1v-.2c0-.2.3-.2.4 0 .2 0 .3.2.4.3.3.2.6 0 .9-.2h-.2v-.1h.3c.6 0 1 0 1.4-.5a7 7 0 01-1 0c-.2 0-.4 0-.6-.2l.7.1h1l.5-.3a5.4 5.4 0 01-2-.6 1.4 1.4 0 00-.6-.3c-.5 0-1 0-1.4.3l-.3-.3-.4-.2h-.6s-.1 0 0 0h1.2a4.5 4.5 0 011.7-.3 5.7 5.7 0 011.7-.2v-.2c.3-.3.4-.6.3-.9-.1-.2-.4-.5-.8-.7h-1.3a4 4 0 00-.8.1l.6.4.4 1v.1h-.2a2 2 0 00-.4-1c-.1-.2-.6-.3-.7-.4l-1.3.2-.7.4c.3-.1.6 0 .8 0 .3.2.5.4.6.8v.1h-.2a1 1 0 00-.5-.7c-.4-.2-1.2 0-1.6.3a4.2 4.2 0 00-.6.6h-.2v-.2l.7-.6.7-.4a2 2 0 011-.5l1.3-.2a1 1 0 00-.5-.5 1.4 1.4 0 00-.8 0c-.5.1-1 .4-1.5.7h.5l.1.2h-.5a1.4 1.4 0 00-.4 0l-1.5 1.2c-.5 0-.8 0-1 .2l-.1.6-.2.7c-.5.5-1 .9-1.3 1.5a1.4 1.4 0 01-.3.5.5.5 0 01.3.1v-.2l.2-.4h.1a1.2 1.2 0 00-.1.4v.5h-.2a.3.3 0 00-.1-.2.5.5 0 00-.3 0l-.3.2-.2.3c0 .3.2.3.5.3.6 0 .1.4.4.7l.5.4h.5c0-.4 0-.6.2-.6a.8.8 0 01.2-.4.8.8 0 000 .2.8.8 0 00-.1.2v.4a2.4 2.4 0 011-.2c.7-.8 1-.6.4 0l-.1.2a1.4 1.4 0 00-.2.6c-.2.1-1 .8-.7 1 .2 0 .4 0 .3.2-.1.2-.4.6-.3.9h.3a6.2 6.2 0 00.7-.6 3.8 3.8 0 00.5-.8h.1a9 9 0 01.3-.8c0-.2.1-.5.3-.7l.3.3a.4.4 0 00.2 0 .4.4 0 00.3 0l.2-.3h.1a1.2 1.2 0 01-.3.4.5.5 0 01-.3 0 .5.5 0 01-.2 0 1.1 1.1 0 01-.3-.3 12 12 0 00-.5 1.4v.1a5.6 5.6 0 01-1.2 1.4l.2.5 1-1 .8-1a6 6 0 01-.3.6v1.1h-.1v-.9l-.3.3a11.6 11.6 0 01-1 1c-.3.3-.6.3-.2.7l.3-.3.4-.3h.1v.1l-.4.3-.4.3a.6.6 0 00.1.3.5.5 0 01.1 0l.8-.6c.1 0 0 .1 0 .1l-.7.6a.7.7 0 01-.1 0c-.3.3-1.2.8-1 1.2l.6-.2.6-.5c.1 0 0 0 0 .1a2.5 2.5 0 01-.6.5v.2-.1a3.6 3.6 0 01-.7.1c.1.4 0 .7-.3 1 0 .1-1 .9-.6 1a1 1 0 00.3.2z\"/>\n <path d=\"M349.4 100.1a2.2 2.2 0 00-.6-.3 1.4 1.4 0 00-.5-.5c-.2-.2-.2-.1-.1-.3l.2-.1a.9.9 0 01.3 0 .4.4 0 01.2.2h.1c.1 0 0 0 0 0a.5.5 0 00-.2-.2 1 1 0 00-.4-.1.7.7 0 00-.4 0l-.2-.5.4.1.2.1a.7.7 0 00-.2-.2 2 2 0 00-.2 0 2.9 2.9 0 012.1.2c.4.1.6.3.8.6l-.2.2c-.5 0-.8 0-1 .2-.2.1-.2.4-.2.6z\"/>\n </g>\n <path d=\"M365 121.8l-.4.2c0-.3.2-.4.3-.6v.2l.1.2zm2 4.2a2.3 2.3 0 01-.4.4 4 4 0 01-.5.4v-.1l.4-.4.4-.4zm1.3-1.6l-.2.3h-.1l.2-.3zm-.7 0a1.1 1.1 0 01-.2.3 1 1 0 01-.5.4v-.1a1 1 0 00.4-.3 1 1 0 00.1-.4h.1zm1.2-1.6a1 1 0 00-.1.2 1.1 1.1 0 00-.1.2h-.1a1.1 1.1 0 01.3-.5zm1 0v.5l-.3.5c-.1 0 0 0 0 0l.1-.5.2-.5zm-.4-6c.3.5.4 1 .4 1.5a7.3 7.3 0 01.1-.6 1.4 1.4 0 00.3-1.1c0-.1.1 0 .1 0v.6a1.7 1.7 0 01-.3.6l-.2 1h-.1v-.1c0-.6 0-1.2-.4-1.8v-.1zm-.8 1v.3h-.1v-.4h.1zm-.2 1.4a6.2 6.2 0 01.2 1.4 1 1 0 01.1-.1l.3-.3h.1a1 1 0 00-.3.3.7.7 0 00-.2.4 5 5 0 00-.1-.9 5.9 5.9 0 00-.2-.8zm1 .5a3.6 3.6 0 01.1 1.2v-.6a3.6 3.6 0 00-.1-.6zm1-.2v.6a1.5 1.5 0 010 .5 1.2 1.2 0 000 .6l.1.6a2.5 2.5 0 01-.3-.6 1.3 1.3 0 010-.6 1.4 1.4 0 00.2-.5 2.3 2.3 0 000-.6zm.5-1.5l-.1.3v.2h-.1v-.6h.1zm-.5-2.6v.2c.1 0 .1 0 0 0 0 .1 0 0 0 0v-.2s-.1 0 0 0c0-.1 0 0 0 0zm.2-2v.8a.8.8 0 00-.2.3 1.4 1.4 0 000 .6h-.1a1.4 1.4 0 010-.6.9.9 0 01.3-.4v-.7zm-2-.7c.4.2.6.4.8.7.2.2.3.5.3.9l-.6-.2v1.8c-.2.5-.5.8-1 1a3.8 3.8 0 000-1.8h.1a3.6 3.6 0 010 1.6 1.5 1.5 0 00.7-.8 3.7 3.7 0 00.1-1.9l.6.2c0-.3-.1-.5-.3-.8a2.5 2.5 0 00-.7-.6v-.1zm5.2-1v.2h-.1v-.2s0-.1 0 0h.1zm-1.2 0l.3.1a.8.8 0 01.1.2v.1a.8.8 0 00-.2-.2.6.6 0 00-.2-.2zm-1.8.5l.3.5v.6c-.1 0-.1 0 0 0l-.1-.6a1 1 0 00-.3-.5h.1zm-6 .5v.4l-.1.1v-.5zm1-.6l.2.4v.1h-.1v-.1l-.1-.3zm2.4 1.6v.1a1.1 1.1 0 010 .2.8.8 0 000-.2.6.6 0 00-.1 0v-.1zm.8-1.8v.2a.2.2 0 010 .2.1.1 0 000-.2c-.1-.1-.1-.1 0-.1zm-5.5.3a1 1 0 00.2.7c.2.1.2.3.3.4v.4h-.1v-.4a.9.9 0 00-.2-.3 1 1 0 01-.2-.4 1.1 1.1 0 01-.1-.4zm2.2 1.5l.2.7v.7c0 .3 0 .6.2.8l.6.7a2.9 2.9 0 01-.1-1l.3-1c.2 0 .2-.2.3-.3v-.4h.1v.4a1.5 1.5 0 01-.3.5 1.6 1.6 0 00-.3.9c0 .3 0 .6.2 1h-.1c-.4-.2-.6-.5-.8-.8a1.3 1.3 0 01-.2-.8v-.7a1.8 1.8 0 00-.2-.6c0-.1.1 0 .1 0zm-.9 1.4c0 .2 0 .5-.2.7a3.4 3.4 0 01-.4.6h.3a2.2 2.2 0 00.7-.6l.3-.3c.1 0 0 0 0 0a3.6 3.6 0 01-.2.4 2.5 2.5 0 01-.3.2 24.5 24.5 0 010 .4v-.2a1.5 1.5 0 00-.1-.1 2.2 2.2 0 01-.4.2l-.4.2v-.1l.4-.7.2-.7h.1zm-1 0v.1h-.1c-.1 0 0 0 0 0v-.2z\"/>\n <path d=\"M363 113.7c.2.3.2.6.2 1a1.9 1.9 0 01-.4.8 1.9 1.9 0 00-.5.6 2.6 2.6 0 00-.2.6l.2-.3.5-.3a4.6 4.6 0 001.1-.9h.1c.1 0 0 0 0 0a4 4 0 01-1.2 1 1 1 0 00-.4.3 2.3 2.3 0 00-.4.5c0-.4 0-.7.2-1l.5-.6.4-.8c0-.3 0-.6-.2-.9h.1zm2.3 3.5l.1.4.1.1c.2.3.3.5.3.8l-.1 1h-.1a1.8 1.8 0 00-.4-1 3.4 3.4 0 00-.8-.6v-.1c.4.2.7.4.9.7l.3.6a3.4 3.4 0 000-.6 1.3 1.3 0 00-.1-.7l-.1-.2c-.2-.2-.3-.3-.2-.4zm1 0l.1.2c0 .1 0 0 0 0h-.1l-.2-.2h.1zm1 .3l-.2.7-.2.7.2-.7.2-.7zm.7 4v.1a.3.3 0 010-.2zm-.7-1.2v.3l-.2.4v-.4l.1-.4h.1zm-1 0h.1v.1h-.1v-.1zm-1.1-.6a7.3 7.3 0 01-.1.2v.2h-.1a5 5 0 010-.2 5 5 0 010-.2h.1c.1 0 0 0 0 0zm-1.7 1.8a.7.7 0 00-.1.2 1.3 1.3 0 000 .2s-.1.1-.2 0v-.2a.8.8 0 01.2-.3h.1zm-4.8 4.6a.7.7 0 010 .2 1.1 1.1 0 01-.2.1c-.1 0-.1 0 0 0a.8.8 0 00.1-.3h.1zm.8-.4a.3.3 0 01-.1.2.6.6 0 01-.2 0 .4.4 0 00.1-.1.3.3 0 000-.1h.2zm1-.6a.5.5 0 010 .1.5.5 0 01-.2.1.4.4 0 000-.2h.2zm1.5-3.8l-.1.4a1.4 1.4 0 000 .4h-.1a1.4 1.4 0 010-.4v-.5h.1zm1-10.3a.9.9 0 01-.1.3 1.4 1.4 0 01-.2.3h-.1l.2-.3a.8.8 0 000-.3l.1-.1zm-1-1a1.9 1.9 0 01.1 1 1.8 1.8 0 000-.5 1.5 1.5 0 00-.2-.4c0-.1 0 0 0 0zm-1.4 1.7a1.5 1.5 0 01-.4-.4.7.7 0 01-.1-.4l.2.4.3.4zm1.5 2.6v.2h-.1v-.2zm-2-2l.6 1 .1.8c.2 0 .3-.1.4-.3v-.9a1.9 1.9 0 00.3-.6 3.5 3.5 0 00.1-.5h.1l.4.8.3.9h-.1a2.9 2.9 0 00-.3-.9 3.9 3.9 0 00-.3-.6 2.9 2.9 0 010 .4 2 2 0 01-.3.5l-.1 1-.4.3v.4h-.1c0-.4 0-.8-.2-1.2a2 2 0 00-.5-1zm1.2 5v.3l-.1.4h-.1v-.8h.1c.1 0 .1 0 0 0zm-2.2.9v.3l-.1-.3c0-.1.1 0 .1 0zm1.9-2.5a2.3 2.3 0 01-.2.6l-.3.5a1.1 1.1 0 00-.3.6 1.8 1.8 0 000 .7c0 .1 0 0 0 0a1.9 1.9 0 01-.1-.7c0-.2.1-.5.3-.7a2.1 2.1 0 00.3-.5 2.1 2.1 0 00.2-.6c.1 0 0 0 0 0zm-.5-.8v.6a2.2 2.2 0 01-.5.6 1.8 1.8 0 00-.4.5l-.2.5h-.1l.2-.6.5-.5a2 2 0 00.3-.5 1 1 0 00.1-.6h.1zm-2.4 1.2c0 .4 0 .7-.2 1-.1.3-.3.6-.6.8h-.1v-.1c.3-.2.5-.5.6-.8.2-.2.2-.6.2-1zm-3 1.7v.2l.1.1v.1h-.1l-.1-.2v-.2s-.1 0 0 0zm-1.3 0a2.7 2.7 0 000 .7l.4.6.1.5v.4l.4-.5a1.4 1.4 0 00.2-.6 1.6 1.6 0 010 .6l-.5.6h-.1a3.3 3.3 0 000-.5 1.8 1.8 0 00-.2-.4 2 2 0 01-.3-.7 2.7 2.7 0 01-.1-.7zm.2 4.2a2.6 2.6 0 01.1-.8h.1a2.5 2.5 0 00-.1.8h-.1zm-.2 1.1v-.4s0-.1.1 0v.4zm-.8 2l.2-.3.2-.3h.1a4 4 0 01-.2.4l-.2.2c-.1 0-.1 0 0 0zm-1.1-6.6v.2h-.1v-.2zm-2 4.5a2.9 2.9 0 000-.1v-.2h.1v.3zm5-8l-.3 1c0 .3.1.6.3.7.3.2.4.4.5.7v-.4c.1-.1.1-.3 0-.4h.1a2.7 2.7 0 010 1h-.1a6 6 0 010-.2l-.5-.6c-.3-.2-.4-.4-.4-.8l.2-1h.1zm-.4-1.3a2.5 2.5 0 010 .8 4 4 0 01-.3.7 2.4 2.4 0 00-.2 1c0 .4.1.7.3 1v.1a2.5 2.5 0 01-.2-2.1 3.8 3.8 0 00.2-.7c0-.3.1-.5 0-.8h.1c.1 0 0 0 0 0zm-2.3 3.3a.8.8 0 000 .4l.1.5c0 .1 0 0 0 0a1.5 1.5 0 01-.3-.5.9.9 0 01.1-.5h.1zm-1-.4v.3a.9.9 0 010 .3.4.4 0 00-.1.3l.1.2v.1a.8.8 0 01-.2-.3.5.5 0 010-.4.8.8 0 00.1-.2v-.3h.1zm5.8-8.6a2.3 2.3 0 00.3 1.5 2.6 2.6 0 01-.4-.7 2.3 2.3 0 010-.8h.1zm-.7.7a4 4 0 01.5 1.7h-.1a3.8 3.8 0 00-.5-1.6v-.1zm-3.6.1c-.4.5-.5 1-.6 1.3l.2.9.2.8a2.6 2.6 0 01-.2.8c-.1 0 0 0 0 0v-.8a2.3 2.3 0 000-.8 1.7 1.7 0 01-.3-1c0-.3.2-.7.6-1.2.1 0 0 0 0 0zm3.3-1.4v.5l-.4.4a.8.8 0 00-.3.4v.7c0 .1 0 0 0 0a1.9 1.9 0 010-.7 1 1 0 01.3-.5 1 1 0 00.3-.4.6.6 0 000-.4h.1zm-3.5.3v.7c0 .2-.2.4-.4.6a1.2 1.2 0 00-.4.6 2.9 2.9 0 00-.1.7h-.1a3 3 0 01.1-.8c0-.2.2-.4.4-.6l.4-.6a1 1 0 000-.6zm2 .1a.8.8 0 000 .2.5.5 0 00.1.3.6.6 0 01-.2-.2.8.8 0 010-.3h.1zm0-.5a.8.8 0 00-.5.4l-.2.7.2.5v.7a2.4 2.4 0 000-.7l-.3-.4a2 2 0 00-.5 1.2c0 .5.1 1 .5 1.5h-.1a2.7 2.7 0 01-.5-1.5c0-.5.2-.9.6-1.3 0-.3 0-.6.2-.8a1 1 0 01.5-.4zm-.7-.8v.1c0 .3 0 .6-.2.7a.8.8 0 00-.2.3 1.6 1.6 0 00-.1.4h-.1a1.7 1.7 0 010-.4 1 1 0 01.3-.4c.2-.1.2-.4.2-.6a2.7 2.7 0 000-.1h.1zm5.7 6l.1.5v.4a1.4 1.4 0 000-.4 1.9 1.9 0 00-.2-.4h.1zm0 2v.6l-.2.6-.3.6.2-.6a2.1 2.1 0 00.2-.6 1.6 1.6 0 000-.7h.1zm-1.2-1.8a2.5 2.5 0 01.7 2.5h-.1a2.4 2.4 0 00-.6-2.4v-.1c0-.1 0 0 0 0zm0 2a5.3 5.3 0 01-1 1.4 2.5 2.5 0 00-.5 1 1.4 1.4 0 00-.1-.6 1.9 1.9 0 00-.2-.4 1.4 1.4 0 01-.3-.9l.3-.8.3-.6a2.4 2.4 0 000-.6h.1c.1 0 0 0 0 0a2.6 2.6 0 01-.3 1.3 1 1 0 00-.3.7c0 .3 0 .6.2.8a2 2 0 01.3.8 2.6 2.6 0 01.5-.8 5 5 0 00.5-.6l.3-.7h.1zm-3.2-1a2.8 2.8 0 00.4 1.4v.1h-.1a2.3 2.3 0 01-.3-.7 3 3 0 010-.7zm-1.7 1v.3h-.1v-.3zm.6-1.6l-.1.5a1.4 1.4 0 01-.3.5c-.1 0 0 0 0 0l.2-.5a1.4 1.4 0 000-.5h.1zm-1.6 3.1a3.3 3.3 0 01-.3-1.7c0-.5.3-.8.6-1l.4-.7c.1-.2.2-.5.1-1s.1 0 .1 0v1l-.6.7a1.9 1.9 0 00-.5 1c0 .5 0 1 .3 1.7h-.1zm-1-1.1a.7.7 0 000 .3l.1.4a1 1 0 01-.2-.4.8.8 0 010-.4h.1zm4.6-3.2c.1.2.3.5.3.8 0 .3 0 .6-.2.9h-.1c-.1 0 0 0 0 0l.2-.9a1.5 1.5 0 00-.3-.8zm1.4-1.1a2.4 2.4 0 010 1.7 1.8 1.8 0 00-.2-.8 1.5 1.5 0 00-.5-.5c0-.1 0-.1.1 0a1.6 1.6 0 01.6 1v-.6a2.3 2.3 0 00-.1-.8zm.8-1.2l.4.8v1a2 2 0 000 .5 1 1 0 00.2.4 1 1 0 01-.2-.4 2.3 2.3 0 010-.5 3.5 3.5 0 00-.1-1 1.5 1.5 0 00-.4-.7c0-.1 0 0 .1 0zm-2.2-.2a1 1 0 00-.3.5v.7a2 2 0 010-.7c0-.2 0-.4.2-.5.1 0 .1 0 0 0zm-4.4 3a2 2 0 01-.3 1 2.5 2.5 0 01-.8.7c-.1 0 0 0 0 0l.7-.7c.2-.3.3-.6.3-1l.1-.1zm0-1.6v.5a2.2 2.2 0 01-.3.5l.1-.5v-.5h.1zm2.9-.2v1h-.1v-1zm.7-1.3c-.2.3-.3.5-.3.8l.2.7.3 1.2c0 .4-.2.7-.4 1.1l.3-1.1a1.9 1.9 0 00-.3-1.2l-.2-.7c0-.3 0-.6.3-.8.1 0 0 0 0 0zm-4.6-8.1a2 2 0 011-.5c.4 0 .8 0 1.2.3h.8-.8c-.4.5-.8.7-1.1.7a1 1 0 01-.9-.2c0-.1 0-.1 0 0a1 1 0 00.9 0c.2 0 .6-.1 1-.5a1.9 1.9 0 00-1-.1 2 2 0 00-1 .4c-.1 0 0 0 0-.1z\"/>\n <path d=\"M351.6 101a.3.3 0 01.3.3.3.3 0 01-.3.2.3.3 0 01-.2-.2.3.3 0 01.2-.3zm1.8 1.6a2.2 2.2 0 00.8-.7c.1 0 0 0 0 .1a2.3 2.3 0 01-.2.3l-.5.4c-.1-.1 0-.1 0-.1zm3.7-1.6a.5.5 0 01.3 0 .8.8 0 01.3.2.7.7 0 00-.3 0 .5.5 0 00-.2 0l-.1-.1zm-2 .1a.8.8 0 01.3-.4l.7-.1v.1a1 1 0 00-.7 0 .7.7 0 00-.3.5c-.1 0-.1 0 0 0zm.2.4a.4.4 0 010-.3.6.6 0 01.3-.1h.1a.5.5 0 00-.3.2.3.3 0 000 .2h-.1zm-3.6 1.1l-.1.3a.8.8 0 000 .3l-.1.1a1 1 0 010-.4c0-.1 0-.2.2-.3zm1 .5v.2-.2zm-.6-1.1a1 1 0 00.3 0h.3a1.4 1.4 0 01-.3.1 1 1 0 01-.3 0s-.1 0 0-.1zm.6-2a.3.3 0 00-.2.1.4.4 0 00-.1.2h-.1a.5.5 0 01.2-.3.4.4 0 01.2 0h.1zm-1 .2a.8.8 0 00-.2 0 .3.3 0 000 .2h-.1c-.1 0 0 0 0 0a.4.4 0 010-.2.9.9 0 01.3-.1zm-.7 0a.8.8 0 00-.1.1.7.7 0 00-.1.2h-.1a.7.7 0 01.1-.2.9.9 0 01.2-.2v.1zm-.8.7a1.7 1.7 0 00-.4.4v-.1a2 2 0 01.4-.4zm0 .9v.1l-.2.2c-.1 0-.1 0 0 0v-.2l.2-.2c.1 0 .1 0 0 0zm-.7.2v.3l-.1.1c-.1 0 0 0 0 0v-.4zm1 1.4v.6h-.1v-.6h.1zm-.6-.4v.3h-.1v-.3h.1zm-.6-4.5a.7.7 0 01.5.4v.1h-.1a.7.7 0 00-.2-.3.7.7 0 00-.2-.1v-.1zm5.2 6.7a1.6 1.6 0 010 1.4h-.1a1.6 1.6 0 000-1.3v-.1zm-1.7 2c0-.3.2-.5.3-.7l.4-.6c.2-.2.3-.4.3-.7a1.8 1.8 0 000-.7h.1a2 2 0 01-.3 1.5 6.3 6.3 0 00-.4.5l-.3.7h-.1zm-2.2-.6a.7.7 0 01.2-.3.9.9 0 01.3-.1.8.8 0 00-.2.2.6.6 0 00-.2.2zm-.4-.2l.3-.3.3-.2v.1a1 1 0 00-.3.2 2 2 0 00-.2.3c-.1 0-.1 0 0 0zm2.3-2.2h.2a.8.8 0 00.3 0v.1a.8.8 0 01-.6 0c0-.1 0-.1 0 0zm-1.2-.1l.1-.1c.1 0 .1 0 0 0v.1c-.1 0 0 0 0 0zm24.2 7a1.1 1.1 0 01.2.3h-.1a.8.8 0 000-.1.8.8 0 00-.2-.2c0-.1 0 0 0 0zm-26.8 12.5l.3.3a1 1 0 00.5 0v.1a1 1 0 01-.5 0 1.7 1.7 0 01-.4-.3c0-.1 0-.1 0 0z\"/>\n <g fill=\"red\">\n <path d=\"M368.9 99.6a8.2 8.2 0 001.7 0c-.6.3-1.2.6-2 .7a.8.8 0 00.3-.4.4.4 0 000-.3zm-1.4-.1h1.2v.4s0 .2-.2.3c0 0-.1 0 0 .1a5.6 5.6 0 01-1.3 0 1 1 0 00.3-.5.6.6 0 000-.4zm-10.5-3c.7-.2 1.3-.2 2-.2a1 1 0 01.5.4c.1.2.2.5.1.8l.1.1h.1l-.1-1a1 1 0 00-.3-.2h.2a5 5 0 012.1.6c.2.2.3.3.2.5l-.3.5v.2h.2l.3-.7a.7.7 0 000-.3l1.7.8a.5.5 0 010 .5 1 1 0 01-.5.3v.1l.1.1c.3 0 .5-.2.6-.4a.6.6 0 000-.4l1.2.6v.3c0 .2-.1.3-.3.4 0 0-.1 0 0 .1 0 .1 0 0 0 0 .3 0 .5-.2.6-.4a.5.5 0 000-.3l.4.1a8.1 8.1 0 001.3.4.5.5 0 01.1.4.7.7 0 01-.2.3v.2c-1.4-.1-2.7-.9-4.1-1.4l-.5-.2-1.6-.6-.1-.1a8.5 8.5 0 00-1.5-.4 6.1 6.1 0 00-1.6 0h-.1l-.1-.8a1.3 1.3 0 00-.5-.4z\"/>\n <path d=\"M354.6 97a8.7 8.7 0 012-.5c.4.1.6.3.7.5v.6a4.2 4.2 0 00-1.7.2 1.2 1.2 0 00-.7-.6 1.2 1.2 0 00-.3-.1zm7.4 3.9a9.4 9.4 0 00-.5-.4 7 7 0 00-3-.8c.3-.4.4-.8.3-1.1a1.7 1.7 0 00-.7-.8h1a8 8 0 012 .6c0 .3.1.6 0 .8 0 .3-.2.5-.5.7 0 0-.1 0 0 .1 0 .1 0 .1 0 0 .4-.1.6-.4.7-.7v-.8l1 .6 1 .8c0 .4 0 .6-.3.8h-.9v.2z\"/>\n <path d=\"M364 102.4l-1.8-1.4c.4 0 .7 0 1-.2.1-.1.3-.4.3-.8l1.1 1 .6.5v.4a.5.5 0 010 .2.6.6 0 01-.4.2h-.7z\"/>\n <path d=\"M366.2 103.8a11.8 11.8 0 01-2-1.3h.7a.8.8 0 00.4-.2l.1-.4a1 1 0 000-.2 10.5 10.5 0 002.1 1.4c0 .3 0 .4-.3.5a3 3 0 01-1 .1z\"/>\n <path d=\"M368.4 104.7a11.9 11.9 0 01-2-.8c.4 0 .7 0 1-.2.2 0 .3-.2.3-.5a10.8 10.8 0 001.3.6v.4l-.5.4s-.1 0 0 0z\"/>\n <path d=\"M373.2 104.2s.4-.1.2 0c-1.4 1-3.1 1-4.8.5.3-.1.5-.2.6-.4a.6.6 0 000-.5l1.7.4a.4.4 0 01-.1.3l-.5.3s-.1 0 0 .1c0 .1 0 0 0 0 .3 0 .5-.2.6-.3a.6.6 0 00.2-.4 9 9 0 002 0zm-9.7 24l-.2.4-1.2.3c0 .3 0 .4.3.4l.7-.3c.1 0 0 .5-.5.8v.1c.4.6 1.4.4 1.9.3a3 3 0 001.3-1l-.3-.6c-.4.1-.6 0-.5-.2a3.9 3.9 0 00-1.5-.2zm-15.1-4.8c-.3.3-.7.5-1 .6-.2 0-.6.1-.6.3 0 .1.2.3.4.2.4-.5.7-.2.2.2v.3c.5.4 1.6.5 2.2.2.3-.2.6-.5.2-.9a1.7 1.7 0 010-.2h-.6l-.4-.3-.4-.4zm10 3.5h-.1c-.2.2.3.2.6.3.2.1.2.3.2.5-.3.7-1.9.5-2.4.2-.2-.1-.2-.3-.2-.5h.3c.2 0 .4 0 .6-.2v-.2h-.2a1.3 1.3 0 01-.4.2 2.6 2.6 0 01-.5 0l-.2-.2h.2l.7-.2.1-.1c.5 0 1 0 1.3.2zm-7.2-.4l-.2.3a2.7 2.7 0 01-.9.6c-.2.1 0 .2.2.4.2.1.5-.2.6-.4.2-.3.3-.2.2 0l-.2.7.7.3c.4 0 1-.4 1.2-.6.3-.2.2-.5.1-.8a2 2 0 01-.5 0 3.4 3.4 0 01-.5-.3l-.7-.2zm2.8-26.4h.3l.6.1a4.5 4.5 0 011.7-.3 5.7 5.7 0 011.7-.2v-.2c.3-.3.4-.6.3-.9-.1-.2-.4-.5-.8-.7h-1.3a4 4 0 00-.8.1l.6.4.4 1c-.2.1-.2 0-.2 0 0-.4-.2-.6-.3-.9l-.8-.4a9 9 0 00-1.3.2c-.3 0-.5.2-.7.3l.8.1c.3.1.5.4.6.8-.1.1-.1 0-.1 0a1 1 0 00-.5-.6c-.4-.2-1.3 0-1.7.2a4.2 4.2 0 00-.6.6l2 .4zm-2.3-.4v-.1l.7-.6.7-.4a2 2 0 011-.5l1.3-.2a1 1 0 00-.5-.5l-.8-.1-1.5.8h.5l.1.2h-.4a1.4 1.4 0 00-.4 0h-.1l-1.3 1c.3.1.6.2.7.4z\"/>\n </g>\n <path fill=\"#0093dd\" d=\"M409 156.5l20.8-47-15.3-24.7-27.3 10-12.7 49.8a219.4 219.4 0 0134.5 11.9z\"/>\n <path fill=\"#fff\" d=\"M382.6 113a251.7 251.7 0 0139.6 13.7l-8 18.2a232 232 0 00-36.5-12.7z\"/>\n <path fill=\"red\" d=\"M415.4 142l5.4-12.2a248.6 248.6 0 00-39-13.5l-3.2 12.4a235.9 235.9 0 0137 12.8l-.1.4z\"/>\n <path d=\"M385.6 125.8c.3-.3.7-.2 1.1-.1.3-.2.7-.2 1-.2l.6-.2c.2 0 .2-.2 0-.3a.6.6 0 010-.3c-.7-.4-1-1-1.2-1.5-.3 0-.5-.2-.5-.3h-.5c-.8 0-1-.3-1.3-.5a1 1 0 01-.6-.4l-.3-.3c-.2-.3-.1-.7.2-.7h.7a2 2 0 01.9-.1c.3 0 .5-.3.9-.6v-.4s0-.2.2-.1a1 1 0 01.8.5c.5 0 1 .3 1.2.7.7 0 1.1.3 1.2.5 0 .2-.2.4-.5.6v.2l.4.4 1 .7c1-.1 2.6.6 4.8 2a18.6 18.6 0 014.1 1.2h.9c2.4-.4 4.7 0 6.8 1.5.8.1 1.5.4 2.2.7.5.2 1 .3 1.6.3a8 8 0 012.6.7c1 .2 1.9.6 2.4 1.2.4.5.3 1-.2 1.2-.3.6-.9.6-1.8.3-.6.1-1.3-.4-2-.9-.8-.2-1.6-.8-2.4-1.3l-1.3-.6h-.8v.2c.2.2.4.4.4.8v1c0 .4.3.6.7.9l1 .4c.2 0 .3.1.3.3l.4 1.7.4.3c.6.5.2 1-.3 1a3.1 3.1 0 01-1.3.8c-.4.2-.6 0-.7-.2a.5.5 0 01-.4-.2c-.5-.4-.1-1 1-.7l.2-.2a1.5 1.5 0 010-.9l-.3-.2a2.8 2.8 0 01-1-.6c-.6-.5-1.5-1-2.4-1.4-.7 0-1.2-.4-1.8-.7h-.8c-.2 0-.4 0-.5.2-.2.3-.5.2-.8.2h-1.6c-.4 0-.7 0-1 .3-.2.2-.4.2-.7 0a1 1 0 01-.3-.2c-.3 0-.5 0-.5-.2-.5-.1-.6-.2-.6-.4-.6-.1-.3-.6 0-.6l1.4.1c.4.1 1 0 1.2-.2l.5-.5a4 4 0 01-1.8-.5c-1.1-.7-2-.9-2.8-.3-.2.2-.3.2-.6.1a1 1 0 00-.5 0c-.5.1-.9 0-1.3-.1a4 4 0 01-1.8 0c-.6.3-1 .4-1.2.2a8.6 8.6 0 01-.6-.4c-.4-.1-.5-.2-.5-.3-.4 0-.5-.2-.5-.4-.2-.2 0-.3 0-.4.4-.2.7-.2 1 0 .3 0 .5.2.6.3h.6c.1-.2.5-.2 1-.2l.7-.2v-.2c-.4 0-.6-.4-.9-.7a3 3 0 01-1.5-.5c-.4 0-.7-.1-1-.3h-.7a2.5 2.5 0 01-1.4 0h-.8a1 1 0 01-1 .2 1.5 1.5 0 00-.8-.5c-.3-.1-.4-.2-.4-.4-.4-.2-.3-.4 0-.5.3-.1.5-.2 1 0l.5.2z\"/>\n <path fill=\"#fff\" d=\"M401.2 130.5s0-.2-.3 0c-.8 0-1.6 0-2.2-.4-.7-.4-1.3-.8-2-.8l.7-.4h1.5c.7 0 1.4.2 2 .4.4.2.8.5 1 .8a3.4 3.4 0 01.8.7 2.5 2.5 0 01-.7 0 2.9 2.9 0 01-.8-.3z\"/>\n <path d=\"M403 94.7v.2l.9 4.9-3.7 3.2-.2.1.2.1 4.7 1.6 1 4.9v.2l.2-.1 3.7-3.3 4.6 1.6h.3v-.1l-1-4.9 3.7-3.2.2-.2h-.3l-4.6-1.6-1-4.9V93l-.2.1-3.7 3.3-4.7-1.6z\"/>\n <path fill=\"#f7db17\" d=\"M400.6 103l3.5-3 4.4 1.4zm8.5-1.7l3.4-3 4.4 1.5zm7.8-1.3l-3.4 3-4.4-1.5zm-8.4 1.6l-3.5 3-4.3-1.5zm-5-6.4l4.3 1.4.8 4.6zm5.5 6.4l4.4 1.5.9 4.5zm5.1 6.1l-4.3-1.5-.9-4.5zm-5.6-6.4l-4.3-1.5-.9-4.5zm3-7.7l1 4.6-3.5 3zm-2.7 8.1l.8 4.6-3.4 3zm-2.8 7.5l-.9-4.5 3.5-3zm2.8-8l-.9-4.6 3.5-3z\"/>\n</svg>";
var ar$1 = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\r\n<svg\r\n xmlns:dc=\"http://purl.org/dc/elements/1.1/\"\r\n xmlns:cc=\"http://creativecommons.org/ns#\"\r\n xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"\r\n xmlns:svg=\"http://www.w3.org/2000/svg\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n id=\"flag-icon-css-ar\"\r\n viewBox=\"0 0 640 480\"\r\n version=\"1.1\">\r\n <metadata\r\n id=\"metadata1678\">\r\n <rdf:RDF>\r\n <cc:Work\r\n rdf:about=\"\">\r\n <dc:format>image/svg+xml</dc:format>\r\n <dc:type\r\n rdf:resource=\"http://purl.org/dc/dcmitype/StillImage\" />\r\n <dc:title></dc:title>\r\n </cc:Work>\r\n </rdf:RDF>\r\n </metadata>\r\n <defs\r\n id=\"defs1676\" />\r\n <path\r\n id=\"21399192\"\r\n d=\"M 640,479.9928 V 0 L 0,0.00719971 V 480 h 640 z\"\r\n class=\"fil0 str0\"\r\n fill=\"#006233\"\r\n style=\"stroke-width:0.169532\" />\r\n <g\r\n id=\"g13004\"\r\n transform=\"matrix(0.25707542,0,0,0.25727772,319.29932,-19.227473)\">\r\n <g\r\n id=\"g9244\"\r\n fill-rule=\"evenodd\"\r\n transform=\"matrix(1.7598,0,0,1.6,-2175.2,-3398.1)\"\r\n stroke=\"#ffffff\"\r\n fill=\"#ffffff\">\r\n <path\r\n id=\"path3159\"\r\n d=\"m 1071.9,2779.7 c -25.9,38.9 -7.2,64.2 19.5,66 17.6,1.3 54.2,-24.9 54.1,-55.7 l -10,-5.6 c 5.6,15.8 -0.2,20.8 -12.1,31.6 -23.5,21.3 -71.5,22.8 -51.5,-36.3 z\"\r\n stroke-width=\"0.4008\" />\r\n <path\r\n id=\"path3115\"\r\n d=\"m 1277.2,2881.7 c 145.8,4.1 192.2,-137 102.2,-257.8 l -8.9,13.3 c 5.8,56.3 14.2,111.8 15,169.5 -17.6,20.7 -43.2,13 -48.3,-10 0.3,-31.2 -9.9,-57.6 -22.8,-82.8 l -7.2,13.3 c 8.4,20.7 17.5,44 19.4,69.5 -41.6,49.9 -87.6,60 -70.5,-5.6 -32.9,57.5 16.9,98 73.3,9.5 12.1,60.4 58.9,22.9 61.7,9.9 5.1,-39.6 2.5,-103.4 -7.8,-153.8 40.6,70.3 42,121 20.4,154.9 -24,37.7 -76.2,55.3 -126.5,70.1 z\"\r\n stroke-width=\"1px\" />\r\n <path\r\n id=\"path3117\"\r\n d=\"m 1359.9,2722.2 c -31.2,2.3 -47.2,-4.1 -30.3,-27.2 16.7,-22.6 32.3,-4.6 36.5,25.6 3.9,28.3 -54.8,64.4 -75.1,64.4 -30.7,0 -44.9,-39.5 -16.6,-75 -36.4,103.6 78.6,43.5 85.5,12.2 z m -21.6,-24 c -3.8,-0.2 -6.6,6.5 -4.7,7.8 5.5,3.8 14.2,1.5 15.1,-0.4 1.9,-4.2 -5.1,-7.2 -10.4,-7.4 z\"\r\n stroke-width=\"1px\" />\r\n <path\r\n id=\"path3140\"\r\n d=\"m 1190.5,2771.1 c -30,59 -0.1,83.4 38.4,76.6 22.4,-4.1 50.8,-20 67.2,-41.7 0.3,-47.8 -0.4,-95.2 -4.6,-141.5 15,-17.9 -1.3,-17.8 -7,-37 -2.6,11.2 -8.9,23.3 -2.8,32 4.3,46.7 6.7,94 6.6,142.2 -30.2,24.3 -52.9,33.3 -69.1,33.1 -33.5,-0.3 -40.7,-28.5 -28.7,-63.7 z\"\r\n stroke-width=\"1px\" />\r\n <path\r\n id=\"path3150\"\r\n d=\"m 1251.8,2786.7 c -0.5,-44.5 -1.2,-95 -5.2,-126.1 15.6,-17.3 -0.8,-17.7 -5.9,-37.1 -3,11 -9.6,23 -3.8,31.9 2.6,47.6 5.1,95.2 5.6,142.8 3.6,-2.3 7.7,-3.2 9.3,-11.5 z\"\r\n stroke-width=\"1px\" />\r\n <path\r\n id=\"path3152\"\r\n d=\"m 1135.4,2784.6 c -3.8,-4.8 -6.5,-10.2 -9.6,-14.9 -0.5,-6.7 4,-12.9 4.6,-16.3 5.1,7.9 8.1,13.9 12.2,17.8 m 5.4,3.1 c 7.5,3 16.7,3 25.2,3.2 32.8,0.6 67.3,-4.8 63.6,39.6 -3.2,39.4 -35.9,62.2 -65.2,61.9 -41.7,-0.4 -77.3,-46.4 -13,-131.1 6.2,-1 14.3,0.7 21,1.3 11.5,0.9 23.3,-0.2 36.8,-11 -1.6,-27.9 -1.6,-54.3 -5,-79.5 -5.8,-8.9 0.8,-20.8 3.8,-31.9 5.1,19.4 21.4,19.8 5.9,37.2 3.7,28 4.1,56.5 4.1,73.5 -7.8,11.9 -13.9,24.5 -36.7,29.3 -23.3,-3.4 -33.8,-36 -58.1,-25.2 6.7,-29.4 68.4,-36.1 74.6,-12.9 -4.1,24.2 -61.7,14.5 -77,92.7 -4.7,24.1 20.7,46.3 46.8,44.5 25.5,-1.7 52.7,-19.4 55.4,-49.2 2.1,-24.9 -33,-22 -47.7,-21.7 -21.4,0.5 -34.9,-2.8 -43,-7.5 m 21.9,-53.9 c 3.8,-3.6 17.1,-6.1 21.9,-0.3 -3.6,2.4 -7.1,5 -10,8.1 -5,-2.6 -8.3,-5.2 -11.9,-7.8 z\"\r\n stroke-width=\"0.4008\" />\r\n <path\r\n id=\"path3161\"\r\n d=\"m 1194,2650.9 c 3.6,8 5.1,13.3 5.3,21 -2.2,10.4 -11.1,20.1 -20.3,20.4 -5.7,0.2 -12.1,-1.4 -16.6,-10.3 -0.5,-1.1 -2.9,-3.7 -5.2,-2.5 -10.1,16.6 -17.6,23.6 -26.7,23.5 -18.2,-0.3 -12.8,-16.5 -29.6,-21.5 -7,-0.2 -18.5,6.9 -24.4,20.8 -22.4,63.5 -42.8,-0.2 -34.1,-29.8 1.3,28.3 8.1,45.1 15.1,44.6 5.1,-0.5 9.6,-12.3 16.1,-24.7 5,-9.5 17,-26.6 29.7,-26.6 11.6,0.3 4.3,21.6 27.5,21.3 11.2,-0.2 21.5,-8.8 31.9,-26 2.3,-0.4 2.9,3.7 3.4,5.1 1.6,5.9 11.8,22.1 25.6,7.3 -0.7,-3.2 -0.4,-8.5 -3.9,-9.6 z\"\r\n stroke-width=\"1px\" />\r\n <path\r\n id=\"path3163\"\r\n d=\"m 1266.9,2598.3 c -12.3,6.1 -21.3,0.5 -26.4,-4.9 8.9,-1.8 15.8,-5 17.8,-12 -4,-9 -13.5,-12.9 -26.9,-13 -17.9,0.5 -27.1,7.7 -28.2,17.6 8.3,0.3 15.8,-2 19,6 -14.7,7.2 -32,9.8 -50.8,9.7 -30.8,1.6 -35.3,-12.3 -43.4,-24.5 -0.6,-0.8 -3.3,-2.1 -4.7,-1.9 -9.5,0 -16.5,33.2 -27.2,33.1 -10.7,-1.4 -8.3,-21.4 -11.4,-32.8 -2.6,17.9 3.3,84.5 36.4,12.2 1,-2.4 2.4,-1.7 3.3,0.3 8.9,20.2 27,27.2 46.5,28.2 16.3,0.9 37.1,-6.2 59.4,-18.8 5.9,6.5 10.6,13.9 23,15.3 14.5,0.7 30,-9.8 33.5,-22.8 1.8,-6.7 2.1,-19.9 -5,-20.1 -9.9,-0.3 -17.1,23.7 -14.8,45.3 0.2,-0.3 1.3,-5.4 1.3,-5.4 m -43.8,-28.8 c 6.5,-3 12.8,-4.4 17.8,2.2 -3.9,1.4 -6.3,2.3 -8.4,4 -2.8,-2.2 -6.6,-3.3 -9.4,-6.2 z m 47.8,14.9 c 1.6,-7.1 2.5,-12.8 8.3,-16.5 1.2,7.5 1.4,11.7 -8.3,16.5 z\"\r\n stroke-width=\"0.4008\" />\r\n <path\r\n id=\"path3169\"\r\n d=\"m 1311.3,2606.9 c -1.9,-6.1 -3.8,-11.4 -4.4,-18 -1.4,-13.4 10.1,-21 20.5,-19.9 10.7,1.1 17.8,5.1 28,8.6 8,2.7 18.8,4.8 29.1,7.7 5.8,2.6 0,9.4 -1.5,10.3 -25.8,10.1 -44.1,26.1 -60.5,26.8 -9.8,0.5 -18.5,-5.9 -26.4,-19 -0.5,-25.4 -1.4,-55.2 -3.9,-73.9 3.8,-3.8 4.6,-6.6 6.4,-9.7 2,24.7 2.8,50.7 3.3,76.9 2.1,4.5 4.7,8.3 9.4,10.2 z m 16.5,2 c -13.8,3.9 -12.1,-7.8 -13.4,-15 -1.5,-8.4 -0.5,-17.9 10.2,-15.5 13.9,3.7 26.6,8.6 38.9,13.8 z\"\r\n stroke-width=\"0.4008\" />\r\n <path\r\n id=\"path3173\"\r\n d=\"m 1314.3,2621.3 1.9,9.3 h 1.5 l -0.6,-8.7\"\r\n stroke-width=\"0.4008\" />\r\n <path\r\n id=\"path5196\"\r\n stroke-linejoin=\"round\"\r\n d=\"m 1094.2,2718.5 7,-7.2 8.1,6.9 -7.5,6.7 z\"\r\n stroke-linecap=\"round\"\r\n stroke-width=\"4.008\" />\r\n <path\r\n id=\"path6168\"\r\n stroke-linejoin=\"round\"\r\n d=\"m 1112,2716.1 7.1,-7.2 8.1,6.9 -7.5,6.7 z\"\r\n stroke-linecap=\"round\"\r\n stroke-width=\"4.008\" />\r\n <path\r\n id=\"path6170\"\r\n stroke-linejoin=\"round\"\r\n d=\"m 1062.5,2641.5 7.1,-7.2 8.1,6.9 -7.5,6.7 z\"\r\n stroke-linecap=\"round\"\r\n stroke-width=\"4.008\" />\r\n <path\r\n id=\"path6172\"\r\n stroke-linejoin=\"round\"\r\n d=\"m 1065.7,2662.7 7.1,-7.2 8,6.9 -7.5,6.7 z\"\r\n stroke-linecap=\"round\"\r\n stroke-width=\"4.008\" />\r\n <path\r\n id=\"path6174\"\r\n stroke-linejoin=\"round\"\r\n d=\"m 1194.2,2698.2 6.5,-5.3 6,6.5 -6.8,4.8 z\"\r\n stroke-linecap=\"round\"\r\n stroke-width=\"4.008\" />\r\n <path\r\n id=\"path6176\"\r\n stroke-linejoin=\"round\"\r\n d=\"m 1108.4,2562.5 4.6,-4.7 5.3,4.5 -4.9,4.4 z\"\r\n stroke-linecap=\"round\"\r\n stroke-width=\"4.008\" />\r\n <path\r\n id=\"path6178\"\r\n stroke-linejoin=\"round\"\r\n d=\"m 1120.1,2561 4.6,-4.8 5.3,4.6 -4.9,4.3 z\"\r\n stroke-linecap=\"round\"\r\n stroke-width=\"4.008\" />\r\n <path\r\n id=\"path6180\"\r\n stroke-linejoin=\"round\"\r\n d=\"m 1365.7,2614.7 -4.4,3.7 -4.2,-4.3 4.6,-3.4 z\"\r\n stroke-linecap=\"round\"\r\n stroke-width=\"4.008\" />\r\n <path\r\n id=\"path9240\"\r\n d=\"m 1158.7,2747.4 -0.5,7.9 12.6,1.2 10.1,-7.6 z\"\r\n stroke-width=\"0.4008\" />\r\n <path\r\n id=\"path9242\"\r\n d=\"m 1265.2,2599.8 3.7,-0.8 -0.4,10.3 -2.3,0.9 z\"\r\n stroke-width=\"1px\" />\r\n </g>\r\n <path\r\n id=\"path2722\"\r\n d=\"m 2.7256,1425 c 249.82,0 453.08,-184.8 453.08,-411.9 0,-124.96 -61.32,-236.46 -157.84,-311.83 57.91,61.95 93.11,143.51 93.11,232.3 0,197.23 -173.74,357.23 -388.35,357.23 -214.62,0 -388.36,-160 -388.36,-357.23 0,-88.79 35.2,-170.35 93.11,-232.3 -96.52,75.37 -157.84,186.87 -157.84,311.83 0,227.1 203.27,411.9 453.09,411.9 z\"\r\n fill=\"#ffffff\"\r\n class=\"fil2\" />\r\n <g\r\n id=\"g2908\"\r\n transform=\"matrix(1.1355,0,0,1.0324,2.7256,-21.429)\"\r\n stroke=\"#000000\"\r\n stroke-width=\"8.012\"\r\n fill=\"#ffffff\">\r\n <path\r\n id=\"path2910\"\r\n d=\"m -54,1623 c -88,44 -198,32 -291,-28 -4,-2 -6,1 -2,12 10,29 18,52 -12,95 -13,19 2,22 24,20 112,-11 222,-36 275,-57 z\"\r\n class=\"fil2 str2\" />\r\n\r\n <path\r\n id=\"path2912\"\r\n d=\"m -56,1675 c -35,14 -95,31 -162,43 -27,4 -26,21 22,27 49,5 112,-30 150,-61 z\"\r\n class=\"fil2 str2\" />\r\n\r\n <path\r\n id=\"path2914\"\r\n d=\"m 0,1579 c 12,0 34,-5 56,-8 41,-7 11,56 -56,56 v 21 c 68,0 139,-74 124,-107 -21,-48 -79,-7 -124,-7 -45,0 -103,-41 -124,7 -15,33 56,107 124,107 v -21 c -67,0 -97,-63 -56,-56 22,3 44,8 56,8 z\"\r\n class=\"fil2 str2\" />\r\n\r\n <path\r\n id=\"path2916\"\r\n d=\"m 54,1623 c 88,44 198,32 291,-28 4,-2 6,1 2,12 -10,29 -18,52 12,95 13,19 -2,22 -24,20 -112,-11 -222,-36 -275,-57 z\"\r\n class=\"fil2 str2\" />\r\n\r\n <path\r\n id=\"path2918\"\r\n d=\"m 56,1675 c 35,14 94,31 162,43 27,4 26,21 -22,27 -49,5 -112,-30 -150,-61 z\"\r\n class=\"fil2 str2\" />\r\n\r\n <path\r\n id=\"path2920\"\r\n d=\"m 3,1665 c 2,17 5,54 28,38 31,-21 38,-37 38,-67 0,-19 -23,-47 -69,-47 -46,0 -69,28 -69,47 0,30 7,46 38,67 23,16 25,-21 28,-38 1,-6 6,-4 6,0 z\"\r\n class=\"fil2 str2\" />\r\n\r\n </g>\r\n <g\r\n id=\"g2724\"\r\n transform=\"matrix(1.1355,0,0,1.0324,2.7256,-21.429)\"\r\n stroke=\"#000000\"\r\n stroke-width=\"8.012\"\r\n fill=\"#ffffff\">\r\n <path\r\n id=\"path2726\"\r\n d=\"m -29,384 c -13,-74 -122,-79 -139,-91 -20,-13 -17,0 -10,20 20,52 88,73 119,79 25,4 33,6 30,-8 z\"\r\n class=\"fil2 str2\" />\r\n\r\n <path\r\n id=\"path2728\"\r\n d=\"m 4,386 c 11,-76 -97,-112 -110,-129 -15,-18 -17,-7 -10,14 13,45 60,98 88,112 23,12 30,17 32,3 z\"\r\n class=\"fil2 str2\" />\r\n\r\n <path\r\n id=\"path2730\"\r\n d=\"M 93,430 C 103,339 15,325 -8,296 c -15,-18 -16,-8 -11,13 10,46 54,100 81,117 21,13 30,18 31,4 z\"\r\n class=\"fil2 str2\" />\r\n\r\n <path\r\n id=\"path2732\"\r\n d=\"m 66,410 c -91,-59 -155,-26 -181,-29 -25,-3 -33,13 10,37 53,29 127,25 156,14 30,-12 21,-18 15,-22 z\"\r\n class=\"fil2 str2\" />\r\n\r\n <path\r\n id=\"path2734\"\r\n d=\"M 203,450 C 175,352 110,368 91,356 72,344 70,347 74,369 c 8,39 75,82 108,95 12,4 27,10 21,-14 z\"\r\n class=\"fil2 str2\" />\r\n\r\n <path\r\n id=\"path2736\"\r\n d=\"M 190,467 C 112,404 51,451 27,444 c -18,-5 -10,7 -3,12 50,35 112,54 160,32 19,-8 20,-10 6,-21 z\"\r\n class=\"fil2 str2\" />\r\n\r\n <path\r\n id=\"path2738\"\r\n d=\"m 359,531 c 1,-62 -127,-88 -154,-126 -16,-23 -30,-11 -22,26 12,48 100,101 148,111 29,6 28,-4 28,-11 z\"\r\n class=\"fil2 str2\" />\r\n\r\n <path\r\n id=\"path2740\"\r\n d=\"m 355,542 c -81,-73 -149,-49 -174,-56 -25,-6 -35,9 4,39 48,36 122,43 153,36 31,-7 23,-14 17,-19 z\"\r\n class=\"fil2 str2\" />\r\n\r\n <path\r\n id=\"path2742\"\r\n d=\"M 500,649 C 477,543 404,521 386,501 c -17,-20 -35,-14 -20,34 18,57 77,107 108,119 30,13 28,3 26,-5 z\"\r\n class=\"fil2 str2\" />\r\n\r\n <path\r\n id=\"path2744\"\r\n d=\"M 499,663 C 440,568 363,571 339,558 c -23,-14 -39,-2 -8,39 36,50 110,78 144,80 34,2 28,-7 24,-14 z\"\r\n class=\"fil2 str2\" />\r\n\r\n <path\r\n id=\"path2746\"\r\n d=\"m 575,776 c 34,-108 -44,-148 -52,-166 -9,-18 -18,-18 -23,1 -22,77 49,152 60,167 11,14 13,7 15,-2 z\"\r\n class=\"fil2 str2\" />\r\n\r\n <path\r\n id=\"path2748\"\r\n d=\"M 559,806 C 532,685 461,692 445,675 c -17,-17 -19,-5 -16,17 8,59 79,99 111,119 10,6 22,13 19,-5 z\"\r\n class=\"fil2 str2\" />\r\n\r\n <path\r\n id=\"path2750\"\r\n d=\"m 627,948 c 49,-114 -9,-191 -27,-208 -18,-16 -29,-23 -23,0 8,35 -20,125 23,191 14,22 16,43 27,17 z\"\r\n class=\"fil2 str2\" />\r\n\r\n <path\r\n id=\"path2752\"\r\n d=\"m 601,971 c 11,-70 -29,-134 -72,-159 -25,-15 -26,-11 -26,10 2,65 63,119 81,149 17,28 16,7 17,0 z\"\r\n class=\"fil2 str2\" />\r\n\r\n <path\r\n id=\"path2754\"\r\n d=\"m 590,1153 c -36,-132 39,-208 62,-223 22,-16 36,-22 26,3 -15,37 1,140 -56,205 -18,22 -25,45 -32,15 z\"\r\n class=\"fil2 str2\" />\r\n\r\n <path\r\n id=\"path2756\"\r\n d=\"m 598,1124 c 30,-115 -35,-180 -55,-193 -19,-13 -31,-18 -22,3 12,32 -1,122 49,178 16,19 22,38 28,12 z\"\r\n class=\"fil2 str2\" />\r\n\r\n <path\r\n id=\"path2758\"\r\n d=\"m 561,1070 c -54,58 -55,143 -31,193 15,29 17,27 31,6 38,-61 15,-149 17,-188 1,-37 -11,-17 -17,-11 z\"\r\n class=\"fil2 str2\" />\r\n\r\n <path\r\n id=\"path2760\"\r\n d=\"m 650,1162 c 0,80 -49,145 -101,165 -30,11 -30,8 -26,-16 14,-90 83,-123 108,-152 24,-28 19,-5 19,3 z\"\r\n class=\"fil2 str2\" />\r\n\r\n <path\r\n id=\"path2762\"\r\n d=\"m 464,1400 c 88,-80 41,-136 45,-188 2,-28 -9,-21 -19,-11 -56,55 -59,153 -47,191 5,17 13,15 21,8 z\"\r\n class=\"fil2 str2\" />\r\n\r\n <path\r\n id=\"path2764\"\r\n d=\"m 582,1348 c -29,88 -106,142 -171,145 -38,2 -37,-1 -24,-27 49,-94 136,-105 175,-129 36,-22 23,2 20,11 z\"\r\n class=\"fil2 str2\" />\r\n\r\n <path\r\n id=\"path2766\"\r\n d=\"m 343,1513 c 114,-57 91,-152 112,-176 15,-17 -3,-15 -12,-9 -67,39 -121,101 -122,167 0,25 2,28 22,18 z\"\r\n class=\"fil2 str2\" />\r\n\r\n <path\r\n id=\"path2768\"\r\n d=\"m 187,1619 c 144,23 211,-86 253,-96 22,-5 6,-14 -5,-15 -96,-11 -218,34 -255,84 -15,20 -15,24 7,27 z\"\r\n class=\"fil2 str2\" />\r\n\r\n <path\r\n id=\"path2770\"\r\n d=\"m 333,1448 c -29,95 -137,173 -218,179 -38,3 -38,-1 -24,-26 65,-118 178,-138 218,-168 34,-26 27,6 24,15 z\"\r\n class=\"fil2 str2\" />\r\n\r\n <path\r\n id=\"path2772\"\r\n d=\"m 29,384 c 13,-74 122,-79 139,-91 20,-13 17,0 10,20 -20,52 -88,73 -119,79 -25,4 -33,6 -30,-8 z\"\r\n class=\"fil2 str2\" />\r\n\r\n <path\r\n id=\"path2774\"\r\n d=\"m -4,386 c -11,-76 97,-112 110,-129 15,-18 17,-7 10,14 -13,45 -60,98 -88,112 -23,12 -30,17 -32,3 z\"\r\n class=\"fil2 str2\" />\r\n\r\n <path\r\n id=\"path2776\"\r\n d=\"m -93,430 c -10,-91 78,-105 101,-134 15,-18 16,-8 11,13 -10,46 -54,100 -81,117 -21,13 -30,18 -31,4 z\"\r\n class=\"fil2 str2\" />\r\n\r\n <path\r\n id=\"path2778\"\r\n d=\"m -66,410 c 91,-59 155,-26 181,-29 25,-3 33,13 -10,37 -53,29 -127,25 -156,14 -30,-12 -21,-18 -15,-22 z\"\r\n class=\"fil2 str2\" />\r\n\r\n <path\r\n id=\"path2780\"\r\n d=\"m -203,450 c 28,-98 93,-82 112,-94 19,-12 21,-9 17,13 -8,39 -75,82 -108,95 -12,4 -27,10 -21,-14 z\"\r\n class=\"fil2 str2\" />\r\n\r\n <path\r\n id=\"path2782\"\r\n d=\"m -190,467 c 78,-63 139,-16 163,-23 18,-5 10,7 3,12 -50,35 -112,54 -160,32 -19,-8 -20,-10 -6,-21 z\"\r\n class=\"fil2 str2\" />\r\n\r\n <path\r\n id=\"path2784\"\r\n d=\"m -359,531 c -1,-62 127,-88 154,-126 16,-23 30,-11 22,26 -12,48 -100,101 -148,111 -29,6 -28,-4 -28,-11 z\"\r\n class=\"fil2 str2\" />\r\n\r\n <path\r\n id=\"path2786\"\r\n d=\"m -355,542 c 81,-73 149,-49 174,-56 25,-6 35,9 -4,39 -48,36 -122,43 -153,36 -31,-7 -23,-14 -17,-19 z\"\r\n class=\"fil2 str2\" />\r\n\r\n <path\r\n id=\"path2788\"\r\n d=\"m -500,649 c 23,-106 96,-128 114,-148 17,-20 35,-14 20,34 -18,57 -77,107 -108,119 -30,13 -28,3 -26,-5 z\"\r\n class=\"fil2 str2\" />\r\n\r\n <path\r\n id=\"path2790\"\r\n d=\"m -499,663 c 59,-95 136,-92 160,-105 23,-14 39,-2 8,39 -36,50 -110,78 -144,80 -34,2 -28,-7 -24,-14 z\"\r\n class=\"fil2 str2\" />\r\n\r\n <path\r\n id=\"path2792\"\r\n d=\"m -575,776 c -34,-108 44,-148 52,-166 9,-18 18,-18 23,1 22,77 -49,152 -60,167 -11,14 -13,7 -15,-2 z\"\r\n class=\"fil2 str2\" />\r\n\r\n <path\r\n id=\"path2794\"\r\n d=\"m -559,806 c 27,-121 98,-114 114,-131 17,-17 19,-5 16,17 -8,59 -79,99 -111,119 -10,6 -22,13 -19,-5 z\"\r\n class=\"fil2 str2\" />\r\n\r\n <path\r\n id=\"path2796\"\r\n d=\"m -627,948 c -49,-114 9,-191 27,-208 18,-16 29,-23 23,0 -8,35 20,125 -23,191 -14,22 -16,43 -27,17 z\"\r\n class=\"fil2 str2\" />\r\n\r\n <path\r\n id=\"path2798\"\r\n d=\"m -601,971 c -11,-70 29,-134 72,-159 25,-15 26,-11 26,10 -2,65 -63,119 -81,149 -17,28 -16,7 -17,0 z\"\r\n class=\"fil2 str2\" />\r\n\r\n <path\r\n id=\"path2800\"\r\n d=\"m -590,1153 c 36,-132 -39,-208 -62,-223 -22,-16 -36,-22 -26,3 15,37 -1,140 56,205 18,22 24,45 32,15 z\"\r\n class=\"fil2 str2\" />\r\n\r\n <path\r\n id=\"path2802\"\r\n d=\"m -598,1124 c -30,-115 35,-180 55,-193 19,-13 31,-18 22,3 -12,32 1,122 -49,178 -16,19 -22,38 -28,12 z\"\r\n class=\"fil2 str2\" />\r\n\r\n <path\r\n id=\"path2804\"\r\n d=\"m -561,1070 c 54,58 55,143 31,193 -15,29 -17,27 -31,6 -38,-61 -15,-149 -17,-188 -1,-37 11,-17 17,-11 z\"\r\n class=\"fil2 str2\" />\r\n\r\n <path\r\n id=\"path2806\"\r\n d=\"m -650,1162 c 0,80 49,145 101,165 30,11 30,8 26,-16 -14,-90 -83,-123 -108,-152 -24,-28 -19,-5 -19,3 z\"\r\n class=\"fil2 str2\" />\r\n\r\n <path\r\n id=\"path2808\"\r\n d=\"m -464,1400 c -88,-80 -41,-136 -45,-188 -2,-28 9,-21 19,-11 56,55 59,153 47,191 -5,17 -13,15 -21,8 z\"\r\n class=\"fil2 str2\" />\r\n\r\n <path\r\n id=\"path2810\"\r\n d=\"m -582,1348 c 29,88 106,142 171,145 38,2 37,-1 24,-27 -49,-94 -136,-105 -175,-129 -36,-22 -23,2 -20,11 z\"\r\n class=\"fil2 str2\" />\r\n\r\n <path\r\n id=\"path2812\"\r\n d=\"m -343,1513 c -114,-57 -91,-152 -112,-176 -15,-17 3,-15 12,-9 67,39 121,101 122,167 0,25 -2,28 -22,18 z\"\r\n class=\"fil2 str2\" />\r\n\r\n <path\r\n id=\"path2814\"\r\n d=\"m -187,1619 c -144,23 -211,-86 -253,-96 -22,-5 -6,-14 5,-15 96,-11 218,34 255,84 15,20 15,24 -7,27 z\"\r\n class=\"fil2 str2\" />\r\n\r\n <path\r\n id=\"path2816\"\r\n d=\"m -333,1448 c 29,95 137,173 218,179 38,3 38,-1 24,-26 -65,-118 -178,-138 -218,-168 -34,-26 -27,6 -24,15 z\"\r\n class=\"fil2 str2\" />\r\n\r\n </g>\r\n <g\r\n id=\"g2818\"\r\n fill=\"#006233\"\r\n transform=\"matrix(1.1355,0,0,1.0324,2.7256,-21.429)\">\r\n <path\r\n id=\"path2820\"\r\n d=\"m 169,476 c -19,-14 -89,-6 -102,-15 25,21 81,6 102,15 z\"\r\n class=\"fil0\" />\r\n\r\n <path\r\n id=\"path2822\"\r\n d=\"m 338,512 c -15,-27 -104,-45 -117,-69 23,46 92,40 117,69 z\"\r\n class=\"fil0\" />\r\n\r\n <path\r\n id=\"path2824\"\r\n d=\"m 325,543 c -33,-32 -110,-19 -133,-38 54,49 84,11 133,38 z\"\r\n class=\"fil0\" />\r\n\r\n <path\r\n id=\"path2826\"\r\n d=\"m 132,401 c 21,11 47,22 60,48 -15,-20 -42,-28 -64,-45 1,0 3,-2 4,-3 z\"\r\n class=\"fil0\" />\r\n\r\n <path\r\n id=\"path2828\"\r\n d=\"m 460,607 c -13,-30 -59,-63 -63,-74 13,39 51,48 63,74 z\"\r\n class=\"fil0\" />\r\n\r\n <path\r\n id=\"path2830\"\r\n d=\"m 472,660 c -40,-63 -103,-56 -128,-80 19,23 91,38 128,80 z\"\r\n class=\"fil0\" />\r\n\r\n <path\r\n id=\"path2832\"\r\n d=\"m 565,757 c 3,-67 -47,-92 -49,-130 -1,45 51,106 49,130 z\"\r\n class=\"fil0\" />\r\n\r\n <path\r\n id=\"path2834\"\r\n d=\"m 540,793 c -10,-58 -78,-62 -90,-96 0,32 80,65 90,96 z\"\r\n class=\"fil0\" />\r\n\r\n <path\r\n id=\"path2836\"\r\n d=\"m 596,760 c 36,44 11,111 26,160 -18,-36 -9,-126 -26,-160 z\"\r\n class=\"fil0\" />\r\n\r\n <path\r\n id=\"path2838\"\r\n d=\"m 537,948 c 54,58 32,123 54,151 -27,-39 -23,-115 -54,-151 z\"\r\n class=\"fil0\" />\r\n\r\n <path\r\n id=\"path2840\"\r\n d=\"m 649,956 c -46,51 -18,128 -42,164 27,-31 23,-126 42,-164 z\"\r\n class=\"fil0\" />\r\n\r\n <path\r\n id=\"path2842\"\r\n d=\"m 591,956 c -6,-59 -61,-90 -66,-122 -6,32 53,82 66,122 z\"\r\n class=\"fil0\" />\r\n\r\n <path\r\n id=\"path2844\"\r\n d=\"m 563,1097 c 9,41 -24,129 -14,156 -22,-47 19,-136 14,-156 z\"\r\n class=\"fil0\" />\r\n\r\n <path\r\n id=\"path2846\"\r\n d=\"m 634,1191 c -22,73 -66,68 -80,112 10,-42 68,-80 80,-112 z\"\r\n class=\"fil0\" />\r\n\r\n <path\r\n id=\"path2848\"\r\n d=\"m 491,1225 c -29,49 -5,105 -29,140 34,-35 16,-100 29,-140 z\"\r\n class=\"fil0\" />\r\n\r\n <path\r\n id=\"path2850\"\r\n d=\"m 561,1359 c -35,65 -107,59 -136,106 29,-59 118,-69 136,-106 z\"\r\n class=\"fil0\" />\r\n\r\n <path\r\n id=\"path2852\"\r\n d=\"m 434,1351 c -62,43 -43,88 -90,136 59,-48 54,-101 90,-136 z\"\r\n class=\"fil0\" />\r\n\r\n <path\r\n id=\"path2854\"\r\n d=\"m 405,1525 c -60,-2 -146,76 -198,70 52,11 148,-59 198,-70 z\"\r\n class=\"fil0\" />\r\n\r\n <path\r\n id=\"path2856\"\r\n d=\"m 308,1455 c -4,61 -160,100 -177,141 19,-54 156,-94 177,-141 z\"\r\n class=\"fil0\" />\r\n\r\n <path\r\n id=\"path2858\"\r\n d=\"m -45,330 c -20,-17 -44,-31 -51,-48 5,22 25,38 45,53 2,-1 4,-4 6,-5 z\"\r\n class=\"fil0\" />\r\n\r\n <path\r\n id=\"path2860\"\r\n d=\"m -79,348 c -31,-15 -67,-14 -83,-35 10,21 44,29 73,40 3,-2 7,-4 10,-5 z\"\r\n class=\"fil0\" />\r\n\r\n <path\r\n id=\"path2862\"\r\n d=\"m -169,476 c 19,-14 89,-6 102,-15 -25,21 -81,6 -102,15 z\"\r\n class=\"fil0\" />\r\n\r\n <path\r\n id=\"path2864\"\r\n d=\"m -338,512 c 15,-27 104,-45 117,-69 -23,46 -92,40 -117,69 z\"\r\n class=\"fil0\" />\r\n\r\n <path\r\n id=\"path2866\"\r\n d=\"m -325,543 c 33,-32 110,-19 133,-38 -54,49 -84,11 -133,38 z\"\r\n class=\"fil0\" />\r\n\r\n <path\r\n id=\"path2868\"\r\n d=\"m -192,449 c 19,-40 73,-45 87,-69 -21,36 -67,42 -87,69 z\"\r\n class=\"fil0\" />\r\n\r\n <path\r\n id=\"path2870\"\r\n d=\"M -38,414 C 17,388 71,410 97,398 65,415 -11,407 -38,414 Z\"\r\n class=\"fil0\" />\r\n\r\n <path\r\n id=\"path2872\"\r\n d=\"m -460,607 c 13,-30 59,-63 63,-74 -13,39 -51,48 -63,74 z\"\r\n class=\"fil0\" />\r\n\r\n <path\r\n id=\"path2874\"\r\n d=\"m -472,660 c 40,-63 103,-56 128,-80 -19,23 -91,38 -128,80 z\"\r\n class=\"fil0\" />\r\n\r\n <path\r\n id=\"path2876\"\r\n d=\"m -565,757 c -3,-67 47,-92 49,-130 1,45 -51,106 -49,130 z\"\r\n class=\"fil0\" />\r\n\r\n <path\r\n id=\"path2878\"\r\n d=\"m -540,793 c 10,-58 78,-62 90,-96 0,32 -80,65 -90,96 z\"\r\n class=\"fil0\" />\r\n\r\n <path\r\n id=\"path2880\"\r\n d=\"m -596,760 c -36,44 -11,111 -26,160 18,-36 9,-126 26,-160 z\"\r\n class=\"fil0\" />\r\n\r\n <path\r\n id=\"path2882\"\r\n d=\"m -537,948 c -54,58 -32,123 -54,151 27,-39 23,-115 54,-151 z\"\r\n class=\"fil0\" />\r\n\r\n <path\r\n id=\"path2884\"\r\n d=\"m -649,956 c 46,51 18,128 42,164 -27,-31 -23,-126 -42,-164 z\"\r\n class=\"fil0\" />\r\n\r\n <path\r\n id=\"path2886\"\r\n d=\"m -591,956 c 6,-59 61,-90 66,-122 6,32 -53,82 -66,122 z\"\r\n class=\"fil0\" />\r\n\r\n <path\r\n id=\"path2888\"\r\n d=\"m -563,1097 c -9,41 24,129 14,156 22,-47 -19,-136 -14,-156 z\"\r\n class=\"fil0\" />\r\n\r\n <path\r\n id=\"path2890\"\r\n d=\"m -634,1191 c 22,73 66,68 80,112 -10,-42 -68,-80 -80,-112 z\"\r\n class=\"fil0\" />\r\n\r\n <path\r\n id=\"path2892\"\r\n d=\"m -491,1225 c 29,49 5,105 29,140 -34,-35 -16,-100 -29,-140 z\"\r\n class=\"fil0\" />\r\n\r\n <path\r\n id=\"path2894\"\r\n d=\"m -561,1359 c 35,65 107,59 136,106 -29,-59 -118,-69 -136,-106 z\"\r\n class=\"fil0\" />\r\n\r\n <path\r\n id=\"path2896\"\r\n d=\"m -434,1351 c 62,43 43,88 90,136 -59,-48 -54,-101 -90,-136 z\"\r\n class=\"fil0\" />\r\n\r\n <path\r\n id=\"path2898\"\r\n d=\"m -405,1525 c 60,-2 146,76 198,70 -52,11 -148,-59 -198,-70 z\"\r\n class=\"fil0\" />\r\n\r\n <path\r\n id=\"path2900\"\r\n d=\"m -308,1455 c 4,61 160,100 177,141 -19,-54 -156,-94 -177,-141 z\"\r\n class=\"fil0\" />\r\n\r\n <path\r\n id=\"path2902\"\r\n d=\"m -81,416 c 12,-54 72,-64 80,-96 -3,34 -74,72 -80,96 z\"\r\n class=\"fil0\" />\r\n\r\n <path\r\n id=\"path2904\"\r\n d=\"m 96,282 c -9,41 -74,64 -83,95 3,-42 70,-66 83,-95 z\"\r\n class=\"fil0\" />\r\n\r\n <path\r\n id=\"path2906\"\r\n d=\"m 45,379 c 31,-50 95,-37 117,-66 -16,34 -95,35 -117,66 z\"\r\n class=\"fil0\" />\r\n\r\n </g>\r\n <path\r\n id=\"path12826\"\r\n stroke-linejoin=\"round\"\r\n d=\"m 475.64,1011.9 c 0,263.22 -213.38,476.6 -476.6,476.6 -263.22,0 -476.6,-213.38 -476.6,-476.6 0,-263.22 213.38,-476.6 476.6,-476.6 263.22,0 476.6,213.38 476.6,476.6 z\"\r\n transform=\"matrix(1.1203,0,0,1.0186,1.5554,-22.824)\"\r\n stroke=\"#f7c608\"\r\n stroke-linecap=\"round\"\r\n stroke-width=\"8.1208\"\r\n fill=\"none\" />\r\n <g\r\n id=\"g12874\"\r\n transform=\"matrix(1.089,0.29066,-0.31969,0.99014,322.08,9.1715)\">\r\n <path\r\n id=\"path12861\"\r\n fill=\"#f7c608\"\r\n d=\"m 44.747,1486.1 v 6 c 0,4 -3.002,7 -7.004,8 -10.005,0 -23.011,1 -35.017,1 l -3e-4,-38 c 13.006,0 26.013,-1 35.017,-2 4.002,0 7.004,3 7.004,7 v 5 m -84.042,1 v -6 c 0,-4 3.001,-7 7.003,-7 10.005,1 22.011,2 35.018,2 l -3e-4,38 c -12.006,0 -24.012,0 -35.018,-1 -4.002,-1 -7.003,-8 -7.003,-12\" />\r\n <path\r\n id=\"path12865\"\r\n fill=\"#006233\"\r\n d=\"m 37.554,1484.9 v 4.3 c 0,2.9 -2.497,5 -5.825,5.7 -8.321,0 -19.139,0.7 -29.124,0.7 l -4e-4,-27.2 c 10.817,0 21.635,-0.7 29.124,-1.4 3.328,0 5.825,2.1 5.825,5 v 3.6 m -69.898,0.7 v -4.3 c 0,-2.9 2.496,-5 5.825,-5 8.321,0.7 18.306,1.4 29.124,1.4 l -4e-4,27.2 c -9.9854,0 -19.971,0 -29.124,-0.7 -3.329,-0.7 -5.825,-5.7 -5.825,-8.6\" />\r\n </g>\r\n <g\r\n id=\"g12878\"\r\n transform=\"matrix(0.95488,0.55779,-0.6135,0.86818,618.66,131.41)\">\r\n <path\r\n id=\"path12880\"\r\n fill=\"#f7c608\"\r\n d=\"m 44.747,1486.1 v 6 c 0,4 -3.002,7 -7.004,8 -10.005,0 -23.011,1 -35.017,1 l -3e-4,-38 c 13.006,0 26.013,-1 35.017,-2 4.002,0 7.004,3 7.004,7 v 5 m -84.042,1 v -6 c 0,-4 3.001,-7 7.003,-7 10.005,1 22.011,2 35.018,2 l -3e-4,38 c -12.006,0 -24.012,0 -35.018,-1 -4.002,-1 -7.003,-8 -7.003,-12\" />\r\n <path\r\n id=\"path12882\"\r\n fill=\"#006233\"\r\n d=\"m 37.554,1484.9 v 4.3 c 0,2.9 -2.497,5 -5.825,5.7 -8.321,0 -19.139,0.7 -29.124,0.7 l -4e-4,-27.2 c 10.817,0 21.635,-0.7 29.124,-1.4 3.328,0 5.825,2.1 5.825,5 v 3.6 m -69.898,0.7 v -4.3 c 0,-2.9 2.496,-5 5.825,-5 8.321,0.7 18.306,1.4 29.124,1.4 l -4e-4,27.2 c -9.9854,0 -19.971,0 -29.124,-0.7 -3.329,-0.7 -5.825,-5.7 -5.825,-8.6\" />\r\n </g>\r\n <g\r\n id=\"g12884\"\r\n transform=\"matrix(0.74342,0.77974,-0.85762,0.67591,865.37,324.65)\">\r\n <path\r\n id=\"path12886\"\r\n fill=\"#f7c608\"\r\n d=\"m 44.747,1486.1 v 6 c 0,4 -3.002,7 -7.004,8 -10.005,0 -23.011,1 -35.017,1 l -3e-4,-38 c 13.006,0 26.013,-1 35.017,-2 4.002,0 7.004,3 7.004,7 v 5 m -84.042,1 v -6 c 0,-4 3.001,-7 7.003,-7 10.005,1 22.011,2 35.018,2 l -3e-4,38 c -12.006,0 -24.012,0 -35.018,-1 -4.002,-1 -7.003,-8 -7.003,-12\" />\r\n <path\r\n id=\"path12888\"\r\n fill=\"#006233\"\r\n d=\"m 37.554,1484.9 v 4.3 c 0,2.9 -2.497,5 -5.825,5.7 -8.321,0 -19.139,0.7 -29.124,0.7 l -4e-4,-27.2 c 10.817,0 21.635,-0.7 29.124,-1.4 3.328,0 5.825,2.1 5.825,5 v 3.6 m -69.898,0.7 v -4.3 c 0,-2.9 2.496,-5 5.825,-5 8.321,0.7 18.306,1.4 29.124,1.4 l -4e-4,27.2 c -9.9854,0 -19.971,0 -29.124,-0.7 -3.329,-0.7 -5.825,-5.7 -5.825,-8.6\" />\r\n </g>\r\n <g\r\n id=\"g12890\"\r\n transform=\"matrix(0.47175,0.93856,-1.0323,0.42891,1042.2,573.25)\">\r\n <path\r\n id=\"path12892\"\r\n fill=\"#f7c608\"\r\n d=\"m 44.747,1486.1 v 6 c 0,4 -3.002,7 -7.004,8 -10.005,0 -23.011,1 -35.017,1 l -3e-4,-38 c 13.006,0 26.013,-1 35.017,-2 4.002,0 7.004,3 7.004,7 v 5 m -84.042,1 v -6 c 0,-4 3.001,-7 7.003,-7 10.005,1 22.011,2 35.018,2 l -3e-4,38 c -12.006,0 -24.012,0 -35.018,-1 -4.002,-1 -7.003,-8 -7.003,-12\" />\r\n <path\r\n id=\"path12894\"\r\n fill=\"#006233\"\r\n d=\"m 37.554,1484.9 v 4.3 c 0,2.9 -2.497,5 -5.825,5.7 -8.321,0 -19.139,0.7 -29.124,0.7 l -4e-4,-27.2 c 10.817,0 21.635,-0.7 29.124,-1.4 3.328,0 5.825,2.1 5.825,5 v 3.6 m -69.898,0.7 v -4.3 c 0,-2.9 2.496,-5 5.825,-5 8.321,0.7 18.306,1.4 29.124,1.4 l -4e-4,27.2 c -9.9854,0 -19.971,0 -29.124,-0.7 -3.329,-0.7 -5.825,-5.7 -5.825,-8.6\" />\r\n </g>\r\n <g\r\n id=\"g12896\"\r\n transform=\"matrix(0.16188,1.0214,-1.1234,0.14718,1134.9,857.07)\">\r\n <path\r\n id=\"path12898\"\r\n fill=\"#f7c608\"\r\n d=\"m 44.747,1486.1 v 6 c 0,4 -3.002,7 -7.004,8 -10.005,0 -23.011,1 -35.017,1 l -3e-4,-38 c 13.006,0 26.013,-1 35.017,-2 4.002,0 7.004,3 7.004,7 v 5 m -84.042,1 v -6 c 0,-4 3.001,-7 7.003,-7 10.005,1 22.011,2 35.018,2 l -3e-4,38 c -12.006,0 -24.012,0 -35.018,-1 -4.002,-1 -7.003,-8 -7.003,-12\" />\r\n <path\r\n id=\"path12900\"\r\n fill=\"#006233\"\r\n d=\"m 37.554,1484.9 v 4.3 c 0,2.9 -2.497,5 -5.825,5.7 -8.321,0 -19.139,0.7 -29.124,0.7 l -4e-4,-27.2 c 10.817,0 21.635,-0.7 29.124,-1.4 3.328,0 5.825,2.1 5.825,5 v 3.6 m -69.898,0.7 v -4.3 c 0,-2.9 2.496,-5 5.825,-5 8.321,0.7 18.306,1.4 29.124,1.4 l -4e-4,27.2 c -9.9854,0 -19.971,0 -29.124,-0.7 -3.329,-0.7 -5.825,-5.7 -5.825,-8.6\" />\r\n </g>\r\n <g\r\n id=\"g12902\"\r\n transform=\"matrix(-0.1611,1.0215,-1.1235,-0.14647,1135.9,1153.1)\">\r\n <path\r\n id=\"path12904\"\r\n fill=\"#f7c608\"\r\n d=\"m 44.747,1486.1 v 6 c 0,4 -3.002,7 -7.004,8 -10.005,0 -23.011,1 -35.017,1 l -3e-4,-38 c 13.006,0 26.013,-1 35.017,-2 4.002,0 7.004,3 7.004,7 v 5 m -84.042,1 v -6 c 0,-4 3.001,-7 7.003,-7 10.005,1 22.011,2 35.018,2 l -3e-4,38 c -12.006,0 -24.012,0 -35.018,-1 -4.002,-1 -7.003,-8 -7.003,-12\" />\r\n <path\r\n id=\"path12906\"\r\n fill=\"#006233\"\r\n d=\"m 37.554,1484.9 v 4.3 c 0,2.9 -2.497,5 -5.825,5.7 -8.321,0 -19.139,0.7 -29.124,0.7 l -4e-4,-27.2 c 10.817,0 21.635,-0.7 29.124,-1.4 3.328,0 5.825,2.1 5.825,5 v 3.6 m -69.898,0.7 v -4.3 c 0,-2.9 2.496,-5 5.825,-5 8.321,0.7 18.306,1.4 29.124,1.4 l -4e-4,27.2 c -9.9854,0 -19.971,0 -29.124,-0.7 -3.329,-0.7 -5.825,-5.7 -5.825,-8.6\" />\r\n </g>\r\n <g\r\n id=\"g12908\"\r\n transform=\"matrix(-0.47103,0.93886,-1.0326,-0.42826,1045.1,1437.5)\">\r\n <path\r\n id=\"path12910\"\r\n fill=\"#f7c608\"\r\n d=\"m 44.747,1486.1 v 6 c 0,4 -3.002,7 -7.004,8 -10.005,0 -23.011,1 -35.017,1 l -3e-4,-38 c 13.006,0 26.013,-1 35.017,-2 4.002,0 7.004,3 7.004,7 v 5 m -84.042,1 v -6 c 0,-4 3.001,-7 7.003,-7 10.005,1 22.011,2 35.018,2 l -3e-4,38 c -12.006,0 -24.012,0 -35.018,-1 -4.002,-1 -7.003,-8 -7.003,-12\" />\r\n <path\r\n id=\"path12912\"\r\n fill=\"#006233\"\r\n d=\"m 37.554,1484.9 v 4.3 c 0,2.9 -2.497,5 -5.825,5.7 -8.321,0 -19.139,0.7 -29.124,0.7 l -4e-4,-27.2 c 10.817,0 21.635,-0.7 29.124,-1.4 3.328,0 5.825,2.1 5.825,5 v 3.6 m -69.898,0.7 v -4.3 c 0,-2.9 2.496,-5 5.825,-5 8.321,0.7 18.306,1.4 29.124,1.4 l -4e-4,27.2 c -9.9854,0 -19.971,0 -29.124,-0.7 -3.329,-0.7 -5.825,-5.7 -5.825,-8.6\" />\r\n </g>\r\n <g\r\n id=\"g12914\"\r\n transform=\"matrix(-0.74282,0.78021,-0.85814,-0.67537,869.95,1687)\">\r\n <path\r\n id=\"path12916\"\r\n fill=\"#f7c608\"\r\n d=\"m 44.747,1486.1 v 6 c 0,4 -3.002,7 -7.004,8 -10.005,0 -23.011,1 -35.017,1 l -3e-4,-38 c 13.006,0 26.013,-1 35.017,-2 4.002,0 7.004,3 7.004,7 v 5 m -84.042,1 v -6 c 0,-4 3.001,-7 7.003,-7 10.005,1 22.011,2 35.018,2 l -3e-4,38 c -12.006,0 -24.012,0 -35.018,-1 -4.002,-1 -7.003,-8 -7.003,-12\" />\r\n <path\r\n id=\"path12918\"\r\n fill=\"#006233\"\r\n d=\"m 37.554,1484.9 v 4.3 c 0,2.9 -2.497,5 -5.825,5.7 -8.321,0 -19.139,0.7 -29.124,0.7 l -4e-4,-27.2 c 10.817,0 21.635,-0.7 29.124,-1.4 3.328,0 5.825,2.1 5.825,5 v 3.6 m -69.898,0.7 v -4.3 c 0,-2.9 2.496,-5 5.825,-5 8.321,0.7 18.306,1.4 29.124,1.4 l -4e-4,27.2 c -9.9854,0 -19.971,0 -29.124,-0.7 -3.329,-0.7 -5.825,-5.7 -5.825,-8.6\" />\r\n </g>\r\n <g\r\n id=\"g12920\"\r\n transform=\"matrix(-0.95446,0.55839,-0.61416,-0.86779,624.54,1881.6)\">\r\n <path\r\n id=\"path12922\"\r\n fill=\"#f7c608\"\r\n d=\"m 44.747,1486.1 v 6 c 0,4 -3.002,7 -7.004,8 -10.005,0 -23.011,1 -35.017,1 l -3e-4,-38 c 13.006,0 26.013,-1 35.017,-2 4.002,0 7.004,3 7.004,7 v 5 m -84.042,1 v -6 c 0,-4 3.001,-7 7.003,-7 10.005,1 22.011,2 35.018,2 l -3e-4,38 c -12.006,0 -24.012,0 -35.018,-1 -4.002,-1 -7.003,-8 -7.003,-12\" />\r\n <path\r\n id=\"path12924\"\r\n fill=\"#006233\"\r\n d=\"m 37.554,1484.9 v 4.3 c 0,2.9 -2.497,5 -5.825,5.7 -8.321,0 -19.139,0.7 -29.124,0.7 l -4e-4,-27.2 c 10.817,0 21.635,-0.7 29.124,-1.4 3.328,0 5.825,2.1 5.825,5 v 3.6 m -69.898,0.7 v -4.3 c 0,-2.9 2.496,-5 5.825,-5 8.321,0.7 18.306,1.4 29.124,1.4 l -4e-4,27.2 c -9.9854,0 -19.971,0 -29.124,-0.7 -3.329,-0.7 -5.825,-5.7 -5.825,-8.6\" />\r\n </g>\r\n <g\r\n id=\"g12926\"\r\n transform=\"matrix(-1.0888,0.29135,-0.32045,-0.98993,328.78,2005.5)\">\r\n <path\r\n id=\"path12928\"\r\n fill=\"#f7c608\"\r\n d=\"m 44.747,1486.1 v 6 c 0,4 -3.002,7 -7.004,8 -10.005,0 -23.011,1 -35.017,1 l -3e-4,-38 c 13.006,0 26.013,-1 35.017,-2 4.002,0 7.004,3 7.004,7 v 5 m -84.042,1 v -6 c 0,-4 3.001,-7 7.003,-7 10.005,1 22.011,2 35.018,2 l -3e-4,38 c -12.006,0 -24.012,0 -35.018,-1 -4.002,-1 -7.003,-8 -7.003,-12\" />\r\n <path\r\n id=\"path12930\"\r\n fill=\"#006233\"\r\n d=\"m 37.554,1484.9 v 4.3 c 0,2.9 -2.497,5 -5.825,5.7 -8.321,0 -19.139,0.7 -29.124,0.7 l -4e-4,-27.2 c 10.817,0 21.635,-0.7 29.124,-1.4 3.328,0 5.825,2.1 5.825,5 v 3.6 m -69.898,0.7 v -4.3 c 0,-2.9 2.496,-5 5.825,-5 8.321,0.7 18.306,1.4 29.124,1.4 l -4e-4,27.2 c -9.9854,0 -19.971,0 -29.124,-0.7 -3.329,-0.7 -5.825,-5.7 -5.825,-8.6\" />\r\n </g>\r\n <g\r\n id=\"g12932\"\r\n transform=\"matrix(-1.135,7.2019e-4,-7.9212e-4,-1.0319,6.6183,2048.7)\">\r\n <path\r\n id=\"path12934\"\r\n fill=\"#f7c608\"\r\n d=\"m 44.747,1486.1 v 6 c 0,4 -3.002,7 -7.004,8 -10.005,0 -23.011,1 -35.017,1 l -3e-4,-38 c 13.006,0 26.013,-1 35.017,-2 4.002,0 7.004,3 7.004,7 v 5 m -84.042,1 v -6 c 0,-4 3.001,-7 7.003,-7 10.005,1 22.011,2 35.018,2 l -3e-4,38 c -12.006,0 -24.012,0 -35.018,-1 -4.002,-1 -7.003,-8 -7.003,-12\" />\r\n <path\r\n id=\"path12936\"\r\n fill=\"#006233\"\r\n d=\"m 37.554,1484.9 v 4.3 c 0,2.9 -2.497,5 -5.825,5.7 -8.321,0 -19.139,0.7 -29.124,0.7 l -4e-4,-27.2 c 10.817,0 21.635,-0.7 29.124,-1.4 3.328,0 5.825,2.1 5.825,5 v 3.6 m -69.898,0.7 v -4.3 c 0,-2.9 2.496,-5 5.825,-5 8.321,0.7 18.306,1.4 29.124,1.4 l -4e-4,27.2 c -9.9854,0 -19.971,0 -29.124,-0.7 -3.329,-0.7 -5.825,-5.7 -5.825,-8.6\" />\r\n </g>\r\n <g\r\n id=\"g12938\"\r\n transform=\"matrix(-1.0918,-0.28208,0.31025,-0.99262,-313.06,2009.9)\">\r\n <path\r\n id=\"path12940\"\r\n fill=\"#f7c608\"\r\n d=\"m 44.747,1486.1 v 6 c 0,4 -3.002,7 -7.004,8 -10.005,0 -23.011,1 -35.017,1 l -3e-4,-38 c 13.006,0 26.013,-1 35.017,-2 4.002,0 7.004,3 7.004,7 v 5 m -84.042,1 v -6 c 0,-4 3.001,-7 7.003,-7 10.005,1 22.011,2 35.018,2 l -3e-4,38 c -12.006,0 -24.012,0 -35.018,-1 -4.002,-1 -7.003,-8 -7.003,-12\" />\r\n <path\r\n id=\"path12942\"\r\n fill=\"#006233\"\r\n d=\"m 37.554,1484.9 v 4.3 c 0,2.9 -2.497,5 -5.825,5.7 -8.321,0 -19.139,0.7 -29.124,0.7 l -4e-4,-27.2 c 10.817,0 21.635,-0.7 29.124,-1.4 3.328,0 5.825,2.1 5.825,5 v 3.6 m -69.898,0.7 v -4.3 c 0,-2.9 2.496,-5 5.825,-5 8.321,0.7 18.306,1.4 29.124,1.4 l -4e-4,27.2 c -9.9854,0 -19.971,0 -29.124,-0.7 -3.329,-0.7 -5.825,-5.7 -5.825,-8.6\" />\r\n </g>\r\n <g\r\n id=\"g12944\"\r\n transform=\"matrix(-0.96016,-0.55025,0.60521,-0.87297,-610.8,1890)\">\r\n <path\r\n id=\"path12946\"\r\n fill=\"#f7c608\"\r\n d=\"m 44.747,1486.1 v 6 c 0,4 -3.002,7 -7.004,8 -10.005,0 -23.011,1 -35.017,1 l -3e-4,-38 c 13.006,0 26.013,-1 35.017,-2 4.002,0 7.004,3 7.004,7 v 5 m -84.042,1 v -6 c 0,-4 3.001,-7 7.003,-7 10.005,1 22.011,2 35.018,2 l -3e-4,38 c -12.006,0 -24.012,0 -35.018,-1 -4.002,-1 -7.003,-8 -7.003,-12\" />\r\n <path\r\n id=\"path12948\"\r\n fill=\"#006233\"\r\n d=\"m 37.554,1484.9 v 4.3 c 0,2.9 -2.497,5 -5.825,5.7 -8.321,0 -19.139,0.7 -29.124,0.7 l -4e-4,-27.2 c 10.817,0 21.635,-0.7 29.124,-1.4 3.328,0 5.825,2.1 5.825,5 v 3.6 m -69.898,0.7 v -4.3 c 0,-2.9 2.496,-5 5.825,-5 8.321,0.7 18.306,1.4 29.124,1.4 l -4e-4,27.2 c -9.9854,0 -19.971,0 -29.124,-0.7 -3.329,-0.7 -5.825,-5.7 -5.825,-8.6\" />\r\n </g>\r\n <g\r\n id=\"g12950\"\r\n transform=\"matrix(-0.75081,-0.77386,0.85115,-0.68264,-859.34,1698.7)\">\r\n <path\r\n id=\"path12952\"\r\n fill=\"#f7c608\"\r\n d=\"m 44.747,1486.1 v 6 c 0,4 -3.002,7 -7.004,8 -10.005,0 -23.011,1 -35.017,1 l -3e-4,-38 c 13.006,0 26.013,-1 35.017,-2 4.002,0 7.004,3 7.004,7 v 5 m -84.042,1 v -6 c 0,-4 3.001,-7 7.003,-7 10.005,1 22.011,2 35.018,2 l -3e-4,38 c -12.006,0 -24.012,0 -35.018,-1 -4.002,-1 -7.003,-8 -7.003,-12\" />\r\n <path\r\n id=\"path12954\"\r\n fill=\"#006233\"\r\n d=\"m 37.554,1484.9 v 4.3 c 0,2.9 -2.497,5 -5.825,5.7 -8.321,0 -19.139,0.7 -29.124,0.7 l -4e-4,-27.2 c 10.817,0 21.635,-0.7 29.124,-1.4 3.328,0 5.825,2.1 5.825,5 v 3.6 m -69.898,0.7 v -4.3 c 0,-2.9 2.496,-5 5.825,-5 8.321,0.7 18.306,1.4 29.124,1.4 l -4e-4,27.2 c -9.9854,0 -19.971,0 -29.124,-0.7 -3.329,-0.7 -5.825,-5.7 -5.825,-8.6\" />\r\n </g>\r\n <g\r\n id=\"g12956\"\r\n transform=\"matrix(-0.48067,-0.93481,1.0282,-0.43702,-1038.6,1451.5)\">\r\n <path\r\n id=\"path12958\"\r\n fill=\"#f7c608\"\r\n d=\"m 44.747,1486.1 v 6 c 0,4 -3.002,7 -7.004,8 -10.005,0 -23.011,1 -35.017,1 l -3e-4,-38 c 13.006,0 26.013,-1 35.017,-2 4.002,0 7.004,3 7.004,7 v 5 m -84.042,1 v -6 c 0,-4 3.001,-7 7.003,-7 10.005,1 22.011,2 35.018,2 l -3e-4,38 c -12.006,0 -24.012,0 -35.018,-1 -4.002,-1 -7.003,-8 -7.003,-12\" />\r\n <path\r\n id=\"path12960\"\r\n fill=\"#006233\"\r\n d=\"m 37.554,1484.9 v 4.3 c 0,2.9 -2.497,5 -5.825,5.7 -8.321,0 -19.139,0.7 -29.124,0.7 l -4e-4,-27.2 c 10.817,0 21.635,-0.7 29.124,-1.4 3.328,0 5.825,2.1 5.825,5 v 3.6 m -69.898,0.7 v -4.3 c 0,-2.9 2.496,-5 5.825,-5 8.321,0.7 18.306,1.4 29.124,1.4 l -4e-4,27.2 c -9.9854,0 -19.971,0 -29.124,-0.7 -3.329,-0.7 -5.825,-5.7 -5.825,-8.6\" />\r\n </g>\r\n <g\r\n id=\"g12962\"\r\n transform=\"matrix(-0.1716,-1.0201,1.1219,-0.15602,-1133.9,1168.4)\">\r\n <path\r\n id=\"path12964\"\r\n fill=\"#f7c608\"\r\n d=\"m 44.747,1486.1 v 6 c 0,4 -3.002,7 -7.004,8 -10.005,0 -23.011,1 -35.017,1 l -3e-4,-38 c 13.006,0 26.013,-1 35.017,-2 4.002,0 7.004,3 7.004,7 v 5 m -84.042,1 v -6 c 0,-4 3.001,-7 7.003,-7 10.005,1 22.011,2 35.018,2 l -3e-4,38 c -12.006,0 -24.012,0 -35.018,-1 -4.002,-1 -7.003,-8 -7.003,-12\" />\r\n <path\r\n id=\"path12966\"\r\n fill=\"#006233\"\r\n d=\"m 37.554,1484.9 v 4.3 c 0,2.9 -2.497,5 -5.825,5.7 -8.321,0 -19.139,0.7 -29.124,0.7 l -4e-4,-27.2 c 10.817,0 21.635,-0.7 29.124,-1.4 3.328,0 5.825,2.1 5.825,5 v 3.6 m -69.898,0.7 v -4.3 c 0,-2.9 2.496,-5 5.825,-5 8.321,0.7 18.306,1.4 29.124,1.4 l -4e-4,27.2 c -9.9854,0 -19.971,0 -29.124,-0.7 -3.329,-0.7 -5.825,-5.7 -5.825,-8.6\" />\r\n </g>\r\n <g\r\n id=\"g12968\"\r\n transform=\"matrix(0.15136,-1.0227,1.1248,0.13762,-1137.7,872.37)\">\r\n <path\r\n id=\"path12970\"\r\n fill=\"#f7c608\"\r\n d=\"m 44.747,1486.1 v 6 c 0,4 -3.002,7 -7.004,8 -10.005,0 -23.011,1 -35.017,1 l -3e-4,-38 c 13.006,0 26.013,-1 35.017,-2 4.002,0 7.004,3 7.004,7 v 5 m -84.042,1 v -6 c 0,-4 3.001,-7 7.003,-7 10.005,1 22.011,2 35.018,2 l -3e-4,38 c -12.006,0 -24.012,0 -35.018,-1 -4.002,-1 -7.003,-8 -7.003,-12\" />\r\n <path\r\n id=\"path12972\"\r\n fill=\"#006233\"\r\n d=\"m 37.554,1484.9 v 4.3 c 0,2.9 -2.497,5 -5.825,5.7 -8.321,0 -19.139,0.7 -29.124,0.7 l -4e-4,-27.2 c 10.817,0 21.635,-0.7 29.124,-1.4 3.328,0 5.825,2.1 5.825,5 v 3.6 m -69.898,0.7 v -4.3 c 0,-2.9 2.496,-5 5.825,-5 8.321,0.7 18.306,1.4 29.124,1.4 l -4e-4,27.2 c -9.9854,0 -19.971,0 -29.124,-0.7 -3.329,-0.7 -5.825,-5.7 -5.825,-8.6\" />\r\n </g>\r\n <g\r\n id=\"g12974\"\r\n transform=\"matrix(0.46207,-0.94253,1.0367,0.42011,-1049.7,587.33)\">\r\n <path\r\n id=\"path12976\"\r\n fill=\"#f7c608\"\r\n d=\"m 44.747,1486.1 v 6 c 0,4 -3.002,7 -7.004,8 -10.005,0 -23.011,1 -35.017,1 l -3e-4,-38 c 13.006,0 26.013,-1 35.017,-2 4.002,0 7.004,3 7.004,7 v 5 m -84.042,1 v -6 c 0,-4 3.001,-7 7.003,-7 10.005,1 22.011,2 35.018,2 l -3e-4,38 c -12.006,0 -24.012,0 -35.018,-1 -4.002,-1 -7.003,-8 -7.003,-12\" />\r\n <path\r\n id=\"path12978\"\r\n fill=\"#006233\"\r\n d=\"m 37.554,1484.9 v 4.3 c 0,2.9 -2.497,5 -5.825,5.7 -8.321,0 -19.139,0.7 -29.124,0.7 l -4e-4,-27.2 c 10.817,0 21.635,-0.7 29.124,-1.4 3.328,0 5.825,2.1 5.825,5 v 3.6 m -69.898,0.7 v -4.3 c 0,-2.9 2.496,-5 5.825,-5 8.321,0.7 18.306,1.4 29.124,1.4 l -4e-4,27.2 c -9.9854,0 -19.971,0 -29.124,-0.7 -3.329,-0.7 -5.825,-5.7 -5.825,-8.6\" />\r\n </g>\r\n <g\r\n id=\"g12980\"\r\n transform=\"matrix(0.73536,-0.78603,0.86454,0.66859,-876.89,336.39)\">\r\n <path\r\n id=\"path12982\"\r\n fill=\"#f7c608\"\r\n d=\"m 44.747,1486.1 v 6 c 0,4 -3.002,7 -7.004,8 -10.005,0 -23.011,1 -35.017,1 l -3e-4,-38 c 13.006,0 26.013,-1 35.017,-2 4.002,0 7.004,3 7.004,7 v 5 m -84.042,1 v -6 c 0,-4 3.001,-7 7.003,-7 10.005,1 22.011,2 35.018,2 l -3e-4,38 c -12.006,0 -24.012,0 -35.018,-1 -4.002,-1 -7.003,-8 -7.003,-12\" />\r\n <path\r\n id=\"path12984\"\r\n fill=\"#006233\"\r\n d=\"m 37.554,1484.9 v 4.3 c 0,2.9 -2.497,5 -5.825,5.7 -8.321,0 -19.139,0.7 -29.124,0.7 l -4e-4,-27.2 c 10.817,0 21.635,-0.7 29.124,-1.4 3.328,0 5.825,2.1 5.825,5 v 3.6 m -69.898,0.7 v -4.3 c 0,-2.9 2.496,-5 5.825,-5 8.321,0.7 18.306,1.4 29.124,1.4 l -4e-4,27.2 c -9.9854,0 -19.971,0 -29.124,-0.7 -3.329,-0.7 -5.825,-5.7 -5.825,-8.6\" />\r\n </g>\r\n <g\r\n id=\"g12986\"\r\n transform=\"matrix(0.9491,-0.56588,0.6224,0.86292,-633.34,139.86)\">\r\n <path\r\n id=\"path12988\"\r\n fill=\"#f7c608\"\r\n d=\"m 44.747,1486.1 v 6 c 0,4 -3.002,7 -7.004,8 -10.005,0 -23.011,1 -35.017,1 l -3e-4,-38 c 13.006,0 26.013,-1 35.017,-2 4.002,0 7.004,3 7.004,7 v 5 m -84.042,1 v -6 c 0,-4 3.001,-7 7.003,-7 10.005,1 22.011,2 35.018,2 l -3e-4,38 c -12.006,0 -24.012,0 -35.018,-1 -4.002,-1 -7.003,-8 -7.003,-12\" />\r\n <path\r\n id=\"path12990\"\r\n fill=\"#006233\"\r\n d=\"m 37.554,1484.9 v 4.3 c 0,2.9 -2.497,5 -5.825,5.7 -8.321,0 -19.139,0.7 -29.124,0.7 l -4e-4,-27.2 c 10.817,0 21.635,-0.7 29.124,-1.4 3.328,0 5.825,2.1 5.825,5 v 3.6 m -69.898,0.7 v -4.3 c 0,-2.9 2.496,-5 5.825,-5 8.321,0.7 18.306,1.4 29.124,1.4 l -4e-4,27.2 c -9.9854,0 -19.971,0 -29.124,-0.7 -3.329,-0.7 -5.825,-5.7 -5.825,-8.6\" />\r\n </g>\r\n <g\r\n id=\"g12992\"\r\n transform=\"matrix(1.086,-0.29991,0.32987,0.98737,-338.77,13.655)\">\r\n <path\r\n id=\"path12994\"\r\n fill=\"#f7c608\"\r\n d=\"m 44.747,1486.1 v 6 c 0,4 -3.002,7 -7.004,8 -10.005,0 -23.011,1 -35.017,1 l -3e-4,-38 c 13.006,0 26.013,-1 35.017,-2 4.002,0 7.004,3 7.004,7 v 5 m -84.042,1 v -6 c 0,-4 3.001,-7 7.003,-7 10.005,1 22.011,2 35.018,2 l -3e-4,38 c -12.006,0 -24.012,0 -35.018,-1 -4.002,-1 -7.003,-8 -7.003,-12\" />\r\n <path\r\n id=\"path12996\"\r\n fill=\"#006233\"\r\n d=\"m 37.554,1484.9 v 4.3 c 0,2.9 -2.497,5 -5.825,5.7 -8.321,0 -19.139,0.7 -29.124,0.7 l -4e-4,-27.2 c 10.817,0 21.635,-0.7 29.124,-1.4 3.328,0 5.825,2.1 5.825,5 v 3.6 m -69.898,0.7 v -4.3 c 0,-2.9 2.496,-5 5.825,-5 8.321,0.7 18.306,1.4 29.124,1.4 l -4e-4,27.2 c -9.9854,0 -19.971,0 -29.124,-0.7 -3.329,-0.7 -5.825,-5.7 -5.825,-8.6\" />\r\n </g>\r\n <g\r\n id=\"g12998\"\r\n transform=\"matrix(1.1349,-0.0096543,0.010618,1.0319,-17.033,-32.001)\">\r\n <path\r\n id=\"path13000\"\r\n fill=\"#f7c608\"\r\n d=\"m 44.747,1486.1 v 6 c 0,4 -3.002,7 -7.004,8 -10.005,0 -23.011,1 -35.017,1 l -3e-4,-38 c 13.006,0 26.013,-1 35.017,-2 4.002,0 7.004,3 7.004,7 v 5 m -84.042,1 v -6 c 0,-4 3.001,-7 7.003,-7 10.005,1 22.011,2 35.018,2 l -3e-4,38 c -12.006,0 -24.012,0 -35.018,-1 -4.002,-1 -7.003,-8 -7.003,-12\" />\r\n <path\r\n id=\"path13002\"\r\n fill=\"#006233\"\r\n d=\"m 37.554,1484.9 v 4.3 c 0,2.9 -2.497,5 -5.825,5.7 -8.321,0 -19.139,0.7 -29.124,0.7 l -4e-4,-27.2 c 10.817,0 21.635,-0.7 29.124,-1.4 3.328,0 5.825,2.1 5.825,5 v 3.6 m -69.898,0.7 v -4.3 c 0,-2.9 2.496,-5 5.825,-5 8.321,0.7 18.306,1.4 29.124,1.4 l -4e-4,27.2 c -9.9854,0 -19.971,0 -29.124,-0.7 -3.329,-0.7 -5.825,-5.7 -5.825,-8.6\" />\r\n </g>\r\n </g>\r\n</svg>";
var ko$1 = "<svg xmlns=\"http://www.w3.org/2000/svg\" id=\"flag-icon-css-kr\" viewBox=\"0 0 640 480\">\n <defs>\n <clipPath id=\"kr-a\">\n <path fill-opacity=\".7\" d=\"M-95.8-.4h682.7v512H-95.8z\"/>\n </clipPath>\n </defs>\n <g fill-rule=\"evenodd\" clip-path=\"url(#kr-a)\" transform=\"translate(89.8 .4) scale(.9375)\">\n <path fill=\"#fff\" d=\"M610.6 511.6h-730.2V-.4h730.2z\"/>\n <path fill=\"#fff\" d=\"M251.9 256a112.5 112.5 0 11-225 0 112.5 112.5 0 01225 0z\"/>\n <path fill=\"#c70000\" d=\"M393 262.6c0 81-65 146.8-145.3 146.8s-145.2-65.8-145.2-146.8 65-146.9 145.3-146.9S393 181.6 393 262.6z\"/>\n <path d=\"M-49.4 126.4l83.6-96.7 19.9 17.1-83.7 96.8zm27.4 23.7l83.6-96.7 19.9 17-83.7 96.9z\"/>\n <path d=\"M-49.4 126.4l83.6-96.7 19.9 17.1-83.7 96.8z\"/>\n <path d=\"M-49.4 126.4l83.6-96.7 19.9 17.1-83.7 96.8zm55.4 48l83.6-96.9 19.9 17.2-83.7 96.8z\"/>\n <path d=\"M-49.4 126.4l83.6-96.7 19.9 17.1-83.7 96.8z\"/>\n <path d=\"M-49.4 126.4l83.6-96.7 19.9 17.1-83.7 96.8zm508.8-96.8l83 97.4-20 17-83-97.4zm-55.7 47.5l83 97.4-20 17-83-97.4z\"/>\n <path fill=\"#fff\" d=\"M417.6 133.2L496 65.4l14.7 17-84 75.4-9.3-24.6z\"/>\n <path d=\"M514.2 372l-80.4 95.8-19.7-16.4 80.4-95.8zM431.8 53.1l83 97.4-19.9 17L412 70zm109.7 341.6L461 490.5l-19.8-16.4 80.5-95.8zm-55.1-45.8L406 444.7l-19.7-16.4 80.4-95.8z\"/>\n <path fill=\"#3d5897\" d=\"M104.6 236.7c4.6 37 11.3 78.2 68.2 82.4 21.3 1.3 62.8-5 77-63.2 18.8-55.8 75-71.8 113.3-41.6C385 228.5 391 251 392.4 268c-1.7 54-32.9 101-72.8 122-46 27.3-109.6 27.9-165.3-13.5-25.1-23.5-60.2-67-49.7-139.8z\"/>\n <path fill=\"#fff\" d=\"M436 370.6l78.6 67.6-14.6 17-87.1-71.8 23-12.8z\"/>\n <path d=\"M-1.9 357.2l83 97.3-20 17-83-97.3z\"/>\n <path fill=\"#fff\" d=\"M-16.2 437.3l78.6-67.9 14.7 17-84 75.5-9.3-24.7z\"/>\n <path d=\"M25.7 333.7l83 97.3-20 17-83-97.3zM-30 381.2l83 97.3-20 17-83-97.3z\"/>\n </g>\n</svg>";
var ph$1 = "<svg xmlns=\"http://www.w3.org/2000/svg\" id=\"flag-icon-css-ph\" viewBox=\"0 0 640 480\">\n <path fill=\"#0038a8\" d=\"M0 0h640v240H0z\"/>\n <path fill=\"#ce1126\" d=\"M0 240h640v240H0z\"/>\n <path fill=\"#fff\" d=\"M415.7 240L0 480V0\"/>\n <g fill=\"#fcd116\">\n <path stroke-width=\"1pt\" d=\"M26.7 42.4L41 55l16.6-9.2-7.4 17.5 14 13-19-1.6-8.1 17.2-4.3-18.5L14 71l16.3-10zm323.8 172.3l.4 19 18 6.3-18 6.2-.4 19-11.5-15.1-18.2 5.5 10.8-15.6-10.8-15.6 18.2 5.5zM37.2 388.1l8 17.2 19-1.6-13.9 13 7.4 17.5-16.6-9.1-14.4 12.4 3.6-18.7L14 409l18.9-2.4z\"/>\n <path stroke-width=\"5.3\" d=\"M151.4 139.1l-6.2 6.2 3.1 47-3 .3-5.7-42.9-5.1 5 7.6 38.4a47.5 47.5 0 00-17.2 7.1l-21.7-32.4H96l26.4 34.3a48 48 0 00-2.4 2l-31.1-35.5h-8.8v8.8l35.4 31-2 2.5-34.3-26.3v7.1l32.5 21.7c-3.4 5.2-5.9 11-7.1 17.2L66.3 223l-5.1 5 42.9 5.7c-.2 1-.3 2.1-.3 3.1l-47-3-6.2 6.2 6.2 6.2 47-3.1.3 3.1-42.9 5.7 5 5 38.4-7.6a47.5 47.5 0 007.1 17.2l-32.5 21.7v7.2l34.3-26.3a48 48 0 002 2.4l-35.4 31v8.8H89l31-35.4 2.5 2L96 312.2h7.2l21.7-32.5c5.1 3.4 11 5.9 17.2 7.1l-7.6 38.4 5 5 5.7-42.9c1 .2 2 .3 3.1.3l-3 47 6.1 6.2 6.3-6.2-3.1-47 3-.3 5.7 43 5.1-5.1-7.6-38.4a47.5 47.5 0 0017.2-7.1l21.7 32.5h7.2l-26.4-34.3a48 48 0 002.4-2l31.1 35.4h8.8v-8.8l-35.4-31 2-2.4 34.3 26.3v-7.2l-32.5-21.7c3.4-5.1 5.9-11 7.1-17.2l38.3 7.6 5.1-5-42.9-5.7c.2-1 .3-2 .3-3.1l47 3 6.2-6.1-6.2-6.2-47 3-.3-3 42.9-5.7-5-5-38.4 7.5a47.5 47.5 0 00-7.1-17.2l32.5-21.7v-7.1l-34.3 26.3a48 48 0 00-2-2.4l35.4-31v-8.9H214l-31 35.5a48 48 0 00-2.5-2l26.4-34.3h-7.2L178 200.2c-5.1-3.4-11-5.9-17.2-7.1l7.6-38.3-5-5-5.7 42.8-3.1-.3 3-47z\"/>\n </g>\n</svg>";
var tw = "<svg xmlns=\"http://www.w3.org/2000/svg\" id=\"flag-icon-css-tw\" viewBox=\"0 0 640 480\">\n <defs>\n <clipPath id=\"tw-a\">\n <path fill-opacity=\".7\" d=\"M0 0h682.7v512H0z\"/>\n </clipPath>\n </defs>\n <g fill-rule=\"evenodd\" stroke-width=\"1pt\" clip-path=\"url(#tw-a)\" transform=\"scale(.9375)\">\n <path fill=\"#fe0000\" d=\"M0 0h768v512H0z\"/>\n <path fill=\"#000095\" d=\"M0 0h385.7v256H0z\"/>\n <path fill=\"#fff\" d=\"M282.1 178.6l-47.3-9.8 10 47.3-36-32.1-15 46-15.2-45.9-36 32.4 9.8-47.4-47.2 10.1 32-36.1-46-15 46-15.2-32.4-35.8 47.3 9.7-10-47.3 36 32.1 15-46 15.2 45.9 35.9-32.4-9.7 47.4 47.2-10.1-32 36.1 45.9 15-45.9 15.2z\"/>\n <path fill=\"#000095\" d=\"M238.5 175l-15 7.9-14.5 8.6-17-.6-16.9.2-14.3-9L146 174l-8-15-8.6-14.5.6-16.8-.2-17 9-14.2 8.3-14.8 14.9-7.9 14.6-8.6 16.9.6 17-.2 14.3 9 14.7 8.2 8 14.9 8.6 14.5-.6 16.9.2 16.9-9 14.3z\"/>\n <path fill=\"#fff\" d=\"M244.6 128.3a51.9 51.9 0 11-103.7 0 51.9 51.9 0 01103.7 0z\"/>\n </g>\n</svg>";
var pl$1 = "<svg xmlns=\"http://www.w3.org/2000/svg\" id=\"flag-icon-css-pl\" viewBox=\"0 0 640 480\">\n <g fill-rule=\"evenodd\">\n <path fill=\"#fff\" d=\"M640 480H0V0h640z\"/>\n <path fill=\"#dc143c\" d=\"M640 480H0V240h640z\"/>\n </g>\n</svg>";
const flags$1 = {
it: it$1,
en: gb,
es: es$1,
de: de$1,
fr: fr$1,
id: id$1,
pt: pt$1,
pt_br: br,
ru: ru$1,
tr: tr$1,
vn: vn$1,
hr: hr$1,
ar: ar$1,
ko: ko$1,
ph: ph$1,
zh_tw: tw,
pl: pl$1
};
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
var script$r = {
props: {
withArrow: {
type: Boolean,
default: true
}
}
};
/* script */
const __vue_script__$r = script$r;
/* template */
var __vue_render__$t = function (_h,_vm) {var _c=_vm._c;return _c('details',{class:[_vm.data.staticClass, { 'with-arrow': _vm.props.withArrow }]},[_c('summary',{staticClass:"cursor-pointer"},[_vm._t("title",[_vm._v("Setting")])],2),_vm._v(" "),_c('div',{staticClass:"my-5 space-y-5"},[_vm._t("default")],2)])};
var __vue_staticRenderFns__$t = [];
/* style */
const __vue_inject_styles__$t = function (inject) {
if (!inject) return
inject("data-v-08721366_0", { source: "details>summary::-webkit-details-marker{display:none}details.with-arrow>summary::-webkit-details-marker{display:initial;vertical-align:super}", map: undefined, media: undefined });
};
/* scoped */
const __vue_scope_id__$t = undefined;
/* module identifier */
const __vue_module_identifier__$d = undefined;
/* functional template */
const __vue_is_functional_template__$t = true;
/* component normalizer */
function __vue_normalize__$t(
template, style, script,
scope, functional, moduleIdentifier,
createInjector, createInjectorSSR
) {
const component = (typeof script === 'function' ? script.options : script) || {};
// For security concerns, we use only base name in production mode.
component.__file = "BaseAccordion.vue";
if (!component.render) {
component.render = template.render;
component.staticRenderFns = template.staticRenderFns;
component._compiled = true;
if (functional) component.functional = true;
}
component._scopeId = scope;
{
let hook;
if (style) {
hook = function(context) {
style.call(this, createInjector(context));
};
}
if (hook !== undefined) {
if (component.functional) {
// register for functional component in vue file
const originalRender = component.render;
component.render = function renderWithStyleInjection(h, context) {
hook.call(context);
return originalRender(h, context)
};
} else {
// inject component registration as beforeCreate hook
const existing = component.beforeCreate;
component.beforeCreate = existing ? [].concat(existing, hook) : [hook];
}
}
}
return component
}
/* style inject */
function __vue_create_injector__$d() {
const head = document.head || document.getElementsByTagName('head')[0];
const styles = __vue_create_injector__$d.styles || (__vue_create_injector__$d.styles = {});
const isOldIE =
typeof navigator !== 'undefined' &&
/msie [6-9]\\b/.test(navigator.userAgent.toLowerCase());
return function addStyle(id, css) {
if (document.querySelector('style[data-vue-ssr-id~="' + id + '"]')) return // SSR styles are present.
const group = isOldIE ? css.media || 'default' : id;
const style = styles[group] || (styles[group] = { ids: [], parts: [], element: undefined });
if (!style.ids.includes(id)) {
let code = css.source;
let index = style.ids.length;
style.ids.push(id);
if ( css.map) {
// https://developer.chrome.com/devtools/docs/javascript-debugging
// this makes source maps inside style tags work properly in Chrome
code += '\n/*# sourceURL=' + css.map.sources[0] + ' */';
// http://stackoverflow.com/a/26603875
code +=
'\n/*# sourceMappingURL=data:application/json;base64,' +
btoa(unescape(encodeURIComponent(JSON.stringify(css.map)))) +
' */';
}
if (isOldIE) {
style.element = style.element || document.querySelector('style[data-group=' + group + ']');
}
if (!style.element) {
const el = style.element = document.createElement('style');
el.type = 'text/css';
if (css.media) el.setAttribute('media', css.media);
if (isOldIE) {
el.setAttribute('data-group', group);
el.setAttribute('data-next-index', '0');
}
head.appendChild(el);
}
if (isOldIE) {
index = parseInt(style.element.getAttribute('data-next-index'));
style.element.setAttribute('data-next-index', index + 1);
}
if (style.element.styleSheet) {
style.parts.push(code);
style.element.styleSheet.cssText = style.parts
.filter(Boolean)
.join('\n');
} else {
const textNode = document.createTextNode(code);
const nodes = style.element.childNodes;
if (nodes[index]) style.element.removeChild(nodes[index]);
if (nodes.length) style.element.insertBefore(textNode, nodes[index]);
else style.element.appendChild(textNode);
}
}
}
}
/* style inject SSR */
var BaseAccordion = __vue_normalize__$t(
{ render: __vue_render__$t, staticRenderFns: __vue_staticRenderFns__$t },
__vue_inject_styles__$t,
__vue_script__$r,
__vue_scope_id__$t,
__vue_is_functional_template__$t,
__vue_module_identifier__$d,
__vue_create_injector__$d);
//
var script$s = {
components: {
BaseAccordion
},
data() {
return {
flags: flags$1,
currentLocale: this.$i18n.locale,
locales: this.$i18n.availableLocales,
settings: {
tags: {}
},
lastSettings: {},
spotifyFeatures: {},
lastCredentials: {},
defaultSettings: {},
lastUser: '',
spotifyUser: '',
slimDownloads: false,
slimSidebar: false,
previewVolume: window.vol,
accountNum: 0,
accounts: []
}
},
computed: {
...mapGetters({
arl: 'getARL',
user: 'getUser',
isLoggedIn: 'isLoggedIn',
clientMode: 'getClientMode'
}),
needToWait() {
return Object.keys(this.getSettings).length === 0
},
changeSlimDownloads: {
get() {
return this.slimDownloads
},
set(wantSlimDownloads) {
this.slimDownloads = wantSlimDownloads;
document.getElementById('download_list').classList.toggle('slim', wantSlimDownloads);
localStorage.setItem('slimDownloads', wantSlimDownloads);
}
},
changeSlimSidebar: {
get() {
return this.slimSidebar
},
set(wantSlimSidebar) {
this.slimSidebar = wantSlimSidebar;
document.getElementById('sidebar').classList.toggle('slim', wantSlimSidebar);
// Moves all toast messages when the option changes
Array.from(document.getElementsByClassName('toastify')).forEach(toast => {
toast.style.transform = `translate(${wantSlimSidebar ? '3rem' : '14rem'}, 0)`;
});
localStorage.setItem('slimSidebar', wantSlimSidebar);
}
},
pictureHref() {
// Default image: https://e-cdns-images.dzcdn.net/images/user/125x125-000000-80-0-0.jpg
return `https://e-cdns-images.dzcdn.net/images/user/${this.user.picture}/125x125-000000-80-0-0.jpg`
}
},
async mounted() {
const { settingsData, defaultSettingsData, spotifyCredentials } = await getSettingsData();
this.defaultSettings = defaultSettingsData;
this.initSettings(settingsData, spotifyCredentials);
let storedAccountNum = localStorage.getItem('accountNum');
if (storedAccountNum) {
this.accountNum = storedAccountNum;
}
let spotifyUser = localStorage.getItem('spotifyUser');
if (spotifyUser) {
this.lastUser = spotifyUser;
this.spotifyUser = spotifyUser;
socket.emit('update_userSpotifyPlaylists', spotifyUser);
}
this.changeSlimDownloads = 'true' === localStorage.getItem('slimDownloads');
this.changeSlimSidebar = 'true' === localStorage.getItem('slimSidebar');
let volume = parseInt(localStorage.getItem('previewVolume'));
if (isNaN(volume)) {
volume = 80;
localStorage.setItem('previewVolume', volume);
}
window.vol.preview_max_volume = volume;
socket.on('updateSettings', this.updateSettings);
socket.on('accountChanged', this.accountChanged);
socket.on('familyAccounts', this.initAccounts);
socket.on('downloadFolderSelected', this.downloadFolderSelected);
socket.on('applogin_arl', this.loggedInViaDeezer);
this.$on('hook:destroyed', () => {
socket.off('updateSettings');
socket.off('accountChanged');
socket.off('familyAccounts');
socket.off('downloadFolderSelected');
socket.off('applogin_arl');
});
},
methods: {
...mapActions({
dispatchARL: 'setARL'
}),
revertSettings() {
this.settings = JSON.parse(JSON.stringify(this.lastSettings));
},
revertCredentials() {
this.spotifyCredentials = JSON.parse(JSON.stringify(this.lastCredentials));
this.spotifyUser = (' ' + this.lastUser).slice(1);
},
copyARLtoClipboard() {
let copyText = this.$refs.loginInput;
copyText.setAttribute('type', 'text');
copyText.select();
copyText.setSelectionRange(0, 99999);
document.execCommand('copy');
copyText.setAttribute('type', 'password');
toast(this.$t('settings.toasts.ARLcopied'), 'assignment');
},
changeLocale(newLocale) {
this.$i18n.locale = newLocale;
this.currentLocale = newLocale;
localStorage.setItem('locale', newLocale);
},
updateMaxVolume() {
localStorage.setItem('previewVolume', this.previewVolume.preview_max_volume);
},
saveSettings() {
this.lastSettings = JSON.parse(JSON.stringify(this.settings));
this.lastCredentials = JSON.parse(JSON.stringify(this.spotifyFeatures));
let changed = false;
if (this.lastUser != this.spotifyUser) {
// force cloning without linking
this.lastUser = (' ' + this.spotifyUser).slice(1);
localStorage.setItem('spotifyUser', this.lastUser);
changed = true;
}
socket.emit('saveSettings', this.lastSettings, this.lastCredentials, changed ? this.lastUser : false);
},
selectDownloadFolder() {
socket.emit('selectDownloadFolder');
},
downloadFolderSelected(folder) {
this.$set(this.settings, 'downloadLocation', folder);
},
loadSettings(data) {
this.lastSettings = JSON.parse(JSON.stringify(data));
this.settings = JSON.parse(JSON.stringify(data));
},
loadCredentials(credentials) {
this.lastCredentials = JSON.parse(JSON.stringify(credentials));
this.spotifyFeatures = JSON.parse(JSON.stringify(credentials));
},
loggedInViaDeezer(arl) {
this.dispatchARL({ arl });
socket.emit('login', arl, true, this.accountNum);
// this.login()
},
login() {
let newArl = this.$refs.loginInput.value.trim();
if (newArl && newArl !== this.arl) {
socket.emit('login', newArl, true, this.accountNum);
}
},
appLogin(e) {
socket.emit('applogin');
},
changeAccount() {
socket.emit('changeAccount', this.accountNum);
},
accountChanged(user, accountNum) {
this.$refs.username.innerText = user.name;
this.$refs.userpicture.src = `https://e-cdns-images.dzcdn.net/images/user/${user.picture}/125x125-000000-80-0-0.jpg`;
this.accountNum = accountNum;
localStorage.setItem('accountNum', this.accountNum);
},
initAccounts(accounts) {
this.accounts = accounts;
},
logout() {
socket.emit('logout');
},
initSettings(settings, credentials) {
// this.loadDefaultSettings()
this.loadSettings(settings);
this.loadCredentials(credentials);
toast(this.$t('settings.toasts.init'), 'settings');
},
updateSettings(newSettings, newCredentials) {
this.loadSettings(newSettings);
this.loadCredentials(newCredentials);
toast(this.$t('settings.toasts.update'), 'settings');
},
resetSettings() {
this.settings = JSON.parse(JSON.stringify(this.defaultSettings));
}
}
};
/* script */
const __vue_script__$s = script$s;
/* template */
var __vue_render__$u = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:"fixed-footer"},[_c('h1',{staticClass:"mb-8 text-5xl"},[_vm._v(_vm._s(_vm.$t('settings.title')))]),_vm._v(" "),(_vm.isLoggedIn)?_c('div',{ref:"loggedInInfo",attrs:{"id":"logged_in_info"}},[_c('img',{ref:"userpicture",staticClass:"w-32 h-32 rounded-full",attrs:{"id":"settings_picture","src":_vm.pictureHref,"alt":"Profile Picture"}}),_vm._v(" "),_c('i18n',{attrs:{"path":"settings.login.loggedIn","tag":"p"}},[_c('strong',{ref:"username",attrs:{"place":"username","id":"settings_username"}},[_vm._v(_vm._s(_vm.user.name || 'not logged'))])]),_vm._v(" "),_c('button',{staticClass:"btn btn-primary",on:{"click":_vm.logout}},[_vm._v("\n\t\t\t"+_vm._s(_vm.$t('settings.login.logout'))+"\n\t\t")]),_vm._v(" "),(_vm.accounts.length)?_c('select',{directives:[{name:"model",rawName:"v-model",value:(_vm.accountNum),expression:"accountNum"}],attrs:{"id":"family_account"},on:{"change":[function($event){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 val}); _vm.accountNum=$event.target.multiple ? $$selectedVal : $$selectedVal[0];},_vm.changeAccount]}},_vm._l((_vm.accounts),function(account,i){return _c('option',{key:account,domProps:{"value":i.toString()}},[_vm._v("\n\t\t\t\t"+_vm._s(account.BLOG_NAME)+"\n\t\t\t")])}),0):_vm._e()],1):_vm._e(),_vm._v(" "),_c('div',{staticClass:"settings-group"},[_c('h3',{staticClass:"settings-group__header"},[_c('i',{staticClass:"material-icons"},[_vm._v("person")]),_vm._v(_vm._s(_vm.$t('settings.login.title')))]),_vm._v(" "),_c('div',{staticClass:"my-5 space-y-5"},[_c('div',{staticClass:"flex items-center"},[_c('input',{ref:"loginInput",attrs:{"autocomplete":"off","type":"password","id":"login_input_arl","placeholder":"ARL"},domProps:{"value":_vm.arl}}),_vm._v(" "),_c('button',{staticClass:"ml-2 btn btn-primary btn-only-icon",on:{"click":_vm.copyARLtoClipboard}},[_c('i',{staticClass:"material-icons"},[_vm._v("assignment")])])]),_vm._v(" "),_c('RouterLink',{attrs:{"to":{ name: 'ARL' }}},[_vm._v("\n\t\t\t\t"+_vm._s(_vm.$t('settings.login.arl.question'))+"\n\t\t\t")]),_vm._v(" "),(_vm.clientMode)?_c('a',{attrs:{"href":"#"},on:{"click":_vm.appLogin}},[_vm._v("\n\t\t\t\t"+_vm._s(_vm.$t('settings.login.login'))+"\n\t\t\t")]):_vm._e(),_vm._v(" "),_c('button',{staticClass:"btn btn-primary",staticStyle:{"width":"100%"},on:{"click":_vm.login}},[_vm._v("\n\t\t\t\t"+_vm._s(_vm.$t('settings.login.arl.update'))+"\n\t\t\t")])],1)]),_vm._v(" "),_c('div',{staticClass:"settings-group"},[_c('h3',{staticClass:"settings-group__header"},[_c('i',{staticClass:"material-icons"},[_vm._v("language")]),_vm._v(_vm._s(_vm.$t('settings.languages')))]),_vm._v(" "),_c('div',{staticClass:"my-5"},_vm._l((_vm.locales),function(locale){return _c('span',{key:locale,staticClass:"inline-flex items-center locale-flag",class:{ 'locale-flag--current': _vm.currentLocale === locale },attrs:{"title":locale},domProps:{"innerHTML":_vm._s(_vm.flags[locale])},on:{"click":function($event){return _vm.changeLocale(locale)}}})}),0)]),_vm._v(" "),_c('BaseAccordion',{staticClass:"settings-group",scopedSlots:_vm._u([{key:"title",fn:function(){return [_c('h3',{staticClass:"settings-group__header"},[_c('i',{staticClass:"material-icons"},[_vm._v("web")]),_vm._v("\n\t\t\t\t"+_vm._s(_vm.$t('settings.appearance.title'))+"\n\t\t\t")])]},proxy:true}])},[_vm._v(" "),_c('label',{staticClass:"with-checkbox"},[_c('input',{directives:[{name:"model",rawName:"v-model",value:(_vm.changeSlimDownloads),expression:"changeSlimDownloads"}],attrs:{"type":"checkbox"},domProps:{"checked":Array.isArray(_vm.changeSlimDownloads)?_vm._i(_vm.changeSlimDownloads,null)>-1:(_vm.changeSlimDownloads)},on:{"change":function($event){var $$a=_vm.changeSlimDownloads,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.changeSlimDownloads=$$a.concat([$$v]));}else {$$i>-1&&(_vm.changeSlimDownloads=$$a.slice(0,$$i).concat($$a.slice($$i+1)));}}else {_vm.changeSlimDownloads=$$c;}}}}),_vm._v(" "),_c('span',{staticClass:"checkbox-text"},[_vm._v(_vm._s(_vm.$t('settings.appearance.slimDownloadTab')))])]),_vm._v(" "),_c('label',{staticClass:"mb-4 with-checkbox"},[_c('input',{directives:[{name:"model",rawName:"v-model",value:(_vm.changeSlimSidebar),expression:"changeSlimSidebar"}],attrs:{"type":"checkbox"},domProps:{"checked":Array.isArray(_vm.changeSlimSidebar)?_vm._i(_vm.changeSlimSidebar,null)>-1:(_vm.changeSlimSidebar)},on:{"change":function($event){var $$a=_vm.changeSlimSidebar,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.changeSlimSidebar=$$a.concat([$$v]));}else {$$i>-1&&(_vm.changeSlimSidebar=$$a.slice(0,$$i).concat($$a.slice($$i+1)));}}else {_vm.changeSlimSidebar=$$c;}}}}),_vm._v(" "),_c('span',{staticClass:"checkbox-text"},[_vm._v(_vm._s(_vm.$t('settings.appearance.slimSidebar')))])])]),_vm._v(" "),_c('BaseAccordion',{staticClass:"settings-group",scopedSlots:_vm._u([{key:"title",fn:function(){return [_c('h3',{staticClass:"settings-group__header"},[_c('i',{staticClass:"material-icons"},[_vm._v("folder")]),_vm._v(_vm._s(_vm.$t('settings.downloadPath.title'))+"\n\t\t\t")])]},proxy:true}])},[_vm._v(" "),_c('div',{staticClass:"flex items-center"},[_c('input',{directives:[{name:"model",rawName:"v-model",value:(_vm.settings.downloadLocation),expression:"settings.downloadLocation"}],attrs:{"autocomplete":"off","type":"text"},domProps:{"value":(_vm.settings.downloadLocation)},on:{"input":function($event){if($event.target.composing){ return; }_vm.$set(_vm.settings, "downloadLocation", $event.target.value);}}}),_vm._v(" "),(_vm.clientMode)?_c('button',{staticClass:"ml-2 btn btn-primary btn-only-icon",on:{"click":_vm.selectDownloadFolder}},[_c('i',{staticClass:"material-icons"},[_vm._v("folder")])]):_vm._e()])]),_vm._v(" "),_c('BaseAccordion',{staticClass:"settings-group",scopedSlots:_vm._u([{key:"title",fn:function(){return [_c('h3',{staticClass:"settings-group__header"},[_c('i',{staticClass:"material-icons"},[_vm._v("font_download")]),_vm._v(_vm._s(_vm.$t('settings.templates.title'))+"\n\t\t\t")])]},proxy:true}])},[_vm._v(" "),_c('p',[_vm._v(_vm._s(_vm.$t('settings.templates.tracknameTemplate')))]),_vm._v(" "),_c('input',{directives:[{name:"model",rawName:"v-model",value:(_vm.settings.tracknameTemplate),expression:"settings.tracknameTemplate"}],attrs:{"type":"text"},domProps:{"value":(_vm.settings.tracknameTemplate)},on:{"input":function($event){if($event.target.composing){ return; }_vm.$set(_vm.settings, "tracknameTemplate", $event.target.value);}}}),_vm._v(" "),_c('p',[_vm._v(_vm._s(_vm.$t('settings.templates.albumTracknameTemplate')))]),_vm._v(" "),_c('input',{directives:[{name:"model",rawName:"v-model",value:(_vm.settings.albumTracknameTemplate),expression:"settings.albumTracknameTemplate"}],attrs:{"type":"text"},domProps:{"value":(_vm.settings.albumTracknameTemplate)},on:{"input":function($event){if($event.target.composing){ return; }_vm.$set(_vm.settings, "albumTracknameTemplate", $event.target.value);}}}),_vm._v(" "),_c('p',[_vm._v(_vm._s(_vm.$t('settings.templates.playlistTracknameTemplate')))]),_vm._v(" "),_c('input',{directives:[{name:"model",rawName:"v-model",value:(_vm.settings.playlistTracknameTemplate),expression:"settings.playlistTracknameTemplate"}],attrs:{"type":"text"},domProps:{"value":(_vm.settings.playlistTracknameTemplate)},on:{"input":function($event){if($event.target.composing){ return; }_vm.$set(_vm.settings, "playlistTracknameTemplate", $event.target.value);}}})]),_vm._v(" "),_c('BaseAccordion',{staticClass:"settings-group",scopedSlots:_vm._u([{key:"title",fn:function(){return [_c('h3',{staticClass:"settings-group__header"},[_c('i',{staticClass:"material-icons"},[_vm._v("create_new_folder")]),_vm._v(_vm._s(_vm.$t('settings.folders.title'))+"\n\t\t\t")])]},proxy:true}])},[_vm._v(" "),_c('div',{staticClass:"settings-container"},[_c('div',{staticClass:"settings-container__third"},[_c('label',{staticClass:"with-checkbox"},[_c('input',{directives:[{name:"model",rawName:"v-model",value:(_vm.settings.createPlaylistFolder),expression:"settings.createPlaylistFolder"}],attrs:{"type":"checkbox"},domProps:{"checked":Array.isArray(_vm.settings.createPlaylistFolder)?_vm._i(_vm.settings.createPlaylistFolder,null)>-1:(_vm.settings.createPlaylistFolder)},on:{"change":function($event){var $$a=_vm.settings.createPlaylistFolder,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.$set(_vm.settings, "createPlaylistFolder", $$a.concat([$$v])));}else {$$i>-1&&(_vm.$set(_vm.settings, "createPlaylistFolder", $$a.slice(0,$$i).concat($$a.slice($$i+1))));}}else {_vm.$set(_vm.settings, "createPlaylistFolder", $$c);}}}}),_vm._v(" "),_c('span',{staticClass:"checkbox-text"},[_vm._v(_vm._s(_vm.$t('settings.folders.createPlaylistFolder')))])]),_vm._v(" "),(_vm.settings.createPlaylistFolder)?_c('div',{staticClass:"input-group"},[_c('p',{staticClass:"input-group-text"},[_vm._v(_vm._s(_vm.$t('settings.folders.playlistNameTemplate')))]),_vm._v(" "),_c('input',{directives:[{name:"model",rawName:"v-model",value:(_vm.settings.playlistNameTemplate),expression:"settings.playlistNameTemplate"}],attrs:{"type":"text"},domProps:{"value":(_vm.settings.playlistNameTemplate)},on:{"input":function($event){if($event.target.composing){ return; }_vm.$set(_vm.settings, "playlistNameTemplate", $event.target.value);}}})]):_vm._e()]),_vm._v(" "),_c('div',{staticClass:"settings-container__third"},[_c('label',{staticClass:"with-checkbox"},[_c('input',{directives:[{name:"model",rawName:"v-model",value:(_vm.settings.createArtistFolder),expression:"settings.createArtistFolder"}],attrs:{"type":"checkbox"},domProps:{"checked":Array.isArray(_vm.settings.createArtistFolder)?_vm._i(_vm.settings.createArtistFolder,null)>-1:(_vm.settings.createArtistFolder)},on:{"change":function($event){var $$a=_vm.settings.createArtistFolder,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.$set(_vm.settings, "createArtistFolder", $$a.concat([$$v])));}else {$$i>-1&&(_vm.$set(_vm.settings, "createArtistFolder", $$a.slice(0,$$i).concat($$a.slice($$i+1))));}}else {_vm.$set(_vm.settings, "createArtistFolder", $$c);}}}}),_vm._v(" "),_c('span',{staticClass:"checkbox-text"},[_vm._v(_vm._s(_vm.$t('settings.folders.createArtistFolder')))])]),_vm._v(" "),(_vm.settings.createArtistFolder)?_c('div',{staticClass:"input-group"},[_c('p',{staticClass:"input-group-text"},[_vm._v(_vm._s(_vm.$t('settings.folders.artistNameTemplate')))]),_vm._v(" "),_c('input',{directives:[{name:"model",rawName:"v-model",value:(_vm.settings.artistNameTemplate),expression:"settings.artistNameTemplate"}],attrs:{"type":"text"},domProps:{"value":(_vm.settings.artistNameTemplate)},on:{"input":function($event){if($event.target.composing){ return; }_vm.$set(_vm.settings, "artistNameTemplate", $event.target.value);}}})]):_vm._e()]),_vm._v(" "),_c('div',{staticClass:"settings-container__third"},[_c('label',{staticClass:"with-checkbox"},[_c('input',{directives:[{name:"model",rawName:"v-model",value:(_vm.settings.createAlbumFolder),expression:"settings.createAlbumFolder"}],attrs:{"type":"checkbox"},domProps:{"checked":Array.isArray(_vm.settings.createAlbumFolder)?_vm._i(_vm.settings.createAlbumFolder,null)>-1:(_vm.settings.createAlbumFolder)},on:{"change":function($event){var $$a=_vm.settings.createAlbumFolder,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.$set(_vm.settings, "createAlbumFolder", $$a.concat([$$v])));}else {$$i>-1&&(_vm.$set(_vm.settings, "createAlbumFolder", $$a.slice(0,$$i).concat($$a.slice($$i+1))));}}else {_vm.$set(_vm.settings, "createAlbumFolder", $$c);}}}}),_vm._v(" "),_c('span',{staticClass:"checkbox-text"},[_vm._v(_vm._s(_vm.$t('settings.folders.createAlbumFolder')))])]),_vm._v(" "),(_vm.settings.createAlbumFolder)?_c('div',{staticClass:"input-group"},[_c('p',{staticClass:"input-group-text"},[_vm._v(_vm._s(_vm.$t('settings.folders.albumNameTemplate')))]),_vm._v(" "),_c('input',{directives:[{name:"model",rawName:"v-model",value:(_vm.settings.albumNameTemplate),expression:"settings.albumNameTemplate"}],attrs:{"type":"text"},domProps:{"value":(_vm.settings.albumNameTemplate)},on:{"input":function($event){if($event.target.composing){ return; }_vm.$set(_vm.settings, "albumNameTemplate", $event.target.value);}}})]):_vm._e()])]),_vm._v(" "),_c('label',{staticClass:"with-checkbox"},[_c('input',{directives:[{name:"model",rawName:"v-model",value:(_vm.settings.createCDFolder),expression:"settings.createCDFolder"}],attrs:{"type":"checkbox"},domProps:{"checked":Array.isArray(_vm.settings.createCDFolder)?_vm._i(_vm.settings.createCDFolder,null)>-1:(_vm.settings.createCDFolder)},on:{"change":function($event){var $$a=_vm.settings.createCDFolder,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.$set(_vm.settings, "createCDFolder", $$a.concat([$$v])));}else {$$i>-1&&(_vm.$set(_vm.settings, "createCDFolder", $$a.slice(0,$$i).concat($$a.slice($$i+1))));}}else {_vm.$set(_vm.settings, "createCDFolder", $$c);}}}}),_vm._v(" "),_c('span',{staticClass:"checkbox-text"},[_vm._v(_vm._s(_vm.$t('settings.folders.createCDFolder')))])]),_vm._v(" "),_c('label',{staticClass:"with-checkbox"},[_c('input',{directives:[{name:"model",rawName:"v-model",value:(_vm.settings.createStructurePlaylist),expression:"settings.createStructurePlaylist"}],attrs:{"type":"checkbox"},domProps:{"checked":Array.isArray(_vm.settings.createStructurePlaylist)?_vm._i(_vm.settings.createStructurePlaylist,null)>-1:(_vm.settings.createStructurePlaylist)},on:{"change":function($event){var $$a=_vm.settings.createStructurePlaylist,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.$set(_vm.settings, "createStructurePlaylist", $$a.concat([$$v])));}else {$$i>-1&&(_vm.$set(_vm.settings, "createStructurePlaylist", $$a.slice(0,$$i).concat($$a.slice($$i+1))));}}else {_vm.$set(_vm.settings, "createStructurePlaylist", $$c);}}}}),_vm._v(" "),_c('span',{staticClass:"checkbox-text"},[_vm._v(_vm._s(_vm.$t('settings.folders.createStructurePlaylist')))])]),_vm._v(" "),_c('label',{staticClass:"with-checkbox"},[_c('input',{directives:[{name:"model",rawName:"v-model",value:(_vm.settings.createSingleFolder),expression:"settings.createSingleFolder"}],attrs:{"type":"checkbox"},domProps:{"checked":Array.isArray(_vm.settings.createSingleFolder)?_vm._i(_vm.settings.createSingleFolder,null)>-1:(_vm.settings.createSingleFolder)},on:{"change":function($event){var $$a=_vm.settings.createSingleFolder,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.$set(_vm.settings, "createSingleFolder", $$a.concat([$$v])));}else {$$i>-1&&(_vm.$set(_vm.settings, "createSingleFolder", $$a.slice(0,$$i).concat($$a.slice($$i+1))));}}else {_vm.$set(_vm.settings, "createSingleFolder", $$c);}}}}),_vm._v(" "),_c('span',{staticClass:"checkbox-text"},[_vm._v(_vm._s(_vm.$t('settings.folders.createSingleFolder')))])])]),_vm._v(" "),_c('BaseAccordion',{staticClass:"settings-group",scopedSlots:_vm._u([{key:"title",fn:function(){return [_c('h3',{staticClass:"settings-group__header"},[_c('i',{staticClass:"material-icons"},[_vm._v("title")]),_vm._v(_vm._s(_vm.$t('settings.trackTitles.title'))+"\n\t\t\t")])]},proxy:true}])},[_vm._v(" "),_c('div',{staticClass:"settings-container"},[_c('div',{staticClass:"settings-container__third settings-container__third--only-checkbox"},[_c('label',{staticClass:"with-checkbox"},[_c('input',{directives:[{name:"model",rawName:"v-model",value:(_vm.settings.padTracks),expression:"settings.padTracks"}],attrs:{"type":"checkbox"},domProps:{"checked":Array.isArray(_vm.settings.padTracks)?_vm._i(_vm.settings.padTracks,null)>-1:(_vm.settings.padTracks)},on:{"change":function($event){var $$a=_vm.settings.padTracks,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.$set(_vm.settings, "padTracks", $$a.concat([$$v])));}else {$$i>-1&&(_vm.$set(_vm.settings, "padTracks", $$a.slice(0,$$i).concat($$a.slice($$i+1))));}}else {_vm.$set(_vm.settings, "padTracks", $$c);}}}}),_vm._v(" "),_c('span',{staticClass:"checkbox-text"},[_vm._v(_vm._s(_vm.$t('settings.trackTitles.padTracks')))])])]),_vm._v(" "),_c('div',{staticClass:"settings-container__third"},[_c('div',{staticClass:"input-group"},[_c('p',{staticClass:"input-group-text"},[_vm._v(_vm._s(_vm.$t('settings.trackTitles.paddingSize')))]),_vm._v(" "),_c('input',{directives:[{name:"model",rawName:"v-model",value:(_vm.settings.paddingSize),expression:"settings.paddingSize"}],attrs:{"max":"10","type":"number"},domProps:{"value":(_vm.settings.paddingSize)},on:{"input":function($event){if($event.target.composing){ return; }_vm.$set(_vm.settings, "paddingSize", $event.target.value);}}})])]),_vm._v(" "),_c('div',{staticClass:"settings-container__third"},[_c('div',{staticClass:"input-group"},[_c('p',{staticClass:"input-group-text"},[_vm._v(_vm._s(_vm.$t('settings.trackTitles.illegalCharacterReplacer')))]),_vm._v(" "),_c('input',{directives:[{name:"model",rawName:"v-model",value:(_vm.settings.illegalCharacterReplacer),expression:"settings.illegalCharacterReplacer"}],attrs:{"type":"text"},domProps:{"value":(_vm.settings.illegalCharacterReplacer)},on:{"input":function($event){if($event.target.composing){ return; }_vm.$set(_vm.settings, "illegalCharacterReplacer", $event.target.value);}}})])])])]),_vm._v(" "),_c('BaseAccordion',{staticClass:"settings-group",scopedSlots:_vm._u([{key:"title",fn:function(){return [_c('h3',{staticClass:"settings-group__header"},[_c('i',{staticClass:"material-icons"},[_vm._v("album")]),_vm._v(_vm._s(_vm.$t('settings.covers.title')))])]},proxy:true}])},[_vm._v(" "),_c('label',{staticClass:"with-checkbox"},[_c('input',{directives:[{name:"model",rawName:"v-model",value:(_vm.settings.saveArtwork),expression:"settings.saveArtwork"}],attrs:{"type":"checkbox"},domProps:{"checked":Array.isArray(_vm.settings.saveArtwork)?_vm._i(_vm.settings.saveArtwork,null)>-1:(_vm.settings.saveArtwork)},on:{"change":function($event){var $$a=_vm.settings.saveArtwork,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.$set(_vm.settings, "saveArtwork", $$a.concat([$$v])));}else {$$i>-1&&(_vm.$set(_vm.settings, "saveArtwork", $$a.slice(0,$$i).concat($$a.slice($$i+1))));}}else {_vm.$set(_vm.settings, "saveArtwork", $$c);}}}}),_vm._v(" "),_c('span',{staticClass:"checkbox-text"},[_vm._v(_vm._s(_vm.$t('settings.covers.saveArtwork')))])]),_vm._v(" "),(_vm.settings.saveArtwork)?_c('div',{staticClass:"input-group"},[_c('p',{staticClass:"input-group-text"},[_vm._v(_vm._s(_vm.$t('settings.covers.coverImageTemplate')))]),_vm._v(" "),_c('input',{directives:[{name:"model",rawName:"v-model",value:(_vm.settings.coverImageTemplate),expression:"settings.coverImageTemplate"}],attrs:{"type":"text"},domProps:{"value":(_vm.settings.coverImageTemplate)},on:{"input":function($event){if($event.target.composing){ return; }_vm.$set(_vm.settings, "coverImageTemplate", $event.target.value);}}})]):_vm._e(),_vm._v(" "),_c('label',{staticClass:"with-checkbox"},[_c('input',{directives:[{name:"model",rawName:"v-model",value:(_vm.settings.saveArtworkArtist),expression:"settings.saveArtworkArtist"}],attrs:{"type":"checkbox"},domProps:{"checked":Array.isArray(_vm.settings.saveArtworkArtist)?_vm._i(_vm.settings.saveArtworkArtist,null)>-1:(_vm.settings.saveArtworkArtist)},on:{"change":function($event){var $$a=_vm.settings.saveArtworkArtist,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.$set(_vm.settings, "saveArtworkArtist", $$a.concat([$$v])));}else {$$i>-1&&(_vm.$set(_vm.settings, "saveArtworkArtist", $$a.slice(0,$$i).concat($$a.slice($$i+1))));}}else {_vm.$set(_vm.settings, "saveArtworkArtist", $$c);}}}}),_vm._v(" "),_c('span',{staticClass:"checkbox-text"},[_vm._v(_vm._s(_vm.$t('settings.covers.saveArtworkArtist')))])]),_vm._v(" "),(_vm.settings.saveArtworkArtist)?_c('div',{staticClass:"input-group"},[_c('p',{staticClass:"input-group-text"},[_vm._v(_vm._s(_vm.$t('settings.covers.artistImageTemplate')))]),_vm._v(" "),_c('input',{directives:[{name:"model",rawName:"v-model",value:(_vm.settings.artistImageTemplate),expression:"settings.artistImageTemplate"}],attrs:{"type":"text"},domProps:{"value":(_vm.settings.artistImageTemplate)},on:{"input":function($event){if($event.target.composing){ return; }_vm.$set(_vm.settings, "artistImageTemplate", $event.target.value);}}})]):_vm._e(),_vm._v(" "),_c('div',{staticClass:"input-group"},[_c('p',{staticClass:"input-group-text"},[_vm._v(_vm._s(_vm.$t('settings.covers.localArtworkSize')))]),_vm._v(" "),_c('input',{directives:[{name:"model",rawName:"v-model.number",value:(_vm.settings.localArtworkSize),expression:"settings.localArtworkSize",modifiers:{"number":true}}],attrs:{"type":"number","min":"100","max":"10000","step":"100"},domProps:{"value":(_vm.settings.localArtworkSize)},on:{"input":function($event){if($event.target.composing){ return; }_vm.$set(_vm.settings, "localArtworkSize", _vm._n($event.target.value));},"blur":function($event){return _vm.$forceUpdate()}}}),_vm._v(" "),(_vm.settings.localArtworkSize > 1200)?_c('p',{staticClass:"input-group-text",staticStyle:{"opacity":"0.75","color":"#ffcc22"}},[_vm._v("\n\t\t\t\t⚠ "+_vm._s(_vm.$t('settings.covers.imageSizeWarning'))+"\n\t\t\t")]):_vm._e()]),_vm._v(" "),_c('div',{staticClass:"input-group"},[_c('p',{staticClass:"input-group-text"},[_vm._v(_vm._s(_vm.$t('settings.covers.embeddedArtworkSize')))]),_vm._v(" "),_c('input',{directives:[{name:"model",rawName:"v-model.number",value:(_vm.settings.embeddedArtworkSize),expression:"settings.embeddedArtworkSize",modifiers:{"number":true}}],attrs:{"type":"number","min":"100","max":"10000","step":"100"},domProps:{"value":(_vm.settings.embeddedArtworkSize)},on:{"input":function($event){if($event.target.composing){ return; }_vm.$set(_vm.settings, "embeddedArtworkSize", _vm._n($event.target.value));},"blur":function($event){return _vm.$forceUpdate()}}}),_vm._v(" "),(_vm.settings.embeddedArtworkSize > 1200)?_c('p',{staticClass:"input-group-text",staticStyle:{"opacity":"0.75","color":"#ffcc22"}},[_vm._v("\n\t\t\t\t⚠ "+_vm._s(_vm.$t('settings.covers.imageSizeWarning'))+"\n\t\t\t")]):_vm._e()]),_vm._v(" "),_c('div',{staticClass:"input-group"},[_c('p',{staticClass:"input-group-text"},[_vm._v(_vm._s(_vm.$t('settings.covers.localArtworkFormat.title')))]),_vm._v(" "),_c('select',{directives:[{name:"model",rawName:"v-model",value:(_vm.settings.localArtworkFormat),expression:"settings.localArtworkFormat"}],on:{"change":function($event){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 val}); _vm.$set(_vm.settings, "localArtworkFormat", $event.target.multiple ? $$selectedVal : $$selectedVal[0]);}}},[_c('option',{attrs:{"value":"jpg"}},[_vm._v(_vm._s(_vm.$t('settings.covers.localArtworkFormat.jpg')))]),_vm._v(" "),_c('option',{attrs:{"value":"png"}},[_vm._v(_vm._s(_vm.$t('settings.covers.localArtworkFormat.png')))]),_vm._v(" "),_c('option',{attrs:{"value":"jpg,png"}},[_vm._v(_vm._s(_vm.$t('settings.covers.localArtworkFormat.both')))])])]),_vm._v(" "),_c('label',{staticClass:"with-checkbox"},[_c('input',{directives:[{name:"model",rawName:"v-model",value:(_vm.settings.embeddedArtworkPNG),expression:"settings.embeddedArtworkPNG"}],attrs:{"type":"checkbox"},domProps:{"checked":Array.isArray(_vm.settings.embeddedArtworkPNG)?_vm._i(_vm.settings.embeddedArtworkPNG,null)>-1:(_vm.settings.embeddedArtworkPNG)},on:{"change":function($event){var $$a=_vm.settings.embeddedArtworkPNG,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.$set(_vm.settings, "embeddedArtworkPNG", $$a.concat([$$v])));}else {$$i>-1&&(_vm.$set(_vm.settings, "embeddedArtworkPNG", $$a.slice(0,$$i).concat($$a.slice($$i+1))));}}else {_vm.$set(_vm.settings, "embeddedArtworkPNG", $$c);}}}}),_vm._v(" "),_c('span',{staticClass:"checkbox-text"},[_vm._v(_vm._s(_vm.$t('settings.covers.embeddedArtworkPNG')))])]),_vm._v(" "),(_vm.settings.embeddedArtworkPNG)?_c('p',{staticStyle:{"opacity":"0.75","color":"#ffcc22"}},[_vm._v("\n\t\t\t⚠ "+_vm._s(_vm.$t('settings.covers.embeddedPNGWarning'))+"\n\t\t")]):_vm._e(),_vm._v(" "),_c('label',{staticClass:"with-checkbox"},[_c('input',{directives:[{name:"model",rawName:"v-model",value:(_vm.settings.tags.coverDescriptionUTF8),expression:"settings.tags.coverDescriptionUTF8"}],attrs:{"type":"checkbox"},domProps:{"checked":Array.isArray(_vm.settings.tags.coverDescriptionUTF8)?_vm._i(_vm.settings.tags.coverDescriptionUTF8,null)>-1:(_vm.settings.tags.coverDescriptionUTF8)},on:{"change":function($event){var $$a=_vm.settings.tags.coverDescriptionUTF8,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.$set(_vm.settings.tags, "coverDescriptionUTF8", $$a.concat([$$v])));}else {$$i>-1&&(_vm.$set(_vm.settings.tags, "coverDescriptionUTF8", $$a.slice(0,$$i).concat($$a.slice($$i+1))));}}else {_vm.$set(_vm.settings.tags, "coverDescriptionUTF8", $$c);}}}}),_vm._v(" "),_c('span',{staticClass:"checkbox-text"},[_vm._v(_vm._s(_vm.$t('settings.covers.coverDescriptionUTF8')))])]),_vm._v(" "),_c('div',{staticClass:"input-group"},[_c('p',{staticClass:"input-group-text"},[_vm._v(_vm._s(_vm.$t('settings.covers.jpegImageQuality')))]),_vm._v(" "),_c('input',{directives:[{name:"model",rawName:"v-model.number",value:(_vm.settings.jpegImageQuality),expression:"settings.jpegImageQuality",modifiers:{"number":true}}],attrs:{"type":"number","min":"1","max":"100"},domProps:{"value":(_vm.settings.jpegImageQuality)},on:{"input":function($event){if($event.target.composing){ return; }_vm.$set(_vm.settings, "jpegImageQuality", _vm._n($event.target.value));},"blur":function($event){return _vm.$forceUpdate()}}})])]),_vm._v(" "),_c('BaseAccordion',{staticClass:"settings-group",scopedSlots:_vm._u([{key:"title",fn:function(){return [_c('h3',{staticClass:"settings-group__header"},[_c('i',{staticClass:"material-icons",staticStyle:{"width":"1em","height":"1em"}},[_vm._v("bookmarks")]),_vm._v(_vm._s(_vm.$t('settings.tags.head'))+"\n\t\t\t")])]},proxy:true}])},[_vm._v(" "),_c('div',{staticClass:"settings-container"},[_c('div',{staticClass:"settings-container__half"},[_c('label',{staticClass:"with-checkbox"},[_c('input',{directives:[{name:"model",rawName:"v-model",value:(_vm.settings.tags.title),expression:"settings.tags.title"}],attrs:{"type":"checkbox"},domProps:{"checked":Array.isArray(_vm.settings.tags.title)?_vm._i(_vm.settings.tags.title,null)>-1:(_vm.settings.tags.title)},on:{"change":function($event){var $$a=_vm.settings.tags.title,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.$set(_vm.settings.tags, "title", $$a.concat([$$v])));}else {$$i>-1&&(_vm.$set(_vm.settings.tags, "title", $$a.slice(0,$$i).concat($$a.slice($$i+1))));}}else {_vm.$set(_vm.settings.tags, "title", $$c);}}}}),_vm._v(" "),_c('span',{staticClass:"checkbox-text"},[_vm._v(_vm._s(_vm.$t('settings.tags.title')))])]),_vm._v(" "),_c('label',{staticClass:"with-checkbox"},[_c('input',{directives:[{name:"model",rawName:"v-model",value:(_vm.settings.tags.artist),expression:"settings.tags.artist"}],attrs:{"type":"checkbox"},domProps:{"checked":Array.isArray(_vm.settings.tags.artist)?_vm._i(_vm.settings.tags.artist,null)>-1:(_vm.settings.tags.artist)},on:{"change":function($event){var $$a=_vm.settings.tags.artist,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.$set(_vm.settings.tags, "artist", $$a.concat([$$v])));}else {$$i>-1&&(_vm.$set(_vm.settings.tags, "artist", $$a.slice(0,$$i).concat($$a.slice($$i+1))));}}else {_vm.$set(_vm.settings.tags, "artist", $$c);}}}}),_vm._v(" "),_c('span',{staticClass:"checkbox-text"},[_vm._v(_vm._s(_vm.$t('settings.tags.artist')))])]),_vm._v(" "),_c('label',{staticClass:"with-checkbox"},[_c('input',{directives:[{name:"model",rawName:"v-model",value:(_vm.settings.tags.album),expression:"settings.tags.album"}],attrs:{"type":"checkbox"},domProps:{"checked":Array.isArray(_vm.settings.tags.album)?_vm._i(_vm.settings.tags.album,null)>-1:(_vm.settings.tags.album)},on:{"change":function($event){var $$a=_vm.settings.tags.album,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.$set(_vm.settings.tags, "album", $$a.concat([$$v])));}else {$$i>-1&&(_vm.$set(_vm.settings.tags, "album", $$a.slice(0,$$i).concat($$a.slice($$i+1))));}}else {_vm.$set(_vm.settings.tags, "album", $$c);}}}}),_vm._v(" "),_c('span',{staticClass:"checkbox-text"},[_vm._v(_vm._s(_vm.$t('settings.tags.album')))])]),_vm._v(" "),_c('label',{staticClass:"with-checkbox"},[_c('input',{directives:[{name:"model",rawName:"v-model",value:(_vm.settings.tags.cover),expression:"settings.tags.cover"}],attrs:{"type":"checkbox"},domProps:{"checked":Array.isArray(_vm.settings.tags.cover)?_vm._i(_vm.settings.tags.cover,null)>-1:(_vm.settings.tags.cover)},on:{"change":function($event){var $$a=_vm.settings.tags.cover,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.$set(_vm.settings.tags, "cover", $$a.concat([$$v])));}else {$$i>-1&&(_vm.$set(_vm.settings.tags, "cover", $$a.slice(0,$$i).concat($$a.slice($$i+1))));}}else {_vm.$set(_vm.settings.tags, "cover", $$c);}}}}),_vm._v(" "),_c('span',{staticClass:"checkbox-text"},[_vm._v(_vm._s(_vm.$t('settings.tags.cover')))])]),_vm._v(" "),_c('label',{staticClass:"with-checkbox"},[_c('input',{directives:[{name:"model",rawName:"v-model",value:(_vm.settings.tags.trackNumber),expression:"settings.tags.trackNumber"}],attrs:{"type":"checkbox"},domProps:{"checked":Array.isArray(_vm.settings.tags.trackNumber)?_vm._i(_vm.settings.tags.trackNumber,null)>-1:(_vm.settings.tags.trackNumber)},on:{"change":function($event){var $$a=_vm.settings.tags.trackNumber,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.$set(_vm.settings.tags, "trackNumber", $$a.concat([$$v])));}else {$$i>-1&&(_vm.$set(_vm.settings.tags, "trackNumber", $$a.slice(0,$$i).concat($$a.slice($$i+1))));}}else {_vm.$set(_vm.settings.tags, "trackNumber", $$c);}}}}),_vm._v(" "),_c('span',{staticClass:"checkbox-text"},[_vm._v(_vm._s(_vm.$t('settings.tags.trackNumber')))])]),_vm._v(" "),_c('label',{staticClass:"with-checkbox"},[_c('input',{directives:[{name:"model",rawName:"v-model",value:(_vm.settings.tags.trackTotal),expression:"settings.tags.trackTotal"}],attrs:{"type":"checkbox"},domProps:{"checked":Array.isArray(_vm.settings.tags.trackTotal)?_vm._i(_vm.settings.tags.trackTotal,null)>-1:(_vm.settings.tags.trackTotal)},on:{"change":function($event){var $$a=_vm.settings.tags.trackTotal,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.$set(_vm.settings.tags, "trackTotal", $$a.concat([$$v])));}else {$$i>-1&&(_vm.$set(_vm.settings.tags, "trackTotal", $$a.slice(0,$$i).concat($$a.slice($$i+1))));}}else {_vm.$set(_vm.settings.tags, "trackTotal", $$c);}}}}),_vm._v(" "),_c('span',{staticClass:"checkbox-text"},[_vm._v(_vm._s(_vm.$t('settings.tags.trackTotal')))])]),_vm._v(" "),_c('label',{staticClass:"with-checkbox"},[_c('input',{directives:[{name:"model",rawName:"v-model",value:(_vm.settings.tags.discNumber),expression:"settings.tags.discNumber"}],attrs:{"type":"checkbox"},domProps:{"checked":Array.isArray(_vm.settings.tags.discNumber)?_vm._i(_vm.settings.tags.discNumber,null)>-1:(_vm.settings.tags.discNumber)},on:{"change":function($event){var $$a=_vm.settings.tags.discNumber,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.$set(_vm.settings.tags, "discNumber", $$a.concat([$$v])));}else {$$i>-1&&(_vm.$set(_vm.settings.tags, "discNumber", $$a.slice(0,$$i).concat($$a.slice($$i+1))));}}else {_vm.$set(_vm.settings.tags, "discNumber", $$c);}}}}),_vm._v(" "),_c('span',{staticClass:"checkbox-text"},[_vm._v(_vm._s(_vm.$t('settings.tags.discNumber')))])]),_vm._v(" "),_c('label',{staticClass:"with-checkbox"},[_c('input',{directives:[{name:"model",rawName:"v-model",value:(_vm.settings.tags.discTotal),expression:"settings.tags.discTotal"}],attrs:{"type":"checkbox"},domProps:{"checked":Array.isArray(_vm.settings.tags.discTotal)?_vm._i(_vm.settings.tags.discTotal,null)>-1:(_vm.settings.tags.discTotal)},on:{"change":function($event){var $$a=_vm.settings.tags.discTotal,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.$set(_vm.settings.tags, "discTotal", $$a.concat([$$v])));}else {$$i>-1&&(_vm.$set(_vm.settings.tags, "discTotal", $$a.slice(0,$$i).concat($$a.slice($$i+1))));}}else {_vm.$set(_vm.settings.tags, "discTotal", $$c);}}}}),_vm._v(" "),_c('span',{staticClass:"checkbox-text"},[_vm._v(_vm._s(_vm.$t('settings.tags.discTotal')))])]),_vm._v(" "),_c('label',{staticClass:"with-checkbox"},[_c('input',{directives:[{name:"model",rawName:"v-model",value:(_vm.settings.tags.albumArtist),expression:"settings.tags.albumArtist"}],attrs:{"type":"checkbox"},domProps:{"checked":Array.isArray(_vm.settings.tags.albumArtist)?_vm._i(_vm.settings.tags.albumArtist,null)>-1:(_vm.settings.tags.albumArtist)},on:{"change":function($event){var $$a=_vm.settings.tags.albumArtist,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.$set(_vm.settings.tags, "albumArtist", $$a.concat([$$v])));}else {$$i>-1&&(_vm.$set(_vm.settings.tags, "albumArtist", $$a.slice(0,$$i).concat($$a.slice($$i+1))));}}else {_vm.$set(_vm.settings.tags, "albumArtist", $$c);}}}}),_vm._v(" "),_c('span',{staticClass:"checkbox-text"},[_vm._v(_vm._s(_vm.$t('settings.tags.albumArtist')))])]),_vm._v(" "),_c('label',{staticClass:"with-checkbox"},[_c('input',{directives:[{name:"model",rawName:"v-model",value:(_vm.settings.tags.genre),expression:"settings.tags.genre"}],attrs:{"type":"checkbox"},domProps:{"checked":Array.isArray(_vm.settings.tags.genre)?_vm._i(_vm.settings.tags.genre,null)>-1:(_vm.settings.tags.genre)},on:{"change":function($event){var $$a=_vm.settings.tags.genre,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.$set(_vm.settings.tags, "genre", $$a.concat([$$v])));}else {$$i>-1&&(_vm.$set(_vm.settings.tags, "genre", $$a.slice(0,$$i).concat($$a.slice($$i+1))));}}else {_vm.$set(_vm.settings.tags, "genre", $$c);}}}}),_vm._v(" "),_c('span',{staticClass:"checkbox-text"},[_vm._v(_vm._s(_vm.$t('settings.tags.genre')))])]),_vm._v(" "),_c('label',{staticClass:"with-checkbox"},[_c('input',{directives:[{name:"model",rawName:"v-model",value:(_vm.settings.tags.year),expression:"settings.tags.year"}],attrs:{"type":"checkbox"},domProps:{"checked":Array.isArray(_vm.settings.tags.year)?_vm._i(_vm.settings.tags.year,null)>-1:(_vm.settings.tags.year)},on:{"change":function($event){var $$a=_vm.settings.tags.year,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.$set(_vm.settings.tags, "year", $$a.concat([$$v])));}else {$$i>-1&&(_vm.$set(_vm.settings.tags, "year", $$a.slice(0,$$i).concat($$a.slice($$i+1))));}}else {_vm.$set(_vm.settings.tags, "year", $$c);}}}}),_vm._v(" "),_c('span',{staticClass:"checkbox-text"},[_vm._v(_vm._s(_vm.$t('settings.tags.year')))])]),_vm._v(" "),_c('label',{staticClass:"with-checkbox"},[_c('input',{directives:[{name:"model",rawName:"v-model",value:(_vm.settings.tags.date),expression:"settings.tags.date"}],attrs:{"type":"checkbox"},domProps:{"checked":Array.isArray(_vm.settings.tags.date)?_vm._i(_vm.settings.tags.date,null)>-1:(_vm.settings.tags.date)},on:{"change":function($event){var $$a=_vm.settings.tags.date,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.$set(_vm.settings.tags, "date", $$a.concat([$$v])));}else {$$i>-1&&(_vm.$set(_vm.settings.tags, "date", $$a.slice(0,$$i).concat($$a.slice($$i+1))));}}else {_vm.$set(_vm.settings.tags, "date", $$c);}}}}),_vm._v(" "),_c('span',{staticClass:"checkbox-text"},[_vm._v(_vm._s(_vm.$t('settings.tags.date')))])]),_vm._v(" "),_c('label',{staticClass:"with-checkbox"},[_c('input',{directives:[{name:"model",rawName:"v-model",value:(_vm.settings.tags.explicit),expression:"settings.tags.explicit"}],attrs:{"type":"checkbox"},domProps:{"checked":Array.isArray(_vm.settings.tags.explicit)?_vm._i(_vm.settings.tags.explicit,null)>-1:(_vm.settings.tags.explicit)},on:{"change":function($event){var $$a=_vm.settings.tags.explicit,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.$set(_vm.settings.tags, "explicit", $$a.concat([$$v])));}else {$$i>-1&&(_vm.$set(_vm.settings.tags, "explicit", $$a.slice(0,$$i).concat($$a.slice($$i+1))));}}else {_vm.$set(_vm.settings.tags, "explicit", $$c);}}}}),_vm._v(" "),_c('span',{staticClass:"checkbox-text"},[_vm._v(_vm._s(_vm.$t('settings.tags.explicit')))])])]),_vm._v(" "),_c('div',{staticClass:"settings-container__half"},[_c('label',{staticClass:"with-checkbox"},[_c('input',{directives:[{name:"model",rawName:"v-model",value:(_vm.settings.tags.isrc),expression:"settings.tags.isrc"}],attrs:{"type":"checkbox"},domProps:{"checked":Array.isArray(_vm.settings.tags.isrc)?_vm._i(_vm.settings.tags.isrc,null)>-1:(_vm.settings.tags.isrc)},on:{"change":function($event){var $$a=_vm.settings.tags.isrc,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.$set(_vm.settings.tags, "isrc", $$a.concat([$$v])));}else {$$i>-1&&(_vm.$set(_vm.settings.tags, "isrc", $$a.slice(0,$$i).concat($$a.slice($$i+1))));}}else {_vm.$set(_vm.settings.tags, "isrc", $$c);}}}}),_vm._v(" "),_c('span',{staticClass:"checkbox-text"},[_vm._v(_vm._s(_vm.$t('settings.tags.isrc')))])]),_vm._v(" "),_c('label',{staticClass:"with-checkbox"},[_c('input',{directives:[{name:"model",rawName:"v-model",value:(_vm.settings.tags.length),expression:"settings.tags.length"}],attrs:{"type":"checkbox"},domProps:{"checked":Array.isArray(_vm.settings.tags.length)?_vm._i(_vm.settings.tags.length,null)>-1:(_vm.settings.tags.length)},on:{"change":function($event){var $$a=_vm.settings.tags.length,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.$set(_vm.settings.tags, "length", $$a.concat([$$v])));}else {$$i>-1&&(_vm.$set(_vm.settings.tags, "length", $$a.slice(0,$$i).concat($$a.slice($$i+1))));}}else {_vm.$set(_vm.settings.tags, "length", $$c);}}}}),_vm._v(" "),_c('span',{staticClass:"checkbox-text"},[_vm._v(_vm._s(_vm.$t('settings.tags.length')))])]),_vm._v(" "),_c('label',{staticClass:"with-checkbox"},[_c('input',{directives:[{name:"model",rawName:"v-model",value:(_vm.settings.tags.barcode),expression:"settings.tags.barcode"}],attrs:{"type":"checkbox"},domProps:{"checked":Array.isArray(_vm.settings.tags.barcode)?_vm._i(_vm.settings.tags.barcode,null)>-1:(_vm.settings.tags.barcode)},on:{"change":function($event){var $$a=_vm.settings.tags.barcode,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.$set(_vm.settings.tags, "barcode", $$a.concat([$$v])));}else {$$i>-1&&(_vm.$set(_vm.settings.tags, "barcode", $$a.slice(0,$$i).concat($$a.slice($$i+1))));}}else {_vm.$set(_vm.settings.tags, "barcode", $$c);}}}}),_vm._v(" "),_c('span',{staticClass:"checkbox-text"},[_vm._v(_vm._s(_vm.$t('settings.tags.barcode')))])]),_vm._v(" "),_c('label',{staticClass:"with-checkbox"},[_c('input',{directives:[{name:"model",rawName:"v-model",value:(_vm.settings.tags.bpm),expression:"settings.tags.bpm"}],attrs:{"type":"checkbox"},domProps:{"checked":Array.isArray(_vm.settings.tags.bpm)?_vm._i(_vm.settings.tags.bpm,null)>-1:(_vm.settings.tags.bpm)},on:{"change":function($event){var $$a=_vm.settings.tags.bpm,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.$set(_vm.settings.tags, "bpm", $$a.concat([$$v])));}else {$$i>-1&&(_vm.$set(_vm.settings.tags, "bpm", $$a.slice(0,$$i).concat($$a.slice($$i+1))));}}else {_vm.$set(_vm.settings.tags, "bpm", $$c);}}}}),_vm._v(" "),_c('span',{staticClass:"checkbox-text"},[_vm._v(_vm._s(_vm.$t('settings.tags.bpm')))])]),_vm._v(" "),_c('label',{staticClass:"with-checkbox"},[_c('input',{directives:[{name:"model",rawName:"v-model",value:(_vm.settings.tags.replayGain),expression:"settings.tags.replayGain"}],attrs:{"type":"checkbox"},domProps:{"checked":Array.isArray(_vm.settings.tags.replayGain)?_vm._i(_vm.settings.tags.replayGain,null)>-1:(_vm.settings.tags.replayGain)},on:{"change":function($event){var $$a=_vm.settings.tags.replayGain,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.$set(_vm.settings.tags, "replayGain", $$a.concat([$$v])));}else {$$i>-1&&(_vm.$set(_vm.settings.tags, "replayGain", $$a.slice(0,$$i).concat($$a.slice($$i+1))));}}else {_vm.$set(_vm.settings.tags, "replayGain", $$c);}}}}),_vm._v(" "),_c('span',{staticClass:"checkbox-text"},[_vm._v(_vm._s(_vm.$t('settings.tags.replayGain')))])]),_vm._v(" "),_c('label',{staticClass:"with-checkbox"},[_c('input',{directives:[{name:"model",rawName:"v-model",value:(_vm.settings.tags.label),expression:"settings.tags.label"}],attrs:{"type":"checkbox"},domProps:{"checked":Array.isArray(_vm.settings.tags.label)?_vm._i(_vm.settings.tags.label,null)>-1:(_vm.settings.tags.label)},on:{"change":function($event){var $$a=_vm.settings.tags.label,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.$set(_vm.settings.tags, "label", $$a.concat([$$v])));}else {$$i>-1&&(_vm.$set(_vm.settings.tags, "label", $$a.slice(0,$$i).concat($$a.slice($$i+1))));}}else {_vm.$set(_vm.settings.tags, "label", $$c);}}}}),_vm._v(" "),_c('span',{staticClass:"checkbox-text"},[_vm._v(_vm._s(_vm.$t('settings.tags.label')))])]),_vm._v(" "),_c('label',{staticClass:"with-checkbox"},[_c('input',{directives:[{name:"model",rawName:"v-model",value:(_vm.settings.tags.lyrics),expression:"settings.tags.lyrics"}],attrs:{"type":"checkbox"},domProps:{"checked":Array.isArray(_vm.settings.tags.lyrics)?_vm._i(_vm.settings.tags.lyrics,null)>-1:(_vm.settings.tags.lyrics)},on:{"change":function($event){var $$a=_vm.settings.tags.lyrics,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.$set(_vm.settings.tags, "lyrics", $$a.concat([$$v])));}else {$$i>-1&&(_vm.$set(_vm.settings.tags, "lyrics", $$a.slice(0,$$i).concat($$a.slice($$i+1))));}}else {_vm.$set(_vm.settings.tags, "lyrics", $$c);}}}}),_vm._v(" "),_c('span',{staticClass:"checkbox-text"},[_vm._v(_vm._s(_vm.$t('settings.tags.lyrics')))])]),_vm._v(" "),_c('label',{staticClass:"with-checkbox"},[_c('input',{directives:[{name:"model",rawName:"v-model",value:(_vm.settings.tags.syncedLyrics),expression:"settings.tags.syncedLyrics"}],attrs:{"type":"checkbox"},domProps:{"checked":Array.isArray(_vm.settings.tags.syncedLyrics)?_vm._i(_vm.settings.tags.syncedLyrics,null)>-1:(_vm.settings.tags.syncedLyrics)},on:{"change":function($event){var $$a=_vm.settings.tags.syncedLyrics,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.$set(_vm.settings.tags, "syncedLyrics", $$a.concat([$$v])));}else {$$i>-1&&(_vm.$set(_vm.settings.tags, "syncedLyrics", $$a.slice(0,$$i).concat($$a.slice($$i+1))));}}else {_vm.$set(_vm.settings.tags, "syncedLyrics", $$c);}}}}),_vm._v(" "),_c('span',{staticClass:"checkbox-text"},[_vm._v(_vm._s(_vm.$t('settings.tags.syncedLyrics')))])]),_vm._v(" "),_c('label',{staticClass:"with-checkbox"},[_c('input',{directives:[{name:"model",rawName:"v-model",value:(_vm.settings.tags.copyright),expression:"settings.tags.copyright"}],attrs:{"type":"checkbox"},domProps:{"checked":Array.isArray(_vm.settings.tags.copyright)?_vm._i(_vm.settings.tags.copyright,null)>-1:(_vm.settings.tags.copyright)},on:{"change":function($event){var $$a=_vm.settings.tags.copyright,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.$set(_vm.settings.tags, "copyright", $$a.concat([$$v])));}else {$$i>-1&&(_vm.$set(_vm.settings.tags, "copyright", $$a.slice(0,$$i).concat($$a.slice($$i+1))));}}else {_vm.$set(_vm.settings.tags, "copyright", $$c);}}}}),_vm._v(" "),_c('span',{staticClass:"checkbox-text"},[_vm._v(_vm._s(_vm.$t('settings.tags.copyright')))])]),_vm._v(" "),_c('label',{staticClass:"with-checkbox"},[_c('input',{directives:[{name:"model",rawName:"v-model",value:(_vm.settings.tags.composer),expression:"settings.tags.composer"}],attrs:{"type":"checkbox"},domProps:{"checked":Array.isArray(_vm.settings.tags.composer)?_vm._i(_vm.settings.tags.composer,null)>-1:(_vm.settings.tags.composer)},on:{"change":function($event){var $$a=_vm.settings.tags.composer,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.$set(_vm.settings.tags, "composer", $$a.concat([$$v])));}else {$$i>-1&&(_vm.$set(_vm.settings.tags, "composer", $$a.slice(0,$$i).concat($$a.slice($$i+1))));}}else {_vm.$set(_vm.settings.tags, "composer", $$c);}}}}),_vm._v(" "),_c('span',{staticClass:"checkbox-text"},[_vm._v(_vm._s(_vm.$t('settings.tags.composer')))])]),_vm._v(" "),_c('label',{staticClass:"with-checkbox"},[_c('input',{directives:[{name:"model",rawName:"v-model",value:(_vm.settings.tags.involvedPeople),expression:"settings.tags.involvedPeople"}],attrs:{"type":"checkbox"},domProps:{"checked":Array.isArray(_vm.settings.tags.involvedPeople)?_vm._i(_vm.settings.tags.involvedPeople,null)>-1:(_vm.settings.tags.involvedPeople)},on:{"change":function($event){var $$a=_vm.settings.tags.involvedPeople,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.$set(_vm.settings.tags, "involvedPeople", $$a.concat([$$v])));}else {$$i>-1&&(_vm.$set(_vm.settings.tags, "involvedPeople", $$a.slice(0,$$i).concat($$a.slice($$i+1))));}}else {_vm.$set(_vm.settings.tags, "involvedPeople", $$c);}}}}),_vm._v(" "),_c('span',{staticClass:"checkbox-text"},[_vm._v(_vm._s(_vm.$t('settings.tags.involvedPeople')))])]),_vm._v(" "),_c('label',{staticClass:"with-checkbox"},[_c('input',{directives:[{name:"model",rawName:"v-model",value:(_vm.settings.tags.source),expression:"settings.tags.source"}],attrs:{"type":"checkbox"},domProps:{"checked":Array.isArray(_vm.settings.tags.source)?_vm._i(_vm.settings.tags.source,null)>-1:(_vm.settings.tags.source)},on:{"change":function($event){var $$a=_vm.settings.tags.source,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.$set(_vm.settings.tags, "source", $$a.concat([$$v])));}else {$$i>-1&&(_vm.$set(_vm.settings.tags, "source", $$a.slice(0,$$i).concat($$a.slice($$i+1))));}}else {_vm.$set(_vm.settings.tags, "source", $$c);}}}}),_vm._v(" "),_c('span',{staticClass:"checkbox-text"},[_vm._v(_vm._s(_vm.$t('settings.tags.source')))])])])])]),_vm._v(" "),_c('BaseAccordion',{staticClass:"settings-group",scopedSlots:_vm._u([{key:"title",fn:function(){return [_c('h3',{staticClass:"settings-group__header"},[_c('i',{staticClass:"material-icons"},[_vm._v("get_app")]),_vm._v(_vm._s(_vm.$t('settings.downloads.title'))+"\n\t\t\t")])]},proxy:true}])},[_vm._v(" "),_c('div',{staticClass:"input-group"},[_c('p',{staticClass:"input-group-text"},[_vm._v(_vm._s(_vm.$t('settings.downloads.queueConcurrency')))]),_vm._v(" "),_c('input',{directives:[{name:"model",rawName:"v-model.number",value:(_vm.settings.queueConcurrency),expression:"settings.queueConcurrency",modifiers:{"number":true}}],attrs:{"type":"number","min":"1"},domProps:{"value":(_vm.settings.queueConcurrency)},on:{"input":function($event){if($event.target.composing){ return; }_vm.$set(_vm.settings, "queueConcurrency", _vm._n($event.target.value));},"blur":function($event){return _vm.$forceUpdate()}}})]),_vm._v(" "),_c('div',{staticClass:"input-group"},[_c('p',{staticClass:"input-group-text"},[_vm._v(_vm._s(_vm.$t('settings.downloads.maxBitrate.title')))]),_vm._v(" "),_c('select',{directives:[{name:"model",rawName:"v-model",value:(_vm.settings.maxBitrate),expression:"settings.maxBitrate"}],on:{"change":function($event){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 val}); _vm.$set(_vm.settings, "maxBitrate", $event.target.multiple ? $$selectedVal : $$selectedVal[0]);}}},[_c('option',{attrs:{"value":"9"}},[_vm._v(_vm._s(_vm.$t('settings.downloads.maxBitrate.9')))]),_vm._v(" "),_c('option',{attrs:{"value":"3"}},[_vm._v(_vm._s(_vm.$t('settings.downloads.maxBitrate.3')))]),_vm._v(" "),_c('option',{attrs:{"value":"1"}},[_vm._v(_vm._s(_vm.$t('settings.downloads.maxBitrate.1')))])])]),_vm._v(" "),_c('div',{staticClass:"input-group"},[_c('p',{staticClass:"input-group-text"},[_vm._v(_vm._s(_vm.$t('settings.downloads.overwriteFile.title')))]),_vm._v(" "),_c('select',{directives:[{name:"model",rawName:"v-model",value:(_vm.settings.overwriteFile),expression:"settings.overwriteFile"}],on:{"change":function($event){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 val}); _vm.$set(_vm.settings, "overwriteFile", $event.target.multiple ? $$selectedVal : $$selectedVal[0]);}}},[_c('option',{attrs:{"value":"y"}},[_vm._v(_vm._s(_vm.$t('settings.downloads.overwriteFile.y')))]),_vm._v(" "),_c('option',{attrs:{"value":"n"}},[_vm._v(_vm._s(_vm.$t('settings.downloads.overwriteFile.n')))]),_vm._v(" "),_c('option',{attrs:{"value":"e"}},[_vm._v(_vm._s(_vm.$t('settings.downloads.overwriteFile.e')))]),_vm._v(" "),_c('option',{attrs:{"value":"b"}},[_vm._v(_vm._s(_vm.$t('settings.downloads.overwriteFile.b')))]),_vm._v(" "),_c('option',{attrs:{"value":"t"}},[_vm._v(_vm._s(_vm.$t('settings.downloads.overwriteFile.t')))])])]),_vm._v(" "),_c('div',{staticClass:"settings-container"},[_c('div',{staticClass:"settings-container__third settings-container__third--only-checkbox"},[_c('label',{staticClass:"with-checkbox"},[_c('input',{directives:[{name:"model",rawName:"v-model",value:(_vm.settings.fallbackBitrate),expression:"settings.fallbackBitrate"}],attrs:{"type":"checkbox"},domProps:{"checked":Array.isArray(_vm.settings.fallbackBitrate)?_vm._i(_vm.settings.fallbackBitrate,null)>-1:(_vm.settings.fallbackBitrate)},on:{"change":function($event){var $$a=_vm.settings.fallbackBitrate,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.$set(_vm.settings, "fallbackBitrate", $$a.concat([$$v])));}else {$$i>-1&&(_vm.$set(_vm.settings, "fallbackBitrate", $$a.slice(0,$$i).concat($$a.slice($$i+1))));}}else {_vm.$set(_vm.settings, "fallbackBitrate", $$c);}}}}),_vm._v(" "),_c('span',{staticClass:"checkbox-text"},[_vm._v(_vm._s(_vm.$t('settings.downloads.fallbackBitrate')))])]),_vm._v(" "),_c('label',{staticClass:"with-checkbox"},[_c('input',{directives:[{name:"model",rawName:"v-model",value:(_vm.settings.fallbackSearch),expression:"settings.fallbackSearch"}],attrs:{"type":"checkbox"},domProps:{"checked":Array.isArray(_vm.settings.fallbackSearch)?_vm._i(_vm.settings.fallbackSearch,null)>-1:(_vm.settings.fallbackSearch)},on:{"change":function($event){var $$a=_vm.settings.fallbackSearch,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.$set(_vm.settings, "fallbackSearch", $$a.concat([$$v])));}else {$$i>-1&&(_vm.$set(_vm.settings, "fallbackSearch", $$a.slice(0,$$i).concat($$a.slice($$i+1))));}}else {_vm.$set(_vm.settings, "fallbackSearch", $$c);}}}}),_vm._v(" "),_c('span',{staticClass:"checkbox-text"},[_vm._v(_vm._s(_vm.$t('settings.downloads.fallbackSearch')))])])]),_vm._v(" "),_c('div',{staticClass:"settings-container__third settings-container__third--only-checkbox"},[_c('label',{staticClass:"with-checkbox"},[_c('input',{directives:[{name:"model",rawName:"v-model",value:(_vm.settings.logErrors),expression:"settings.logErrors"}],attrs:{"type":"checkbox"},domProps:{"checked":Array.isArray(_vm.settings.logErrors)?_vm._i(_vm.settings.logErrors,null)>-1:(_vm.settings.logErrors)},on:{"change":function($event){var $$a=_vm.settings.logErrors,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.$set(_vm.settings, "logErrors", $$a.concat([$$v])));}else {$$i>-1&&(_vm.$set(_vm.settings, "logErrors", $$a.slice(0,$$i).concat($$a.slice($$i+1))));}}else {_vm.$set(_vm.settings, "logErrors", $$c);}}}}),_vm._v(" "),_c('span',{staticClass:"checkbox-text"},[_vm._v(_vm._s(_vm.$t('settings.downloads.logErrors')))])]),_vm._v(" "),_c('label',{staticClass:"with-checkbox"},[_c('input',{directives:[{name:"model",rawName:"v-model",value:(_vm.settings.logSearched),expression:"settings.logSearched"}],attrs:{"type":"checkbox"},domProps:{"checked":Array.isArray(_vm.settings.logSearched)?_vm._i(_vm.settings.logSearched,null)>-1:(_vm.settings.logSearched)},on:{"change":function($event){var $$a=_vm.settings.logSearched,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.$set(_vm.settings, "logSearched", $$a.concat([$$v])));}else {$$i>-1&&(_vm.$set(_vm.settings, "logSearched", $$a.slice(0,$$i).concat($$a.slice($$i+1))));}}else {_vm.$set(_vm.settings, "logSearched", $$c);}}}}),_vm._v(" "),_c('span',{staticClass:"checkbox-text"},[_vm._v(_vm._s(_vm.$t('settings.downloads.logSearched')))])])]),_vm._v(" "),_c('div',{staticClass:"settings-container__third settings-container__third--only-checkbox"},[_c('label',{staticClass:"with-checkbox"},[_c('input',{directives:[{name:"model",rawName:"v-model",value:(_vm.settings.syncedLyrics),expression:"settings.syncedLyrics"}],attrs:{"type":"checkbox"},domProps:{"checked":Array.isArray(_vm.settings.syncedLyrics)?_vm._i(_vm.settings.syncedLyrics,null)>-1:(_vm.settings.syncedLyrics)},on:{"change":function($event){var $$a=_vm.settings.syncedLyrics,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.$set(_vm.settings, "syncedLyrics", $$a.concat([$$v])));}else {$$i>-1&&(_vm.$set(_vm.settings, "syncedLyrics", $$a.slice(0,$$i).concat($$a.slice($$i+1))));}}else {_vm.$set(_vm.settings, "syncedLyrics", $$c);}}}}),_vm._v(" "),_c('span',{staticClass:"checkbox-text"},[_vm._v(_vm._s(_vm.$t('settings.downloads.syncedLyrics')))])]),_vm._v(" "),_c('label',{staticClass:"with-checkbox"},[_c('input',{directives:[{name:"model",rawName:"v-model",value:(_vm.settings.createM3U8File),expression:"settings.createM3U8File"}],attrs:{"type":"checkbox"},domProps:{"checked":Array.isArray(_vm.settings.createM3U8File)?_vm._i(_vm.settings.createM3U8File,null)>-1:(_vm.settings.createM3U8File)},on:{"change":function($event){var $$a=_vm.settings.createM3U8File,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.$set(_vm.settings, "createM3U8File", $$a.concat([$$v])));}else {$$i>-1&&(_vm.$set(_vm.settings, "createM3U8File", $$a.slice(0,$$i).concat($$a.slice($$i+1))));}}else {_vm.$set(_vm.settings, "createM3U8File", $$c);}}}}),_vm._v(" "),_c('span',{staticClass:"checkbox-text"},[_vm._v(_vm._s(_vm.$t('settings.downloads.createM3U8File')))])])])]),_vm._v(" "),(_vm.settings.createM3U8File)?_c('div',{staticClass:"input-group"},[_c('p',{staticClass:"input-group-text"},[_vm._v(_vm._s(_vm.$t('settings.downloads.playlistFilenameTemplate')))]),_vm._v(" "),_c('input',{directives:[{name:"model",rawName:"v-model",value:(_vm.settings.playlistFilenameTemplate),expression:"settings.playlistFilenameTemplate"}],attrs:{"type":"text"},domProps:{"value":(_vm.settings.playlistFilenameTemplate)},on:{"input":function($event){if($event.target.composing){ return; }_vm.$set(_vm.settings, "playlistFilenameTemplate", $event.target.value);}}})]):_vm._e(),_vm._v(" "),_c('label',{staticClass:"with-checkbox"},[_c('input',{directives:[{name:"model",rawName:"v-model",value:(_vm.settings.saveDownloadQueue),expression:"settings.saveDownloadQueue"}],attrs:{"type":"checkbox"},domProps:{"checked":Array.isArray(_vm.settings.saveDownloadQueue)?_vm._i(_vm.settings.saveDownloadQueue,null)>-1:(_vm.settings.saveDownloadQueue)},on:{"change":function($event){var $$a=_vm.settings.saveDownloadQueue,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.$set(_vm.settings, "saveDownloadQueue", $$a.concat([$$v])));}else {$$i>-1&&(_vm.$set(_vm.settings, "saveDownloadQueue", $$a.slice(0,$$i).concat($$a.slice($$i+1))));}}else {_vm.$set(_vm.settings, "saveDownloadQueue", $$c);}}}}),_vm._v(" "),_c('span',{staticClass:"checkbox-text"},[_vm._v(_vm._s(_vm.$t('settings.downloads.saveDownloadQueue')))])])]),_vm._v(" "),_c('BaseAccordion',{staticClass:"settings-group",scopedSlots:_vm._u([{key:"title",fn:function(){return [_c('h3',{staticClass:"settings-group__header"},[_c('i',{staticClass:"material-icons"},[_vm._v("list")]),_vm._v(_vm._s(_vm.$t('settings.other.title')))])]},proxy:true}])},[_vm._v(" "),_c('label',{staticClass:"with-checkbox"},[_c('input',{directives:[{name:"model",rawName:"v-model",value:(_vm.settings.tags.savePlaylistAsCompilation),expression:"settings.tags.savePlaylistAsCompilation"}],attrs:{"type":"checkbox"},domProps:{"checked":Array.isArray(_vm.settings.tags.savePlaylistAsCompilation)?_vm._i(_vm.settings.tags.savePlaylistAsCompilation,null)>-1:(_vm.settings.tags.savePlaylistAsCompilation)},on:{"change":function($event){var $$a=_vm.settings.tags.savePlaylistAsCompilation,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.$set(_vm.settings.tags, "savePlaylistAsCompilation", $$a.concat([$$v])));}else {$$i>-1&&(_vm.$set(_vm.settings.tags, "savePlaylistAsCompilation", $$a.slice(0,$$i).concat($$a.slice($$i+1))));}}else {_vm.$set(_vm.settings.tags, "savePlaylistAsCompilation", $$c);}}}}),_vm._v(" "),_c('span',{staticClass:"checkbox-text"},[_vm._v(_vm._s(_vm.$t('settings.other.savePlaylistAsCompilation')))])]),_vm._v(" "),_c('label',{staticClass:"with-checkbox"},[_c('input',{directives:[{name:"model",rawName:"v-model",value:(_vm.settings.tags.useNullSeparator),expression:"settings.tags.useNullSeparator"}],attrs:{"type":"checkbox"},domProps:{"checked":Array.isArray(_vm.settings.tags.useNullSeparator)?_vm._i(_vm.settings.tags.useNullSeparator,null)>-1:(_vm.settings.tags.useNullSeparator)},on:{"change":function($event){var $$a=_vm.settings.tags.useNullSeparator,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.$set(_vm.settings.tags, "useNullSeparator", $$a.concat([$$v])));}else {$$i>-1&&(_vm.$set(_vm.settings.tags, "useNullSeparator", $$a.slice(0,$$i).concat($$a.slice($$i+1))));}}else {_vm.$set(_vm.settings.tags, "useNullSeparator", $$c);}}}}),_vm._v(" "),_c('span',{staticClass:"checkbox-text"},[_vm._v(_vm._s(_vm.$t('settings.other.useNullSeparator')))])]),_vm._v(" "),_c('label',{staticClass:"with-checkbox"},[_c('input',{directives:[{name:"model",rawName:"v-model",value:(_vm.settings.tags.saveID3v1),expression:"settings.tags.saveID3v1"}],attrs:{"type":"checkbox"},domProps:{"checked":Array.isArray(_vm.settings.tags.saveID3v1)?_vm._i(_vm.settings.tags.saveID3v1,null)>-1:(_vm.settings.tags.saveID3v1)},on:{"change":function($event){var $$a=_vm.settings.tags.saveID3v1,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.$set(_vm.settings.tags, "saveID3v1", $$a.concat([$$v])));}else {$$i>-1&&(_vm.$set(_vm.settings.tags, "saveID3v1", $$a.slice(0,$$i).concat($$a.slice($$i+1))));}}else {_vm.$set(_vm.settings.tags, "saveID3v1", $$c);}}}}),_vm._v(" "),_c('span',{staticClass:"checkbox-text"},[_vm._v(_vm._s(_vm.$t('settings.other.saveID3v1')))])]),_vm._v(" "),_c('div',{staticClass:"input-group"},[_c('p',{staticClass:"input-group-text"},[_vm._v(_vm._s(_vm.$t('settings.other.multiArtistSeparator.title')))]),_vm._v(" "),_c('select',{directives:[{name:"model",rawName:"v-model",value:(_vm.settings.tags.multiArtistSeparator),expression:"settings.tags.multiArtistSeparator"}],on:{"change":function($event){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 val}); _vm.$set(_vm.settings.tags, "multiArtistSeparator", $event.target.multiple ? $$selectedVal : $$selectedVal[0]);}}},[_c('option',{attrs:{"value":"nothing"}},[_vm._v(_vm._s(_vm.$t('settings.other.multiArtistSeparator.nothing')))]),_vm._v(" "),_c('option',{attrs:{"value":"default"}},[_vm._v(_vm._s(_vm.$t('settings.other.multiArtistSeparator.default')))]),_vm._v(" "),_c('option',{attrs:{"value":"andFeat"}},[_vm._v(_vm._s(_vm.$t('settings.other.multiArtistSeparator.andFeat')))]),_vm._v(" "),_c('option',{attrs:{"value":" & "}},[_vm._v(_vm._s(_vm.$t('settings.other.multiArtistSeparator.using', { separator: ' & ' })))]),_vm._v(" "),_c('option',{attrs:{"value":","}},[_vm._v(_vm._s(_vm.$t('settings.other.multiArtistSeparator.using', { separator: ',' })))]),_vm._v(" "),_c('option',{attrs:{"value":", "}},[_vm._v(_vm._s(_vm.$t('settings.other.multiArtistSeparator.using', { separator: ', ' })))]),_vm._v(" "),_c('option',{attrs:{"value":"/"}},[_vm._v(_vm._s(_vm.$t('settings.other.multiArtistSeparator.using', { separator: '/' })))]),_vm._v(" "),_c('option',{attrs:{"value":" / "}},[_vm._v(_vm._s(_vm.$t('settings.other.multiArtistSeparator.using', { separator: ' / ' })))]),_vm._v(" "),_c('option',{attrs:{"value":";"}},[_vm._v(_vm._s(_vm.$t('settings.other.multiArtistSeparator.using', { separator: ';' })))]),_vm._v(" "),_c('option',{attrs:{"value":"; "}},[_vm._v(_vm._s(_vm.$t('settings.other.multiArtistSeparator.using', { separator: '; ' })))])])]),_vm._v(" "),_c('label',{staticClass:"with-checkbox"},[_c('input',{directives:[{name:"model",rawName:"v-model",value:(_vm.settings.tags.singleAlbumArtist),expression:"settings.tags.singleAlbumArtist"}],attrs:{"type":"checkbox"},domProps:{"checked":Array.isArray(_vm.settings.tags.singleAlbumArtist)?_vm._i(_vm.settings.tags.singleAlbumArtist,null)>-1:(_vm.settings.tags.singleAlbumArtist)},on:{"change":function($event){var $$a=_vm.settings.tags.singleAlbumArtist,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.$set(_vm.settings.tags, "singleAlbumArtist", $$a.concat([$$v])));}else {$$i>-1&&(_vm.$set(_vm.settings.tags, "singleAlbumArtist", $$a.slice(0,$$i).concat($$a.slice($$i+1))));}}else {_vm.$set(_vm.settings.tags, "singleAlbumArtist", $$c);}}}}),_vm._v(" "),_c('span',{staticClass:"checkbox-text"},[_vm._v(_vm._s(_vm.$t('settings.other.singleAlbumArtist')))])]),_vm._v(" "),_c('label',{staticClass:"with-checkbox"},[_c('input',{directives:[{name:"model",rawName:"v-model",value:(_vm.settings.albumVariousArtists),expression:"settings.albumVariousArtists"}],attrs:{"type":"checkbox"},domProps:{"checked":Array.isArray(_vm.settings.albumVariousArtists)?_vm._i(_vm.settings.albumVariousArtists,null)>-1:(_vm.settings.albumVariousArtists)},on:{"change":function($event){var $$a=_vm.settings.albumVariousArtists,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.$set(_vm.settings, "albumVariousArtists", $$a.concat([$$v])));}else {$$i>-1&&(_vm.$set(_vm.settings, "albumVariousArtists", $$a.slice(0,$$i).concat($$a.slice($$i+1))));}}else {_vm.$set(_vm.settings, "albumVariousArtists", $$c);}}}}),_vm._v(" "),_c('span',{staticClass:"checkbox-text"},[_vm._v(_vm._s(_vm.$t('settings.other.albumVariousArtists')))])]),_vm._v(" "),_c('label',{staticClass:"with-checkbox"},[_c('input',{directives:[{name:"model",rawName:"v-model",value:(_vm.settings.removeAlbumVersion),expression:"settings.removeAlbumVersion"}],attrs:{"type":"checkbox"},domProps:{"checked":Array.isArray(_vm.settings.removeAlbumVersion)?_vm._i(_vm.settings.removeAlbumVersion,null)>-1:(_vm.settings.removeAlbumVersion)},on:{"change":function($event){var $$a=_vm.settings.removeAlbumVersion,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.$set(_vm.settings, "removeAlbumVersion", $$a.concat([$$v])));}else {$$i>-1&&(_vm.$set(_vm.settings, "removeAlbumVersion", $$a.slice(0,$$i).concat($$a.slice($$i+1))));}}else {_vm.$set(_vm.settings, "removeAlbumVersion", $$c);}}}}),_vm._v(" "),_c('span',{staticClass:"checkbox-text"},[_vm._v(_vm._s(_vm.$t('settings.other.removeAlbumVersion')))])]),_vm._v(" "),_c('label',{staticClass:"with-checkbox"},[_c('input',{directives:[{name:"model",rawName:"v-model",value:(_vm.settings.removeDuplicateArtists),expression:"settings.removeDuplicateArtists"}],attrs:{"type":"checkbox"},domProps:{"checked":Array.isArray(_vm.settings.removeDuplicateArtists)?_vm._i(_vm.settings.removeDuplicateArtists,null)>-1:(_vm.settings.removeDuplicateArtists)},on:{"change":function($event){var $$a=_vm.settings.removeDuplicateArtists,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.$set(_vm.settings, "removeDuplicateArtists", $$a.concat([$$v])));}else {$$i>-1&&(_vm.$set(_vm.settings, "removeDuplicateArtists", $$a.slice(0,$$i).concat($$a.slice($$i+1))));}}else {_vm.$set(_vm.settings, "removeDuplicateArtists", $$c);}}}}),_vm._v(" "),_c('span',{staticClass:"checkbox-text"},[_vm._v(_vm._s(_vm.$t('settings.other.removeDuplicateArtists')))])]),_vm._v(" "),_c('div',{staticClass:"input-group"},[_c('p',{staticClass:"input-group-text"},[_vm._v(_vm._s(_vm.$t('settings.other.dateFormat.title')))]),_vm._v(" "),_c('select',{directives:[{name:"model",rawName:"v-model",value:(_vm.settings.dateFormat),expression:"settings.dateFormat"}],on:{"change":function($event){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 val}); _vm.$set(_vm.settings, "dateFormat", $event.target.multiple ? $$selectedVal : $$selectedVal[0]);}}},[_c('option',{attrs:{"value":"Y-M-D"}},[_vm._v("\n\t\t\t\t\t"+_vm._s(((_vm.$t('settings.other.dateFormat.year')) + "-" + (_vm.$t('settings.other.dateFormat.month')) + "-" + (_vm.$t(
'settings.other.dateFormat.day'
))))+"\n\t\t\t\t")]),_vm._v(" "),_c('option',{attrs:{"value":"Y-D-M"}},[_vm._v("\n\t\t\t\t\t"+_vm._s(((_vm.$t('settings.other.dateFormat.year')) + "-" + (_vm.$t('settings.other.dateFormat.day')) + "-" + (_vm.$t(
'settings.other.dateFormat.month'
))))+"\n\t\t\t\t")]),_vm._v(" "),_c('option',{attrs:{"value":"D-M-Y"}},[_vm._v("\n\t\t\t\t\t"+_vm._s(((_vm.$t('settings.other.dateFormat.day')) + "-" + (_vm.$t('settings.other.dateFormat.month')) + "-" + (_vm.$t(
'settings.other.dateFormat.year'
))))+"\n\t\t\t\t")]),_vm._v(" "),_c('option',{attrs:{"value":"M-D-Y"}},[_vm._v("\n\t\t\t\t\t"+_vm._s(((_vm.$t('settings.other.dateFormat.month')) + "-" + (_vm.$t('settings.other.dateFormat.day')) + "-" + (_vm.$t(
'settings.other.dateFormat.year'
))))+"\n\t\t\t\t")]),_vm._v(" "),_c('option',{attrs:{"value":"Y"}},[_vm._v(_vm._s(_vm.$t('settings.other.dateFormat.year')))])])]),_vm._v(" "),_c('div',{staticClass:"input-group"},[_c('p',{staticClass:"input-group-text"},[_vm._v(_vm._s(_vm.$t('settings.other.featuredToTitle.title')))]),_vm._v(" "),_c('select',{directives:[{name:"model",rawName:"v-model",value:(_vm.settings.featuredToTitle),expression:"settings.featuredToTitle"}],on:{"change":function($event){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 val}); _vm.$set(_vm.settings, "featuredToTitle", $event.target.multiple ? $$selectedVal : $$selectedVal[0]);}}},[_c('option',{attrs:{"value":"0"}},[_vm._v(_vm._s(_vm.$t('settings.other.featuredToTitle.0')))]),_vm._v(" "),_c('option',{attrs:{"value":"1"}},[_vm._v(_vm._s(_vm.$t('settings.other.featuredToTitle.1')))]),_vm._v(" "),_c('option',{attrs:{"value":"3"}},[_vm._v(_vm._s(_vm.$t('settings.other.featuredToTitle.3')))]),_vm._v(" "),_c('option',{attrs:{"value":"2"}},[_vm._v(_vm._s(_vm.$t('settings.other.featuredToTitle.2')))])])]),_vm._v(" "),_c('div',{staticClass:"input-group"},[_c('p',{staticClass:"input-group-text"},[_vm._v(_vm._s(_vm.$t('settings.other.titleCasing')))]),_vm._v(" "),_c('select',{directives:[{name:"model",rawName:"v-model",value:(_vm.settings.titleCasing),expression:"settings.titleCasing"}],on:{"change":function($event){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 val}); _vm.$set(_vm.settings, "titleCasing", $event.target.multiple ? $$selectedVal : $$selectedVal[0]);}}},[_c('option',{attrs:{"value":"nothing"}},[_vm._v(_vm._s(_vm.$t('settings.other.casing.nothing')))]),_vm._v(" "),_c('option',{attrs:{"value":"lower"}},[_vm._v(_vm._s(_vm.$t('settings.other.casing.lower')))]),_vm._v(" "),_c('option',{attrs:{"value":"upper"}},[_vm._v(_vm._s(_vm.$t('settings.other.casing.upper')))]),_vm._v(" "),_c('option',{attrs:{"value":"start"}},[_vm._v(_vm._s(_vm.$t('settings.other.casing.start')))]),_vm._v(" "),_c('option',{attrs:{"value":"sentence"}},[_vm._v(_vm._s(_vm.$t('settings.other.casing.sentence')))])])]),_vm._v(" "),_c('div',{staticClass:"input-group"},[_c('p',{staticClass:"input-group-text"},[_vm._v(_vm._s(_vm.$t('settings.other.artistCasing')))]),_vm._v(" "),_c('select',{directives:[{name:"model",rawName:"v-model",value:(_vm.settings.artistCasing),expression:"settings.artistCasing"}],on:{"change":function($event){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 val}); _vm.$set(_vm.settings, "artistCasing", $event.target.multiple ? $$selectedVal : $$selectedVal[0]);}}},[_c('option',{attrs:{"value":"nothing"}},[_vm._v(_vm._s(_vm.$t('settings.other.casing.nothing')))]),_vm._v(" "),_c('option',{attrs:{"value":"lower"}},[_vm._v(_vm._s(_vm.$t('settings.other.casing.lower')))]),_vm._v(" "),_c('option',{attrs:{"value":"upper"}},[_vm._v(_vm._s(_vm.$t('settings.other.casing.upper')))]),_vm._v(" "),_c('option',{attrs:{"value":"start"}},[_vm._v(_vm._s(_vm.$t('settings.other.casing.start')))]),_vm._v(" "),_c('option',{attrs:{"value":"sentence"}},[_vm._v(_vm._s(_vm.$t('settings.other.casing.sentence')))])])]),_vm._v(" "),_c('div',{staticClass:"input-group"},[_c('p',{staticClass:"input-group-text"},[_vm._v(_vm._s(_vm.$t('settings.other.previewVolume')))]),_vm._v(" "),_c('input',{directives:[{name:"model",rawName:"v-model.number",value:(_vm.previewVolume.preview_max_volume),expression:"previewVolume.preview_max_volume",modifiers:{"number":true}}],staticClass:"slider",attrs:{"type":"range","min":"0","max":"100","step":"1"},domProps:{"value":(_vm.previewVolume.preview_max_volume)},on:{"change":_vm.updateMaxVolume,"__r":function($event){_vm.$set(_vm.previewVolume, "preview_max_volume", _vm._n($event.target.value));},"blur":function($event){return _vm.$forceUpdate()}}}),_vm._v(" "),_c('span',[_vm._v(_vm._s(_vm.previewVolume.preview_max_volume)+"%")])]),_vm._v(" "),_c('div',{staticClass:"input-group"},[_c('p',{staticClass:"input-group-text"},[_vm._v(_vm._s(_vm.$t('settings.other.executeCommand.title')))]),_vm._v(" "),_c('p',{staticClass:"secondary-text"},[_vm._v(_vm._s(_vm.$t('settings.other.executeCommand.description')))]),_vm._v(" "),_c('input',{directives:[{name:"model",rawName:"v-model",value:(_vm.settings.executeCommand),expression:"settings.executeCommand"}],attrs:{"type":"text"},domProps:{"value":(_vm.settings.executeCommand)},on:{"input":function($event){if($event.target.composing){ return; }_vm.$set(_vm.settings, "executeCommand", $event.target.value);}}})])]),_vm._v(" "),_c('BaseAccordion',{staticClass:"settings-group",scopedSlots:_vm._u([{key:"title",fn:function(){return [_c('h3',{staticClass:"settings-group__header"},[_c('svg',{staticClass:"w-6 h-6 mr-4",staticStyle:{"fill":"#1db954"},attrs:{"enable-background":"new 0 0 24 24","viewBox":"0 0 24 24","xmlns":"http://www.w3.org/2000/svg"}},[_c('path',{attrs:{"d":"m12 24c6.624 0 12-5.376 12-12s-5.376-12-12-12-12 5.376-12 12 5.376 12 12 12zm4.872-6.344v.001c-.807 0-3.356-2.828-10.52-1.36-.189.049-.436.126-.576.126-.915 0-1.09-1.369-.106-1.578 3.963-.875 8.013-.798 11.467 1.268.824.526.474 1.543-.265 1.543zm1.303-3.173c-.113-.03-.08.069-.597-.203-3.025-1.79-7.533-2.512-11.545-1.423-.232.063-.358.126-.576.126-1.071 0-1.355-1.611-.188-1.94 4.716-1.325 9.775-.552 13.297 1.543.392.232.547.533.547.953-.005.522-.411.944-.938.944zm-13.627-7.485c4.523-1.324 11.368-.906 15.624 1.578 1.091.629.662 2.22-.498 2.22l-.001-.001c-.252 0-.407-.063-.625-.189-3.443-2.056-9.604-2.549-13.59-1.436-.175.048-.393.125-.625.125-.639 0-1.127-.499-1.127-1.142 0-.657.407-1.029.842-1.155z"}})]),_vm._v("\n\t\t\t\t"+_vm._s(_vm.$t('settings.spotify.title'))+"\n\t\t\t")])]},proxy:true}])},[_vm._v(" "),_c('RouterLink',{attrs:{"to":{ name: 'Spotify Features' }}},[_vm._v("\n\t\t\t"+_vm._s(_vm.$t('settings.spotify.question'))+"\n\t\t")]),_vm._v(" "),_c('div',{staticClass:"input-group"},[_c('p',{staticClass:"input-group-text"},[_vm._v(_vm._s(_vm.$t('settings.spotify.clientID')))]),_vm._v(" "),_c('input',{directives:[{name:"model",rawName:"v-model",value:(_vm.spotifyFeatures.clientId),expression:"spotifyFeatures.clientId"}],attrs:{"type":"text"},domProps:{"value":(_vm.spotifyFeatures.clientId)},on:{"input":function($event){if($event.target.composing){ return; }_vm.$set(_vm.spotifyFeatures, "clientId", $event.target.value);}}})]),_vm._v(" "),_c('div',{staticClass:"input-group"},[_c('p',{staticClass:"input-group-text"},[_vm._v(_vm._s(_vm.$t('settings.spotify.clientSecret')))]),_vm._v(" "),_c('input',{directives:[{name:"model",rawName:"v-model",value:(_vm.spotifyFeatures.clientSecret),expression:"spotifyFeatures.clientSecret"}],attrs:{"type":"password"},domProps:{"value":(_vm.spotifyFeatures.clientSecret)},on:{"input":function($event){if($event.target.composing){ return; }_vm.$set(_vm.spotifyFeatures, "clientSecret", $event.target.value);}}})]),_vm._v(" "),_c('div',{staticClass:"input-group"},[_c('p',{staticClass:"input-group-text"},[_vm._v(_vm._s(_vm.$t('settings.spotify.username')))]),_vm._v(" "),_c('input',{directives:[{name:"model",rawName:"v-model",value:(_vm.spotifyUser),expression:"spotifyUser"}],attrs:{"type":"text"},domProps:{"value":(_vm.spotifyUser)},on:{"input":function($event){if($event.target.composing){ return; }_vm.spotifyUser=$event.target.value;}}})])],1),_vm._v(" "),_c('footer',{staticClass:"bg-background-main"},[_c('button',{staticClass:"mr-2 btn btn-primary",on:{"click":_vm.resetSettings}},[_vm._v(_vm._s(_vm.$t('settings.reset')))]),_vm._v(" "),_c('button',{staticClass:"btn btn-primary",on:{"click":_vm.saveSettings}},[_vm._v(_vm._s(_vm.$t('settings.save')))])])],1)};
var __vue_staticRenderFns__$u = [];
/* style */
const __vue_inject_styles__$u = function (inject) {
if (!inject) return
inject("data-v-4cb4224c_0", { source: "#logged_in_info{height:250px;display:flex;flex-direction:column;justify-content:space-evenly;align-items:center}.locale-flag{width:60px;justify-content:center;cursor:pointer}.locale-flag:not(:last-child){margin-right:10px}.locale-flag.locale-flag--current svg{filter:brightness(1)}.locale-flag svg{width:40px!important;height:40px!important;filter:brightness(.5)}", map: undefined, media: undefined });
};
/* scoped */
const __vue_scope_id__$u = undefined;
/* module identifier */
const __vue_module_identifier__$e = undefined;
/* functional template */
const __vue_is_functional_template__$u = false;
/* component normalizer */
function __vue_normalize__$u(
template, style, script,
scope, functional, moduleIdentifier,
createInjector, createInjectorSSR
) {
const component = (typeof script === 'function' ? script.options : script) || {};
// For security concerns, we use only base name in production mode.
component.__file = "Settings.vue";
if (!component.render) {
component.render = template.render;
component.staticRenderFns = template.staticRenderFns;
component._compiled = true;
if (functional) component.functional = true;
}
component._scopeId = scope;
{
let hook;
if (style) {
hook = function(context) {
style.call(this, createInjector(context));
};
}
if (hook !== undefined) {
if (component.functional) {
// register for functional component in vue file
const originalRender = component.render;
component.render = function renderWithStyleInjection(h, context) {
hook.call(context);
return originalRender(h, context)
};
} else {
// inject component registration as beforeCreate hook
const existing = component.beforeCreate;
component.beforeCreate = existing ? [].concat(existing, hook) : [hook];
}
}
}
return component
}
/* style inject */
function __vue_create_injector__$e() {
const head = document.head || document.getElementsByTagName('head')[0];
const styles = __vue_create_injector__$e.styles || (__vue_create_injector__$e.styles = {});
const isOldIE =
typeof navigator !== 'undefined' &&
/msie [6-9]\\b/.test(navigator.userAgent.toLowerCase());
return function addStyle(id, css) {
if (document.querySelector('style[data-vue-ssr-id~="' + id + '"]')) return // SSR styles are present.
const group = isOldIE ? css.media || 'default' : id;
const style = styles[group] || (styles[group] = { ids: [], parts: [], element: undefined });
if (!style.ids.includes(id)) {
let code = css.source;
let index = style.ids.length;
style.ids.push(id);
if ( css.map) {
// https://developer.chrome.com/devtools/docs/javascript-debugging
// this makes source maps inside style tags work properly in Chrome
code += '\n/*# sourceURL=' + css.map.sources[0] + ' */';
// http://stackoverflow.com/a/26603875
code +=
'\n/*# sourceMappingURL=data:application/json;base64,' +
btoa(unescape(encodeURIComponent(JSON.stringify(css.map)))) +
' */';
}
if (isOldIE) {
style.element = style.element || document.querySelector('style[data-group=' + group + ']');
}
if (!style.element) {
const el = style.element = document.createElement('style');
el.type = 'text/css';
if (css.media) el.setAttribute('media', css.media);
if (isOldIE) {
el.setAttribute('data-group', group);
el.setAttribute('data-next-index', '0');
}
head.appendChild(el);
}
if (isOldIE) {
index = parseInt(style.element.getAttribute('data-next-index'));
style.element.setAttribute('data-next-index', index + 1);
}
if (style.element.styleSheet) {
style.parts.push(code);
style.element.styleSheet.cssText = style.parts
.filter(Boolean)
.join('\n');
} else {
const textNode = document.createTextNode(code);
const nodes = style.element.childNodes;
if (nodes[index]) style.element.removeChild(nodes[index]);
if (nodes.length) style.element.insertBefore(textNode, nodes[index]);
else style.element.appendChild(textNode);
}
}
}
}
/* style inject SSR */
var Settings = __vue_normalize__$u(
{ render: __vue_render__$u, staticRenderFns: __vue_staticRenderFns__$u },
__vue_inject_styles__$u,
__vue_script__$s,
__vue_scope_id__$u,
__vue_is_functional_template__$u,
__vue_module_identifier__$e,
__vue_create_injector__$e);
//
var script$t = {
data() {
return {
title: '',
metadata: '',
release_date: '',
label: '',
explicit: false,
image: '',
type: 'empty',
link: '',
body: []
}
},
mounted() {
EventBus.$on('tracklistTab:selectRow', this.selectRow);
socket.on('show_album', this.showAlbum);
socket.on('show_playlist', this.showPlaylist);
socket.on('show_spotifyplaylist', this.showSpotifyPlaylist);
},
methods: {
playPausePreview(e) {
EventBus.$emit('trackPreview:playPausePreview', e);
},
reset() {
this.title = 'Loading...';
this.image = '';
this.metadata = '';
this.label = '';
this.release_date = '';
this.explicit = false;
this.type = 'empty';
this.body = [];
},
addToQueue(e) {
Downloads.sendAddToQueue(e.currentTarget.dataset.link);
},
toggleAll(e) {
this.body.forEach(item => {
if (item.type == 'track') {
item.selected = e.currentTarget.checked;
}
});
},
selectedLinks() {
var selected = [];
if (this.body) {
this.body.forEach(item => {
if (item.type == 'track' && item.selected)
selected.push(this.type == 'spotifyPlaylist' ? item.uri : item.link);
});
}
return selected.join(';')
},
convertDuration: Utils.convertDuration,
showAlbum(data) {
this.reset();
const {
id: albumID,
title: albumTitle,
explicit_lyrics,
label: albumLabel,
artist: { name: artistName },
tracks: albumTracks,
tracks: { length: numberOfTracks },
release_date,
cover_xl
} = data;
this.type = 'album';
this.link = `https://www.deezer.com/album/${albumID}`;
this.title = albumTitle;
this.explicit = explicit_lyrics;
this.label = albumLabel;
this.metadata = `${artistName} • ${this.$tc('globals.listTabs.trackN', numberOfTracks)}`;
this.release_date = release_date.substring(0, 10);
this.image = cover_xl;
if (isEmpty(albumTracks)) {
this.body = null;
} else {
this.body = albumTracks;
}
},
showPlaylist(data) {
this.reset();
const {
id: playlistID,
title: playlistTitle,
picture_xl: playlistCover,
creation_date,
creator: { name: creatorName },
tracks: playlistTracks,
tracks: { length: numberOfTracks }
} = data;
this.type = 'playlist';
this.link = `https://www.deezer.com/playlist/${playlistID}`;
this.title = playlistTitle;
this.image = playlistCover;
this.release_date = creation_date.substring(0, 10);
this.metadata = `${this.$t('globals.by', { artist: creatorName })} • ${this.$tc(
'globals.listTabs.trackN',
numberOfTracks
)}`;
if (isEmpty(playlistTracks)) {
this.body = null;
} else {
this.body = playlistTracks;
}
},
showSpotifyPlaylist(data) {
this.reset();
const {
uri: playlistURI,
name: playlistName,
images,
images: { length: numberOfImages },
owner: { display_name: ownerName },
tracks: playlistTracks,
tracks: { length: numberOfTracks }
} = data;
this.type = 'spotifyPlaylist';
this.link = playlistURI;
this.title = playlistName;
this.image = numberOfImages
? images[0].url
: 'https://e-cdns-images.dzcdn.net/images/cover/d41d8cd98f00b204e9800998ecf8427e/1000x1000-000000-80-0-0.jpg';
this.release_date = '';
this.metadata = `${this.$t('globals.by', { artist: ownerName })} • ${this.$tc(
'globals.listTabs.trackN',
numberOfTracks
)}`;
if (isEmpty(playlistTracks)) {
this.body = null;
} else {
this.body = playlistTracks;
}
},
selectRow(index, track) {
track.selected = !track.selected;
}
}
};
/* script */
const __vue_script__$t = script$t;
/* template */
var __vue_render__$v = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{ref:"root",staticClass:"relative fixed-footer bg-background-main image-header"},[_c('header',{style:({
'background-image':
'linear-gradient(to bottom, transparent 0%, var(--main-background) 100%), url(\'' + _vm.image + '\')'
})},[_c('h1',{staticClass:"flex items-center m-0 text-5xl"},[_vm._v("\n\t\t\t"+_vm._s(_vm.title)+" "),(_vm.explicit)?_c('i',{staticClass:"material-icons explicit-icon explicit-icon--right"},[_vm._v("explicit")]):_vm._e()]),_vm._v(" "),_c('h2',{staticClass:"m-0 mb-3 text-lg"},[(_vm.metadata)?_c('p',[_vm._v(_vm._s(_vm.metadata))]):_vm._e(),_vm._v(" "),(_vm.release_date)?_c('p',[_vm._v(_vm._s(_vm.release_date))]):_vm._e()])]),_vm._v(" "),_c('table',{staticClass:"table table--tracklist"},[_c('thead',[_c('tr',[_vm._m(0),_vm._v(" "),_c('th',[_vm._v("#")]),_vm._v(" "),_c('th',[_vm._v(_vm._s(_vm.$tc('globals.listTabs.title', 1)))]),_vm._v(" "),_c('th',[_vm._v(_vm._s(_vm.$tc('globals.listTabs.artist', 1)))]),_vm._v(" "),(_vm.type === 'playlist')?_c('th',[_vm._v(_vm._s(_vm.$tc('globals.listTabs.album', 1)))]):_vm._e(),_vm._v(" "),_vm._m(1),_vm._v(" "),_c('th',{staticClass:"table__icon table__cell--center clickable"},[_c('input',{staticClass:"selectAll",attrs:{"type":"checkbox"},on:{"click":_vm.toggleAll}})])])]),_vm._v(" "),_c('tbody',[(_vm.type !== 'spotifyPlaylist')?[_vm._l((_vm.body),function(track,index){return [(track.type == 'track')?_c('tr',{on:{"click":function($event){return _vm.selectRow(index, track)}}},[_c('td',{staticClass:"table__cell--x-small table__cell--center"},[_c('div',{staticClass:"table__cell-content table__cell-content--vertical-center"},[_c('i',_vm._g({staticClass:"material-icons",class:{
preview_playlist_controls: track.preview,
'cursor-pointer': track.preview,
disabled: !track.preview
},attrs:{"data-preview":track.preview,"title":_vm.$t('globals.play_hint')}},{ click: track.preview ? _vm.playPausePreview : false }),[_vm._v("\n\t\t\t\t\t\t\t\t\tplay_arrow\n\t\t\t\t\t\t\t\t")])])]),_vm._v(" "),_c('td',{staticClass:"table__cell--small table__cell--center track_position"},[_vm._v("\n\t\t\t\t\t\t\t"+_vm._s(_vm.type === 'album' ? track.track_position : _vm.body.indexOf(track) + 1)+"\n\t\t\t\t\t\t")]),_vm._v(" "),_c('td',{staticClass:"table__cell--large table__cell--with-icon"},[_c('div',{staticClass:"table__cell-content table__cell-content--vertical-center"},[(track.explicit_lyrics)?_c('i',{staticClass:"material-icons explicit-icon"},[_vm._v(" explicit ")]):_vm._e(),_vm._v("\n\t\t\t\t\t\t\t\t"+_vm._s(track.title +
(track.title_version && track.title.indexOf(track.title_version) == -1
? ' ' + track.title_version
: ''))+"\n\t\t\t\t\t\t\t")])]),_vm._v(" "),_c('router-link',{staticClass:"table__cell--medium table__cell--center clickable",attrs:{"tag":"td","to":{ name: 'Artist', params: { id: track.artist.id } }}},[_vm._v("\n\t\t\t\t\t\t\t"+_vm._s(track.artist.name)+"\n\t\t\t\t\t\t")]),_vm._v(" "),(_vm.type === 'playlist')?_c('router-link',{staticClass:"table__cell--medium table__cell--center clickable",attrs:{"tag":"td","to":{ name: 'Album', params: { id: track.album.id } }}},[_vm._v("\n\t\t\t\t\t\t\t"+_vm._s(track.album.title)+"\n\t\t\t\t\t\t")]):_vm._e(),_vm._v(" "),_c('td',{staticClass:"table__cell--center",class:{ 'table__cell--small': _vm.type === 'album', 'table__cell--x-small': _vm.type === 'playlist' }},[_vm._v("\n\t\t\t\t\t\t\t"+_vm._s(_vm.convertDuration(track.duration))+"\n\t\t\t\t\t\t")]),_vm._v(" "),_c('td',{staticClass:"table__icon table__cell--center"},[_c('input',{directives:[{name:"model",rawName:"v-model",value:(track.selected),expression:"track.selected"}],staticClass:"clickable",attrs:{"type":"checkbox"},domProps:{"checked":Array.isArray(track.selected)?_vm._i(track.selected,null)>-1:(track.selected)},on:{"change":function($event){var $$a=track.selected,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.$set(track, "selected", $$a.concat([$$v])));}else {$$i>-1&&(_vm.$set(track, "selected", $$a.slice(0,$$i).concat($$a.slice($$i+1))));}}else {_vm.$set(track, "selected", $$c);}}}})])],1):(track.type == 'disc_separator')?_c('tr',{staticClass:"table__row-no-highlight",staticStyle:{"opacity":"0.54"}},[_vm._m(2,true),_vm._v(" "),_c('td',{staticClass:"table__cell--center"},[_vm._v("\n\t\t\t\t\t\t\t"+_vm._s(track.number)+"\n\t\t\t\t\t\t")]),_vm._v(" "),_c('td',{attrs:{"colspan":"4"}})]):_vm._e()]})]:_vm._l((_vm.body),function(track,i){return _c('tr',[_c('td',[(track.preview_url)?_c('i',{staticClass:"material-icons",class:{
preview_playlist_controls: track.preview_url,
'cursor-pointer': track.preview_url
},attrs:{"data-preview":track.preview_url,"title":_vm.$t('globals.play_hint')},on:{"click":_vm.playPausePreview}},[_vm._v("\n\t\t\t\t\t\t\tplay_arrow\n\t\t\t\t\t\t")]):_c('i',{staticClass:"material-icons disabled"},[_vm._v("play_arrow")])]),_vm._v(" "),_c('td',[_vm._v(_vm._s(i + 1))]),_vm._v(" "),_c('td',{staticClass:"flex items-center"},[(track.explicit)?_c('i',{staticClass:"material-icons explicit-icon"},[_vm._v("explicit")]):_vm._e(),_vm._v("\n\t\t\t\t\t\t"+_vm._s(track.name)+"\n\t\t\t\t\t")]),_vm._v(" "),_c('td',[_vm._v(_vm._s(track.artists[0].name))]),_vm._v(" "),_c('td',[_vm._v(_vm._s(track.album.name))]),_vm._v(" "),_c('td',[_vm._v(_vm._s(_vm.convertDuration(Math.floor(track.duration_ms / 1000))))]),_vm._v(" "),_c('td',[_c('input',{directives:[{name:"model",rawName:"v-model",value:(track.selected),expression:"track.selected"}],staticClass:"clickable",attrs:{"type":"checkbox"},domProps:{"checked":Array.isArray(track.selected)?_vm._i(track.selected,null)>-1:(track.selected)},on:{"change":function($event){var $$a=track.selected,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.$set(track, "selected", $$a.concat([$$v])));}else {$$i>-1&&(_vm.$set(track, "selected", $$a.slice(0,$$i).concat($$a.slice($$i+1))));}}else {_vm.$set(track, "selected", $$c);}}}})])])})],2)]),_vm._v(" "),(_vm.label)?_c('span',{staticStyle:{"opacity":"0.4","margin-top":"8px","display":"inline-block","font-size":"13px"}},[_vm._v(_vm._s(_vm.label))]):_vm._e(),_vm._v(" "),_c('footer',{staticClass:"bg-background-main"},[_c('button',{staticClass:"mr-2 btn btn-primary",attrs:{"data-link":_vm.link},on:{"click":function($event){$event.stopPropagation();return _vm.addToQueue($event)}}},[_vm._v("\n\t\t\t"+_vm._s(("" + (_vm.$t('globals.download', { thing: _vm.$tc(("globals.listTabs." + _vm.type), 1) }))))+"\n\t\t")]),_vm._v(" "),_c('button',{staticClass:"flex items-center btn btn-primary",attrs:{"data-link":_vm.selectedLinks()},on:{"click":function($event){$event.stopPropagation();return _vm.addToQueue($event)}}},[_vm._v("\n\t\t\t"+_vm._s(_vm.$t('tracklist.downloadSelection'))),_c('i',{staticClass:"ml-2 material-icons"},[_vm._v("file_download")])])])])};
var __vue_staticRenderFns__$v = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('th',[_c('i',{staticClass:"material-icons"},[_vm._v("music_note")])])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('th',[_c('i',{staticClass:"material-icons"},[_vm._v("timer")])])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('td',[_c('div',{staticClass:"table__cell-content table__cell-content--vertical-center",staticStyle:{"opacity":"0.54"}},[_c('i',{staticClass:"material-icons"},[_vm._v("album")])])])}];
/* style */
const __vue_inject_styles__$v = undefined;
/* scoped */
const __vue_scope_id__$v = undefined;
/* functional template */
const __vue_is_functional_template__$v = false;
/* component normalizer */
function __vue_normalize__$v(
template, style, script,
scope, functional, moduleIdentifier,
createInjector, createInjectorSSR
) {
const component = (typeof script === 'function' ? script.options : script) || {};
// For security concerns, we use only base name in production mode.
component.__file = "Tracklist.vue";
if (!component.render) {
component.render = template.render;
component.staticRenderFns = template.staticRenderFns;
component._compiled = true;
if (functional) component.functional = true;
}
component._scopeId = scope;
return component
}
/* style inject */
/* style inject SSR */
var Tracklist = __vue_normalize__$v(
{ render: __vue_render__$v, staticRenderFns: __vue_staticRenderFns__$v },
__vue_inject_styles__$v,
__vue_script__$t,
__vue_scope_id__$v,
__vue_is_functional_template__$v);
Vue.use(VueRouter);
const routes = [
{
path: '/',
name: 'Home',
component: Home,
meta: {
notKeepAlive: true
}
},
{
path: '/tracklist/:type/:id',
name: 'Tracklist',
component: Tracklist
},
{
path: '/artist/:id',
name: 'Artist',
component: Artist
},
{
path: '/album/:id',
name: 'Album',
component: Tracklist
},
{
path: '/playlist/:id',
name: 'Playlist',
component: Tracklist
},
{
path: '/spotify-playlist/:id',
name: 'Spotify Playlist',
component: Tracklist
},
{
path: '/charts',
name: 'Charts',
component: Charts,
meta: {
notKeepAlive: true
}
},
{
path: '/favorites',
name: 'Favorites',
component: Favorites,
meta: {
notKeepAlive: true
}
},
{
path: '/errors',
name: 'Errors',
component: Errors
},
{
path: '/link-analyzer',
name: 'Link Analyzer',
component: LinkAnalyzer
},
{
path: '/about',
name: 'About',
component: About
},
{
path: '/info-arl',
name: 'ARL',
component: InfoArl
},
{
path: '/info-spotify',
name: 'Spotify Features',
component: InfoSpotifyFeatures
},
{
path: '/settings',
name: 'Settings',
component: Settings
},
{
path: '/search',
name: 'Search',
component: Search
},
// 404 client side
{
path: '*',
component: Home
}
];
const router = new VueRouter({
mode: 'history',
// linkActiveClass: 'open',
routes,
scrollBehavior(to, from, savedPosition) {
return { x: 0, y: 0 }
}
});
router.beforeEach((to, from, next) => {
let getTracklistParams = null;
switch (to.name) {
case 'Artist':
getTracklistParams = {
type: 'artist',
id: to.params.id
};
break
case 'Tracklist':
getTracklistParams = {
type: to.params.type,
id: to.params.id
};
break
case 'Album':
getTracklistParams = {
type: 'album',
id: to.params.id
};
break
case 'Playlist':
getTracklistParams = {
type: 'playlist',
id: to.params.id
};
break
case 'Spotify Playlist':
getTracklistParams = {
type: 'spotifyplaylist',
id: to.params.id
};
break
}
if (getTracklistParams) {
socket.emit('getTracklist', getTracklistParams);
}
next();
});
// Object is needed for vue change detection
window.vol = {
preview_max_volume: 100
};
/* ===== App initialization ===== */
function startApp() {
new Vue({
store,
router,
i18n,
render: h => h(App)
}).$mount('#app');
}
function initClient() {
store.dispatch('setClientMode', true);
setClientModeKeyBindings();
}
document.addEventListener('DOMContentLoaded', startApp);
window.addEventListener('pywebviewready', initClient);
/* ===== Global shortcuts ===== */
document.addEventListener('paste', pasteEvent => {
if (pasteEvent.target.localName === 'input') return
let pastedText = pasteEvent.clipboardData.getData('Text');
if (isValidURL(pastedText)) {
if (router.currentRoute.name === 'Link Analyzer') {
socket.emit('analyzeLink', pastedText);
} else {
sendAddToQueue(pastedText);
}
} else {
let searchbar = document.querySelector('#searchbar');
searchbar.select();
searchbar.setSelectionRange(0, 99999);
}
});
/**
* Sets up key bindings that already work in the browser (server mode)
*/
function setClientModeKeyBindings() {
document.addEventListener('keyup', keyEvent => {
// ALT + left
if (keyEvent.altKey && keyEvent.key === 'ArrowLeft') {
router.back();
}
// ALT + right
if (keyEvent.altKey && keyEvent.key === 'ArrowRight') {
router.forward();
}
});
}
/* ===== Socketio listeners ===== */
// Debug messages for socketio
socket.on('message', function(msg) {
console.log(msg);
});
socket.on('logging_in', function() {
toast(i18n.t('toasts.loggingIn'), 'loading', false, 'login-toast');
});
socket.on('init_autologin', function() {
let arl = localStorage.getItem('arl');
let accountNum = localStorage.getItem('accountNum');
if (arl) {
arl = arl.trim();
if (accountNum != 0) {
socket.emit('login', arl, true, accountNum);
} else {
socket.emit('login', arl);
}
}
});
socket.on('logged_in', function(data) {
const { status, user } = data;
switch (status) {
case 1:
case 3:
// Login ok
toast(i18n.t('toasts.loggedIn'), 'done', true, 'login-toast');
store.dispatch('login', data);
break
case 2:
// Already logged in
toast(i18n.t('toasts.alreadyLogged'), 'done', true, 'login-toast');
store.dispatch('setUser', user);
break
case 0:
// Login failed
toast(i18n.t('toasts.loginFailed'), 'close', true, 'login-toast');
store.dispatch('removeARL');
break
case -1:
toast(i18n.t('toasts.deezerNotAvailable'), 'close', true, 'login-toast');
return
// TODO
// $('#open_login_prompt').show()
// document.getElementById('logged_in_info').classList.add('hide')
// $('#settings_username').text('Not Logged')
// $('#settings_picture').attr('src', `https://e-cdns-images.dzcdn.net/images/user/125x125-000000-80-0-0.jpg`)
// document.getElementById('home_not_logged_in').classList.remove('hide')
}
});
socket.on('logged_out', function() {
toast(i18n.t('toasts.loggedOut'), 'done', true, 'login-toast');
store.dispatch('logout');
});
socket.on('restoringQueue', function() {
toast(i18n.t('toasts.restoringQueue'), 'loading', false, 'restoring_queue');
});
socket.on('cancellingCurrentItem', function(uuid) {
toast(i18n.t('toasts.cancellingCurrentItem'), 'loading', false, 'cancelling_' + uuid);
});
socket.on('currentItemCancelled', function(uuid) {
toast(i18n.t('toasts.currentItemCancelled'), 'done', true, 'cancelling_' + uuid);
});
socket.on('startAddingArtist', function(data) {
toast(i18n.t('toasts.startAddingArtist', { artist: data.name }), 'loading', false, 'artist_' + data.id);
});
socket.on('finishAddingArtist', function(data) {
toast(i18n.t('toasts.finishAddingArtist', { artist: data.name }), 'done', true, 'artist_' + data.id);
});
socket.on('startConvertingSpotifyPlaylist', function(id) {
toast(i18n.t('toasts.startConvertingSpotifyPlaylist'), 'loading', false, 'spotifyplaylist_' + id);
});
socket.on('finishConvertingSpotifyPlaylist', function(id) {
toast(i18n.t('toasts.finishConvertingSpotifyPlaylist'), 'done', true, 'spotifyplaylist_' + id);
});
socket.on('errorMessage', function(error) {
toast(error, 'error');
});
socket.on('queueError', function(queueItem) {
if (queueItem.errid) {
toast(queueItem.link + ' - ' + i18n.t(`errors.ids.${queueItem.errid}`), 'error');
} else {
toast(queueItem.link + ' - ' + queueItem.error, 'error');
}
});
socket.on('alreadyInQueue', function(data) {
toast(i18n.t('toasts.alreadyInQueue', { item: data.title }), 'playlist_add_check');
});
socket.on('loginNeededToDownload', function(data) {
toast(i18n.t('toasts.loginNeededToDownload'), 'report');
});
socket.on('startGeneratingItems', function(data) {
toast(i18n.t('toasts.startGeneratingItems', { n: data.total }), 'loading', false, 'batch_' + data.uuid);
});
socket.on('finishGeneratingItems', function(data) {
toast(i18n.t('toasts.finishGeneratingItems', { n: data.total }), 'done', true, 'batch_' + data.uuid);
});