{"version":3,"file":"D3hyP9_W.js","sources":["../../../../../home/build/node_modules/mitt/dist/mitt.mjs","../../../../../home/build/node_modules/vuetify/lib/util/mixins.js","../../../../../home/build/node_modules/vuetify/lib/components/VApp/VApp.js","../../../../../home/build/node_modules/vuetify/lib/mixins/binds-attrs/index.js","../../../../../home/build/node_modules/vuetify/lib/install.js","../../../../../home/build/node_modules/vuetify/lib/services/service/index.js","../../../../../home/build/node_modules/vuetify/lib/services/application/index.js","../../../../../home/build/node_modules/vuetify/lib/services/breakpoint/index.js","../../../../../home/build/node_modules/vuetify/lib/services/goto/easing-patterns.js","../../../../../home/build/node_modules/vuetify/lib/services/goto/util.js","../../../../../home/build/node_modules/vuetify/lib/services/goto/index.js","../../../../../home/build/node_modules/vuetify/lib/util/helpers.js","../../../../../home/build/node_modules/vuetify/lib/services/icons/presets/mdi-svg.js","../../../../../home/build/node_modules/vuetify/lib/services/icons/presets/md.js","../../../../../home/build/node_modules/vuetify/lib/services/icons/presets/mdi.js","../../../../../home/build/node_modules/vuetify/lib/services/icons/presets/fa.js","../../../../../home/build/node_modules/vuetify/lib/services/icons/presets/fa4.js","../../../../../home/build/node_modules/vuetify/lib/services/icons/presets/fa-svg.js","../../../../../home/build/node_modules/vuetify/lib/services/icons/presets/index.js","../../../../../home/build/node_modules/vuetify/lib/services/icons/index.js","../../../../../home/build/node_modules/vuetify/lib/services/lang/index.js","../../../../../home/build/node_modules/vuetify/lib/locale/en.js","../../../../../home/build/node_modules/vuetify/lib/locale/ru.js","../../../../../home/build/node_modules/vuetify/lib/presets/default/index.js","../../../../../home/build/node_modules/vuetify/lib/services/presets/index.js","../../../../../home/build/node_modules/vuetify/lib/util/color/transformSRGB.js","../../../../../home/build/node_modules/vuetify/lib/util/colorUtils.js","../../../../../home/build/node_modules/vuetify/lib/util/color/transformCIELAB.js","../../../../../home/build/node_modules/vuetify/lib/services/theme/utils.js","../../../../../home/build/node_modules/vuetify/lib/services/theme/index.js","../../../../../home/build/node_modules/vuetify/lib/framework.js","../../../../../home/build/node_modules/vuetify/lib/util/console.js","../../../../../home/build/node_modules/vuetify/lib/mixins/colorable/index.js","../../../../../home/build/node_modules/vuetify/lib/mixins/elevatable/index.js","../../../../../home/build/node_modules/vuetify/lib/mixins/measurable/index.js","../../../../../home/build/node_modules/vuetify/lib/mixins/roundable/index.js","../../../../../home/build/node_modules/vuetify/lib/components/VSheet/VSheet.js","../../../../../home/build/node_modules/vuetify/lib/directives/intersect/index.js","../../../../../home/build/node_modules/vuetify/lib/util/mergeData.js","../../../../../home/build/node_modules/vuetify/lib/mixins/positionable/index.js","../../../../../home/build/node_modules/vuetify/lib/util/dom.js","../../../../../home/build/node_modules/vuetify/lib/directives/click-outside/index.js","../../../../../home/build/node_modules/vuetify/lib/directives/resize/index.js","../../../../../home/build/node_modules/vuetify/lib/directives/ripple/index.js","../../../../../home/build/node_modules/vuetify/lib/directives/touch/index.js","../../../../../home/build/node_modules/vuetify/lib/mixins/ssr-bootable/index.js","../../../../../home/build/node_modules/vuetify/lib/mixins/toggleable/index.js","../../../../../home/build/node_modules/vuetify/lib/mixins/sizeable/index.js","../../../../../home/build/node_modules/vuetify/lib/components/VIcon/VIcon.js","../../../../../home/build/node_modules/vuetify/lib/components/VProgressCircular/VProgressCircular.js","../../../../../home/build/node_modules/vuetify/lib/mixins/registrable/index.js","../../../../../home/build/node_modules/vuetify/lib/mixins/groupable/index.js","../../../../../home/build/node_modules/vuetify/lib/mixins/routable/index.js","../../../../../home/build/node_modules/vuetify/lib/components/VBtn/VBtn.js","../../../../../home/build/node_modules/vuetify/lib/components/transitions/createTransition.js","../../../../../home/build/node_modules/vuetify/lib/components/transitions/expand-transition.js","../../../../../home/build/node_modules/vuetify/lib/components/transitions/index.js","../../../../../home/build/node_modules/vuetify/lib/components/VChip/VChip.js","../../../../../home/build/node_modules/vuetify/lib/components/VThemeProvider/VThemeProvider.js","../../../../../home/build/node_modules/vuetify/lib/mixins/delayable/index.js","../../../../../home/build/node_modules/vuetify/lib/mixins/activatable/index.js","../../../../../home/build/node_modules/vuetify/lib/mixins/dependent/index.js","../../../../../home/build/node_modules/vuetify/lib/mixins/stackable/index.js","../../../../../home/build/node_modules/vuetify/lib/mixins/bootable/index.js","../../../../../home/build/node_modules/vuetify/lib/mixins/detachable/index.js","../../../../../home/build/node_modules/vuetify/lib/mixins/menuable/index.js","../../../../../home/build/node_modules/vuetify/lib/mixins/returnable/index.js","../../../../../home/build/node_modules/vuetify/lib/components/VMenu/VMenu.js","../../../../../home/build/node_modules/vuetify/lib/components/VCheckbox/VSimpleCheckbox.js","../../../../../home/build/node_modules/vuetify/lib/components/VSubheader/VSubheader.js","../../../../../home/build/node_modules/vuetify/lib/components/VList/VList.js","../../../../../home/build/node_modules/vuetify/lib/components/VList/VListItem.js","../../../../../home/build/node_modules/vuetify/lib/mixins/comparable/index.js","../../../../../home/build/node_modules/vuetify/lib/mixins/proxyable/index.js","../../../../../home/build/node_modules/vuetify/lib/components/VItemGroup/VItemGroup.js","../../../../../home/build/node_modules/vuetify/lib/components/VList/VListItemAction.js","../../../../../home/build/node_modules/vuetify/lib/components/VList/index.js","../../../../../home/build/node_modules/vuetify/lib/components/VSelect/VSelectList.js","../../../../../home/build/node_modules/vuetify/lib/components/VLabel/VLabel.js","../../../../../home/build/node_modules/vuetify/lib/components/VMessages/VMessages.js","../../../../../home/build/node_modules/vuetify/lib/mixins/validatable/index.js","../../../../../home/build/node_modules/vuetify/lib/components/VInput/VInput.js","../../../../../home/build/node_modules/vuetify/lib/components/VCounter/VCounter.js","../../../../../home/build/node_modules/vuetify/lib/mixins/intersectable/index.js","../../../../../home/build/node_modules/vuetify/lib/components/VProgressLinear/VProgressLinear.js","../../../../../home/build/node_modules/vuetify/lib/mixins/loadable/index.js","../../../../../home/build/node_modules/vuetify/lib/components/VTextField/VTextField.js","../../../../../home/build/node_modules/vuetify/lib/mixins/filterable/index.js","../../../../../home/build/node_modules/vuetify/lib/components/VSelect/VSelect.js","../../../../../home/build/node_modules/vuetify/lib/components/VAutocomplete/VAutocomplete.js","../../../../../home/build/node_modules/vuetify/lib/mixins/mobile/index.js","../../../../../home/build/node_modules/vuetify/lib/components/VOverlay/VOverlay.js","../../../../../home/build/node_modules/vuetify/lib/mixins/overlayable/index.js","../../../../../home/build/node_modules/vuetify/lib/components/VDialog/VDialog.js","../../../../../home/build/node_modules/vuetify/lib/components/VWindow/VWindow.js","../../../../../home/build/node_modules/vuetify/lib/components/VSlideGroup/VSlideGroup.js","../../../../../home/build/node_modules/vuetify/lib/components/VTabs/VTabsBar.js","../../../../../home/build/node_modules/vuetify/lib/components/VTabs/VTabsItems.js","../../../../../home/build/node_modules/vuetify/lib/components/VTabs/VTabsSlider.js","../../../../../home/build/node_modules/vuetify/lib/components/VTabs/VTabs.js","../../../../../home/build/node_modules/vuetify/lib/components/VTabs/VTab.js","../../../../../home/build/node_modules/vuetify/lib/components/VTextarea/VTextarea.js","../../src/styles/colors.js","../../src/components/common/ThemeAutocomplete.vue","../../src/components/common/ThemeBtn.vue","../../src/components/common/ThemeDialog.vue","../../src/components/common/ThemeSelect.vue","../../src/components/common/ThemeTab.vue","../../src/components/common/ThemeTabs.vue","../../src/components/common/ThemeTextarea.vue","../../src/components/ui/BaseInput.vue","../../src/plugins/vuetify.js","../../src/components/common/SiteLogo.vue","../../src/plugins/change-title.ts","../../src/plugins/notifications/utils.ts","../../src/plugins/notifications/NotificationsGroup.vue","../../src/plugins/notifications/index.ts"],"sourcesContent":["export default function(n){return{all:n=n||new Map,on:function(t,e){var i=n.get(t);i?i.push(e):n.set(t,[e])},off:function(t,e){var i=n.get(t);i&&(e?i.splice(i.indexOf(e)>>>0,1):n.set(t,[]))},emit:function(t,e){var i=n.get(t);i&&i.slice().map(function(n){n(e)}),(i=n.get(\"*\"))&&i.slice().map(function(n){n(t,e)})}}}\n//# sourceMappingURL=mitt.mjs.map\n","/* eslint-disable max-len, import/export, no-use-before-define */\nimport Vue from 'vue';\nexport default function mixins(...args) {\n return Vue.extend({\n mixins: args\n });\n}\n//# sourceMappingURL=mixins.js.map","// Styles\nimport \"../../../src/components/VApp/VApp.sass\"; // Mixins\n\nimport Themeable from '../../mixins/themeable'; // Utilities\n\nimport mixins from '../../util/mixins';\n/* @vue/component */\n\nexport default mixins(Themeable).extend({\n name: 'v-app',\n props: {\n dark: {\n type: Boolean,\n default: undefined\n },\n id: {\n type: String,\n default: 'app'\n },\n light: {\n type: Boolean,\n default: undefined\n }\n },\n computed: {\n isDark() {\n return this.$vuetify.theme.dark;\n }\n\n },\n\n beforeCreate() {\n if (!this.$vuetify || this.$vuetify === this.$root) {\n throw new Error('Vuetify is not properly initialized, see https://v2.vuetifyjs.com/getting-started/quick-start#bootstrapping-the-vuetify-object');\n }\n },\n\n render(h) {\n const wrapper = h('div', {\n staticClass: 'v-application--wrap'\n }, this.$slots.default);\n return h('div', {\n staticClass: 'v-application',\n class: {\n 'v-application--is-rtl': this.$vuetify.rtl,\n 'v-application--is-ltr': !this.$vuetify.rtl,\n ...this.themeClasses\n },\n attrs: {\n 'data-app': true\n },\n domProps: {\n id: this.id\n }\n }, [wrapper]);\n }\n\n});\n//# sourceMappingURL=VApp.js.map","import Vue from 'vue';\n/**\n * This mixin provides `attrs$` and `listeners$` to work around\n * vue bug https://github.com/vuejs/vue/issues/10115\n */\n\nfunction makeWatcher(property) {\n return function (val, oldVal) {\n for (const attr in oldVal) {\n if (!Object.prototype.hasOwnProperty.call(val, attr)) {\n this.$delete(this.$data[property], attr);\n }\n }\n\n for (const attr in val) {\n this.$set(this.$data[property], attr, val[attr]);\n }\n };\n}\n\nexport default Vue.extend({\n data: () => ({\n attrs$: {},\n listeners$: {}\n }),\n\n created() {\n // Work around unwanted re-renders: https://github.com/vuejs/vue/issues/10115\n // Make sure to use `attrs$` instead of `$attrs` (confusing right?)\n this.$watch('$attrs', makeWatcher('attrs$'), {\n immediate: true\n });\n this.$watch('$listeners', makeWatcher('listeners$'), {\n immediate: true\n });\n }\n\n});\n//# sourceMappingURL=index.js.map","import OurVue from 'vue';\nimport { consoleError } from './util/console';\nexport function install(Vue, args = {}) {\n if (install.installed) return;\n install.installed = true;\n\n if (OurVue !== Vue) {\n consoleError(`Multiple instances of Vue detected\nSee https://github.com/vuetifyjs/vuetify/issues/4068\n\nIf you're seeing \"$attrs is readonly\", it's caused by this`);\n }\n\n const components = args.components || {};\n const directives = args.directives || {};\n\n for (const name in directives) {\n const directive = directives[name];\n Vue.directive(name, directive);\n }\n\n (function registerComponents(components) {\n if (components) {\n for (const key in components) {\n const component = components[key];\n\n if (component && !registerComponents(component.$_vuetify_subcomponents)) {\n Vue.component(key, component);\n }\n }\n\n return true;\n }\n\n return false;\n })(components); // Used to avoid multiple mixins being setup\n // when in dev mode and hot module reload\n // https://github.com/vuejs/vue/issues/5089#issuecomment-284260111\n\n\n if (Vue.$_vuetify_installed) return;\n Vue.$_vuetify_installed = true;\n Vue.mixin({\n beforeCreate() {\n const options = this.$options;\n\n if (options.vuetify) {\n options.vuetify.init(this, this.$ssrContext);\n this.$vuetify = Vue.observable(options.vuetify.framework);\n } else {\n this.$vuetify = options.parent && options.parent.$vuetify || this;\n }\n },\n\n beforeMount() {\n // @ts-ignore\n if (this.$options.vuetify && this.$el && this.$el.hasAttribute('data-server-rendered')) {\n // @ts-ignore\n this.$vuetify.isHydrating = true; // @ts-ignore\n\n this.$vuetify.breakpoint.update(true);\n }\n },\n\n mounted() {\n // @ts-ignore\n if (this.$options.vuetify && this.$vuetify.isHydrating) {\n // @ts-ignore\n this.$vuetify.isHydrating = false; // @ts-ignore\n\n this.$vuetify.breakpoint.update();\n }\n }\n\n });\n}\n//# sourceMappingURL=install.js.map","export class Service {\n constructor() {\n this.framework = {};\n }\n\n init(root, ssrContext) {}\n\n}\n//# sourceMappingURL=index.js.map","// Extensions\nimport { Service } from '../service';\nexport class Application extends Service {\n constructor() {\n super(...arguments);\n this.bar = 0;\n this.top = 0;\n this.left = 0;\n this.insetFooter = 0;\n this.right = 0;\n this.bottom = 0;\n this.footer = 0;\n this.application = {\n bar: {},\n top: {},\n left: {},\n insetFooter: {},\n right: {},\n bottom: {},\n footer: {}\n };\n }\n\n register(uid, location, size) {\n this.application[location][uid] = size;\n this.update(location);\n }\n\n unregister(uid, location) {\n if (this.application[location][uid] == null) return;\n delete this.application[location][uid];\n this.update(location);\n }\n\n update(location) {\n this[location] = Object.values(this.application[location]).reduce((acc, cur) => acc + cur, 0);\n }\n\n}\nApplication.property = 'application';\n//# sourceMappingURL=index.js.map","// Extensions\nimport { Service } from '../service';\nexport class Breakpoint extends Service {\n constructor(preset) {\n super(); // Public\n\n this.xs = false;\n this.sm = false;\n this.md = false;\n this.lg = false;\n this.xl = false;\n this.xsOnly = false;\n this.smOnly = false;\n this.smAndDown = false;\n this.smAndUp = false;\n this.mdOnly = false;\n this.mdAndDown = false;\n this.mdAndUp = false;\n this.lgOnly = false;\n this.lgAndDown = false;\n this.lgAndUp = false;\n this.xlOnly = false; // Value is xs to match v2.x functionality\n\n this.name = 'xs';\n this.height = 0;\n this.width = 0; // TODO: Add functionality to detect this dynamically in v3\n // Value is true to match v2.x functionality\n\n this.mobile = true;\n this.resizeTimeout = 0;\n const {\n mobileBreakpoint,\n scrollBarWidth,\n thresholds\n } = preset[Breakpoint.property];\n this.mobileBreakpoint = mobileBreakpoint;\n this.scrollBarWidth = scrollBarWidth;\n this.thresholds = thresholds;\n }\n\n init() {\n this.update();\n /* istanbul ignore if */\n\n if (typeof window === 'undefined') return;\n window.addEventListener('resize', this.onResize.bind(this), {\n passive: true\n });\n }\n /* eslint-disable-next-line max-statements */\n\n\n update(ssr = false) {\n const height = ssr ? 0 : this.getClientHeight();\n const width = ssr ? 0 : this.getClientWidth();\n const xs = width < this.thresholds.xs;\n const sm = width < this.thresholds.sm && !xs;\n const md = width < this.thresholds.md - this.scrollBarWidth && !(sm || xs);\n const lg = width < this.thresholds.lg - this.scrollBarWidth && !(md || sm || xs);\n const xl = width >= this.thresholds.lg - this.scrollBarWidth;\n this.height = height;\n this.width = width;\n this.xs = xs;\n this.sm = sm;\n this.md = md;\n this.lg = lg;\n this.xl = xl;\n this.xsOnly = xs;\n this.smOnly = sm;\n this.smAndDown = (xs || sm) && !(md || lg || xl);\n this.smAndUp = !xs && (sm || md || lg || xl);\n this.mdOnly = md;\n this.mdAndDown = (xs || sm || md) && !(lg || xl);\n this.mdAndUp = !(xs || sm) && (md || lg || xl);\n this.lgOnly = lg;\n this.lgAndDown = (xs || sm || md || lg) && !xl;\n this.lgAndUp = !(xs || sm || md) && (lg || xl);\n this.xlOnly = xl;\n\n switch (true) {\n case xs:\n this.name = 'xs';\n break;\n\n case sm:\n this.name = 'sm';\n break;\n\n case md:\n this.name = 'md';\n break;\n\n case lg:\n this.name = 'lg';\n break;\n\n default:\n this.name = 'xl';\n break;\n }\n\n if (typeof this.mobileBreakpoint === 'number') {\n this.mobile = width < parseInt(this.mobileBreakpoint, 10);\n return;\n }\n\n const breakpoints = {\n xs: 0,\n sm: 1,\n md: 2,\n lg: 3,\n xl: 4\n };\n const current = breakpoints[this.name];\n const max = breakpoints[this.mobileBreakpoint];\n this.mobile = current <= max;\n }\n\n onResize() {\n clearTimeout(this.resizeTimeout); // Added debounce to match what\n // v-resize used to do but was\n // removed due to a memory leak\n // https://github.com/vuetifyjs/vuetify/pull/2997\n\n this.resizeTimeout = window.setTimeout(this.update.bind(this), 200);\n } // Cross-browser support as described in:\n // https://stackoverflow.com/questions/1248081\n\n\n getClientWidth() {\n /* istanbul ignore if */\n if (typeof document === 'undefined') return 0; // SSR\n\n return Math.max(document.documentElement.clientWidth, window.innerWidth || 0);\n }\n\n getClientHeight() {\n /* istanbul ignore if */\n if (typeof document === 'undefined') return 0; // SSR\n\n return Math.max(document.documentElement.clientHeight, window.innerHeight || 0);\n }\n\n}\nBreakpoint.property = 'breakpoint';\n//# sourceMappingURL=index.js.map","// linear\nexport const linear = t => t; // accelerating from zero velocity\n\nexport const easeInQuad = t => t ** 2; // decelerating to zero velocity\n\nexport const easeOutQuad = t => t * (2 - t); // acceleration until halfway, then deceleration\n\nexport const easeInOutQuad = t => t < 0.5 ? 2 * t ** 2 : -1 + (4 - 2 * t) * t; // accelerating from zero velocity\n\nexport const easeInCubic = t => t ** 3; // decelerating to zero velocity\n\nexport const easeOutCubic = t => --t ** 3 + 1; // acceleration until halfway, then deceleration\n\nexport const easeInOutCubic = t => t < 0.5 ? 4 * t ** 3 : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1; // accelerating from zero velocity\n\nexport const easeInQuart = t => t ** 4; // decelerating to zero velocity\n\nexport const easeOutQuart = t => 1 - --t ** 4; // acceleration until halfway, then deceleration\n\nexport const easeInOutQuart = t => t < 0.5 ? 8 * t * t * t * t : 1 - 8 * --t * t * t * t; // accelerating from zero velocity\n\nexport const easeInQuint = t => t ** 5; // decelerating to zero velocity\n\nexport const easeOutQuint = t => 1 + --t ** 5; // acceleration until halfway, then deceleration\n\nexport const easeInOutQuint = t => t < 0.5 ? 16 * t ** 5 : 1 + 16 * --t ** 5;\n//# sourceMappingURL=easing-patterns.js.map","// Return target's cumulative offset from the top\nexport function getOffset(target) {\n if (typeof target === 'number') {\n return target;\n }\n\n let el = $(target);\n\n if (!el) {\n throw typeof target === 'string' ? new Error(`Target element \"${target}\" not found.`) : new TypeError(`Target must be a Number/Selector/HTMLElement/VueComponent, received ${type(target)} instead.`);\n }\n\n let totalOffset = 0;\n\n while (el) {\n totalOffset += el.offsetTop;\n el = el.offsetParent;\n }\n\n return totalOffset;\n}\nexport function getContainer(container) {\n const el = $(container);\n if (el) return el;\n throw typeof container === 'string' ? new Error(`Container element \"${container}\" not found.`) : new TypeError(`Container must be a Selector/HTMLElement/VueComponent, received ${type(container)} instead.`);\n}\n\nfunction type(el) {\n return el == null ? el : el.constructor.name;\n}\n\nfunction $(el) {\n if (typeof el === 'string') {\n return document.querySelector(el);\n } else if (el && el._isVue) {\n return el.$el;\n } else if (el instanceof HTMLElement) {\n return el;\n } else {\n return null;\n }\n}\n//# sourceMappingURL=util.js.map","// Extensions\nimport { Service } from '../service'; // Utilities\n\nimport * as easingPatterns from './easing-patterns';\nimport { getContainer, getOffset } from './util';\nexport default function goTo(_target, _settings = {}) {\n const settings = {\n container: document.scrollingElement || document.body || document.documentElement,\n duration: 500,\n offset: 0,\n easing: 'easeInOutCubic',\n appOffset: true,\n ..._settings\n };\n const container = getContainer(settings.container);\n /* istanbul ignore else */\n\n if (settings.appOffset && goTo.framework.application) {\n const isDrawer = container.classList.contains('v-navigation-drawer');\n const isClipped = container.classList.contains('v-navigation-drawer--clipped');\n const {\n bar,\n top\n } = goTo.framework.application;\n settings.offset += bar;\n /* istanbul ignore else */\n\n if (!isDrawer || isClipped) settings.offset += top;\n }\n\n const startTime = performance.now();\n let targetLocation;\n\n if (typeof _target === 'number') {\n targetLocation = getOffset(_target) - settings.offset;\n } else {\n targetLocation = getOffset(_target) - getOffset(container) - settings.offset;\n }\n\n const startLocation = container.scrollTop;\n if (targetLocation === startLocation) return Promise.resolve(targetLocation);\n const ease = typeof settings.easing === 'function' ? settings.easing : easingPatterns[settings.easing];\n /* istanbul ignore else */\n\n if (!ease) throw new TypeError(`Easing function \"${settings.easing}\" not found.`); // Cannot be tested properly in jsdom\n\n /* istanbul ignore next */\n\n return new Promise(resolve => requestAnimationFrame(function step(currentTime) {\n const timeElapsed = currentTime - startTime;\n const progress = Math.abs(settings.duration ? Math.min(timeElapsed / settings.duration, 1) : 1);\n container.scrollTop = Math.floor(startLocation + (targetLocation - startLocation) * ease(progress));\n const clientHeight = container === document.body ? document.documentElement.clientHeight : container.clientHeight;\n const reachBottom = clientHeight + container.scrollTop >= container.scrollHeight;\n\n if (progress === 1 || // Need to go lower but reach bottom\n targetLocation > container.scrollTop && reachBottom) {\n return resolve(targetLocation);\n }\n\n requestAnimationFrame(step);\n }));\n}\ngoTo.framework = {};\n\ngoTo.init = () => {};\n\nexport class Goto extends Service {\n constructor() {\n super();\n return goTo;\n }\n\n}\nGoto.property = 'goTo';\n//# sourceMappingURL=index.js.map","import Vue from 'vue';\nexport function createSimpleFunctional(c, el = 'div', name) {\n return Vue.extend({\n name: name || c.replace(/__/g, '-'),\n functional: true,\n props: {\n tag: {\n type: String,\n default: el\n }\n },\n\n render(h, {\n data,\n props,\n children\n }) {\n data.staticClass = `${c} ${data.staticClass || ''}`.trim();\n return h(props.tag, data, children);\n }\n\n });\n}\nexport function directiveConfig(binding, defaults = {}) {\n return { ...defaults,\n ...binding.modifiers,\n value: binding.arg,\n ...(binding.value || {})\n };\n}\nexport function addOnceEventListener(el, eventName, cb, options = false) {\n const once = event => {\n cb(event);\n el.removeEventListener(eventName, once, options);\n };\n\n el.addEventListener(eventName, once, options);\n}\nlet passiveSupported = false;\n\ntry {\n if (typeof window !== 'undefined') {\n const testListenerOpts = Object.defineProperty({}, 'passive', {\n get: () => {\n passiveSupported = true;\n }\n });\n window.addEventListener('testListener', testListenerOpts, testListenerOpts);\n window.removeEventListener('testListener', testListenerOpts, testListenerOpts);\n }\n} catch (e) {\n console.warn(e);\n}\n/* eslint-disable-line no-console */\n\n\nexport { passiveSupported };\nexport function addPassiveEventListener(el, event, cb, options) {\n el.addEventListener(event, cb, passiveSupported ? options : false);\n}\nexport function getNestedValue(obj, path, fallback) {\n const last = path.length - 1;\n if (last < 0) return obj === undefined ? fallback : obj;\n\n for (let i = 0; i < last; i++) {\n if (obj == null) {\n return fallback;\n }\n\n obj = obj[path[i]];\n }\n\n if (obj == null) return fallback;\n return obj[path[last]] === undefined ? fallback : obj[path[last]];\n}\nexport function deepEqual(a, b) {\n if (a === b) return true;\n\n if (a instanceof Date && b instanceof Date && a.getTime() !== b.getTime()) {\n // If the values are Date, compare them as timestamps\n return false;\n }\n\n if (a !== Object(a) || b !== Object(b)) {\n // If the values aren't objects, they were already checked for equality\n return false;\n }\n\n const props = Object.keys(a);\n\n if (props.length !== Object.keys(b).length) {\n // Different number of props, don't bother to check\n return false;\n }\n\n return props.every(p => deepEqual(a[p], b[p]));\n}\nexport function getObjectValueByPath(obj, path, fallback) {\n // credit: http://stackoverflow.com/questions/6491463/accessing-nested-javascript-objects-with-string-key#comment55278413_6491621\n if (obj == null || !path || typeof path !== 'string') return fallback;\n if (obj[path] !== undefined) return obj[path];\n path = path.replace(/\\[(\\w+)\\]/g, '.$1'); // convert indexes to properties\n\n path = path.replace(/^\\./, ''); // strip a leading dot\n\n return getNestedValue(obj, path.split('.'), fallback);\n}\nexport function getPropertyFromItem(item, property, fallback) {\n if (property == null) return item === undefined ? fallback : item;\n if (item !== Object(item)) return fallback === undefined ? item : fallback;\n if (typeof property === 'string') return getObjectValueByPath(item, property, fallback);\n if (Array.isArray(property)) return getNestedValue(item, property, fallback);\n if (typeof property !== 'function') return fallback;\n const value = property(item, fallback);\n return typeof value === 'undefined' ? fallback : value;\n}\nexport function createRange(length) {\n return Array.from({\n length\n }, (v, k) => k);\n}\nexport function getZIndex(el) {\n if (!el || el.nodeType !== Node.ELEMENT_NODE) return 0;\n const index = +window.getComputedStyle(el).getPropertyValue('z-index');\n if (!index) return getZIndex(el.parentNode);\n return index;\n}\nexport function filterObjectOnKeys(obj, keys) {\n const filtered = {};\n\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n\n if (typeof obj[key] !== 'undefined') {\n filtered[key] = obj[key];\n }\n }\n\n return filtered;\n}\nexport function convertToUnit(str, unit = 'px') {\n if (str == null || str === '') {\n return undefined;\n } else if (isNaN(+str)) {\n return String(str);\n } else {\n return `${Number(str)}${unit}`;\n }\n}\nexport function kebabCase(str) {\n return (str || '').replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();\n}\nexport function isObject(obj) {\n return obj !== null && typeof obj === 'object';\n} // KeyboardEvent.keyCode aliases\n\nexport const keyCodes = Object.freeze({\n enter: 13,\n tab: 9,\n delete: 46,\n esc: 27,\n space: 32,\n up: 38,\n down: 40,\n left: 37,\n right: 39,\n end: 35,\n home: 36,\n del: 46,\n backspace: 8,\n insert: 45,\n pageup: 33,\n pagedown: 34,\n shift: 16\n});\n/**\n * This remaps internal names like '$cancel' or '$vuetify.icons.cancel'\n * to the current name or component for that icon.\n */\n\nexport function remapInternalIcon(vm, iconName) {\n // Look for custom component in the configuration\n const component = vm.$vuetify.icons.component; // Look for overrides\n\n if (iconName.startsWith('$')) {\n // Get the target icon name\n const iconPath = `$vuetify.icons.values.${iconName.split('$').pop().split('.').pop()}`; // Now look up icon indirection name,\n // e.g. '$vuetify.icons.values.cancel'\n\n const override = getObjectValueByPath(vm, iconPath, iconName);\n if (typeof override === 'string') iconName = override;else return override;\n }\n\n if (component == null) {\n return iconName;\n }\n\n return {\n component,\n props: {\n icon: iconName\n }\n };\n}\nexport function keys(o) {\n return Object.keys(o);\n}\n/**\n * Camelize a hyphen-delimited string.\n */\n\nconst camelizeRE = /-(\\w)/g;\nexport const camelize = str => {\n return str.replace(camelizeRE, (_, c) => c ? c.toUpperCase() : '');\n};\n/**\n * Returns the set difference of B and A, i.e. the set of elements in B but not in A\n */\n\nexport function arrayDiff(a, b) {\n const diff = [];\n\n for (let i = 0; i < b.length; i++) {\n if (a.indexOf(b[i]) < 0) diff.push(b[i]);\n }\n\n return diff;\n}\n/**\n * Makes the first character of a string uppercase\n */\n\nexport function upperFirst(str) {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\nexport function groupItems(items, groupBy, groupDesc) {\n const key = groupBy[0];\n const groups = [];\n let current;\n\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n const val = getObjectValueByPath(item, key, null);\n\n if (current !== val) {\n current = val;\n groups.push({\n name: val !== null && val !== void 0 ? val : '',\n items: []\n });\n }\n\n groups[groups.length - 1].items.push(item);\n }\n\n return groups;\n}\nexport function wrapInArray(v) {\n return v != null ? Array.isArray(v) ? v : [v] : [];\n}\nexport function sortItems(items, sortBy, sortDesc, locale, customSorters) {\n if (sortBy === null || !sortBy.length) return items;\n const stringCollator = new Intl.Collator(locale, {\n sensitivity: 'accent',\n usage: 'sort'\n });\n return items.sort((a, b) => {\n for (let i = 0; i < sortBy.length; i++) {\n const sortKey = sortBy[i];\n let sortA = getObjectValueByPath(a, sortKey);\n let sortB = getObjectValueByPath(b, sortKey);\n\n if (sortDesc[i]) {\n [sortA, sortB] = [sortB, sortA];\n }\n\n if (customSorters && customSorters[sortKey]) {\n const customResult = customSorters[sortKey](sortA, sortB);\n if (!customResult) continue;\n return customResult;\n } // Check if both cannot be evaluated\n\n\n if (sortA === null && sortB === null) {\n continue;\n } // Dates should be compared numerically\n\n\n if (sortA instanceof Date && sortB instanceof Date) {\n return sortA.getTime() - sortB.getTime();\n }\n\n [sortA, sortB] = [sortA, sortB].map(s => (s || '').toString().toLocaleLowerCase());\n\n if (sortA !== sortB) {\n if (!isNaN(sortA) && !isNaN(sortB)) return Number(sortA) - Number(sortB);\n return stringCollator.compare(sortA, sortB);\n }\n }\n\n return 0;\n });\n}\nexport function defaultFilter(value, search, item) {\n return value != null && search != null && typeof value !== 'boolean' && value.toString().toLocaleLowerCase().indexOf(search.toLocaleLowerCase()) !== -1;\n}\nexport function searchItems(items, search) {\n if (!search) return items;\n search = search.toString().toLowerCase();\n if (search.trim() === '') return items;\n return items.filter(item => Object.keys(item).some(key => defaultFilter(getObjectValueByPath(item, key), search, item)));\n}\n/**\n * Returns:\n * - 'normal' for old style slots - `