{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./node_modules/spa-dom/jsx.js","webpack:///./src/js/lib/component.js","webpack:///./src/js/app.js","webpack:///./node_modules/cjs-emitter/index.js","webpack:///./src/js/lib/spinner.js","webpack:///./src/js/lib/components/list.js","webpack:///./src/js/lib/api/backend.js","webpack:///./node_modules/@babel/runtime/helpers/interopRequireDefault.js","webpack:///./src/js/lib/api/shared.backend.js","webpack:///../plugin-backend-tv-stalker/src/js/stalker.js","webpack:///../plugin-backend-tv-stalker/node_modules/cjs-emitter/index.js","webpack:///./src/js/config.js","webpack:///./src/js/lib/api/statuses.js","webpack:///./node_modules/@babel/runtime/helpers/createClass.js","webpack:///./node_modules/@babel/runtime/helpers/inheritsLoose.js","webpack:///./src/js/lib/components/select.js","webpack:///../plugin-backend-tv-stalker/src/js/epg.class.js","webpack:///../plugin-backend-tv-stalker/src/js/data.storage.js","webpack:///./src/js/lib/components/header.js","webpack:///./src/js/main.js","webpack:///./node_modules/spa-gettext/index.js","webpack:///./node_modules/cjs-gettext/index.js","webpack:///./src/js/lib/components/tab-set.js","webpack:///./node_modules/@babel/runtime/regenerator/index.js","webpack:///./node_modules/regenerator-runtime/runtime.js","webpack:///./node_modules/@babel/runtime/helpers/asyncToGenerator.js","webpack:///./src/js/lib/api/stalker.api.unsecure.js","webpack:///./src/js/lib/api/device.api.js","webpack:///./src/js/lib/analytics.js","webpack:///./src/js/pages/login.js","webpack:///./node_modules/spa-keys/index.js","webpack:///./node_modules/cjs-format/index.js","webpack:///./src/js/lib/components/input.js","webpack:///./src/js/lib/components/button.js","webpack:///./src/js/pages/channels.js","webpack:///./node_modules/@babel/runtime/helpers/assertThisInitialized.js","webpack:///./src/js/lib/api/tv.provider.js","webpack:///../plugin-backend-tv-stalker/src/js/main.js","webpack:///../plugin-backend-tv-stalker/src/js/channel.class.js","webpack:///../plugin-backend-tv-stalker/src/js/daemon.stalker.js","webpack:///../plugin-backend-tv-stalker/src/js/leanback.js","webpack:///../plugin-backend-tv-stalker/node_modules/magcore-plugin-content-board/index.js","webpack:///../plugin-backend-tv-stalker/node_modules/magcore-plugin-content-board/src/js/lib/index.js","webpack:///./src/js/lib/player.js","webpack:///./src/js/lib/components/channel.list.js","webpack:///./src/js/lib/components/program.list.js","webpack:///./src/js/pages/profile.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","dom","tag","tagName","attributes","content","$node","index","argument","links","document","createElement","link","arguments","length","appendChild","createTextNode","Emitter","require","Component","config","classList","modifiers","self","this","hidden","focusable","focused","forEach","modifier","push","className","join","add","apply","events","addListeners","constructor","defineProperties","set","nodeClass","setAttribute","onfocus","event","focus","emit","onblur","remove","blur","addEventListener","removeAttribute","removeEventListener","activeElement","hide","show","child","$parent","parentNode","removeChild","app","addListener","callback","once","onceWrapper","removeListener","callbacks","filter","fn","undefined","Array","slice","jsxDomTag","html","window","q","List","_this","render","data","$item","target","click","defaultPrevented","$focusItem","clearTimeout","scrollTimeout","setTimeout","$fragment","createDocumentFragment","internals","isArray","lastChild","focusIndex","dataItem","dataset","$value","itemClass","Number","$target","children","textContent","ministraApi","host","USERDATA_NAME","ERROR_CODES","map","core","backend","request","stalker","lang","language","oncredenitalsrequired","STATE_AUTHORIZED","STATE_NOT_AUTHORIZED","init","Promise","resolve","userData","JSON","parse","localStorage","getItem","assign","session","authHost","user","login","userLogin","ping","then","state","error","credentials","address","activationCode","userDataToSave","password","reject","auth","error_description","refreshToken","accessToken","userId","setItem","stringify","signOut","removeItem","location","reload","getSettings","onload","result","onerror","getProfileInfo","getThemeData","themeAlias","theme","getAllUserInfo","_getAllUserInfo","_asyncToGenerator2","_regenerator","mark","_callee","profile","wrap","_context","prev","next","sent","settings","themes","alias","logoFilename","logoPath","abrupt","stop","obj","default","instance","LAST_CHANNELS_ADD","LAST_CHANNELS_UPDATE","LAST_CHANNELS_DELETE","totalChannels","Channel","Epg","storage","instanceList","INIT_CHANNELS_LIMIT","BACKGROUND_INTERVAL_TO","BACKGROUND_INTERVAL_FROM","EMPTY_INTERVAL_COUNT","emptyCounter","addCount","updateCount","deleteCount","tempChannelsData","intervals","deleteChannelsHandler","Date","response","timestamp","list","ch","indexOf","id","provider","updateChannelsHandler","hash","updated","getChannels","url","now","offset","paging","total","eventName","update","onabort","Provider","backgroungCheckInterval","message","type","addChannelsInterval","setInterval","concat","deleteChannelsInterval","updateChannelsInterval","UPDATE_INTERVALS_DELAY","reg","favorite","channel","genre","byName","sort","itemA","itemB","number","pvr","local_pvr","search","RegExp","matchName","match","matchNumber","toString","updateChannelsList","getCategories","getLastChannelId","method","getEpgLink","channelId","epgId","getChannelsEpg","multiple","channelArray","params","channels","from","to","Math","round","encodeURIComponent","keys","targetData","epgData","destroy","splice","startBackgroundCheck","getRandomTimeout","seconds","floor","random","previousCount","stopBackgroundCheck","navigator","split","toLowerCase","supportedLanguages","code","title","protocol","programListUpdateInterval","saveLastChannelTimeout","licenseKeyLength","errors","ERROR_NEED_LICENSE_KEY","ERROR_ACCOUNT_DISABLED","ERROR_WRONG_LICENSE_KEY","ERROR_WRONG_LOGIN","ERROR_WRONG_META_DATA","ERROR_WRONG_OPERATOR_ID","Automatic activation code issuing disabled for user.","Account is disabled","License key not found","Username or password is incorrect","Meta data mismatch","Operator ID mismatch","_defineProperties","props","descriptor","configurable","writable","Constructor","protoProps","staticProps","subClass","superClass","__proto__","__filename","Select","innerText","label","_Component","_assertThisInitialized2","current","element","array","Error","downloadable","start","end","archive","in_archive","getLink","propertyName","findByNumber","prop","menu","text","gettext","action","tabSet","pages","languageSelect","toUpperCase","focus:item","src","header","findIndex","userName","$userName","logo","path","$logo","$tvChannel","TabSet","spinner","load","body","userInfo","Gettext","loader","prepare","_","pgettext","ngettext","defaultLanguage","xhr","ext","XMLHttpRequest","responseText","ontimeout","open","send","meta","msgId","context","plural","evalResult","eval","previous","tab","runtime","Op","hasOwn","$Symbol","iteratorSymbol","iterator","asyncIteratorSymbol","asyncIterator","toStringTagSymbol","innerFn","outerFn","tryLocsList","protoGenerator","Generator","generator","Context","_invoke","GenStateSuspendedStart","arg","GenStateExecuting","GenStateCompleted","doneResult","delegate","delegateResult","maybeInvokeDelegate","ContinueSentinel","_sent","dispatchException","record","tryCatch","done","GenStateSuspendedYield","makeInvokeMethod","err","GeneratorFunction","GeneratorFunctionPrototype","IteratorPrototype","getProto","getPrototypeOf","NativeIteratorPrototype","values","Gp","defineIteratorMethods","AsyncIterator","previousPromise","callInvokeWithMethodAndArg","invoke","__await","unwrapped","TypeError","info","resultName","nextLoc","pushTryEntry","locs","entry","tryLoc","catchLoc","finallyLoc","afterLoc","tryEntries","resetTryEntry","completion","reset","iterable","iteratorMethod","isNaN","displayName","isGeneratorFunction","genFun","ctor","setPrototypeOf","awrap","async","iter","reverse","pop","skipTempReset","charAt","rootRecord","rval","exception","handle","loc","caught","hasCatch","hasFinally","finallyEntry","complete","finish","catch","thrown","delegateYield","regeneratorRuntime","accidentalStrictMode","Function","asyncGeneratorStep","gen","_next","_throw","args","deviceApi","defaults","headers","timeout","defaultsKeys","requestStack","locked","api","account","macAlgorithm","macKey","options","afterRefresh","headersKeys","client","fetch","String","setRequestHeader","responseType","onreadystatechange","readyState","shift","status","onfail","onLoadException","postData","ready","timer","abort","replace","parseException","access_token","user_id","activation_code","refresh_token","mac_algorithm","mac_key","v3","saveCallback","clientType","someProblem","metric3","network","mac","metric1","metric2","gtag","dataLayer","page","format","Input","Button","authErrors","STATE_INPUT_LOGIN","STATE_INPUT_LICENSE","inputs","buttons","credentialsData","tagB","validateInput","input","minimalLength","trim","STATE_ERROR","STATE_NORMAL","setState","newState","$text","innerHTML","license","processAuthError","$loginError","loginHandler","inputKeydownHandler","keyCode","enter","keydown","activationKey","backspace","escape","space","pageUp","pageDown","home","left","up","right","down","insert","del","change","placeholder","onContentEnd","programList","player","playChannel","channelList","categorySelect","lastId","plugin","pause","categories","category","today","todayStart","getFullYear","getMonth","getDate","getTime","nextDayStart","getEpg","programs","program","playEpgProgram","uri","ReferenceError","onAppInit","worker","appPlugin","onInit","onContentBoardInit","dump","storageRequest","toggleFavorite","getUrl","solution","onRequestError","setLast","TV_APP_NAME","CLASSIC_TV_APP_NAME","appsConfig","isAppRunning","appName","taskManager","topApp","packageName","hardcodeLoader","TV","packageMap","CLASSIC_TV","appProvider","channelToPlay","targetApp","channelToCheckCensored","msg","censored","runApp","ignoreAccessControl","visible","parseInt","getAppProvider","leanback","providerIcons","480","normal","active","576","720","1080","imagePath","screen","height","query","doneCallback","icons","startData","dataToSend","icon","layout","layouts","tvChannel","geometry","horizontal","progress","cb","actions","accessControl","onClick","sendIntent","intent","mime","headless","mediaId","extra","retryOnError","stream","video","static","application","square","vertical","expandItemContent","lastChannelTimeout","lastPlayedContent","width","onPlayHandler","play","onPlayEnd","videojs","$video","controls","preload","on","$liveButton","_this2","$title","playConfig","isEnglish","time","startTime","hours","minutes","ampm","nowTime","getHours","getMinutes","firstChild","$login","$tariff","$endDate"],"mappings":"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","file":"main.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 19);\n","/**\n * HTML elements low-level handling for JSX.\n *\n * @license The MIT License (MIT)\n * @author Stanislav Kalashnik \n */\n\n'use strict';\n\n/* eslint no-unused-vars: 0 */\n\n/**\n * DOM manipulation module\n */\nvar dom = {};\n\n\n/**\n * Create a new HTML element.\n *\n * @param {string} tagName - mandatory tag name\n * @param {Object|null} [attributes] - element attributes\n * @param {...*} [content] - element content (primitive value/values or other nodes)\n * @return {Object} HTML element with links\n */\ndom.tag = function ( tagName, attributes, content ) {\n var links = {},\n $node, index, name, argument;\n\n console.assert(arguments.length > 0, 'wrong arguments number');\n console.assert(typeof tagName === 'string', 'wrong tagName type');\n console.assert(tagName.length > 0, 'empty tagName');\n\n // empty element\n $node = document.createElement(tagName);\n\n // optional attribute list is given\n if ( attributes && typeof attributes === 'object' ) {\n // apply link and clear attributes\n if ( attributes.link ) {\n links[attributes.link] = $node;\n attributes.link = null;\n }\n\n for ( name in attributes ) {\n console.assert(typeof name === 'string', 'wrong attribute name type');\n console.assert(name.length > 0, 'empty attribute name');\n\n if ( attributes[name] !== null ) {\n // extend a new node with the given attributes\n $node[name] = attributes[name];\n }\n }\n }\n\n // content (arguments except the first two)\n for ( index = 2; index < arguments.length; index++ ) {\n argument = arguments[index];\n\n if ( argument && argument.$node ) {\n $node.appendChild(argument.$node);\n\n for ( name in argument.links ) {\n links[name] = argument.links[name];\n }\n } else {\n $node.appendChild(document.createTextNode(argument));\n }\n }\n\n return {$node: $node, links: links};\n};\n\n\n// public\nmodule.exports = dom;\n","/**\n * @license The MIT License (MIT)\n * @copyright Stanislav Kalashnik \n */\n\n'use strict';\n\nvar Emitter = require('cjs-emitter');\n\n\n// /**\n// * Base component implementation.\n// *\n// * Visual element that can handle sub-components.\n// * Each component has a DOM element container $node with a set of classes:\n// * \"component\" and some specific component class names depending on the hierarchy, for example \"page\".\n// * Each component has a unique ID given either from $node.id or from data.id. If not given will generate automatically.\n// *\n// * @constructor\n// * @extends Emitter\n// *\n// * @param {Object} [config={}] init parameters\n// * @param {Element} [config.id] component unique identifier (generated if not set)\n// * @param {string} [config.className] space-separated list of classes for \"className\" property of this.$node\n// * @param {Element} [config.$node] DOM element/fragment to be a component outer container\n// * @param {Element} [config.$body] DOM element/fragment to be a component inner container (by default is the same as $node)\n// * @param {Component} [config.parent] link to the parent component which has this component as a child\n// * @param {Array.} [config.children=[]] list of components in this component\n// * @param {Object.} [config.events={}] list of event callbacks\n// * @param {boolean} [config.visible=true] component initial visibility state flag\n// * @param {boolean} [config.focusable=true] component can accept focus or not\n// * @param {boolean} [config.propagate=false] allow to emit events to the parent component\n// *\n// * @fires module:stb/component~Component#click\n// *\n// * @example\n// * var component = new Component({\n// * $node: document.getElementById(id),\n// * className: 'bootstrap responsive',\n// * events: {\n// * click: function () { ... }\n// * }\n// * });\n// * component.add( ... );\n// * component.focus();\n// */\nfunction Component ( config ) {\n // current execution context\n var self = this,\n //focusable = false,\n classList, modifiers,\n $node;\n\n\n // parent constructor call\n Emitter.call(this);\n\n /** @protected */\n this.private = {\n hidden: false,\n focusable: false,\n focused: false\n };\n\n // apply custom name\n config.name && (this.name = config.name);\n\n // component DOM container (empty div in case nothing is given)\n //this.$node = $node = config.id ? document.getElementById(config.id) : config.$node || document.createElement('div');\n this.$node = $node = config.$node || document.createElement('div');\n\n // to do: use/remove\n //this.$node.removeAttribute('id');\n\n // sanitize\n modifiers = config.modifiers || [];\n\n\n classList = [this.name];\n\n // there are some block modifiers\n if ( modifiers.length ) {\n // build class names\n modifiers.forEach(function ( modifier ) {\n classList.push(self.name + '--' + modifier);\n });\n }\n\n // append all new classes to the existing ones\n //$node.classList.add.apply($node.classList, classList);\n $node.className += classList.join(' ');\n\n config.focusable && (this.focusable = true);\n\n // set focus if can and necessary\n config.focusable && config.focused && (this.focused = true);\n\n config.hidden && (this.hidden = true);\n\n config.content && this.add.apply(this, config.content);\n\n // apply all given events\n config.events && this.addListeners(config.events);\n\n\n if ( DEVELOP ) {\n this.counters[this.constructor.name] = this.counters[this.constructor.name] || 0;\n this.counters[this.constructor.name]++;\n\n // expose inner ID to global scope\n this.$node.dataset.name = 'component' + this.constructor.name + this.counters[this.constructor.name];\n window[this.$node.dataset.name] = this;\n\n $node.addEventListener('click', function ( event ) {\n var time = Date.now();\n\n if ( event.ctrlKey ) {\n event.stopPropagation();\n window.link = self;\n window['c' + time] = self;\n\n console.group('component info');\n console.log(self);\n console.log($node.getBoundingClientRect());\n console.log('in DEVELOP mode this component is available in the global scope as \"%s\"', self.$node.dataset.name);\n console.groupEnd();\n }\n });\n\n // expose a link\n Object.defineProperty($node, 'component', {\n get: function () {\n console.warn('Accessing the associated component from a DOM node is a development-only feature!');\n\n return self;\n }\n });\n\n window['Component' + this.constructor.name] = this.constructor;\n\n //$node.component = this.$body.component = this;\n //$node.component = this;\n //$node.title = this.constructor.name + '#' + this.id + ' (outer)';\n //$node.title = this.name + ' instance of ' + this.constructor.name;\n //this.$body.title = this.name + '#' + this.id + ' (inner)';\n }\n\n //if ( this.focusable ) {}\n\n // debug.info('create component ' + this.name + '#' + this.id, null, {\n // tags: ['create', 'component', this.name, this.id]\n // });\n //return this;\n}\n\n\n// inheritance\nComponent.prototype = Object.create(Emitter.prototype);\nComponent.prototype.constructor = Component;\n\n\nObject.defineProperties(Component.prototype, {\n focusable: {\n get: function () {\n return this.private.focusable;\n },\n set: function ( value ) {\n var self = this,\n $node = this.$node,\n nodeClass = this.name + '--focused';\n\n // sanitize\n value = !!value;\n\n // nothing has changed\n if ( this.private.focusable === value ) {\n console.warn('focusable: current and new values are identical', value, this);\n } else {\n // save\n this.private.focusable = value;\n\n // apply\n if ( value ) {\n // has focus\n $node.setAttribute('tabIndex', '0');\n\n // prepare focus handlers\n this.private.onfocus = function onFocus ( event ) {\n // apply\n $node.classList.add(nodeClass);\n DEVELOP && $node.classList.add('develop-focused');\n // notify listeners\n self.events.focus && self.emit('focus', event);\n };\n this.private.onblur = function onFocus ( event ) {\n // apply\n $node.classList.remove(nodeClass);\n DEVELOP && $node.classList.remove('develop-focused');\n // notify listeners\n self.events.blur && self.emit('blur', event);\n };\n\n // add handlers\n $node.addEventListener('focus', this.private.onfocus);\n $node.addEventListener('blur', this.private.onblur);\n } else {\n // does not have focus\n $node.removeAttribute('tabIndex');\n\n // remove handlers\n $node.removeEventListener('focus', this.private.onfocus);\n $node.removeEventListener('blur', this.private.onblur);\n\n // clear\n delete this.private.onfocus;\n delete this.private.onblur;\n\n // blur just in case\n this.focused = false;\n }\n }\n }\n },\n\n focused: {\n get: function () {\n return this.private.focused;\n },\n set: function ( value ) {\n // apply\n if ( value ) {\n this.$node.focus();\n\n if ( document.activeElement !== this.$node ) {\n console.warn('focused: fail to focus or not focusable', value, this);\n }\n } else {\n this.$node.blur();\n }\n }\n },\n\n hidden: {\n get: function () {\n return this.private.hidden;\n },\n set: function ( value ) {\n var $node = this.$node,\n nodeClass = this.name + '--hidden';\n\n // sanitize\n value = !!value;\n\n // nothing has changed\n if ( this.private.hidden === value ) {\n console.warn('hidden: current and new values are identical', value, this);\n } else {\n // save\n this.private.hidden = value;\n\n // apply\n if ( value ) {\n // hide\n $node.classList.add(nodeClass);\n // notify listeners\n this.events.hide && this.emit('hide');\n } else {\n // show\n $node.classList.remove(nodeClass);\n // notify listeners\n this.events.show && this.emit('show');\n }\n }\n }\n }\n});\n\n\nif ( DEVELOP ) {\n // expose constructor to global scope\n window.Component = Component;\n\n Component.prototype.counters = {};\n}\n\n\n/**\n * List of all default event callbacks.\n *\n * @type {Object.}\n */\n//Component.prototype.defaultEvents = null;\n\n\n/**\n * Add a new component as a child.\n *\n * //@param {...Component} [child] variable number of elements to append\n *\n * //@files Component#add\n *\n * @example\n * panel.add(\n * new Button( ... ),\n * new Button( ... )\n * );\n */\nComponent.prototype.add = function () {\n var index, child;\n\n // walk through all the given elements\n for ( index = 0; index < arguments.length; index++ ) {\n child = arguments[index];\n\n // if ( DEVELOP ) {\n // if ( !(child instanceof Component) ) {\n // throw new Error(__filename + ': wrong child type');\n // }\n // }\n\n this.$node.appendChild(child.$node || child);\n\n // // apply\n // this.children.push(child);\n // child.parent = this;\n //\n // // correct DOM parent/child connection if necessary\n // if ( child.$node && child.$node.parentNode === null ) {\n // this.$body.appendChild(child.$node);\n // }\n //\n // debug.info('add component ' + child.name + '#' + child.id + ' to ' + this.name + '#' + this.id, null, {\n // tags: ['add', 'component', this.name, this.id, child.name, child.id]\n // });\n //\n // // there are some listeners\n // if ( this.events.add ) {\n // /**\n // * A child component is added.\n // *\n // * @event module:stb/component~Component#add\n // *\n // * @type {Object}\n // * @property {Component} item new component added\n // */\n // this.emit('add', {item: child});\n // }\n //\n // //debug.log('component ' + this.name + '#' + this.id + ' new child: ' + child.name + '#' + child.id);\n }\n};\n\n\n/* @todo: consider activation in future */\n///**\n// * Insert component into the specific position.\n// *\n// * @param {Component} child component instance to insert\n// * @param {number} index insertion position\n// */\n//Component.prototype.insert = function ( child, index ) {\n// var prevIndex = this.children.indexOf(child);\n//\n// if ( DEVELOP ) {\n// if ( arguments.length !== 2 ) { throw new Error(__filename + ': wrong arguments number'); }\n// if ( !(child instanceof Component) ) { throw new Error(__filename + ': wrong child type'); }\n// }\n//\n// if ( prevIndex !== -1 ) {\n// this.children.splice(prevIndex, 1);\n// this.$body.removeChild(child.$node);\n// }\n//\n// if ( index === this.children.length ) {\n// this.$body.appendChild(child.$node);\n// } else {\n// this.$body.insertBefore(child.$node, this.$body.children[index]);\n// }\n// this.children.splice(index, 0, child);\n//\n// if ( !child.parent ) {\n// child.parent = this;\n// }\n//};\n\n\n/**\n * Delete this component and clear all associated events.\n *\n * //@fires module:stb/component~Component#remove\n */\nComponent.prototype.remove = function () {\n var $parent = this.$node.parentNode;\n\n // really inserted somewhere\n // if ( this.parent ) {\n // if ( DEVELOP ) {\n // if ( !(this.parent instanceof Component) ) {\n // throw new Error(__filename + ': wrong this.parent type');\n // }\n // }\n //\n // // active at the moment\n // if ( app.activePage.activeComponent === this ) {\n // this.blur();\n // this.parent.focus();\n // }\n // this.parent.children.splice(this.parent.children.indexOf(this), 1);\n // }\n\n // remove all children\n // this.children.forEach(function ( child ) {\n // if ( DEVELOP ) {\n // if ( !(child instanceof Component) ) {\n // throw new Error(__filename + ': wrong child type');\n // }\n // }\n //\n // child.remove();\n // });\n\n //console.assert(this.$node.parentNode instanceof Element, 'wrong config type');\n\n // clear DOM\n $parent && $parent.removeChild(this.$node);\n\n // notify listeners\n this.events.remove && this.emit('remove');\n\n // remove all listeners\n this.events = {};\n\n //debug.log('component ' + this.name + '#' + this.id + ' remove', 'red');\n // debug.info('remove component ' + this.name + '#' + this.id, null, {\n // tags: ['remove', 'component', this.name, this.id]\n // });\n};\n\n\n/**\n * Activate the component.\n * Notify the owner-page and apply CSS class.\n *\n * @return {boolean} operation status\n *\n * //@fires module:stb/component~Component#focus\n */\n/*Component.prototype.focus = function () {\n this.$node.focus();\n\n // not already focused\n //if ( this.focusable && this !== focusComponent ) {\n // if ( this !== focusComponent ) {\n // // notify the current focused component\n // focusComponent && focusComponent.blur();\n //\n // // apply\n // this.$node.classList.add(this.name + '--focused');\n // focusComponent = this;\n //\n // if ( DEVELOP ) {\n // this.$node.classList.add('develop-focused');\n // }\n //\n // // notify listeners\n // this.events.focus && this.emit('focus', data);\n //\n // // ok\n // return true;\n // }\n\n // status\n return document.activeElement === this.$node;\n};*/\n\n\n/**\n * Remove focus.\n * Change page.activeComponent and notify subscribers.\n *\n * @return {boolean} operation status\n *\n * //@fires module:stb/component~Component#blur\n */\n/*Component.prototype.blur = function () {\n this.$node.blur();\n\n // is it focused\n // if ( this === focusComponent ) {\n // // apply\n // this.$node.classList.remove(this.name + '--focused');\n // focusComponent = null;\n //\n // if ( DEVELOP ) {\n // this.$node.classList.remove('develop-focused');\n // }\n //\n // // notify listeners\n // this.events.blur && this.emit('blur');\n //\n // // ok\n // return true;\n // }\n\n // status\n return document.activeElement !== this.$node;\n};*/\n\n\n/**\n * Make the component visible and notify subscribers.\n *\n * //@param {Object} [data] - custom data which passed into handlers\n *\n * @return {boolean} operation status\n *\n * //@fires module:stb/component~Component#show\n */\n/*Component.prototype.show = function () {\n if ( this.private.hidden ) {\n // correct style\n this.$node.classList.remove(this.name + '--hidden');\n // flag\n this.private.hidden = false;\n // notify listeners\n this.events.show && this.emit('show');\n\n // ok\n return true;\n }\n\n console.warn('component is already visible!', this);\n\n // status\n return false;\n};*/\n\n\n/**\n * Make the component hidden and notify subscribers.\n *\n * //@param {Object} [data] - custom data which passed into handlers\n *\n * @return {boolean} operation status\n *\n * //@fires module:stb/component~Component#hide\n */\n/*Component.prototype.hide = function () {\n if ( !this.private.hidden ) {\n // correct style\n this.$node.classList.add(this.name + '--hidden');\n // flag\n this.private.hidden = true;\n // notify listeners\n this.events.hide && this.emit('hide');\n\n // ok\n return true;\n }\n\n console.warn('component is already hidden!', this);\n\n // status\n return false;\n};*/\n\n\n/*Component.prototype.enable = function ( data ) {\n if ( this.disabled ) {\n // correct style\n this.$node.classList.remove(this.name + '--disabled');\n // flag\n this.disabled = false;\n // notify listeners\n this.events.enable && this.emit('enable', data);\n\n // ok\n return true;\n }\n\n // status\n return false;\n};\n\n\nComponent.prototype.disable = function ( data ) {\n if ( !this.disabled ) {\n // remove focus\n this.blur();\n\n // correct style\n this.$node.classList.add(this.name + '--disabled');\n // flag\n this.disabled = true;\n // notify listeners\n this.events.disable && this.emit('disable', data);\n\n // ok\n return true;\n }\n\n // status\n return false;\n};*/\n\n\n// public\nmodule.exports = Component;\n","/**\n * Application core.\n */\n\n'use strict';\n\nconst\n Emitter = require('cjs-emitter'),\n app = new Emitter();\n\n\n// load global app configuration\napp.config = require('./config');\n\nif ( DEVELOP ) {\n window.app = app;\n}\n\n\n// public\nmodule.exports = app;\n","/**\n * @license The MIT License (MIT)\n * @author Stanislav Kalashnik \n */\n\n/* eslint no-path-concat: 0 */\n\n'use strict';\n\n\n/**\n * Base Events Emitter implementation.\n *\n * @see http://nodejs.org/api/events.html\n * @constructor\n *\n * @example\n * var emitter = new Emitter();\n */\nfunction Emitter () {\n console.assert(typeof this === 'object', 'must be constructed via new');\n\n // if ( DEVELOP ) {\n // if ( typeof this !== 'object' ) { throw new Error(__filename + ': must be constructed via new'); }\n // }\n\n /**\n * Inner hash table for event names and linked callbacks.\n * Manual editing should be avoided.\n *\n * @member {Object.}\n *\n * @example\n * {\n * click: [\n * function click1 () { ... },\n * function click2 () { ... }\n * ],\n * keydown: [\n * function () { ... }\n * ]\n * }\n **/\n this.events = {};\n}\n\n\nEmitter.prototype = {\n /**\n * Bind an event to the given callback function.\n * The same callback function can be added multiple times for the same event name.\n *\n * @param {string} name event identifier\n * @param {function} callback function to call on this event\n *\n * @example\n * emitter.addListener('click', function ( data ) { ... });\n * // one more click handler\n * emitter.addListener('click', function ( data ) { ... });\n */\n addListener: function ( name, callback ) {\n console.assert(arguments.length === 2, 'wrong arguments number');\n console.assert(typeof name === 'string', 'wrong name type');\n console.assert(name.length > 0, 'empty name');\n console.assert(typeof callback === 'function', 'callback should be a function');\n\n // if ( DEVELOP ) {\n // if ( arguments.length !== 2 ) { throw new Error(__filename + ': wrong arguments number'); }\n // if ( typeof name !== 'string' || name.length === 0 ) { throw new Error(__filename + ': wrong or empty name'); }\n // if ( typeof callback !== 'function' ) { throw new Error(__filename + ': wrong callback type'); }\n // }\n\n // initialization may be required\n this.events[name] = this.events[name] || [];\n // append this new event to the list\n this.events[name].push(callback);\n },\n\n\n /**\n * Add a one time listener for the event.\n * This listener is invoked only the next time the event is fired, after which it is removed.\n *\n * @param {string} name event identifier\n * @param {function} callback function to call on this event\n *\n * @example\n * emitter.once('click', function ( data ) { ... });\n */\n once: function ( name, callback ) {\n // current execution context\n var self = this;\n\n if ( DEVELOP ) {\n if ( arguments.length !== 2 ) {\n throw new Error(__filename + ': wrong arguments number');\n }\n if ( typeof name !== 'string' || name.length === 0 ) {\n throw new Error(__filename + ': wrong or empty name');\n }\n if ( typeof callback !== 'function' ) {\n throw new Error(__filename + ': wrong callback type');\n }\n }\n\n // initialization may be required\n this.events[name] = this.events[name] || [];\n // append this new event to the list\n this.events[name].push(function onceWrapper () {\n self.removeListener(name, onceWrapper);\n callback.apply(self, arguments);\n });\n },\n\n\n /**\n * Apply multiple listeners at once.\n *\n * @param {Object} callbacks event names with callbacks\n *\n * @example\n * emitter.addListeners({\n * click: function ( data ) {},\n * close: function ( data ) {}\n * });\n */\n addListeners: function ( callbacks ) {\n var name;\n\n if ( DEVELOP ) {\n if ( arguments.length !== 1 ) {\n throw new Error(__filename + ': wrong arguments number');\n }\n if ( typeof callbacks !== 'object' ) {\n throw new Error(__filename + ': wrong callbacks type');\n }\n if ( Object.keys(callbacks).length === 0 ) {\n throw new Error(__filename + ': no callbacks given');\n }\n }\n\n for ( name in callbacks ) {\n if ( callbacks.hasOwnProperty(name) ) {\n this.addListener(name, callbacks[name]);\n }\n }\n },\n\n\n /**\n * Remove all instances of the given callback.\n *\n * @param {string} name event identifier\n * @param {function} callback function to remove\n *\n * @example\n * emitter.removeListener('click', func1);\n */\n removeListener: function ( name, callback ) {\n if ( DEVELOP ) {\n if ( arguments.length !== 2 ) {\n throw new Error(__filename + ': wrong arguments number');\n }\n if ( typeof name !== 'string' || name.length === 0 ) {\n throw new Error(__filename + ': wrong or empty name');\n }\n if ( typeof callback !== 'function' ) {\n throw new Error(__filename + ': wrong callback type');\n }\n if ( this.events[name] && !Array.isArray(this.events[name]) ) {\n throw new Error(__filename + ': corrupted inner data');\n }\n }\n\n // the event exists and should have some callbacks\n if ( this.events[name] ) {\n // rework the callback list to exclude the given one\n this.events[name] = this.events[name].filter(function callbacksFilter ( fn ) { return fn !== callback; });\n // event has no more callbacks so clean it\n if ( this.events[name].length === 0 ) {\n // as if there were no listeners at all\n this.events[name] = undefined;\n }\n }\n },\n\n\n /**\n * Remove all callbacks for the given event name.\n * Without event name clears all events.\n *\n * @param {string} [name] event identifier\n *\n * @example\n * emitter.removeAllListeners('click');\n * emitter.removeAllListeners();\n *\n * @deprecated\n */\n /*removeAllListeners: function ( name ) {\n if ( DEVELOP ) {\n if ( arguments.length !== 0 && (typeof name !== 'string' || name.length === 0) ) {\n throw new Error(__filename + ': wrong or empty name');\n }\n }\n\n // check input\n if ( arguments.length === 0 ) {\n // no arguments so remove everything\n this.events = {};\n } else if ( name ) {\n if ( DEVELOP ) {\n if ( this.events[name] ) { throw new Error(__filename + ': event is not removed'); }\n }\n\n // only name is given so remove all callbacks for the given event\n // but object structure modification should be avoided\n this.events[name] = undefined;\n }\n },*/\n\n\n /**\n * Execute each of the listeners in the given order with the supplied arguments.\n *\n * @param {string} name event identifier\n *\n * @example\n * emitter.emit('init');\n * emitter.emit('click', {src: panel1, dst: panel2});\n * emitter.emit('load', error, data);\n *\n * // it's a good idea to emit event only when there are some listeners\n * if ( this.events['click'] ) {\n * this.emit('click', {event: event});\n * }\n */\n emit: function ( name ) {\n var event = this.events[name],\n index;\n\n if ( DEVELOP ) {\n if ( arguments.length < 1 ) {\n throw new Error(__filename + ': wrong arguments number');\n }\n if ( typeof name !== 'string' || name.length === 0 ) {\n throw new Error(__filename + ': wrong or empty name');\n }\n }\n\n // the event exists and should have some callbacks\n if ( event ) {\n if ( DEVELOP ) {\n if ( !Array.isArray(event) ) {\n throw new Error(__filename + ': wrong event type');\n }\n }\n\n for ( index = 0; index < event.length; index++ ) {\n if ( DEVELOP ) {\n if ( typeof event[index] !== 'function' ) {\n throw new Error(__filename + ': wrong event callback type');\n }\n }\n\n // invoke the callback with parameters\n event[index].apply(this, Array.prototype.slice.call(arguments, 1));\n }\n }\n }\n};\n\n\n// correct constructor name\nEmitter.prototype.constructor = Emitter;\n\n\n// public\nmodule.exports = Emitter;\n","/**\n * @author Aleynikov Boris .\n */\n\n'use strict';\n\nconst html =
;\n\n\nmodule.exports = {\n $node: html.$node,\n show: () => html.$node.classList.add('preloader--visible'),\n hide: () => html.$node.classList.remove('preloader--visible')\n};\n\nwindow.q = module.exports;\n","/**\n * @license The MIT License (MIT)\n * @copyright Stanislav Kalashnik \n */\n\n'use strict';\n\nvar Component = require('../component');\n\n\n/**\n *\n * @constructor\n * @extends Component\n *\n * @param {Object} [config={}] - init parameters (all inherited from the parent)\n */\nfunction List ( config ) {\n var self = this,\n $node;\n\n console.assert(typeof this === 'object', 'must be constructed via new');\n console.assert(typeof config === 'object', 'wrong config type');\n\n config.focusable = true;\n\n // parent constructor call\n Component.call(this, config);\n\n // shortcut\n $node = this.$node;\n\n Object.defineProperties(this, {\n\n });\n\n // custom visualization\n config.render && (this.render = config.render);\n\n // apply and render\n this.data = config.data;\n\n $node.addEventListener('click', function ( event ) {\n var $item = event.target;\n\n // find the top item\n while ( $item.parentNode !== $node ) {\n $item = $item.parentNode;\n }\n\n // notify listeners\n self.events.click && self.emit('click', /*data[$item.dataset.index],*/ event);\n\n // listeners can cancel focusing\n if ( !event.defaultPrevented ) {\n self.$focusItem = $item;\n }\n });\n\n $node.addEventListener('wheel', () => {\n console.log('wheel');\n\n this.$node.classList.add('list--scrolled');\n clearTimeout(this.private.scrollTimeout);\n this.private.scrollTimeout = setTimeout(() => {\n this.$node.classList.remove('list--scrolled');\n }, 2000);\n });\n}\n\n\n// inheritance\nList.prototype = Object.create(Component.prototype);\nList.prototype.constructor = List;\n\n// set component name\nList.prototype.name = 'list';\n\n\nObject.defineProperties(List.prototype, {\n data: {\n get: function () {\n return this.private.data;\n },\n set: function ( data ) {\n var $node = this.$node,\n $fragment = document.createDocumentFragment(),\n internals = this.private;\n\n // sanitize\n data = data || [];\n\n // valid input\n if ( Array.isArray(data) ) {\n // notify listeners\n this.events.data && this.emit('data', data, internals.data);\n // store\n internals.data = data;\n\n // clear container\n while ( $node.lastChild ) {\n $node.removeChild($node.lastChild);\n }\n\n // reset focus states\n internals.focusIndex = internals.$focusItem = null;\n\n // create items\n data.forEach(function ( dataItem, index ) {\n var $item = document.createElement('div');\n\n // build item\n $item.dataset.index = index;\n $item.className = this.name + '__item';\n this.render($item, dataItem);\n\n $fragment.appendChild($item);\n }, this);\n\n // fill\n $node.appendChild($fragment);\n } else {\n console.error('wrong data type', data);\n }\n }\n },\n\n $focusItem: {\n get: function () {\n return this.private.$focusItem;\n },\n set: function ( $value ) {\n var internals = this.private,\n $focusItem = internals.$focusItem,\n focusIndex = internals.focusIndex,\n itemClass = this.name + '__item--focused';\n\n // valid focus candidate or null to clear focus\n if ( ($value && $value.parentNode === this.$node) || !$value ) {\n // nothing has changed\n if ( $value === $focusItem ) {\n console.warn('$focusItem: current and new values are identical', $value, this);\n } else {\n // the previous focused element\n if ( $focusItem ) {\n // clear\n $focusItem.classList.remove(itemClass);\n // notify listeners\n this.events['blur:item'] && this.emit('blur:item', internals.data[focusIndex], $focusItem, focusIndex);\n }\n\n // store\n internals.$focusItem = $focusItem = $value || null;\n internals.focusIndex = focusIndex = $focusItem ? Number($focusItem.dataset.index) : null;\n\n // new selection\n if ( $focusItem ) {\n // apply styles\n $focusItem.classList.add(itemClass);\n // notify listeners\n this.events['focus:item'] && this.emit('focus:item', internals.data[focusIndex], $focusItem, focusIndex);\n }\n }\n } else {\n console.error('$focusItem should be a child element of $node', $value);\n }\n }\n },\n\n focusIndex: {\n get: function () {\n return this.private.focusIndex;\n },\n set: function ( value ) {\n var internals = this.private,\n $target;\n\n if ( value === null || value === undefined ) {\n // reset\n this.$focusItem = null;\n } else {\n // sanitize\n value = Number(value);\n\n // nothing has changed\n if ( internals.focusIndex === value ) {\n console.warn('focusIndex: current and new values are identical', value, this);\n } else {\n // valid input\n if ( value >= 0 && value < internals.data.length ) {\n // find the element to focus\n $target = this.$node.children[value];\n // apply\n this.$focusItem = $target;\n } else {\n console.error('focusIndex is out of range', value);\n }\n }\n }\n }\n }\n});\n\n\n/**\n * Method to build each list item content.\n *\n * @param {Element} $item - item DOM link\n * @param {*} data - associated with this item data\n */\nList.prototype.render = function ( $item, data ) {\n $item.textContent = data;\n};\n\n\n// public\nmodule.exports = List;\n","/**\n * @author Aleynikov Boris .\n */\n\n'use strict';\n\nconst\n app = require('../../app'),\n ministraApi = require('./stalker.api.unsecure'),\n host = app.config.host,\n\n USERDATA_NAME = 'desktop-player-session-data',\n ERROR_CODES = require('./statuses').map;\n\n\nwindow.core = {\n backend: {\n addListener: function () { /* need empty function for backend modules */ },\n request: ministraApi.request\n },\n stalker: ministraApi\n};\n\napp.backend = {};\n\n\napp.stalker = ministraApi;\napp.stalker.lang = app.config.language;\n\n// we must define handler that fires when access or refresh token is broken\napp.stalker.oncredenitalsrequired = () => app.emit('authorization:error');\n\nmodule.exports = {\n STATE_AUTHORIZED: Symbol(),\n STATE_NOT_AUTHORIZED: Symbol(),\n\n /**\n * Check authorization\n */\n init: function () {\n return new Promise((resolve) => {\n let userData;\n\n try {\n userData = JSON.parse(localStorage.getItem(USERDATA_NAME));\n\n Object.assign(ministraApi.session, userData);\n ministraApi.host = app.config.host;\n ministraApi.authHost = app.config.host;\n app.user = {login: userData.userLogin};\n\n this.ping()\n .then(() => {\n resolve({state: this.STATE_AUTHORIZED});\n app.emit('authorization:login');\n })\n .catch(() => resolve({state: this.STATE_NOT_AUTHORIZED}));\n } catch ( error ) {\n console.log(error);\n resolve({state: this.STATE_NOT_AUTHORIZED});\n }\n });\n },\n\n login: config => {\n let credentials = {\n address: host,\n activationCode: config.activationCode || ''\n },\n userDataToSave = {};\n\n credentials.login = config.login;\n credentials.password = config.password;\n\n return new Promise((resolve, reject) => {\n ministraApi.auth.login(credentials, (error, data) => {\n if ( !error ) {\n app.user = {\n login: credentials.login\n };\n\n userDataToSave.refreshToken = data['refresh_token'];\n userDataToSave.accessToken = data['access_token'];\n userDataToSave.userId = data['user_id'];\n userDataToSave.userLogin = credentials.login;\n\n app.emit('authorization:login');\n resolve({state: self.STATE_AUTHORIZED});\n localStorage.setItem(USERDATA_NAME, JSON.stringify(userDataToSave));\n } else {\n reject({state: ERROR_CODES[error.error_description]});\n }\n });\n });\n },\n\n signOut: () => {\n localStorage.removeItem(USERDATA_NAME);\n location.reload();\n },\n\n getSettings: () => {\n return new Promise((resolve, reject) => {\n ministraApi.request('/settings', {\n onload: function ( error, result ) {\n if ( error ) {\n reject(error);\n } else {\n resolve(result.data);\n }\n },\n onerror: reject\n });\n });\n },\n\n getProfileInfo: () => {\n return new Promise((resolve, reject) => {\n ministraApi.request('/profile', {\n onload: function ( error, result ) {\n if ( error ) {\n reject(error);\n } else {\n resolve(result.data);\n }\n },\n onerror: reject\n });\n });\n },\n\n getThemeData: themeAlias => {\n return new Promise((resolve, reject) => {\n ministraApi.request('/themes/' + themeAlias + '?colorSpace=rgba_hex&screenResolution=1920x1080', {\n onload: function ( error, theme ) {\n if ( error ) {\n reject();\n } else {\n resolve(theme.data);\n }\n },\n onerror: reject\n });\n });\n },\n\n getAllUserInfo: async function () {\n let profile = await this.getProfileInfo();\n\n profile.settings = await this.getSettings();\n profile.theme = await this.getThemeData(profile.settings.themes[profile.settings.theme].alias);\n\n if ( profile.theme.logoFilename && profile.theme.logoFilename.value ) {\n profile.logoPath = profile.theme.logoFilename.value;\n }\n\n return profile;\n },\n\n ping: () => {\n return new Promise((resolve, reject) => {\n ministraApi.request('/ping', {\n onload: function ( error, data ) {\n if ( error ) {\n reject(error);\n } else {\n resolve(data);\n }\n },\n onerror: error => {\n console.log(error, 'ping error');\n reject(error);\n }\n });\n });\n }\n};\n\n\nif ( DEVELOP ) {\n window.backend = module.exports;\n}\n","function _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : {\n \"default\": obj\n };\n}\n\nmodule.exports = _interopRequireDefault;","'use strict';\n\nconst\n Emitter = require('cjs-emitter'),\n backend = new Emitter();\n\n\nmodule.exports = {\n instance: backend\n};\n","/**\n *\n * @author Aleynikov Boris .\n */\n\n'use strict';\n\nvar Emitter = require('cjs-emitter'),\n Channel = require('./channel.class'),\n Epg = require('./epg.class'),\n\n storage = require('./data.storage'),\n\n instanceList = [],\n request = window.core.backend.request,\n\n // count of channels to get per request to init provider\n INIT_CHANNELS_LIMIT = 500,\n // every 3 minutes update channels\n UPDATE_CHANNELS_TIMEOUT = 60000 * 3,\n // delay between intervals\n UPDATE_INTERVALS_DELAY = 15000,\n\n BACKGROUND_INTERVAL_TO = 60,\n BACKGROUND_INTERVAL_FROM = 30,\n\n EMPTY_INTERVAL_COUNT = 10,\n // LEANBACK_ITEM_COLOR = '#009bc2',\n\n emptyCounter = {\n addCount: 0,\n updateCount: 0,\n deleteCount: 0\n },\n tempChannelsData = [],\n intervals = {},\n\n LAST_CHANNELS_ADD,\n LAST_CHANNELS_UPDATE,\n LAST_CHANNELS_DELETE,\n\n\n // when collecting channels in parts save channels in tmp array\n totalChannels;\n\nfunction addChannelsHandler () {\n var url;\n\n if ( !instanceList.length && emptyCounter.addCount < EMPTY_INTERVAL_COUNT ) {\n emptyCounter.addCount++;\n\n return;\n }\n url = 'tv-channels/added?from=' + LAST_CHANNELS_ADD + '&t=' + +new Date();\n emptyCounter.addCount = 0;\n request(url, {\n onload: function ( error, response ) {\n if ( !error && response ) {\n LAST_CHANNELS_ADD = response.timestamp;\n if ( response.data.length ) {\n\n response.data = response.data.map(function ( object ) {\n return new Channel(object);\n });\n storage.list = storage.list.concat(response.data);\n instanceList.forEach(function ( provider ) {\n provider.emit('channels:add', {data: response.data});\n });\n }\n }\n }\n });\n}\n\nfunction deleteChannelsHandler () {\n if ( !instanceList.length && emptyCounter.deleteCount < EMPTY_INTERVAL_COUNT ) {\n emptyCounter.deleteCount++;\n\n return;\n }\n emptyCounter.deleteCount = 0;\n request('tv-channels/deleted?from=' + LAST_CHANNELS_DELETE + '&t=' + +new Date(), {\n onload: function ( error, response ) {\n if ( !error && response ) {\n LAST_CHANNELS_DELETE = response.timestamp;\n if ( response.data.length ) {\n storage.list = storage.list.filter(function (ch) {\n return (response.data.indexOf(ch.id) < 0);\n });\n instanceList.forEach(function ( provider ) {\n provider.emit('channels:delete', {data: response.data});\n });\n }\n }\n }\n });\n}\n\nfunction updateChannelsHandler () {\n if ( !instanceList.length && emptyCounter.updateCount < EMPTY_INTERVAL_COUNT ) {\n emptyCounter.updateCount++;\n\n return;\n }\n emptyCounter.updateCount = 0;\n request('tv-channels/modified?from=' + LAST_CHANNELS_UPDATE + '&t=' + +new Date(), {\n onload: function ( error, response ) {\n var hash = {},\n index;\n\n if ( !error && response ) {\n LAST_CHANNELS_UPDATE = response.timestamp;\n if ( response.data.length ) {\n\n response.data.forEach(function ( updated ) {\n hash[updated.id] = new Channel(updated);\n });\n\n for ( index = 0; index < storage.list.length; index++ ) {\n if ( hash[storage.list[index].id] ) {\n storage.list[index] = hash[storage.list[index].id];\n }\n }\n\n instanceList.forEach(function ( provider ) {\n provider.emit('channels:modified', {data: response.data});\n });\n\n }\n }\n }\n });\n}\n\n/**\n * Start to recursive grab channels\n *\n * @param {Object} [config] - config to grab\n * @param {Function} callback - callback after getting channels\n */\nfunction getChannels ( config, callback ) {\n var url = 'tv-channels',\n // add some timestamp to prevent cache request on mag 256\n timestamp = Date.now() / 1000;\n\n config = config || {};\n\n\n url += '?limit=' + INIT_CHANNELS_LIMIT;\n\n if ( config.offset ) {\n url += '&offset=' + config.offset;\n }\n url += '&t=' + timestamp;\n request(url, {\n onload: function ( error, response ) {\n var index;\n\n if ( error ) {\n // do sth\n\n } else {\n for ( index = 0; index < response.data.length; index++ ) {\n tempChannelsData.push(new Channel(response.data[index]));\n }\n\n if ( !totalChannels ) {\n totalChannels = response.paging.total;\n }\n // save config and set offset\n if ( tempChannelsData.length < totalChannels ) {\n config.offset = tempChannelsData.length;\n getChannels(config, callback);\n } else {\n // clear tmp data\n storage.list = tempChannelsData;\n tempChannelsData = [];\n totalChannels = 0;\n\n config.eventName = config.eventName || 'ready';\n\n if (config.update) {\n instanceList.forEach(function ( provider ) {\n provider.emit('update');\n });\n }\n if ( callback ) {\n callback(false);\n }\n LAST_CHANNELS_ADD = LAST_CHANNELS_DELETE = LAST_CHANNELS_UPDATE = response.timestamp;\n }\n\n }\n },\n onerror: function () {\n callback(true);\n },\n onabort: function () {\n callback(true);\n }\n });\n}\n\nwindow.core.backend.addListener('message', function ( message ) {\n switch ( message.type ) {\n case 'update_subscription':\n getChannels({update: true});\n break;\n }\n});\n\n\nintervals.addChannelsInterval = setInterval(addChannelsHandler, UPDATE_CHANNELS_TIMEOUT);\n\nsetTimeout(function () {\n intervals.deleteChannelsInterval = setInterval(deleteChannelsHandler, UPDATE_CHANNELS_TIMEOUT);\n}, UPDATE_INTERVALS_DELAY);\n\nsetTimeout(function () {\n intervals.updateChannelsInterval = setInterval(updateChannelsHandler, UPDATE_CHANNELS_TIMEOUT);\n}, UPDATE_INTERVALS_DELAY * 2);\n\n/**\n * Channel list provider implementation\n *\n * @constructor\n */\nfunction Provider () {\n Emitter.call(this);\n\n /**\n * Id of backround check timeout\n */\n this.backgroungCheckInterval = null;\n}\n\n\nProvider.prototype = Object.create(Emitter.prototype);\nProvider.prototype.constructor = Provider;\n\n/**\n * Get channel list\n *\n * @param {Object} config - config to get channels\n * @param {Function} callback - callback after getting data\n */\nProvider.prototype.getChannels = function ( config, callback ) {\n var result = storage.list,\n reg;\n\n if ( config.favorite ) {\n result = result.filter(function ( channel ) {\n return !!channel.favorite;\n });\n }\n if ( config.genre ) {\n result = result.filter( function ( channel ) {\n return channel.genre.id === config.genre;\n });\n }\n if ( config.byName ) {\n result = result.sort(function ( itemA, itemB ) {\n return itemA.name > itemB.name ? 1 : -1;\n });\n } else {\n result = result.sort(function ( itemA, itemB ) {\n return itemA.number > itemB.number ? 1 : -1;\n });\n }\n\n if ( config.pvr ) {\n result = result.filter( function ( channel ) {\n return ( channel.pvr || channel.local_pvr );\n });\n }\n\n if ( config.search ) {\n reg = new RegExp(config.search, 'i');\n result = result.filter(function ( channel ) {\n var matchName = channel.name.match(reg),\n matchNumber = channel.number.toString().match(reg);\n\n return ((matchName && matchName.length) || (matchNumber && matchNumber.length));\n });\n }\n callback(false, result);\n};\n\n/**\n * Request full update channels list\n *\n * @param {Function} callback - callback after all done\n */\nProvider.prototype.updateChannelsList = function ( callback ) {\n getChannels(null, callback);\n};\n\nProvider.prototype.getCategories = function ( callback ) {\n request('tv-genres', {\n onload: function ( error, response ) {\n if ( error ) {\n if ( callback ) {\n callback(true);\n }\n\n return;\n }\n if ( callback ) {\n callback(false, response.data);\n }\n },\n onerror: function () {\n if ( callback ) {\n callback(true);\n }\n }\n });\n};\n\nProvider.prototype.getLastChannelId = function ( callback ) {\n request('storage/lastChannel', {\n method: 'GET',\n onload: function ( error, response ) {\n if ( error && callback ) {\n callback(error, null);\n } else if ( callback && response.data.value ) {\n callback(false, response.data.value);\n }\n },\n onerror: function () {\n if ( callback ) {\n callback(true, null);\n }\n },\n onabort: function () {\n if ( callback ) {\n callback(true, null);\n }\n }\n });\n};\n\nProvider.prototype.getEpgLink = function ( config, callback ) {\n var url = 'tv-channels/' + config.channelId + '/epg/' + config.epgId + '/link';\n\n request(url, {\n onload: function ( error, response ) {\n if ( error ) {\n callback(true, []);\n } else {\n callback(false, response.data);\n }\n },\n onerror: function () {\n callback(true, []);\n }\n });\n};\n\n\nProvider.prototype.getChannelsEpg = function ( config, callback ) {\n var map = {},\n multiple,\n url,\n channelArray,\n from,\n to,\n params;\n\n config = config || {};\n\n channelArray = config.channels;\n multiple = channelArray.length > 1;\n\n\n if ( !config.from && !config.to ) {\n params = 'next=1';\n } else {\n from = Math.round(config.from / 1000) || '';\n to = Math.round(config.to / 1000) || '';\n params = 'from=' + from + '&to=' + to;\n }\n channelArray.forEach(function ( channel ) {\n map[channel.id] = channel;\n });\n\n url = 'tv-channels/' + encodeURIComponent(channelArray.map(function ( channel ) {\n return channel.id;\n }).join(',')) + '/epg?' + params;\n\n return request(url, {\n onload: function ( error, response ) {\n var result = {};\n\n if ( error && callback ) {\n callback(true, []);\n } else {\n Object.keys(response.data).forEach(function ( key ) {\n var channelId = multiple ? key : channelArray[0].id,\n targetData = multiple ? response.data[key] : response.data;\n\n result[channelId] = [];\n targetData.forEach(function ( epgData ) {\n epgData.channel = map[channelId];\n result[channelId].push(new Epg(epgData));\n });\n });\n callback(false, result);\n }\n },\n onerror: function () {\n callback(true, []);\n }\n });\n};\n\n// destroy remove this instance from instance list\nProvider.prototype.destroy = function () {\n var index = instanceList.indexOf(this);\n\n if ( index ) {\n instanceList = instanceList.splice(index, 1);\n }\n};\n\nProvider.prototype.startBackgroundCheck = function () {\n var self = this;\n\n function getRandomTimeout () {\n var seconds = (Math.floor(Math.random() * BACKGROUND_INTERVAL_TO) + BACKGROUND_INTERVAL_FROM ) * 60 * 1000;\n\n // console.log('channels:updater: get interval ' + seconds);\n\n if ( seconds / 60000 > 60 ) {\n seconds = getRandomTimeout();\n }\n\n return seconds;\n }\n\n function update () {\n var previousCount = storage.list.length;\n\n // console.log('channels:updater: was length: ' + previousCount);\n\n getChannels({}, function ( error ) {\n if ( error ) {\n // console.log('channels:updater: error updating channels');\n }\n\n // console.log('channels:updater: new length: ' + storage.list.length);\n if ( previousCount !== storage.list.length ) {\n self.emit('update');\n }\n\n self.backgroungCheckInterval = setTimeout(update, getRandomTimeout());\n });\n }\n\n this.backgroungCheckInterval = setTimeout(update, getRandomTimeout());\n};\n\n\nProvider.prototype.stopBackgroundCheck = function () {\n clearTimeout(this.backgroungCheckInterval);\n};\n\nfunction getAppProvider ( config, callback ) {\n var provider = new Provider();\n\n\n instanceList.push(provider);\n\n callback(null, provider);\n}\n\nmodule.exports = getAppProvider;\n","/**\n * @license The MIT License (MIT)\n * @author Stanislav Kalashnik \n */\n\n/* eslint no-path-concat: 0 */\n\n'use strict';\n\n\n/**\n * Base Events Emitter implementation.\n *\n * @see http://nodejs.org/api/events.html\n * @constructor\n *\n * @example\n * var emitter = new Emitter();\n */\nfunction Emitter () {\n console.assert(typeof this === 'object', 'must be constructed via new');\n\n // if ( DEVELOP ) {\n // if ( typeof this !== 'object' ) { throw new Error(__filename + ': must be constructed via new'); }\n // }\n\n /**\n * Inner hash table for event names and linked callbacks.\n * Manual editing should be avoided.\n *\n * @member {Object.}\n *\n * @example\n * {\n * click: [\n * function click1 () { ... },\n * function click2 () { ... }\n * ],\n * keydown: [\n * function () { ... }\n * ]\n * }\n **/\n this.events = {};\n}\n\n\nEmitter.prototype = {\n /**\n * Bind an event to the given callback function.\n * The same callback function can be added multiple times for the same event name.\n *\n * @param {string} name event identifier\n * @param {function} callback function to call on this event\n *\n * @example\n * emitter.addListener('click', function ( data ) { ... });\n * // one more click handler\n * emitter.addListener('click', function ( data ) { ... });\n */\n addListener: function ( name, callback ) {\n console.assert(arguments.length === 2, 'wrong arguments number');\n console.assert(typeof name === 'string', 'wrong name type');\n console.assert(name.length > 0, 'empty name');\n console.assert(typeof callback === 'function', 'callback should be a function');\n\n // if ( DEVELOP ) {\n // if ( arguments.length !== 2 ) { throw new Error(__filename + ': wrong arguments number'); }\n // if ( typeof name !== 'string' || name.length === 0 ) { throw new Error(__filename + ': wrong or empty name'); }\n // if ( typeof callback !== 'function' ) { throw new Error(__filename + ': wrong callback type'); }\n // }\n\n // initialization may be required\n this.events[name] = this.events[name] || [];\n // append this new event to the list\n this.events[name].push(callback);\n },\n\n\n /**\n * Add a one time listener for the event.\n * This listener is invoked only the next time the event is fired, after which it is removed.\n *\n * @param {string} name event identifier\n * @param {function} callback function to call on this event\n *\n * @example\n * emitter.once('click', function ( data ) { ... });\n */\n once: function ( name, callback ) {\n // current execution context\n var self = this;\n\n if ( DEVELOP ) {\n if ( arguments.length !== 2 ) {\n throw new Error(__filename + ': wrong arguments number');\n }\n if ( typeof name !== 'string' || name.length === 0 ) {\n throw new Error(__filename + ': wrong or empty name');\n }\n if ( typeof callback !== 'function' ) {\n throw new Error(__filename + ': wrong callback type');\n }\n }\n\n // initialization may be required\n this.events[name] = this.events[name] || [];\n // append this new event to the list\n this.events[name].push(function onceWrapper () {\n self.removeListener(name, onceWrapper);\n callback.apply(self, arguments);\n });\n },\n\n\n /**\n * Apply multiple listeners at once.\n *\n * @param {Object} callbacks event names with callbacks\n *\n * @example\n * emitter.addListeners({\n * click: function ( data ) {},\n * close: function ( data ) {}\n * });\n */\n addListeners: function ( callbacks ) {\n var name;\n\n if ( DEVELOP ) {\n if ( arguments.length !== 1 ) {\n throw new Error(__filename + ': wrong arguments number');\n }\n if ( typeof callbacks !== 'object' ) {\n throw new Error(__filename + ': wrong callbacks type');\n }\n if ( Object.keys(callbacks).length === 0 ) {\n throw new Error(__filename + ': no callbacks given');\n }\n }\n\n for ( name in callbacks ) {\n if ( callbacks.hasOwnProperty(name) ) {\n this.addListener(name, callbacks[name]);\n }\n }\n },\n\n\n /**\n * Remove all instances of the given callback.\n *\n * @param {string} name event identifier\n * @param {function} callback function to remove\n *\n * @example\n * emitter.removeListener('click', func1);\n */\n removeListener: function ( name, callback ) {\n if ( DEVELOP ) {\n if ( arguments.length !== 2 ) {\n throw new Error(__filename + ': wrong arguments number');\n }\n if ( typeof name !== 'string' || name.length === 0 ) {\n throw new Error(__filename + ': wrong or empty name');\n }\n if ( typeof callback !== 'function' ) {\n throw new Error(__filename + ': wrong callback type');\n }\n if ( this.events[name] && !Array.isArray(this.events[name]) ) {\n throw new Error(__filename + ': corrupted inner data');\n }\n }\n\n // the event exists and should have some callbacks\n if ( this.events[name] ) {\n // rework the callback list to exclude the given one\n this.events[name] = this.events[name].filter(function callbacksFilter ( fn ) { return fn !== callback; });\n // event has no more callbacks so clean it\n if ( this.events[name].length === 0 ) {\n // as if there were no listeners at all\n this.events[name] = undefined;\n }\n }\n },\n\n\n /**\n * Remove all callbacks for the given event name.\n * Without event name clears all events.\n *\n * @param {string} [name] event identifier\n *\n * @example\n * emitter.removeAllListeners('click');\n * emitter.removeAllListeners();\n *\n * @deprecated\n */\n /*removeAllListeners: function ( name ) {\n if ( DEVELOP ) {\n if ( arguments.length !== 0 && (typeof name !== 'string' || name.length === 0) ) {\n throw new Error(__filename + ': wrong or empty name');\n }\n }\n\n // check input\n if ( arguments.length === 0 ) {\n // no arguments so remove everything\n this.events = {};\n } else if ( name ) {\n if ( DEVELOP ) {\n if ( this.events[name] ) { throw new Error(__filename + ': event is not removed'); }\n }\n\n // only name is given so remove all callbacks for the given event\n // but object structure modification should be avoided\n this.events[name] = undefined;\n }\n },*/\n\n\n /**\n * Execute each of the listeners in the given order with the supplied arguments.\n *\n * @param {string} name event identifier\n *\n * @example\n * emitter.emit('init');\n * emitter.emit('click', {src: panel1, dst: panel2});\n * emitter.emit('load', error, data);\n *\n * // it's a good idea to emit event only when there are some listeners\n * if ( this.events['click'] ) {\n * this.emit('click', {event: event});\n * }\n */\n emit: function ( name ) {\n var event = this.events[name],\n index;\n\n if ( DEVELOP ) {\n if ( arguments.length < 1 ) {\n throw new Error(__filename + ': wrong arguments number');\n }\n if ( typeof name !== 'string' || name.length === 0 ) {\n throw new Error(__filename + ': wrong or empty name');\n }\n }\n\n // the event exists and should have some callbacks\n if ( event ) {\n if ( DEVELOP ) {\n if ( !Array.isArray(event) ) {\n throw new Error(__filename + ': wrong event type');\n }\n }\n\n for ( index = 0; index < event.length; index++ ) {\n if ( DEVELOP ) {\n if ( typeof event[index] !== 'function' ) {\n throw new Error(__filename + ': wrong event callback type');\n }\n }\n\n // invoke the callback with parameters\n event[index].apply(this, Array.prototype.slice.call(arguments, 1));\n }\n }\n }\n};\n\n\n// correct constructor name\nEmitter.prototype.constructor = Emitter;\n\n\n// public\nmodule.exports = Emitter;\n","/**\n * Global application configuration.\n * Can store run-time options, API urls, paths, execution flags and so on.\n */\n\n'use strict';\n\n// public\nmodule.exports = {\n language: localStorage.getItem('language') || navigator.language.split('-')[0].toLowerCase() || 'en',\n\n // list of supported languages\n supportedLanguages: [\n {code: 'ru', title: 'rus'},\n {code: 'en', title: 'eng'}\n ],\n\n host: DEVELOP ?\n 'http://10.110.51.11/'\n : location.protocol + '//' + location.host + '/',\n user: {},\n\n // program list update interval in ms\n programListUpdateInterval: 5 * 60 * 1000,\n\n // time after channel playing to set as last played\n saveLastChannelTimeout: 3000,\n\n // license key length to validate\n licenseKeyLength: 12\n};\n","/**\n * This file was generated automatically. Do not edit it anyway.\n */\n\n'use strict';\n\nmodule.exports = {\n errors: {\n ERROR_NEED_LICENSE_KEY: 0,\n ERROR_ACCOUNT_DISABLED: 1,\n ERROR_WRONG_LICENSE_KEY: 2,\n ERROR_WRONG_LOGIN: 3,\n ERROR_WRONG_META_DATA: 4,\n ERROR_WRONG_OPERATOR_ID: 5\n },\n map: {\n 'Automatic activation code issuing disabled for user.': 0,\n 'Account is disabled': 1,\n 'License key not found': 2,\n 'Username or password is incorrect': 3,\n 'Meta data mismatch': 4,\n 'Operator ID mismatch': 5\n }\n};\n","function _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\n\nmodule.exports = _createClass;","function _inheritsLoose(subClass, superClass) {\n subClass.prototype = Object.create(superClass.prototype);\n subClass.prototype.constructor = subClass;\n subClass.__proto__ = superClass;\n}\n\nmodule.exports = _inheritsLoose;","/**\n * @author Aleynikov Boris .\n */\n\n'use strict';\n\nconst\n Component = require('../component'),\n List = require('../components/list');\n\n\nclass Select extends Component {\n constructor ( config = {} ) {\n let list = new List({\n modifiers: ['select'],\n hidden: true,\n render: ( $item, data ) => ($item.innerText = data.label)\n }),\n html = (\n
\n
\n {list}\n
\n ),\n self;\n\n\n config.$node = html.$node;\n config.name = config.name || 'select';\n\n super(config);\n\n self = this;\n\n this.links = html.links;\n this.links.list = list;\n\n this.private.data = [];\n this.private.current = config.current;\n\n this.current = config.current;\n\n if ( config.data ) {\n this.data = config.data;\n }\n\n this.$node.addEventListener('click', function () {\n self.links.list.hidden = !self.links.list.hidden;\n });\n\n list.addListener('focus:item', function ( element ) {\n self.links.$value.innerText = element.label || '';\n self.emit('focus:item', element);\n });\n }\n\n set data ( array ) {\n if ( !Array.isArray(array) ) {\n throw new Error(__filename + ': wrong data type');\n }\n\n this.private.data = array;\n this.links.list.data = array;\n }\n\n get data () {\n return this.private.data;\n }\n\n get current () {\n return this.private.current;\n }\n\n set current ( value ) {\n if ( value ) {\n this.private.current = value;\n this.links.$value.innerText = value.label;\n }\n }\n}\n\n\nmodule.exports = Select;\n","/**\n *\n * @author Aleynikov Boris .\n */\n\n'use strict';\n\nvar request = window.core.backend.request;\n\n\nfunction Epg ( config ) {\n config = config || {};\n\n /**\n * Is epg can be downloaded\n */\n this.downloadable = config.downloadable;\n\n /**\n * Start time ms\n */\n this.start = config.start;\n\n /**\n * End time ms\n */\n this.end = config.end;\n\n /**\n * Epg title\n */\n this.title = config.name;\n\n /**\n * Id\n */\n this.id = config.id;\n\n /**\n * Is epg in archive\n */\n this.archive = config.in_archive;\n\n /**\n * Link to channel\n */\n this.channel = config.channel;\n}\n\n\nEpg.prototype = {};\nEpg.prototype.constructor = Epg;\n\n/**\n * Return link object contains type, id, and url\n *\n * @param {Function} callback - callback after getting link\n */\nEpg.prototype.getLink = function ( callback ) {\n var url = 'tv-channels/' + this.channel.id + '/epg/' + this.id + '/link';\n\n return request(url, {\n onload: function ( error, response ) {\n if ( error ) {\n callback(true, null);\n } else {\n callback(false, response.data);\n }\n },\n onerror: function () {\n callback(true, null);\n }\n });\n};\n\nmodule.exports = Epg;\n","/**\n *\n * @author Aleynikov Boris .\n */\n\n'use strict';\n\nvar storage;\n\nfunction findByProperty ( propertyName ) {\n\n return function ( prop ) {\n var length,\n index,\n element;\n\n length = storage.list.length;\n\n for ( index = 0; index < length; index++ ) {\n element = storage.list[index];\n if (\n element[propertyName] !== undefined\n && element[propertyName].toString() === prop.toString()\n ) {\n\n return element;\n }\n }\n\n return false;\n };\n}\n\n\nstorage = {\n\n list: [],\n\n findByNumber: findByProperty('number')\n};\n\n\nmodule.exports = storage;\n","/**\n * @author Aleynikov Boris .\n */\n\n'use strict';\n\nconst\n Component = require('../component'),\n List = require('./list'),\n Select = require('./select'),\n app = require('../../app'),\n backend = require('../api/backend'),\n\n menu = new List({\n modifiers: ['header'],\n hidden: true,\n data: [\n {text: gettext('Profile'), action: () => (app.tabSet.current = app.pages.profile)},\n {text: gettext('Sign out'), action: backend.signOut}\n ],\n render: ($item, data) => ($item.innerText = data.text)\n }),\n languageSelect = new Select({\n data: app.config.supportedLanguages.map(language => ({label: language.title.toUpperCase(), value: language})),\n events: {\n 'focus:item': data => {\n if ( data.value.code !== app.config.language ) {\n localStorage.setItem('language', data.value.code);\n location.reload();\n }\n }\n }\n }),\n html = (\n
\n
\n \n
{gettext('TV channels')}
\n
\n
\n
John doe
\n {menu}\n
\n {languageSelect}\n
\n
\n ),\n header = new Component({\n name: 'header',\n hidden: true,\n $node: html.$node\n });\n\n\n// language select start initialization\n{\n languageSelect.$node.classList.add('header__select');\n languageSelect.current = languageSelect.data[languageSelect.data.findIndex(data => data.value.code === app.config.language)];\n}\n\n// set header module getters and setters\nObject.defineProperties(header, {\n userName: {\n set: name => {\n header.private.userName = name;\n html.links.$userName.innerText = name;\n },\n get: () => header.private.userName\n },\n\n logo: {\n set: path => {\n header.private.logoPath = path;\n html.links.$logo.src = path;\n },\n get: () => header.private.logoPath\n }\n});\n\n\n// add components listeners\n{\n menu.addListener('focus:item', element => {\n element.action && element.action();\n\n // focus:item event will not fire if we click on focused item, so we need to reset this value\n menu.$focusItem = null;\n });\n\n html.links.$userName.addEventListener('click', () => {\n menu.hidden = !menu.hidden;\n });\n\n html.links.$tvChannel.addEventListener('click', () => {\n if ( app.tabSet.current !== app.pages.channels ) {\n app.tabSet.current = app.pages.channels;\n }\n });\n\n document.addEventListener('click', event => {\n if ( event.target !== html.links.$userName ) {\n menu.hidden = true;\n }\n\n if ( event.target !== languageSelect.links.$value ) {\n languageSelect.links.list.hidden = true;\n }\n });\n}\n\n\nmodule.exports = header;\n","/**\n * Main application entry point.\n */\n\n'use strict';\n\nconst\n gettext = require('spa-gettext'),\n TabSet = require('./lib/components/tab-set'),\n app = require('./app'),\n backend = require('./lib/api/backend'),\n spinner = require('./lib/spinner');\n\n\nrequire('./lib/analytics');\n\n// load localization\ngettext.load({name: app.config.language}, function () {\n let pages = {},\n tabSet = new TabSet({\n $node: document.body,\n content: [\n pages.login = require('./pages/login'),\n pages.channels = require('./pages/channels'),\n pages.profile = require('./pages/profile')\n ]\n });\n\n app.tabSet = tabSet;\n app.pages = pages;\n app.header = require('./lib/components/header');\n\n app.addListener('authorization:login', function () {\n app.header.userName = app.user.login;\n\n backend.getAllUserInfo().then(userInfo => {\n pages.profile.init(userInfo);\n\n if ( userInfo.logoPath ) {\n app.header.logo = userInfo.logoPath;\n }\n });\n });\n\n // when auth error happend we must show login page\n app.addListener('authorization:error', () => backend.signOut());\n\n document.body.appendChild(require('./lib/spinner').$node);\n document.body.appendChild(app.header.$node);\n\n spinner.show();\n backend.init().then(function ( result ) {\n spinner.hide();\n\n if ( result.state === backend.STATE_NOT_AUTHORIZED ) {\n tabSet.current = pages.login;\n } else if ( result.state === backend.STATE_AUTHORIZED ) {\n tabSet.current = pages.channels;\n }\n });\n});\n","/**\n * @license The MIT License (MIT)\n * @author Stanislav Kalashnik \n */\n\n/* eslint no-path-concat: 0 */\n\n'use strict';\n\nvar Emitter = require('cjs-emitter'),\n Gettext = require('cjs-gettext'),\n loader = new Emitter();\n\n\n/**\n * Wrap the given data with gettext instance\n * and export methods to the global scope.\n *\n * @param {Object} [data] localization data\n *\n * @return {Gettext} gettext instance\n */\nfunction prepare ( data ) {\n var gettext = new Gettext(data);\n\n // make it global\n window.gettext = window._ = gettext.gettext;\n window.pgettext = gettext.pgettext;\n window.ngettext = gettext.ngettext;\n\n return gettext;\n}\n\n\n/**\n * Main application language\n */\nloader.defaultLanguage = 'en';\n\n\n/**\n * Simple gettext implementation.\n *\n * @param {Object} config options\n * @param {string} [config.path=lang] relative path to project root\n * @param {string} config.name language name\n * @param {string} [config.ext=json] language file extension\n * @param {function} callback hook on ready\n *\n * @return {boolean} flag is ajax request was made\n */\nloader.load = function ( config, callback ) {\n var xhr;\n\n if ( DEVELOP ) {\n if ( !config.name || typeof config.name !== 'string' ) {\n throw new Error(__filename + ': config.name must be a nonempty string');\n }\n if ( typeof callback !== 'function' ) {\n throw new Error(__filename + ': wrong callback type');\n }\n }\n\n // defaults\n config.ext = config.ext || 'json';\n config.path = config.path || 'lang';\n\n // is it necessary to request a localization file?\n if ( config.name === loader.defaultLanguage ) {\n // no\n prepare();\n callback(null);\n\n return false;\n }\n\n // yes\n xhr = new XMLHttpRequest();\n\n xhr.onload = function () {\n var json;\n\n try {\n json = JSON.parse(xhr.responseText);\n\n prepare(json);\n callback(null);\n\n // there are some listeners\n if ( loader.events['load'] ) {\n // notify listeners\n loader.emit('load');\n }\n } catch ( error ) {\n xhr.onerror(error);\n }\n };\n\n xhr.ontimeout = xhr.onerror = function ( error ) {\n prepare();\n callback(error);\n\n // there are some listeners\n if ( loader.events['error'] ) {\n // notify listeners\n loader.emit('error', error);\n }\n };\n\n xhr.open('GET', config.path + '/' + config.name + '.' + config.ext, true);\n xhr.send(null);\n\n return true;\n};\n\n\n// public\nmodule.exports = loader;\n","/**\n * @license The MIT License (MIT)\n * @author Stanislav Kalashnik \n */\n\n/* eslint no-path-concat: 0 */\n\n'use strict';\n\n\n/**\n * Translations handler.\n *\n * @constructor\n *\n * @param {Object} config init parameters\n */\nfunction Gettext ( config ) {\n var data, meta;\n\n // sanitize\n config = config || {};\n data = config.data || {};\n data[''] = data[''] || {};\n\n // shortcut\n meta = config.meta;\n\n /**\n * Display the native language translation of a textual message.\n *\n * @param {string} msgId textual message\n *\n * @return {string} translated text\n */\n this.gettext = function ( msgId ) {\n return data[''][msgId] || msgId;\n };\n\n\n /**\n * The \"p\" in \"pgettext\" stands for \"particular\": fetches a particular translation of the textual message.\n *\n * @param {string} context message context\n * @param {string} msgId textual message\n *\n * @return {string} translated text\n */\n this.pgettext = function ( context, msgId ) {\n return data[context] && data[context][msgId] || msgId;\n };\n\n\n /**\n * Display the native language translation of a textual message whose grammatical form depends on a number.\n *\n * @param {string} msgId textual message in a singular form\n * @param {string} plural textual message in a plural form\n * @param {number} value message number\n *\n * @return {string} translated text\n */\n this.ngettext = function ( msgId, plural, value ) {\n /* eslint no-unused-vars: 0 */\n /* eslint no-eval: 0 */\n /* eslint id-length: 0 */\n var n, evalResult;\n\n if ( DEVELOP ) {\n if ( Number(value) !== value ) {\n throw new Error(__filename + ': value must be a number');\n }\n }\n\n if ( data && meta && data[''][msgId] ) {\n evalResult = eval('n = ' + value + '; ' + meta.plural);\n\n if ( typeof evalResult === 'boolean' ) {\n evalResult = +evalResult;\n }\n\n // translation\n return data[''][msgId][evalResult];\n }\n\n // english\n return value === 1 ? msgId : plural;\n };\n}\n\n\n// correct constructor name\nGettext.prototype.constructor = Gettext;\n\n\n// public\nmodule.exports = Gettext;\n","/**\n * @license The MIT License (MIT)\n * @copyright Stanislav Kalashnik \n */\n\n'use strict';\n\nvar Component = require('../component');\n\n\nfunction TabSet ( config ) {\n // parent constructor call\n Component.call(this, config);\n\n this.private.current = null;\n}\n\n\n// inheritance\nTabSet.prototype = Object.create(Component.prototype);\nTabSet.prototype.constructor = TabSet;\n\n// set component name\nTabSet.prototype.name = 'tab-set';\n\n\nObject.defineProperties(TabSet.prototype, {\n current: {\n get: function () {\n return this.private.current;\n },\n set: function ( current ) {\n var previous = this.private.current;\n\n // nothing has changed\n if ( current === previous ) {\n console.warn('current: current and new values are identical', current, this);\n } else {\n // hide current visible tab\n previous && (previous.hidden = true);\n\n // show new\n this.private.current = current;\n current.hidden = false;\n\n // notify listeners\n this.events.switch && this.emit('switch', previous, current);\n }\n }\n }\n});\n\n\nTabSet.prototype.add = function () {\n var index, tab;\n\n // walk through all the given elements\n for ( index = 0; index < arguments.length; index++ ) {\n tab = arguments[index];\n\n // all tabs are hidden from the start\n tab.hidden = true;\n\n // apply\n this.$node.appendChild(tab.$node);\n }\n};\n\n\n// public\nmodule.exports = TabSet;\n","module.exports = require(\"regenerator-runtime\");\n","/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nvar runtime = (function (exports) {\n \"use strict\";\n\n var Op = Object.prototype;\n var hasOwn = Op.hasOwnProperty;\n var undefined; // More compressible than void 0.\n var $Symbol = typeof Symbol === \"function\" ? Symbol : {};\n var iteratorSymbol = $Symbol.iterator || \"@@iterator\";\n var asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\";\n var toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\";\n\n function wrap(innerFn, outerFn, self, tryLocsList) {\n // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.\n var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;\n var generator = Object.create(protoGenerator.prototype);\n var context = new Context(tryLocsList || []);\n\n // The ._invoke method unifies the implementations of the .next,\n // .throw, and .return methods.\n generator._invoke = makeInvokeMethod(innerFn, self, context);\n\n return generator;\n }\n exports.wrap = wrap;\n\n // Try/catch helper to minimize deoptimizations. Returns a completion\n // record like context.tryEntries[i].completion. This interface could\n // have been (and was previously) designed to take a closure to be\n // invoked without arguments, but in all the cases we care about we\n // already have an existing method we want to call, so there's no need\n // to create a new function object. We can even get away with assuming\n // the method takes exactly one argument, since that happens to be true\n // in every case, so we don't have to touch the arguments object. The\n // only additional allocation required is the completion record, which\n // has a stable shape and so hopefully should be cheap to allocate.\n function tryCatch(fn, obj, arg) {\n try {\n return { type: \"normal\", arg: fn.call(obj, arg) };\n } catch (err) {\n return { type: \"throw\", arg: err };\n }\n }\n\n var GenStateSuspendedStart = \"suspendedStart\";\n var GenStateSuspendedYield = \"suspendedYield\";\n var GenStateExecuting = \"executing\";\n var GenStateCompleted = \"completed\";\n\n // Returning this object from the innerFn has the same effect as\n // breaking out of the dispatch switch statement.\n var ContinueSentinel = {};\n\n // Dummy constructor functions that we use as the .constructor and\n // .constructor.prototype properties for functions that return Generator\n // objects. For full spec compliance, you may wish to configure your\n // minifier not to mangle the names of these two functions.\n function Generator() {}\n function GeneratorFunction() {}\n function GeneratorFunctionPrototype() {}\n\n // This is a polyfill for %IteratorPrototype% for environments that\n // don't natively support it.\n var IteratorPrototype = {};\n IteratorPrototype[iteratorSymbol] = function () {\n return this;\n };\n\n var getProto = Object.getPrototypeOf;\n var NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n if (NativeIteratorPrototype &&\n NativeIteratorPrototype !== Op &&\n hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {\n // This environment has a native %IteratorPrototype%; use it instead\n // of the polyfill.\n IteratorPrototype = NativeIteratorPrototype;\n }\n\n var Gp = GeneratorFunctionPrototype.prototype =\n Generator.prototype = Object.create(IteratorPrototype);\n GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;\n GeneratorFunctionPrototype.constructor = GeneratorFunction;\n GeneratorFunctionPrototype[toStringTagSymbol] =\n GeneratorFunction.displayName = \"GeneratorFunction\";\n\n // Helper for defining the .next, .throw, and .return methods of the\n // Iterator interface in terms of a single ._invoke method.\n function defineIteratorMethods(prototype) {\n [\"next\", \"throw\", \"return\"].forEach(function(method) {\n prototype[method] = function(arg) {\n return this._invoke(method, arg);\n };\n });\n }\n\n exports.isGeneratorFunction = function(genFun) {\n var ctor = typeof genFun === \"function\" && genFun.constructor;\n return ctor\n ? ctor === GeneratorFunction ||\n // For the native GeneratorFunction constructor, the best we can\n // do is to check its .name property.\n (ctor.displayName || ctor.name) === \"GeneratorFunction\"\n : false;\n };\n\n exports.mark = function(genFun) {\n if (Object.setPrototypeOf) {\n Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);\n } else {\n genFun.__proto__ = GeneratorFunctionPrototype;\n if (!(toStringTagSymbol in genFun)) {\n genFun[toStringTagSymbol] = \"GeneratorFunction\";\n }\n }\n genFun.prototype = Object.create(Gp);\n return genFun;\n };\n\n // Within the body of any async function, `await x` is transformed to\n // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test\n // `hasOwn.call(value, \"__await\")` to determine if the yielded value is\n // meant to be awaited.\n exports.awrap = function(arg) {\n return { __await: arg };\n };\n\n function AsyncIterator(generator) {\n function invoke(method, arg, resolve, reject) {\n var record = tryCatch(generator[method], generator, arg);\n if (record.type === \"throw\") {\n reject(record.arg);\n } else {\n var result = record.arg;\n var value = result.value;\n if (value &&\n typeof value === \"object\" &&\n hasOwn.call(value, \"__await\")) {\n return Promise.resolve(value.__await).then(function(value) {\n invoke(\"next\", value, resolve, reject);\n }, function(err) {\n invoke(\"throw\", err, resolve, reject);\n });\n }\n\n return Promise.resolve(value).then(function(unwrapped) {\n // When a yielded Promise is resolved, its final value becomes\n // the .value of the Promise<{value,done}> result for the\n // current iteration.\n result.value = unwrapped;\n resolve(result);\n }, function(error) {\n // If a rejected Promise was yielded, throw the rejection back\n // into the async generator function so it can be handled there.\n return invoke(\"throw\", error, resolve, reject);\n });\n }\n }\n\n var previousPromise;\n\n function enqueue(method, arg) {\n function callInvokeWithMethodAndArg() {\n return new Promise(function(resolve, reject) {\n invoke(method, arg, resolve, reject);\n });\n }\n\n return previousPromise =\n // If enqueue has been called before, then we want to wait until\n // all previous Promises have been resolved before calling invoke,\n // so that results are always delivered in the correct order. If\n // enqueue has not been called before, then it is important to\n // call invoke immediately, without waiting on a callback to fire,\n // so that the async generator function has the opportunity to do\n // any necessary setup in a predictable way. This predictability\n // is why the Promise constructor synchronously invokes its\n // executor callback, and why async functions synchronously\n // execute code before the first await. Since we implement simple\n // async functions in terms of async generators, it is especially\n // important to get this right, even though it requires care.\n previousPromise ? previousPromise.then(\n callInvokeWithMethodAndArg,\n // Avoid propagating failures to Promises returned by later\n // invocations of the iterator.\n callInvokeWithMethodAndArg\n ) : callInvokeWithMethodAndArg();\n }\n\n // Define the unified helper method that is used to implement .next,\n // .throw, and .return (see defineIteratorMethods).\n this._invoke = enqueue;\n }\n\n defineIteratorMethods(AsyncIterator.prototype);\n AsyncIterator.prototype[asyncIteratorSymbol] = function () {\n return this;\n };\n exports.AsyncIterator = AsyncIterator;\n\n // Note that simple async functions are implemented on top of\n // AsyncIterator objects; they just return a Promise for the value of\n // the final result produced by the iterator.\n exports.async = function(innerFn, outerFn, self, tryLocsList) {\n var iter = new AsyncIterator(\n wrap(innerFn, outerFn, self, tryLocsList)\n );\n\n return exports.isGeneratorFunction(outerFn)\n ? iter // If outerFn is a generator, return the full iterator.\n : iter.next().then(function(result) {\n return result.done ? result.value : iter.next();\n });\n };\n\n function makeInvokeMethod(innerFn, self, context) {\n var state = GenStateSuspendedStart;\n\n return function invoke(method, arg) {\n if (state === GenStateExecuting) {\n throw new Error(\"Generator is already running\");\n }\n\n if (state === GenStateCompleted) {\n if (method === \"throw\") {\n throw arg;\n }\n\n // Be forgiving, per 25.3.3.3.3 of the spec:\n // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n return doneResult();\n }\n\n context.method = method;\n context.arg = arg;\n\n while (true) {\n var delegate = context.delegate;\n if (delegate) {\n var delegateResult = maybeInvokeDelegate(delegate, context);\n if (delegateResult) {\n if (delegateResult === ContinueSentinel) continue;\n return delegateResult;\n }\n }\n\n if (context.method === \"next\") {\n // Setting context._sent for legacy support of Babel's\n // function.sent implementation.\n context.sent = context._sent = context.arg;\n\n } else if (context.method === \"throw\") {\n if (state === GenStateSuspendedStart) {\n state = GenStateCompleted;\n throw context.arg;\n }\n\n context.dispatchException(context.arg);\n\n } else if (context.method === \"return\") {\n context.abrupt(\"return\", context.arg);\n }\n\n state = GenStateExecuting;\n\n var record = tryCatch(innerFn, self, context);\n if (record.type === \"normal\") {\n // If an exception is thrown from innerFn, we leave state ===\n // GenStateExecuting and loop back for another invocation.\n state = context.done\n ? GenStateCompleted\n : GenStateSuspendedYield;\n\n if (record.arg === ContinueSentinel) {\n continue;\n }\n\n return {\n value: record.arg,\n done: context.done\n };\n\n } else if (record.type === \"throw\") {\n state = GenStateCompleted;\n // Dispatch the exception by looping back around to the\n // context.dispatchException(context.arg) call above.\n context.method = \"throw\";\n context.arg = record.arg;\n }\n }\n };\n }\n\n // Call delegate.iterator[context.method](context.arg) and handle the\n // result, either by returning a { value, done } result from the\n // delegate iterator, or by modifying context.method and context.arg,\n // setting context.delegate to null, and returning the ContinueSentinel.\n function maybeInvokeDelegate(delegate, context) {\n var method = delegate.iterator[context.method];\n if (method === undefined) {\n // A .throw or .return when the delegate iterator has no .throw\n // method always terminates the yield* loop.\n context.delegate = null;\n\n if (context.method === \"throw\") {\n // Note: [\"return\"] must be used for ES3 parsing compatibility.\n if (delegate.iterator[\"return\"]) {\n // If the delegate iterator has a return method, give it a\n // chance to clean up.\n context.method = \"return\";\n context.arg = undefined;\n maybeInvokeDelegate(delegate, context);\n\n if (context.method === \"throw\") {\n // If maybeInvokeDelegate(context) changed context.method from\n // \"return\" to \"throw\", let that override the TypeError below.\n return ContinueSentinel;\n }\n }\n\n context.method = \"throw\";\n context.arg = new TypeError(\n \"The iterator does not provide a 'throw' method\");\n }\n\n return ContinueSentinel;\n }\n\n var record = tryCatch(method, delegate.iterator, context.arg);\n\n if (record.type === \"throw\") {\n context.method = \"throw\";\n context.arg = record.arg;\n context.delegate = null;\n return ContinueSentinel;\n }\n\n var info = record.arg;\n\n if (! info) {\n context.method = \"throw\";\n context.arg = new TypeError(\"iterator result is not an object\");\n context.delegate = null;\n return ContinueSentinel;\n }\n\n if (info.done) {\n // Assign the result of the finished delegate to the temporary\n // variable specified by delegate.resultName (see delegateYield).\n context[delegate.resultName] = info.value;\n\n // Resume execution at the desired location (see delegateYield).\n context.next = delegate.nextLoc;\n\n // If context.method was \"throw\" but the delegate handled the\n // exception, let the outer generator proceed normally. If\n // context.method was \"next\", forget context.arg since it has been\n // \"consumed\" by the delegate iterator. If context.method was\n // \"return\", allow the original .return call to continue in the\n // outer generator.\n if (context.method !== \"return\") {\n context.method = \"next\";\n context.arg = undefined;\n }\n\n } else {\n // Re-yield the result returned by the delegate method.\n return info;\n }\n\n // The delegate iterator is finished, so forget it and continue with\n // the outer generator.\n context.delegate = null;\n return ContinueSentinel;\n }\n\n // Define Generator.prototype.{next,throw,return} in terms of the\n // unified ._invoke helper method.\n defineIteratorMethods(Gp);\n\n Gp[toStringTagSymbol] = \"Generator\";\n\n // A Generator should always return itself as the iterator object when the\n // @@iterator function is called on it. Some browsers' implementations of the\n // iterator prototype chain incorrectly implement this, causing the Generator\n // object to not be returned from this call. This ensures that doesn't happen.\n // See https://github.com/facebook/regenerator/issues/274 for more details.\n Gp[iteratorSymbol] = function() {\n return this;\n };\n\n Gp.toString = function() {\n return \"[object Generator]\";\n };\n\n function pushTryEntry(locs) {\n var entry = { tryLoc: locs[0] };\n\n if (1 in locs) {\n entry.catchLoc = locs[1];\n }\n\n if (2 in locs) {\n entry.finallyLoc = locs[2];\n entry.afterLoc = locs[3];\n }\n\n this.tryEntries.push(entry);\n }\n\n function resetTryEntry(entry) {\n var record = entry.completion || {};\n record.type = \"normal\";\n delete record.arg;\n entry.completion = record;\n }\n\n function Context(tryLocsList) {\n // The root entry object (effectively a try statement without a catch\n // or a finally block) gives us a place to store values thrown from\n // locations where there is no enclosing try statement.\n this.tryEntries = [{ tryLoc: \"root\" }];\n tryLocsList.forEach(pushTryEntry, this);\n this.reset(true);\n }\n\n exports.keys = function(object) {\n var keys = [];\n for (var key in object) {\n keys.push(key);\n }\n keys.reverse();\n\n // Rather than returning an object with a next method, we keep\n // things simple and return the next function itself.\n return function next() {\n while (keys.length) {\n var key = keys.pop();\n if (key in object) {\n next.value = key;\n next.done = false;\n return next;\n }\n }\n\n // To avoid creating an additional object, we just hang the .value\n // and .done properties off the next function object itself. This\n // also ensures that the minifier will not anonymize the function.\n next.done = true;\n return next;\n };\n };\n\n function values(iterable) {\n if (iterable) {\n var iteratorMethod = iterable[iteratorSymbol];\n if (iteratorMethod) {\n return iteratorMethod.call(iterable);\n }\n\n if (typeof iterable.next === \"function\") {\n return iterable;\n }\n\n if (!isNaN(iterable.length)) {\n var i = -1, next = function next() {\n while (++i < iterable.length) {\n if (hasOwn.call(iterable, i)) {\n next.value = iterable[i];\n next.done = false;\n return next;\n }\n }\n\n next.value = undefined;\n next.done = true;\n\n return next;\n };\n\n return next.next = next;\n }\n }\n\n // Return an iterator with no values.\n return { next: doneResult };\n }\n exports.values = values;\n\n function doneResult() {\n return { value: undefined, done: true };\n }\n\n Context.prototype = {\n constructor: Context,\n\n reset: function(skipTempReset) {\n this.prev = 0;\n this.next = 0;\n // Resetting context._sent for legacy support of Babel's\n // function.sent implementation.\n this.sent = this._sent = undefined;\n this.done = false;\n this.delegate = null;\n\n this.method = \"next\";\n this.arg = undefined;\n\n this.tryEntries.forEach(resetTryEntry);\n\n if (!skipTempReset) {\n for (var name in this) {\n // Not sure about the optimal order of these conditions:\n if (name.charAt(0) === \"t\" &&\n hasOwn.call(this, name) &&\n !isNaN(+name.slice(1))) {\n this[name] = undefined;\n }\n }\n }\n },\n\n stop: function() {\n this.done = true;\n\n var rootEntry = this.tryEntries[0];\n var rootRecord = rootEntry.completion;\n if (rootRecord.type === \"throw\") {\n throw rootRecord.arg;\n }\n\n return this.rval;\n },\n\n dispatchException: function(exception) {\n if (this.done) {\n throw exception;\n }\n\n var context = this;\n function handle(loc, caught) {\n record.type = \"throw\";\n record.arg = exception;\n context.next = loc;\n\n if (caught) {\n // If the dispatched exception was caught by a catch block,\n // then let that catch block handle the exception normally.\n context.method = \"next\";\n context.arg = undefined;\n }\n\n return !! caught;\n }\n\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n var record = entry.completion;\n\n if (entry.tryLoc === \"root\") {\n // Exception thrown outside of any try block that could handle\n // it, so set the completion value of the entire function to\n // throw the exception.\n return handle(\"end\");\n }\n\n if (entry.tryLoc <= this.prev) {\n var hasCatch = hasOwn.call(entry, \"catchLoc\");\n var hasFinally = hasOwn.call(entry, \"finallyLoc\");\n\n if (hasCatch && hasFinally) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n } else if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else if (hasCatch) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n }\n\n } else if (hasFinally) {\n if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else {\n throw new Error(\"try statement without catch or finally\");\n }\n }\n }\n },\n\n abrupt: function(type, arg) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc <= this.prev &&\n hasOwn.call(entry, \"finallyLoc\") &&\n this.prev < entry.finallyLoc) {\n var finallyEntry = entry;\n break;\n }\n }\n\n if (finallyEntry &&\n (type === \"break\" ||\n type === \"continue\") &&\n finallyEntry.tryLoc <= arg &&\n arg <= finallyEntry.finallyLoc) {\n // Ignore the finally entry if control is not jumping to a\n // location outside the try/catch block.\n finallyEntry = null;\n }\n\n var record = finallyEntry ? finallyEntry.completion : {};\n record.type = type;\n record.arg = arg;\n\n if (finallyEntry) {\n this.method = \"next\";\n this.next = finallyEntry.finallyLoc;\n return ContinueSentinel;\n }\n\n return this.complete(record);\n },\n\n complete: function(record, afterLoc) {\n if (record.type === \"throw\") {\n throw record.arg;\n }\n\n if (record.type === \"break\" ||\n record.type === \"continue\") {\n this.next = record.arg;\n } else if (record.type === \"return\") {\n this.rval = this.arg = record.arg;\n this.method = \"return\";\n this.next = \"end\";\n } else if (record.type === \"normal\" && afterLoc) {\n this.next = afterLoc;\n }\n\n return ContinueSentinel;\n },\n\n finish: function(finallyLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.finallyLoc === finallyLoc) {\n this.complete(entry.completion, entry.afterLoc);\n resetTryEntry(entry);\n return ContinueSentinel;\n }\n }\n },\n\n \"catch\": function(tryLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc === tryLoc) {\n var record = entry.completion;\n if (record.type === \"throw\") {\n var thrown = record.arg;\n resetTryEntry(entry);\n }\n return thrown;\n }\n }\n\n // The context.catch method must only be called with a location\n // argument that corresponds to a known catch block.\n throw new Error(\"illegal catch attempt\");\n },\n\n delegateYield: function(iterable, resultName, nextLoc) {\n this.delegate = {\n iterator: values(iterable),\n resultName: resultName,\n nextLoc: nextLoc\n };\n\n if (this.method === \"next\") {\n // Deliberately forget the last sent value so that we don't\n // accidentally pass it on to the delegate.\n this.arg = undefined;\n }\n\n return ContinueSentinel;\n }\n };\n\n // Regardless of whether this script is executing as a CommonJS module\n // or not, return the runtime object so that we can declare the variable\n // regeneratorRuntime in the outer scope, which allows this module to be\n // injected easily by `bin/regenerator --include-runtime script.js`.\n return exports;\n\n}(\n // If this script is executing as a CommonJS module, use module.exports\n // as the regeneratorRuntime namespace. Otherwise create a new empty\n // object. Either way, the resulting object will be used to initialize\n // the regeneratorRuntime variable at the top of this file.\n typeof module === \"object\" ? module.exports : {}\n));\n\ntry {\n regeneratorRuntime = runtime;\n} catch (accidentalStrictMode) {\n // This module should not be running in strict mode, so the above\n // assignment should always work unless something is misconfigured. Just\n // in case runtime.js accidentally runs in strict mode, we can escape\n // strict mode using a global Function call. This could conceivably fail\n // if a Content Security Policy forbids using Function, but in that case\n // the proper solution is to fix the accidental strict mode problem. If\n // you've misconfigured your bundler to force strict mode and applied a\n // CSP to forbid Function, and you're not willing to fix either of those\n // problems, please detail your unique predicament in a GitHub issue.\n Function(\"r\", \"regeneratorRuntime = r\")(runtime);\n}\n","function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {\n try {\n var info = gen[key](arg);\n var value = info.value;\n } catch (error) {\n reject(error);\n return;\n }\n\n if (info.done) {\n resolve(value);\n } else {\n Promise.resolve(value).then(_next, _throw);\n }\n}\n\nfunction _asyncToGenerator(fn) {\n return function () {\n var self = this,\n args = arguments;\n return new Promise(function (resolve, reject) {\n var gen = fn.apply(self, args);\n\n function _next(value) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value);\n }\n\n function _throw(err) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err);\n }\n\n _next(undefined);\n });\n };\n}\n\nmodule.exports = _asyncToGenerator;","'use strict';\n\n/* eslint no-empty-function: 0 */\n\nvar deviceApi = require('./device.api'),\n defaults = {\n method: 'GET', /* HTTP method to use, such as \"GET\", \"POST\", \"PUT\", \"DELETE\", etc. */\n async: true, /* whether or not to perform the operation asynchronously */\n headers: {}, /* list of HTTP request headers */\n data: null, /* data to send (plain object) */\n timeout: 30000, /* amount of milliseconds a request can take before being terminated */\n type: 'text',\n onload: function () {}, /* callback when the request has successfully completed */\n onerror: function () {}, /* callback when the request has failed */\n ontimeout: null /* callback when the author specified timeout has passed before the request could complete */\n },\n app = require('../../app'),\n defaultsKeys = Object.keys(defaults),\n requestStack = [],\n locked = false,\n api = {\n host: null,\n authHost: null,\n lang: 'en',\n session: {\n account: null,\n accessToken: null,\n refreshToken: null,\n userId: null,\n macAlgorithm: null,\n macKey: null\n },\n /* eslint max-lines-per-function: 0 */\n request: function ( url, options, afterRefresh ) {\n var client = fetch(),\n index, headersKeys;\n\n\n if ( locked ) {\n requestStack.push({\n url: url,\n options: options\n });\n\n return;\n }\n\n locked = true;\n options = options || {};\n\n if ( url && (typeof url === 'string' || url instanceof String) && url.length > 0 ) {\n if ( options && typeof options === 'object' ) {\n for ( index = 0; index < defaultsKeys.length; index++ ) {\n // in case not redefined\n if ( options[defaultsKeys[index]] === undefined ) {\n options[defaultsKeys[index]] = defaults[defaultsKeys[index]];\n }\n }\n }\n\n client = fetch();\n // api.session.account.address = api.session.account.address.replace('stalker_portal/', '');\n require('./shared.backend').instance.host = api.host;\n api.authHost = api.host + '/stalker_portal/auth/token.php';\n client.open(options.method, api.host + '/stalker_portal/api/v3/' + url, options.async);\n\n client.setRequestHeader('Authorization', 'Bearer ' + api.session.accessToken);\n client.setRequestHeader('Content-Type', 'application/json');\n client.setRequestHeader('Accept-Language', app.stalker.lang);\n\n if ( options.headers && typeof options.headers === 'object' ) {\n headersKeys = Object.keys(options.headers);\n for ( index = 0; index < headersKeys.length; index++ ) {\n client.setRequestHeader(headersKeys[index], options.headers[headersKeys[index]]);\n }\n }\n\n client.responseType = options.type;\n client.timeout = options.timeout;\n\n client.onreadystatechange = function onreadystatechange () {\n var data = false;\n\n if ( this.readyState === 0 ) {\n locked = false;\n if ( requestStack.length > 0 ) {\n data = requestStack.shift();\n app.stalker.request(data.url, data.options);\n }\n } else if ( this.readyState === 4 ) {\n if ( this.status === 0 ) {\n locked = false;\n if ( requestStack.length > 0 ) {\n data = requestStack.shift();\n app.stalker.request(data.url, data.options);\n }\n } else if ( this.status === 200 ) {\n try {\n data = JSON.parse(this.responseText);\n } catch ( error ) {\n data = false;\n console.log(error);\n }\n\n try {\n options.onload(!data, data);\n } catch ( exception ) {\n if ( app.stalker.onfail ) {\n app.stalker.onfail('Exception thrown ' + exception.message);\n }\n if ( options.onerror ) {\n try {\n options.onerror.call(client);\n } catch ( error ) {\n console.log(error);\n }\n }\n }\n\n locked = false;\n if ( requestStack.length > 0 ) {\n data = requestStack.shift();\n app.stalker.request(data.url, data.options);\n }\n } else if ( this.status === 401 ) {\n if (\n app.stalker.session\n && app.stalker.session.refreshToken\n && app.stalker.session.account\n && app.stalker.session.account.activationCode\n ) {\n if ( afterRefresh ) {\n app.stalker.oncredenitalsrequired(function () {\n locked = false;\n app.stalker.request(url, options);\n });\n\n return;\n }\n app.stalker.auth.refreshToken(app.stalker.session.refreshToken, function ( error ) {\n if ( error ) {\n if ( error.error === 'invalid_grant' ) {\n app.stalker.oncredenitalsrequired(function () {\n locked = false;\n app.stalker.request(url, options);\n });\n } else if ( error.error === 'access_denied' && error.error_description === 'Account disabled') {\n app.stalker.reload();\n } else {\n locked = false;\n app.stalker.request(url, options);\n }\n } else {\n locked = false;\n app.stalker.request(url, options, true);\n }\n });\n } else {\n app.stalker.oncredenitalsrequired(function () {\n locked = false;\n app.stalker.request(url, options);\n });\n }\n } else {\n locked = false;\n\n try {\n options.onload(this.status, this.responseText);\n } catch ( onLoadException ) {\n if ( app.stalker.onfail ) {\n app.stalker.onfail('Exception thrown ' + onLoadException.message);\n }\n if ( options.onerror ) {\n try {\n options.onerror.call(client);\n } catch ( error ) {\n console.log(error);\n }\n }\n }\n\n if ( requestStack.length > 0 ) {\n data = requestStack.shift();\n app.stalker.request(data.url, data.options);\n }\n }\n }\n };\n\n client.onerror = function () {\n if ( options.onerror ) {\n try { options.onerror.call(client); } catch ( err ) { /* */ }\n }\n if ( app.stalker.onfail ) {\n app.stalker.onfail('Network error ' + client.status);\n }\n };\n\n client.ontimeout = function () {\n if ( options.ontimeout ) {\n try { options.ontimeout.call(client); } catch ( err ) { /* */ }\n }\n };\n\n client.send(options.body || null);\n\n /* eslint consistent-return: 0 */\n return client;\n }\n }\n };\n\napi.auth = {\n login: function ( credentials, callback ) {\n var client = fetch(),\n postData = ['grant_type=password', 'hw_version=', 'serial_number='],\n ready = 0,\n total = 5,\n timer = setTimeout(function () {\n client.abort();\n callback('onerror ' + client.status + ' : ' + client.responseText, false);\n }, 6000);\n\n postData.push('username=' + encodeURIComponent(credentials.login));\n postData.push('password=' + encodeURIComponent(credentials.password));\n postData.push('activation_code=' + encodeURIComponent(credentials.activationCode));\n\n\n credentials.address = credentials.address.replace('/stalker_portal/', '');\n api.host = credentials.address;\n require('./shared.backend').instance.host = api.host;\n api.authHost = credentials.address + '/stalker_portal/auth/token.php';\n client.open('POST', credentials.address + '/stalker_portal/auth/token.php', true);\n\n client.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');\n\n client.timeout = 5000;\n client.onreadystatechange = function () {\n var data;\n\n clearTimeout(timer);\n\n if ( this.readyState !== 4 ) {\n return;\n }\n\n // window.top.alert(\"login responseText \" + this.responseText);\n //alert(\"login status \" + this.status);\n if ( this.status === 200 ) {\n try {\n data = JSON.parse(this.responseText);\n //alert(JSON.stringify(data));\n } catch ( parseException ) {\n console.log(parseException);\n //alert(e.toString())\n data = {};\n }\n\n if ( data.access_token && data.user_id ) {\n app.stalker.session = {\n account: credentials,\n accessToken: null,\n refreshToken: null,\n userId: null,\n macAlgorithm: null,\n macKey: null\n };\n\n if ( data.activation_code ) {\n app.stalker.session.account.activationCode = data.activation_code;\n }\n\n app.stalker.session.accessToken = data.access_token;\n app.stalker.session.refreshToken = data.refresh_token;\n app.stalker.session.userId = data.user_id;\n if ( data.mac_algorithm ) {\n app.stalker.session.macAlgorithm = data.mac_algorithm;\n }\n if ( data.mac_key ) {\n app.stalker.session.macKey = data.api.mac_key;\n app.stalker.session.macAlgorithm = api.mac_algorithm;\n }\n if ( data.api && data.api.v3 ) {\n app.stalker.session.macKey = data.api.v3.mac_key;\n app.stalker.session.macAlgorithm = data.api.v3.mac_algorithm;\n } else {\n // old ministra server\n callback(['404']);\n\n return;\n }\n\n if ( app.stalker.saveCallback ) {\n app.stalker.saveCallback();\n }\n callback(false, data);\n } else {\n callback(data, data);\n }\n } else {\n callback(this.status + ' : ' + this.responseText, {});\n }\n };\n\n client.onerror = function () {\n callback('onerror ' + this.status + ' : ' + this.responseText, false);\n };\n\n deviceApi.clientType(function ( someProblem, data ) {\n postData.push('client_type=' + encodeURIComponent(data));\n\n ++ready;\n if ( ready === total ) {\n client.send(postData.join('&'));\n }\n });\n // deviceApi.metric1(function ( someProblem, data ) {\n // postData.push('meta_1=' + encodeURIComponent(data));\n //\n // ++ready;\n // if ( ready === total ) {\n // client.send(postData.join('&'));\n // }\n // });\n //credentials.login\n // deviceApi.metric2(function ( someProblem, data ) {\n // postData.push('meta_2=' + encodeURIComponent(data));\n //\n // ++ready;\n // if ( ready === total ) {\n // client.send(postData.join('&'));\n // }\n // });\n\n postData.push('meta_1=' + encodeURIComponent(credentials.login));\n ++ready;\n postData.push('meta_2=' + encodeURIComponent(credentials.login));\n ++ready;\n\n deviceApi.metric3(function ( someProblem, data ) {\n postData.push('meta_3=' + encodeURIComponent(data));\n\n ++ready;\n if ( ready === total ) {\n client.send(postData.join('&'));\n }\n });\n deviceApi.network.mac(function ( someProblem, data ) {\n postData.push('mac=' + encodeURIComponent(data));\n\n ++ready;\n if ( ready === total ) {\n client.send(postData.join('&'));\n }\n // window.top.alert(postData.join('&'))\n });\n\n },\n refreshToken: function ( refreshToken, callback ) {\n var client = fetch(),\n ready = 0,\n total = 5,\n postData = [\n 'grant_type=refresh_token',\n 'hw_version=',\n 'refresh_token=' + app.stalker.session.refreshToken,\n 'activation_code=' + encodeURIComponent(app.stalker.session.account.activationCode)\n ];\n\n\n postData.push();\n client.open('POST', api.host + '/stalker_portal/auth/token.php', true);\n require('./shared.backend').instance.host = api.host;\n api.authHost = api.host + '/stalker_portal/auth/token.php';\n\n client.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');\n\n client.onload = function () {\n var data;\n\n //alert(\"refresh token status \" + this.status);\n if ( this.status === 200 ) {\n try {\n data = JSON.parse(this.responseText);\n } catch ( error ) {\n console.log(error);\n data = {};\n }\n\n //alert(\"refresh token responseText \" + this.responseText);\n if ( data.access_token && data.user_id ) {\n app.stalker.session.accessToken = data.access_token;\n app.stalker.session.refreshToken = data.refresh_token;\n app.stalker.session.userId = data.user_id;\n if ( data.mac_algorithm ) {\n app.stalker.session.macAlgorithm = data.mac_algorithm;\n }\n if ( data.mac_key ) {\n app.stalker.session.macKey = app.stalker.mac_key;\n app.stalker.session.macAlgorithm = app.stalker.mac_algorithm;\n }\n if ( data.api && data.api.v3 ) {\n app.stalker.session.macKey = data.api.v3.mac_key;\n app.stalker.session.macAlgorithm = data.api.v3.mac_algorithm;\n }\n if ( app.stalker.saveCallback ) {\n app.stalker.saveCallback();\n }\n callback(false);\n } else {\n callback(data, data);\n }\n } else {\n callback(this.status + ' : ' + this.responseText, {});\n }\n };\n\n client.onerror = function () {\n //alert('onerror');\n callback(true, {});\n };\n\n\n deviceApi.clientType(function ( someProblem, data ) {\n postData.push('client_type=' + encodeURIComponent(data));\n\n ++ready;\n if ( ready === total ) {\n client.send(postData.join('&'));\n }\n });\n deviceApi.metric1(function ( someProblem, data ) {\n postData.push('meta_1=' + encodeURIComponent(data));\n\n ++ready;\n if ( ready === total ) {\n client.send(postData.join('&'));\n }\n });\n deviceApi.metric2(function ( someProblem, data ) {\n postData.push('meta_2=' + encodeURIComponent(data));\n\n ++ready;\n if ( ready === total ) {\n client.send(postData.join('&'));\n }\n });\n deviceApi.metric3(function ( someProblem, data ) {\n postData.push('meta_3=' + encodeURIComponent(data));\n\n ++ready;\n if ( ready === total ) {\n client.send(postData.join('&'));\n }\n });\n deviceApi.network.mac(function ( someProblem, data ) {\n postData.push('mac=' + encodeURIComponent(data));\n\n ++ready;\n if ( ready === total ) {\n client.send(postData.join('&'));\n }\n });\n }\n};\n\nwindow.fetch = function () {\n return new XMLHttpRequest();\n};\n\nmodule.exports = api;\n","/**\n * @author Aleynikov Boris .\n */\n\n'use strict';\n\nconst\n CLIENT_TYPE = 'Web',\n METRIC1 = '',\n METRIC2 = '',\n METRIC3 = 'Web',\n MAC = '11:11:11:11:11:11';\n\n\nmodule.exports = {\n clientType: done => done(false, CLIENT_TYPE),\n metric1: done => done(false, METRIC1),\n metric2: done => done(false, METRIC2),\n metric3: done => done(false, METRIC3),\n network: {\n mac: done => done(false, MAC)\n }\n};\n","/**\n * @author Aleynikov Boris .\n */\n\n'use strict';\n\nwindow.dataLayer = window.dataLayer || [];\n\nfunction gtag () {\n window.dataLayer.push(arguments);\n}\n\ngtag('js', new Date());\ngtag('config', 'UA-152049112-1');\n","/**\n * Login page implementation.\n */\n\n'use strict';\n\nconst\n keys = require('spa-keys'),\n format = require('cjs-format'),\n app = require('../app'),\n Component = require('../lib/component'),\n Input = require('../lib/components/input'),\n Button = require('../lib/components/button'),\n\n backend = require('../lib/api/backend'),\n spinner = require('../lib/spinner'),\n\n authErrors = require('../lib/api/statuses').errors,\n\n STATE_INPUT_LOGIN = Symbol('input_login'),\n STATE_INPUT_LICENSE = Symbol('input_license');\n\n\nlet text = {},\n inputs = {},\n buttons = {},\n credentialsData = {},\n page,\n content,\n state;\n\n\nfunction tagB ( innerText, className ) {\n return '' + innerText + '';\n}\n\n\nfunction validateInput ( input, minimalLength = 1 ) {\n if ( input.value.trim().length < minimalLength ) {\n input.state = input.STATE_ERROR;\n } else {\n input.state = input.STATE_NORMAL;\n }\n\n return input.value.trim().length >= minimalLength;\n}\n\n\nfunction setState ( newState ) {\n state = newState;\n\n switch ( state ) {\n case STATE_INPUT_LOGIN:\n content.links.$text.innerHTML = text.login;\n inputs.license.hidden = true;\n inputs.login.hidden = false;\n inputs.login.password = false;\n break;\n case STATE_INPUT_LICENSE:\n inputs.login.hidden = true;\n inputs.password.hidden = true;\n inputs.license.hidden = false;\n content.links.$text.innerHTML = text.license;\n break;\n }\n}\n\n\nfunction processAuthError ( error ) {\n spinner.hide();\n switch ( error.state ) {\n case authErrors.ERROR_WRONG_LOGIN:\n content.links.$loginError.innerText = gettext('Incorrect login or password');\n content.links.$loginError.classList.add('welcome__error--visible');\n break;\n case authErrors.ERROR_ACCOUNT_DISABLED:\n content.links.$loginError.innerText = gettext('Account is disabled');\n content.links.$loginError.classList.add('welcome__error--visible');\n break;\n case authErrors.ERROR_NEED_LICENSE_KEY:\n setState(STATE_INPUT_LICENSE);\n break;\n case authErrors.ERROR_WRONG_LICENSE_KEY:\n content.links.$loginError.innerText = gettext('License key not found');\n content.links.$loginError.classList.add('welcome__error--visible');\n break;\n case authErrors.ERROR_WRONG_META_DATA:\n content.links.$loginError.innerText = gettext('The License Key you’ve entered has already been activated on another device. Please contact the key provider.');\n content.links.$loginError.classList.add('welcome__error--visible');\n break;\n case authErrors.ERROR_WRONG_OPERATOR_ID:\n content.links.$loginError.innerText = gettext('The License Key doesn\\'t work for this portal. Please contact your service provider.');\n content.links.$loginError.classList.add('welcome__error--visible');\n break;\n default:\n content.links.$loginError.innerText = gettext('Undefined error');\n content.links.$loginError.classList.add('welcome__error--visible');\n break;\n }\n}\n\n\nfunction loginHandler () {\n let login = inputs.login.value,\n password = inputs.password.value;\n\n if ( validateInput(inputs.login) && validateInput(inputs.password) ) {\n credentialsData.login = login;\n credentialsData.password = password;\n content.links.$loginError.classList.remove('welcome__error--visible');\n if ( state === STATE_INPUT_LICENSE ) {\n if ( !validateInput(inputs.license, app.config.licenseKeyLength) ) {\n content.links.$loginError.innerText = gettext('License Key must have 12 symbols');\n content.links.$loginError.classList.add('welcome__error--visible');\n\n return;\n }\n credentialsData.activationCode = inputs.license.value;\n }\n\n spinner.show();\n backend.login(credentialsData)\n .then(() => {\n spinner.hide();\n app.tabSet.current = app.pages.channels;\n })\n .catch(processAuthError);\n }\n}\n\n\nfunction inputKeydownHandler ( event ) {\n event.keyCode === keys.enter && loginHandler();\n}\n\n\ntext.login = format(\n gettext('Contact your service provider and request {0} and {1} from them .'),\n tagB(gettext('login')),\n tagB(gettext('password'))\n);\ntext.license = format(\n gettext('Contact your service provider and request {0} from them.'),\n tagB(gettext('license key'))\n);\n\ninputs.login = new Input({\n label: gettext('Login'),\n // defined only in develop mode\n value: app.config.user.login,\n events: {keydown: inputKeydownHandler}\n});\n\ninputs.password = new Input({\n label: gettext('Password'),\n type: 'password',\n // defined only in develop mode\n value: app.config.user.password,\n events: {keydown: inputKeydownHandler}\n});\n\ninputs.license = new Input({\n label: gettext('License key'),\n // defined only in develop mode\n value: app.config.user.activationKey,\n events: {keydown: inputKeydownHandler}\n});\n\nbuttons.login = new Button({\n title: gettext('Sign in'),\n events: {\n click: loginHandler\n }\n});\n\n\n/* eslint max-len: 0*/\ncontent = (\n
\n
\n \n
{gettext('Welcome to Ministra Player')}
\n
\n
\n
{gettext('The License Key has been suspended. Please contact your service provider.')}
\n {inputs.login}\n {inputs.password}\n {inputs.license}\n {buttons.login}\n
\n
\n);\n\n\npage = new Component({\n name: 'page',\n modifiers: ['login'],\n $node: content.$node\n});\n\nsetState(STATE_INPUT_LOGIN);\n\n// public\nmodule.exports = page;\n","/**\n * Global list of non-printable control key codes.\n *\n * @author Stanislav Kalashnik \n * @license GNU GENERAL PUBLIC LICENSE Version 3\n */\n\n'use strict';\n\n// public\nmodule.exports = {\n backspace: 8,\n tab: 9,\n enter: 13,\n escape: 27,\n space: 32,\n pageUp: 33,\n pageDown: 34,\n end: 35,\n home: 36,\n left: 37,\n up: 38,\n right: 39,\n down: 40,\n insert: 45,\n // not \"delete\" because of old browsers issue\n del: 46\n};\n","/**\n * @license The MIT License (MIT)\n * @author Stanislav Kalashnik \n */\n\n/* eslint no-path-concat: 0 */\n\n'use strict';\n\n\n/**\n * Do string substitution according to the given format.\n * http://stackoverflow.com/questions/610406/javascript-equivalent-to-printf-string-format\n *\n * @param {string} format string substitution format\n *\n * @return {string} result data\n */\nmodule.exports = function ( format ) {\n var args = Array.prototype.slice.call(arguments, 1),\n expr = /{(\\d+)}/g;\n\n if ( DEVELOP ) {\n if ( !format ) {\n throw new Error(__filename + ': format string is empty');\n }\n if ( args.length === 0 ) {\n throw new Error(__filename + ': no arguments');\n }\n if ( !expr.test(format) ) {\n throw new Error(__filename + ': format string does not have substitutions: ' + format);\n }\n }\n\n return format.replace(expr, function ( match, number ) {\n return args[number] === undefined ? match : args[number];\n });\n};\n","/**\n * @author Aleynikov Boris .\n */\n\n'use strict';\n\nvar Component = require('../component');\n\n\nclass Input extends Component {\n constructor ( config ) {\n let html;\n\n config = config || {};\n config.type = config.type || 'text';\n\n html = (\n
\n
{config.label}
\n {config.value || '' }\n
\n );\n\n config.$node = html.$node;\n\n super(config);\n\n this.links = html.links;\n this.private.state = this.STATE_NORMAL;\n\n this.links.$value.addEventListener('change', () => {\n if ( this.events.change ) {\n this.emit('change', {value: this.$node.value});\n }\n });\n\n this.links.$value.addEventListener('keydown', event => {\n if ( this.events.keydown ) {\n this.emit('keydown', event);\n }\n });\n\n if ( config.placeholder ) {\n this.links.$value.placeholder = config.placeholder;\n }\n\n if ( config.value ) {\n this.links.$value.value = config.value;\n }\n }\n\n get value () {\n return this.links.$value.value;\n }\n\n set state ( state ) {\n switch ( state ) {\n case this.STATE_ERROR:\n this.links.$value.className = 'input__value input__value--error';\n break;\n case this.STATE_NORMAL:\n this.links.$value.className = 'input__value';\n break;\n }\n\n this.private.state = state;\n }\n\n get state () {\n return this.private.state;\n }\n}\n\nInput.prototype.STATE_NORMAL = 0;\nInput.prototype.STATE_ERROR = 1;\nInput.prototype.name = 'input';\n\nmodule.exports = Input;\n","/**\n * @license The MIT License (MIT)\n * @copyright Stanislav Kalashnik \n */\n\n'use strict';\n\nvar Component = require('../component');\n\n\n/**\n * Base button implementation.\n *\n * Has global options:\n * Button.prototype.clickDuration - time to apply \"click\" class, does not apply if 0\n *\n * @constructor\n * @extends Component\n *\n * @param {Object} [config={}] - init parameters (all inherited from the parent)\n * @param {string} [config.value] - button caption text (generated if not set)\n * @param {string} [config.icon] - button icon name\n *\n * @example\n * var Button = require('stb/ui/button'),\n * btnSimple, btnIcon, btnDetached;\n *\n * btnSimple = new Button({\n * $node: document.getElementById('btnSimple'),\n * value: 'Simple button'\n * });\n *\n * btnIcon = new Button({\n * $node: document.getElementById('btnIcon'),\n * icon: 'menu'\n * value: 'Button with icon'\n * });\n *\n * btnDetached = new Button({\n * value: 'Button not added to the page',\n * className: 'wide'\n * });\n */\nfunction Button ( config ) {\n var self = this;\n\n console.assert(typeof this === 'object', 'must be constructed via new');\n console.assert(typeof config === 'object', 'wrong config type');\n\n //config.name = 'spa-component-button' + (config.className || '');\n\n // set default className if classList property empty or undefined\n //config.className = this.name + ' ' + (config.className || '');\n\n config.focusable = true;\n\n // parent constructor call\n Component.call(this, config);\n\n // optional dom\n // if ( config.icon ) {\n // // insert icon\n // this.$icon = this.$body.appendChild(document.createElement('div'));\n // this.$icon.className = 'icon ' + config.icon;\n // }\n //\n // // insert caption placeholder\n // this.$text = this.$body.appendChild(document.createElement('div'));\n // this.$text.classList.add('text');\n\n if ( config.title ) {\n // fill it\n this.$node.textContent = config.title;\n }\n\n this.$node.addEventListener('click', function ( event ) {\n console.log('button node click', event);\n\n self.events.click && self.emit('click', event);\n });\n\n // if ( DEVELOP ) {\n // window.ComponentButton = Button;\n // }\n}\n\n\n// inheritance\nButton.prototype = Object.create(Component.prototype);\nButton.prototype.constructor = Button;\n\n// set component name\nButton.prototype.name = 'button';\n\n\n/*Button.prototype.render = function ( $node, data ) {\n // store\n this.private.data = data;\n\n // build\n $node.textContent = data.title;\n};*/\n\n\n// time to apply \"click\" class, does not apply if 0\n//Button.prototype.clickDuration = 200;\n\n\n/**\n * List of all default event callbacks.\n *\n * @type {Object.}\n */\n// Button.prototype.defaultEvents = {\n// /**\n// * Default method to handle mouse click events.\n// */\n// click: function () {\n// // current execution context\n// var self = this;\n//\n// this.$node.classList.add('click');\n//\n// setTimeout(function () {\n// self.$node.classList.remove('click');\n// }, this.clickDuration);\n// },\n//\n// /**\n// * Default method to handle keyboard keydown events.\n// *\n// * @param {Object} event generated event\n// */\n// keydown: function ( event ) {\n// if ( event.code === keys.enter ) {\n// // emulate click\n// // there are some listeners\n// if ( this.events['click'] ) {\n// /**\n// * Mouse click event emulation.\n// *\n// * @event module:stb/ui/button~Button#click\n// *\n// * @type {Object}\n// * @property {Event} event click event data\n// */\n// this.emit('click', {event: event});\n// }\n// }\n// }\n// };\n\n\n// public\nmodule.exports = Button;\n","/**\n * @author Aleynikov Boris .\n */\n\n'use strict';\n\nfunction onProgramFocus ( program ) {\n if ( program.archive ) {\n program.getLink((error, data) => {\n if ( !error && data && data.url ) {\n player.playEpgProgram({uri: data.url});\n }\n });\n } else {\n player.playChannel(channelList.data[channelList.focusIndex]);\n }\n}\n\nfunction onChannelFocus ( channel ) {\n let today = new Date(),\n todayStart = new Date(today.getFullYear(), today.getMonth(), today.getDate()).getTime() / 1000,\n nextDayStart = new Date(today.getFullYear(), today.getMonth(), today.getDate() + 1).getTime() / 1000;\n\n player.playChannel(channel);\n\n channel.getEpg({from: todayStart, to: nextDayStart}, (error, programs) => {\n if ( error ) {\n console.error(error);\n programList.data = [];\n } else {\n programList.data = programs;\n }\n });\n}\n\n/**\n * Player's 'end' event handler\n * On this page we may catch 'end' event only when playing tv archive.\n */\nfunction onContentEnd () {\n console.log('end');\n if ( programList.data[programList.focusIndex + 1] ) {\n programList.focusIndex++;\n } else {\n // play realtime channel\n player.playChannel(channelList.data[channelList.focusIndex]);\n }\n}\n\n\nconst\n Component = require('../lib/component'),\n Select = require('../lib/components/select'),\n provider = require('../lib/api/tv.provider'),\n header = require('../lib/components/header'),\n spinner = require('../lib/spinner'),\n player = require('../lib/player'),\n channelList = require('../lib/components/channel.list'),\n programList = require('../lib/components/program.list'),\n\n categorySelect = new Select({\n events: {\n 'focus:item': function ( element ) {\n spinner.show();\n provider.getChannels({genre: element.value.id})\n .then(channels => {\n channelList.data = channels;\n spinner.hide();\n });\n }\n }\n }),\n content = (\n
\n
\n {categorySelect}\n {channelList}\n
\n {player}\n
\n
\n {gettext('Guide')}\n
\n {programList}\n
\n
\n ),\n page = new Component({\n $node: content.$node,\n name: 'page',\n modifiers: ['channels', 'padded']\n });\n\n\nplayer.init();\nplayer.addListener('click:live', () => {\n player.playChannel(channelList.data[channelList.focusIndex]);\n programList.focusIndex = null;\n});\n\n\npage.addListeners({\n show: () => {\n header.hidden = false;\n spinner.show();\n player.addListener('end', onContentEnd);\n\n provider.getChannels().then(channels => {\n channelList.data = channels;\n spinner.hide();\n\n provider.getLastChannelId().then(lastId => {\n let index = channelList.data.findIndex(channel => channel.id === lastId);\n\n if ( index === -1 ) {\n index = 0;\n }\n\n channelList.focusIndex = index;\n }).catch(() => {\n channelList.focusIndex = 0;\n });\n\n // once page was shown we must play content and pause to draw preview image\n // make setTimeout because on play event first frame is not drawn\n player.once('play', () => {\n setTimeout(() => {\n player.plugin.pause();\n });\n });\n\n });\n\n provider.getCategories().then(categories => {\n categories = categories.map(category => {\n return {\n label: category.name,\n value: category\n };\n });\n\n categorySelect.data = [\n {\n label: gettext('All channels'),\n value: {id: null}\n }\n ].concat(categories);\n\n categorySelect.current = categorySelect.data[0];\n });\n },\n\n hide: () => {\n player.removeListener('end', onContentEnd);\n player.pause();\n }\n});\n\n\n// prepare channels page\n{\n categorySelect.$node.classList.add('channel-list__select');\n channelList.addListener('focus:item', onChannelFocus);\n programList.addListener('focus:item', onProgramFocus);\n}\n\nif ( DEVELOP ) {\n window.player = player;\n}\n\n\nmodule.exports = page;\n","function _assertThisInitialized(self) {\n if (self === void 0) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n\n return self;\n}\n\nmodule.exports = _assertThisInitialized;","/**\n * @author Aleynikov Boris .\n */\n\n'use strict';\n\nlet provider = require('../../../../../plugin-backend-tv-stalker/src/js/main'),\n plugin;\n\n\nprovider.onAppInit(false, function ( error, worker ) {\n plugin = worker;\n});\n\n\nmodule.exports = {\n getChannels: ( config = {} ) => {\n return new Promise((resolve, reject) => {\n plugin.updateChannelsList(function () {\n plugin.getChannels(config, function ( error, data ) {\n if ( error ) {\n reject(error);\n } else {\n resolve(data);\n }\n });\n });\n });\n },\n\n getCategories: () => new Promise((resolve, reject) => {\n plugin.getCategories(function ( error, data ) {\n if ( error ) {\n reject();\n } else {\n resolve(data);\n }\n });\n }),\n\n getLastChannelId: () => new Promise((resolve, reject) => {\n plugin.getLastChannelId((error, data) => {\n if ( error ) {\n reject(error);\n } else {\n resolve(Number(data));\n }\n });\n })\n};\n","/**\n * Tv - channels plugin or system module implementation\n */\n\n'use strict';\n\nmodule.exports = {\n onAppInit: function ( config, callback ) {\n var appPlugin = require('./stalker');\n\n appPlugin(config, callback);\n },\n onInit: require('./daemon.stalker'),\n onContentBoardInit: function ( dump, done ) {\n require('./leanback')(dump, done);\n }\n};\n","/**\n *\n * @author Aleynikov Boris .\n */\n\n'use strict';\n\nvar request = core.backend.request,\n Epg = require('./epg.class'),\n storageRequest;\n\nfunction Channel ( config ) {\n var prop;\n\n config = config || {};\n\n if ( PLATFORM !== 'MAG') {\n // eslint-disable-next-line\n config.pvr = config.local_pvr = false;\n }\n\n for ( prop in config ) {\n this[prop] = config[prop];\n }\n}\n\n\nChannel.prototype = {};\nChannel.prototype.constructor = Channel;\n\n/**\n * Toggle favorite state\n *\n * @param {Function} callback - callback after toggle\n */\nChannel.prototype.toggleFavorite = function ( callback ) {\n var self = this;\n\n request('tv-channels/' + this.id, {\n method: 'PUT',\n body: JSON.stringify({favorite: !self.favorite}),\n onload: function ( error ) {\n if ( error ) {\n callback(true);\n } else {\n self.favorite = !self.favorite;\n callback(false, self.favorite);\n }\n },\n onerror: function () {\n callback(true);\n }\n });\n};\n\n\n/**\n * Load channel url.\n *\n * @param {Function} callback - which called with or without url\n *\n * @return {XMLHttpRequest|null} request instance or null for cached url\n */\nChannel.prototype.getUrl = function ( callback ) {\n if ( this.url ) {\n callback(false, {url: this.url, solution: this.solution});\n } else {\n return request('tv-channels/' + this.id + '/link', {\n onload: function ( error, response ) {\n if ( error ) {\n callback(error, null);\n } else {\n callback(false, {url: response.data.url, solution: response.data.solution});\n }\n },\n onerror: function () {\n callback(true, null);\n }\n });\n }\n\n return null;\n};\n\n\nChannel.prototype.getEpg = function ( config, callback ) {\n var self = this,\n now = new Date(),\n url, from, to;\n\n config = config || {};\n\n // use 7 days before current and next 7 days to get epg\n from = +new Date(now.getFullYear(), now.getMonth(), now.getDate() - 7);\n to = +new Date(now.getFullYear(), now.getMonth(), now.getDate() + 7);\n from = Math.round(from / 1000);\n to = Math.round(to / 1000);\n\n from = config.from || from;\n to = config.to || to;\n\n url = 'tv-channels/' + this.id + '/epg/?from=' + from + '&to=' + to;\n\n function onRequestError () {\n callback(true, []);\n }\n\n return request(url, {\n onload: function ( error, response ) {\n var result = [];\n\n if ( error && callback ) {\n console.log(error);\n // TODO: split this check in two\n callback(true, []);\n } else {\n response.data.forEach(function ( epgData ) {\n epgData.channel = self;\n result.push(new Epg(epgData));\n });\n\n callback(false, result);\n }\n },\n onerror: onRequestError,\n ontimeout: onRequestError\n });\n};\n\nChannel.prototype.setLast = function ( callback ) {\n if ( storageRequest ) {\n storageRequest.abort();\n }\n\n function onRequestError () {\n storageRequest = null;\n\n callback(true, null);\n }\n\n storageRequest = request('storage', {\n body: JSON.stringify({value: this.id, key: 'lastChannel'}),\n method: 'POST',\n onload: function ( error ) {\n storageRequest = null;\n\n if ( error && callback ) {\n callback(error);\n } else if ( callback ) {\n callback(false);\n }\n },\n onerror: onRequestError,\n ontimeout: onRequestError\n });\n};\n\n\nmodule.exports = Channel;\n","/**\n *\n * @author Aleynikov Boris .\n */\n\n'use strict';\n\nvar Emitter = require('cjs-emitter'),\n storage = require('./data.storage'),\n\n // constants\n EVENT_BACKEND_LOAD = 'system:start',\n EVENT_MESSAGE_RECEIVE = 'play_channel',\n TV_APP_NAME = 'magcore-app-tv',\n CLASSIC_TV_APP_NAME = 'magcore-app-tv-classic',\n\n appsConfig = {\n /* here will be apps configs */\n };\n\nfunction isAppRunning ( appName ) {\n\n return (core.taskManager.topApp && core.taskManager.topApp.config.packageName === appName);\n}\n\n\nfunction sendPlayChannelEvent ( channelToPlay ) {\n var targetApp,\n channelToCheckCensored;\n\n // if we are watching TV Classic app we do not need do checks\n if ( isAppRunning(CLASSIC_TV_APP_NAME) ) {\n targetApp = appsConfig.CLASSIC_TV;\n } else if ( isAppRunning(TV_APP_NAME) ) {\n // if we are watching TV app we do not need do checks\n targetApp = appsConfig.TV;\n } else if ( appsConfig.CLASSIC_TV && !appsConfig.CLASSIC_TV.locked ) {\n // if classic tv is present and not under parent password\n targetApp = appsConfig.CLASSIC_TV;\n } else if ( appsConfig.TV && (!appsConfig.TV.locked || isAppRunning(TV_APP_NAME))) {\n // if tv app is present and not under parent password\n targetApp = appsConfig.TV;\n } else {\n console.log('we cant send message to tv apps :(');\n }\n\n channelToCheckCensored = storage.findByNumber(channelToPlay);\n\n if (\n channelToCheckCensored\n && (channelToCheckCensored.censored || ( channelToCheckCensored.genre && channelToCheckCensored.genre.censored ))\n ) {\n // this channel is under parent control and we should do nothing\n return;\n }\n\n core.taskManager.runApp({\n config: targetApp,\n ignoreAccessControl: true,\n visible: true,\n onload: function ( app ) {\n setTimeout(function () {\n app.core.emit('play:channel', {number: parseInt(channelToPlay, 10)});\n }, 100);\n }\n });\n}\n\n\n// window.top.qm = {\n// START_POINT_TIMESTAMP: +new Date(),\n// send: function ( n ) {\n// sendPlayChannelEvent(n);\n// },\n// storage: storage\n// };\n\nmodule.exports = function ( config, callback ) {\n var hardcodeLoader = new Emitter();\n\n\n hardcodeLoader.once(EVENT_BACKEND_LOAD, function () {\n // find apps links\n appsConfig.TV = core.packageMap[TV_APP_NAME];\n appsConfig.CLASSIC_TV = core.packageMap[CLASSIC_TV_APP_NAME];\n\n // get app provider to force update channel list\n require('./stalker')(config, function ( error, appProvider ) {\n if ( error ) {\n console.log('error getting provider');\n }\n appProvider.updateChannelsList(function () {\n window.core.backend.addListener('message', function ( message ) {\n if ( message && message.type === EVENT_MESSAGE_RECEIVE ) {\n // here we have channel id or number to play\n sendPlayChannelEvent(message.msg);\n }\n });\n\n });\n });\n });\n\n if ( callback ) {\n callback(false, hardcodeLoader);\n }\n\n};\n","/**\n *\n * @author Aleynikov Boris .\n */\n\n'use strict';\n\n/* eslint max-len:0*/\n\nvar Emitter = require('cjs-emitter'),\n getAppProvider = require('./stalker'),\n leanback = require('magcore-plugin-content-board/index'),\n\n LEANBACK_CHANNELS_COUNT = 10,\n // LEANBACK_ITEM_COLOR = '#0193d5',\n providerIcons = {\n 480: {\n normal: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAb5JREFUWAntVr1Kw1AUTtKf2KAdYhcHEQdBBHH2ARw6dBQtIu6+hBk6+wq6CQWnPoVPoOAoDjZ0CSSlxCR+B3NKS2/SXHqLDgnc3r9zvu/c7557bzVN0wwUpV+SJBbKte/7O0uAjSoM4iVGUtOe523HcXwFJ9s0TcJ/yAGIyUDZFwTBbqPR6CIAUuCzUqn0l4EXkn88Hu8B8NJ13a0swMlkcoQV36TkbyB/1HXdz7Ln8UIB1Gq1MwAftlqtWwRyzM5ch2F4Wq/Xz9GvYv6l1+v1QR7y/Mo1rRzA3SiKHCpoXwyHw03HcQy02+nYHQUiS6bLOIDsBPZtqLFhGEaA9hfa+6i/0X/Gql9l8MhWKgByGI1GTdu2OyA+oD6+APv/ZFnWx29X7lcn+eRc1FoXSkK1lPNo03sAx8aZn1pvj5X/PwrwepHplFyUZE0eW6XG6fDgP8AJeRfhiBRQRk6E6UI6InIam+YAG/DKVeUE7TVjMsdsLVJgdn7t7TKAUoFSgVKBUoGFt4BeL7q7+b1WcRenL6IQSrQFgzwHIUrOID/HWSYLCqTv9n2Wg+pxkQKqOXLx/v5fMRIuN8J1ThL3DwPnuJXTZYA4AAAAAElFTkSuQmCC',\n active: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAAXNSR0IArs4c6QAAAuJJREFUaAXtmb9rFEEUx3dXEdRAIF2wkYAoCGJjKyKmCNhaHKSLlzKllWjl/5BCC8EuYKNtbL3Kwh8gEiyMqIWCcoEIend+Xnhv3dzuunPH7d6M3MKXeTPzfnzfzpvZu90oiqIjwItrMBgcB5vgoiMhb7hHkD4NXvT7fZrBJzDnmMT01SC7DL4q+W/I16bPypEBZG+B30r+JfKSo+lk1Ai4PI4n7ObAlhBX8lv0T47ja2wbAt7R4I+R510doXsGvFbbHvJtV9uJ6hF4A/xSIjvIlacHOtfBd7X5If2JkhrVGQQugy9KaB/5ZpEPxmNwF6B6cNK8RT5XpNv4GEROgedCTMk9pH/CiCDPgyeZ+acyZvNetBA6BjYzJF/RPwvOg3eZ8Xv0Ey9IF5GA3Br4qSvRRe6qvId8o8jGuzGIXgIfMnf9Pf0LdRCNJUgdjpvy6W8tOt6Bo6aXJElscgitVU7wK1CaAJtOHjxt0AEHJ4ltykm24ltjSKyRqyDdxNkSwtEiZfSI9mqT5RTH8TPirdJ+roprJRTZ3TQDuQtgW8a5dkELSEK1XOJbY+xqzG36lSuR8k4FpYdxO0N+oRbWBU6JuwAsiXaByqGhlHcq6DROOppA65BFAx1itzR2pypcyjsV/iZgj/7ayqaMHAksagLdMh0bN965TSwTopTd1GbUROsaP9VrglSdMUqfA3UGHcU3ZbUC5DQUrORsrZZsYrhv4021w/GFuI2JbDxszPsVMMJlbQgJrPNk/iggifXhRGan0PAdabrvfQnJySObVzE7hZqukMp43pcQGcxOocplnKZCCCX0z/vz/yXAI3tPUubcncofGoltHESuuopW4I0aXakyrmHeYhqH6hD2s9Q0ufPB/6kP6rVK7teorITWfxAvtgoT0CTk5ZJ871oD8pWlli/numGl5h+A+/SdXvdL6aMflSYgkz5flkDRKeQz7xy3dAVyM4EMJL1eLxCqeZrC/Q9bOOZ3iNQcwwAAAABJRU5ErkJggg=='\n },\n 576: {\n normal: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAb5JREFUWAntVr1Kw1AUTtKf2KAdYhcHEQdBBHH2ARw6dBQtIu6+hBk6+wq6CQWnPoVPoOAoDjZ0CSSlxCR+B3NKS2/SXHqLDgnc3r9zvu/c7557bzVN0wwUpV+SJBbKte/7O0uAjSoM4iVGUtOe523HcXwFJ9s0TcJ/yAGIyUDZFwTBbqPR6CIAUuCzUqn0l4EXkn88Hu8B8NJ13a0swMlkcoQV36TkbyB/1HXdz7Ln8UIB1Gq1MwAftlqtWwRyzM5ch2F4Wq/Xz9GvYv6l1+v1QR7y/Mo1rRzA3SiKHCpoXwyHw03HcQy02+nYHQUiS6bLOIDsBPZtqLFhGEaA9hfa+6i/0X/Gql9l8MhWKgByGI1GTdu2OyA+oD6+APv/ZFnWx29X7lcn+eRc1FoXSkK1lPNo03sAx8aZn1pvj5X/PwrwepHplFyUZE0eW6XG6fDgP8AJeRfhiBRQRk6E6UI6InIam+YAG/DKVeUE7TVjMsdsLVJgdn7t7TKAUoFSgVKBUoGFt4BeL7q7+b1WcRenL6IQSrQFgzwHIUrOID/HWSYLCqTv9n2Wg+pxkQKqOXLx/v5fMRIuN8J1ThL3DwPnuJXTZYA4AAAAAElFTkSuQmCC',\n active: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAAXNSR0IArs4c6QAAAuJJREFUaAXtmb9rFEEUx3dXEdRAIF2wkYAoCGJjKyKmCNhaHKSLlzKllWjl/5BCC8EuYKNtbL3Kwh8gEiyMqIWCcoEIend+Xnhv3dzuunPH7d6M3MKXeTPzfnzfzpvZu90oiqIjwItrMBgcB5vgoiMhb7hHkD4NXvT7fZrBJzDnmMT01SC7DL4q+W/I16bPypEBZG+B30r+JfKSo+lk1Ai4PI4n7ObAlhBX8lv0T47ja2wbAt7R4I+R510doXsGvFbbHvJtV9uJ6hF4A/xSIjvIlacHOtfBd7X5If2JkhrVGQQugy9KaB/5ZpEPxmNwF6B6cNK8RT5XpNv4GEROgedCTMk9pH/CiCDPgyeZ+acyZvNetBA6BjYzJF/RPwvOg3eZ8Xv0Ey9IF5GA3Br4qSvRRe6qvId8o8jGuzGIXgIfMnf9Pf0LdRCNJUgdjpvy6W8tOt6Bo6aXJElscgitVU7wK1CaAJtOHjxt0AEHJ4ltykm24ltjSKyRqyDdxNkSwtEiZfSI9mqT5RTH8TPirdJ+roprJRTZ3TQDuQtgW8a5dkELSEK1XOJbY+xqzG36lSuR8k4FpYdxO0N+oRbWBU6JuwAsiXaByqGhlHcq6DROOppA65BFAx1itzR2pypcyjsV/iZgj/7ayqaMHAksagLdMh0bN965TSwTopTd1GbUROsaP9VrglSdMUqfA3UGHcU3ZbUC5DQUrORsrZZsYrhv4021w/GFuI2JbDxszPsVMMJlbQgJrPNk/iggifXhRGan0PAdabrvfQnJySObVzE7hZqukMp43pcQGcxOocplnKZCCCX0z/vz/yXAI3tPUubcncofGoltHESuuopW4I0aXakyrmHeYhqH6hD2s9Q0ufPB/6kP6rVK7teorITWfxAvtgoT0CTk5ZJ871oD8pWlli/numGl5h+A+/SdXvdL6aMflSYgkz5flkDRKeQz7xy3dAVyM4EMJL1eLxCqeZrC/Q9bOOZ3iNQcwwAAAABJRU5ErkJggg=='\n },\n 720: {\n normal: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAAXNSR0IArs4c6QAAA8lJREFUaAXtWctrE0EczsPEqE2LaIW0HlrEB21BiFfBguYkuVStgkel+mf00LNnDz1IL+agRSjioZeIZwsiBiGIPSViUUIfeT/8vnU2LpmUnXQncbd0YDqP/T2+b36/md1OfD6fL4jqitJqtUL1ej25t7cXUwQUDECwoSjcV7FCoXC62Ww+8vv91yKRyMNsNntcwWHDryDUdxGs/AWAvwtHJwKBQKlSqbwCiW8qjv87gVqtdh2gbwIssfzc3d1NjYyM/FYBTxmmkKPC1TuIAaYIdOcB/hb0/WgzqMu9gKdfRxHA6s3C6SyAfA0Gg2+Qv2UVMpA/g5R5ANlR6LewcdOhUOi9im6njKMIAEgZAJoAfgWAnqicHuVy+TJkFwR4pHsldVDwJOMoAjRQKpUmwuHwPXRPgUwdUXmH8Uc+sxaQpa8bAD8r5n8Vi8VUNBrdssr12ndMgA4BbhjNPMCd5xhEPmUymbfT09NVjvE8gmYOzy+JcRYp91o15aizX3GUQqZRANlOp9MvANRYeQC9OjU19Rjjs6jnMF4wwYPch6WlpZc6wNO/lgiYRNgCcBxgb6MbBFgjAhiHMa5hzI3+hXK6inYCBAYS4wB9H12mFksBeyU1NDT04+9Q319/o9FY1Gdu8Ja07IHBw/7n8ZjZxamwaPa90JqZc3gi0Lnq2Ijc4HEwjSM6o+Ik6RRzPOZJBR9b8LEBYxs4pVq9GG2nkFUJ4KMY88UzCYM+tNbHWvtcGPjgqTUOMjPwvYrxjqoTiYBYeQM8DG7D0DrqZi9GVZ1TTizWBLoJLhh8zmFuBf6UItFtD/BFREPb+Xz+OQx97hd4EqBt+qAv+qRvTMf5TKVIBJjzQnF9bGysqGJEh4zwxWj7LBhsTUsEuGGF1qattn4Bw6cFg60HiQBCyO8WI7S22poFzFQ1MaiYlwioKLlJRjqF3ASOWHAiXUSTFLjWEKWs6BuNFyKQREoNs1qItDl4gUAbbLeOFwis8f3ACgJrnSRcvwdEzj/rBG6OvRABE2vX1vURODqFusbNRZNe2ANHp5CLEkaG4oUUklFbZg4fAbyyzRtl/mM/0CL+P+bttoFBxbkUAV5xCMUJFQOaZQyfFgy25iUC4n6GiolcLnfS1oImAeErQXMWDLbWu31KbCCEM/j+nozFYk8R1kFeqwzD93eg5iWXUpEI4OsPmFurMGTcDcHKHVpCWJUM9iqEhWqrCPC82FK6E6KiRICTMLADEisw6M2rRUGCq8CfjFhdW6RN7Fqk+wDz/i801Wq1L7+T7bNgWqeJ/Q+uGajXVAGMsgAAAABJRU5ErkJggg==',\n active: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAA7dJREFUeAHtmj1oFEEUx/dODYKNSvALLW2CmMo+iIXaWAq2gqV2AQt7iSB2SpqATUq7VAaDFtaWIgoaMV0kEEEw3vl7YSf3nN2b29m93Zvd24U/8/bNzHv/92bn7dxHFEXRIRD81e/3z4DX4PIYydYi9oig58G3Xq9H0/8KTo8xCWGbIthbYFeCN+D+PTg6DubdcRgpywZBLmL7Fe0xy8dP7o9YuubcEvAMWDErrlv0z0D4exeSHfAQHPdZGsbPgnc6aJG5/oB7PrYmOhayj2Lin5AvZSHDuDnwReZpoNsGV7PYCGIMZG+CvyYI5F1w20WO/htgx8wxLbqP4KJrbnB9EF4zAegW/ROQ2L/oHoA9PVZkLnnvnwguwFGEIC1F7IUdUBzUOn2zYoP2sGPcc+kf5SvofgK4C37biUAnh5lrYD2lbw/9/aAD8yFHMFfAph1o2j3jdsB1H/u1GEtQp8CbtKCNjv7PYK4WAeUhSXCy35+agHWL/i3Yrwt5bNdqDoHeAb9MApBXwMykgugIkUk5D8Fv0B+GqkhQm4Aqshyyj8RJq9vtdkImXJSbXfPaLVA0o3Wfn9gCdkC8o8+jWwILyGft/qrvO53OFj43wCLy96L+E+cAXQPi4D/QnizqaNzzCX4bm/O+SfCtAUshBi/JjHnJk1noGlUEFwpZL39ycX7mTG5azdnoTEvW14DUhMov8Sv+DRfT+hIx80zrrAEySDtgv13w3XN6flE5TsKmtqNrltYPkxMx2Qpt0NU3zEHZ+qKcEvPLJhy6/VFFMHT+hfm1CSicwpobaJ+Ami9gYfqNegI4J8gvUo/Bjxgiu79wlfeihk6p1tvvTz2uStnFSYK3+0Wn+dn9XidBfUjSRquU7YXQnOJV/+8jOyfXLXDOcEzMNx3T2jaqBrCIL1MWMk03GGbviUFPFLn69LgqZRcnKXiy5+OtIIUwUQTt+Y2qAVkWQhKgxzVtC+jYMsmNSkCWLZDIir0n9ABXnx5XpeziJHve7hed5mf3N6oGEKwUvvYcoFd8lNyoGkCwae/8NN0gL/aeGPS054D9g5BOiD53a32VsiyY9ufLKTFfG5tG2asGUGEn8qOIWZgy/HslACLLZZAwAbra2O+ya0yePuc5AKeJ92oeJ2XNsT/rZ/HjWwM2shid4JjC/EY9AbLnp/f/AfEPofInhFV53Ca40geu48d+FYX3nyMOjCjB+QSocY0RfWtAYwIfFojva3CYndrqE1ugtpHkJD71T0CbgJxPTmOm/QOvtuGpPSrOfQAAAABJRU5ErkJggg=='\n },\n 1080: {\n normal: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEgAAABICAYAAABV7bNHAAAAAXNSR0IArs4c6QAABZNJREFUeAHtXEtrG1cU1suO8Qu31DW2oU0fXkQOJPE2KsUYL0oppGnT4GUXgf6A/oD8jJYsCl2EQkl2LYUstHEXLdQlFC9cDM2mtqjwwpVd2/JD/b7JHHE9mas7utJYo8wdGJ07576+891zHzNzR5lMJpPHmcP5Uh2NRiN3cnLy4fHx8aKlYeQkX8BPwz8ty0leNpAzdHp6eiebzb6DMwOSMgMDA+U2kZKXDAk6azNjopPv7u6+CoArIGbSB9ooFAr/WYD2HCdrkTGxWQ4ODt4cGhq6e3Z2NkyQuVyufnR09Ai6DVvQLw1B9Xr9OrrRRyCHYyqP2uHh4cORkZHt55d2v31PEMabLAbjJXhLSShAuILwQ3Szf0VnK/t69lpfXx+E4Z8FyPlzc3Pzm26QQ1Jj9yBOswA7sbGx8cP8/HzdtiWD+XZ2dsYnJiZWoJ+WOHjTr/l8/ifU17WJJ1aCSA5a930aAFnd29v7fmxs7B8xyFbu7+/PDA8Pr2C8GfPLaKB8EvOLbZm6fLF2MbQox4BTVg5jJkdHR+9hML2hAxNFj1mpCHI+F3JATB0N8V0c5BBPrB7ECkDSLIy5i+A4r3lA99SmyyHfeyhr6Xkp3m9XZiqlvBeCsXoQa0PL/l2tVr+GcX9J7dBdKxaL92q12uuiayXL5XIB+T9WyYHnVHA+6HQab1Uv42L3IAEAA9kYSzDypuhgIHrH8Y+Dg4O/iy4oK5XKyNTUFBd/b0gc8nGmejQ3N3ckurjkhREkBoCoIoy9hWtO0d4BXWiXo4dh3OJg/IqStuszlZQdJi+cIIKA4Ryw6RWvCSh4xblZDqS9i/g7iL/kp4ltphIMYbInBBEICLiEO+5bGI+uCDDpcrhlGAA5H0Dv4YO+43sqqaNd2TOCBCjGoBII4MykwxL7TCVYwqQOVFja2HTwprdR+KfwGu8uXCoCcV27p5Iy25VZuPn9djOlKX3s66B+J9MRZGhBPnJtHrgTvt+8SHFAHXacBxkcwRFkIOhcFwtLiymYS4EFuN0CuuAkpuLmLUJY+l7quKAEzipwrgHHGhah3qubTjC1JAjk8IHUbZDyFirjM51O6oo9LxsPOPl4ZRZkXQX+x7iudVKxtov5nuOR00kFvcrLRkXdt307rGG08qAFvxKvcLQInw4+wfms01axRtsio+/tl5FkGbi9h3PED9wL0P3WImvLKK0HccyRnCRne3v7KxDzRxLJIU7iIj7i9BvTg6/aIfa0I7UEcUBWCnoyMzNj8/pWKeJigj5Oerp3BOwQdWSpJQjuqc5WzyKXmIyETbwBO9pGpyVILSmp3UrFqIa7iTcSQWrlaQs7ggwt7ghyBBkYMESnzoP4EhLPwZexPvqSJ8PU6XjSRugy9Lu+VCpxQ4X68vImdDSruXZSbUydB4GcayoBDIfpJE3qCBLDo8rUEYSV9dMgOWE6SZM6glZXV8sg5GcQsMeTYeqEkKBM3SC9uLh4AhI4IIcOykGCUudBQQJM144gA0OpI8gtFA0e4RaKBoLCFoVhOikmdV1MDI8qU0dQ2KIwTCcEpo4gt1CUptdIt1DUEGOrTl0Xa5coR5CBMUeQI8jAgCHaeZAjyMCAITqSB/l7bwxFJSe6m3i1BOEGTv0A93JyzI+EpIk3YEekzGoiLUF4qVZVEi5vbW2d+45CiUtU0Me5LKACdog6stQ+k+ZOUdzEzbIkyPHp6ekv4Lp8jts3W/CI3d/xyqDVoSUIpa3BPa+CHG6G9EiC+IRhtApFog7gfAEP8PM7WW4Jtj60XQybkLjH+LFfiXUFvcro4+Y24I72SrfyIG9jJLrVt6jMbSTXtbTfAtxGa72VVld2P+i1XawfwF8ERkeQgWX3SaaBoIJMjxiIDUnTFd3kBf/elIgvn5NIP7n5H+JLUcZN4rwRAAAAAElFTkSuQmCC',\n active: 'data:image/png;base64,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'\n }\n };\n\n\nmodule.exports = function ( api, ready ) {\n var provider = new Emitter(),\n imagePath = api.path + '/img/' + screen.height + '/';\n\n getAppProvider(null, function ( error, appProvider ) {\n if ( error ) {\n console.log('error while try to get provider');\n }\n\n appProvider.updateChannelsList(function () {\n\n provider.search = function ( query, doneCallback ) {\n // do smth\n doneCallback(false, []);\n };\n\n\n provider.icons = providerIcons;\n\n appProvider.getChannels({favorite: false}, function ( error, startData ) {\n var dataToSend = startData.slice(0, LEANBACK_CHANNELS_COUNT).map(function ( channel ) {\n var icon = {\n normal: imagePath + 'placeholder.png',\n active: imagePath + 'placeholder-focus.png'\n };\n\n if ( error ) {\n console.log('error getting channels');\n }\n\n if ( channel.logo ) {\n icon = {\n normal: core.backend.host + channel.logo,\n active: core.backend.host + channel.logo\n };\n }\n\n\n if ( channel.censored || (channel.genre && channel.genre.censored) ) {\n icon = {\n normal: imagePath + 'parents-control.png',\n active: imagePath + 'parents-control-focus.png'\n };\n }\n\n return {\n id: channel.id,\n layout: leanback.layouts.tvChannel,\n geometry: leanback.geometry.horizontal,\n data: {\n name: channel.name,\n number: channel.number,\n program: {\n name: '',\n // float\n progress: 0\n },\n icon: icon,\n censored: channel.censored || (channel.genre && channel.genre.censored),\n url: function ( cb ) {\n // error, data => {url:'', solution: 'ffmpeg'}\n channel.getUrl(cb);\n }\n },\n update: function () {\n var self = this;\n\n appProvider.getChannelsEpg({channels: [channel]}, function (error, data) {\n if ( !error && data && data[channel.id] && data[channel.id][0] ) {\n self.data.program.name = data[channel.id][0].title;\n } else {\n self.data.program.name = '';\n }\n });\n },\n actions: [leanback.actions.accessControl, leanback.actions.favorite],\n onClick: function () {\n // intent to player\n function sendIntent () {\n channel.getUrl(function ( error, data ) {\n if ( !error && data ) {\n core.intent({\n action: 'play',\n mime: 'content/video',\n data: {\n uri: data.url,\n title: channel.name,\n solution: data.solution || 'auto',\n headless: true,\n mediaId: channel.id,\n tvChannel: channel,\n extra: channel.extra,\n retryOnError: true,\n stream: true\n },\n events: {\n\n }\n }, function ( error ) {\n if ( error ) { debug.log('error'); }\n /* do nothing */\n });\n } else {\n console.log('error getting channel url');\n }\n });\n }\n\n if ( channel.censored || (channel.genre && channel.genre.censored) ) {\n core.accessControl.request(function ( error ) {\n if ( !error ) {\n sendIntent();\n }\n });\n } else {\n sendIntent();\n }\n }\n };\n });\n\n if ( dataToSend.length ) {\n dataToSend.push({\n id: -1,\n layout: leanback.layouts.tvChannel,\n data: {\n name: 'See more',\n icon: {\n normal: imagePath + 'see-more-focus.png',\n active: imagePath + 'see-more.png'\n }\n },\n runApp: true\n });\n }\n\n ready(null, {\n provider: provider,\n data: dataToSend\n });\n });\n });\n });\n};\n","'use strict';\n\n/** @namespace */\nmodule.exports = require('./src/js/lib');\n","'use strict';\n\n\n/** @namespace */\nmodule.exports = {\n layouts: {\n // tv channel item with playback and current program\n tvChannel: 1,\n // movie preview\n video: 2,\n // record status and progress\n record: 3,\n // default layout\n static: 4,\n // application layout\n application: 5\n },\n geometry: {\n square: 1,\n horizontal: 2,\n vertical: 3,\n round: 4\n },\n actions: {\n // actions which can be applied to item\n favorite: 1,\n accessControl: 2,\n expandItemContent: 3\n }\n};\n","/**\n * @author Aleynikov Boris .\n */\n\n'use strict';\n\nconst\n Emitter = require('cjs-emitter'),\n config = require('../config');\n\nlet html = (\n
\n
\n \n
{gettext('Live')}
\n
\n
\n ),\n player = new Emitter(),\n lastChannelTimeout,\n lastPlayedContent;\n\nplayer.$node = html.$node;\nplayer.links = html.links;\n\n\nfunction onPlayHandler ( /*event*/ ) {\n if ( player.events.play && player.events.play.length ) {\n player.emit('play');\n }\n}\n\n\nfunction onPlayEnd () {\n if ( player.events.end && player.events.end.length ) {\n player.emit('end');\n }\n}\n\nplayer.init = function () {\n /*eslint-disable-next-line*/\n this.plugin = videojs(html.links.$video, {\n controls: true,\n preload: true\n });\n\n this.plugin.on('play', onPlayHandler);\n this.plugin.on('ended', onPlayEnd);\n this.links.$liveButton.addEventListener('click', () => this.emit('click:live'));\n\n return html.$node;\n};\n\n\nplayer.playChannel = function ( channel ) {\n if ( lastPlayedContent === channel ) {\n return;\n }\n\n lastPlayedContent = channel;\n this.links.$title.innerText = `${channel.number}. ${channel.name}`;\n this.links.$liveButton.classList.remove('player__live-button--visible');\n\n channel.getUrl((error, data) => {\n if ( error ) {\n console.log(error);\n }\n\n this.plugin.src({\n src: data.url\n });\n\n this.plugin.play().then(function () {\n clearTimeout(lastChannelTimeout);\n lastChannelTimeout = setTimeout(function () {\n channel.setLast();\n }, config.saveLastChannelTimeout);\n });\n });\n};\n\n\nplayer.playEpgProgram = function ( playConfig = {} ) {\n lastPlayedContent = playConfig;\n this.links.$liveButton.classList.add('player__live-button--visible');\n\n if ( playConfig.uri ) {\n this.plugin.src({\n src: playConfig.uri\n });\n\n this.plugin.play();\n }\n};\n\n\nplayer.pause = function () {\n this.plugin.pause();\n};\n\nmodule.exports = player;\n","/**\n * @author Aleynikov Boris .\n */\n\n'use strict';\n\nconst List = require('./list');\n\n\nmodule.exports = new List({\n modifiers: ['channels'],\n render: function ( $item, data ) {\n let html = (\n
\n
\n
{data.number}.{data.name}
\n
\n );\n\n $item.appendChild(html.$node);\n }\n});\n","/**\n * @author Aleynikov Boris .\n */\n\n'use strict';\n\nconst\n List = require('./list'),\n isEnglish = require('../../app').config.language === 'en';\n\n\nfunction convertTime ( time ) {\n let startTime = new Date(time * 1000),\n hours = startTime.getHours(),\n minutes = startTime.getMinutes(),\n ampm = hours >= 12 ? 'pm' : 'am',\n result;\n\n if ( isEnglish ) {\n hours = hours % 12;\n hours = hours ? hours : 12;\n }\n\n minutes = minutes < 10 ? '0' + minutes : minutes;\n result = hours + ':' + minutes;\n\n if ( isEnglish ) {\n result += ' ' + ampm;\n }\n\n return result;\n}\n\n\nfunction findCurrentProgram ( program ) {\n let nowTime = Date.now() / 1000;\n\n return program.start < nowTime && program.end > nowTime;\n}\n\n\nlet programList = new List({\n modifiers: ['program-list'],\n render: function ( $item, data ) {\n let\n className = 'program'\n + (data.archive ? ' program--archive' : '')\n + (findCurrentProgram(data) ? ' program--current' : ''),\n html = (\n
\n
{convertTime(data.start)}
\n
{data.title}
\n
\n );\n\n while ( $item.firstChild ) {\n $item.removeChild($item.firstChild);\n }\n\n $item.appendChild(html.$node);\n }\n});\n\n\nsetInterval(function () {\n programList.data.forEach(function ( data, index ) {\n programList.render(programList.$node.children[index], data);\n });\n}, require('../../app').config.programListUpdateInterval);\n\n\nmodule.exports = programList;\n","/**\n * @author Aleynikov Boris .\n */\n\n'use strict';\n\nconst Component = require('../lib/component');\n\n\nlet content = (\n
\n
{gettext('Profile')}
\n
\n
{gettext('Login')}:
\n
\n
\n
\n
{gettext('Tariff plan')}:
\n
\n
\n
\n
{gettext('End date')}:
\n
n/a
\n
\n
\n ),\n page = new Component({\n $node: content.$node,\n name: 'page',\n modifiers: ['profile', 'padded']\n });\n\n\npage.init = function ( data ) {\n content.links.$login.innerText = data.login;\n content.links.$tariff.innerText = data['tariff_plan'];\n content.links.$endDate.innerText = data['end_date'] || 'n/a';\n};\n\n\nmodule.exports = page;\n"],"sourceRoot":""}