{"version":3,"file":"main.js","sources":["../../node_modules/@glidejs/glide/dist/glide.modular.esm.js","../../scripts/modules/sharePage.js","../../scripts/modules/scrollToTop.js","../../scripts/modules/pristine.js","../../scripts/modules/topNav.js","../../scripts/main.js","../../scripts/modules/detectDevice.js","../../scripts/modules/cookie.js","../../scripts/modules/logoSlider.js","../../scripts/modules/scrollAnimations.js","../../scripts/modules/chaptersList.js","../../scripts/modules/actionBar.js","../../scripts/modules/fileUploader.js","../../scripts/modules/toggleVisibility.js","../../scripts/modules/formInputLinks.js","../../scripts/modules/formValidation.js"],"sourcesContent":["/*!\n * Glide.js v3.4.1\n * (c) 2013-2019 Jędrzej Chałubek (http://jedrzejchalubek.com/)\n * Released under the MIT License.\n */\n\nvar defaults = {\n /**\n * Type of the movement.\n *\n * Available types:\n * `slider` - Rewinds slider to the start/end when it reaches the first or last slide.\n * `carousel` - Changes slides without starting over when it reaches the first or last slide.\n *\n * @type {String}\n */\n type: 'slider',\n\n /**\n * Start at specific slide number defined with zero-based index.\n *\n * @type {Number}\n */\n startAt: 0,\n\n /**\n * A number of slides visible on the single viewport.\n *\n * @type {Number}\n */\n perView: 1,\n\n /**\n * Focus currently active slide at a specified position in the track.\n *\n * Available inputs:\n * `center` - Current slide will be always focused at the center of a track.\n * `0,1,2,3...` - Current slide will be focused on the specified zero-based index.\n *\n * @type {String|Number}\n */\n focusAt: 0,\n\n /**\n * A size of the gap added between slides.\n *\n * @type {Number}\n */\n gap: 10,\n\n /**\n * Change slides after a specified interval. Use `false` for turning off autoplay.\n *\n * @type {Number|Boolean}\n */\n autoplay: false,\n\n /**\n * Stop autoplay on mouseover event.\n *\n * @type {Boolean}\n */\n hoverpause: true,\n\n /**\n * Allow for changing slides with left and right keyboard arrows.\n *\n * @type {Boolean}\n */\n keyboard: true,\n\n /**\n * Stop running `perView` number of slides from the end. Use this\n * option if you don't want to have an empty space after\n * a slider. Works only with `slider` type and a\n * non-centered `focusAt` setting.\n *\n * @type {Boolean}\n */\n bound: false,\n\n /**\n * Minimal swipe distance needed to change the slide. Use `false` for turning off a swiping.\n *\n * @type {Number|Boolean}\n */\n swipeThreshold: 80,\n\n /**\n * Minimal mouse drag distance needed to change the slide. Use `false` for turning off a dragging.\n *\n * @type {Number|Boolean}\n */\n dragThreshold: 120,\n\n /**\n * A maximum number of slides to which movement will be made on swiping or dragging. Use `false` for unlimited.\n *\n * @type {Number|Boolean}\n */\n perTouch: false,\n\n /**\n * Moving distance ratio of the slides on a swiping and dragging.\n *\n * @type {Number}\n */\n touchRatio: 0.5,\n\n /**\n * Angle required to activate slides moving on swiping or dragging.\n *\n * @type {Number}\n */\n touchAngle: 45,\n\n /**\n * Duration of the animation in milliseconds.\n *\n * @type {Number}\n */\n animationDuration: 400,\n\n /**\n * Allows looping the `slider` type. Slider will rewind to the first/last slide when it's at the start/end.\n *\n * @type {Boolean}\n */\n rewind: true,\n\n /**\n * Duration of the rewinding animation of the `slider` type in milliseconds.\n *\n * @type {Number}\n */\n rewindDuration: 800,\n\n /**\n * Easing function for the animation.\n *\n * @type {String}\n */\n animationTimingFunc: 'cubic-bezier(.165, .840, .440, 1)',\n\n /**\n * Throttle costly events at most once per every wait milliseconds.\n *\n * @type {Number}\n */\n throttle: 10,\n\n /**\n * Moving direction mode.\n *\n * Available inputs:\n * - 'ltr' - left to right movement,\n * - 'rtl' - right to left movement.\n *\n * @type {String}\n */\n direction: 'ltr',\n\n /**\n * The distance value of the next and previous viewports which\n * have to peek in the current view. Accepts number and\n * pixels as a string. Left and right peeking can be\n * set up separately with a directions object.\n *\n * For example:\n * `100` - Peek 100px on the both sides.\n * { before: 100, after: 50 }` - Peek 100px on the left side and 50px on the right side.\n *\n * @type {Number|String|Object}\n */\n peek: 0,\n\n /**\n * Collection of options applied at specified media breakpoints.\n * For example: display two slides per view under 800px.\n * `{\n * '800px': {\n * perView: 2\n * }\n * }`\n */\n breakpoints: {},\n\n /**\n * Collection of internally used HTML classes.\n *\n * @todo Refactor `slider` and `carousel` properties to single `type: { slider: '', carousel: '' }` object\n * @type {Object}\n */\n classes: {\n direction: {\n ltr: 'glide--ltr',\n rtl: 'glide--rtl'\n },\n slider: 'glide--slider',\n carousel: 'glide--carousel',\n swipeable: 'glide--swipeable',\n dragging: 'glide--dragging',\n cloneSlide: 'glide__slide--clone',\n activeNav: 'glide__bullet--active',\n activeSlide: 'glide__slide--active',\n disabledArrow: 'glide__arrow--disabled'\n }\n};\n\n/**\n * Outputs warning message to the bowser console.\n *\n * @param {String} msg\n * @return {Void}\n */\nfunction warn(msg) {\n console.error(\"[Glide warn]: \" + msg);\n}\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) {\n return typeof obj;\n} : function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n};\n\nvar classCallCheck = function (instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n};\n\nvar createClass = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n }\n\n return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);\n if (staticProps) defineProperties(Constructor, staticProps);\n return Constructor;\n };\n}();\n\nvar _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n};\n\nvar get = function get(object, property, receiver) {\n if (object === null) object = Function.prototype;\n var desc = Object.getOwnPropertyDescriptor(object, property);\n\n if (desc === undefined) {\n var parent = Object.getPrototypeOf(object);\n\n if (parent === null) {\n return undefined;\n } else {\n return get(parent, property, receiver);\n }\n } else if (\"value\" in desc) {\n return desc.value;\n } else {\n var getter = desc.get;\n\n if (getter === undefined) {\n return undefined;\n }\n\n return getter.call(receiver);\n }\n};\n\nvar inherits = function (subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n }\n\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;\n};\n\nvar possibleConstructorReturn = function (self, call) {\n if (!self) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n\n return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self;\n};\n\n/**\n * Converts value entered as number\n * or string to integer value.\n *\n * @param {String} value\n * @returns {Number}\n */\nfunction toInt(value) {\n return parseInt(value);\n}\n\n/**\n * Converts value entered as number\n * or string to flat value.\n *\n * @param {String} value\n * @returns {Number}\n */\nfunction toFloat(value) {\n return parseFloat(value);\n}\n\n/**\n * Indicates whether the specified value is a string.\n *\n * @param {*} value\n * @return {Boolean}\n */\nfunction isString(value) {\n return typeof value === 'string';\n}\n\n/**\n * Indicates whether the specified value is an object.\n *\n * @param {*} value\n * @return {Boolean}\n *\n * @see https://github.com/jashkenas/underscore\n */\nfunction isObject(value) {\n var type = typeof value === 'undefined' ? 'undefined' : _typeof(value);\n\n return type === 'function' || type === 'object' && !!value; // eslint-disable-line no-mixed-operators\n}\n\n/**\n * Indicates whether the specified value is a number.\n *\n * @param {*} value\n * @return {Boolean}\n */\nfunction isNumber(value) {\n return typeof value === 'number';\n}\n\n/**\n * Indicates whether the specified value is a function.\n *\n * @param {*} value\n * @return {Boolean}\n */\nfunction isFunction(value) {\n return typeof value === 'function';\n}\n\n/**\n * Indicates whether the specified value is undefined.\n *\n * @param {*} value\n * @return {Boolean}\n */\nfunction isUndefined(value) {\n return typeof value === 'undefined';\n}\n\n/**\n * Indicates whether the specified value is an array.\n *\n * @param {*} value\n * @return {Boolean}\n */\nfunction isArray(value) {\n return value.constructor === Array;\n}\n\n/**\n * Creates and initializes specified collection of extensions.\n * Each extension receives access to instance of glide and rest of components.\n *\n * @param {Object} glide\n * @param {Object} extensions\n *\n * @returns {Object}\n */\nfunction mount(glide, extensions, events) {\n var components = {};\n\n for (var name in extensions) {\n if (isFunction(extensions[name])) {\n components[name] = extensions[name](glide, components, events);\n } else {\n warn('Extension must be a function');\n }\n }\n\n for (var _name in components) {\n if (isFunction(components[_name].mount)) {\n components[_name].mount();\n }\n }\n\n return components;\n}\n\n/**\n * Defines getter and setter property on the specified object.\n *\n * @param {Object} obj Object where property has to be defined.\n * @param {String} prop Name of the defined property.\n * @param {Object} definition Get and set definitions for the property.\n * @return {Void}\n */\nfunction define(obj, prop, definition) {\n Object.defineProperty(obj, prop, definition);\n}\n\n/**\n * Sorts aphabetically object keys.\n *\n * @param {Object} obj\n * @return {Object}\n */\nfunction sortKeys(obj) {\n return Object.keys(obj).sort().reduce(function (r, k) {\n r[k] = obj[k];\n\n return r[k], r;\n }, {});\n}\n\n/**\n * Merges passed settings object with default options.\n *\n * @param {Object} defaults\n * @param {Object} settings\n * @return {Object}\n */\nfunction mergeOptions(defaults, settings) {\n var options = _extends({}, defaults, settings);\n\n // `Object.assign` do not deeply merge objects, so we\n // have to do it manually for every nested object\n // in options. Although it does not look smart,\n // it's smaller and faster than some fancy\n // merging deep-merge algorithm script.\n if (settings.hasOwnProperty('classes')) {\n options.classes = _extends({}, defaults.classes, settings.classes);\n\n if (settings.classes.hasOwnProperty('direction')) {\n options.classes.direction = _extends({}, defaults.classes.direction, settings.classes.direction);\n }\n }\n\n if (settings.hasOwnProperty('breakpoints')) {\n options.breakpoints = _extends({}, defaults.breakpoints, settings.breakpoints);\n }\n\n return options;\n}\n\nvar EventsBus = function () {\n /**\n * Construct a EventBus instance.\n *\n * @param {Object} events\n */\n function EventsBus() {\n var events = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n classCallCheck(this, EventsBus);\n\n this.events = events;\n this.hop = events.hasOwnProperty;\n }\n\n /**\n * Adds listener to the specifed event.\n *\n * @param {String|Array} event\n * @param {Function} handler\n */\n\n\n createClass(EventsBus, [{\n key: 'on',\n value: function on(event, handler) {\n if (isArray(event)) {\n for (var i = 0; i < event.length; i++) {\n this.on(event[i], handler);\n }\n }\n\n // Create the event's object if not yet created\n if (!this.hop.call(this.events, event)) {\n this.events[event] = [];\n }\n\n // Add the handler to queue\n var index = this.events[event].push(handler) - 1;\n\n // Provide handle back for removal of event\n return {\n remove: function remove() {\n delete this.events[event][index];\n }\n };\n }\n\n /**\n * Runs registered handlers for specified event.\n *\n * @param {String|Array} event\n * @param {Object=} context\n */\n\n }, {\n key: 'emit',\n value: function emit(event, context) {\n if (isArray(event)) {\n for (var i = 0; i < event.length; i++) {\n this.emit(event[i], context);\n }\n }\n\n // If the event doesn't exist, or there's no handlers in queue, just leave\n if (!this.hop.call(this.events, event)) {\n return;\n }\n\n // Cycle through events queue, fire!\n this.events[event].forEach(function (item) {\n item(context || {});\n });\n }\n }]);\n return EventsBus;\n}();\n\nvar Glide = function () {\n /**\r\n * Construct glide.\r\n *\r\n * @param {String} selector\r\n * @param {Object} options\r\n */\n function Glide(selector) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n classCallCheck(this, Glide);\n\n this._c = {};\n this._t = [];\n this._e = new EventsBus();\n\n this.disabled = false;\n this.selector = selector;\n this.settings = mergeOptions(defaults, options);\n this.index = this.settings.startAt;\n }\n\n /**\r\n * Initializes glide.\r\n *\r\n * @param {Object} extensions Collection of extensions to initialize.\r\n * @return {Glide}\r\n */\n\n\n createClass(Glide, [{\n key: 'mount',\n value: function mount$$1() {\n var extensions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n this._e.emit('mount.before');\n\n if (isObject(extensions)) {\n this._c = mount(this, extensions, this._e);\n } else {\n warn('You need to provide a object on `mount()`');\n }\n\n this._e.emit('mount.after');\n\n return this;\n }\n\n /**\r\n * Collects an instance `translate` transformers.\r\n *\r\n * @param {Array} transformers Collection of transformers.\r\n * @return {Void}\r\n */\n\n }, {\n key: 'mutate',\n value: function mutate() {\n var transformers = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n\n if (isArray(transformers)) {\n this._t = transformers;\n } else {\n warn('You need to provide a array on `mutate()`');\n }\n\n return this;\n }\n\n /**\r\n * Updates glide with specified settings.\r\n *\r\n * @param {Object} settings\r\n * @return {Glide}\r\n */\n\n }, {\n key: 'update',\n value: function update() {\n var settings = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n this.settings = mergeOptions(this.settings, settings);\n\n if (settings.hasOwnProperty('startAt')) {\n this.index = settings.startAt;\n }\n\n this._e.emit('update');\n\n return this;\n }\n\n /**\r\n * Change slide with specified pattern. A pattern must be in the special format:\r\n * `>` - Move one forward\r\n * `<` - Move one backward\r\n * `={i}` - Go to {i} zero-based slide (eq. '=1', will go to second slide)\r\n * `>>` - Rewinds to end (last slide)\r\n * `<<` - Rewinds to start (first slide)\r\n *\r\n * @param {String} pattern\r\n * @return {Glide}\r\n */\n\n }, {\n key: 'go',\n value: function go(pattern) {\n this._c.Run.make(pattern);\n\n return this;\n }\n\n /**\r\n * Move track by specified distance.\r\n *\r\n * @param {String} distance\r\n * @return {Glide}\r\n */\n\n }, {\n key: 'move',\n value: function move(distance) {\n this._c.Transition.disable();\n this._c.Move.make(distance);\n\n return this;\n }\n\n /**\r\n * Destroy instance and revert all changes done by this._c.\r\n *\r\n * @return {Glide}\r\n */\n\n }, {\n key: 'destroy',\n value: function destroy() {\n this._e.emit('destroy');\n\n return this;\n }\n\n /**\r\n * Start instance autoplaying.\r\n *\r\n * @param {Boolean|Number} interval Run autoplaying with passed interval regardless of `autoplay` settings\r\n * @return {Glide}\r\n */\n\n }, {\n key: 'play',\n value: function play() {\n var interval = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n if (interval) {\n this.settings.autoplay = interval;\n }\n\n this._e.emit('play');\n\n return this;\n }\n\n /**\r\n * Stop instance autoplaying.\r\n *\r\n * @return {Glide}\r\n */\n\n }, {\n key: 'pause',\n value: function pause() {\n this._e.emit('pause');\n\n return this;\n }\n\n /**\r\n * Sets glide into a idle status.\r\n *\r\n * @return {Glide}\r\n */\n\n }, {\n key: 'disable',\n value: function disable() {\n this.disabled = true;\n\n return this;\n }\n\n /**\r\n * Sets glide into a active status.\r\n *\r\n * @return {Glide}\r\n */\n\n }, {\n key: 'enable',\n value: function enable() {\n this.disabled = false;\n\n return this;\n }\n\n /**\r\n * Adds cuutom event listener with handler.\r\n *\r\n * @param {String|Array} event\r\n * @param {Function} handler\r\n * @return {Glide}\r\n */\n\n }, {\n key: 'on',\n value: function on(event, handler) {\n this._e.on(event, handler);\n\n return this;\n }\n\n /**\r\n * Checks if glide is a precised type.\r\n *\r\n * @param {String} name\r\n * @return {Boolean}\r\n */\n\n }, {\n key: 'isType',\n value: function isType(name) {\n return this.settings.type === name;\n }\n\n /**\r\n * Gets value of the core options.\r\n *\r\n * @return {Object}\r\n */\n\n }, {\n key: 'settings',\n get: function get$$1() {\n return this._o;\n }\n\n /**\r\n * Sets value of the core options.\r\n *\r\n * @param {Object} o\r\n * @return {Void}\r\n */\n ,\n set: function set$$1(o) {\n if (isObject(o)) {\n this._o = o;\n } else {\n warn('Options must be an `object` instance.');\n }\n }\n\n /**\r\n * Gets current index of the slider.\r\n *\r\n * @return {Object}\r\n */\n\n }, {\n key: 'index',\n get: function get$$1() {\n return this._i;\n }\n\n /**\r\n * Sets current index a slider.\r\n *\r\n * @return {Object}\r\n */\n ,\n set: function set$$1(i) {\n this._i = toInt(i);\n }\n\n /**\r\n * Gets type name of the slider.\r\n *\r\n * @return {String}\r\n */\n\n }, {\n key: 'type',\n get: function get$$1() {\n return this.settings.type;\n }\n\n /**\r\n * Gets value of the idle status.\r\n *\r\n * @return {Boolean}\r\n */\n\n }, {\n key: 'disabled',\n get: function get$$1() {\n return this._d;\n }\n\n /**\r\n * Sets value of the idle status.\r\n *\r\n * @return {Boolean}\r\n */\n ,\n set: function set$$1(status) {\n this._d = !!status;\n }\n }]);\n return Glide;\n}();\n\nfunction Run (Glide, Components, Events) {\n var Run = {\n /**\n * Initializes autorunning of the glide.\n *\n * @return {Void}\n */\n mount: function mount() {\n this._o = false;\n },\n\n\n /**\n * Makes glides running based on the passed moving schema.\n *\n * @param {String} move\n */\n make: function make(move) {\n var _this = this;\n\n if (!Glide.disabled) {\n Glide.disable();\n\n this.move = move;\n\n Events.emit('run.before', this.move);\n\n this.calculate();\n\n Events.emit('run', this.move);\n\n Components.Transition.after(function () {\n if (_this.isStart()) {\n Events.emit('run.start', _this.move);\n }\n\n if (_this.isEnd()) {\n Events.emit('run.end', _this.move);\n }\n\n if (_this.isOffset('<') || _this.isOffset('>')) {\n _this._o = false;\n\n Events.emit('run.offset', _this.move);\n }\n\n Events.emit('run.after', _this.move);\n\n Glide.enable();\n });\n }\n },\n\n\n /**\n * Calculates current index based on defined move.\n *\n * @return {Void}\n */\n calculate: function calculate() {\n var move = this.move,\n length = this.length;\n var steps = move.steps,\n direction = move.direction;\n\n\n var countableSteps = isNumber(toInt(steps)) && toInt(steps) !== 0;\n\n switch (direction) {\n case '>':\n if (steps === '>') {\n Glide.index = length;\n } else if (this.isEnd()) {\n if (!(Glide.isType('slider') && !Glide.settings.rewind)) {\n this._o = true;\n\n Glide.index = 0;\n }\n } else if (countableSteps) {\n Glide.index += Math.min(length - Glide.index, -toInt(steps));\n } else {\n Glide.index++;\n }\n break;\n\n case '<':\n if (steps === '<') {\n Glide.index = 0;\n } else if (this.isStart()) {\n if (!(Glide.isType('slider') && !Glide.settings.rewind)) {\n this._o = true;\n\n Glide.index = length;\n }\n } else if (countableSteps) {\n Glide.index -= Math.min(Glide.index, toInt(steps));\n } else {\n Glide.index--;\n }\n break;\n\n case '=':\n Glide.index = steps;\n break;\n\n default:\n warn('Invalid direction pattern [' + direction + steps + '] has been used');\n break;\n }\n },\n\n\n /**\n * Checks if we are on the first slide.\n *\n * @return {Boolean}\n */\n isStart: function isStart() {\n return Glide.index === 0;\n },\n\n\n /**\n * Checks if we are on the last slide.\n *\n * @return {Boolean}\n */\n isEnd: function isEnd() {\n return Glide.index === this.length;\n },\n\n\n /**\n * Checks if we are making a offset run.\n *\n * @param {String} direction\n * @return {Boolean}\n */\n isOffset: function isOffset(direction) {\n return this._o && this.move.direction === direction;\n }\n };\n\n define(Run, 'move', {\n /**\n * Gets value of the move schema.\n *\n * @returns {Object}\n */\n get: function get() {\n return this._m;\n },\n\n\n /**\n * Sets value of the move schema.\n *\n * @returns {Object}\n */\n set: function set(value) {\n var step = value.substr(1);\n\n this._m = {\n direction: value.substr(0, 1),\n steps: step ? toInt(step) ? toInt(step) : step : 0\n };\n }\n });\n\n define(Run, 'length', {\n /**\n * Gets value of the running distance based\n * on zero-indexing number of slides.\n *\n * @return {Number}\n */\n get: function get() {\n var settings = Glide.settings;\n var length = Components.Html.slides.length;\n\n // If the `bound` option is acitve, a maximum running distance should be\n // reduced by `perView` and `focusAt` settings. Running distance\n // should end before creating an empty space after instance.\n\n if (Glide.isType('slider') && settings.focusAt !== 'center' && settings.bound) {\n return length - 1 - (toInt(settings.perView) - 1) + toInt(settings.focusAt);\n }\n\n return length - 1;\n }\n });\n\n define(Run, 'offset', {\n /**\n * Gets status of the offsetting flag.\n *\n * @return {Boolean}\n */\n get: function get() {\n return this._o;\n }\n });\n\n return Run;\n}\n\n/**\n * Returns a current time.\n *\n * @return {Number}\n */\nfunction now() {\n return new Date().getTime();\n}\n\n/**\n * Returns a function, that, when invoked, will only be triggered\n * at most once during a given window of time.\n *\n * @param {Function} func\n * @param {Number} wait\n * @param {Object=} options\n * @return {Function}\n *\n * @see https://github.com/jashkenas/underscore\n */\nfunction throttle(func, wait, options) {\n var timeout = void 0,\n context = void 0,\n args = void 0,\n result = void 0;\n var previous = 0;\n if (!options) options = {};\n\n var later = function later() {\n previous = options.leading === false ? 0 : now();\n timeout = null;\n result = func.apply(context, args);\n if (!timeout) context = args = null;\n };\n\n var throttled = function throttled() {\n var at = now();\n if (!previous && options.leading === false) previous = at;\n var remaining = wait - (at - previous);\n context = this;\n args = arguments;\n if (remaining <= 0 || remaining > wait) {\n if (timeout) {\n clearTimeout(timeout);\n timeout = null;\n }\n previous = at;\n result = func.apply(context, args);\n if (!timeout) context = args = null;\n } else if (!timeout && options.trailing !== false) {\n timeout = setTimeout(later, remaining);\n }\n return result;\n };\n\n throttled.cancel = function () {\n clearTimeout(timeout);\n previous = 0;\n timeout = context = args = null;\n };\n\n return throttled;\n}\n\nvar MARGIN_TYPE = {\n ltr: ['marginLeft', 'marginRight'],\n rtl: ['marginRight', 'marginLeft']\n};\n\nfunction Gaps (Glide, Components, Events) {\n var Gaps = {\n /**\n * Applies gaps between slides. First and last\n * slides do not receive it's edge margins.\n *\n * @param {HTMLCollection} slides\n * @return {Void}\n */\n apply: function apply(slides) {\n for (var i = 0, len = slides.length; i < len; i++) {\n var style = slides[i].style;\n var direction = Components.Direction.value;\n\n if (i !== 0) {\n style[MARGIN_TYPE[direction][0]] = this.value / 2 + 'px';\n } else {\n style[MARGIN_TYPE[direction][0]] = '';\n }\n\n if (i !== slides.length - 1) {\n style[MARGIN_TYPE[direction][1]] = this.value / 2 + 'px';\n } else {\n style[MARGIN_TYPE[direction][1]] = '';\n }\n }\n },\n\n\n /**\n * Removes gaps from the slides.\n *\n * @param {HTMLCollection} slides\n * @returns {Void}\n */\n remove: function remove(slides) {\n for (var i = 0, len = slides.length; i < len; i++) {\n var style = slides[i].style;\n\n style.marginLeft = '';\n style.marginRight = '';\n }\n }\n };\n\n define(Gaps, 'value', {\n /**\n * Gets value of the gap.\n *\n * @returns {Number}\n */\n get: function get() {\n return toInt(Glide.settings.gap);\n }\n });\n\n define(Gaps, 'grow', {\n /**\n * Gets additional dimentions value caused by gaps.\n * Used to increase width of the slides wrapper.\n *\n * @returns {Number}\n */\n get: function get() {\n return Gaps.value * (Components.Sizes.length - 1);\n }\n });\n\n define(Gaps, 'reductor', {\n /**\n * Gets reduction value caused by gaps.\n * Used to subtract width of the slides.\n *\n * @returns {Number}\n */\n get: function get() {\n var perView = Glide.settings.perView;\n\n return Gaps.value * (perView - 1) / perView;\n }\n });\n\n /**\n * Apply calculated gaps:\n * - after building, so slides (including clones) will receive proper margins\n * - on updating via API, to recalculate gaps with new options\n */\n Events.on(['build.after', 'update'], throttle(function () {\n Gaps.apply(Components.Html.wrapper.children);\n }, 30));\n\n /**\n * Remove gaps:\n * - on destroying to bring markup to its inital state\n */\n Events.on('destroy', function () {\n Gaps.remove(Components.Html.wrapper.children);\n });\n\n return Gaps;\n}\n\n/**\n * Finds siblings nodes of the passed node.\n *\n * @param {Element} node\n * @return {Array}\n */\nfunction siblings(node) {\n if (node && node.parentNode) {\n var n = node.parentNode.firstChild;\n var matched = [];\n\n for (; n; n = n.nextSibling) {\n if (n.nodeType === 1 && n !== node) {\n matched.push(n);\n }\n }\n\n return matched;\n }\n\n return [];\n}\n\n/**\n * Checks if passed node exist and is a valid element.\n *\n * @param {Element} node\n * @return {Boolean}\n */\nfunction exist(node) {\n if (node && node instanceof window.HTMLElement) {\n return true;\n }\n\n return false;\n}\n\nvar TRACK_SELECTOR = '[data-glide-el=\"track\"]';\n\nfunction Html (Glide, Components) {\n var Html = {\n /**\n * Setup slider HTML nodes.\n *\n * @param {Glide} glide\n */\n mount: function mount() {\n this.root = Glide.selector;\n this.track = this.root.querySelector(TRACK_SELECTOR);\n this.slides = Array.prototype.slice.call(this.wrapper.children).filter(function (slide) {\n return !slide.classList.contains(Glide.settings.classes.cloneSlide);\n });\n }\n };\n\n define(Html, 'root', {\n /**\n * Gets node of the glide main element.\n *\n * @return {Object}\n */\n get: function get() {\n return Html._r;\n },\n\n\n /**\n * Sets node of the glide main element.\n *\n * @return {Object}\n */\n set: function set(r) {\n if (isString(r)) {\n r = document.querySelector(r);\n }\n\n if (exist(r)) {\n Html._r = r;\n } else {\n warn('Root element must be a existing Html node');\n }\n }\n });\n\n define(Html, 'track', {\n /**\n * Gets node of the glide track with slides.\n *\n * @return {Object}\n */\n get: function get() {\n return Html._t;\n },\n\n\n /**\n * Sets node of the glide track with slides.\n *\n * @return {Object}\n */\n set: function set(t) {\n if (exist(t)) {\n Html._t = t;\n } else {\n warn('Could not find track element. Please use ' + TRACK_SELECTOR + ' attribute.');\n }\n }\n });\n\n define(Html, 'wrapper', {\n /**\n * Gets node of the slides wrapper.\n *\n * @return {Object}\n */\n get: function get() {\n return Html.track.children[0];\n }\n });\n\n return Html;\n}\n\nfunction Peek (Glide, Components, Events) {\n var Peek = {\n /**\n * Setups how much to peek based on settings.\n *\n * @return {Void}\n */\n mount: function mount() {\n this.value = Glide.settings.peek;\n }\n };\n\n define(Peek, 'value', {\n /**\n * Gets value of the peek.\n *\n * @returns {Number|Object}\n */\n get: function get() {\n return Peek._v;\n },\n\n\n /**\n * Sets value of the peek.\n *\n * @param {Number|Object} value\n * @return {Void}\n */\n set: function set(value) {\n if (isObject(value)) {\n value.before = toInt(value.before);\n value.after = toInt(value.after);\n } else {\n value = toInt(value);\n }\n\n Peek._v = value;\n }\n });\n\n define(Peek, 'reductor', {\n /**\n * Gets reduction value caused by peek.\n *\n * @returns {Number}\n */\n get: function get() {\n var value = Peek.value;\n var perView = Glide.settings.perView;\n\n if (isObject(value)) {\n return value.before / perView + value.after / perView;\n }\n\n return value * 2 / perView;\n }\n });\n\n /**\n * Recalculate peeking sizes on:\n * - when resizing window to update to proper percents\n */\n Events.on(['resize', 'update'], function () {\n Peek.mount();\n });\n\n return Peek;\n}\n\nfunction Move (Glide, Components, Events) {\n var Move = {\n /**\n * Constructs move component.\n *\n * @returns {Void}\n */\n mount: function mount() {\n this._o = 0;\n },\n\n\n /**\n * Calculates a movement value based on passed offset and currently active index.\n *\n * @param {Number} offset\n * @return {Void}\n */\n make: function make() {\n var _this = this;\n\n var offset = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n\n this.offset = offset;\n\n Events.emit('move', {\n movement: this.value\n });\n\n Components.Transition.after(function () {\n Events.emit('move.after', {\n movement: _this.value\n });\n });\n }\n };\n\n define(Move, 'offset', {\n /**\n * Gets an offset value used to modify current translate.\n *\n * @return {Object}\n */\n get: function get() {\n return Move._o;\n },\n\n\n /**\n * Sets an offset value used to modify current translate.\n *\n * @return {Object}\n */\n set: function set(value) {\n Move._o = !isUndefined(value) ? toInt(value) : 0;\n }\n });\n\n define(Move, 'translate', {\n /**\n * Gets a raw movement value.\n *\n * @return {Number}\n */\n get: function get() {\n return Components.Sizes.slideWidth * Glide.index;\n }\n });\n\n define(Move, 'value', {\n /**\n * Gets an actual movement value corrected by offset.\n *\n * @return {Number}\n */\n get: function get() {\n var offset = this.offset;\n var translate = this.translate;\n\n if (Components.Direction.is('rtl')) {\n return translate + offset;\n }\n\n return translate - offset;\n }\n });\n\n /**\n * Make movement to proper slide on:\n * - before build, so glide will start at `startAt` index\n * - on each standard run to move to newly calculated index\n */\n Events.on(['build.before', 'run'], function () {\n Move.make();\n });\n\n return Move;\n}\n\nfunction Sizes (Glide, Components, Events) {\n var Sizes = {\n /**\n * Setups dimentions of slides.\n *\n * @return {Void}\n */\n setupSlides: function setupSlides() {\n var width = this.slideWidth + 'px';\n var slides = Components.Html.slides;\n\n for (var i = 0; i < slides.length; i++) {\n slides[i].style.width = width;\n }\n },\n\n\n /**\n * Setups dimentions of slides wrapper.\n *\n * @return {Void}\n */\n setupWrapper: function setupWrapper(dimention) {\n Components.Html.wrapper.style.width = this.wrapperSize + 'px';\n },\n\n\n /**\n * Removes applied styles from HTML elements.\n *\n * @returns {Void}\n */\n remove: function remove() {\n var slides = Components.Html.slides;\n\n for (var i = 0; i < slides.length; i++) {\n slides[i].style.width = '';\n }\n\n Components.Html.wrapper.style.width = '';\n }\n };\n\n define(Sizes, 'length', {\n /**\n * Gets count number of the slides.\n *\n * @return {Number}\n */\n get: function get() {\n return Components.Html.slides.length;\n }\n });\n\n define(Sizes, 'width', {\n /**\n * Gets width value of the glide.\n *\n * @return {Number}\n */\n get: function get() {\n return Components.Html.root.offsetWidth;\n }\n });\n\n define(Sizes, 'wrapperSize', {\n /**\n * Gets size of the slides wrapper.\n *\n * @return {Number}\n */\n get: function get() {\n return Sizes.slideWidth * Sizes.length + Components.Gaps.grow + Components.Clones.grow;\n }\n });\n\n define(Sizes, 'slideWidth', {\n /**\n * Gets width value of the single slide.\n *\n * @return {Number}\n */\n get: function get() {\n return Sizes.width / Glide.settings.perView - Components.Peek.reductor - Components.Gaps.reductor;\n }\n });\n\n /**\n * Apply calculated glide's dimensions:\n * - before building, so other dimentions (e.g. translate) will be calculated propertly\n * - when resizing window to recalculate sildes dimensions\n * - on updating via API, to calculate dimensions based on new options\n */\n Events.on(['build.before', 'resize', 'update'], function () {\n Sizes.setupSlides();\n Sizes.setupWrapper();\n });\n\n /**\n * Remove calculated glide's dimensions:\n * - on destoting to bring markup to its inital state\n */\n Events.on('destroy', function () {\n Sizes.remove();\n });\n\n return Sizes;\n}\n\nfunction Build (Glide, Components, Events) {\n var Build = {\n /**\n * Init glide building. Adds classes, sets\n * dimensions and setups initial state.\n *\n * @return {Void}\n */\n mount: function mount() {\n Events.emit('build.before');\n\n this.typeClass();\n this.activeClass();\n\n Events.emit('build.after');\n },\n\n\n /**\n * Adds `type` class to the glide element.\n *\n * @return {Void}\n */\n typeClass: function typeClass() {\n Components.Html.root.classList.add(Glide.settings.classes[Glide.settings.type]);\n },\n\n\n /**\n * Sets active class to current slide.\n *\n * @return {Void}\n */\n activeClass: function activeClass() {\n var classes = Glide.settings.classes;\n var slide = Components.Html.slides[Glide.index];\n\n if (slide) {\n slide.classList.add(classes.activeSlide);\n\n siblings(slide).forEach(function (sibling) {\n sibling.classList.remove(classes.activeSlide);\n });\n }\n },\n\n\n /**\n * Removes HTML classes applied at building.\n *\n * @return {Void}\n */\n removeClasses: function removeClasses() {\n var classes = Glide.settings.classes;\n\n Components.Html.root.classList.remove(classes[Glide.settings.type]);\n\n Components.Html.slides.forEach(function (sibling) {\n sibling.classList.remove(classes.activeSlide);\n });\n }\n };\n\n /**\n * Clear building classes:\n * - on destroying to bring HTML to its initial state\n * - on updating to remove classes before remounting component\n */\n Events.on(['destroy', 'update'], function () {\n Build.removeClasses();\n });\n\n /**\n * Remount component:\n * - on resizing of the window to calculate new dimentions\n * - on updating settings via API\n */\n Events.on(['resize', 'update'], function () {\n Build.mount();\n });\n\n /**\n * Swap active class of current slide:\n * - after each move to the new index\n */\n Events.on('move.after', function () {\n Build.activeClass();\n });\n\n return Build;\n}\n\nfunction Clones (Glide, Components, Events) {\n var Clones = {\n /**\n * Create pattern map and collect slides to be cloned.\n */\n mount: function mount() {\n this.items = [];\n\n if (Glide.isType('carousel')) {\n this.items = this.collect();\n }\n },\n\n\n /**\n * Collect clones with pattern.\n *\n * @return {Void}\n */\n collect: function collect() {\n var items = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n var slides = Components.Html.slides;\n var _Glide$settings = Glide.settings,\n perView = _Glide$settings.perView,\n classes = _Glide$settings.classes;\n\n\n var peekIncrementer = +!!Glide.settings.peek;\n var part = perView + peekIncrementer;\n var start = slides.slice(0, part);\n var end = slides.slice(-part);\n\n for (var r = 0; r < Math.max(1, Math.floor(perView / slides.length)); r++) {\n for (var i = 0; i < start.length; i++) {\n var clone = start[i].cloneNode(true);\n\n clone.classList.add(classes.cloneSlide);\n\n items.push(clone);\n }\n\n for (var _i = 0; _i < end.length; _i++) {\n var _clone = end[_i].cloneNode(true);\n\n _clone.classList.add(classes.cloneSlide);\n\n items.unshift(_clone);\n }\n }\n\n return items;\n },\n\n\n /**\n * Append cloned slides with generated pattern.\n *\n * @return {Void}\n */\n append: function append() {\n var items = this.items;\n var _Components$Html = Components.Html,\n wrapper = _Components$Html.wrapper,\n slides = _Components$Html.slides;\n\n\n var half = Math.floor(items.length / 2);\n var prepend = items.slice(0, half).reverse();\n var append = items.slice(half, items.length);\n var width = Components.Sizes.slideWidth + 'px';\n\n for (var i = 0; i < append.length; i++) {\n wrapper.appendChild(append[i]);\n }\n\n for (var _i2 = 0; _i2 < prepend.length; _i2++) {\n wrapper.insertBefore(prepend[_i2], slides[0]);\n }\n\n for (var _i3 = 0; _i3 < items.length; _i3++) {\n items[_i3].style.width = width;\n }\n },\n\n\n /**\n * Remove all cloned slides.\n *\n * @return {Void}\n */\n remove: function remove() {\n var items = this.items;\n\n\n for (var i = 0; i < items.length; i++) {\n Components.Html.wrapper.removeChild(items[i]);\n }\n }\n };\n\n define(Clones, 'grow', {\n /**\n * Gets additional dimentions value caused by clones.\n *\n * @return {Number}\n */\n get: function get() {\n return (Components.Sizes.slideWidth + Components.Gaps.value) * Clones.items.length;\n }\n });\n\n /**\n * Append additional slide's clones:\n * - while glide's type is `carousel`\n */\n Events.on('update', function () {\n Clones.remove();\n Clones.mount();\n Clones.append();\n });\n\n /**\n * Append additional slide's clones:\n * - while glide's type is `carousel`\n */\n Events.on('build.before', function () {\n if (Glide.isType('carousel')) {\n Clones.append();\n }\n });\n\n /**\n * Remove clones HTMLElements:\n * - on destroying, to bring HTML to its initial state\n */\n Events.on('destroy', function () {\n Clones.remove();\n });\n\n return Clones;\n}\n\nvar EventsBinder = function () {\n /**\n * Construct a EventsBinder instance.\n */\n function EventsBinder() {\n var listeners = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n classCallCheck(this, EventsBinder);\n\n this.listeners = listeners;\n }\n\n /**\n * Adds events listeners to arrows HTML elements.\n *\n * @param {String|Array} events\n * @param {Element|Window|Document} el\n * @param {Function} closure\n * @param {Boolean|Object} capture\n * @return {Void}\n */\n\n\n createClass(EventsBinder, [{\n key: 'on',\n value: function on(events, el, closure) {\n var capture = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n\n if (isString(events)) {\n events = [events];\n }\n\n for (var i = 0; i < events.length; i++) {\n this.listeners[events[i]] = closure;\n\n el.addEventListener(events[i], this.listeners[events[i]], capture);\n }\n }\n\n /**\n * Removes event listeners from arrows HTML elements.\n *\n * @param {String|Array} events\n * @param {Element|Window|Document} el\n * @param {Boolean|Object} capture\n * @return {Void}\n */\n\n }, {\n key: 'off',\n value: function off(events, el) {\n var capture = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n if (isString(events)) {\n events = [events];\n }\n\n for (var i = 0; i < events.length; i++) {\n el.removeEventListener(events[i], this.listeners[events[i]], capture);\n }\n }\n\n /**\n * Destroy collected listeners.\n *\n * @returns {Void}\n */\n\n }, {\n key: 'destroy',\n value: function destroy() {\n delete this.listeners;\n }\n }]);\n return EventsBinder;\n}();\n\nfunction Resize (Glide, Components, Events) {\n /**\n * Instance of the binder for DOM Events.\n *\n * @type {EventsBinder}\n */\n var Binder = new EventsBinder();\n\n var Resize = {\n /**\n * Initializes window bindings.\n */\n mount: function mount() {\n this.bind();\n },\n\n\n /**\n * Binds `rezsize` listener to the window.\n * It's a costly event, so we are debouncing it.\n *\n * @return {Void}\n */\n bind: function bind() {\n Binder.on('resize', window, throttle(function () {\n Events.emit('resize');\n }, Glide.settings.throttle));\n },\n\n\n /**\n * Unbinds listeners from the window.\n *\n * @return {Void}\n */\n unbind: function unbind() {\n Binder.off('resize', window);\n }\n };\n\n /**\n * Remove bindings from window:\n * - on destroying, to remove added EventListener\n */\n Events.on('destroy', function () {\n Resize.unbind();\n Binder.destroy();\n });\n\n return Resize;\n}\n\nvar VALID_DIRECTIONS = ['ltr', 'rtl'];\nvar FLIPED_MOVEMENTS = {\n '>': '<',\n '<': '>',\n '=': '='\n};\n\nfunction Direction (Glide, Components, Events) {\n var Direction = {\n /**\n * Setups gap value based on settings.\n *\n * @return {Void}\n */\n mount: function mount() {\n this.value = Glide.settings.direction;\n },\n\n\n /**\n * Resolves pattern based on direction value\n *\n * @param {String} pattern\n * @returns {String}\n */\n resolve: function resolve(pattern) {\n var token = pattern.slice(0, 1);\n\n if (this.is('rtl')) {\n return pattern.split(token).join(FLIPED_MOVEMENTS[token]);\n }\n\n return pattern;\n },\n\n\n /**\n * Checks value of direction mode.\n *\n * @param {String} direction\n * @returns {Boolean}\n */\n is: function is(direction) {\n return this.value === direction;\n },\n\n\n /**\n * Applies direction class to the root HTML element.\n *\n * @return {Void}\n */\n addClass: function addClass() {\n Components.Html.root.classList.add(Glide.settings.classes.direction[this.value]);\n },\n\n\n /**\n * Removes direction class from the root HTML element.\n *\n * @return {Void}\n */\n removeClass: function removeClass() {\n Components.Html.root.classList.remove(Glide.settings.classes.direction[this.value]);\n }\n };\n\n define(Direction, 'value', {\n /**\n * Gets value of the direction.\n *\n * @returns {Number}\n */\n get: function get() {\n return Direction._v;\n },\n\n\n /**\n * Sets value of the direction.\n *\n * @param {String} value\n * @return {Void}\n */\n set: function set(value) {\n if (VALID_DIRECTIONS.indexOf(value) > -1) {\n Direction._v = value;\n } else {\n warn('Direction value must be `ltr` or `rtl`');\n }\n }\n });\n\n /**\n * Clear direction class:\n * - on destroy to bring HTML to its initial state\n * - on update to remove class before reappling bellow\n */\n Events.on(['destroy', 'update'], function () {\n Direction.removeClass();\n });\n\n /**\n * Remount component:\n * - on update to reflect changes in direction value\n */\n Events.on('update', function () {\n Direction.mount();\n });\n\n /**\n * Apply direction class:\n * - before building to apply class for the first time\n * - on updating to reapply direction class that may changed\n */\n Events.on(['build.before', 'update'], function () {\n Direction.addClass();\n });\n\n return Direction;\n}\n\n/**\n * Reflects value of glide movement.\n *\n * @param {Object} Glide\n * @param {Object} Components\n * @return {Object}\n */\nfunction Rtl (Glide, Components) {\n return {\n /**\n * Negates the passed translate if glide is in RTL option.\n *\n * @param {Number} translate\n * @return {Number}\n */\n modify: function modify(translate) {\n if (Components.Direction.is('rtl')) {\n return -translate;\n }\n\n return translate;\n }\n };\n}\n\n/**\n * Updates glide movement with a `gap` settings.\n *\n * @param {Object} Glide\n * @param {Object} Components\n * @return {Object}\n */\nfunction Gap (Glide, Components) {\n return {\n /**\n * Modifies passed translate value with number in the `gap` settings.\n *\n * @param {Number} translate\n * @return {Number}\n */\n modify: function modify(translate) {\n return translate + Components.Gaps.value * Glide.index;\n }\n };\n}\n\n/**\n * Updates glide movement with width of additional clones width.\n *\n * @param {Object} Glide\n * @param {Object} Components\n * @return {Object}\n */\nfunction Grow (Glide, Components) {\n return {\n /**\n * Adds to the passed translate width of the half of clones.\n *\n * @param {Number} translate\n * @return {Number}\n */\n modify: function modify(translate) {\n return translate + Components.Clones.grow / 2;\n }\n };\n}\n\n/**\n * Updates glide movement with a `peek` settings.\n *\n * @param {Object} Glide\n * @param {Object} Components\n * @return {Object}\n */\nfunction Peeking (Glide, Components) {\n return {\n /**\n * Modifies passed translate value with a `peek` setting.\n *\n * @param {Number} translate\n * @return {Number}\n */\n modify: function modify(translate) {\n if (Glide.settings.focusAt >= 0) {\n var peek = Components.Peek.value;\n\n if (isObject(peek)) {\n return translate - peek.before;\n }\n\n return translate - peek;\n }\n\n return translate;\n }\n };\n}\n\n/**\n * Updates glide movement with a `focusAt` settings.\n *\n * @param {Object} Glide\n * @param {Object} Components\n * @return {Object}\n */\nfunction Focusing (Glide, Components) {\n return {\n /**\n * Modifies passed translate value with index in the `focusAt` setting.\n *\n * @param {Number} translate\n * @return {Number}\n */\n modify: function modify(translate) {\n var gap = Components.Gaps.value;\n var width = Components.Sizes.width;\n var focusAt = Glide.settings.focusAt;\n var slideWidth = Components.Sizes.slideWidth;\n\n if (focusAt === 'center') {\n return translate - (width / 2 - slideWidth / 2);\n }\n\n return translate - slideWidth * focusAt - gap * focusAt;\n }\n };\n}\n\n/**\n * Applies diffrent transformers on translate value.\n *\n * @param {Object} Glide\n * @param {Object} Components\n * @return {Object}\n */\nfunction mutator (Glide, Components, Events) {\n /**\n * Merge instance transformers with collection of default transformers.\n * It's important that the Rtl component be last on the list,\n * so it reflects all previous transformations.\n *\n * @type {Array}\n */\n var TRANSFORMERS = [Gap, Grow, Peeking, Focusing].concat(Glide._t, [Rtl]);\n\n return {\n /**\n * Piplines translate value with registered transformers.\n *\n * @param {Number} translate\n * @return {Number}\n */\n mutate: function mutate(translate) {\n for (var i = 0; i < TRANSFORMERS.length; i++) {\n var transformer = TRANSFORMERS[i];\n\n if (isFunction(transformer) && isFunction(transformer().modify)) {\n translate = transformer(Glide, Components, Events).modify(translate);\n } else {\n warn('Transformer should be a function that returns an object with `modify()` method');\n }\n }\n\n return translate;\n }\n };\n}\n\nfunction Translate (Glide, Components, Events) {\n var Translate = {\n /**\n * Sets value of translate on HTML element.\n *\n * @param {Number} value\n * @return {Void}\n */\n set: function set(value) {\n var transform = mutator(Glide, Components).mutate(value);\n\n Components.Html.wrapper.style.transform = 'translate3d(' + -1 * transform + 'px, 0px, 0px)';\n },\n\n\n /**\n * Removes value of translate from HTML element.\n *\n * @return {Void}\n */\n remove: function remove() {\n Components.Html.wrapper.style.transform = '';\n }\n };\n\n /**\n * Set new translate value:\n * - on move to reflect index change\n * - on updating via API to reflect possible changes in options\n */\n Events.on('move', function (context) {\n var gap = Components.Gaps.value;\n var length = Components.Sizes.length;\n var width = Components.Sizes.slideWidth;\n\n if (Glide.isType('carousel') && Components.Run.isOffset('<')) {\n Components.Transition.after(function () {\n Events.emit('translate.jump');\n\n Translate.set(width * (length - 1));\n });\n\n return Translate.set(-width - gap * length);\n }\n\n if (Glide.isType('carousel') && Components.Run.isOffset('>')) {\n Components.Transition.after(function () {\n Events.emit('translate.jump');\n\n Translate.set(0);\n });\n\n return Translate.set(width * length + gap * length);\n }\n\n return Translate.set(context.movement);\n });\n\n /**\n * Remove translate:\n * - on destroying to bring markup to its inital state\n */\n Events.on('destroy', function () {\n Translate.remove();\n });\n\n return Translate;\n}\n\nfunction Transition (Glide, Components, Events) {\n /**\n * Holds inactivity status of transition.\n * When true transition is not applied.\n *\n * @type {Boolean}\n */\n var disabled = false;\n\n var Transition = {\n /**\n * Composes string of the CSS transition.\n *\n * @param {String} property\n * @return {String}\n */\n compose: function compose(property) {\n var settings = Glide.settings;\n\n if (!disabled) {\n return property + ' ' + this.duration + 'ms ' + settings.animationTimingFunc;\n }\n\n return property + ' 0ms ' + settings.animationTimingFunc;\n },\n\n\n /**\n * Sets value of transition on HTML element.\n *\n * @param {String=} property\n * @return {Void}\n */\n set: function set() {\n var property = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'transform';\n\n Components.Html.wrapper.style.transition = this.compose(property);\n },\n\n\n /**\n * Removes value of transition from HTML element.\n *\n * @return {Void}\n */\n remove: function remove() {\n Components.Html.wrapper.style.transition = '';\n },\n\n\n /**\n * Runs callback after animation.\n *\n * @param {Function} callback\n * @return {Void}\n */\n after: function after(callback) {\n setTimeout(function () {\n callback();\n }, this.duration);\n },\n\n\n /**\n * Enable transition.\n *\n * @return {Void}\n */\n enable: function enable() {\n disabled = false;\n\n this.set();\n },\n\n\n /**\n * Disable transition.\n *\n * @return {Void}\n */\n disable: function disable() {\n disabled = true;\n\n this.set();\n }\n };\n\n define(Transition, 'duration', {\n /**\n * Gets duration of the transition based\n * on currently running animation type.\n *\n * @return {Number}\n */\n get: function get() {\n var settings = Glide.settings;\n\n if (Glide.isType('slider') && Components.Run.offset) {\n return settings.rewindDuration;\n }\n\n return settings.animationDuration;\n }\n });\n\n /**\n * Set transition `style` value:\n * - on each moving, because it may be cleared by offset move\n */\n Events.on('move', function () {\n Transition.set();\n });\n\n /**\n * Disable transition:\n * - before initial build to avoid transitioning from `0` to `startAt` index\n * - while resizing window and recalculating dimentions\n * - on jumping from offset transition at start and end edges in `carousel` type\n */\n Events.on(['build.before', 'resize', 'translate.jump'], function () {\n Transition.disable();\n });\n\n /**\n * Enable transition:\n * - on each running, because it may be disabled by offset move\n */\n Events.on('run', function () {\n Transition.enable();\n });\n\n /**\n * Remove transition:\n * - on destroying to bring markup to its inital state\n */\n Events.on('destroy', function () {\n Transition.remove();\n });\n\n return Transition;\n}\n\n/**\n * Test via a getter in the options object to see\n * if the passive property is accessed.\n *\n * @see https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md#feature-detection\n */\n\nvar supportsPassive = false;\n\ntry {\n var opts = Object.defineProperty({}, 'passive', {\n get: function get() {\n supportsPassive = true;\n }\n });\n\n window.addEventListener('testPassive', null, opts);\n window.removeEventListener('testPassive', null, opts);\n} catch (e) {}\n\nvar supportsPassive$1 = supportsPassive;\n\nvar START_EVENTS = ['touchstart', 'mousedown'];\nvar MOVE_EVENTS = ['touchmove', 'mousemove'];\nvar END_EVENTS = ['touchend', 'touchcancel', 'mouseup', 'mouseleave'];\nvar MOUSE_EVENTS = ['mousedown', 'mousemove', 'mouseup', 'mouseleave'];\n\nfunction swipe (Glide, Components, Events) {\n /**\n * Instance of the binder for DOM Events.\n *\n * @type {EventsBinder}\n */\n var Binder = new EventsBinder();\n\n var swipeSin = 0;\n var swipeStartX = 0;\n var swipeStartY = 0;\n var disabled = false;\n var capture = supportsPassive$1 ? { passive: true } : false;\n\n var Swipe = {\n /**\n * Initializes swipe bindings.\n *\n * @return {Void}\n */\n mount: function mount() {\n this.bindSwipeStart();\n },\n\n\n /**\n * Handler for `swipestart` event. Calculates entry points of the user's tap.\n *\n * @param {Object} event\n * @return {Void}\n */\n start: function start(event) {\n if (!disabled && !Glide.disabled) {\n this.disable();\n\n var swipe = this.touches(event);\n\n swipeSin = null;\n swipeStartX = toInt(swipe.pageX);\n swipeStartY = toInt(swipe.pageY);\n\n this.bindSwipeMove();\n this.bindSwipeEnd();\n\n Events.emit('swipe.start');\n }\n },\n\n\n /**\n * Handler for `swipemove` event. Calculates user's tap angle and distance.\n *\n * @param {Object} event\n */\n move: function move(event) {\n if (!Glide.disabled) {\n var _Glide$settings = Glide.settings,\n touchAngle = _Glide$settings.touchAngle,\n touchRatio = _Glide$settings.touchRatio,\n classes = _Glide$settings.classes;\n\n\n var swipe = this.touches(event);\n\n var subExSx = toInt(swipe.pageX) - swipeStartX;\n var subEySy = toInt(swipe.pageY) - swipeStartY;\n var powEX = Math.abs(subExSx << 2);\n var powEY = Math.abs(subEySy << 2);\n var swipeHypotenuse = Math.sqrt(powEX + powEY);\n var swipeCathetus = Math.sqrt(powEY);\n\n swipeSin = Math.asin(swipeCathetus / swipeHypotenuse);\n\n if (swipeSin * 180 / Math.PI < touchAngle) {\n event.stopPropagation();\n\n Components.Move.make(subExSx * toFloat(touchRatio));\n\n Components.Html.root.classList.add(classes.dragging);\n\n Events.emit('swipe.move');\n } else {\n return false;\n }\n }\n },\n\n\n /**\n * Handler for `swipeend` event. Finitializes user's tap and decides about glide move.\n *\n * @param {Object} event\n * @return {Void}\n */\n end: function end(event) {\n if (!Glide.disabled) {\n var settings = Glide.settings;\n\n var swipe = this.touches(event);\n var threshold = this.threshold(event);\n\n var swipeDistance = swipe.pageX - swipeStartX;\n var swipeDeg = swipeSin * 180 / Math.PI;\n var steps = Math.round(swipeDistance / Components.Sizes.slideWidth);\n\n this.enable();\n\n if (swipeDistance > threshold && swipeDeg < settings.touchAngle) {\n // While swipe is positive and greater than threshold move backward.\n if (settings.perTouch) {\n steps = Math.min(steps, toInt(settings.perTouch));\n }\n\n if (Components.Direction.is('rtl')) {\n steps = -steps;\n }\n\n Components.Run.make(Components.Direction.resolve('<' + steps));\n } else if (swipeDistance < -threshold && swipeDeg < settings.touchAngle) {\n // While swipe is negative and lower than negative threshold move forward.\n if (settings.perTouch) {\n steps = Math.max(steps, -toInt(settings.perTouch));\n }\n\n if (Components.Direction.is('rtl')) {\n steps = -steps;\n }\n\n Components.Run.make(Components.Direction.resolve('>' + steps));\n } else {\n // While swipe don't reach distance apply previous transform.\n Components.Move.make();\n }\n\n Components.Html.root.classList.remove(settings.classes.dragging);\n\n this.unbindSwipeMove();\n this.unbindSwipeEnd();\n\n Events.emit('swipe.end');\n }\n },\n\n\n /**\n * Binds swipe's starting event.\n *\n * @return {Void}\n */\n bindSwipeStart: function bindSwipeStart() {\n var _this = this;\n\n var settings = Glide.settings;\n\n if (settings.swipeThreshold) {\n Binder.on(START_EVENTS[0], Components.Html.wrapper, function (event) {\n _this.start(event);\n }, capture);\n }\n\n if (settings.dragThreshold) {\n Binder.on(START_EVENTS[1], Components.Html.wrapper, function (event) {\n _this.start(event);\n }, capture);\n }\n },\n\n\n /**\n * Unbinds swipe's starting event.\n *\n * @return {Void}\n */\n unbindSwipeStart: function unbindSwipeStart() {\n Binder.off(START_EVENTS[0], Components.Html.wrapper, capture);\n Binder.off(START_EVENTS[1], Components.Html.wrapper, capture);\n },\n\n\n /**\n * Binds swipe's moving event.\n *\n * @return {Void}\n */\n bindSwipeMove: function bindSwipeMove() {\n var _this2 = this;\n\n Binder.on(MOVE_EVENTS, Components.Html.wrapper, throttle(function (event) {\n _this2.move(event);\n }, Glide.settings.throttle), capture);\n },\n\n\n /**\n * Unbinds swipe's moving event.\n *\n * @return {Void}\n */\n unbindSwipeMove: function unbindSwipeMove() {\n Binder.off(MOVE_EVENTS, Components.Html.wrapper, capture);\n },\n\n\n /**\n * Binds swipe's ending event.\n *\n * @return {Void}\n */\n bindSwipeEnd: function bindSwipeEnd() {\n var _this3 = this;\n\n Binder.on(END_EVENTS, Components.Html.wrapper, function (event) {\n _this3.end(event);\n });\n },\n\n\n /**\n * Unbinds swipe's ending event.\n *\n * @return {Void}\n */\n unbindSwipeEnd: function unbindSwipeEnd() {\n Binder.off(END_EVENTS, Components.Html.wrapper);\n },\n\n\n /**\n * Normalizes event touches points accorting to different types.\n *\n * @param {Object} event\n */\n touches: function touches(event) {\n if (MOUSE_EVENTS.indexOf(event.type) > -1) {\n return event;\n }\n\n return event.touches[0] || event.changedTouches[0];\n },\n\n\n /**\n * Gets value of minimum swipe distance settings based on event type.\n *\n * @return {Number}\n */\n threshold: function threshold(event) {\n var settings = Glide.settings;\n\n if (MOUSE_EVENTS.indexOf(event.type) > -1) {\n return settings.dragThreshold;\n }\n\n return settings.swipeThreshold;\n },\n\n\n /**\n * Enables swipe event.\n *\n * @return {self}\n */\n enable: function enable() {\n disabled = false;\n\n Components.Transition.enable();\n\n return this;\n },\n\n\n /**\n * Disables swipe event.\n *\n * @return {self}\n */\n disable: function disable() {\n disabled = true;\n\n Components.Transition.disable();\n\n return this;\n }\n };\n\n /**\n * Add component class:\n * - after initial building\n */\n Events.on('build.after', function () {\n Components.Html.root.classList.add(Glide.settings.classes.swipeable);\n });\n\n /**\n * Remove swiping bindings:\n * - on destroying, to remove added EventListeners\n */\n Events.on('destroy', function () {\n Swipe.unbindSwipeStart();\n Swipe.unbindSwipeMove();\n Swipe.unbindSwipeEnd();\n Binder.destroy();\n });\n\n return Swipe;\n}\n\nfunction images (Glide, Components, Events) {\n /**\n * Instance of the binder for DOM Events.\n *\n * @type {EventsBinder}\n */\n var Binder = new EventsBinder();\n\n var Images = {\n /**\n * Binds listener to glide wrapper.\n *\n * @return {Void}\n */\n mount: function mount() {\n this.bind();\n },\n\n\n /**\n * Binds `dragstart` event on wrapper to prevent dragging images.\n *\n * @return {Void}\n */\n bind: function bind() {\n Binder.on('dragstart', Components.Html.wrapper, this.dragstart);\n },\n\n\n /**\n * Unbinds `dragstart` event on wrapper.\n *\n * @return {Void}\n */\n unbind: function unbind() {\n Binder.off('dragstart', Components.Html.wrapper);\n },\n\n\n /**\n * Event handler. Prevents dragging.\n *\n * @return {Void}\n */\n dragstart: function dragstart(event) {\n event.preventDefault();\n }\n };\n\n /**\n * Remove bindings from images:\n * - on destroying, to remove added EventListeners\n */\n Events.on('destroy', function () {\n Images.unbind();\n Binder.destroy();\n });\n\n return Images;\n}\n\nfunction anchors (Glide, Components, Events) {\n /**\n * Instance of the binder for DOM Events.\n *\n * @type {EventsBinder}\n */\n var Binder = new EventsBinder();\n\n /**\n * Holds detaching status of anchors.\n * Prevents detaching of already detached anchors.\n *\n * @private\n * @type {Boolean}\n */\n var detached = false;\n\n /**\n * Holds preventing status of anchors.\n * If `true` redirection after click will be disabled.\n *\n * @private\n * @type {Boolean}\n */\n var prevented = false;\n\n var Anchors = {\n /**\n * Setups a initial state of anchors component.\n *\n * @returns {Void}\n */\n mount: function mount() {\n /**\n * Holds collection of anchors elements.\n *\n * @private\n * @type {HTMLCollection}\n */\n this._a = Components.Html.wrapper.querySelectorAll('a');\n\n this.bind();\n },\n\n\n /**\n * Binds events to anchors inside a track.\n *\n * @return {Void}\n */\n bind: function bind() {\n Binder.on('click', Components.Html.wrapper, this.click);\n },\n\n\n /**\n * Unbinds events attached to anchors inside a track.\n *\n * @return {Void}\n */\n unbind: function unbind() {\n Binder.off('click', Components.Html.wrapper);\n },\n\n\n /**\n * Handler for click event. Prevents clicks when glide is in `prevent` status.\n *\n * @param {Object} event\n * @return {Void}\n */\n click: function click(event) {\n if (prevented) {\n event.stopPropagation();\n event.preventDefault();\n }\n },\n\n\n /**\n * Detaches anchors click event inside glide.\n *\n * @return {self}\n */\n detach: function detach() {\n prevented = true;\n\n if (!detached) {\n for (var i = 0; i < this.items.length; i++) {\n this.items[i].draggable = false;\n\n this.items[i].setAttribute('data-href', this.items[i].getAttribute('href'));\n\n this.items[i].removeAttribute('href');\n }\n\n detached = true;\n }\n\n return this;\n },\n\n\n /**\n * Attaches anchors click events inside glide.\n *\n * @return {self}\n */\n attach: function attach() {\n prevented = false;\n\n if (detached) {\n for (var i = 0; i < this.items.length; i++) {\n this.items[i].draggable = true;\n\n this.items[i].setAttribute('href', this.items[i].getAttribute('data-href'));\n }\n\n detached = false;\n }\n\n return this;\n }\n };\n\n define(Anchors, 'items', {\n /**\n * Gets collection of the arrows HTML elements.\n *\n * @return {HTMLElement[]}\n */\n get: function get() {\n return Anchors._a;\n }\n });\n\n /**\n * Detach anchors inside slides:\n * - on swiping, so they won't redirect to its `href` attributes\n */\n Events.on('swipe.move', function () {\n Anchors.detach();\n });\n\n /**\n * Attach anchors inside slides:\n * - after swiping and transitions ends, so they can redirect after click again\n */\n Events.on('swipe.end', function () {\n Components.Transition.after(function () {\n Anchors.attach();\n });\n });\n\n /**\n * Unbind anchors inside slides:\n * - on destroying, to bring anchors to its initial state\n */\n Events.on('destroy', function () {\n Anchors.attach();\n Anchors.unbind();\n Binder.destroy();\n });\n\n return Anchors;\n}\n\nvar NAV_SELECTOR = '[data-glide-el=\"controls[nav]\"]';\nvar CONTROLS_SELECTOR = '[data-glide-el^=\"controls\"]';\n\nfunction controls (Glide, Components, Events) {\n /**\n * Instance of the binder for DOM Events.\n *\n * @type {EventsBinder}\n */\n var Binder = new EventsBinder();\n\n var capture = supportsPassive$1 ? { passive: true } : false;\n\n var Controls = {\n /**\n * Inits arrows. Binds events listeners\n * to the arrows HTML elements.\n *\n * @return {Void}\n */\n mount: function mount() {\n /**\n * Collection of navigation HTML elements.\n *\n * @private\n * @type {HTMLCollection}\n */\n this._n = Components.Html.root.querySelectorAll(NAV_SELECTOR);\n\n /**\n * Collection of controls HTML elements.\n *\n * @private\n * @type {HTMLCollection}\n */\n this._c = Components.Html.root.querySelectorAll(CONTROLS_SELECTOR);\n\n this.addBindings();\n },\n\n\n /**\n * Sets active class to current slide.\n *\n * @return {Void}\n */\n setActive: function setActive() {\n for (var i = 0; i < this._n.length; i++) {\n this.addClass(this._n[i].children);\n }\n },\n\n\n /**\n * Removes active class to current slide.\n *\n * @return {Void}\n */\n removeActive: function removeActive() {\n for (var i = 0; i < this._n.length; i++) {\n this.removeClass(this._n[i].children);\n }\n },\n\n\n /**\n * Toggles active class on items inside navigation.\n *\n * @param {HTMLElement} controls\n * @return {Void}\n */\n addClass: function addClass(controls) {\n var settings = Glide.settings;\n var item = controls[Glide.index];\n\n if (item) {\n item.classList.add(settings.classes.activeNav);\n\n siblings(item).forEach(function (sibling) {\n sibling.classList.remove(settings.classes.activeNav);\n });\n }\n },\n\n\n /**\n * Removes active class from active control.\n *\n * @param {HTMLElement} controls\n * @return {Void}\n */\n removeClass: function removeClass(controls) {\n var item = controls[Glide.index];\n\n if (item) {\n item.classList.remove(Glide.settings.classes.activeNav);\n }\n },\n\n\n /**\n * Adds handles to the each group of controls.\n *\n * @return {Void}\n */\n addBindings: function addBindings() {\n for (var i = 0; i < this._c.length; i++) {\n this.bind(this._c[i].children);\n }\n },\n\n\n /**\n * Removes handles from the each group of controls.\n *\n * @return {Void}\n */\n removeBindings: function removeBindings() {\n for (var i = 0; i < this._c.length; i++) {\n this.unbind(this._c[i].children);\n }\n },\n\n\n /**\n * Binds events to arrows HTML elements.\n *\n * @param {HTMLCollection} elements\n * @return {Void}\n */\n bind: function bind(elements) {\n for (var i = 0; i < elements.length; i++) {\n Binder.on('click', elements[i], this.click);\n Binder.on('touchstart', elements[i], this.click, capture);\n }\n },\n\n\n /**\n * Unbinds events binded to the arrows HTML elements.\n *\n * @param {HTMLCollection} elements\n * @return {Void}\n */\n unbind: function unbind(elements) {\n for (var i = 0; i < elements.length; i++) {\n Binder.off(['click', 'touchstart'], elements[i]);\n }\n },\n\n\n /**\n * Handles `click` event on the arrows HTML elements.\n * Moves slider in driection precised in\n * `data-glide-dir` attribute.\n *\n * @param {Object} event\n * @return {Void}\n */\n click: function click(event) {\n event.preventDefault();\n\n Components.Run.make(Components.Direction.resolve(event.currentTarget.getAttribute('data-glide-dir')));\n }\n };\n\n define(Controls, 'items', {\n /**\n * Gets collection of the controls HTML elements.\n *\n * @return {HTMLElement[]}\n */\n get: function get() {\n return Controls._c;\n }\n });\n\n /**\n * Swap active class of current navigation item:\n * - after mounting to set it to initial index\n * - after each move to the new index\n */\n Events.on(['mount.after', 'move.after'], function () {\n Controls.setActive();\n });\n\n /**\n * Remove bindings and HTML Classes:\n * - on destroying, to bring markup to its initial state\n */\n Events.on('destroy', function () {\n Controls.removeBindings();\n Controls.removeActive();\n Binder.destroy();\n });\n\n return Controls;\n}\n\nfunction keyboard (Glide, Components, Events) {\n /**\n * Instance of the binder for DOM Events.\n *\n * @type {EventsBinder}\n */\n var Binder = new EventsBinder();\n\n var Keyboard = {\n /**\n * Binds keyboard events on component mount.\n *\n * @return {Void}\n */\n mount: function mount() {\n if (Glide.settings.keyboard) {\n this.bind();\n }\n },\n\n\n /**\n * Adds keyboard press events.\n *\n * @return {Void}\n */\n bind: function bind() {\n Binder.on('keyup', document, this.press);\n },\n\n\n /**\n * Removes keyboard press events.\n *\n * @return {Void}\n */\n unbind: function unbind() {\n Binder.off('keyup', document);\n },\n\n\n /**\n * Handles keyboard's arrows press and moving glide foward and backward.\n *\n * @param {Object} event\n * @return {Void}\n */\n press: function press(event) {\n if (event.keyCode === 39) {\n Components.Run.make(Components.Direction.resolve('>'));\n }\n\n if (event.keyCode === 37) {\n Components.Run.make(Components.Direction.resolve('<'));\n }\n }\n };\n\n /**\n * Remove bindings from keyboard:\n * - on destroying to remove added events\n * - on updating to remove events before remounting\n */\n Events.on(['destroy', 'update'], function () {\n Keyboard.unbind();\n });\n\n /**\n * Remount component\n * - on updating to reflect potential changes in settings\n */\n Events.on('update', function () {\n Keyboard.mount();\n });\n\n /**\n * Destroy binder:\n * - on destroying to remove listeners\n */\n Events.on('destroy', function () {\n Binder.destroy();\n });\n\n return Keyboard;\n}\n\nfunction autoplay (Glide, Components, Events) {\n /**\n * Instance of the binder for DOM Events.\n *\n * @type {EventsBinder}\n */\n var Binder = new EventsBinder();\n\n var Autoplay = {\n /**\n * Initializes autoplaying and events.\n *\n * @return {Void}\n */\n mount: function mount() {\n this.start();\n\n if (Glide.settings.hoverpause) {\n this.bind();\n }\n },\n\n\n /**\n * Starts autoplaying in configured interval.\n *\n * @param {Boolean|Number} force Run autoplaying with passed interval regardless of `autoplay` settings\n * @return {Void}\n */\n start: function start() {\n var _this = this;\n\n if (Glide.settings.autoplay) {\n if (isUndefined(this._i)) {\n this._i = setInterval(function () {\n _this.stop();\n\n Components.Run.make('>');\n\n _this.start();\n }, this.time);\n }\n }\n },\n\n\n /**\n * Stops autorunning of the glide.\n *\n * @return {Void}\n */\n stop: function stop() {\n this._i = clearInterval(this._i);\n },\n\n\n /**\n * Stops autoplaying while mouse is over glide's area.\n *\n * @return {Void}\n */\n bind: function bind() {\n var _this2 = this;\n\n Binder.on('mouseover', Components.Html.root, function () {\n _this2.stop();\n });\n\n Binder.on('mouseout', Components.Html.root, function () {\n _this2.start();\n });\n },\n\n\n /**\n * Unbind mouseover events.\n *\n * @returns {Void}\n */\n unbind: function unbind() {\n Binder.off(['mouseover', 'mouseout'], Components.Html.root);\n }\n };\n\n define(Autoplay, 'time', {\n /**\n * Gets time period value for the autoplay interval. Prioritizes\n * times in `data-glide-autoplay` attrubutes over options.\n *\n * @return {Number}\n */\n get: function get() {\n var autoplay = Components.Html.slides[Glide.index].getAttribute('data-glide-autoplay');\n\n if (autoplay) {\n return toInt(autoplay);\n }\n\n return toInt(Glide.settings.autoplay);\n }\n });\n\n /**\n * Stop autoplaying and unbind events:\n * - on destroying, to clear defined interval\n * - on updating via API to reset interval that may changed\n */\n Events.on(['destroy', 'update'], function () {\n Autoplay.unbind();\n });\n\n /**\n * Stop autoplaying:\n * - before each run, to restart autoplaying\n * - on pausing via API\n * - on destroying, to clear defined interval\n * - while starting a swipe\n * - on updating via API to reset interval that may changed\n */\n Events.on(['run.before', 'pause', 'destroy', 'swipe.start', 'update'], function () {\n Autoplay.stop();\n });\n\n /**\n * Start autoplaying:\n * - after each run, to restart autoplaying\n * - on playing via API\n * - while ending a swipe\n */\n Events.on(['run.after', 'play', 'swipe.end'], function () {\n Autoplay.start();\n });\n\n /**\n * Remount autoplaying:\n * - on updating via API to reset interval that may changed\n */\n Events.on('update', function () {\n Autoplay.mount();\n });\n\n /**\n * Destroy a binder:\n * - on destroying glide instance to clearup listeners\n */\n Events.on('destroy', function () {\n Binder.destroy();\n });\n\n return Autoplay;\n}\n\n/**\n * Sorts keys of breakpoint object so they will be ordered from lower to bigger.\n *\n * @param {Object} points\n * @returns {Object}\n */\nfunction sortBreakpoints(points) {\n if (isObject(points)) {\n return sortKeys(points);\n } else {\n warn('Breakpoints option must be an object');\n }\n\n return {};\n}\n\nfunction breakpoints (Glide, Components, Events) {\n /**\n * Instance of the binder for DOM Events.\n *\n * @type {EventsBinder}\n */\n var Binder = new EventsBinder();\n\n /**\n * Holds reference to settings.\n *\n * @type {Object}\n */\n var settings = Glide.settings;\n\n /**\n * Holds reference to breakpoints object in settings. Sorts breakpoints\n * from smaller to larger. It is required in order to proper\n * matching currently active breakpoint settings.\n *\n * @type {Object}\n */\n var points = sortBreakpoints(settings.breakpoints);\n\n /**\n * Cache initial settings before overwritting.\n *\n * @type {Object}\n */\n var defaults = _extends({}, settings);\n\n var Breakpoints = {\n /**\n * Matches settings for currectly matching media breakpoint.\n *\n * @param {Object} points\n * @returns {Object}\n */\n match: function match(points) {\n if (typeof window.matchMedia !== 'undefined') {\n for (var point in points) {\n if (points.hasOwnProperty(point)) {\n if (window.matchMedia('(max-width: ' + point + 'px)').matches) {\n return points[point];\n }\n }\n }\n }\n\n return defaults;\n }\n };\n\n /**\n * Overwrite instance settings with currently matching breakpoint settings.\n * This happens right after component initialization.\n */\n _extends(settings, Breakpoints.match(points));\n\n /**\n * Update glide with settings of matched brekpoint:\n * - window resize to update slider\n */\n Binder.on('resize', window, throttle(function () {\n Glide.settings = mergeOptions(settings, Breakpoints.match(points));\n }, Glide.settings.throttle));\n\n /**\n * Resort and update default settings:\n * - on reinit via API, so breakpoint matching will be performed with options\n */\n Events.on('update', function () {\n points = sortBreakpoints(points);\n\n defaults = _extends({}, settings);\n });\n\n /**\n * Unbind resize listener:\n * - on destroying, to bring markup to its initial state\n */\n Events.on('destroy', function () {\n Binder.off('resize', window);\n });\n\n return Breakpoints;\n}\n\nvar COMPONENTS = {\n Html: Html,\n Translate: Translate,\n Transition: Transition,\n Direction: Direction,\n Peek: Peek,\n Sizes: Sizes,\n Gaps: Gaps,\n Move: Move,\n Clones: Clones,\n Resize: Resize,\n Build: Build,\n Run: Run\n};\n\nvar Glide$1 = function (_Core) {\n inherits(Glide$$1, _Core);\n\n function Glide$$1() {\n classCallCheck(this, Glide$$1);\n return possibleConstructorReturn(this, (Glide$$1.__proto__ || Object.getPrototypeOf(Glide$$1)).apply(this, arguments));\n }\n\n createClass(Glide$$1, [{\n key: 'mount',\n value: function mount() {\n var extensions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n return get(Glide$$1.prototype.__proto__ || Object.getPrototypeOf(Glide$$1.prototype), 'mount', this).call(this, _extends({}, COMPONENTS, extensions));\n }\n }]);\n return Glide$$1;\n}(Glide);\n\nexport default Glide$1;\nexport { swipe as Swipe, images as Images, anchors as Anchors, controls as Controls, keyboard as Keyboard, autoplay as Autoplay, breakpoints as Breakpoints };\n","export function sharePage(o, r) {\r\n // based on https://cdn.jsdelivr.net/npm/sharer.js@latest/sharer.min.js\r\n var i = function (t) {\r\n this.elem = t\r\n };\r\n i.init = function () {\r\n var t = r.querySelectorAll(\"[data-sharer]\"),\r\n e, a = t.length;\r\n for (e = 0; e < a; e++) {\r\n t[e].addEventListener(\"click\", i.add)\r\n }\r\n };\r\n i.add = function (t) {\r\n var e = t.currentTarget || t.srcElement;\r\n var a = new i(e);\r\n a.share()\r\n };\r\n i.prototype = {\r\n constructor: i,\r\n getValue: function (t, e) {\r\n e = e === undefined ? \"\" : e;\r\n var a = this.elem.getAttribute(\"data-\" + t);\r\n return a === undefined || a === null ? e : a\r\n },\r\n share: function () {\r\n var t = this.getValue(\"sharer\").toLowerCase(),\r\n e = {\r\n facebook: {\r\n shareUrl: \"https://www.facebook.com/sharer/sharer.php\",\r\n params: {\r\n u: this.getValue(\"url\")\r\n }\r\n },\r\n linkedin: {\r\n shareUrl: \"https://www.linkedin.com/shareArticle\",\r\n params: {\r\n url: this.getValue(\"url\"),\r\n mini: true\r\n }\r\n },\r\n twitter: {\r\n shareUrl: \"https://twitter.com/intent/tweet/\",\r\n params: {\r\n text: this.getValue(\"title\"),\r\n url: this.getValue(\"url\"),\r\n hashtags: this.getValue(\"hashtags\"),\r\n via: this.getValue(\"via\")\r\n }\r\n },\r\n email: {\r\n shareUrl: \"mailto:\" + this.getValue(\"to\"),\r\n params: {\r\n subject: this.getValue(\"subject\"),\r\n body: this.getValue(\"title\") + \"\\n\" + this.getValue(\"url\")\r\n },\r\n isLink: true\r\n },\r\n whatsapp: {\r\n shareUrl: \"whatsapp://send\",\r\n params: {\r\n text: this.getValue(\"title\") + \" \" + this.getValue(\"url\")\r\n },\r\n isLink: true\r\n }\r\n },\r\n a = e[t];\r\n if (a) {\r\n a.width = this.getValue(\"width\");\r\n a.height = this.getValue(\"height\")\r\n }\r\n return a !== undefined ? this.urlSharer(a) : false\r\n },\r\n urlSharer: function (t) {\r\n var e = t.params || {},\r\n a = Object.keys(e),\r\n r, i = a.length > 0 ? \"?\" : \"\";\r\n for (r = 0; r < a.length; r++) {\r\n if (i !== \"?\") {\r\n i += \"&\"\r\n }\r\n if (e[a[r]]) {\r\n i += a[r] + \"=\" + encodeURIComponent(e[a[r]])\r\n }\r\n }\r\n t.shareUrl += i;\r\n if (!t.isLink) {\r\n var s = t.width || 600,\r\n l = t.height || 480,\r\n h = o.innerWidth / 2 - s / 2 + o.screenX,\r\n u = o.innerHeight / 2 - l / 2 + o.screenY,\r\n n = \"scrollbars=no, width=\" + s + \", height=\" + l + \", top=\" + u + \", left=\" + h,\r\n g = o.open(t.shareUrl, \"\", n);\r\n if (o.focus) {\r\n g.focus()\r\n }\r\n } else {\r\n o.location.href = t.shareUrl\r\n }\r\n }\r\n };\r\n if (r.readyState === \"complete\" || r.readyState !== \"loading\") {\r\n i.init()\r\n } else {\r\n r.addEventListener(\"DOMContentLoaded\", i.init)\r\n }\r\n o.addEventListener(\"page:load\", i.init);\r\n o.Sharer = i\r\n}\r\n","export function scrollToTop() {\r\n var trigger = document.querySelector('.scrollToTop');\r\n var rootElement = document.documentElement\r\n\r\n if (trigger != undefined) {\r\n trigger.addEventListener(\"click\", scrollToTop);\r\n }\r\n\r\n function scrollToTop(e) {\r\n e.preventDefault();\r\n rootElement.scrollTo({\r\n top: 0,\r\n behavior: \"smooth\"\r\n })\r\n }\r\n}","(function (global, factory) {\r\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\r\n typeof define === 'function' && define.amd ? define(factory) :\r\n (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Pristine = factory());\r\n}(this, (function () { 'use strict';\r\n\r\n var lang = {\r\n en: {\r\n required: \"This field is required\",\r\n email: \"This field requires a valid e-mail address\",\r\n number: \"This field requires a number\",\r\n integer: \"This field requires an integer value\",\r\n url: \"This field requires a valid website URL\",\r\n tel: \"This field requires a valid telephone number\",\r\n maxlength: \"This fields length must be < ${1}\",\r\n minlength: \"This fields length must be > ${1}\",\r\n min: \"Minimum value for this field is ${1}\",\r\n max: \"Maximum value for this field is ${1}\",\r\n pattern: \"Please match the requested format\",\r\n equals: \"The two fields do not match\"\r\n }\r\n };\r\n\r\n function findAncestor(el, cls) {\r\n while ((el = el.parentElement) && !el.classList.contains(cls)) {}\r\n return el;\r\n }\r\n\r\n function tmpl(o) {\r\n var _arguments = arguments;\r\n\r\n return this.replace(/\\${([^{}]*)}/g, function (a, b) {\r\n return _arguments[b];\r\n });\r\n }\r\n\r\n function groupedElemCount(input) {\r\n return input.pristine.self.form.querySelectorAll('input[name=\"' + input.getAttribute('name') + '\"]:checked').length;\r\n }\r\n\r\n function mergeConfig(obj1, obj2) {\r\n for (var attr in obj2) {\r\n if (!(attr in obj1)) {\r\n obj1[attr] = obj2[attr];\r\n }\r\n }\r\n return obj1;\r\n }\r\n\r\n var defaultConfig = {\r\n classTo: 'form-group',\r\n errorClass: 'has-danger',\r\n successClass: 'has-success',\r\n errorTextParent: 'form-group',\r\n errorTextTag: 'div',\r\n errorTextClass: 'text-help'\r\n };\r\n\r\n var PRISTINE_ERROR = 'pristine-error';\r\n var SELECTOR = \"input:not([type^=hidden]):not([type^=submit]), select, textarea\";\r\n var ALLOWED_ATTRIBUTES = [\"required\", \"min\", \"max\", 'minlength', 'maxlength', 'pattern'];\r\n var EMAIL_REGEX = /^(([^<>()\\[\\]\\\\.,;:\\s@\"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\r\n\r\n var MESSAGE_REGEX = /-message(?:-([a-z]{2}(?:_[A-Z]{2})?))?/; // matches, -message, -message-en, -message-en_US\r\n var currentLocale = 'en';\r\n var validators = {};\r\n\r\n var _ = function _(name, validator) {\r\n validator.name = name;\r\n if (validator.priority === undefined) validator.priority = 1;\r\n validators[name] = validator;\r\n };\r\n\r\n _('text', { fn: function fn(val) {\r\n return true;\r\n }, priority: 0 });\r\n _('required', { fn: function fn(val) {\r\n return this.type === 'radio' || this.type === 'checkbox' ? groupedElemCount(this) : val !== undefined && val !== '';\r\n }, priority: 99, halt: true });\r\n _('email', { fn: function fn(val) {\r\n return !val || EMAIL_REGEX.test(val);\r\n } });\r\n _('number', { fn: function fn(val) {\r\n return !val || !isNaN(parseFloat(val));\r\n }, priority: 2 });\r\n _('integer', { fn: function fn(val) {\r\n return !val || /^\\d+$/.test(val);\r\n } });\r\n _('minlength', { fn: function fn(val, length) {\r\n return !val || val.length >= parseInt(length);\r\n } });\r\n _('maxlength', { fn: function fn(val, length) {\r\n return !val || val.length <= parseInt(length);\r\n } });\r\n _('min', { fn: function fn(val, limit) {\r\n return !val || (this.type === 'checkbox' ? groupedElemCount(this) >= parseInt(limit) : parseFloat(val) >= parseFloat(limit));\r\n } });\r\n _('max', { fn: function fn(val, limit) {\r\n return !val || (this.type === 'checkbox' ? groupedElemCount(this) <= parseInt(limit) : parseFloat(val) <= parseFloat(limit));\r\n } });\r\n _('pattern', { fn: function fn(val, pattern) {\r\n var m = pattern.match(new RegExp('^/(.*?)/([gimy]*)$'));return !val || new RegExp(m[1], m[2]).test(val);\r\n } });\r\n _('equals', { fn: function fn(val, otherFieldSelector) {\r\n var other = document.querySelector(otherFieldSelector);return other && (!val && !other.value || other.value === val);\r\n } });\r\n\r\n function Pristine(form, config, live) {\r\n\r\n var self = this;\r\n\r\n init(form, config, live);\r\n\r\n function init(form, config, live) {\r\n\r\n form.setAttribute(\"novalidate\", \"true\");\r\n\r\n self.form = form;\r\n self.config = mergeConfig(config || {}, defaultConfig);\r\n self.live = !(live === false);\r\n self.fields = Array.from(form.querySelectorAll(SELECTOR)).map(function (input) {\r\n\r\n var fns = [];\r\n var params = {};\r\n var messages = {};\r\n\r\n [].forEach.call(input.attributes, function (attr) {\r\n if (/^data-pristine-/.test(attr.name)) {\r\n var name = attr.name.substr(14);\r\n var messageMatch = name.match(MESSAGE_REGEX);\r\n if (messageMatch !== null) {\r\n var locale = messageMatch[1] === undefined ? 'en' : messageMatch[1];\r\n if (!messages.hasOwnProperty(locale)) messages[locale] = {};\r\n messages[locale][name.slice(0, name.length - messageMatch[0].length)] = attr.value;\r\n return;\r\n }\r\n if (name === 'type') name = attr.value;\r\n _addValidatorToField(fns, params, name, attr.value);\r\n } else if (~ALLOWED_ATTRIBUTES.indexOf(attr.name)) {\r\n _addValidatorToField(fns, params, attr.name, attr.value);\r\n } else if (attr.name === 'type') {\r\n _addValidatorToField(fns, params, attr.value);\r\n }\r\n });\r\n\r\n fns.sort(function (a, b) {\r\n return b.priority - a.priority;\r\n });\r\n\r\n self.live && input.addEventListener(!~['radio', 'checkbox'].indexOf(input.getAttribute('type')) ? 'input' : 'change', function (e) {\r\n self.validate(e.target);\r\n }.bind(self));\r\n\r\n return input.pristine = { input: input, validators: fns, params: params, messages: messages, self: self };\r\n }.bind(self));\r\n }\r\n\r\n function _addValidatorToField(fns, params, name, value) {\r\n var validator = validators[name];\r\n if (validator) {\r\n fns.push(validator);\r\n if (value) {\r\n var valueParams = name === \"pattern\" ? [value] : value.split(',');\r\n valueParams.unshift(null); // placeholder for input's value\r\n params[name] = valueParams;\r\n }\r\n }\r\n }\r\n\r\n /***\r\n * Checks whether the form/input elements are valid\r\n * @param input => input element(s) or a jquery selector, null for full form validation\r\n * @param silent => do not show error messages, just return true/false\r\n * @returns {boolean} return true when valid false otherwise\r\n */\r\n self.validate = function (input, silent) {\r\n silent = input && silent === true || input === true;\r\n var fields = self.fields;\r\n if (input !== true && input !== false) {\r\n if (input instanceof HTMLElement) {\r\n fields = [input.pristine];\r\n } else if (input instanceof NodeList || input instanceof (window.$ || Array) || input instanceof Array) {\r\n fields = Array.from(input).map(function (el) {\r\n return el.pristine;\r\n });\r\n }\r\n }\r\n\r\n var valid = true;\r\n\r\n for (var i = 0; fields[i]; i++) {\r\n var field = fields[i];\r\n if (_validateField(field)) {\r\n !silent && _showSuccess(field);\r\n } else {\r\n valid = false;\r\n !silent && _showError(field);\r\n }\r\n }\r\n return valid;\r\n };\r\n\r\n /***\r\n * Get errors of a specific field or the whole form\r\n * @param input\r\n * @returns {Array|*}\r\n */\r\n self.getErrors = function (input) {\r\n if (!input) {\r\n var erroneousFields = [];\r\n for (var i = 0; i < self.fields.length; i++) {\r\n var field = self.fields[i];\r\n if (field.errors.length) {\r\n erroneousFields.push({ input: field.input, errors: field.errors });\r\n }\r\n }\r\n return erroneousFields;\r\n }\r\n if (input.tagName && input.tagName.toLowerCase() === \"select\") {\r\n return input.pristine.errors;\r\n }\r\n return input.length ? input[0].pristine.errors : input.pristine.errors;\r\n };\r\n\r\n /***\r\n * Validates a single field, all validator functions are called and error messages are generated\r\n * when a validator fails\r\n * @param field\r\n * @returns {boolean}\r\n * @private\r\n */\r\n function _validateField(field) {\r\n var errors = [];\r\n var valid = true;\r\n for (var i = 0; field.validators[i]; i++) {\r\n var validator = field.validators[i];\r\n var params = field.params[validator.name] ? field.params[validator.name] : [];\r\n params[0] = field.input.value;\r\n if (!validator.fn.apply(field.input, params)) {\r\n valid = false;\r\n\r\n if (typeof validator.msg === \"function\") {\r\n errors.push(validator.msg(field.input.value, params));\r\n } else if (typeof validator.msg === \"string\") {\r\n errors.push(tmpl.apply(validator.msg, params));\r\n } else if (validator.msg === Object(validator.msg) && validator.msg[currentLocale]) {\r\n // typeof generates unnecessary babel code\r\n errors.push(tmpl.apply(validator.msg[currentLocale], params));\r\n } else if (field.messages[currentLocale] && field.messages[currentLocale][validator.name]) {\r\n errors.push(tmpl.apply(field.messages[currentLocale][validator.name], params));\r\n } else if (lang[currentLocale] && lang[currentLocale][validator.name]) {\r\n errors.push(tmpl.apply(lang[currentLocale][validator.name], params));\r\n }\r\n\r\n if (validator.halt === true) {\r\n break;\r\n }\r\n }\r\n }\r\n field.errors = errors;\r\n return valid;\r\n }\r\n\r\n /***\r\n * Add a validator to a specific dom element in a form\r\n * @param elem => The dom element where the validator is applied to\r\n * @param fn => validator function\r\n * @param msg => message to show when validation fails. Supports templating. ${0} for the input's value, ${1} and\r\n * so on are for the attribute values\r\n * @param priority => priority of the validator function, higher valued function gets called first.\r\n * @param halt => whether validation should stop for this field after current validation function\r\n */\r\n self.addValidator = function (elem, fn, msg, priority, halt) {\r\n if (elem instanceof HTMLElement) {\r\n elem.pristine.validators.push({ fn: fn, msg: msg, priority: priority, halt: halt });\r\n elem.pristine.validators.sort(function (a, b) {\r\n return b.priority - a.priority;\r\n });\r\n } else {\r\n console.warn(\"The parameter elem must be a dom element\");\r\n }\r\n };\r\n\r\n /***\r\n * An utility function that returns a 2-element array, first one is the element where error/success class is\r\n * applied. 2nd one is the element where error message is displayed. 2nd element is created if doesn't exist and cached.\r\n * @param field\r\n * @returns {*}\r\n * @private\r\n */\r\n function _getErrorElements(field) {\r\n if (field.errorElements) {\r\n return field.errorElements;\r\n }\r\n var errorClassElement = findAncestor(field.input, self.config.classTo);\r\n var errorTextParent = null,\r\n errorTextElement = null;\r\n if (self.config.classTo === self.config.errorTextParent) {\r\n errorTextParent = errorClassElement;\r\n } else {\r\n errorTextParent = errorClassElement.querySelector('.' + self.config.errorTextParent);\r\n }\r\n if (errorTextParent) {\r\n errorTextElement = errorTextParent.querySelector('.' + PRISTINE_ERROR);\r\n if (!errorTextElement) {\r\n errorTextElement = document.createElement(self.config.errorTextTag);\r\n errorTextElement.className = PRISTINE_ERROR + ' ' + self.config.errorTextClass;\r\n errorTextParent.appendChild(errorTextElement);\r\n errorTextElement.pristineDisplay = errorTextElement.style.display;\r\n }\r\n }\r\n return field.errorElements = [errorClassElement, errorTextElement];\r\n }\r\n\r\n function _showError(field) {\r\n var errorElements = _getErrorElements(field);\r\n var errorClassElement = errorElements[0],\r\n errorTextElement = errorElements[1];\r\n\r\n if (errorClassElement) {\r\n errorClassElement.classList.remove(self.config.successClass);\r\n errorClassElement.classList.add(self.config.errorClass);\r\n }\r\n if (errorTextElement) {\r\n errorTextElement.innerHTML = field.errors.join('
');\r\n errorTextElement.style.display = errorTextElement.pristineDisplay || '';\r\n }\r\n }\r\n\r\n /***\r\n * Adds error to a specific field\r\n * @param input\r\n * @param error\r\n */\r\n self.addError = function (input, error) {\r\n input = input.length ? input[0] : input;\r\n input.pristine.errors.push(error);\r\n _showError(input.pristine);\r\n };\r\n\r\n function _removeError(field) {\r\n var errorElements = _getErrorElements(field);\r\n var errorClassElement = errorElements[0],\r\n errorTextElement = errorElements[1];\r\n if (errorClassElement) {\r\n // IE > 9 doesn't support multiple class removal\r\n errorClassElement.classList.remove(self.config.errorClass);\r\n errorClassElement.classList.remove(self.config.successClass);\r\n }\r\n if (errorTextElement) {\r\n errorTextElement.innerHTML = '';\r\n errorTextElement.style.display = 'none';\r\n }\r\n return errorElements;\r\n }\r\n\r\n function _showSuccess(field) {\r\n var errorClassElement = _removeError(field)[0];\r\n errorClassElement && errorClassElement.classList.add(self.config.successClass);\r\n }\r\n\r\n /***\r\n * Resets the errors\r\n */\r\n self.reset = function () {\r\n for (var i = 0; self.fields[i]; i++) {\r\n self.fields[i].errorElements = null;\r\n }\r\n Array.from(self.form.querySelectorAll('.' + PRISTINE_ERROR)).map(function (elem) {\r\n elem.parentNode.removeChild(elem);\r\n });\r\n Array.from(self.form.querySelectorAll('.' + self.config.classTo)).map(function (elem) {\r\n elem.classList.remove(self.config.successClass);\r\n elem.classList.remove(self.config.errorClass);\r\n });\r\n };\r\n\r\n /***\r\n * Resets the errors and deletes all pristine fields\r\n */\r\n self.destroy = function () {\r\n self.reset();\r\n self.fields.forEach(function (field) {\r\n delete field.input.pristine;\r\n });\r\n self.fields = [];\r\n };\r\n\r\n self.setGlobalConfig = function (config) {\r\n defaultConfig = config;\r\n };\r\n\r\n return self;\r\n }\r\n\r\n /***\r\n *\r\n * @param name => Name of the global validator\r\n * @param fn => validator function\r\n * @param msg => message to show when validation fails. Supports templating. ${0} for the input's value, ${1} and\r\n * so on are for the attribute values\r\n * @param priority => priority of the validator function, higher valued function gets called first.\r\n * @param halt => whether validation should stop for this field after current validation function\r\n */\r\n Pristine.addValidator = function (name, fn, msg, priority, halt) {\r\n _(name, { fn: fn, msg: msg, priority: priority, halt: halt });\r\n };\r\n\r\n Pristine.addMessages = function (locale, messages) {\r\n var langObj = lang.hasOwnProperty(locale) ? lang[locale] : lang[locale] = {};\r\n\r\n Object.keys(messages).forEach(function (key, index) {\r\n langObj[key] = messages[key];\r\n });\r\n };\r\n\r\n Pristine.setLocale = function (locale) {\r\n currentLocale = locale;\r\n };\r\n\r\n return Pristine;\r\n\r\n})));","export function topNav() {\r\n const menu = document.querySelector(\"#jsmenu\");\r\n const links = document.getElementsByClassName(\"small-menu\");\r\n const header = document.querySelector(\".header-main\");\r\n menu.addEventListener(\"click\", () => {\r\n menu.classList.toggle(\"menu-button-open\")\r\n header.classList.toggle(\"header-open\")\r\n for (let item of links) {\r\n item.classList.toggle(\"small-menu-hidden\")\r\n };\r\n });\r\n window.addEventListener('resize', function () {\r\n menu.classList.remove(\"menu-button-open\")\r\n header.classList.remove(\"header-open\")\r\n for (let item2 of links) {\r\n item2.classList.add(\"small-menu-hidden\")\r\n }; \r\n });\r\n}","// import AriaTablist from 'aria-tablist';\r\nimport { detectDevice } from './modules/detectDevice.js';\r\nimport { cookieAccept } from './modules/cookie.js';\r\nimport { topNav } from './modules/topNav.js';\r\nimport { logoSlider } from './modules/logoSlider.js';\r\nimport { scrollAnimations } from './modules/scrollAnimations.js';\r\nimport { chaptersList } from './modules/chaptersList';\r\nimport { actionBar } from './modules/actionBar';\r\nimport { sharePage } from './modules/sharePage';\r\nimport { fileUploader } from './modules/fileUploader';\r\nimport { toggleVisibility } from './modules/toggleVisibility';\r\nimport { scrollToTop } from './modules/scrollToTop';\r\nimport { formInputLinks } from './modules/formInputLinks';\r\nimport Pristine from './modules/pristine.js';\r\nimport { formValidation } from './modules/formValidation.js';\r\n\r\n\r\ntopNav();\r\ndetectDevice();\r\ncookieAccept();\r\nlogoSlider();\r\nscrollAnimations();\r\nchaptersList();\r\nactionBar();\r\nsharePage(window, document);\r\nfileUploader();\r\ntoggleVisibility(); // universal method\r\nscrollToTop();\r\nformInputLinks();\r\nformValidation(Pristine);\r\n\r\n\r\n// if (document.getElementById('tablist')) {\r\n// AriaTablist(document.getElementById('tablist'));\r\n// }\r\n","export function detectDevice() {\r\n var isIOS = /iPad|iPhone|iPod/.test(navigator.platform) || (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1);\r\n if (isIOS) {\r\n document.body.classList.add(\"is-ios\");\r\n window.isIOS = true;\r\n }\r\n}","export function cookieAccept() {\r\n if (document.getElementById(\"acceptcookies\")) {\r\n const cookieButton = document.getElementById(\"acceptcookies\");\r\n const cookieContainer = document.getElementById(\"cookies\");\r\n if (localStorage.getItem(\"cookieAccept\") !== null) {\r\n cookieContainer.classList.add('hidden');\r\n } else if (cookieButton !== null) {\r\n cookieContainer.classList.remove('hidden');\r\n cookieButton.addEventListener(\"click\", () => {\r\n localStorage.setItem(\"cookieAccept\", \"true\");\r\n cookieContainer.classList.add('hidden');\r\n });\r\n }\r\n }\r\n}","import Glide, { Breakpoints, Autoplay } from '@glidejs/glide/dist/glide.modular.esm';\r\n\r\nexport function logoSlider() {\r\n if (document.getElementsByClassName('logo-slider').length) {\r\n\r\n new Glide('.glide-logo-slider', {\r\n type: 'carousel',\r\n autoplay: 3000,\r\n animationDuration: 3000,\r\n animationTimingFunc: 'linear',\r\n hoverpause: false,\r\n startAt: 0,\r\n breakpoints: {\r\n perView: 6,\r\n 440: {\r\n perView: 3\r\n },\r\n 1024: {\r\n perView: 5\r\n },\r\n 1440: {\r\n perView: 6\r\n },\r\n 2560: {\r\n perView: 6\r\n }\r\n }\r\n }).mount({ Breakpoints, Autoplay })\r\n }\r\n}","export function scrollAnimations() {\r\n let observedElements = document.querySelectorAll('.inview-element');\r\n\r\n if (window.innerWidth <= 450)\r\n {\r\n var options = {\r\n threshold: 0.20 //larger elements on tiny mobile need a lower threshold again around 20% should be fine \r\n }\r\n }\r\n else if (window.innerWidth <= 770)\r\n {\r\n var options = {\r\n threshold: 0.30 //larger elements on mobile need a lower threshold again around 30% should be fine \r\n }\r\n }\r\n else\r\n {\r\n var options = {\r\n threshold: 0.4 //larger elements need a lower threshold around 40% is max \r\n }\r\n }\r\n \r\n const inViewCallback = entries => {\r\n entries.forEach(entry => {\r\n if (entry.isIntersecting) {\r\n entry.target.classList.add('inview');\r\n }\r\n });\r\n }\r\n let observer = new IntersectionObserver(inViewCallback,options); // create a new instance using our callback which contains our elements and actions, using the options we defined\r\n \r\n observedElements.forEach(element => {\r\n observer.observe(element) // run the observer \r\n });\r\n \r\n // Apply Animation Classes strictly through Javascript for graceful degradation. \r\n \r\n /* observedElements.forEach(entry => {\r\n entry.classList.add('animated');\r\n }); \r\n \r\n // Alternatively, can be placed directly in markup\r\n \r\n let animatedElements = document.querySelectorAll('.animated');\r\n animatedElements.forEach(entry => {\r\n entry.className += \" animated\";\r\n });\r\n \r\n */\r\n \r\n \r\n}","export function chaptersList() {\r\n const chaptersListTrigger = document.querySelector(\"#chaptersListTrigger\");\r\n const chaptersList = document.querySelector(\"#chaptersList\");\r\n if (chaptersListTrigger !== null && chaptersList !== null) {\r\n chaptersListTrigger.addEventListener(\"click\", () => {\r\n chaptersList.classList.toggle(\"open\")\r\n });\r\n }\r\n}","export function actionBar() {\r\n const actionBar = document.querySelector(\".event-actionbar\");\r\n const btn = document.querySelector(\"#actionbarMoreBtn\");\r\n const panel = document.querySelector(\"#actionbarMorePanel\");\r\n\r\n if (btn !== null && panel !== null) {\r\n // Mobile swtich for extra elements in the actionbar\r\n btn.addEventListener(\"click\", () => {\r\n panel.classList.toggle(\"open\")\r\n });\r\n window.addEventListener('resize', function () {\r\n panel.classList.remove(\"open\")\r\n });\r\n \r\n // Scrolling switch of actionbar visibility \r\n let heroEvent = document.querySelector('.hero-event');\r\n let observer = new IntersectionObserver(function (entry) {\r\n if (!entry[0].isIntersecting) {\r\n actionBar.classList.add(\"open\");\r\n } else {\r\n actionBar.classList.remove(\"open\");\r\n }\r\n });\r\n observer.observe(heroEvent);\r\n }\r\n\r\n\r\n}","export function fileUploader() {\r\n var inputFile = document.querySelector('#upload-image');\r\n var inputUserImage = document.querySelector('#userImage');\r\n var browseBtn = document.querySelector('#upload-image-finder');\r\n var imageCropCancelBtn = document.querySelector('#imageCropBtnCancel');\r\n var imageCropBtnCrop = document.querySelector('#imageCropBtnCrop');\r\n var image = document.getElementById(\"imageCropImg\");\r\n var cropper = null;\r\n\r\n if (inputFile == undefined || browseBtn == undefined || image == undefined) {\r\n return false\r\n }\r\n\r\n browseBtn.addEventListener('click', (e) => {\r\n e.stopPropagation();\r\n inputFile.click();\r\n });\r\n\r\n imageCropCancelBtn.addEventListener('click', (e) => {\r\n toggleCropTool();\r\n });\r\n\r\n imageCropBtnCrop.addEventListener('click', (e) => {\r\n toggleCropTool();\r\n });\r\n\r\n inputFile.addEventListener('change', function (e) {\r\n var files = e.target.files;\r\n var done = function (url) {\r\n inputFile.value = \"\";\r\n image.src = url;\r\n toggleCropTool();\r\n cropper = new Cropper(image, {\r\n aspectRatio: 1 / 1\r\n });\r\n };\r\n var reader;\r\n var file;\r\n\r\n if (files && files.length > 0) {\r\n file = files[0];\r\n\r\n if (URL) {\r\n done(URL.createObjectURL(file));\r\n } else if (FileReader) {\r\n reader = new FileReader();\r\n reader.onload = function (e) {\r\n done(reader.result);\r\n };\r\n reader.readAsDataURL(file);\r\n }\r\n }\r\n });\r\n\r\n imageCropBtnCrop.addEventListener('click', function () {\r\n if (cropper != null) {\r\n console.log(2, cropper)\r\n var imgData = cropper.getCroppedCanvas({\r\n width: 128\r\n }).toDataURL();\r\n document.getElementById('imageCropResultImg').src = imgData;\r\n inputUserImage.value = imgData;\r\n cropper.destroy();\r\n cropper = null;\r\n }\r\n });\r\n\r\n function toggleCropTool() {\r\n document.querySelector('.image-crop-container').classList.toggle('hide');\r\n }\r\n}\r\n","export function toggleVisibility() {\r\n const togglers = document.querySelectorAll('.toggler');\r\n\r\n togglers.forEach(el => el.addEventListener('click', e => {\r\n var targetId = e.target.dataset.toggleVis;\r\n console.log('1s')\r\n if (targetId != undefined) {\r\n document.getElementById(targetId).classList.toggle('hide');\r\n }\r\n }));\r\n}","export function formInputLinks() {\r\n var containers = document.querySelectorAll('.form-input-links');\r\n\r\n containers.forEach(function (container) {\r\n \r\n var buttonAdd = container.querySelector('button.add');\r\n var buttonRemove = container.querySelector('button.remove');\r\n\r\n buttonAdd.addEventListener('click', (e) => {\r\n e.stopPropagation();\r\n var inputs = container.querySelectorAll('input[type=\"text\"]');\r\n var newInput = inputs[inputs.length - 1].cloneNode(true);\r\n newInput.value = '';\r\n var attributeName = newInput.getAttribute('name').split(\"[\")[0];\r\n newInput.setAttribute('name', (attributeName + '[' + inputs.length + ']'));\r\n inputs[inputs.length - 1].after(newInput);\r\n buttonRemove.classList.remove('hide');\r\n });\r\n\r\n\r\n buttonRemove.addEventListener('click', (e) => {\r\n e.stopPropagation();\r\n var inputs = container.querySelectorAll('input[type=\"text\"]');\r\n container.removeChild(inputs[inputs.length - 1]);\r\n if (inputs.length == 2) {\r\n buttonRemove.classList.add('hide');\r\n }\r\n });\r\n })\r\n}\r\n","export function formValidation(Pristine) {\r\n // Forms validation using pristine.js \r\n if (document.getElementsByClassName('form-validate').length) {\r\n var forms = document.getElementsByClassName('form-validate');\r\n for (var i = 0; i < forms.length; i++) {\r\n (function (formInstance) {\r\n var pristine = new Pristine(formInstance);\r\n var ethnicityElement = document.querySelector('.ethnicity-options');\r\n if (ethnicityElement != null && ethnicityElement != undefined) {\r\n pristine.addValidator(ethnicityElement, function (value) {\r\n if (value.length && value == \"Please select from below\") {\r\n return false;\r\n }\r\n return true;\r\n }, \"Plaese select an ethnicity option.\", 2, false);\r\n }\r\n formInstance.addEventListener('submit', function (e) {\r\n var self = this;\r\n e.preventDefault();\r\n var valid = pristine.validate();\r\n console.log(valid)\r\n\r\n // Workaround for tinymce elayed value popualtion\r\n setTimeout(function () {\r\n valid = pristine.validate();\r\n console.log(valid)\r\n\r\n if (!valid) {\r\n var scrollTarget = document.getElementsByClassName('has-danger')[0].offsetTop - 70;\r\n if (window.isIOS) {\r\n window.scrollTo({ top: scrollTarget });\r\n } else {\r\n window.scrollTo({ top: scrollTarget, behavior: 'smooth' });\r\n }\r\n } else {\r\n self.submit();\r\n }\r\n }, 100);\r\n\r\n });\r\n })(forms[i]);\r\n }\r\n }\r\n}"],"names":["defaults","type","startAt","perView","focusAt","gap","autoplay","hoverpause","keyboard","bound","swipeThreshold","dragThreshold","perTouch","touchRatio","touchAngle","animationDuration","rewind","rewindDuration","animationTimingFunc","throttle","direction","peek","breakpoints","classes","ltr","rtl","slider","carousel","swipeable","dragging","cloneSlide","activeNav","activeSlide","disabledArrow","warn","msg","console","error","_typeof","Symbol","iterator","obj","constructor","prototype","classCallCheck","instance","Constructor","TypeError","createClass","defineProperties","target","props","i","length","descriptor","enumerable","configurable","writable","Object","defineProperty","key","protoProps","staticProps","_extends","assign","arguments","source","hasOwnProperty","call","get","object","property","receiver","Function","desc","getOwnPropertyDescriptor","undefined","parent","getPrototypeOf","value","getter","possibleConstructorReturn","self","ReferenceError","toInt","parseInt","isString","isObject","isFunction","isUndefined","isArray","Array","mount","glide","extensions","events","components","name","_name","define","prop","definition","mergeOptions","settings","options","EventsBus","this","hop","event","handler","on","index","push","remove","context","emit","forEach","item","Glide","selector","_c","_t","_e","disabled","transformers","pattern","Run","make","distance","Transition","disable","Move","interval","_o","set","o","_i","_d","status","now","Date","getTime","func","wait","timeout","args","result","previous","later","leading","apply","throttled","at","remaining","clearTimeout","trailing","setTimeout","cancel","MARGIN_TYPE","exist","node","window","HTMLElement","TRACK_SELECTOR","EventsBinder","listeners","el","closure","capture","addEventListener","removeEventListener","VALID_DIRECTIONS","FLIPED_MOVEMENTS","Rtl","Components","modify","translate","Direction","is","Gap","Gaps","Grow","Clones","grow","Peeking","Peek","before","Focusing","width","Sizes","slideWidth","opts","e","Events","Binder","Autoplay","start","bind","_this","setInterval","stop","time","clearInterval","_this2","Html","root","unbind","off","slides","getAttribute","destroy","sortBreakpoints","points","keys","sort","reduce","r","k","Breakpoints","match","matchMedia","point","matches","COMPONENTS","track","querySelector","slice","wrapper","children","filter","slide","classList","contains","_r","document","t","Translate","transform","TRANSFORMERS","concat","mutate","transformer","mutator","style","isType","isOffset","after","movement","compose","duration","transition","callback","enable","offset","resolve","token","split","join","addClass","add","removeClass","_v","indexOf","setupSlides","setupWrapper","dimention","wrapperSize","offsetWidth","reductor","len","marginLeft","marginRight","items","collect","_Glide$settings","peekIncrementer","part","end","Math","max","floor","clone","cloneNode","_clone","unshift","append","_Components$Html","half","prepend","reverse","appendChild","_i2","insertBefore","_i3","removeChild","Resize","Build","typeClass","activeClass","parentNode","n","firstChild","matched","nextSibling","nodeType","siblings","sibling","removeClasses","move","calculate","isStart","isEnd","steps","countableSteps","min","_m","step","substr","Glide$1","_Core","Glide$$1","__proto__","subClass","superClass","create","setPrototypeOf","inherits","trigger","rootElement","module","lang","en","required","email","number","integer","url","tel","maxlength","minlength","equals","findAncestor","cls","parentElement","tmpl","_arguments","replace","a","b","groupedElemCount","input","pristine","form","querySelectorAll","mergeConfig","obj1","obj2","attr","defaultConfig","classTo","errorClass","successClass","errorTextParent","errorTextTag","errorTextClass","PRISTINE_ERROR","SELECTOR","ALLOWED_ATTRIBUTES","EMAIL_REGEX","MESSAGE_REGEX","currentLocale","validators","_","validator","priority","Pristine","config","live","init","setAttribute","fields","from","map","fns","params","messages","attributes","test","messageMatch","locale","_addValidatorToField","validate","valueParams","_validateField","field","errors","valid","fn","halt","_getErrorElements","errorElements","errorClassElement","errorTextElement","createElement","className","pristineDisplay","display","_showError","innerHTML","_removeError","_showSuccess","silent","NodeList","$","getErrors","erroneousFields","tagName","toLowerCase","addValidator","elem","addError","reset","setGlobalConfig","val","isNaN","parseFloat","limit","m","RegExp","otherFieldSelector","other","addMessages","langObj","setLocale","factory","menu","links","getElementsByClassName","header","toggle","item2","topNav","navigator","platform","maxTouchPoints","body","isIOS","getElementById","cookieButton","cookieContainer","localStorage","getItem","setItem","cookieAccept","observedElements","innerWidth","threshold","observer","IntersectionObserver","entries","entry","isIntersecting","element","observe","scrollAnimations","chaptersListTrigger","chaptersList","actionBar","btn","panel","heroEvent","currentTarget","srcElement","share","getValue","facebook","shareUrl","u","linkedin","mini","twitter","text","hashtags","via","subject","isLink","whatsapp","height","urlSharer","encodeURIComponent","location","href","s","l","h","screenX","innerHeight","screenY","g","open","focus","readyState","Sharer","inputFile","inputUserImage","browseBtn","imageCropCancelBtn","imageCropBtnCrop","image","cropper","toggleCropTool","stopPropagation","click","reader","file","files","done","src","Cropper","aspectRatio","URL","createObjectURL","FileReader","onload","readAsDataURL","log","imgData","getCroppedCanvas","toDataURL","fileUploader","targetId","dataset","toggleVis","documentElement","preventDefault","scrollTo","top","behavior","container","buttonAdd","buttonRemove","inputs","newInput","attributeName","forms","formInstance","ethnicityElement","submit","scrollTarget","offsetTop","formValidation"],"mappings":"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"}