diff --git a/app/scripts/app.js b/app/scripts/app.js index a4bc609..d7cd639 100644 --- a/app/scripts/app.js +++ b/app/scripts/app.js @@ -166,7 +166,7 @@ window.addEventListener('message', function(e) { } }); angular -.module('Lineblocs', [ + .module('Lineblocs', [ 'ui.router', 'ngAnimate', 'ngMaterial', @@ -174,725 +174,774 @@ angular 'pascalprecht.translate', 'md.data.table', 'ngIdle', - 'ngclipboard' - ]) - .service('JWTHttpInterceptor', function() { - return { - // optional method - 'request': function(config) { - // do something on success - var token = localStorage.getItem("AUTH"); - if (token) { - config.headers['Authorization'] = getJWTToken(); - } - var workspace = localStorage.getItem("WORKSPACE"); - if (workspace) { - config.headers['X-Workspace-ID'] = getWorkspaceID(); - } - var adminToken = localStorage.getItem("ADMIN_TOKEN"); - if (adminToken) { - config.headers['X-Admin-Token'] = adminToken; - } - - return config; - } - }; - }) - .factory("$shared", function($state, $mdDialog, $timeout, $q, $window, $location, $mdToast, ThemeService) { - var factory = this; - var baseTitle = createBaseTitle(); - factory.tempStopErrors = false; - factory.selectedAdminWorkspace = null; - factory.initialLoaded = false; - factory.title = baseTitle; - factory.FLOW_EDITOR_URL = getEditorPath(); - factory.SHOW_NAVBAR = true; - factory.PAGE_CONTENT_NO_PADDING = false; - factory.isLoading = true; - factory.currentWorkspace = ""; - factory.billingCountries = []; - factory.ranges = [ - "/8", - "/16", - "/24", - "/32" - ]; - factory.acSearch = { - isDisabled: false, - noCache:true, - selectedItem: null, - }; - factory.billingPackages = ['gold', 'silver', 'bronze']; - factory.customizations = null; - var flickerTimeout = 0; - - function searchModule(text, state, tags, stateParams, perms, setting) - { + 'ngclipboard', + ]) + .service('JWTHttpInterceptor', function () { + return { + // optional method + request: function (config) { + // do something on success + var token = localStorage.getItem('AUTH'); + if (token) { + config.headers['Authorization'] = getJWTToken(); + } + var workspace = localStorage.getItem('WORKSPACE'); + if (workspace) { + config.headers['X-Workspace-ID'] = getWorkspaceID(); + } + var adminToken = localStorage.getItem('ADMIN_TOKEN'); + if (adminToken) { + config.headers['X-Admin-Token'] = adminToken; + } + + return config; + }, + }; + }) + .factory( + '$shared', + function ($state, $mdDialog, $timeout, $q, $window, $location, $mdToast, ThemeService) { + var factory = this; + var baseTitle = createBaseTitle(); + factory.tempStopErrors = false; + factory.selectedAdminWorkspace = null; + factory.initialLoaded = false; + factory.title = baseTitle; + factory.FLOW_EDITOR_URL = getEditorPath(); + factory.SHOW_NAVBAR = true; + factory.PAGE_CONTENT_NO_PADDING = false; + factory.isLoading = true; + factory.currentWorkspace = ''; + factory.billingCountries = []; + factory.ranges = ['/8', '/16', '/24', '/32']; + factory.acSearch = { + isDisabled: false, + noCache: true, + selectedItem: null, + }; + factory.billingPackages = ['gold', 'silver', 'bronze']; + factory.customizations = null; + var flickerTimeout = 0; + + function searchModule(text, state, tags, stateParams, perms, setting) { tags = tags || []; - stateParams= stateParams || {}; + stateParams = stateParams || {}; perms = perms || []; setting = setting || null; return { - display: text, - state: state, - tags: tags, - stateParams: stateParams, - perms: perms, - setting: setting - } - } - var modules = [ -searchModule("Blocked Numbers", "settings-blocked-numbers", ['blocked', 'numbers']), -//searchModule("Add Blocked Number", "settings-blocked-numbers-create", ['add', 'blocked', 'number']), -searchModule("IP Whitelist", "settings-ip-whitelist", ['ip', 'whitelist']), -searchModule("API Settings", "settings-workspace-api-settings", ['api']), -searchModule("Workspace Users", "settings-workspace-users", ['workspace', 'users'], [], ['manage_users']), -searchModule("Workspace Params", "settings-workspace-params", ['workspace', 'params']), -searchModule("Add Workspace User", "settings-workspace-users-create", ['add', 'workspace', 'user']), -searchModule("Extension Codes", "settings-extension-codes", ['extension', 'codes']), -searchModule("Media Files", "files", ['media', 'files', 'media files']), -searchModule("Phones", "phones-phones", ['provision', 'phones'], [], ['manage_phones']), -searchModule("Add Phone", "phones-phone-create", ['add', 'phone'], [], ['manage_phones']), -searchModule("Phones Groups", "phones-groups", ['phones', 'groups'], [], ['manage_phonegroups']), -searchModule("Add Phone Group", "phones-groups-create", ['add', 'group'], [], ['create_phonegroup']), -searchModule("Phone Global Templates", "phones-global-settings", ['phones', 'global', 'templates'], [], ['manage_phoneglobalsettings']), -searchModule("Phone Individual Settings", "phones-individual-settings", ['phones', 'individual', 'settings'],[], ['manage_phoneindividualsetting']), -searchModule("Deploy Phone Config", "phones-deploy-config", ['provision', 'phone', 'config', 'deploy'], [], ['manage_phones']), -searchModule("My Numbers", "my-numbers", ['my', 'numbers'], [], ['manage_dids']), -searchModule("Buy Numbers", "buy-numbers", ['buy', 'numbers'], [], ['manage_dids']), -searchModule("Port-In Requests", "ports", ['port', 'requests', 'port in', 'dids'], [], ['manage_ports']), -searchModule("Create Port Request", "port-create", ['port', 'create', 'dids'], [], ['manage_ports']), -searchModule("Flows", "flows", ['flows', 'flow editor'], [], ['manage_flows']), -searchModule("Flow Editor", "flow-editor", ['flow editor'], {"flowId": "new"}, ['create_flow']), -searchModule("Extensions", "extensions", ['extensions'],[], ['manage_extensions']), -searchModule('Add Extension', "extension-create", ['add', 'extension'], [], ['create_extensions']), -searchModule("Logs", "debugger-logs", ['debugger logs', 'logs', 'debugger']), -searchModule("Calls", "calls", ['calls'], [], ['manage_calls']), -searchModule("Recordings", "recordings", ['recordings'], [], ['manage_recordings']), -searchModule("Faxes", "faxes", ['fax', 'faxes']), -searchModule("Billing", "billing", ['billing', 'add card', 'cards', 'settings'], [], ['manage_billing']), -searchModule("BYO Carriers", "byo-carriers", ['byo', 'carriers'], [], ['manage_byo_carriers'], 'bring_carrier'), -searchModule("BYO DID Numbers", "byo-did-numbers", ['byo', 'did numbers', 'did', 'numbers'], [], ['manage_byo_did_numbers'], 'bring_carrier'), -searchModule("Support", "support", ['support'], [], ['support']), - ]; - - factory.centsToDollars = function(cents, addDollarSign) { - addDollarSign = addDollarSign||false; + display: text, + state: state, + tags: tags, + stateParams: stateParams, + perms: perms, + setting: setting, + }; + } + var modules = [ + searchModule('Blocked Numbers', 'settings-blocked-numbers', ['blocked', 'numbers']), + //searchModule("Add Blocked Number", "settings-blocked-numbers-create", ['add', 'blocked', 'number']), + searchModule('IP Whitelist', 'settings-ip-whitelist', ['ip', 'whitelist']), + searchModule('API Settings', 'settings-workspace-api-settings', ['api']), + searchModule( + 'Workspace Users', + 'settings-workspace-users', + ['workspace', 'users'], + [], + ['manage_users'] + ), + searchModule('Workspace Params', 'settings-workspace-params', ['workspace', 'params']), + searchModule('Add Workspace User', 'settings-workspace-users-create', [ + 'add', + 'workspace', + 'user', + ]), + searchModule('Extension Codes', 'settings-extension-codes', ['extension', 'codes']), + searchModule('Media Files', 'files', ['media', 'files', 'media files']), + searchModule('Phones', 'phones-phones', ['provision', 'phones'], [], ['manage_phones']), + searchModule('Add Phone', 'phones-phone-create', ['add', 'phone'], [], ['manage_phones']), + searchModule( + 'Phones Groups', + 'phones-groups', + ['phones', 'groups'], + [], + ['manage_phonegroups'] + ), + searchModule( + 'Add Phone Group', + 'phones-groups-create', + ['add', 'group'], + [], + ['create_phonegroup'] + ), + searchModule( + 'Phone Global Templates', + 'phones-global-settings', + ['phones', 'global', 'templates'], + [], + ['manage_phoneglobalsettings'] + ), + searchModule( + 'Phone Individual Settings', + 'phones-individual-settings', + ['phones', 'individual', 'settings'], + [], + ['manage_phoneindividualsetting'] + ), + searchModule( + 'Deploy Phone Config', + 'phones-deploy-config', + ['provision', 'phone', 'config', 'deploy'], + [], + ['manage_phones'] + ), + searchModule('My Numbers', 'my-numbers', ['my', 'numbers'], [], ['manage_dids']), + searchModule('Buy Numbers', 'buy-numbers', ['buy', 'numbers'], [], ['manage_dids']), + searchModule( + 'Port-In Requests', + 'ports', + ['port', 'requests', 'port in', 'dids'], + [], + ['manage_ports'] + ), + searchModule( + 'Create Port Request', + 'port-create', + ['port', 'create', 'dids'], + [], + ['manage_ports'] + ), + searchModule('Flows', 'flows', ['flows', 'flow editor'], [], ['manage_flows']), + searchModule('Flow Editor', 'flow-editor', ['flow editor'], { flowId: 'new' }, [ + 'create_flow', + ]), + searchModule('Extensions', 'extensions', ['extensions'], [], ['manage_extensions']), + searchModule( + 'Add Extension', + 'extension-create', + ['add', 'extension'], + [], + ['create_extensions'] + ), + searchModule('Logs', 'debugger-logs', ['debugger logs', 'logs', 'debugger']), + searchModule('Calls', 'calls', ['calls'], [], ['manage_calls']), + searchModule('Recordings', 'recordings', ['recordings'], [], ['manage_recordings']), + searchModule('Faxes', 'faxes', ['fax', 'faxes']), + searchModule( + 'Billing', + 'billing', + ['billing', 'add card', 'cards', 'settings'], + [], + ['manage_billing'] + ), + searchModule( + 'BYO Carriers', + 'byo-carriers', + ['byo', 'carriers'], + [], + ['manage_byo_carriers'], + 'bring_carrier' + ), + searchModule( + 'BYO DID Numbers', + 'byo-did-numbers', + ['byo', 'did numbers', 'did', 'numbers'], + [], + ['manage_byo_did_numbers'], + 'bring_carrier' + ), + searchModule('Support', 'support', ['support'], [], ['support']), + ]; + + factory.centsToDollars = function (cents, addDollarSign) { + addDollarSign = addDollarSign || false; // Convert to dollars and ensure 2 decimal places const dollars = (cents / 100).toFixed(2); // Return with or without dollar sign based on parameter return addDollarSign ? `$${dollars}` : dollars; - } - factory.isSectionActive = function(area) { - var current = factory.state.name; - var maps = { - 'my-numbers': [ - 'my-numbers', - 'my-numbers-edit', - ], - 'buy-numbers': [ - 'buy-numbers', - 'buy-numbers-select', - ], - 'buy-numbers': [ - 'buy-numbers', - 'buy-numbers-select', - ], - 'ports': [ - 'port-create', - 'port-edit', - ], - 'flows': [ - 'flows', - 'flow-editor' - ], - 'flows': [ - 'flows', - 'flow-editor' - ], - 'extensions': [ - 'extensions', - 'extension-create', - 'extension-edit' - ], - 'recordings': [ - 'recordings' - ], - 'faxes': [ - 'faxes' - ], - 'files': [ - 'files' - ], - 'settings-workspace-users': [ - 'settings-workspace-users', - 'settings-workspace-users-create', - 'settings-workspace-users-edit', - 'settings-workspace-users-assign', - ], - 'billing': [ - 'billing', - 'billing-add-card', - 'billing-upgrade-submit', - 'billing-upgrade-complete', - 'billing-upgrade-plan', - 'cancel-subscription' - ], - 'support': [ - 'support', - ], - - } - var item = maps[area]; - if ( item && item.includes( current ) ) { - return true; - } - } - factory.getDomain = function() { - return DEPLOYMENT_DOMAIN; - } - - - factory.getHomeLink = function() { - return "https://" + DEPLOYMENT_DOMAIN + "/"; - } - - factory.getAppPortalDomain = function(workspace, suffixOnly) { - suffixOnly = suffixOnly||true; - var domain = "app." + DEPLOYMENT_DOMAIN; - if ( workspace ) { - domain = workspace + ".app." + DEPLOYMENT_DOMAIN; - if ( suffixOnly ) { - domain = "app." + DEPLOYMENT_DOMAIN; - } + }; + factory.isSectionActive = function (area) { + var current = factory.state.name; + var maps = { + 'my-numbers': ['my-numbers', 'my-numbers-edit'], + 'buy-numbers': ['buy-numbers', 'buy-numbers-select'], + 'buy-numbers': ['buy-numbers', 'buy-numbers-select'], + ports: ['port-create', 'port-edit'], + flows: ['flows', 'flow-editor'], + flows: ['flows', 'flow-editor'], + extensions: ['extensions', 'extension-create', 'extension-edit'], + recordings: ['recordings'], + faxes: ['faxes'], + files: ['files'], + 'settings-workspace-users': [ + 'settings-workspace-users', + 'settings-workspace-users-create', + 'settings-workspace-users-edit', + 'settings-workspace-users-assign', + ], + billing: [ + 'billing', + 'billing-add-card', + 'billing-upgrade-submit', + 'billing-upgrade-complete', + 'billing-upgrade-plan', + 'cancel-subscription', + ], + support: ['support'], + }; + var item = maps[area]; + if (item && item.includes(current)) { + return true; + } + }; + factory.getDomain = function () { + return DEPLOYMENT_DOMAIN; + }; + + factory.getHomeLink = function () { + return 'https://' + DEPLOYMENT_DOMAIN + '/'; + }; + + factory.getAppPortalDomain = function (workspace, suffixOnly) { + suffixOnly = suffixOnly || true; + var domain = 'app.' + DEPLOYMENT_DOMAIN; + if (workspace) { + domain = workspace + '.app.' + DEPLOYMENT_DOMAIN; + if (suffixOnly) { + domain = 'app.' + DEPLOYMENT_DOMAIN; + } } return domain; - } - factory.getEditorResource = function(path) { - return getEditorPath() + "/" + path; - } - factory.createDomainLink = function(path) { - return factory.getHomeLink() + path; - } - factory.getAppLogo = function() { + }; + factory.getEditorResource = function (path) { + return getEditorPath() + '/' + path; + }; + factory.createDomainLink = function (path) { + return factory.getHomeLink() + path; + }; + factory.getAppLogo = function () { var logo = factory.customizations['app_logo']; - if ( !logo || logo === '' ) { - return '/images/new-logo-blue.png'; + if (!logo || logo === '') { + return '/images/new-logo-blue.png'; } - return getBaseUrl() + "/assets/img/" + logo; - } - factory.getAppIcon = function() { + return getBaseUrl() + '/assets/img/' + logo; + }; + factory.getAppIcon = function () { var icon = factory.customizations['app_icon']; - console.log('loading icon ', icon) + console.log('loading icon ', icon); - if ( !icon || icon === '' ) { - return '/images/logo-icon-white.png'; + if (!icon || icon === '') { + return '/images/logo-icon-white.png'; } - return getBaseUrl() + "/assets/img/" + icon; - } - factory.getAltAppLogo = function() { + return getBaseUrl() + '/assets/img/' + icon; + }; + factory.getAltAppLogo = function () { if (!factory.customizations) { - return ''; + return ''; } var logo = factory.customizations['alt_app_logo']; - if ( !logo || logo === '' ) { - return '/images/new-logo-blue.png'; + if (!logo || logo === '') { + return '/images/new-logo-blue.png'; } - return getBaseUrl() + "/assets/img/" + logo; - - } - factory.createCardLabel = function(card) { - return "**** **** **** " + card.last_4; - } - - factory.getCurrentTheme = function() { - var theme = localStorage.getItem("THEME"); - if ( !theme ) { - theme = "default"; + return getBaseUrl() + '/assets/img/' + logo; + }; + factory.createCardLabel = function (card) { + return '**** **** **** ' + card.last_4; + }; + + factory.getCurrentTheme = function () { + var theme = localStorage.getItem('THEME'); + if (!theme) { + theme = 'default'; } return theme; - } - factory.getCardImg = function(card) { - console.log("getCardImg ", card); - return '/images/cards/' + card.issuer + '.png' - } - factory.isInLoadingState = function() { - var check = factory.isLoading || factory.isCreateLoading; - console.log("checked loading: ", check); - return check; + }; + factory.getCardImg = function (card) { + console.log('getCardImg ', card); + return '/images/cards/' + card.issuer + '.png'; + }; + factory.isInLoadingState = function () { + var check = factory.isLoading || factory.isCreateLoading; + console.log('checked loading: ', check); + return check; + }; + factory.hasAuth = function () { + var token = localStorage.getItem('AUTH'); + return token; + }; + + factory.cancelForm = function () { + $window.history.back(); + }; + + factory.navigateDashboard = function () { + $state.go('dashboard', {}); + }; + factory.changeAdminWorkspace = function (workspace) { + console.log('changeAdminWorkspace ', workspace); + factory.setWorkspace(workspace); + $state.reload(); + }; + factory.changeAdminWorkspace2 = function (workspace) { + console.log('changeAdminWorkspace ', workspace); + factory.setWorkspace(workspace); + }; + + factory.getWorkspace = function () { + return getWorkspace(); + }; + + factory.isSettingEnabled = function (option) { + if (factory.planInfo) { + if (factory.planInfo[option]) { + return true; + } } - factory.hasAuth = function() { - var token = localStorage.getItem("AUTH"); - return token; + return false; + }; + factory.hasPermission = function (option) { + console.log('hasPermission', option); + if (factory.workspaceInfo) { + if (factory.workspaceInfo.user_info[option]) { + return true; + } } + return false; + }; + factory.planName = function (option) { + var workspace = getWorkspace(); + return workspace.plan; + }; - factory.cancelForm = function() { - $window.history.back(); + factory.deleteAllChecked = function (module, items) { + var checked = items.filter(function (item) { + return item.checked; + }); + console.log('checked items are ', checked); + if (checked.length === 0) { + factory.showMsg('Error', 'Please select one or more items to delete'); + return; } - factory.navigateDashboard = function(){ - $state.go('dashboard', {}); - } - factory.changeAdminWorkspace = function(workspace) { - console.log("changeAdminWorkspace ", workspace); - factory.setWorkspace( workspace ); - $state.reload(); - } - factory.changeAdminWorkspace2 = function(workspace) { - console.log("changeAdminWorkspace ", workspace); - factory.setWorkspace( workspace ); - } - - factory.getWorkspace = function() { - return getWorkspace(); - } - - factory.isSettingEnabled = function(option) { - - if ( factory.planInfo ) { - if ( factory.planInfo[ option ] ) { - return true; - } - } - return false; - } - factory.hasPermission = function(option) { - console.log("hasPermission", option); - if ( factory.workspaceInfo ) { - if ( factory.workspaceInfo.user_info[option] ) { - return true; - } - } - return false; - } - factory.planName = function(option) { - var workspace = getWorkspace(); - return workspace.plan; - } - - factory.deleteAllChecked = function(module, items) { - var checked = items.filter(function(item) { - return item.checked; - }); - console.log("checked items are ", checked); -if (checked.length === 0) { - factory.showMsg("Error", "Please select one or more items to delete"); - return; - } - - var confirm = $mdDialog.confirm() + var confirm = $mdDialog + .confirm() .title('Are you sure you want to delete all these items?') .ariaLabel('Confirm') .ok('Yes') .cancel('No'); - $mdDialog.show(confirm).then(function() { - factory.isLoading = true; - var data = { - "module": module, - "items": checked - }; - Backend.post("/deleteAll", data).then(function() { - console.log("deleted successfully.."); - }) + $mdDialog.show(confirm).then(function () { + factory.isLoading = true; + var data = { + module: module, + items: checked, + }; + Backend.post('/deleteAll', data).then(function () { + console.log('deleted successfully..'); + }); }); - } - - factory.cleanWorkspaceName = function(name) { -var changed = name.toLowerCase(); -changed = changed.replace(/[^a-z0-9\-]/g, ""); -return changed; -} - factory.querySearch = function(query) { - console.log("querySearch query is: " + query); - return $q(function(resolve, reject) { - var regexp = new RegExp(".*" + query.toLowerCase() + ".*"); - var results = []; - angular.forEach(modules, function(module) { - - console.log("searching on " + module.display + " agaisnt " + query); - var hasPerms = true; - - - var perms = module.perms; - console.log("checking perms ", perms); - angular.forEach(perms, function(perm) { - if (!factory.hasPermission(perm)) { - hasPerms = false; - } - }); - if (!hasPerms) { - return; - } - - //check for setting - var setting = module.setting; - if (setting !== null && !factory.isSettingEnabled(setting)) { - return false; - } - var matched = module.display.toLowerCase().match( regexp ); - if ( matched ) { - results.push(module); - } + }; + factory.refreshPage = function () { + factory.isLoading = true; + $state.reload(); + factory.isLoading = false; + }; + + factory.isListViewPages = function () { + var name = $state.current.name || $state.name || ''; + return ['calls', 'debugger-logs', 'extensions'].some((sub) => name.includes(sub)); + }; + + factory.waitUntilLoaded = function () { + return new Promise((resolve) => { + if (factory.customizations) { + return resolve(); + } + const startTime = Date.now(); + const checkInterval = setInterval(() => { + if (factory.customizations) { + clearInterval(checkInterval); + resolve(); + } else if (Date.now() - startTime > 15000) { + clearInterval(checkInterval); + resolve(); + } + }, 100); + }); + } + factory.cleanWorkspaceName = function (name) { + var changed = name.toLowerCase(); + changed = changed.replace(/[^a-z0-9\-]/g, ''); + return changed; + }; + factory.querySearch = function (query) { + console.log('querySearch query is: ' + query); + return $q(function (resolve, reject) { + var regexp = new RegExp('.*' + query.toLowerCase() + '.*'); + var results = []; + angular.forEach(modules, function (module) { + console.log('searching on ' + module.display + ' agaisnt ' + query); + var hasPerms = true; + + var perms = module.perms; + console.log('checking perms ', perms); + angular.forEach(perms, function (perm) { + if (!factory.hasPermission(perm)) { + hasPerms = false; + } }); - //tag search - angular.forEach(modules, function(module) { - if (results.indexOf(module)>-1) { - return; - } + if (!hasPerms) { + return; + } - var hasPerms = true; + //check for setting + var setting = module.setting; + if (setting !== null && !factory.isSettingEnabled(setting)) { + return false; + } + var matched = module.display.toLowerCase().match(regexp); + if (matched) { + results.push(module); + } + }); + //tag search + angular.forEach(modules, function (module) { + if (results.indexOf(module) > -1) { + return; + } + var hasPerms = true; - var perms = module.perms; - console.log("checking perms ", perms); - angular.forEach(perms, function(perm) { - if (!factory.hasPermission(perm)) { - hasPerms = false; - } - }); - if (!hasPerms) { - return; - } + var perms = module.perms; + console.log('checking perms ', perms); + angular.forEach(perms, function (perm) { + if (!factory.hasPermission(perm)) { + hasPerms = false; + } + }); + if (!hasPerms) { + return; + } - //check for setting - var setting = module.setting; - if (setting !== null && !factory.isSettingEnabled(setting)) { - return false; - } - angular.forEach(module.tags, function(tag) { - console.log("searching on " + tag + " agaisnt " + query); - var matched = tag.toLowerCase().match( regexp ); - if ( matched ) { - results.push(module); - } - }); + //check for setting + var setting = module.setting; + if (setting !== null && !factory.isSettingEnabled(setting)) { + return false; + } + angular.forEach(module.tags, function (tag) { + console.log('searching on ' + tag + ' agaisnt ' + query); + var matched = tag.toLowerCase().match(regexp); + if (matched) { + results.push(module); + } }); + }); - return resolve(results); + return resolve(results); }); - } - factory.searchTextChange = function(text) { - console.log("searchTextChange"); - } - factory.selectedItemChange = function(item) { - console.log('Item changed to ' + JSON.stringify(item)); - if (item && item.ui_identifier) $state.go(item.ui_identifier, {}); - } - - factory.showToast = function(msg, position, delayMs) { - delayMs = delayMs||3000; - var position = position || "top right"; - $mdToast.show( - $mdToast.simple() - .textContent(msg) - .position(position) - .hideDelay(delayMs) - ); - } - - - - factory.endIsLoading = function() { - return $q(function(resolve, reject) { - $timeout(function() { + }; + factory.searchTextChange = function (text) { + console.log('searchTextChange'); + }; + factory.selectedItemChange = function (item) { + console.log('Item changed to ' + JSON.stringify(item)); + if (item && item.ui_identifier) $state.go(item.ui_identifier, {}); + }; + + factory.showToast = function (msg, position, delayMs) { + delayMs = delayMs || 3000; + var position = position || 'top right'; + $mdToast.show($mdToast.simple().textContent(msg).position(position).hideDelay(delayMs)); + }; + + factory.endIsLoading = function () { + return $q(function (resolve, reject) { + $timeout(function () { factory.isLoading = false; resolve(); - }, flickerTimeout); - }); - } - factory.endIsCreateLoading = function() { - return $q(function(resolve, reject) { - $timeout(function() { + }, flickerTimeout); + }); + }; + factory.endIsCreateLoading = function () { + return $q(function (resolve, reject) { + $timeout(function () { factory.isCreateLoading = false; resolve(); - }, flickerTimeout); - }); - } - factory.nullIfEmpty = function(value) { - if ( !value || value === "" ) { - return null; - } - return value; - } - factory.scrollToTop = function() { - $window.scrollTo(0, 0); - } - factory.completeChangeRoute = function(route, params, other) { - $state.go(route, params, other); - $timeout(function() { - var scope = angular.element(document.getElementById('scopeCtrl')).scope(); - scope.$apply() - }, 0); - - } - factory.changeRoute = function(route, params, force, createLoad) { - console.log("changeRoute called ", arguments); - force = force || false; - createLoad = createLoad || false; - var params = params || {}; - var except = ['flow-editor']; - if ((factory.state && factory.state.name === route) && !force) { - return; - } - if ( factory.state.name === 'flow-editor' ) { - var flowEditorFrame = document.getElementById('flowEditorFrame'); - factory.isLoading = false; - - // check if all changes are saved before exiting - if ( flowEditorFrame ) { - flowEditorFrame.contentWindow.postMessage('check', '*'); - factory.pendingRouteData = { - route: route, - params: params - }; - return; - } - } - - if (!except.includes(route)) { - if ( createLoad ) { - factory.isCreateLoading = true; - } else { - factory.isLoading = true; + }, flickerTimeout); + }); + }; + factory.nullIfEmpty = function (value) { + if (!value || value === '') { + return null; + } + return value; + }; + factory.scrollToTop = function () { + $window.scrollTo(0, 0); + }; + factory.completeChangeRoute = function (route, params, other) { + $state.go(route, params, other); + $timeout(function () { + var scope = angular.element(document.getElementById('scopeCtrl')).scope(); + scope.$apply(); + }, 0); + }; + factory.changeRoute = function (route, params, force, createLoad) { + console.log('changeRoute called ', arguments); + force = force || false; + createLoad = createLoad || false; + var params = params || {}; + var except = ['flow-editor']; + if (factory.state && factory.state.name === route && !force) { + return; + } + if (factory.state.name === 'flow-editor') { + var flowEditorFrame = document.getElementById('flowEditorFrame'); + factory.isLoading = false; + + // check if all changes are saved before exiting + if (flowEditorFrame) { + flowEditorFrame.contentWindow.postMessage('check', '*'); + factory.pendingRouteData = { + route: route, + params: params, + }; + return; } - } - factory.completeChangeRoute(route, params, {"reload": false}); - } - factory.collapseNavbar = function() { - factory.SHOW_NAVBAR = false; - factory.PAGE_CONTENT_NO_PADDING = true; - factory.COLLAPSED_MODE = false; - $( '.c-hamburger' ).removeClass('is-active'); - $('body').removeClass('extended'); - } - factory.collapseNavbarPadding = function() { - factory.SHOW_NAVBAR = true; - factory.PAGE_CONTENT_NO_PADDING = false; - factory.COLLAPSED_MODE = true; - $( '.c-hamburger' ).removeClass('is-active'); - $('body').removeClass('extended'); } - factory.processResult = function() { - var params = $location.search(); - if (params['result'] && params['result'] === 'email-verified') { - $mdToast.show( - $mdToast.simple() - .textContent('Email was verified') - .position("top right") - .hideDelay(3000) - ); - } - } - factory.showNavbar = function() { - factory.SHOW_NAVBAR = true; - factory.PAGE_CONTENT_NO_PADDING = false; - factory.COLLAPSED_MODE = false; - $( '.c-hamburger' ).addClass('is-active'); - $('body').addClass('extended'); - } - factory.doLogout = function() { - factory.purgeSession(); - var theme = $window.localStorage.THEME; - localStorage.clear(); - $window.localStorage.setItem('THEME', theme); - ThemeService.addStyle("styles/app-blue.css"); - $state.go('login', {}); - } - factory.setAuthToken = function(token) { - localStorage.setItem("AUTH", JSON.stringify(token)); - } - factory.setAdminAuthToken = function(token) { - localStorage.setItem("ADMIN_TOKEN", token); - } - factory.getAuthToken = function() { - return JSON.parse(localStorage.getItem("AUTH")); - } - factory.setWorkspace= function(workspace) { - localStorage.setItem("WORKSPACE", JSON.stringify(workspace)); - } - factory.getWorkspace = function(workspace) { - return JSON.parse(localStorage.getItem("WORKSPACE")); - } - factory.purgeSession = function() { - localStorage.removeItem("WORKSPACE"); - localStorage.removeItem("AUTH"); - localStorage.removeItem("ADMIN_TOKEN"); - } - factory.canPerformAction = function(action) { - var workspace = factory.getWorkspace(); - if (workspace && workspace.user_info && workspace.user_info[action]) { - return true; - } - return false; - } - factory.has = function() { - return JSON.parse(localStorage.getItem("WORKSPACE")); - } - factory.showMsg = function(title, msg) { - factory.changingPage = false; - factory.endIsCreateLoading(); - factory.endIsLoading(); - return $mdDialog.show( - $mdDialog.alert() - .parent(angular.element(document.querySelector('#popupContainer'))) - .clickOutsideToClose(true) - .title(title) - .textContent(msg) - .ariaLabel(title) - .ok('Ok') - ); - - } - - - factory.showError = function(title, msg) { - factory.changingPage = false; - factory.endIsCreateLoading(); - factory.endIsLoading(); - $mdDialog.show( - $mdDialog.alert() - .parent(angular.element(document.querySelector('#popupContainer'))) - .clickOutsideToClose(true) - .title(title) - .textContent(msg) - .ariaLabel(title) - .ok('Ok') - ); - - } - factory.updateTitle = function(text) { - factory.title = baseTitle; - if (text) { - factory.title = baseTitle + " - " + text; - } - } - factory.scrollTop = function() { - $window.scrollTo(0, 0); + if (!except.includes(route)) { + if (createLoad) { + factory.isCreateLoading = true; + } else { + factory.isLoading = true; + } } - factory.makeDefaultWorkspaceRoles = function(addInfo) { - if (!addInfo) { - return { - 'manage_users' : false, - 'manage_extensions' : false, - 'create_extension' : false, - 'manage_billing' : false, - 'manage_workspace' : false, - 'manage_dids' : false, - 'create_did' : false, - 'manage_calls' : false, - 'manage_recordings' : false, - 'manage_blocked_numbers' : false, - 'manage_ip_whitelist' : false, - 'manage_verified_caller_ids' : false, - 'create_flow' : false, - 'manage_flows' : false - }; - } - var info = []; - info.push({ - "id": "manage_users", - "name": "Manage Users", - "info": "Allow this user to create, read, update or delete other users in your workspace" - }); - info.push({ - "id": "manage_extensions", - "name": "Manage Extensions", - "info": "Allow this user to create, read, update or delete other extensions in your workspace" - }); - info.push({ - "id": "create_extension", - "name": "Create Extension", - "info": "Allow this user to create an extension" - }); - info.push({ - "id": "manage_billing", - "name": "Manage Billing", - "info": "Allow this user to manage used credit cards, payment options, usage limits and advanced billing settings" - }); - info.push({ - "id": "manage_workspace", - "name": "Manage Workspace", - "info": "Allow this user to manage workspace settings" - }); - info.push({ - "id": "manage_dids", - "name": "Manage DIDs", - "info": "Allow this user to buy and manage DIDs" - }); - info.push({ - "id": "create_did", - "name": "Create DID", - "info": "Allow this user to buy a DID" - }); - info.push({ - "id": "manage_calls", - "name": "Manage Calls", - "info": "Allow this user to manage calls" - }); - info.push({ - "id": "manage_recordings", - "name": "Manage Recordings", - "info": "Allow this user to manage recordings" - }); - info.push({ - "id": "manage_blocked_numbers", - "name": "Manage Blocked Numbers", - "info": "Allow this user to manage blocked numbers" - }); - info.push({ - "id": "manage_ip_whitelist", - "name": "Manage IP Whitelist", - "info": "Allow this user to manage IP whitelist" - }); - info.push({ - "id": "manage_verified_caller_ids", - "name": "Manage Verified Caller IDs", - "info": "Allow this user to manage verified caller ids" - }); - info.push({ - "id": "manage_flows", - "name": "Manage Flows", - "info": "Allow this user to manage flows" - }); - info.push({ - "id": "create_flow", - "name": "Create Flow", - "info": "Allow this user to create flows" - }); - - - - - - - - - - - + factory.completeChangeRoute(route, params, { reload: false }); + }; + factory.collapseNavbar = function () { + factory.SHOW_NAVBAR = false; + factory.PAGE_CONTENT_NO_PADDING = true; + factory.COLLAPSED_MODE = false; + $('.c-hamburger').removeClass('is-active'); + $('body').removeClass('extended'); + }; + factory.collapseNavbarPadding = function () { + factory.SHOW_NAVBAR = true; + factory.PAGE_CONTENT_NO_PADDING = false; + factory.COLLAPSED_MODE = true; + $('.c-hamburger').removeClass('is-active'); + $('body').removeClass('extended'); + }; + + factory.processResult = function () { + var params = $location.search(); + if (params['result'] && params['result'] === 'email-verified') { + $mdToast.show( + $mdToast + .simple() + .textContent('Email was verified') + .position('top right') + .hideDelay(3000) + ); + } + }; + factory.showNavbar = function () { + factory.SHOW_NAVBAR = true; + factory.PAGE_CONTENT_NO_PADDING = false; + factory.COLLAPSED_MODE = false; + $('.c-hamburger').addClass('is-active'); + $('body').addClass('extended'); + }; + factory.doLogout = function () { + factory.purgeSession(); + var theme = $window.localStorage.THEME; + localStorage.clear(); + $window.localStorage.setItem('THEME', theme); + ThemeService.addStyle('styles/app-blue.css'); + $state.go('login', {}); + }; + factory.setAuthToken = function (token) { + localStorage.setItem('AUTH', JSON.stringify(token)); + }; + factory.setAdminAuthToken = function (token) { + localStorage.setItem('ADMIN_TOKEN', token); + }; + factory.getAuthToken = function () { + return JSON.parse(localStorage.getItem('AUTH')); + }; + factory.setWorkspace = function (workspace) { + localStorage.setItem('WORKSPACE', JSON.stringify(workspace)); + }; + factory.getWorkspace = function (workspace) { + return JSON.parse(localStorage.getItem('WORKSPACE')); + }; + factory.purgeSession = function () { + localStorage.removeItem('WORKSPACE'); + localStorage.removeItem('AUTH'); + localStorage.removeItem('ADMIN_TOKEN'); + }; + factory.canPerformAction = function (action) { + var workspace = factory.getWorkspace(); + if (workspace && workspace.user_info && workspace.user_info[action]) { + return true; + } + return false; + }; + factory.has = function () { + return JSON.parse(localStorage.getItem('WORKSPACE')); + }; + factory.showMsg = function (title, msg) { + factory.changingPage = false; + factory.endIsCreateLoading(); + factory.endIsLoading(); + return $mdDialog.show( + $mdDialog + .alert() + .parent(angular.element(document.querySelector('#popupContainer'))) + .clickOutsideToClose(true) + .title(title) + .textContent(msg) + .ariaLabel(title) + .ok('Ok') + ); + }; + + factory.showError = function (title, msg) { + factory.changingPage = false; + factory.endIsCreateLoading(); + factory.endIsLoading(); + $mdDialog.show( + $mdDialog + .alert() + .parent(angular.element(document.querySelector('#popupContainer'))) + .clickOutsideToClose(true) + .title(title) + .textContent(msg) + .ariaLabel(title) + .ok('Ok') + ); + }; + factory.updateTitle = function (text) { + factory.title = baseTitle; + if (text) { + factory.title = baseTitle + ' - ' + text; + } + }; + factory.scrollTop = function () { + $window.scrollTo(0, 0); + }; + factory.makeDefaultWorkspaceRoles = function (addInfo) { + if (!addInfo) { + return { + manage_users: false, + manage_extensions: false, + create_extension: false, + manage_billing: false, + manage_workspace: false, + manage_dids: false, + create_did: false, + manage_calls: false, + manage_recordings: false, + manage_blocked_numbers: false, + manage_ip_whitelist: false, + manage_verified_caller_ids: false, + create_flow: false, + manage_flows: false, + }; + } + var info = []; + info.push({ + id: 'manage_users', + name: 'Manage Users', + info: 'Allow this user to create, read, update or delete other users in your workspace', + }); + info.push({ + id: 'manage_extensions', + name: 'Manage Extensions', + info: 'Allow this user to create, read, update or delete other extensions in your workspace', + }); + info.push({ + id: 'create_extension', + name: 'Create Extension', + info: 'Allow this user to create an extension', + }); + info.push({ + id: 'manage_billing', + name: 'Manage Billing', + info: 'Allow this user to manage used credit cards, payment options, usage limits and advanced billing settings', + }); + info.push({ + id: 'manage_workspace', + name: 'Manage Workspace', + info: 'Allow this user to manage workspace settings', + }); + info.push({ + id: 'manage_dids', + name: 'Manage DIDs', + info: 'Allow this user to buy and manage DIDs', + }); + info.push({ + id: 'create_did', + name: 'Create DID', + info: 'Allow this user to buy a DID', + }); + info.push({ + id: 'manage_calls', + name: 'Manage Calls', + info: 'Allow this user to manage calls', + }); + info.push({ + id: 'manage_recordings', + name: 'Manage Recordings', + info: 'Allow this user to manage recordings', + }); + info.push({ + id: 'manage_blocked_numbers', + name: 'Manage Blocked Numbers', + info: 'Allow this user to manage blocked numbers', + }); + info.push({ + id: 'manage_ip_whitelist', + name: 'Manage IP Whitelist', + info: 'Allow this user to manage IP whitelist', + }); + info.push({ + id: 'manage_verified_caller_ids', + name: 'Manage Verified Caller IDs', + info: 'Allow this user to manage verified caller ids', + }); + info.push({ + id: 'manage_flows', + name: 'Manage Flows', + info: 'Allow this user to manage flows', + }); + info.push({ + id: 'create_flow', + name: 'Create Flow', + info: 'Allow this user to create flows', + }); - return info; - } - return factory; - }) - .factory("Backend", function($http, $q, $shared, $mdDialog, $state, $timeout, ThemeService) { - var factory = this; - factory.queued = []; - var skip = ['login', 'register', 'forgot', 'reset']; - - function pushToQueue(item) { - $shared.tempStopErrors = true; - //factory.queued.push( item ); - } - function errorHandler(res, codeId, showMsg) { - var error = null; - if ( res.data ) { - error = res.data.message||null; - } - console.log("erroHandler ", arguments); - /* + return info; + }; + return factory; + } + ) + .factory('Backend', function ($http, $q, $shared, $mdDialog, $state, $timeout, ThemeService) { + var factory = this; + factory.queued = []; + var skip = ['login', 'register', 'forgot', 'reset']; + + function pushToQueue(item) { + $shared.tempStopErrors = true; + //factory.queued.push( item ); + } + function errorHandler(res, codeId, showMsg) { + var error = null; + if (res.data) { + error = res.data.message || null; + } + console.log('erroHandler ', arguments); + /* if ( $shared.tempStopErrors ) { $q.all( factory.queued ).then(function() { $shared.tempStopErrors = false; @@ -900,415 +949,421 @@ return changed; return; } */ - $shared.endIsLoading(); - $shared.endIsCreateLoading(); - if ( showMsg ) { - error = error || "An error occured."; - $shared.showError(error); - return; - } - var message = "An error occured."; - if ( codeId !== null) { - message += " Error Code ID: " + codeId; - } - - $shared.showError(message); + $shared.endIsLoading(); + $shared.endIsCreateLoading(); + if (showMsg) { + error = error || 'An error occured.'; + $shared.showError(error); + return; + } + var message = 'An error occured.'; + if (codeId !== null) { + message += ' Error Code ID: ' + codeId; + } - } + $shared.showError(message); + } - factory.applyTheme = function(theme) { - theme = theme||ThemeService.getTheme(); - const themes = { - default: 'styles/app-blue.css', - dark: 'styles/app-grey.css' - } + factory.applyTheme = function (theme) { + theme = theme || ThemeService.getTheme(); + const themes = { + default: 'styles/app-blue.css', + dark: 'styles/app-grey.css', + }; - if (theme !== ThemeService.getTheme()) { - ThemeService.setTheme(theme); - } - ThemeService.addStyle(themes[theme]); - //ThemeService.removeStyle(themes[theme]); - if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { - ThemeService.setTheme('dark'); - }else{ - ThemeService.setTheme('default'); - } + if (theme !== ThemeService.getTheme()) { + ThemeService.setTheme(theme); } + ThemeService.addStyle(themes[theme]); + //ThemeService.removeStyle(themes[theme]); + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + ThemeService.setTheme('dark'); + } else { + ThemeService.setTheme('default'); + } + }; - factory.refreshWorkspaceData = function() { - return $q(function(resolve, reject) { - factory.get("/dashboard").then(function(res) { - var graph = res.data[0]; - console.log("GOT state data ", res); - $shared.billInfo= res.data[1]; - $shared.userInfo= res.data[2]; - factory.applyTheme($shared.userInfo.theme); - $shared.planInfo= res.data[4]; - // $shared.planInfo.rank = 3; - $shared.workspaceInfo= res.data[5]; - console.log("updated UI state"); - resolve(res); - }, function(err) { - reject(err); - }); + factory.refreshWorkspaceData = function () { + return $q(function (resolve, reject) { + factory.get('/dashboard').then( + function (res) { + var graph = res.data[0]; + console.log('GOT state data ', res); + $shared.billInfo = res.data[1]; + $shared.userInfo = res.data[2]; + factory.applyTheme($shared.userInfo.theme); + $shared.planInfo = res.data[4]; + // $shared.planInfo.rank = 3; + $shared.workspaceInfo = res.data[5]; + console.log('updated UI state'); + resolve(res); + }, + function (err) { + reject(err); + } + ); + }); + }; + factory.selectAll = function (selectedAll, tag, options) { + console.log('selectAll', selectedAll); + angular.forEach(options, function (option) { + option.checked = selectedAll; + }); + }; + factory.deleteAllChecked = function (module, items) { + var checked = items.filter(function (item) { + return item.checked; + }); + console.log('checked items are ', checked); + if (checked.length === 0) { + $shared.showMsg('Error', 'Please select one or more items to delete'); + return; + } + var confirm = $mdDialog + .confirm() + .title('Are you sure you want to delete all these items?') + .ariaLabel('Confirm') + .ok('Yes') + .cancel('No'); + $mdDialog.show(confirm).then(function () { + $shared.isLoading = true; + var data = { + module: module, + items: checked, + }; + factory.post('/deleteAll', data).then(function () { + console.log('deleted successfully..'); + $shared.isLoading = false; + $state.reload(); }); - } - factory.selectAll = function(selectedAll, tag, options) { - console.log("selectAll", selectedAll); - angular.forEach(options, function(option) { - option.checked = selectedAll; - }); + }); + }; + factory.waitForQueuedReqs = function () { + return $q(function (resolve, reject) { + $q.all(factory.queued).then(function () { + resolve(); + }); + }); + }; + factory.getJWTToken = function (email, password) { + var params = { + email: email, + password: password, + }; + return $q(function (resolve, reject) { + $http + .post(createUrl('/jwt/authenticate'), params) + .then(function (res) { + localStorage.setItem('AUTH', JSON.stringify(res.data.jwt)); + localStorage.setItem('WORKSPACE', JSON.stringify(res.data.workspace)); + resolve(); + }) + .catch(function (err) { + reject(err); + }); + }); + }; + function checkHttpCallPrerequisites() { + var auth = $shared.hasAuth(); + if (!auth) { + $shared.tempStopErrors = true; + var path = document.location.href.split('/'); + + if (isAlreadyDoingNextRedirect()) { + return; + } + var next = path.slice(4, path.length).join('/'); + //var next = $state.current.name; + console.log('next URL is: ', next); + console.log('current state is ', $state.current); + localStorage.clear(); + window.location.replace('/#/login?next=' + next); + //$state.go('login'); + return false; + } + return true; + } + factory.get = function (path, params, showMsg) { + var item = $q(function (resolve, reject) { + if (!skip.includes($state.current.name) && $state.current_name) { + if (!checkHttpCallPrerequisites()) { + resolve(); + return; + } } - factory.deleteAllChecked = function(module, items) { - var checked = items.filter(function(item) { - return item.checked; - }); - console.log("checked items are ", checked); -if (checked.length === 0) { - $shared.showMsg("Error", "Please select one or more items to delete"); - return; - } - var confirm = $mdDialog.confirm() - .title('Are you sure you want to delete all these items?') - .ariaLabel('Confirm') - .ok('Yes') - .cancel('No'); - $mdDialog.show(confirm).then(function() { - $shared.isLoading = true; - var data = { - "module": module, - "items": checked - }; - factory.post("/deleteAll", data).then(function() { - console.log("deleted successfully.."); - $shared.isLoading = false; - $state.reload(); - }) + $http.get(createUrl(path), params).then(resolve, function (res) { + console.log('received reply ', res); + errorHandler(res, res.headers('X-ErrorCode-ID'), showMsg); + reject(res); }); - } + }); + pushToQueue(item); + return item; + }; + factory.getPagination = function (path, params) { + path = path + '?page=' + pagination.getCurrentPage(); + return factory.get(path, params); + }; - factory.waitForQueuedReqs = function() { - return $q(function(resolve, reject) { - $q.all( factory.queued ).then(function() { - resolve(); - }); - }); - } - factory.getJWTToken = function(email, password) { - var params = { - email: email, - password: password - }; - return $q(function(resolve, reject) { - $http.post( createUrl( "/jwt/authenticate"), params).then( function(res) { - localStorage.setItem("AUTH", JSON.stringify(res.data.jwt)); - localStorage.setItem("WORKSPACE", JSON.stringify(res.data.workspace)); - resolve(); - }).catch(function(err) { - reject( err ); - }); - }); + factory.delete = function (path, showMsg) { + var item = $q(function (resolve, reject) { + if (!skip.includes($state.current.name)) { + if (!checkHttpCallPrerequisites()) { + resolve(); + return; + } } - function checkHttpCallPrerequisites() { - var auth = $shared.hasAuth(); - if ( !auth ) { - $shared.tempStopErrors = true; - var path = document.location.href.split("/"); + $http.delete(createUrl(path)).then(resolve, function (res) { + errorHandler(res, res.headers('X-ErrorCode-ID'), showMsg); - if (isAlreadyDoingNextRedirect()) { - return; - } - var next = path.slice(4, path.length).join("/"); - //var next = $state.current.name; - console.log("next URL is: ", next); - console.log("current state is ", $state.current); - localStorage.clear(); - window.location.replace("/#/login?next=" + next); - //$state.go('login'); - return false; - } - return true; - } - factory.get = function(path, params, showMsg) - { - var item = $q(function(resolve, reject) { - if (!skip.includes($state.current.name) && $state.current_name) { - if ( !checkHttpCallPrerequisites() ) { - resolve(); - return; - } - - } - $http.get(createUrl(path), params).then(resolve,function(res) { - console.log('received reply ', res); - errorHandler(res, res.headers('X-ErrorCode-ID'), showMsg); - reject(res); - }); - }); - pushToQueue( item ); - return item; - } - - factory.getPagination = function(path, params) - { - path = path + "?page=" + pagination.getCurrentPage(); - return factory.get(path, params); + reject(res); + }); + }); + pushToQueue(item); + return item; + }; + factory.post = function (path, params, suppressErrDialog, showMsg) { + var item = $q(function (resolve, reject) { + console.log('factory.post current state is: ', $state.current.name); + if (!skip.includes($state.current.name)) { + if (!checkHttpCallPrerequisites()) { + resolve(); + return; + } } - factory.delete = function(path, showMsg) - { - var item = $q(function(resolve, reject) { - if (!skip.includes($state.current.name)) { - if ( !checkHttpCallPrerequisites() ) { - resolve(); - return; - } - } - - - $http.delete(createUrl(path)).then(resolve,function(res) { - errorHandler(res, res.headers('X-ErrorCode-ID'), showMsg); - - reject(res); - }); - }); - pushToQueue(item); - return item; + $http.post(createUrl(path), params).then(resolve, function (res) { + if (!suppressErrDialog) { + errorHandler(res, res.headers('X-ErrorCode-ID'), showMsg); + } + reject(res); + }); + }); + pushToQueue(item); + return item; + }; + factory.postCouldError = function (path, params) { + $shared.tempStopErrors = false; + return factory.post(path, params, false, true); + }; - } - factory.post = function(path, params, suppressErrDialog, showMsg) - { - var item = $q(function(resolve, reject) { - console.log("factory.post current state is: ", $state.current.name); - if (!skip.includes($state.current.name)) { - if ( !checkHttpCallPrerequisites() ) { - - resolve(); - return; - } - } - - - $http.post(createUrl(path), params).then(resolve,function(res) { - if (!suppressErrDialog) { - errorHandler(res, res.headers('X-ErrorCode-ID'), showMsg); - - } - reject(res); - }); - }); - pushToQueue( item ); - return item; - } - factory.postCouldError = function(path, params) - { - $shared.tempStopErrors = false; - return factory.post(path, params, false, true); + factory.postFiles = function (url, data, showMsg) { + var item = $q(function (resolve, reject) { + if (!skip.includes($state.current.name)) { + if (!checkHttpCallPrerequisites()) { + resolve(); + return; + } } - factory.postFiles = function(url, data, showMsg) { - var item =$q(function(resolve, reject) { - if (!skip.includes($state.current.name)) { - if ( !checkHttpCallPrerequisites() ) { - resolve(); - return; - } - } - - - $http({ - - url: createUrl(url), - method: "POST", - data: data, - headers: {'Content-Type': undefined} - }).then(resolve, function(res) { - console.log("postFiles result ", res); - errorHandler(res, res.headers('X-ErrorCode-ID'), showMsg); - reject( res ); - }); - }); - pushToQueue( item ); - return item; - } - factory.put = function(path, params, suppressErrDialog, showMsg) - { - var item = $q(function(resolve, reject) { - console.log("factory.post current state is: ", $state.current.name); - if (!skip.includes($state.current.name)) { - if ( !checkHttpCallPrerequisites() ) { - - resolve(); - return; - } - } - - - $http.put(createUrl(path), params).then(resolve,function(res) { - if (!suppressErrDialog) { - errorHandler(res, res.headers('X-ErrorCode-ID'), showMsg); - - } - reject(res); - }); - }); - pushToQueue( item ); - return item; + $http({ + url: createUrl(url), + method: 'POST', + data: data, + headers: { 'Content-Type': undefined }, + }).then(resolve, function (res) { + console.log('postFiles result ', res); + errorHandler(res, res.headers('X-ErrorCode-ID'), showMsg); + reject(res); + }); + }); + pushToQueue(item); + return item; + }; + factory.put = function (path, params, suppressErrDialog, showMsg) { + var item = $q(function (resolve, reject) { + console.log('factory.post current state is: ', $state.current.name); + if (!skip.includes($state.current.name)) { + if (!checkHttpCallPrerequisites()) { + resolve(); + return; + } } + $http.put(createUrl(path), params).then(resolve, function (res) { + if (!suppressErrDialog) { + errorHandler(res, res.headers('X-ErrorCode-ID'), showMsg); + } + reject(res); + }); + }); + pushToQueue(item); + return item; + }; - return factory; - }) - .factory("pagination", function(Backend,$shared, $q, $timeout, $location, $stateParams) { - var factory = this; - factory.settings = { - search: "", - args: { - - }, - currentPage: 1, - currentUrl: "", - scope: { obj: null, key: '' } - }; - factory.didSearch = false; - factory.meta = {}; // saved by backend - var searchTimer = null; - factory.getCurrentPage = function() { - return parseInt($stateParams['page']); - } - factory.clearSearch = function() { - $shared.changeRoute('.', {'page': 1, 'search': ''}, true /** force */, true); - } - factory.shouldShowClear = function() { - var result = false; - if ( factory.settings.search === "" ) { - result = false; - } else { - result = true; - } - console.log("result ", result); - return result; - } - factory.nextPage = function() { - var page = factory.getCurrentPage() + 1; - $shared.changeRoute('.', {'page': page,"search": $stateParams['search']}, true /** force */, true); - } - factory.prevPage = function() { - var page = factory.getCurrentPage() - 1; - $shared.changeRoute('.', {'page': page, "search": $stateParams['search']}, true /** force */, true); - } - factory.hasNext = function() { - var current = factory.getCurrentPage(); - if (factory.meta && factory.meta.pagination && (current === factory.meta.pagination.total_pages || factory.meta.pagination.total_pages === 0)) { - return false; - } - return true; - } - factory.hasPrev = function() { - var current = factory.getCurrentPage(); - if (current === 1) { - return false; - } - return true; - } - + return factory; + }) + .factory('pagination', function (Backend, $shared, $q, $timeout, $location, $stateParams) { + var factory = this; + factory.settings = { + search: '', + args: {}, + currentPage: 1, + currentUrl: '', + scope: { obj: null, key: '' }, + }; + factory.didSearch = false; + factory.meta = {}; // saved by backend + var searchTimer = null; + factory.getCurrentPage = function () { + return parseInt($stateParams['page']); + }; + factory.clearSearch = function () { + $shared.changeRoute('.', { page: 1, search: '' }, true /** force */, true); + }; + factory.shouldShowClear = function () { + var result = false; + if (factory.settings.search === '') { + result = false; + } else { + result = true; + } + console.log('result ', result); + return result; + }; + factory.nextPage = function () { + var page = factory.getCurrentPage() + 1; + $shared.changeRoute( + '.', + { page: page, search: $stateParams['search'] }, + true /** force */, + true + ); + }; + factory.prevPage = function () { + var page = factory.getCurrentPage() - 1; + $shared.changeRoute( + '.', + { page: page, search: $stateParams['search'] }, + true /** force */, + true + ); + }; + factory.hasNext = function () { + var current = factory.getCurrentPage(); + if ( + factory.meta && + factory.meta.pagination && + (current === factory.meta.pagination.total_pages || + factory.meta.pagination.total_pages === 0) + ) { + return false; + } + return true; + }; + factory.hasPrev = function () { + var current = factory.getCurrentPage(); + if (current === 1) { + return false; + } + return true; + }; + // NOT USED + factory.changePage = function (page) { + factory.settings.search = $stateParams['search'] || ''; + factory.settings.currentPage = page; + }; + factory.changeUrl = function (url) { + factory.settings.currentUrl = url; + }; + factory.changeScope = function (obj, key) { + factory.settings.scope = { + obj: obj, + key: key, + }; + }; + factory.loadData = function (params) { + params = params || {}; + var url = factory.settings.currentUrl; + params['?page'] = factory.getCurrentPage(); - // NOT USED - factory.changePage = function( page ) { - factory.settings.search = $stateParams['search']||''; - factory.settings.currentPage = page; - } - factory.changeUrl = function( url ) { - factory.settings.currentUrl = url; - } - factory.changeScope = function( obj, key ) { - factory.settings.scope = { - obj: obj, - key: key - } + if (factory.settings.search !== '') { + params['search'] = encodeURIComponent(factory.settings.search); + } + for (var index in factory.settings.args) { + var arg = factory.settings.args[index]; + if (arg !== '' && arg) { + //url += "&" + index + "=" + encodeURIComponent(arg); + params[index] = encodeURIComponent(arg); } - factory.loadData = function(params) { - params = params || {}; - var url = factory.settings.currentUrl; - params['?page'] = factory.getCurrentPage(); - - if (factory.settings.search !== "") { - params['search'] = encodeURIComponent(factory.settings.search); - } - for ( var index in factory.settings.args ) { - var arg = factory.settings.args[ index ]; - if ( arg !== '' && arg ) { - //url += "&" + index + "=" + encodeURIComponent(arg); - params[index] = encodeURIComponent(arg); - } - } + } - $shared.isCreateLoading = true; - return $q(function(resolve, reject) { - Backend.get(url, {params: params}).then(function(res) { - var meta = res.data.meta; - factory.meta = meta; - var scopeObj = factory.settings.scope.obj - var key = factory.settings.scope.key; - scopeObj[ key ] = res.data.data; - console.log("loaded data ", scopeObj[key]); - console.log("loaded data meta", meta); - $shared.endIsCreateLoading(); - $shared.endIsLoading(); - $timeout(function() { - scopeObj.$apply(); - resolve(res); - }, 0); - }); - }); - } - factory.gotoPage = function( page ) { - factory.changePage( page ); - factory.loadData(); - } - factory.resetSearch = function() { - searchTimer = null; - factory.settings.search = ""; - factory.didSearch = false; - } - factory.checkIfSearched = function() { - if ( $stateParams['search'] !== '' ) { - return true; - } - return false; - } - factory.search = function() { - factory.didSearch = true; - if (searchTimer !== null) { - $timeout.cancel(searchTimer); //clear any running timeout on key up - } - searchTimer = $timeout(function() { //then give it a second to see if the user is finished - //do .post ajax request //then do the ajax call - //var page = $stateParams['page']; - var page = "1"; - - console.log("SEARCH IS ", factory.settings.search); - $shared.changeRoute('.', {'page': page,"search": factory.settings.search}, true /** force */, true); - //factory.loadData(); - }, 800); - } - return factory; - }) - .config(['$httpProvider', '$locationProvider', function($httpProvider, $locationProvider) { - $httpProvider.interceptors.push('JWTHttpInterceptor'); + $shared.isCreateLoading = true; + return $q(function (resolve, reject) { + Backend.get(url, { params: params }).then(function (res) { + var meta = res.data.meta; + factory.meta = meta; + var scopeObj = factory.settings.scope.obj; + var key = factory.settings.scope.key; + scopeObj[key] = res.data.data; + console.log('loaded data ', scopeObj[key]); + console.log('loaded data meta', meta); + $shared.endIsCreateLoading(); + $shared.endIsLoading(); + $timeout(function () { + scopeObj.$apply(); + resolve(res); + }, 0); + }); + }); + }; + factory.gotoPage = function (page) { + factory.changePage(page); + factory.loadData(); + }; + factory.resetSearch = function () { + searchTimer = null; + factory.settings.search = ''; + factory.didSearch = false; + }; + factory.checkIfSearched = function () { + if ($stateParams['search'] !== '') { + return true; + } + return false; + }; + factory.search = function () { + factory.didSearch = true; + if (searchTimer !== null) { + $timeout.cancel(searchTimer); //clear any running timeout on key up + } + searchTimer = $timeout(function () { + //then give it a second to see if the user is finished + //do .post ajax request //then do the ajax call + //var page = $stateParams['page']; + var page = '1'; + + console.log('SEARCH IS ', factory.settings.search); + $shared.changeRoute( + '.', + { page: page, search: factory.settings.search }, + true /** force */, + true + ); + //factory.loadData(); + }, 800); + }; + return factory; + }) + .config([ + '$httpProvider', + '$locationProvider', + function ($httpProvider, $locationProvider) { + $httpProvider.interceptors.push('JWTHttpInterceptor'); // $locationProvider.html5Mode(true); - }]) - - .config(function(IdleProvider, KeepaliveProvider) { - IdleProvider.idle(900); // 15 min - IdleProvider.timeout(60); - KeepaliveProvider.interval(600); // heartbeat every 10 min - /* + }, + ]) + + .config(function (IdleProvider, KeepaliveProvider) { + IdleProvider.idle(900); // 15 min + IdleProvider.timeout(60); + KeepaliveProvider.interval(600); // heartbeat every 10 min + /* KeepaliveProvider.http({ method: 'GET', url: createUrl('/jwt/heartbeat'), @@ -1317,718 +1372,729 @@ if (checked.length === 0) { } }); // URL that makes sure session is alive */ - }) - .config(function($translateProvider) { - $translateProvider.useStaticFilesLoader({ - prefix: 'languages/', - suffix: '.json' - }); - $translateProvider.useSanitizeValueStrategy(null); - $translateProvider.preferredLanguage('en'); - }) - - .config(function($stateProvider, $urlRouterProvider) { + }) + .config(function ($translateProvider) { + $translateProvider.useStaticFilesLoader({ + prefix: 'languages/', + suffix: '.json', + }); + $translateProvider.useSanitizeValueStrategy(null); + $translateProvider.preferredLanguage('en'); + }) + .config(function ($stateProvider, $urlRouterProvider) { $urlRouterProvider.when('/dashboard', '/dashboard/home'); $urlRouterProvider.otherwise('/dashboard/home'); - // function to check the authentication // - var Auth = ["$q", "$state", "$timeout", "$window", "$shared", function ($q, $state, $timeout, $window, $shared) { - var deferred =$q.defer(); + // function to check the authentication // + var Auth = [ + '$q', + '$state', + '$timeout', + '$window', + '$shared', + function ($q, $state, $timeout, $window, $shared) { + var deferred = $q.defer(); function redirectToLoginPage() { - console.log("not logged in..."); - if (isAlreadyDoingNextRedirect()) { - return; - } - var path = document.location.href.split("/"); - var next = path.slice(4, path.length).join("/"); - //var next = $state.current.name; - console.log("next URL is: ", next); - console.log("current state is ", $state.current); - window.location.replace("/#/login?next=" + next); - //$state.go('login', {'next': next}); - deferred.reject(); - } - $timeout(function() { - console.log("checking auth token.."); - var token = getJWTTokenObj(); - var skip = ['login', 'register', 'forgot', 'reset']; - $shared.tempStopErrors = true; - if (skip.includes($state.current.name)) { - return deferred.resolve(); + console.log('not logged in...'); + if (isAlreadyDoingNextRedirect()) { + return; + } + var path = document.location.href.split('/'); + var next = path.slice(4, path.length).join('/'); + //var next = $state.current.name; + console.log('next URL is: ', next); + console.log('current state is ', $state.current); + window.location.replace('/#/login?next=' + next); + //$state.go('login', {'next': next}); + deferred.reject(); + } + $timeout(function () { + console.log('checking auth token..'); + var token = getJWTTokenObj(); + var skip = ['login', 'register', 'forgot', 'reset']; + $shared.tempStopErrors = true; + if (skip.includes($state.current.name)) { + return deferred.resolve(); + } + if (token !== '' && token) { + $shared.tempStopErrors = false; + var expiryTimePadding = 3600 * 5; + var expiryInUnix = token['expire_in_timestamp']; + var currentUnixTime = moment().unix(); + if (currentUnixTime >= expiryInUnix - expiryTimePadding) { + redirectToLoginPage(); + return; } - if (token!==''&&token) { - $shared.tempStopErrors = false; - var expiryTimePadding = (3600*5); - var expiryInUnix = token['expire_in_timestamp']; - var currentUnixTime = moment().unix() - if (currentUnixTime >= (expiryInUnix-expiryTimePadding)) { - redirectToLoginPage(); - return; - } - return deferred.resolve(); - } else { - redirectToLoginPage(); - } + return deferred.resolve(); + } else { + redirectToLoginPage(); + } }, 0); - }]; + }, + ]; var resolveParams = { - auth: Auth - }; - var listPageParams = { - page: { - value: '1', - squash: true - }, - search: { - value: '', - squash: true - } + auth: Auth, }; -var regParams = { + var listPageParams = { + page: { + value: '1', + squash: true, + }, + search: { + value: '', + squash: true, + }, }; + var regParams = {}; $stateProvider - .state('base', { + .state('base', { abstract: true, url: '', templateUrl: 'views/base.html', - controller: 'DashboardCtrl' - - }) - .state('join-workspace', { + controller: 'DashboardCtrl', + }) + .state('join-workspace', { url: '/join-workspace/:hash', parent: 'base', templateUrl: 'views/pages/join-workspace.html', - controller: 'JoinWorkspaceCtrl' - }) - .state('login', { + controller: 'JoinWorkspaceCtrl', + }) + .state('login', { url: '/login', parent: 'base', templateUrl: 'views/pages/login.html', - controller: 'LoginCtrl' - }) - .state('register', { + controller: 'LoginCtrl', + }) + .state('register', { url: '/register?plan&billingPeriod', parent: 'base', templateUrl: 'views/pages/register.html', controller: 'RegisterCtrl', - params: regParams - }) - .state('forgot', { + params: regParams, + }) + .state('forgot', { url: '/forgot', parent: 'base', templateUrl: 'views/pages/forgot.html', - controller: 'ForgotCtrl' - }) - .state('reset', { + controller: 'ForgotCtrl', + }) + .state('reset', { url: '/reset', parent: 'base', templateUrl: 'views/pages/reset.html', - controller: 'ResetCtrl' - }) + controller: 'ResetCtrl', + }) - .state('404', { + .state('404', { url: '/404', parent: 'base', templateUrl: 'views/pages/404-page.html', - controller: 'NotFoundCtrl' - }) - .state('dashboard', { + controller: 'NotFoundCtrl', + }) + .state('dashboard', { url: '/dashboard', parent: 'base', templateUrl: 'views/layouts/dashboard.html', controller: 'DashboardCtrl', - resolve: resolveParams - }) - .state('404-dash', { + resolve: resolveParams, + }) + .state('404-dash', { url: '/logged/404', parent: 'dashboard', templateUrl: 'views/pages/404-dash-page.html', - }) - .state('dashboard-user-welcome', { + }) + .state('dashboard-user-welcome', { url: '/welcome', parent: 'dashboard', templateUrl: 'views/pages/dashboard-welcome.html', controller: 'DashboardWelcomeCtrl', - resolve: resolveParams - }) - .state('dashboard-redirect', { + resolve: resolveParams, + }) + .state('dashboard-redirect', { url: '/dashboard-redirect', parent: 'base', templateUrl: 'views/pages/dashboard-redirect.html', - controller: 'DashboardRedirectCtrl' - }) - .state('my-numbers', { + controller: 'DashboardRedirectCtrl', + }) + .state('my-numbers', { url: '/dids/my-numbers?page&search', parent: 'dashboard', templateUrl: 'views/pages/did/my-numbers.html', controller: 'MyNumbersCtrl', - params: listPageParams - }) - .state('my-numbers-edit', { + params: listPageParams, + }) + .state('my-numbers-edit', { url: '/dids/my-numbers/{numberId}/edit', parent: 'dashboard', templateUrl: 'views/pages/did/my-numbers-edit.html', - controller: 'MyNumbersEditCtrl' - }) - .state('buy-numbers', { + controller: 'MyNumbersEditCtrl', + }) + .state('buy-numbers', { url: '/dids/buy-numbers', parent: 'dashboard', templateUrl: 'views/pages/did/buy-numbers.html', - controller: 'BuyNumbersCtrl' - }) - .state('buy-numbers-select', { + controller: 'BuyNumbersCtrl', + }) + .state('buy-numbers-select', { url: '/dids/buy-numbers/{type}', parent: 'dashboard', templateUrl: 'views/pages/did/buy-numbers.html', - controller: 'BuyNumbersCtrl' - }) - .state('ports', { + controller: 'BuyNumbersCtrl', + }) + .state('ports', { url: '/dids/ports?page&search', parent: 'dashboard', templateUrl: 'views/pages/did/ports/numbers.html', controller: 'PortNumbersCtrl', - params: listPageParams - }) - .state('port-create', { + params: listPageParams, + }) + .state('port-create', { url: '/dids/ports/create', parent: 'dashboard', templateUrl: 'views/pages/did/ports/create-port.html', - controller: 'CreatePortCtrl' - }) - .state('port-edit', { + controller: 'CreatePortCtrl', + }) + .state('port-edit', { url: '/dids/ports/{numberId}/edit', parent: 'dashboard', templateUrl: 'views/pages/did/ports/edit-port.html', - controller: 'EditPortCtrl' - }) - .state('flows', { + controller: 'EditPortCtrl', + }) + .state('flows', { url: '/flows?page&search', parent: 'dashboard', templateUrl: 'views/pages/flows.html', controller: 'FlowsCtrl', - params: listPageParams - }) - .state('flow-editor', { + params: listPageParams, + }) + .state('flow-editor', { url: '/flows/{flowId}', parent: 'dashboard', templateUrl: 'views/pages/flow-editor.html', - controller: 'FlowEditorCtrl' - }) - .state('extensions', { + controller: 'FlowEditorCtrl', + }) + .state('extensions', { url: '/extensions?page&search', parent: 'dashboard', templateUrl: 'views/pages/extensions.html', controller: 'ExtensionsCtrl', - params: listPageParams - }) - .state('extension-create', { + params: listPageParams, + }) + .state('extension-create', { url: '/extension/create', parent: 'dashboard', templateUrl: 'views/pages/extension-create.html', - controller: 'ExtensionCreateCtrl' - }) - .state('extension-edit', { + controller: 'ExtensionCreateCtrl', + }) + .state('extension-edit', { url: '/extension/{extensionId}/edit', parent: 'dashboard', templateUrl: 'views/pages/extension-edit.html', - controller: 'ExtensionEditCtrl' - }) - .state('debugger-logs', { + controller: 'ExtensionEditCtrl', + }) + .state('debugger-logs', { url: '/call-monitor?page&search', parent: 'dashboard', templateUrl: 'views/pages/debugger-logs.html', controller: 'DebuggerLogsCtrl', - params: listPageParams - }) - .state('debugger-log-view', { + params: listPageParams, + }) + .state('debugger-log-view', { url: '/call-monitor/{logId}/view', parent: 'dashboard', templateUrl: 'views/pages/log-view.html', - controller: 'DebuggerLogViewCtrl' - }) - .state('calls', { + controller: 'DebuggerLogViewCtrl', + }) + .state('calls', { url: '/calls?page&search', parent: 'dashboard', templateUrl: 'views/pages/calls.html', controller: 'CallsCtrl', - params: listPageParams - }) - .state('call-view', { + params: listPageParams, + }) + .state('call-view', { url: '/call/{callId}/view', parent: 'dashboard', templateUrl: 'views/pages/call-view.html', - controller: 'CallViewCtrl' - }) - .state('recordings', { + controller: 'CallViewCtrl', + }) + .state('recordings', { url: '/recordings?page&search', parent: 'dashboard', templateUrl: 'views/pages/recordings.html', controller: 'RecordingsCtrl', - params: listPageParams - }) - .state('faxes', { + params: listPageParams, + }) + .state('faxes', { url: '/faxes?page&search', parent: 'dashboard', templateUrl: 'views/pages/faxes.html', controller: 'FaxesCtrl', - params: listPageParams - }) - .state('support', { + params: listPageParams, + }) + .state('support', { url: '/support?page&search', parent: 'dashboard', templateUrl: 'views/pages/support.html', controller: 'SupportCtrl', - params: listPageParams - }) - .state('support-create', { + params: listPageParams, + }) + .state('support-create', { url: '/support/create', parent: 'dashboard', templateUrl: 'views/pages/support-create.html', - controller: 'SupportCreateCtrl' - }) - .state('support-update', { + controller: 'SupportCreateCtrl', + }) + .state('support-update', { url: '/support/{ticketId}/update', parent: 'dashboard', templateUrl: 'views/pages/support-update.html', - controller: 'SupportUpdateCtrl' - }) - .state('billing', { + controller: 'SupportUpdateCtrl', + }) + .state('billing', { url: '/billing?frm', parent: 'dashboard', templateUrl: 'views/pages/billing.html', - controller: 'BillingCtrl' - }) - .state('billing-add-card', { + controller: 'BillingCtrl', + }) + .state('billing-add-card', { url: '/billing/add-card', parent: 'dashboard', templateUrl: 'views/pages/billing-add-card.html', - controller: 'BillingCtrl' - }) - .state('billing-fix-paypal-billing-agreement', { + controller: 'BillingCtrl', + }) + .state('billing-fix-paypal-billing-agreement', { url: '/billing/fix-paypal-billing-agreement', parent: 'dashboard', templateUrl: 'views/pages/billing-fix-paypal-billing-agreement.html', - controller: 'BillingFixPaypalAgreementCtrl' - }) - .state('billing-upgrade-plan', { + controller: 'BillingFixPaypalAgreementCtrl', + }) + .state('billing-upgrade-plan', { url: '/billing/upgrade-plan', parent: 'dashboard', templateUrl: 'views/pages/billing-upgrade.html', - controller: 'BillingUpgradePlanCtrl' - }) - .state('billing-upgrade-submit', { + controller: 'BillingUpgradePlanCtrl', + }) + .state('billing-upgrade-submit', { url: '/billing/upgrade-submit?plan', parent: 'dashboard', templateUrl: 'views/pages/billing-upgrade-submit.html', controller: 'BillingUpgradeSubmitCtrl', params: { - plan: { + plan: { value: 'pay-as-you-go', - squash: true - } - } - }) - .state('billing-upgrade-complete', { + squash: true, + }, + }, + }) + .state('billing-upgrade-complete', { url: '/billing/upgrade-complete', parent: 'dashboard', templateUrl: 'views/pages/billing-upgrade-complete.html', controller: 'BillingUpgradeCompleteCtrl', - }) - .state('billing-cancel-subscription', { - url: '/billing/cancel-subscription', - parent: 'dashboard', - templateUrl: 'views/pages/billing-cancel-subscription.html', - controller: 'CancelSubscriptionCtrl', - }) - .state('billing-make-payment', { + }) + .state('billing-cancel-subscription', { + url: '/billing/cancel-subscription', + parent: 'dashboard', + templateUrl: 'views/pages/billing-cancel-subscription.html', + controller: 'CancelSubscriptionCtrl', + }) + .state('billing-make-payment', { url: '/billing/make-payment', parent: 'dashboard', templateUrl: 'views/pages/make-payment.html', - controller: 'MakePaymentCtrl' - }) - .state('home', { + controller: 'MakePaymentCtrl', + }) + .state('home', { url: '/home', parent: 'dashboard', templateUrl: 'views/pages/dashboard/home.html', - controller: 'HomeCtrl' - }) - .state('settings', { + controller: 'HomeCtrl', + }) + .state('settings', { url: '/settings', parent: 'dashboard', templateUrl: 'views/pages/settings.html', - controller: 'SettingsCtrl' - }) - .state('settings-verified-callerids', { + controller: 'SettingsCtrl', + }) + .state('settings-verified-callerids', { url: '/settings/verified-callerids', parent: 'dashboard', templateUrl: 'views/pages/settings/verified-callerids.html', - controller: 'VerifiedCallerIdsCtrl' - }) - .state('settings-verified-callerids-create', { + controller: 'VerifiedCallerIdsCtrl', + }) + .state('settings-verified-callerids-create', { url: '/settings/verified-callerids/create', parent: 'dashboard', templateUrl: 'views/pages/settings/verified-callerids-create.html', - controller: 'VerifiedCallerIdsCreateCtrl' - }) - .state('settings-blocked-numbers', { + controller: 'VerifiedCallerIdsCreateCtrl', + }) + .state('settings-blocked-numbers', { url: '/settings/blocked-numbers', parent: 'dashboard', templateUrl: 'views/pages/settings/blocked-numbers.html', - controller: 'BlockedNumbersCtrl' - }) - .state('settings-blocked-numbers-create', { + controller: 'BlockedNumbersCtrl', + }) + .state('settings-blocked-numbers-create', { url: '/settings/blocked-numbers/create', parent: 'dashboard', templateUrl: 'views/pages/settings/blocked-numbers-create.html', - controller: 'BlockedNumbersCreateCtrl' - }) - .state('settings-ip-whitelist', { + controller: 'BlockedNumbersCreateCtrl', + }) + .state('settings-ip-whitelist', { url: '/settings/ip-whitelist', parent: 'dashboard', templateUrl: 'views/pages/settings/ip-whitelist.html', - controller: 'IpWhitelistCtrl' - }) - .state('settings-workspace-users', { + controller: 'IpWhitelistCtrl', + }) + .state('settings-workspace-users', { url: '/users', parent: 'dashboard', templateUrl: 'views/pages/settings/workspace-users.html', - controller: 'WorkspaceUserCtrl' - }) - .state('settings-workspace-options', { + controller: 'WorkspaceUserCtrl', + }) + .state('settings-workspace-options', { url: '/settings/workspace-options', parent: 'dashboard', templateUrl: 'views/pages/settings/workspace-options.html', - controller: 'WorkspaceOptionsCtrl' - }) - .state('settings-workspace-api-settings', { + controller: 'WorkspaceOptionsCtrl', + }) + .state('settings-workspace-api-settings', { url: '/settings/workspace-api-settings', parent: 'dashboard', templateUrl: 'views/pages/settings/workspace-api-settings.html', - controller: 'WorkspaceAPISettingsCtrl' - }) - .state('settings-workspace-params', { + controller: 'WorkspaceAPISettingsCtrl', + }) + .state('settings-workspace-params', { url: '/settings/workspace-params', parent: 'dashboard', templateUrl: 'views/pages/settings/workspace-params.html', - controller: 'WorkspaceParamCtrl' - }) + controller: 'WorkspaceParamCtrl', + }) - .state('settings-workspace-users-create', { + .state('settings-workspace-users-create', { url: '/users/create', parent: 'dashboard', templateUrl: 'views/pages/settings/workspace-users-create.html', - controller: 'WorkspaceUserCreateCtrl' - }) - .state('settings-workspace-users-edit', { + controller: 'WorkspaceUserCreateCtrl', + }) + .state('settings-workspace-users-edit', { url: '/users/{userId}/edit', parent: 'dashboard', templateUrl: 'views/pages/settings/workspace-users-edit.html', - controller: 'WorkspaceUserEditCtrl' - }) + controller: 'WorkspaceUserEditCtrl', + }) - .state('settings-workspace-users-assign', { + .state('settings-workspace-users-assign', { url: '/settings/workspace-users/{userId}/assign', parent: 'dashboard', templateUrl: 'views/pages/settings/workspace-users-assign.html', - controller: 'WorkspaceUserAssignCtrl' - }) - .state('settings-extension-codes', { - + controller: 'WorkspaceUserAssignCtrl', + }) + .state('settings-extension-codes', { url: '/settings/extension-codes', parent: 'dashboard', templateUrl: 'views/pages/settings/extension-codes.html', - controller: 'ExtensionCodesCtrl' - }) - .state('settings-geo-permission', { - url: '/settings/geo-permission', - parent: 'dashboard', - templateUrl: 'views/pages/settings/geo-permission.html', - controller: 'GeoPermissionCtrl' - }) - .state('files', { - + controller: 'ExtensionCodesCtrl', + }) + .state('settings-geo-permission', { + url: '/settings/geo-permission', + parent: 'dashboard', + templateUrl: 'views/pages/settings/geo-permission.html', + controller: 'GeoPermissionCtrl', + }) + .state('files', { url: '/files', parent: 'dashboard', templateUrl: 'views/pages/files.html', - controller: 'FilesCtrl' - }) - .state('phones', { + controller: 'FilesCtrl', + }) + .state('phones', { url: '/phones', parent: 'dashboard', templateUrl: 'views/pages/phones.html', controller: 'phonesCtrl', - }) - .state('phones-phones', { + }) + .state('phones-phones', { url: '/provision/phones?page&search', parent: 'dashboard', templateUrl: 'views/pages/phones/phones.html', controller: 'PhonesCtrl', - params: listPageParams - }) + params: listPageParams, + }) - .state('phones-phone-create', { + .state('phones-phone-create', { url: '/provision/create', parent: 'dashboard', templateUrl: 'views/pages/phones/phones-create.html', - controller: 'PhoneCreateCtrl' - }) - .state('phones-phone-edit', { + controller: 'PhoneCreateCtrl', + }) + .state('phones-phone-edit', { url: '/provision/{phoneId}/edit', parent: 'dashboard', templateUrl: 'views/pages/phones/phones-edit.html', - controller: 'PhoneEditCtrl' - }) + controller: 'PhoneEditCtrl', + }) - .state('phones-groups', { + .state('phones-groups', { url: '/provision/groups?page&search', parent: 'dashboard', templateUrl: 'views/pages/phones/groups.html', controller: 'PhoneGroupsCtrl', - params: listPageParams - }) - .state('phones-groups-create', { + params: listPageParams, + }) + .state('phones-groups-create', { url: '/provision/groups/create', parent: 'dashboard', templateUrl: 'views/pages/phones/groups-create.html', - controller: 'PhoneGroupsCreateCtrl' - }) - .state('phones-groups-edit', { + controller: 'PhoneGroupsCreateCtrl', + }) + .state('phones-groups-edit', { url: '/provision/groups/{phoneGroupId}/edit', parent: 'dashboard', templateUrl: 'views/pages/phones/groups-edit.html', - controller: 'PhoneGroupsEditCtrl' - }) - .state('phones-global-settings', { + controller: 'PhoneGroupsEditCtrl', + }) + .state('phones-global-settings', { url: '/provision/global-settings', parent: 'dashboard', templateUrl: 'views/pages/phones/global-settings.html', - controller: 'PhoneGlobalSettingsCtrl' - }) - .state('phones-global-settings-create', { + controller: 'PhoneGlobalSettingsCtrl', + }) + .state('phones-global-settings-create', { url: '/provision/global-settings/create', parent: 'dashboard', templateUrl: 'views/pages/phones/global-settings-create.html', - controller: 'PhoneGlobalSettingsCreateCtrl' - }) - .state('phones-global-settings-modify', { + controller: 'PhoneGlobalSettingsCreateCtrl', + }) + .state('phones-global-settings-modify', { url: '/provision/global-settings/{phoneSettingId}/modify', parent: 'dashboard', templateUrl: 'views/pages/phones/global-settings-modify.html', - controller: 'PhoneGlobalSettingsModifyCtrl' - }) + controller: 'PhoneGlobalSettingsModifyCtrl', + }) - .state('phones-global-settings-modify-category', { + .state('phones-global-settings-modify-category', { url: '/provision/global-settings/{phoneSettingId}/modify/{categoryId}', parent: 'dashboard', templateUrl: 'views/pages/phones/global-settings-modify-category.html', - controller: 'PhoneGlobalSettingsModifyCategoryCtrl' - }) - .state('phones-individual-settings', { + controller: 'PhoneGlobalSettingsModifyCategoryCtrl', + }) + .state('phones-individual-settings', { url: '/provision/individual-settings', parent: 'dashboard', templateUrl: 'views/pages/phones/individual-settings.html', - controller: 'PhoneIndividualSettingsCtrl' - }) - .state('phones-individual-settings-modify', { + controller: 'PhoneIndividualSettingsCtrl', + }) + .state('phones-individual-settings-modify', { url: '/provision/individual-settings/{phoneSettingId}/modify', parent: 'dashboard', templateUrl: 'views/pages/phones/individual-settings-modify.html', - controller: 'PhoneIndividualSettingsModifyCtrl' - }) - + controller: 'PhoneIndividualSettingsModifyCtrl', + }) - .state('phones-individual-settings-modify-category', { + .state('phones-individual-settings-modify-category', { url: '/provision/individual-settings/{phoneSettingId}/modify/{categoryId}', parent: 'dashboard', templateUrl: 'views/pages/phones/individual-settings-modify-category.html', - controller: 'PhoneIndividualSettingsModifyCategoryCtrl' - }) - .state('phones-deploy-config', { + controller: 'PhoneIndividualSettingsModifyCategoryCtrl', + }) + .state('phones-deploy-config', { url: '/provision/deploy', parent: 'dashboard', templateUrl: 'views/pages/phones/deploy.html', - controller: 'PhoneDeployCtrl' - }) + controller: 'PhoneDeployCtrl', + }) - .state('byo-carriers', { + .state('byo-carriers', { url: '/byo/carriers?page&search', parent: 'dashboard', templateUrl: 'views/pages/byo/carriers.html', controller: 'BYOCarriersCtrl', - params: listPageParams - }) - .state('byo-carrier-create', { + params: listPageParams, + }) + .state('byo-carrier-create', { url: '/byo/carrier/create', parent: 'dashboard', templateUrl: 'views/pages/byo/carrier-create.html', - controller: 'BYOCarrierCreateCtrl' - }) - .state('byo-carrier-edit', { + controller: 'BYOCarrierCreateCtrl', + }) + .state('byo-carrier-edit', { url: '/byo/carrier/{carrierId}/edit', parent: 'dashboard', templateUrl: 'views/pages/byo/carrier-edit.html', - controller: 'BYOCarrierEditCtrl' - }) - .state('byo-did-numbers', { + controller: 'BYOCarrierEditCtrl', + }) + .state('byo-did-numbers', { url: '/byo/did-numbers?page&search', parent: 'dashboard', templateUrl: 'views/pages/byo/dids.html', controller: 'BYODIDNumbersCtrl', - params: listPageParams - }) - .state('byo-did-number-create', { + params: listPageParams, + }) + .state('byo-did-number-create', { url: '/byo/did-number/create', parent: 'dashboard', templateUrl: 'views/pages/byo/did-create.html', - controller: 'BYODIDNumberCreateCtrl' - }) - .state('byo-did-number-edit', { + controller: 'BYODIDNumberCreateCtrl', + }) + .state('byo-did-number-edit', { url: '/byo/did-number/{numberId}/edit', parent: 'dashboard', templateUrl: 'views/pages/byo/did-edit.html', - controller: 'BYODIDNumberEditCtrl' - }) - .state('hosted-trunks', { + controller: 'BYODIDNumberEditCtrl', + }) + .state('hosted-trunks', { url: '/hosted-trunks/?page&search', parent: 'dashboard', templateUrl: 'views/pages/trunks/trunks.html', controller: 'HostedTrunksCtrl', - params: listPageParams - }) - .state('hosted-trunks-create', { + params: listPageParams, + }) + .state('hosted-trunks-create', { url: '/hosted-trunks/create', parent: 'dashboard', templateUrl: 'views/pages/trunks/trunk-create.html', - controller: 'HostedTrunksCreateCtrl' - }) - .state('hosted-trunks-edit', { + controller: 'HostedTrunksCreateCtrl', + }) + .state('hosted-trunks-edit', { url: '/hosted-trunks/{trunkId}/edit', parent: 'dashboard', templateUrl: 'views/pages/trunks/trunk-edit.html', - controller: 'HostedTrunksEditCtrl' - }) - + controller: 'HostedTrunksEditCtrl', + }) - - .state('blank', { + .state('blank', { url: '/blank', parent: 'dashboard', templateUrl: 'views/pages/dashboard/blank.html', - }) -}).run(function($rootScope, $shared, $state, Backend, Authenticator, $window, $q) { + }); + }) + .run(function ($rootScope, $shared, $state, Backend, Authenticator, $window, $q) { $rootScope.shared = $shared; - $rootScope.$watch('shared.title', function(newTitle, oldTitle) { - document.title = newTitle; + $rootScope.$watch('shared.title', function (newTitle, oldTitle) { + document.title = newTitle; }); - //Idle.watch(); - $rootScope.$on('IdleStart', function() { - /* Display modal warning or sth */ + //Idle.watch(); + $rootScope.$on('IdleStart', function () { + /* Display modal warning or sth */ }); - $rootScope.$on('IdleTimeout', function() { - /* Logout user */ - $shared.doLogout(); + $rootScope.$on('IdleTimeout', function () { + /* Logout user */ + $shared.doLogout(); }); - $rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams){ - // do something - console.log("state is changing ", arguments); - - // Backend.applyTheme(); - if(toState.requireAuthentication) { - if(!Authenticator.isAuthenticated() || !Authenticator.checkAuthenticationTime()) { - localStorage.clear(); - $state.go('login'); + $rootScope.$on('$stateChangeStart', function (event, toState, toParams, fromState, fromParams) { + // do something + console.log('state is changing ', arguments); + + // Backend.applyTheme(); + if (toState.requireAuthentication) { + if (!Authenticator.isAuthenticated() || !Authenticator.checkAuthenticationTime()) { + localStorage.clear(); + $state.go('login'); + return; + } else { + Authenticator.resetLastAuthenticationTime(); + } + } + $shared.state = toState; + if (fromState.name === 'flow-editor') { + $shared.showNavbar(); + } + var token = localStorage.getItem('AUTH'); + var admin = localStorage.getItem('ADMIN_TOKEN'); + var workspaceId = getWorkspaceID(); + if (admin) { + Backend.get('/admin/getWorkspaces').then(function (res) { + $shared.workspaces = res.data.data; + $shared.isAdmin = true; + if (!workspaceId) { + $shared.selectedAdminWorkspace = $shared.workspaces[0]; + $shared.changeAdminWorkspace2($shared.workspaces[0]); return; - } else { - Authenticator.resetLastAuthenticationTime(); } - } - $shared.state = toState; - if (fromState.name === 'flow-editor') { - $shared.showNavbar(); - } - var token = localStorage.getItem("AUTH"); - var admin = localStorage.getItem("ADMIN_TOKEN"); - var workspaceId = getWorkspaceID(); - if ( admin ) { - Backend.get("/admin/getWorkspaces").then(function(res) { - $shared.workspaces = res.data.data; - $shared.isAdmin = true; - if (!workspaceId) { - $shared.selectedAdminWorkspace = $shared.workspaces[ 0 ]; - $shared.changeAdminWorkspace2( $shared.workspaces[ 0 ] ); - return; - } - angular.forEach($shared.workspaces, function( workspace ) { - console.log("checking workspace ", workspace); - if ( workspace.id === workspaceId ) { - console.log("switching to workspace ", workspace); - $shared.selectedAdminWorkspace= workspace; - $shared.changeAdminWorkspace2( workspace ); - } - }); - - }); - } - if ((!$shared.billInfo || !$shared.userInfo || !$shared.planInfo) && Authenticator.isAuthenticated()) { - Backend.refreshWorkspaceData().then(function(res) { - console.log("updated UI data"); - }); - } - /* + angular.forEach($shared.workspaces, function (workspace) { + console.log('checking workspace ', workspace); + if (workspace.id === workspaceId) { + console.log('switching to workspace ', workspace); + $shared.selectedAdminWorkspace = workspace; + $shared.changeAdminWorkspace2(workspace); + } + }); + }); + } + if ( + (!$shared.billInfo || !$shared.userInfo || !$shared.planInfo) && + Authenticator.isAuthenticated() + ) { + Backend.refreshWorkspaceData().then(function (res) { + console.log('updated UI data'); + }); + } + /* Backend.get("/getBillingInfo").then(function(res) { $shared.billInfo = res.data; }); */ - // get settings & customizations - - console.log("getting all settings...") - $shared.isLoading = true; + // get settings & customizations - if ($shared.customizations) { - return; - } - - var requests = [Backend.get("/getAllSettings")]; - var hasSIPCredentialsRequest = false; - if (Authenticator.isAuthenticated()) { - requests.push(Backend.get("/getSIPCredentials")); - hasSIPCredentialsRequest = true; - } + console.log('getting all settings...'); + $shared.isLoading = true; - $q.all(requests).then(function(res) { - console.log('state is currently', $state.current.name); - var data = res[0].data; - $shared.customizations = data['customizations']; - $shared.frontend_api_creds = data['frontend_api_creds']; - $shared.available_themes = data['available_themes']; - console.log('customizations are ', $shared.customizations); - - if (hasSIPCredentialsRequest) { - console.log("SIP credentials ", res[1]); - $shared.SIPCredentials = res[1].data; - } - addSocialLoginScript(); - addAnalyticsScript(); - addPaymentScript(); - }); - Backend.get("/getBillingCountries").then((res) => { - $shared.billingCountries = res.data; - applyDefaultTheme(); - }); + if ($shared.customizations) { + return; + } + var requests = [Backend.get('/getAllSettings')]; + var hasSIPCredentialsRequest = false; + if (Authenticator.isAuthenticated()) { + requests.push(Backend.get('/getSIPCredentials')); + hasSIPCredentialsRequest = true; + } - }) - $rootScope.$on('$stateChangeError', function(event) { - console.log("no page found - 404"); - $state.go('404'); - }); + $q.all(requests).then(function (res) { + console.log('state is currently', $state.current.name); + var data = res[0].data; + $shared.customizations = data['customizations']; + $shared.frontend_api_creds = data['frontend_api_creds']; + $shared.available_themes = data['available_themes']; + console.log('customizations are ', $shared.customizations); + + if ($shared.customizations.login_verification === 'cf-turnstile') { + console.log('adding cloudflare turnstile script'); + addScript('https://challenges.cloudflare.com/turnstile/v0/api.js'); + } else if ($shared.customizations.login_verification === 'hcaptcha') { + // implement code for recaptcha + //addScript('https://js.hcaptcha.com/1/api.js'); + } + + if (hasSIPCredentialsRequest) { + console.log('SIP credentials ', res[1]); + $shared.SIPCredentials = res[1].data; + } + addSocialLoginScript(); + addAnalyticsScript(); + addPaymentScript(); + }); + Backend.get('/getBillingCountries').then((res) => { + $shared.billingCountries = res.data; + applyDefaultTheme(); + }); + }); + $rootScope.$on('$stateChangeError', function (event) { + console.log('no page found - 404'); + $state.go('404'); + }); function applyDefaultTheme() { - const defaultTheme = $shared.available_themes && $shared.available_themes.length && $shared.available_themes.find((theme) => theme.is_default); + const defaultTheme = + $shared.available_themes && + $shared.available_themes.length && + $shared.available_themes.find((theme) => theme.is_default); if (!$window.localStorage.THEME && defaultTheme) { $window.localStorage.setItem('THEME', defaultTheme.name); } @@ -2043,25 +2109,30 @@ var regParams = { } function addSocialLoginScript() { - //0 - add microsoft script - if ($shared.customizations.enable_msft_signin) addScript('https://alcdn.msauth.net/browser/2.17.0/js/msal-browser.min.js'); + if ($shared.customizations.enable_msft_signin) + addScript('https://alcdn.msauth.net/browser/2.17.0/js/msal-browser.min.js'); //1 - add apple script if ($shared.customizations.enable_apple_signin) { - addScript('https://appleid.cdn-apple.com/appleauth/static/jsapi/appleid/1/en_US/appleid.auth.js'); - setTimeout(function() { + addScript( + 'https://appleid.cdn-apple.com/appleauth/static/jsapi/appleid/1/en_US/appleid.auth.js' + ); + setTimeout(function () { appleSignInInit(); - }, 1000) + }, 1000); } //2 - add google script - if ($shared.customizations.enable_google_signin) addScript('https://apis.google.com/js/platform.js'); + if ($shared.customizations.enable_google_signin) + addScript('https://apis.google.com/js/platform.js'); } function addPaymentScript() { // if ($shared.customizations.enable_paypal_signin) addScript('https://www.paypal.com/sdk/js?client-id=' + $shared.frontend_api_creds.paypal_client_id + '&components=buttons'); - addScript('https://www.paypal.com/sdk/js?client-id=AUflBHBWaadLlcLUEG5H513ix02TfejudnE-9Lx6ZZ8r0IIa0tU1MHeUlBQHfIR1L0_IV0yePltwqYg3&disable-funding=credit,card&components=buttons'); + addScript( + 'https://www.paypal.com/sdk/js?client-id=AUflBHBWaadLlcLUEG5H513ix02TfejudnE-9Lx6ZZ8r0IIa0tU1MHeUlBQHfIR1L0_IV0yePltwqYg3&disable-funding=credit,card&components=buttons' + ); } function appleSignInInit() { @@ -2074,88 +2145,99 @@ var regParams = { }); } } -}).service('Authenticator', function($window, $q, $shared, $state, $rootScope) { - var lastAuthenticationTime; - this.isAuthenticated = function() { - let authObject = null; - try { - authObject = JSON.parse($window.localStorage.AUTH || ''); - } catch ( e ) { - //console.error( e ); - authObject = null; - } + }) + .service('Authenticator', function ($window, $q, $shared, $state, $rootScope) { + var lastAuthenticationTime; + this.isAuthenticated = function () { + let authObject = null; + try { + authObject = JSON.parse($window.localStorage.AUTH || ''); + } catch (e) { + //console.error( e ); + authObject = null; + } - if (!authObject) return false; - if (!authObject.token.expire_in_timestamp) return false; - const expiresDate = new Date(authObject.token.expire_in_timestamp * 1000); - const nowDate = new Date(); - console.log('expires date ', expiresDate); - console.log('now date ', nowDate); - return expiresDate.getTime() > nowDate.getTime(); - }; - this.checkAuthenticationTime = function() { + if (!authObject) return false; + if (!authObject.token.expire_in_timestamp) return false; + const expiresDate = new Date(authObject.token.expire_in_timestamp * 1000); + const nowDate = new Date(); + console.log('expires date ', expiresDate); + console.log('now date ', nowDate); + return expiresDate.getTime() > nowDate.getTime(); + }; + this.checkAuthenticationTime = function () { var currentTime = new Date().getTime(); var timeSinceLastAuthentication = currentTime - lastAuthenticationTime; return timeSinceLastAuthentication < 30 * 60 * 1000; - }; - this.setLastAuthenticationTime = function() { + }; + this.setLastAuthenticationTime = function () { lastAuthenticationTime = new Date().getTime(); - }; - this.resetLastAuthenticationTime = function() { + }; + this.resetLastAuthenticationTime = function () { lastAuthenticationTime = null; - }; - this.authenticate = function(username, password) { - return Backend.post("/authenticate", {username: username, password: password}).then(function(res) { - if(res.data.token){ - $window.sessionStorage.token = res.data.token; - this.setLastAuthenticationTime(); - return $q.resolve(res); - } else { - return $q.reject(res); - } - }); - }; -}).service('ThemeService', function($window) { - this.setTheme = function(theme) { - $window.localStorage.setItem('THEME', theme); - }; - this.getTheme = function() { - return $window.localStorage.getItem('THEME') || 'default'; - }; - - function addStyleToDOM(path) { - var link = document.createElement('link'); - link.setAttribute('rel', 'stylesheet'); - link.setAttribute('type', 'text/css'); - link.setAttribute('data-theme', '1'); - link.setAttribute('href', path); - document.head.appendChild(link); - } - this.addStyle = function(path) { - if (!path) return; - - console.log('add style ', path); - // remove existing theme - const currentLink = document.head.querySelector('link[data-theme]'); - - if (currentLink && currentLink.getAttribute('href') !== path) { + }; + this.authenticate = function (username, password) { + return Backend.post('/authenticate', { username: username, password: password }).then( + function (res) { + if (res.data.token) { + $window.sessionStorage.token = res.data.token; + this.setLastAuthenticationTime(); + return $q.resolve(res); + } else { + return $q.reject(res); + } + } + ); + }; + }) + .service('ThemeService', function ($window) { + this.setTheme = function (theme) { + $window.localStorage.setItem('THEME', theme); + }; + this.getTheme = function () { + return $window.localStorage.getItem('THEME') || 'default'; + }; + + function addStyleToDOM(path) { + var link = document.createElement('link'); + link.setAttribute('rel', 'stylesheet'); + link.setAttribute('type', 'text/css'); + link.setAttribute('data-theme', '1'); + link.setAttribute('href', path); + document.head.appendChild(link); + } + this.addStyle = function (path) { + if (!path) return; + + console.log('add style ', path); + // remove existing theme + const currentLink = document.head.querySelector('link[data-theme]'); + + if (currentLink && currentLink.getAttribute('href') !== path) { currentLink.remove(); addStyleToDOM(path); - } else if (!currentLink) { + } else if (!currentLink) { addStyleToDOM(path); - } - } - - this.removeStyle = function(selectedPath) { - const allLinks = ['styles/app-grey.css', 'styles/app-blue.css', 'styles/app-green.css', 'styles/app-red.css', 'styles/app-purple.css', 'styles/app-cyan.css' ] - const links = document.head.querySelectorAll('link[href]'); - for (var i = 0; i < links.length; i++) { - const path = links[i].getAttribute('href'); - if (!allLinks.includes(path)) continue; - if (path === selectedPath) continue; - document.head.removeChild(links[i]); - } - } -}); + } + }; + + this.removeStyle = function (selectedPath) { + const allLinks = [ + 'styles/app-grey.css', + 'styles/app-blue.css', + 'styles/app-green.css', + 'styles/app-red.css', + 'styles/app-purple.css', + 'styles/app-cyan.css', + ]; + const links = document.head.querySelectorAll('link[href]'); + for (var i = 0; i < links.length; i++) { + const path = links[i].getAttribute('href'); + if (!allLinks.includes(path)) continue; + if (path === selectedPath) continue; + document.head.removeChild(links[i]); + } + }; + }); diff --git a/app/scripts/controllers/Extensions.js b/app/scripts/controllers/Extensions.js index cb46252..de0d4cb 100644 --- a/app/scripts/controllers/Extensions.js +++ b/app/scripts/controllers/Extensions.js @@ -7,86 +7,149 @@ * # MainCtrl * Controller of Lineblocs */ -angular.module('Lineblocs').controller('ExtensionsCtrl', function ($scope, Backend, pagination, $location, $state, $mdDialog, $mdToast, $shared, $q, $stateParams) { - $shared.updateTitle("Extensions"); - $scope.$stateParams = $stateParams; - $scope.$shared = $shared; - $scope.pagination = pagination; - $scope.Backend = Backend; - - function DialogController($scope, $mdDialog, extension, $shared) { +angular + .module('Lineblocs') + .controller( + 'ExtensionsCtrl', + function ( + $scope, + Backend, + pagination, + $location, + $state, + $mdDialog, + $mdToast, + $shared, + $q, + $stateParams + ) { + $shared.updateTitle('Extensions'); + $scope.$stateParams = $stateParams; $scope.$shared = $shared; - $scope.extension = extension; - $scope.close = function() { - $mdDialog.hide(); - } - } - $scope.settings = { - page: 0 - }; - $scope.extensions = []; - $scope.load = function() { - $shared.isLoading = true; - pagination.resetSearch(); - pagination.changeUrl( "/extension/list" ); - pagination.changePage( 1 ); - pagination.changeScope( $scope, 'extensions'); - return $q(function(resolve, reject) { - pagination.loadData().then(function(res) { - $scope.extensions = res.data.data; - $shared.endIsLoading(); - resolve(); - }, reject); - }); - } - $scope.editExtension = function(extension) { - $state.go('extension-edit', {extensionId: extension.public_id}); - } - $scope.createExtension = function(extension) { - $state.go('extension-create', {}); - } - $scope.connectInfo = function($event, extension) { - $mdDialog.show({ - controller: DialogController, - templateUrl: 'views/dialogs/extension-connect-info.html', - parent: angular.element(document.body), - targetEvent: $event, - clickOutsideToClose:true, - fullscreen: $scope.customFullscreen, // Only for -xs, -sm breakpoints. - locals: { - "extension": extension + $scope.pagination = pagination; + $scope.Backend = Backend; + + function DialogController($scope, $mdDialog, extension, $shared) { + $scope.$shared = $shared; + $scope.extension = extension; + $scope.close = function () { + $mdDialog.hide(); + }; } - }) - .then(function() { - }, function() { - }); - } - $scope.deleteExtension = function($event, extension) { - // Appending dialog to document.body to cover sidenav in docs app - var confirm = $mdDialog.confirm() - .title('Are you sure you want to delete this extension?') - .textContent('This will permantely remove the extension and you will no longer be able to use it') - .ariaLabel('Delete extension') - .targetEvent($event) - .ok('Yes') - .cancel('No'); - $mdDialog.show(confirm).then(function() { + $scope.settings = { + page: 0, + }; + $scope.extensions = []; + $scope.load = function () { $shared.isLoading = true; - Backend.delete("/extension/" + extension.public_id).then(function() { - $scope.load().then(function() { - $mdToast.show( - $mdToast.simple() - .textContent('Extension deleted..') - .position("top right") - .hideDelay(3000) - ); + pagination.resetSearch(); + pagination.changeUrl('/extension/list'); + pagination.changePage(1); + pagination.changeScope($scope, 'extensions'); + return $q(function (resolve, reject) { + pagination.loadData().then(function (res) { + $scope.extensions = res.data.data; + $shared.endIsLoading(); + resolve(); + }, reject); + }); + }; + $scope.editExtension = function (extension) { + $state.go('extension-edit', { extensionId: extension.public_id }); + }; + $scope.createExtension = function (extension) { + $state.go('extension-create', {}); + }; + $scope.connectInfo = function ($event, extension) { + $mdDialog + .show({ + controller: DialogController, + templateUrl: 'views/dialogs/extension-connect-info.html', + parent: angular.element(document.body), + targetEvent: $event, + clickOutsideToClose: true, + fullscreen: $scope.customFullscreen, // Only for -xs, -sm breakpoints. + locals: { + extension: extension, + }, + }) + .then( + function () {}, + function () {} + ); + }; + $scope.deleteExtension = function ($event, extension) { + $mdDialog + .show({ + controller: DeleteExtensionDialogCtrl, + template: ` + +
+ +
+

Delete Extension

+
+
+ + +

+ Are you sure you want to delete this extension? + This will permanently remove the extension and you will no longer be able to use it. +

+ + + + + +
+ + + + No + + Delete + + +
+
+ `, + targetEvent: $event, + clickOutsideToClose: true, + }) + .then(function () { + $shared.isLoading = true; + + Backend.delete('/extension/' + extension.public_id).then(function () { + $scope.load().then(function () { + $mdToast.show( + $mdToast + .simple() + .textContent('Extension deleted..') + .position('top right') + .hideDelay(3000) + ); + }); + }); }); + }; + + $scope.load(); + } + ); - }) - }, function() { - }); - } +function DeleteExtensionDialogCtrl($scope, $mdDialog) { + $scope.confirmText = ''; - $scope.load(); -}); + $scope.cancel = function () { + $mdDialog.cancel(); + }; + $scope.confirm = function () { + $mdDialog.hide(true); + }; +} diff --git a/app/scripts/controllers/login.js b/app/scripts/controllers/login.js index 2601bef..de4aa23 100644 --- a/app/scripts/controllers/login.js +++ b/app/scripts/controllers/login.js @@ -7,385 +7,482 @@ * # MainCtrl * Controller of Lineblocs */ -angular.module('Lineblocs') - .controller('LoginCtrl', function($scope, $location, $timeout, $q, Backend, $shared, $state, Idle, $interval, $window) { - $shared.updateTitle("Login"); - $shared.processResult(); - $scope.triedSubmit = false; - $scope.couldNotLogin = false; - $scope.invalideOtp = false; - $scope.noUserFound = false; - $scope.shouldSplash = false; - $scope.isLoading = false; - $scope.challenge = null; - $scope.user = { - email: "", - password: "", - otp:"", - }; - $scope.step = 1; - $scope.countdownDuration = 5; - $scope.resendTimeout = $scope.countdownDuration * 60; - $scope.timerDisplay = padZero(Math.floor($scope.resendTimeout / 60)) + ':' + padZero($scope.resendTimeout % 60); - var clickedGoogSignIn = false; - var countdown; - $scope.selectedTheme = localStorage.getItem("THEME"); - - $scope.theme = { - default: 'styles/app-blue.css', - dark: 'styles/app-grey.css', - light: 'styles/app-cyan.css', - } - - $scope.changeTheme = function(theme){ - $window.localStorage.setItem('THEME', theme); - $scope.selectedTheme = theme; - // Backend.post("/updateSelf", { theme: $scope.selectedTheme }).then(function(res) { - addStyle($scope.theme[theme]); - removeStyle($scope.theme[theme]); - // }); - } - function addStyle(path) { - var link = document.createElement('link'); - link.setAttribute('rel', 'stylesheet'); - link.setAttribute('type', 'text/css'); - link.setAttribute('href', path); - document.head.appendChild(link); - } - - function removeStyle(selectedPath) { - const allLinks = ['styles/app-grey.css', 'styles/app-blue.css', 'styles/app-green.css', 'styles/app-red.css', 'styles/app-purple.css', 'styles/app-cyan.css' ] - const links = document.head.querySelectorAll('link[href]'); - for (var i = 0; i < links.length; i++) { - const path = links[i].getAttribute('href'); - if (!allLinks.includes(path)) continue; - if (path === selectedPath) continue; - document.head.removeChild(links[i]); - } - } - -function startCountdown() { - countdown = $interval(function() { - var minutes = Math.floor($scope.resendTimeout / 60); - var seconds = $scope.resendTimeout - minutes * 60; - $scope.resendTimeout--; - if ($scope.resendTimeout < 0) { - $interval.cancel(countdown); - } - $scope.timerDisplay = padZero(minutes) + ':' + padZero(seconds); - }, 1000); -} - -startCountdown(); -function padZero(number) { - return (number < 10 ? '0' : '') + number; -} -const code = $location.search().code; -if (code) { - fetch('https://appleid.apple.com/auth/token', { - method: 'POST', - headers: { - 'Content-Type': 'application/x-www-form-urlencoded' - }, - body: new URLSearchParams({ - grant_type: 'authorization_code', - code: code, - client_id: $shared.frontend_api_creds.apple_signin_client_id, - client_secret: $shared.frontend_api_creds.apple_signin_client_secret, - redirect_uri: 'https://your-app.com/callback', - }), - }).then(response => response.json()).then(data => { - const loginOption = { - provider : 'apple', - id_token : data.access_token, - access_token: data.access_token, - }; - $scope.startThirdPartyLogin( user.email, user.displayName, '', '', loginOption); - }) - .catch(error => { - // Handle the error - }); -} - -function redirectUser() { - Backend.post("/updateSelf", { theme: $scope.selectedTheme }).then(function(res) { - addStyle($scope.theme[$scope.selectedTheme]); - removeStyle($scope.theme[$scope.selectedTheme]); - }); - Idle.watch(); - var hash = window.location.hash.substr(1); - var query = URI(hash).query(true); - if ( query.next ) { - window.location.replace("#/" + query.next); - return; - } - $state.go('dashboard-user-welcome', {}); -} - function finishLogin(data) { - console.log("finishLogin ", arguments); - $scope.isLoading = false; - $scope.couldNotLogin = false; - $shared.isAdmin = data.isAdmin; - - $shared.setAuthToken(data); - $shared.setWorkspace(data.workspace); - if (!$shared.isAdmin) { - redirectUser(); - return; - } - $shared.isAdmin = true; - $shared.setAdminAuthToken(data.adminWorkspaceToken); - Backend.post("/updateSelf", { theme: $scope.selectedTheme }).then(function(res) { +angular + .module('Lineblocs') + .controller( + 'LoginCtrl', + function ($scope, $location, $timeout, $q, Backend, $shared, $state, Idle, $interval, $window) { + $shared.updateTitle('Login'); + $shared.processResult(); + $scope.triedSubmit = false; + $scope.couldNotLogin = false; + $scope.invalideOtp = false; + $scope.noUserFound = false; + $scope.shouldSplash = false; + $scope.isLoading = false; + $scope.challenge = null; + $scope.user = { + email: '', + password: '', + otp: '', + }; + $scope.step = 1; + $scope.countdownDuration = 5; + $scope.resendTimeout = $scope.countdownDuration * 60; + $scope.timerDisplay = + padZero(Math.floor($scope.resendTimeout / 60)) + ':' + padZero($scope.resendTimeout % 60); + var clickedGoogSignIn = false; + var countdown; + $scope.selectedTheme = localStorage.getItem('THEME'); + + $scope.theme = { + default: 'styles/app-blue.css', + dark: 'styles/app-grey.css', + light: 'styles/app-cyan.css', + }; + + $scope.changeTheme = function (theme) { + $window.localStorage.setItem('THEME', theme); + $scope.selectedTheme = theme; + // Backend.post("/updateSelf", { theme: $scope.selectedTheme }).then(function(res) { + addStyle($scope.theme[theme]); + removeStyle($scope.theme[theme]); + // }); + }; + function addStyle(path) { + var link = document.createElement('link'); + link.setAttribute('rel', 'stylesheet'); + link.setAttribute('type', 'text/css'); + link.setAttribute('href', path); + document.head.appendChild(link); + } + + function removeStyle(selectedPath) { + const allLinks = [ + 'styles/app-grey.css', + 'styles/app-blue.css', + 'styles/app-green.css', + 'styles/app-red.css', + 'styles/app-purple.css', + 'styles/app-cyan.css', + ]; + const links = document.head.querySelectorAll('link[href]'); + for (var i = 0; i < links.length; i++) { + const path = links[i].getAttribute('href'); + if (!allLinks.includes(path)) continue; + if (path === selectedPath) continue; + document.head.removeChild(links[i]); + } + } + + function startCountdown() { + countdown = $interval(function () { + var minutes = Math.floor($scope.resendTimeout / 60); + var seconds = $scope.resendTimeout - minutes * 60; + $scope.resendTimeout--; + if ($scope.resendTimeout < 0) { + $interval.cancel(countdown); + } + $scope.timerDisplay = padZero(minutes) + ':' + padZero(seconds); + }, 1000); + } + + startCountdown(); + function padZero(number) { + return (number < 10 ? '0' : '') + number; + } + const code = $location.search().code; + if (code) { + fetch('https://appleid.apple.com/auth/token', { + method: 'POST', + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + }, + body: new URLSearchParams({ + grant_type: 'authorization_code', + code: code, + client_id: $shared.frontend_api_creds.apple_signin_client_id, + client_secret: $shared.frontend_api_creds.apple_signin_client_secret, + redirect_uri: 'https://your-app.com/callback', + }), + }) + .then((response) => response.json()) + .then((data) => { + const loginOption = { + provider: 'apple', + id_token: data.access_token, + access_token: data.access_token, + }; + $scope.startThirdPartyLogin(user.email, user.displayName, '', '', loginOption); + }) + .catch((error) => { + // Handle the error + }); + } + + function redirectUser() { + Backend.post('/updateSelf', { theme: $scope.selectedTheme }).then(function (res) { + addStyle($scope.theme[$scope.selectedTheme]); + removeStyle($scope.theme[$scope.selectedTheme]); + }); + Idle.watch(); + var hash = window.location.hash.substr(1); + var query = URI(hash).query(true); + if (query.next) { + window.location.replace('#/' + query.next); + return; + } + $state.go('dashboard-user-welcome', {}); + } + function finishLogin(data) { + console.log('finishLogin ', arguments); + $scope.isLoading = false; + $scope.couldNotLogin = false; + $shared.isAdmin = data.isAdmin; + + $shared.setAuthToken(data); + $shared.setWorkspace(data.workspace); + if (!$shared.isAdmin) { + redirectUser(); + return; + } + $shared.isAdmin = true; + $shared.setAdminAuthToken(data.adminWorkspaceToken); + Backend.post('/updateSelf', { theme: $scope.selectedTheme }).then(function (res) { addStyle($scope.theme[theme]); removeStyle($scope.theme[theme]); }); - Backend.get("/admin/getWorkspaces").then(function(res) { - $shared.workspaces = res.data.data; - $state.go('dashboard-user-welcome', {}); - }); - } - - // Apple Login ============================================================== - $scope.loginWithApple = function () { - console.log("loginWithApple", AppleID); - AppleID.auth.signIn(); - } - - - // Microsoft login =========================================================== - $scope.loginWithMicrosoft = function () { - - const msalConfig = { - auth: { - // 'Application (client) ID' of app registration in Azure portal - this value is a GUID - clientId: $shared.frontend_api_creds.msft_signin_client_id || "3a49ca34-f4b5-40b3-a8bc-27ed569d7867", - // Full directory URL, in the form of https://login.microsoftonline.com/ - authority: "https://login.microsoftonline.com/common", - // Full redirect URL, in form of http://localhost:3000 - redirectUri: DEPLOYMENT_DOMAIN, - }, - cache: { - cacheLocation: "sessionStorage", // This configures where your cache will be stored - storeAuthStateInCookie: false, // Set this to "true" if you are having issues on IE11 or Edge - }, - system: { - loggerOptions: { + Backend.get('/admin/getWorkspaces').then(function (res) { + $shared.workspaces = res.data.data; + $state.go('dashboard-user-welcome', {}); + }); + } + + // Apple Login ============================================================== + $scope.loginWithApple = function () { + console.log('loginWithApple', AppleID); + AppleID.auth.signIn(); + }; + + // Microsoft login =========================================================== + $scope.loginWithMicrosoft = function () { + const msalConfig = { + auth: { + // 'Application (client) ID' of app registration in Azure portal - this value is a GUID + clientId: + $shared.frontend_api_creds.msft_signin_client_id || + '3a49ca34-f4b5-40b3-a8bc-27ed569d7867', + // Full directory URL, in the form of https://login.microsoftonline.com/ + authority: 'https://login.microsoftonline.com/common', + // Full redirect URL, in form of http://localhost:3000 + redirectUri: DEPLOYMENT_DOMAIN, + }, + cache: { + cacheLocation: 'sessionStorage', // This configures where your cache will be stored + storeAuthStateInCookie: false, // Set this to "true" if you are having issues on IE11 or Edge + }, + system: { + loggerOptions: { loggerCallback: (level, message, containsPii) => { - console.log("loggerCallback", level); - if (containsPii) { - return; - } - switch (level) { - case msal?.LogLevel?.Error: - console.error(message); - return; - case msal?.LogLevel?.Info: - console.info(message); - return; - case msal?.LogLevel?.Verbose: - console.debug(message); - return; - case msal?.LogLevel?.Warning: - console.warn(message); - return; - } - } + console.log('loggerCallback', level); + if (containsPii) { + return; + } + switch (level) { + case msal?.LogLevel?.Error: + console.error(message); + return; + case msal?.LogLevel?.Info: + console.info(message); + return; + case msal?.LogLevel?.Verbose: + console.debug(message); + return; + case msal?.LogLevel?.Warning: + console.warn(message); + return; + } + }, + }, + }, + }; + + const myMSALObj = new msal.PublicClientApplication(msalConfig); + myMSALObj + .loginPopup({ scopes: ['User.Read'] }) + .then(handleResponse) + .catch((error) => { + console.error(error); + }); + }; + + function handleResponse(response) { + if (response === null) return; + const loginOption = { + provider: 'microsoft', + id_token: response.idToken, + access_token: response.accessToken, + }; + $scope.startThirdPartyLogin( + response.account.userName, + response.account.name, + '', + '', + loginOption + ); + } + + $scope.processLoginVerfication = function (token) { + let errorMsg = ''; + if ($shared.customizations.login_verification === 'cf-turnstile' && !$scope.turnstileToken) { + errorMsg = 'Please complete the CAPTCHA'; + return {error: errorMsg, valid: false}; + } else if ($shared.customizations.login_verification === 'recaptcha') { + // add code for recaptcha verification + } + + return {valid: true}; + } + + $scope.validateEmail = function ($event, loginForm) { + $scope.triedSubmit = true; + + let processedVerification = $scope.processLoginVerfication(); + if (!processedVerification.valid) { + $scope.errorMsg = processedVerification.error; + return; + } + + $scope.errorMsg = ''; + if (!loginForm.$valid) { + $scope.errorMsg = 'Please enter a valid email'; + return; + } + $shared.changingPage = true; + Backend.get('/getUserInfo?email=' + $scope.user.email).then(function (res) { + $shared.changingPage = false; + if (res.data.found) { + $scope.userInfo = res.data.info; + $scope.step = 2; + return; } + $scope.noUserFound = true; + }); + }; + + $scope.validatePassword = function ($event, loginForm) { + if (!loginForm.$valid) { + return; + } + const data = angular.copy($scope.user); + data['challenge'] = $scope.challenge; + $scope.isLoading = true; + Backend.post('/jwt/authenticate', data, true) + .then(function (res) { + if (res.data.enable_2fa === true) { + $scope.requestOtp($event, loginForm); + } else { + finishLogin(res.data); + } + }) + .catch(function () { + $scope.isLoading = false; + $scope.couldNotLogin = true; + }); + }; + + $scope.requestOtp = function ($event) { + $scope.isLoading = true; + $scope.resendTimeout = $scope.countdownDuration * 60; + $scope.timerDisplay = + padZero(Math.floor($scope.resendTimeout / 60)) + ':' + padZero($scope.resendTimeout % 60); + $interval.cancel(countdown); + startCountdown(); + Backend.get('/request2FACode', { + params: { email: $scope.user.email, password: $scope.user.password }, + }) + .then(function (res) { + $scope.isLoading = false; + $scope.step = 3; + }) + .catch(function () { + $scope.step = 3; + $scope.isLoading = false; + $scope.couldNotLogin = true; + }); + }; + + $scope.validateOtp = function ($event, loginForm) { + $scope.triedSubmit = true; + if (!loginForm.$valid) { + return; + } + $scope.isLoading = true; + $scope.invalideOtp = false; + Backend.post('/verify2FACode', { + email: $scope.user.email, + password: $scope.user.password, + '2fa_code': $scope.user.otp, + }) + .then(function (res) { + $scope.isLoading = false; + console.log('res', res); + if (res.data.success) { + finishLogin(res.data); + } else { + $scope.invalideOtp = true; + $scope.$apply(); + } + }) + .catch(function () { + $scope.isLoading = false; + $scope.couldNotLogin = true; + }); + }; + + $scope.requestAssistant = function () { + window.open( + `https://${DEPLOYMENT_DOMAIN}/resources/other-topics/2fa-verification-support`, + '_blank' + ); + }; + + $scope.gotoRegister = function () { + $shared.changingPage = true; + $shared.scrollToTop(); + $state.go('register'); + }; + $scope.gotoForgot = function () { + $shared.changingPage = true; + $shared.scrollToTop(); + $state.go('forgot'); + }; + + $scope.startThirdPartyLogin = function (email, firstname, lastname, avatar, loginOption) { + var data = {}; + data['email'] = email; + data['first_name'] = firstname; + data['last_name'] = lastname; + data['avatar'] = avatar; + data['challenge'] = $scope.challenge; + data['login_option'] = loginOption; + $shared.changingPage = true; + Backend.post('/thirdPartyLogin', data).then(function (res) { + $timeout(function () { + $scope.$apply(); + $shared.scrollToTop(); + + if (res.data.confirmed) { + finishLogin(res.data); + return; + } + $state.go('register', { + hasData: true, + userId: res.data.userId, + authData: { token: res.data.info.token }, + }); + }, 0); + }); + }; + + function renderButton() { + gapi.signin2.render('gSignIn', { + scope: 'profile email', + width: 400, + height: 50, + longtitle: true, + theme: 'dark', + onsuccess: function (googleLoginResponse) { + if (!clickedGoogSignIn) { + return; + } + var profile = googleLoginResponse.getBasicProfile(); + console.log('ID: ' + profile.getId()); // Do not send to your backend! Use an ID token instead. + console.log('Name: ' + profile.getName()); + console.log('Image URL: ' + profile.getImageUrl()); + console.log('Email: ' + profile.getEmail()); // This is null if the 'email' scope is not present. + var ctrl = angular.element('body').scope(); + var fullName = profile.getName().split(' '), + firstName = fullName[0], + lastName = fullName[fullName.length - 1]; + const { id_token, access_token } = googleLoginResponse.getAuthResponse(); + const loginOption = { + provider: 'google', + id_token, + access_token, + }; + $scope.startThirdPartyLogin( + profile.getEmail(), + firstName, + lastName, + profile.getImageUrl(), + loginOption + ); + }, + onerror: function (err) { + console.log('Google signIn2.render button err: ' + err); + }, + onfailure: function () { + console.error('failure ', arguments); + }, + }); } - }; - const myMSALObj = new msal.PublicClientApplication(msalConfig); - myMSALObj.loginPopup({scopes: ["User.Read"]}).then(handleResponse) - .catch(error => { - console.error(error); + $scope.backStep1 = function () { + $scope.step = 1; + }; + $shared.changingPage = false; + angular.element('#gSignIn').on('click', function () { + clickedGoogSignIn = true; }); - } - - function handleResponse(response) { - if (response === null) return; - const loginOption = { - provider : 'microsoft', - id_token : response.idToken, - access_token: response.accessToken, - }; - $scope.startThirdPartyLogin( response.account.userName, response.account.name, '', '', loginOption); - } - - $scope.validateEmail = function($event, loginForm) { - $scope.triedSubmit = true; - if (!loginForm.$valid) { - - $scope.errorMsg = "Please enter a valid email"; - return; - } - $shared.changingPage = true; - Backend.get("/getUserInfo?email=" + $scope.user.email).then(function( res ) { - $shared.changingPage = false; - if ( res.data.found ) { - $scope.userInfo = res.data.info; - $scope.step = 2; - return; - } - $scope.noUserFound = true; - }); - } - - $scope.validatePassword = function($event, loginForm) { - if (!loginForm.$valid) { - return; - } - const data = angular.copy($scope.user); - data['challenge'] = $scope.challenge; - $scope.isLoading = true; - Backend.post("/jwt/authenticate", data, true).then(function (res) { - if (res.data.enable_2fa === true) { - $scope.requestOtp($event, loginForm); - } else { - finishLogin(res.data); + var full = window.location.host; + //window.location.host is subdomain.domain.com + var parts = full.split('.'); + var sub = parts[0]; + var second = sub.split(':'); + if (sub !== 'app' && second[0] !== 'localhost' && parts[1] !== 'ngrok') { + $scope.challenge = sub; } - }).catch(function () { - $scope.isLoading = false; - $scope.couldNotLogin = true; - }) - } - - $scope.requestOtp = function($event) { - $scope.isLoading = true; - $scope.resendTimeout = $scope.countdownDuration * 60; - $scope.timerDisplay = padZero(Math.floor($scope.resendTimeout / 60)) + ':' + padZero($scope.resendTimeout % 60); - $interval.cancel(countdown); - startCountdown(); - Backend.get("/request2FACode", {params: {email: $scope.user.email, password: $scope.user.password}}).then(function( res ) { - $scope.isLoading = false; - $scope.step = 3; - }).catch(function() { - $scope.step = 3; - $scope.isLoading = false; - $scope.couldNotLogin = true; - }) - } - - $scope.validateOtp = function ($event, loginForm) { - $scope.triedSubmit = true; - if (!loginForm.$valid) { - return; - } - $scope.isLoading = true; - $scope.invalideOtp = false; - Backend.post("/verify2FACode", { - "email": $scope.user.email, - "password": $scope.user.password, - "2fa_code": $scope.user.otp - }).then(function( res ) { - $scope.isLoading = false; - console.log("res", res); - if (res.data.success) { - finishLogin(res.data); - } else { - $scope.invalideOtp = true; - $scope.$apply(); + + $scope.turnstileToken = null; + $scope.turnstileWidgetId = null; + + function renderTurnstile() { + // wait until cloudflare script loads + if (!window.turnstile) { + setTimeout(renderTurnstile, 300); + return; + } + + $scope.turnstileWidgetId = window.turnstile.render( + document.getElementById('turnstile-container'), + { + sitekey: $shared.frontend_api_creds.cloudflare_turnstile_site_key, + callback: function (token) { + // IMPORTANT: tell angular value changed + $scope.$apply(function () { + $scope.turnstileToken = token; + }); + }, + } + ); } - }).catch(function() { - $scope.isLoading = false; - $scope.couldNotLogin = true; - }) - } - - $scope.requestAssistant = function() { - window.open(`https://${DEPLOYMENT_DOMAIN}/resources/other-topics/2fa-verification-support`, '_blank'); - } - - $scope.gotoRegister = function() { - $shared.changingPage = true; - $shared.scrollToTop(); - $state.go('register'); - } - $scope.gotoForgot = function() { - $shared.changingPage = true; - $shared.scrollToTop(); - $state.go('forgot'); - } - - $scope.startThirdPartyLogin = function(email, firstname, lastname, avatar, loginOption) { - var data = {}; - data['email'] = email; - data['first_name'] = firstname; - data['last_name'] = lastname; - data['avatar'] = avatar; - data['challenge'] = $scope.challenge; - data['login_option'] = loginOption; - $shared.changingPage = true; - Backend.post("/thirdPartyLogin", data).then(function( res ) { - $timeout(function() { - $scope.$apply(); - $shared.scrollToTop(); - - if ( res.data.confirmed ) { - finishLogin(res.data); - return; - } - $state.go('register', { - "hasData": true, - "userId": res.data.userId, - "authData": {"token": res.data.info.token} - }); - }, 0); - }); - } - - function renderButton() { - gapi.signin2.render('gSignIn', { - 'scope': 'profile email', - 'width': 400, - 'height': 50, - 'longtitle': true, - 'theme': 'dark', - 'onsuccess': function(googleLoginResponse) { - if (!clickedGoogSignIn) { - return; - } - var profile = googleLoginResponse.getBasicProfile(); - console.log('ID: ' + profile.getId()); // Do not send to your backend! Use an ID token instead. - console.log('Name: ' + profile.getName()); - console.log('Image URL: ' + profile.getImageUrl()); - console.log('Email: ' + profile.getEmail()); // This is null if the 'email' scope is not present. - var ctrl= angular.element("body").scope(); - var fullName = profile.getName().split(' '), - firstName = fullName[0], - lastName = fullName[fullName.length - 1]; - const { id_token, access_token } = googleLoginResponse.getAuthResponse(); - const loginOption = { - provider: 'google', - id_token, - access_token, + + $timeout(function () { + $shared.waitUntilLoaded().then(function () { + if ($shared.customizations.login_verification === 'cf-turnstile') { + renderTurnstile(); + } + + renderButton(); + }); + }, 0); + + function resetTurnstile() { + if ($scope.turnstileWidgetId && window.turnstile) { + window.turnstile.reset($scope.turnstileWidgetId); + $scope.turnstileToken = null; } - $scope.startThirdPartyLogin( profile.getEmail(), firstName, lastName, profile.getImageUrl(), loginOption); - }, - onerror: function(err) { - console.log('Google signIn2.render button err: ' + err) - }, - 'onfailure': function() { - console.error("failure ", arguments); - } - }); + } } - - $scope.backStep1 = function() { - $scope.step = 1; - } - $shared.changingPage = false; - angular.element("#gSignIn").on("click", function() { - clickedGoogSignIn = true; - }); - var full = window.location.host - //window.location.host is subdomain.domain.com - var parts = full.split('.') - var sub = parts[0] - var second = sub.split(":"); - if (sub !== 'app' && second[0] !== 'localhost' && parts[1] !== 'ngrok') { - $scope.challenge = sub; - } - $timeout(function() { - renderButton(); - }, 0); - }); + ); diff --git a/app/scripts/main.js b/app/scripts/main.js index 075466c..6bba5f6 100644 --- a/app/scripts/main.js +++ b/app/scripts/main.js @@ -166,7 +166,7 @@ window.addEventListener('message', function(e) { } }); angular -.module('Lineblocs', [ + .module('Lineblocs', [ 'ui.router', 'ngAnimate', 'ngMaterial', @@ -174,725 +174,774 @@ angular 'pascalprecht.translate', 'md.data.table', 'ngIdle', - 'ngclipboard' - ]) - .service('JWTHttpInterceptor', function() { - return { - // optional method - 'request': function(config) { - // do something on success - var token = localStorage.getItem("AUTH"); - if (token) { - config.headers['Authorization'] = getJWTToken(); - } - var workspace = localStorage.getItem("WORKSPACE"); - if (workspace) { - config.headers['X-Workspace-ID'] = getWorkspaceID(); - } - var adminToken = localStorage.getItem("ADMIN_TOKEN"); - if (adminToken) { - config.headers['X-Admin-Token'] = adminToken; - } + 'ngclipboard', + ]) + .service('JWTHttpInterceptor', function () { + return { + // optional method + request: function (config) { + // do something on success + var token = localStorage.getItem('AUTH'); + if (token) { + config.headers['Authorization'] = getJWTToken(); + } + var workspace = localStorage.getItem('WORKSPACE'); + if (workspace) { + config.headers['X-Workspace-ID'] = getWorkspaceID(); + } + var adminToken = localStorage.getItem('ADMIN_TOKEN'); + if (adminToken) { + config.headers['X-Admin-Token'] = adminToken; + } - return config; - } - }; - }) - .factory("$shared", function($state, $mdDialog, $timeout, $q, $window, $location, $mdToast, ThemeService) { - var factory = this; - var baseTitle = createBaseTitle(); - factory.tempStopErrors = false; - factory.selectedAdminWorkspace = null; - factory.initialLoaded = false; - factory.title = baseTitle; - factory.FLOW_EDITOR_URL = getEditorPath(); - factory.SHOW_NAVBAR = true; - factory.PAGE_CONTENT_NO_PADDING = false; - factory.isLoading = true; - factory.currentWorkspace = ""; - factory.billingCountries = []; - factory.ranges = [ - "/8", - "/16", - "/24", - "/32" - ]; - factory.acSearch = { - isDisabled: false, - noCache:true, - selectedItem: null, - }; - factory.billingPackages = ['gold', 'silver', 'bronze']; - factory.customizations = null; - var flickerTimeout = 0; + return config; + }, + }; + }) + .factory( + '$shared', + function ($state, $mdDialog, $timeout, $q, $window, $location, $mdToast, ThemeService) { + var factory = this; + var baseTitle = createBaseTitle(); + factory.tempStopErrors = false; + factory.selectedAdminWorkspace = null; + factory.initialLoaded = false; + factory.title = baseTitle; + factory.FLOW_EDITOR_URL = getEditorPath(); + factory.SHOW_NAVBAR = true; + factory.PAGE_CONTENT_NO_PADDING = false; + factory.isLoading = true; + factory.currentWorkspace = ''; + factory.billingCountries = []; + factory.ranges = ['/8', '/16', '/24', '/32']; + factory.acSearch = { + isDisabled: false, + noCache: true, + selectedItem: null, + }; + factory.billingPackages = ['gold', 'silver', 'bronze']; + factory.customizations = null; + var flickerTimeout = 0; - function searchModule(text, state, tags, stateParams, perms, setting) - { + function searchModule(text, state, tags, stateParams, perms, setting) { tags = tags || []; - stateParams= stateParams || {}; + stateParams = stateParams || {}; perms = perms || []; setting = setting || null; return { - display: text, - state: state, - tags: tags, - stateParams: stateParams, - perms: perms, - setting: setting - } - } - var modules = [ -searchModule("Blocked Numbers", "settings-blocked-numbers", ['blocked', 'numbers']), -//searchModule("Add Blocked Number", "settings-blocked-numbers-create", ['add', 'blocked', 'number']), -searchModule("IP Whitelist", "settings-ip-whitelist", ['ip', 'whitelist']), -searchModule("API Settings", "settings-workspace-api-settings", ['api']), -searchModule("Workspace Users", "settings-workspace-users", ['workspace', 'users'], [], ['manage_users']), -searchModule("Workspace Params", "settings-workspace-params", ['workspace', 'params']), -searchModule("Add Workspace User", "settings-workspace-users-create", ['add', 'workspace', 'user']), -searchModule("Extension Codes", "settings-extension-codes", ['extension', 'codes']), -searchModule("Media Files", "files", ['media', 'files', 'media files']), -searchModule("Phones", "phones-phones", ['provision', 'phones'], [], ['manage_phones']), -searchModule("Add Phone", "phones-phone-create", ['add', 'phone'], [], ['manage_phones']), -searchModule("Phones Groups", "phones-groups", ['phones', 'groups'], [], ['manage_phonegroups']), -searchModule("Add Phone Group", "phones-groups-create", ['add', 'group'], [], ['create_phonegroup']), -searchModule("Phone Global Templates", "phones-global-settings", ['phones', 'global', 'templates'], [], ['manage_phoneglobalsettings']), -searchModule("Phone Individual Settings", "phones-individual-settings", ['phones', 'individual', 'settings'],[], ['manage_phoneindividualsetting']), -searchModule("Deploy Phone Config", "phones-deploy-config", ['provision', 'phone', 'config', 'deploy'], [], ['manage_phones']), -searchModule("My Numbers", "my-numbers", ['my', 'numbers'], [], ['manage_dids']), -searchModule("Buy Numbers", "buy-numbers", ['buy', 'numbers'], [], ['manage_dids']), -searchModule("Port-In Requests", "ports", ['port', 'requests', 'port in', 'dids'], [], ['manage_ports']), -searchModule("Create Port Request", "port-create", ['port', 'create', 'dids'], [], ['manage_ports']), -searchModule("Flows", "flows", ['flows', 'flow editor'], [], ['manage_flows']), -searchModule("Flow Editor", "flow-editor", ['flow editor'], {"flowId": "new"}, ['create_flow']), -searchModule("Extensions", "extensions", ['extensions'],[], ['manage_extensions']), -searchModule('Add Extension', "extension-create", ['add', 'extension'], [], ['create_extensions']), -searchModule("Logs", "debugger-logs", ['debugger logs', 'logs', 'debugger']), -searchModule("Calls", "calls", ['calls'], [], ['manage_calls']), -searchModule("Recordings", "recordings", ['recordings'], [], ['manage_recordings']), -searchModule("Faxes", "faxes", ['fax', 'faxes']), -searchModule("Billing", "billing", ['billing', 'add card', 'cards', 'settings'], [], ['manage_billing']), -searchModule("BYO Carriers", "byo-carriers", ['byo', 'carriers'], [], ['manage_byo_carriers'], 'bring_carrier'), -searchModule("BYO DID Numbers", "byo-did-numbers", ['byo', 'did numbers', 'did', 'numbers'], [], ['manage_byo_did_numbers'], 'bring_carrier'), -searchModule("Support", "support", ['support'], [], ['support']), - ]; - - factory.centsToDollars = function(cents, addDollarSign) { - addDollarSign = addDollarSign||false; + display: text, + state: state, + tags: tags, + stateParams: stateParams, + perms: perms, + setting: setting, + }; + } + var modules = [ + searchModule('Blocked Numbers', 'settings-blocked-numbers', ['blocked', 'numbers']), + //searchModule("Add Blocked Number", "settings-blocked-numbers-create", ['add', 'blocked', 'number']), + searchModule('IP Whitelist', 'settings-ip-whitelist', ['ip', 'whitelist']), + searchModule('API Settings', 'settings-workspace-api-settings', ['api']), + searchModule( + 'Workspace Users', + 'settings-workspace-users', + ['workspace', 'users'], + [], + ['manage_users'] + ), + searchModule('Workspace Params', 'settings-workspace-params', ['workspace', 'params']), + searchModule('Add Workspace User', 'settings-workspace-users-create', [ + 'add', + 'workspace', + 'user', + ]), + searchModule('Extension Codes', 'settings-extension-codes', ['extension', 'codes']), + searchModule('Media Files', 'files', ['media', 'files', 'media files']), + searchModule('Phones', 'phones-phones', ['provision', 'phones'], [], ['manage_phones']), + searchModule('Add Phone', 'phones-phone-create', ['add', 'phone'], [], ['manage_phones']), + searchModule( + 'Phones Groups', + 'phones-groups', + ['phones', 'groups'], + [], + ['manage_phonegroups'] + ), + searchModule( + 'Add Phone Group', + 'phones-groups-create', + ['add', 'group'], + [], + ['create_phonegroup'] + ), + searchModule( + 'Phone Global Templates', + 'phones-global-settings', + ['phones', 'global', 'templates'], + [], + ['manage_phoneglobalsettings'] + ), + searchModule( + 'Phone Individual Settings', + 'phones-individual-settings', + ['phones', 'individual', 'settings'], + [], + ['manage_phoneindividualsetting'] + ), + searchModule( + 'Deploy Phone Config', + 'phones-deploy-config', + ['provision', 'phone', 'config', 'deploy'], + [], + ['manage_phones'] + ), + searchModule('My Numbers', 'my-numbers', ['my', 'numbers'], [], ['manage_dids']), + searchModule('Buy Numbers', 'buy-numbers', ['buy', 'numbers'], [], ['manage_dids']), + searchModule( + 'Port-In Requests', + 'ports', + ['port', 'requests', 'port in', 'dids'], + [], + ['manage_ports'] + ), + searchModule( + 'Create Port Request', + 'port-create', + ['port', 'create', 'dids'], + [], + ['manage_ports'] + ), + searchModule('Flows', 'flows', ['flows', 'flow editor'], [], ['manage_flows']), + searchModule('Flow Editor', 'flow-editor', ['flow editor'], { flowId: 'new' }, [ + 'create_flow', + ]), + searchModule('Extensions', 'extensions', ['extensions'], [], ['manage_extensions']), + searchModule( + 'Add Extension', + 'extension-create', + ['add', 'extension'], + [], + ['create_extensions'] + ), + searchModule('Logs', 'debugger-logs', ['debugger logs', 'logs', 'debugger']), + searchModule('Calls', 'calls', ['calls'], [], ['manage_calls']), + searchModule('Recordings', 'recordings', ['recordings'], [], ['manage_recordings']), + searchModule('Faxes', 'faxes', ['fax', 'faxes']), + searchModule( + 'Billing', + 'billing', + ['billing', 'add card', 'cards', 'settings'], + [], + ['manage_billing'] + ), + searchModule( + 'BYO Carriers', + 'byo-carriers', + ['byo', 'carriers'], + [], + ['manage_byo_carriers'], + 'bring_carrier' + ), + searchModule( + 'BYO DID Numbers', + 'byo-did-numbers', + ['byo', 'did numbers', 'did', 'numbers'], + [], + ['manage_byo_did_numbers'], + 'bring_carrier' + ), + searchModule('Support', 'support', ['support'], [], ['support']), + ]; + + factory.centsToDollars = function (cents, addDollarSign) { + addDollarSign = addDollarSign || false; // Convert to dollars and ensure 2 decimal places const dollars = (cents / 100).toFixed(2); // Return with or without dollar sign based on parameter return addDollarSign ? `$${dollars}` : dollars; - } - factory.isSectionActive = function(area) { - var current = factory.state.name; - var maps = { - 'my-numbers': [ - 'my-numbers', - 'my-numbers-edit', - ], - 'buy-numbers': [ - 'buy-numbers', - 'buy-numbers-select', - ], - 'buy-numbers': [ - 'buy-numbers', - 'buy-numbers-select', - ], - 'ports': [ - 'port-create', - 'port-edit', - ], - 'flows': [ - 'flows', - 'flow-editor' - ], - 'flows': [ - 'flows', - 'flow-editor' - ], - 'extensions': [ - 'extensions', - 'extension-create', - 'extension-edit' - ], - 'recordings': [ - 'recordings' - ], - 'faxes': [ - 'faxes' - ], - 'files': [ - 'files' - ], - 'settings-workspace-users': [ - 'settings-workspace-users', - 'settings-workspace-users-create', - 'settings-workspace-users-edit', - 'settings-workspace-users-assign', - ], - 'billing': [ - 'billing', - 'billing-add-card', - 'billing-upgrade-submit', - 'billing-upgrade-complete', - 'billing-upgrade-plan', - 'cancel-subscription' - ], - 'support': [ - 'support', - ], - - } - var item = maps[area]; - if ( item && item.includes( current ) ) { - return true; - } - } - factory.getDomain = function() { - return DEPLOYMENT_DOMAIN; - } - - - factory.getHomeLink = function() { - return "https://" + DEPLOYMENT_DOMAIN + "/"; - } - - factory.getAppPortalDomain = function(workspace, suffixOnly) { - suffixOnly = suffixOnly||true; - var domain = "app." + DEPLOYMENT_DOMAIN; - if ( workspace ) { - domain = workspace + ".app." + DEPLOYMENT_DOMAIN; - if ( suffixOnly ) { - domain = "app." + DEPLOYMENT_DOMAIN; - } + }; + factory.isSectionActive = function (area) { + var current = factory.state.name; + var maps = { + 'my-numbers': ['my-numbers', 'my-numbers-edit'], + 'buy-numbers': ['buy-numbers', 'buy-numbers-select'], + 'buy-numbers': ['buy-numbers', 'buy-numbers-select'], + ports: ['port-create', 'port-edit'], + flows: ['flows', 'flow-editor'], + flows: ['flows', 'flow-editor'], + extensions: ['extensions', 'extension-create', 'extension-edit'], + recordings: ['recordings'], + faxes: ['faxes'], + files: ['files'], + 'settings-workspace-users': [ + 'settings-workspace-users', + 'settings-workspace-users-create', + 'settings-workspace-users-edit', + 'settings-workspace-users-assign', + ], + billing: [ + 'billing', + 'billing-add-card', + 'billing-upgrade-submit', + 'billing-upgrade-complete', + 'billing-upgrade-plan', + 'cancel-subscription', + ], + support: ['support'], + }; + var item = maps[area]; + if (item && item.includes(current)) { + return true; + } + }; + factory.getDomain = function () { + return DEPLOYMENT_DOMAIN; + }; + + factory.getHomeLink = function () { + return 'https://' + DEPLOYMENT_DOMAIN + '/'; + }; + + factory.getAppPortalDomain = function (workspace, suffixOnly) { + suffixOnly = suffixOnly || true; + var domain = 'app.' + DEPLOYMENT_DOMAIN; + if (workspace) { + domain = workspace + '.app.' + DEPLOYMENT_DOMAIN; + if (suffixOnly) { + domain = 'app.' + DEPLOYMENT_DOMAIN; + } } return domain; - } - factory.getEditorResource = function(path) { - return getEditorPath() + "/" + path; - } - factory.createDomainLink = function(path) { - return factory.getHomeLink() + path; - } - factory.getAppLogo = function() { + }; + factory.getEditorResource = function (path) { + return getEditorPath() + '/' + path; + }; + factory.createDomainLink = function (path) { + return factory.getHomeLink() + path; + }; + factory.getAppLogo = function () { var logo = factory.customizations['app_logo']; - if ( !logo || logo === '' ) { - return '/images/new-logo-blue.png'; + if (!logo || logo === '') { + return '/images/new-logo-blue.png'; } - return getBaseUrl() + "/assets/img/" + logo; - } - factory.getAppIcon = function() { + return getBaseUrl() + '/assets/img/' + logo; + }; + factory.getAppIcon = function () { var icon = factory.customizations['app_icon']; - console.log('loading icon ', icon) + console.log('loading icon ', icon); - if ( !icon || icon === '' ) { - return '/images/logo-icon-white.png'; + if (!icon || icon === '') { + return '/images/logo-icon-white.png'; } - return getBaseUrl() + "/assets/img/" + icon; - } - factory.getAltAppLogo = function() { + return getBaseUrl() + '/assets/img/' + icon; + }; + factory.getAltAppLogo = function () { if (!factory.customizations) { - return ''; + return ''; } var logo = factory.customizations['alt_app_logo']; - if ( !logo || logo === '' ) { - return '/images/new-logo-blue.png'; + if (!logo || logo === '') { + return '/images/new-logo-blue.png'; } - return getBaseUrl() + "/assets/img/" + logo; - - } - factory.createCardLabel = function(card) { - return "**** **** **** " + card.last_4; - } - - factory.getCurrentTheme = function() { - var theme = localStorage.getItem("THEME"); - if ( !theme ) { - theme = "default"; + return getBaseUrl() + '/assets/img/' + logo; + }; + factory.createCardLabel = function (card) { + return '**** **** **** ' + card.last_4; + }; + + factory.getCurrentTheme = function () { + var theme = localStorage.getItem('THEME'); + if (!theme) { + theme = 'default'; } return theme; - } - factory.getCardImg = function(card) { - console.log("getCardImg ", card); - return '/images/cards/' + card.issuer + '.png' - } - factory.isInLoadingState = function() { - var check = factory.isLoading || factory.isCreateLoading; - console.log("checked loading: ", check); - return check; - } - factory.hasAuth = function() { - var token = localStorage.getItem("AUTH"); - return token; - } + }; + factory.getCardImg = function (card) { + console.log('getCardImg ', card); + return '/images/cards/' + card.issuer + '.png'; + }; + factory.isInLoadingState = function () { + var check = factory.isLoading || factory.isCreateLoading; + console.log('checked loading: ', check); + return check; + }; + factory.hasAuth = function () { + var token = localStorage.getItem('AUTH'); + return token; + }; + + factory.cancelForm = function () { + $window.history.back(); + }; + + factory.navigateDashboard = function () { + $state.go('dashboard', {}); + }; + factory.changeAdminWorkspace = function (workspace) { + console.log('changeAdminWorkspace ', workspace); + factory.setWorkspace(workspace); + $state.reload(); + }; + factory.changeAdminWorkspace2 = function (workspace) { + console.log('changeAdminWorkspace ', workspace); + factory.setWorkspace(workspace); + }; + + factory.getWorkspace = function () { + return getWorkspace(); + }; - factory.cancelForm = function() { - $window.history.back(); + factory.isSettingEnabled = function (option) { + if (factory.planInfo) { + if (factory.planInfo[option]) { + return true; + } + } + return false; + }; + factory.hasPermission = function (option) { + console.log('hasPermission', option); + if (factory.workspaceInfo) { + if (factory.workspaceInfo.user_info[option]) { + return true; + } } + return false; + }; + factory.planName = function (option) { + var workspace = getWorkspace(); + return workspace.plan; + }; - factory.navigateDashboard = function(){ - $state.go('dashboard', {}); + factory.deleteAllChecked = function (module, items) { + var checked = items.filter(function (item) { + return item.checked; + }); + console.log('checked items are ', checked); + if (checked.length === 0) { + factory.showMsg('Error', 'Please select one or more items to delete'); + return; } - factory.changeAdminWorkspace = function(workspace) { - console.log("changeAdminWorkspace ", workspace); - factory.setWorkspace( workspace ); - $state.reload(); - } - factory.changeAdminWorkspace2 = function(workspace) { - console.log("changeAdminWorkspace ", workspace); - factory.setWorkspace( workspace ); - } - - factory.getWorkspace = function() { - return getWorkspace(); - } - - factory.isSettingEnabled = function(option) { - - if ( factory.planInfo ) { - if ( factory.planInfo[ option ] ) { - return true; - } - } - return false; - } - factory.hasPermission = function(option) { - console.log("hasPermission", option); - if ( factory.workspaceInfo ) { - if ( factory.workspaceInfo.user_info[option] ) { - return true; - } - } - return false; - } - factory.planName = function(option) { - var workspace = getWorkspace(); - return workspace.plan; - } - - factory.deleteAllChecked = function(module, items) { - var checked = items.filter(function(item) { - return item.checked; - }); - console.log("checked items are ", checked); -if (checked.length === 0) { - factory.showMsg("Error", "Please select one or more items to delete"); - return; - } - var confirm = $mdDialog.confirm() + var confirm = $mdDialog + .confirm() .title('Are you sure you want to delete all these items?') .ariaLabel('Confirm') .ok('Yes') .cancel('No'); - $mdDialog.show(confirm).then(function() { - factory.isLoading = true; - var data = { - "module": module, - "items": checked - }; - Backend.post("/deleteAll", data).then(function() { - console.log("deleted successfully.."); - }) + $mdDialog.show(confirm).then(function () { + factory.isLoading = true; + var data = { + module: module, + items: checked, + }; + Backend.post('/deleteAll', data).then(function () { + console.log('deleted successfully..'); + }); }); - } + }; + factory.refreshPage = function () { + factory.isLoading = true; + $state.reload(); + factory.isLoading = false; + }; - factory.cleanWorkspaceName = function(name) { -var changed = name.toLowerCase(); -changed = changed.replace(/[^a-z0-9\-]/g, ""); -return changed; -} - factory.querySearch = function(query) { - console.log("querySearch query is: " + query); - return $q(function(resolve, reject) { - var regexp = new RegExp(".*" + query.toLowerCase() + ".*"); - var results = []; - angular.forEach(modules, function(module) { - - console.log("searching on " + module.display + " agaisnt " + query); - var hasPerms = true; - - - var perms = module.perms; - console.log("checking perms ", perms); - angular.forEach(perms, function(perm) { - if (!factory.hasPermission(perm)) { - hasPerms = false; - } - }); - if (!hasPerms) { - return; - } + factory.isListViewPages = function () { + var name = $state.current.name || $state.name || ''; + return ['calls', 'debugger-logs', 'extensions'].some((sub) => name.includes(sub)); + }; - //check for setting - var setting = module.setting; - if (setting !== null && !factory.isSettingEnabled(setting)) { - return false; - } - var matched = module.display.toLowerCase().match( regexp ); - if ( matched ) { - results.push(module); - } + factory.waitUntilLoaded = function () { + return new Promise((resolve) => { + if (factory.customizations) { + return resolve(); + } + const startTime = Date.now(); + const checkInterval = setInterval(() => { + if (factory.customizations) { + clearInterval(checkInterval); + resolve(); + } else if (Date.now() - startTime > 15000) { + clearInterval(checkInterval); + resolve(); + } + }, 100); + }); + } + factory.cleanWorkspaceName = function (name) { + var changed = name.toLowerCase(); + changed = changed.replace(/[^a-z0-9\-]/g, ''); + return changed; + }; + factory.querySearch = function (query) { + console.log('querySearch query is: ' + query); + return $q(function (resolve, reject) { + var regexp = new RegExp('.*' + query.toLowerCase() + '.*'); + var results = []; + angular.forEach(modules, function (module) { + console.log('searching on ' + module.display + ' agaisnt ' + query); + var hasPerms = true; + + var perms = module.perms; + console.log('checking perms ', perms); + angular.forEach(perms, function (perm) { + if (!factory.hasPermission(perm)) { + hasPerms = false; + } }); - //tag search - angular.forEach(modules, function(module) { - if (results.indexOf(module)>-1) { - return; - } + if (!hasPerms) { + return; + } - var hasPerms = true; + //check for setting + var setting = module.setting; + if (setting !== null && !factory.isSettingEnabled(setting)) { + return false; + } + var matched = module.display.toLowerCase().match(regexp); + if (matched) { + results.push(module); + } + }); + //tag search + angular.forEach(modules, function (module) { + if (results.indexOf(module) > -1) { + return; + } + var hasPerms = true; - var perms = module.perms; - console.log("checking perms ", perms); - angular.forEach(perms, function(perm) { - if (!factory.hasPermission(perm)) { - hasPerms = false; - } - }); - if (!hasPerms) { - return; - } + var perms = module.perms; + console.log('checking perms ', perms); + angular.forEach(perms, function (perm) { + if (!factory.hasPermission(perm)) { + hasPerms = false; + } + }); + if (!hasPerms) { + return; + } - //check for setting - var setting = module.setting; - if (setting !== null && !factory.isSettingEnabled(setting)) { - return false; - } - angular.forEach(module.tags, function(tag) { - console.log("searching on " + tag + " agaisnt " + query); - var matched = tag.toLowerCase().match( regexp ); - if ( matched ) { - results.push(module); - } - }); + //check for setting + var setting = module.setting; + if (setting !== null && !factory.isSettingEnabled(setting)) { + return false; + } + angular.forEach(module.tags, function (tag) { + console.log('searching on ' + tag + ' agaisnt ' + query); + var matched = tag.toLowerCase().match(regexp); + if (matched) { + results.push(module); + } }); + }); - return resolve(results); + return resolve(results); }); - } - factory.searchTextChange = function(text) { - console.log("searchTextChange"); - } - factory.selectedItemChange = function(item) { - console.log('Item changed to ' + JSON.stringify(item)); - if (item && item.ui_identifier) $state.go(item.ui_identifier, {}); - } - - factory.showToast = function(msg, position, delayMs) { - delayMs = delayMs||3000; - var position = position || "top right"; - $mdToast.show( - $mdToast.simple() - .textContent(msg) - .position(position) - .hideDelay(delayMs) - ); - } - + }; + factory.searchTextChange = function (text) { + console.log('searchTextChange'); + }; + factory.selectedItemChange = function (item) { + console.log('Item changed to ' + JSON.stringify(item)); + if (item && item.ui_identifier) $state.go(item.ui_identifier, {}); + }; + factory.showToast = function (msg, position, delayMs) { + delayMs = delayMs || 3000; + var position = position || 'top right'; + $mdToast.show($mdToast.simple().textContent(msg).position(position).hideDelay(delayMs)); + }; - factory.endIsLoading = function() { - return $q(function(resolve, reject) { - $timeout(function() { + factory.endIsLoading = function () { + return $q(function (resolve, reject) { + $timeout(function () { factory.isLoading = false; resolve(); - }, flickerTimeout); - }); - } - factory.endIsCreateLoading = function() { - return $q(function(resolve, reject) { - $timeout(function() { + }, flickerTimeout); + }); + }; + factory.endIsCreateLoading = function () { + return $q(function (resolve, reject) { + $timeout(function () { factory.isCreateLoading = false; resolve(); - }, flickerTimeout); - }); - } - factory.nullIfEmpty = function(value) { - if ( !value || value === "" ) { - return null; - } - return value; - } - factory.scrollToTop = function() { - $window.scrollTo(0, 0); - } - factory.completeChangeRoute = function(route, params, other) { - $state.go(route, params, other); - $timeout(function() { - var scope = angular.element(document.getElementById('scopeCtrl')).scope(); - scope.$apply() - }, 0); - - } - factory.changeRoute = function(route, params, force, createLoad) { - console.log("changeRoute called ", arguments); - force = force || false; - createLoad = createLoad || false; - var params = params || {}; - var except = ['flow-editor']; - if ((factory.state && factory.state.name === route) && !force) { - return; - } - if ( factory.state.name === 'flow-editor' ) { - var flowEditorFrame = document.getElementById('flowEditorFrame'); - factory.isLoading = false; - - // check if all changes are saved before exiting - if ( flowEditorFrame ) { - flowEditorFrame.contentWindow.postMessage('check', '*'); - factory.pendingRouteData = { - route: route, - params: params - }; - return; - } - } - - if (!except.includes(route)) { - if ( createLoad ) { - factory.isCreateLoading = true; - } else { - factory.isLoading = true; - } - } - factory.completeChangeRoute(route, params, {"reload": false}); - } - factory.collapseNavbar = function() { - factory.SHOW_NAVBAR = false; - factory.PAGE_CONTENT_NO_PADDING = true; - factory.COLLAPSED_MODE = false; - $( '.c-hamburger' ).removeClass('is-active'); - $('body').removeClass('extended'); - } - factory.collapseNavbarPadding = function() { - factory.SHOW_NAVBAR = true; - factory.PAGE_CONTENT_NO_PADDING = false; - factory.COLLAPSED_MODE = true; - $( '.c-hamburger' ).removeClass('is-active'); - $('body').removeClass('extended'); - } - - factory.processResult = function() { - var params = $location.search(); - if (params['result'] && params['result'] === 'email-verified') { - $mdToast.show( - $mdToast.simple() - .textContent('Email was verified') - .position("top right") - .hideDelay(3000) - ); - } - } - factory.showNavbar = function() { - factory.SHOW_NAVBAR = true; - factory.PAGE_CONTENT_NO_PADDING = false; - factory.COLLAPSED_MODE = false; - $( '.c-hamburger' ).addClass('is-active'); - $('body').addClass('extended'); - } - factory.doLogout = function() { - factory.purgeSession(); - var theme = $window.localStorage.THEME; - localStorage.clear(); - $window.localStorage.setItem('THEME', theme); - ThemeService.addStyle("styles/app-blue.css"); - $state.go('login', {}); - } - factory.setAuthToken = function(token) { - localStorage.setItem("AUTH", JSON.stringify(token)); - } - factory.setAdminAuthToken = function(token) { - localStorage.setItem("ADMIN_TOKEN", token); - } - factory.getAuthToken = function() { - return JSON.parse(localStorage.getItem("AUTH")); - } - factory.setWorkspace= function(workspace) { - localStorage.setItem("WORKSPACE", JSON.stringify(workspace)); - } - factory.getWorkspace = function(workspace) { - return JSON.parse(localStorage.getItem("WORKSPACE")); - } - factory.purgeSession = function() { - localStorage.removeItem("WORKSPACE"); - localStorage.removeItem("AUTH"); - localStorage.removeItem("ADMIN_TOKEN"); + }, flickerTimeout); + }); + }; + factory.nullIfEmpty = function (value) { + if (!value || value === '') { + return null; } - factory.canPerformAction = function(action) { - var workspace = factory.getWorkspace(); - if (workspace && workspace.user_info && workspace.user_info[action]) { - return true; - } - return false; + return value; + }; + factory.scrollToTop = function () { + $window.scrollTo(0, 0); + }; + factory.completeChangeRoute = function (route, params, other) { + $state.go(route, params, other); + $timeout(function () { + var scope = angular.element(document.getElementById('scopeCtrl')).scope(); + scope.$apply(); + }, 0); + }; + factory.changeRoute = function (route, params, force, createLoad) { + console.log('changeRoute called ', arguments); + force = force || false; + createLoad = createLoad || false; + var params = params || {}; + var except = ['flow-editor']; + if (factory.state && factory.state.name === route && !force) { + return; } - factory.has = function() { - return JSON.parse(localStorage.getItem("WORKSPACE")); + if (factory.state.name === 'flow-editor') { + var flowEditorFrame = document.getElementById('flowEditorFrame'); + factory.isLoading = false; + + // check if all changes are saved before exiting + if (flowEditorFrame) { + flowEditorFrame.contentWindow.postMessage('check', '*'); + factory.pendingRouteData = { + route: route, + params: params, + }; + return; + } } - factory.showMsg = function(title, msg) { - factory.changingPage = false; - factory.endIsCreateLoading(); - factory.endIsLoading(); - return $mdDialog.show( - $mdDialog.alert() - .parent(angular.element(document.querySelector('#popupContainer'))) - .clickOutsideToClose(true) - .title(title) - .textContent(msg) - .ariaLabel(title) - .ok('Ok') - ); + if (!except.includes(route)) { + if (createLoad) { + factory.isCreateLoading = true; + } else { + factory.isLoading = true; + } } + factory.completeChangeRoute(route, params, { reload: false }); + }; + factory.collapseNavbar = function () { + factory.SHOW_NAVBAR = false; + factory.PAGE_CONTENT_NO_PADDING = true; + factory.COLLAPSED_MODE = false; + $('.c-hamburger').removeClass('is-active'); + $('body').removeClass('extended'); + }; + factory.collapseNavbarPadding = function () { + factory.SHOW_NAVBAR = true; + factory.PAGE_CONTENT_NO_PADDING = false; + factory.COLLAPSED_MODE = true; + $('.c-hamburger').removeClass('is-active'); + $('body').removeClass('extended'); + }; - - factory.showError = function(title, msg) { - factory.changingPage = false; - factory.endIsCreateLoading(); - factory.endIsLoading(); - $mdDialog.show( - $mdDialog.alert() - .parent(angular.element(document.querySelector('#popupContainer'))) - .clickOutsideToClose(true) - .title(title) - .textContent(msg) - .ariaLabel(title) - .ok('Ok') - ); - - } - factory.updateTitle = function(text) { - factory.title = baseTitle; - if (text) { - factory.title = baseTitle + " - " + text; - } + factory.processResult = function () { + var params = $location.search(); + if (params['result'] && params['result'] === 'email-verified') { + $mdToast.show( + $mdToast + .simple() + .textContent('Email was verified') + .position('top right') + .hideDelay(3000) + ); } - factory.scrollTop = function() { - $window.scrollTo(0, 0); + }; + factory.showNavbar = function () { + factory.SHOW_NAVBAR = true; + factory.PAGE_CONTENT_NO_PADDING = false; + factory.COLLAPSED_MODE = false; + $('.c-hamburger').addClass('is-active'); + $('body').addClass('extended'); + }; + factory.doLogout = function () { + factory.purgeSession(); + var theme = $window.localStorage.THEME; + localStorage.clear(); + $window.localStorage.setItem('THEME', theme); + ThemeService.addStyle('styles/app-blue.css'); + $state.go('login', {}); + }; + factory.setAuthToken = function (token) { + localStorage.setItem('AUTH', JSON.stringify(token)); + }; + factory.setAdminAuthToken = function (token) { + localStorage.setItem('ADMIN_TOKEN', token); + }; + factory.getAuthToken = function () { + return JSON.parse(localStorage.getItem('AUTH')); + }; + factory.setWorkspace = function (workspace) { + localStorage.setItem('WORKSPACE', JSON.stringify(workspace)); + }; + factory.getWorkspace = function (workspace) { + return JSON.parse(localStorage.getItem('WORKSPACE')); + }; + factory.purgeSession = function () { + localStorage.removeItem('WORKSPACE'); + localStorage.removeItem('AUTH'); + localStorage.removeItem('ADMIN_TOKEN'); + }; + factory.canPerformAction = function (action) { + var workspace = factory.getWorkspace(); + if (workspace && workspace.user_info && workspace.user_info[action]) { + return true; } - factory.makeDefaultWorkspaceRoles = function(addInfo) { - if (!addInfo) { - return { - 'manage_users' : false, - 'manage_extensions' : false, - 'create_extension' : false, - 'manage_billing' : false, - 'manage_workspace' : false, - 'manage_dids' : false, - 'create_did' : false, - 'manage_calls' : false, - 'manage_recordings' : false, - 'manage_blocked_numbers' : false, - 'manage_ip_whitelist' : false, - 'manage_verified_caller_ids' : false, - 'create_flow' : false, - 'manage_flows' : false - }; - } - var info = []; - info.push({ - "id": "manage_users", - "name": "Manage Users", - "info": "Allow this user to create, read, update or delete other users in your workspace" - }); - info.push({ - "id": "manage_extensions", - "name": "Manage Extensions", - "info": "Allow this user to create, read, update or delete other extensions in your workspace" - }); - info.push({ - "id": "create_extension", - "name": "Create Extension", - "info": "Allow this user to create an extension" - }); - info.push({ - "id": "manage_billing", - "name": "Manage Billing", - "info": "Allow this user to manage used credit cards, payment options, usage limits and advanced billing settings" - }); - info.push({ - "id": "manage_workspace", - "name": "Manage Workspace", - "info": "Allow this user to manage workspace settings" - }); - info.push({ - "id": "manage_dids", - "name": "Manage DIDs", - "info": "Allow this user to buy and manage DIDs" - }); - info.push({ - "id": "create_did", - "name": "Create DID", - "info": "Allow this user to buy a DID" - }); - info.push({ - "id": "manage_calls", - "name": "Manage Calls", - "info": "Allow this user to manage calls" - }); - info.push({ - "id": "manage_recordings", - "name": "Manage Recordings", - "info": "Allow this user to manage recordings" - }); - info.push({ - "id": "manage_blocked_numbers", - "name": "Manage Blocked Numbers", - "info": "Allow this user to manage blocked numbers" - }); - info.push({ - "id": "manage_ip_whitelist", - "name": "Manage IP Whitelist", - "info": "Allow this user to manage IP whitelist" - }); - info.push({ - "id": "manage_verified_caller_ids", - "name": "Manage Verified Caller IDs", - "info": "Allow this user to manage verified caller ids" - }); - info.push({ - "id": "manage_flows", - "name": "Manage Flows", - "info": "Allow this user to manage flows" - }); - info.push({ - "id": "create_flow", - "name": "Create Flow", - "info": "Allow this user to create flows" - }); - - - - - - - - - - - + return false; + }; + factory.has = function () { + return JSON.parse(localStorage.getItem('WORKSPACE')); + }; + factory.showMsg = function (title, msg) { + factory.changingPage = false; + factory.endIsCreateLoading(); + factory.endIsLoading(); + return $mdDialog.show( + $mdDialog + .alert() + .parent(angular.element(document.querySelector('#popupContainer'))) + .clickOutsideToClose(true) + .title(title) + .textContent(msg) + .ariaLabel(title) + .ok('Ok') + ); + }; - return info; + factory.showError = function (title, msg) { + factory.changingPage = false; + factory.endIsCreateLoading(); + factory.endIsLoading(); + $mdDialog.show( + $mdDialog + .alert() + .parent(angular.element(document.querySelector('#popupContainer'))) + .clickOutsideToClose(true) + .title(title) + .textContent(msg) + .ariaLabel(title) + .ok('Ok') + ); + }; + factory.updateTitle = function (text) { + factory.title = baseTitle; + if (text) { + factory.title = baseTitle + ' - ' + text; } - return factory; - }) - .factory("Backend", function($http, $q, $shared, $mdDialog, $state, $timeout, ThemeService) { - var factory = this; - factory.queued = []; - var skip = ['login', 'register', 'forgot', 'reset']; - - function pushToQueue(item) { - $shared.tempStopErrors = true; - //factory.queued.push( item ); + }; + factory.scrollTop = function () { + $window.scrollTo(0, 0); + }; + factory.makeDefaultWorkspaceRoles = function (addInfo) { + if (!addInfo) { + return { + manage_users: false, + manage_extensions: false, + create_extension: false, + manage_billing: false, + manage_workspace: false, + manage_dids: false, + create_did: false, + manage_calls: false, + manage_recordings: false, + manage_blocked_numbers: false, + manage_ip_whitelist: false, + manage_verified_caller_ids: false, + create_flow: false, + manage_flows: false, + }; } - function errorHandler(res, codeId, showMsg) { - var error = null; - if ( res.data ) { - error = res.data.message||null; - } - console.log("erroHandler ", arguments); - /* + var info = []; + info.push({ + id: 'manage_users', + name: 'Manage Users', + info: 'Allow this user to create, read, update or delete other users in your workspace', + }); + info.push({ + id: 'manage_extensions', + name: 'Manage Extensions', + info: 'Allow this user to create, read, update or delete other extensions in your workspace', + }); + info.push({ + id: 'create_extension', + name: 'Create Extension', + info: 'Allow this user to create an extension', + }); + info.push({ + id: 'manage_billing', + name: 'Manage Billing', + info: 'Allow this user to manage used credit cards, payment options, usage limits and advanced billing settings', + }); + info.push({ + id: 'manage_workspace', + name: 'Manage Workspace', + info: 'Allow this user to manage workspace settings', + }); + info.push({ + id: 'manage_dids', + name: 'Manage DIDs', + info: 'Allow this user to buy and manage DIDs', + }); + info.push({ + id: 'create_did', + name: 'Create DID', + info: 'Allow this user to buy a DID', + }); + info.push({ + id: 'manage_calls', + name: 'Manage Calls', + info: 'Allow this user to manage calls', + }); + info.push({ + id: 'manage_recordings', + name: 'Manage Recordings', + info: 'Allow this user to manage recordings', + }); + info.push({ + id: 'manage_blocked_numbers', + name: 'Manage Blocked Numbers', + info: 'Allow this user to manage blocked numbers', + }); + info.push({ + id: 'manage_ip_whitelist', + name: 'Manage IP Whitelist', + info: 'Allow this user to manage IP whitelist', + }); + info.push({ + id: 'manage_verified_caller_ids', + name: 'Manage Verified Caller IDs', + info: 'Allow this user to manage verified caller ids', + }); + info.push({ + id: 'manage_flows', + name: 'Manage Flows', + info: 'Allow this user to manage flows', + }); + info.push({ + id: 'create_flow', + name: 'Create Flow', + info: 'Allow this user to create flows', + }); + + return info; + }; + return factory; + } + ) + .factory('Backend', function ($http, $q, $shared, $mdDialog, $state, $timeout, ThemeService) { + var factory = this; + factory.queued = []; + var skip = ['login', 'register', 'forgot', 'reset']; + + function pushToQueue(item) { + $shared.tempStopErrors = true; + //factory.queued.push( item ); + } + function errorHandler(res, codeId, showMsg) { + var error = null; + if (res.data) { + error = res.data.message || null; + } + console.log('erroHandler ', arguments); + /* if ( $shared.tempStopErrors ) { $q.all( factory.queued ).then(function() { $shared.tempStopErrors = false; @@ -900,415 +949,421 @@ return changed; return; } */ - $shared.endIsLoading(); - $shared.endIsCreateLoading(); - if ( showMsg ) { - error = error || "An error occured."; - $shared.showError(error); - return; - } - var message = "An error occured."; - if ( codeId !== null) { - message += " Error Code ID: " + codeId; - } - - $shared.showError(message); + $shared.endIsLoading(); + $shared.endIsCreateLoading(); + if (showMsg) { + error = error || 'An error occured.'; + $shared.showError(error); + return; + } + var message = 'An error occured.'; + if (codeId !== null) { + message += ' Error Code ID: ' + codeId; + } - } + $shared.showError(message); + } - factory.applyTheme = function(theme) { - theme = theme||ThemeService.getTheme(); - const themes = { - default: 'styles/app-blue.css', - dark: 'styles/app-grey.css' - } + factory.applyTheme = function (theme) { + theme = theme || ThemeService.getTheme(); + const themes = { + default: 'styles/app-blue.css', + dark: 'styles/app-grey.css', + }; - if (theme !== ThemeService.getTheme()) { - ThemeService.setTheme(theme); - } - ThemeService.addStyle(themes[theme]); - //ThemeService.removeStyle(themes[theme]); - if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { - ThemeService.setTheme('dark'); - }else{ - ThemeService.setTheme('default'); - } + if (theme !== ThemeService.getTheme()) { + ThemeService.setTheme(theme); } + ThemeService.addStyle(themes[theme]); + //ThemeService.removeStyle(themes[theme]); + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + ThemeService.setTheme('dark'); + } else { + ThemeService.setTheme('default'); + } + }; - factory.refreshWorkspaceData = function() { - return $q(function(resolve, reject) { - factory.get("/dashboard").then(function(res) { - var graph = res.data[0]; - console.log("GOT state data ", res); - $shared.billInfo= res.data[1]; - $shared.userInfo= res.data[2]; - factory.applyTheme($shared.userInfo.theme); - $shared.planInfo= res.data[4]; - // $shared.planInfo.rank = 3; - $shared.workspaceInfo= res.data[5]; - console.log("updated UI state"); - resolve(res); - }, function(err) { - reject(err); - }); + factory.refreshWorkspaceData = function () { + return $q(function (resolve, reject) { + factory.get('/dashboard').then( + function (res) { + var graph = res.data[0]; + console.log('GOT state data ', res); + $shared.billInfo = res.data[1]; + $shared.userInfo = res.data[2]; + factory.applyTheme($shared.userInfo.theme); + $shared.planInfo = res.data[4]; + // $shared.planInfo.rank = 3; + $shared.workspaceInfo = res.data[5]; + console.log('updated UI state'); + resolve(res); + }, + function (err) { + reject(err); + } + ); + }); + }; + factory.selectAll = function (selectedAll, tag, options) { + console.log('selectAll', selectedAll); + angular.forEach(options, function (option) { + option.checked = selectedAll; + }); + }; + factory.deleteAllChecked = function (module, items) { + var checked = items.filter(function (item) { + return item.checked; + }); + console.log('checked items are ', checked); + if (checked.length === 0) { + $shared.showMsg('Error', 'Please select one or more items to delete'); + return; + } + var confirm = $mdDialog + .confirm() + .title('Are you sure you want to delete all these items?') + .ariaLabel('Confirm') + .ok('Yes') + .cancel('No'); + $mdDialog.show(confirm).then(function () { + $shared.isLoading = true; + var data = { + module: module, + items: checked, + }; + factory.post('/deleteAll', data).then(function () { + console.log('deleted successfully..'); + $shared.isLoading = false; + $state.reload(); }); - } - factory.selectAll = function(selectedAll, tag, options) { - console.log("selectAll", selectedAll); - angular.forEach(options, function(option) { - option.checked = selectedAll; - }); - + }); + }; - } - factory.deleteAllChecked = function(module, items) { - var checked = items.filter(function(item) { - return item.checked; - }); - console.log("checked items are ", checked); -if (checked.length === 0) { - $shared.showMsg("Error", "Please select one or more items to delete"); - return; - } - var confirm = $mdDialog.confirm() - .title('Are you sure you want to delete all these items?') - .ariaLabel('Confirm') - .ok('Yes') - .cancel('No'); - $mdDialog.show(confirm).then(function() { - $shared.isLoading = true; - var data = { - "module": module, - "items": checked - }; - factory.post("/deleteAll", data).then(function() { - console.log("deleted successfully.."); - $shared.isLoading = false; - $state.reload(); - }) + factory.waitForQueuedReqs = function () { + return $q(function (resolve, reject) { + $q.all(factory.queued).then(function () { + resolve(); }); - } + }); + }; + factory.getJWTToken = function (email, password) { + var params = { + email: email, + password: password, + }; + return $q(function (resolve, reject) { + $http + .post(createUrl('/jwt/authenticate'), params) + .then(function (res) { + localStorage.setItem('AUTH', JSON.stringify(res.data.jwt)); + localStorage.setItem('WORKSPACE', JSON.stringify(res.data.workspace)); + resolve(); + }) + .catch(function (err) { + reject(err); + }); + }); + }; + function checkHttpCallPrerequisites() { + var auth = $shared.hasAuth(); + if (!auth) { + $shared.tempStopErrors = true; + var path = document.location.href.split('/'); - factory.waitForQueuedReqs = function() { - return $q(function(resolve, reject) { - $q.all( factory.queued ).then(function() { - resolve(); - }); - }); + if (isAlreadyDoingNextRedirect()) { + return; } - factory.getJWTToken = function(email, password) { - var params = { - email: email, - password: password - }; - return $q(function(resolve, reject) { - $http.post( createUrl( "/jwt/authenticate"), params).then( function(res) { - localStorage.setItem("AUTH", JSON.stringify(res.data.jwt)); - localStorage.setItem("WORKSPACE", JSON.stringify(res.data.workspace)); - resolve(); - }).catch(function(err) { - reject( err ); - }); - }); + var next = path.slice(4, path.length).join('/'); + //var next = $state.current.name; + console.log('next URL is: ', next); + console.log('current state is ', $state.current); + localStorage.clear(); + window.location.replace('/#/login?next=' + next); + //$state.go('login'); + return false; + } + return true; + } + factory.get = function (path, params, showMsg) { + var item = $q(function (resolve, reject) { + if (!skip.includes($state.current.name) && $state.current_name) { + if (!checkHttpCallPrerequisites()) { + resolve(); + return; + } } + $http.get(createUrl(path), params).then(resolve, function (res) { + console.log('received reply ', res); + errorHandler(res, res.headers('X-ErrorCode-ID'), showMsg); + reject(res); + }); + }); + pushToQueue(item); + return item; + }; - function checkHttpCallPrerequisites() { - var auth = $shared.hasAuth(); - if ( !auth ) { - $shared.tempStopErrors = true; - var path = document.location.href.split("/"); - - if (isAlreadyDoingNextRedirect()) { - return; - } - var next = path.slice(4, path.length).join("/"); - //var next = $state.current.name; - console.log("next URL is: ", next); - console.log("current state is ", $state.current); - localStorage.clear(); - window.location.replace("/#/login?next=" + next); - //$state.go('login'); - return false; - } - return true; - } - factory.get = function(path, params, showMsg) - { - var item = $q(function(resolve, reject) { - if (!skip.includes($state.current.name) && $state.current_name) { - if ( !checkHttpCallPrerequisites() ) { - resolve(); - return; - } - - } - $http.get(createUrl(path), params).then(resolve,function(res) { - console.log('received reply ', res); - errorHandler(res, res.headers('X-ErrorCode-ID'), showMsg); - reject(res); - }); - }); - pushToQueue( item ); - return item; - } + factory.getPagination = function (path, params) { + path = path + '?page=' + pagination.getCurrentPage(); + return factory.get(path, params); + }; - factory.getPagination = function(path, params) - { - path = path + "?page=" + pagination.getCurrentPage(); - return factory.get(path, params); + factory.delete = function (path, showMsg) { + var item = $q(function (resolve, reject) { + if (!skip.includes($state.current.name)) { + if (!checkHttpCallPrerequisites()) { + resolve(); + return; + } } - factory.delete = function(path, showMsg) - { - var item = $q(function(resolve, reject) { - if (!skip.includes($state.current.name)) { - if ( !checkHttpCallPrerequisites() ) { - resolve(); - return; - } - } - - - $http.delete(createUrl(path)).then(resolve,function(res) { - errorHandler(res, res.headers('X-ErrorCode-ID'), showMsg); - - reject(res); - }); - }); - pushToQueue(item); - return item; + $http.delete(createUrl(path)).then(resolve, function (res) { + errorHandler(res, res.headers('X-ErrorCode-ID'), showMsg); + reject(res); + }); + }); + pushToQueue(item); + return item; + }; + factory.post = function (path, params, suppressErrDialog, showMsg) { + var item = $q(function (resolve, reject) { + console.log('factory.post current state is: ', $state.current.name); + if (!skip.includes($state.current.name)) { + if (!checkHttpCallPrerequisites()) { + resolve(); + return; + } } - factory.post = function(path, params, suppressErrDialog, showMsg) - { - var item = $q(function(resolve, reject) { - console.log("factory.post current state is: ", $state.current.name); - if (!skip.includes($state.current.name)) { - if ( !checkHttpCallPrerequisites() ) { - - resolve(); - return; - } - } - - - $http.post(createUrl(path), params).then(resolve,function(res) { - if (!suppressErrDialog) { - errorHandler(res, res.headers('X-ErrorCode-ID'), showMsg); - - } - reject(res); - }); - }); - pushToQueue( item ); - return item; - } - factory.postCouldError = function(path, params) - { - $shared.tempStopErrors = false; - return factory.post(path, params, false, true); - } - - factory.postFiles = function(url, data, showMsg) { - var item =$q(function(resolve, reject) { - if (!skip.includes($state.current.name)) { - if ( !checkHttpCallPrerequisites() ) { - resolve(); - return; - } - } - - $http({ + $http.post(createUrl(path), params).then(resolve, function (res) { + if (!suppressErrDialog) { + errorHandler(res, res.headers('X-ErrorCode-ID'), showMsg); + } + reject(res); + }); + }); + pushToQueue(item); + return item; + }; + factory.postCouldError = function (path, params) { + $shared.tempStopErrors = false; + return factory.post(path, params, false, true); + }; - url: createUrl(url), - method: "POST", - data: data, - headers: {'Content-Type': undefined} - }).then(resolve, function(res) { - console.log("postFiles result ", res); - errorHandler(res, res.headers('X-ErrorCode-ID'), showMsg); - reject( res ); - }); - }); - pushToQueue( item ); - return item; - } - factory.put = function(path, params, suppressErrDialog, showMsg) - { - var item = $q(function(resolve, reject) { - console.log("factory.post current state is: ", $state.current.name); - if (!skip.includes($state.current.name)) { - if ( !checkHttpCallPrerequisites() ) { - - resolve(); - return; - } - } - - - $http.put(createUrl(path), params).then(resolve,function(res) { - if (!suppressErrDialog) { - errorHandler(res, res.headers('X-ErrorCode-ID'), showMsg); - - } - reject(res); - }); - }); - pushToQueue( item ); - return item; + factory.postFiles = function (url, data, showMsg) { + var item = $q(function (resolve, reject) { + if (!skip.includes($state.current.name)) { + if (!checkHttpCallPrerequisites()) { + resolve(); + return; + } } - - return factory; - }) - .factory("pagination", function(Backend,$shared, $q, $timeout, $location, $stateParams) { - var factory = this; - factory.settings = { - search: "", - args: { - - }, - currentPage: 1, - currentUrl: "", - scope: { obj: null, key: '' } - }; - factory.didSearch = false; - factory.meta = {}; // saved by backend - var searchTimer = null; - factory.getCurrentPage = function() { - return parseInt($stateParams['page']); - } - factory.clearSearch = function() { - $shared.changeRoute('.', {'page': 1, 'search': ''}, true /** force */, true); - } - factory.shouldShowClear = function() { - var result = false; - if ( factory.settings.search === "" ) { - result = false; - } else { - result = true; - } - console.log("result ", result); - return result; - } - factory.nextPage = function() { - var page = factory.getCurrentPage() + 1; - $shared.changeRoute('.', {'page': page,"search": $stateParams['search']}, true /** force */, true); - } - factory.prevPage = function() { - var page = factory.getCurrentPage() - 1; - $shared.changeRoute('.', {'page': page, "search": $stateParams['search']}, true /** force */, true); - } - factory.hasNext = function() { - var current = factory.getCurrentPage(); - if (factory.meta && factory.meta.pagination && (current === factory.meta.pagination.total_pages || factory.meta.pagination.total_pages === 0)) { - return false; - } - return true; - } - factory.hasPrev = function() { - var current = factory.getCurrentPage(); - if (current === 1) { - return false; - } - return true; + $http({ + url: createUrl(url), + method: 'POST', + data: data, + headers: { 'Content-Type': undefined }, + }).then(resolve, function (res) { + console.log('postFiles result ', res); + errorHandler(res, res.headers('X-ErrorCode-ID'), showMsg); + reject(res); + }); + }); + pushToQueue(item); + return item; + }; + factory.put = function (path, params, suppressErrDialog, showMsg) { + var item = $q(function (resolve, reject) { + console.log('factory.post current state is: ', $state.current.name); + if (!skip.includes($state.current.name)) { + if (!checkHttpCallPrerequisites()) { + resolve(); + return; + } } + $http.put(createUrl(path), params).then(resolve, function (res) { + if (!suppressErrDialog) { + errorHandler(res, res.headers('X-ErrorCode-ID'), showMsg); + } + reject(res); + }); + }); + pushToQueue(item); + return item; + }; + return factory; + }) + .factory('pagination', function (Backend, $shared, $q, $timeout, $location, $stateParams) { + var factory = this; + factory.settings = { + search: '', + args: {}, + currentPage: 1, + currentUrl: '', + scope: { obj: null, key: '' }, + }; + factory.didSearch = false; + factory.meta = {}; // saved by backend + var searchTimer = null; + factory.getCurrentPage = function () { + return parseInt($stateParams['page']); + }; + factory.clearSearch = function () { + $shared.changeRoute('.', { page: 1, search: '' }, true /** force */, true); + }; + factory.shouldShowClear = function () { + var result = false; + if (factory.settings.search === '') { + result = false; + } else { + result = true; + } + console.log('result ', result); + return result; + }; + factory.nextPage = function () { + var page = factory.getCurrentPage() + 1; + $shared.changeRoute( + '.', + { page: page, search: $stateParams['search'] }, + true /** force */, + true + ); + }; + factory.prevPage = function () { + var page = factory.getCurrentPage() - 1; + $shared.changeRoute( + '.', + { page: page, search: $stateParams['search'] }, + true /** force */, + true + ); + }; + factory.hasNext = function () { + var current = factory.getCurrentPage(); + if ( + factory.meta && + factory.meta.pagination && + (current === factory.meta.pagination.total_pages || + factory.meta.pagination.total_pages === 0) + ) { + return false; + } + return true; + }; + factory.hasPrev = function () { + var current = factory.getCurrentPage(); + if (current === 1) { + return false; + } + return true; + }; - // NOT USED - factory.changePage = function( page ) { - factory.settings.search = $stateParams['search']||''; - factory.settings.currentPage = page; - } - factory.changeUrl = function( url ) { - factory.settings.currentUrl = url; - } - factory.changeScope = function( obj, key ) { - factory.settings.scope = { - obj: obj, - key: key - } - } - factory.loadData = function(params) { - params = params || {}; - var url = factory.settings.currentUrl; - params['?page'] = factory.getCurrentPage(); - - if (factory.settings.search !== "") { - params['search'] = encodeURIComponent(factory.settings.search); - } - for ( var index in factory.settings.args ) { - var arg = factory.settings.args[ index ]; - if ( arg !== '' && arg ) { - //url += "&" + index + "=" + encodeURIComponent(arg); - params[index] = encodeURIComponent(arg); - } - } + // NOT USED + factory.changePage = function (page) { + factory.settings.search = $stateParams['search'] || ''; + factory.settings.currentPage = page; + }; + factory.changeUrl = function (url) { + factory.settings.currentUrl = url; + }; + factory.changeScope = function (obj, key) { + factory.settings.scope = { + obj: obj, + key: key, + }; + }; + factory.loadData = function (params) { + params = params || {}; + var url = factory.settings.currentUrl; + params['?page'] = factory.getCurrentPage(); - $shared.isCreateLoading = true; - return $q(function(resolve, reject) { - Backend.get(url, {params: params}).then(function(res) { - var meta = res.data.meta; - factory.meta = meta; - var scopeObj = factory.settings.scope.obj - var key = factory.settings.scope.key; - scopeObj[ key ] = res.data.data; - console.log("loaded data ", scopeObj[key]); - console.log("loaded data meta", meta); - $shared.endIsCreateLoading(); - $shared.endIsLoading(); - $timeout(function() { - scopeObj.$apply(); - resolve(res); - }, 0); - }); - }); - } - factory.gotoPage = function( page ) { - factory.changePage( page ); - factory.loadData(); - } - factory.resetSearch = function() { - searchTimer = null; - factory.settings.search = ""; - factory.didSearch = false; - } - factory.checkIfSearched = function() { - if ( $stateParams['search'] !== '' ) { - return true; - } - return false; - } - factory.search = function() { - factory.didSearch = true; - if (searchTimer !== null) { - $timeout.cancel(searchTimer); //clear any running timeout on key up - } - searchTimer = $timeout(function() { //then give it a second to see if the user is finished - //do .post ajax request //then do the ajax call - //var page = $stateParams['page']; - var page = "1"; - - console.log("SEARCH IS ", factory.settings.search); - $shared.changeRoute('.', {'page': page,"search": factory.settings.search}, true /** force */, true); - //factory.loadData(); - }, 800); + if (factory.settings.search !== '') { + params['search'] = encodeURIComponent(factory.settings.search); + } + for (var index in factory.settings.args) { + var arg = factory.settings.args[index]; + if (arg !== '' && arg) { + //url += "&" + index + "=" + encodeURIComponent(arg); + params[index] = encodeURIComponent(arg); } - return factory; - }) - .config(['$httpProvider', '$locationProvider', function($httpProvider, $locationProvider) { - $httpProvider.interceptors.push('JWTHttpInterceptor'); + } + + $shared.isCreateLoading = true; + return $q(function (resolve, reject) { + Backend.get(url, { params: params }).then(function (res) { + var meta = res.data.meta; + factory.meta = meta; + var scopeObj = factory.settings.scope.obj; + var key = factory.settings.scope.key; + scopeObj[key] = res.data.data; + console.log('loaded data ', scopeObj[key]); + console.log('loaded data meta', meta); + $shared.endIsCreateLoading(); + $shared.endIsLoading(); + $timeout(function () { + scopeObj.$apply(); + resolve(res); + }, 0); + }); + }); + }; + factory.gotoPage = function (page) { + factory.changePage(page); + factory.loadData(); + }; + factory.resetSearch = function () { + searchTimer = null; + factory.settings.search = ''; + factory.didSearch = false; + }; + factory.checkIfSearched = function () { + if ($stateParams['search'] !== '') { + return true; + } + return false; + }; + factory.search = function () { + factory.didSearch = true; + if (searchTimer !== null) { + $timeout.cancel(searchTimer); //clear any running timeout on key up + } + searchTimer = $timeout(function () { + //then give it a second to see if the user is finished + //do .post ajax request //then do the ajax call + //var page = $stateParams['page']; + var page = '1'; + + console.log('SEARCH IS ', factory.settings.search); + $shared.changeRoute( + '.', + { page: page, search: factory.settings.search }, + true /** force */, + true + ); + //factory.loadData(); + }, 800); + }; + return factory; + }) + .config([ + '$httpProvider', + '$locationProvider', + function ($httpProvider, $locationProvider) { + $httpProvider.interceptors.push('JWTHttpInterceptor'); // $locationProvider.html5Mode(true); - }]) + }, + ]) - .config(function(IdleProvider, KeepaliveProvider) { - IdleProvider.idle(900); // 15 min - IdleProvider.timeout(60); - KeepaliveProvider.interval(600); // heartbeat every 10 min - /* + .config(function (IdleProvider, KeepaliveProvider) { + IdleProvider.idle(900); // 15 min + IdleProvider.timeout(60); + KeepaliveProvider.interval(600); // heartbeat every 10 min + /* KeepaliveProvider.http({ method: 'GET', url: createUrl('/jwt/heartbeat'), @@ -1317,718 +1372,729 @@ if (checked.length === 0) { } }); // URL that makes sure session is alive */ - }) - .config(function($translateProvider) { - $translateProvider.useStaticFilesLoader({ - prefix: 'languages/', - suffix: '.json' - }); - $translateProvider.useSanitizeValueStrategy(null); - $translateProvider.preferredLanguage('en'); - }) - - .config(function($stateProvider, $urlRouterProvider) { + }) + .config(function ($translateProvider) { + $translateProvider.useStaticFilesLoader({ + prefix: 'languages/', + suffix: '.json', + }); + $translateProvider.useSanitizeValueStrategy(null); + $translateProvider.preferredLanguage('en'); + }) + .config(function ($stateProvider, $urlRouterProvider) { $urlRouterProvider.when('/dashboard', '/dashboard/home'); $urlRouterProvider.otherwise('/dashboard/home'); - // function to check the authentication // - var Auth = ["$q", "$state", "$timeout", "$window", "$shared", function ($q, $state, $timeout, $window, $shared) { - var deferred =$q.defer(); + // function to check the authentication // + var Auth = [ + '$q', + '$state', + '$timeout', + '$window', + '$shared', + function ($q, $state, $timeout, $window, $shared) { + var deferred = $q.defer(); function redirectToLoginPage() { - console.log("not logged in..."); - if (isAlreadyDoingNextRedirect()) { - return; - } - var path = document.location.href.split("/"); - var next = path.slice(4, path.length).join("/"); - //var next = $state.current.name; - console.log("next URL is: ", next); - console.log("current state is ", $state.current); - window.location.replace("/#/login?next=" + next); - //$state.go('login', {'next': next}); - deferred.reject(); + console.log('not logged in...'); + if (isAlreadyDoingNextRedirect()) { + return; + } + var path = document.location.href.split('/'); + var next = path.slice(4, path.length).join('/'); + //var next = $state.current.name; + console.log('next URL is: ', next); + console.log('current state is ', $state.current); + window.location.replace('/#/login?next=' + next); + //$state.go('login', {'next': next}); + deferred.reject(); } - $timeout(function() { - console.log("checking auth token.."); - var token = getJWTTokenObj(); - var skip = ['login', 'register', 'forgot', 'reset']; - $shared.tempStopErrors = true; - if (skip.includes($state.current.name)) { - return deferred.resolve(); + $timeout(function () { + console.log('checking auth token..'); + var token = getJWTTokenObj(); + var skip = ['login', 'register', 'forgot', 'reset']; + $shared.tempStopErrors = true; + if (skip.includes($state.current.name)) { + return deferred.resolve(); + } + if (token !== '' && token) { + $shared.tempStopErrors = false; + var expiryTimePadding = 3600 * 5; + var expiryInUnix = token['expire_in_timestamp']; + var currentUnixTime = moment().unix(); + if (currentUnixTime >= expiryInUnix - expiryTimePadding) { + redirectToLoginPage(); + return; } - if (token!==''&&token) { - $shared.tempStopErrors = false; - var expiryTimePadding = (3600*5); - var expiryInUnix = token['expire_in_timestamp']; - var currentUnixTime = moment().unix() - if (currentUnixTime >= (expiryInUnix-expiryTimePadding)) { - redirectToLoginPage(); - return; - } - return deferred.resolve(); - } else { - redirectToLoginPage(); - } + return deferred.resolve(); + } else { + redirectToLoginPage(); + } }, 0); - }]; + }, + ]; var resolveParams = { - auth: Auth - }; - var listPageParams = { - page: { - value: '1', - squash: true - }, - search: { - value: '', - squash: true - } + auth: Auth, }; -var regParams = { + var listPageParams = { + page: { + value: '1', + squash: true, + }, + search: { + value: '', + squash: true, + }, }; + var regParams = {}; $stateProvider - .state('base', { + .state('base', { abstract: true, url: '', templateUrl: 'views/base.html', - controller: 'DashboardCtrl' - - }) - .state('join-workspace', { + controller: 'DashboardCtrl', + }) + .state('join-workspace', { url: '/join-workspace/:hash', parent: 'base', templateUrl: 'views/pages/join-workspace.html', - controller: 'JoinWorkspaceCtrl' - }) - .state('login', { + controller: 'JoinWorkspaceCtrl', + }) + .state('login', { url: '/login', parent: 'base', templateUrl: 'views/pages/login.html', - controller: 'LoginCtrl' - }) - .state('register', { + controller: 'LoginCtrl', + }) + .state('register', { url: '/register?plan&billingPeriod', parent: 'base', templateUrl: 'views/pages/register.html', controller: 'RegisterCtrl', - params: regParams - }) - .state('forgot', { + params: regParams, + }) + .state('forgot', { url: '/forgot', parent: 'base', templateUrl: 'views/pages/forgot.html', - controller: 'ForgotCtrl' - }) - .state('reset', { + controller: 'ForgotCtrl', + }) + .state('reset', { url: '/reset', parent: 'base', templateUrl: 'views/pages/reset.html', - controller: 'ResetCtrl' - }) + controller: 'ResetCtrl', + }) - .state('404', { + .state('404', { url: '/404', parent: 'base', templateUrl: 'views/pages/404-page.html', - controller: 'NotFoundCtrl' - }) - .state('dashboard', { + controller: 'NotFoundCtrl', + }) + .state('dashboard', { url: '/dashboard', parent: 'base', templateUrl: 'views/layouts/dashboard.html', controller: 'DashboardCtrl', - resolve: resolveParams - }) - .state('404-dash', { + resolve: resolveParams, + }) + .state('404-dash', { url: '/logged/404', parent: 'dashboard', templateUrl: 'views/pages/404-dash-page.html', - }) - .state('dashboard-user-welcome', { + }) + .state('dashboard-user-welcome', { url: '/welcome', parent: 'dashboard', templateUrl: 'views/pages/dashboard-welcome.html', controller: 'DashboardWelcomeCtrl', - resolve: resolveParams - }) - .state('dashboard-redirect', { + resolve: resolveParams, + }) + .state('dashboard-redirect', { url: '/dashboard-redirect', parent: 'base', templateUrl: 'views/pages/dashboard-redirect.html', - controller: 'DashboardRedirectCtrl' - }) - .state('my-numbers', { + controller: 'DashboardRedirectCtrl', + }) + .state('my-numbers', { url: '/dids/my-numbers?page&search', parent: 'dashboard', templateUrl: 'views/pages/did/my-numbers.html', controller: 'MyNumbersCtrl', - params: listPageParams - }) - .state('my-numbers-edit', { + params: listPageParams, + }) + .state('my-numbers-edit', { url: '/dids/my-numbers/{numberId}/edit', parent: 'dashboard', templateUrl: 'views/pages/did/my-numbers-edit.html', - controller: 'MyNumbersEditCtrl' - }) - .state('buy-numbers', { + controller: 'MyNumbersEditCtrl', + }) + .state('buy-numbers', { url: '/dids/buy-numbers', parent: 'dashboard', templateUrl: 'views/pages/did/buy-numbers.html', - controller: 'BuyNumbersCtrl' - }) - .state('buy-numbers-select', { + controller: 'BuyNumbersCtrl', + }) + .state('buy-numbers-select', { url: '/dids/buy-numbers/{type}', parent: 'dashboard', templateUrl: 'views/pages/did/buy-numbers.html', - controller: 'BuyNumbersCtrl' - }) - .state('ports', { + controller: 'BuyNumbersCtrl', + }) + .state('ports', { url: '/dids/ports?page&search', parent: 'dashboard', templateUrl: 'views/pages/did/ports/numbers.html', controller: 'PortNumbersCtrl', - params: listPageParams - }) - .state('port-create', { + params: listPageParams, + }) + .state('port-create', { url: '/dids/ports/create', parent: 'dashboard', templateUrl: 'views/pages/did/ports/create-port.html', - controller: 'CreatePortCtrl' - }) - .state('port-edit', { + controller: 'CreatePortCtrl', + }) + .state('port-edit', { url: '/dids/ports/{numberId}/edit', parent: 'dashboard', templateUrl: 'views/pages/did/ports/edit-port.html', - controller: 'EditPortCtrl' - }) - .state('flows', { + controller: 'EditPortCtrl', + }) + .state('flows', { url: '/flows?page&search', parent: 'dashboard', templateUrl: 'views/pages/flows.html', controller: 'FlowsCtrl', - params: listPageParams - }) - .state('flow-editor', { + params: listPageParams, + }) + .state('flow-editor', { url: '/flows/{flowId}', parent: 'dashboard', templateUrl: 'views/pages/flow-editor.html', - controller: 'FlowEditorCtrl' - }) - .state('extensions', { + controller: 'FlowEditorCtrl', + }) + .state('extensions', { url: '/extensions?page&search', parent: 'dashboard', templateUrl: 'views/pages/extensions.html', controller: 'ExtensionsCtrl', - params: listPageParams - }) - .state('extension-create', { + params: listPageParams, + }) + .state('extension-create', { url: '/extension/create', parent: 'dashboard', templateUrl: 'views/pages/extension-create.html', - controller: 'ExtensionCreateCtrl' - }) - .state('extension-edit', { + controller: 'ExtensionCreateCtrl', + }) + .state('extension-edit', { url: '/extension/{extensionId}/edit', parent: 'dashboard', templateUrl: 'views/pages/extension-edit.html', - controller: 'ExtensionEditCtrl' - }) - .state('debugger-logs', { + controller: 'ExtensionEditCtrl', + }) + .state('debugger-logs', { url: '/call-monitor?page&search', parent: 'dashboard', templateUrl: 'views/pages/debugger-logs.html', controller: 'DebuggerLogsCtrl', - params: listPageParams - }) - .state('debugger-log-view', { + params: listPageParams, + }) + .state('debugger-log-view', { url: '/call-monitor/{logId}/view', parent: 'dashboard', templateUrl: 'views/pages/log-view.html', - controller: 'DebuggerLogViewCtrl' - }) - .state('calls', { + controller: 'DebuggerLogViewCtrl', + }) + .state('calls', { url: '/calls?page&search', parent: 'dashboard', templateUrl: 'views/pages/calls.html', controller: 'CallsCtrl', - params: listPageParams - }) - .state('call-view', { + params: listPageParams, + }) + .state('call-view', { url: '/call/{callId}/view', parent: 'dashboard', templateUrl: 'views/pages/call-view.html', - controller: 'CallViewCtrl' - }) - .state('recordings', { + controller: 'CallViewCtrl', + }) + .state('recordings', { url: '/recordings?page&search', parent: 'dashboard', templateUrl: 'views/pages/recordings.html', controller: 'RecordingsCtrl', - params: listPageParams - }) - .state('faxes', { + params: listPageParams, + }) + .state('faxes', { url: '/faxes?page&search', parent: 'dashboard', templateUrl: 'views/pages/faxes.html', controller: 'FaxesCtrl', - params: listPageParams - }) - .state('support', { + params: listPageParams, + }) + .state('support', { url: '/support?page&search', parent: 'dashboard', templateUrl: 'views/pages/support.html', controller: 'SupportCtrl', - params: listPageParams - }) - .state('support-create', { + params: listPageParams, + }) + .state('support-create', { url: '/support/create', parent: 'dashboard', templateUrl: 'views/pages/support-create.html', - controller: 'SupportCreateCtrl' - }) - .state('support-update', { + controller: 'SupportCreateCtrl', + }) + .state('support-update', { url: '/support/{ticketId}/update', parent: 'dashboard', templateUrl: 'views/pages/support-update.html', - controller: 'SupportUpdateCtrl' - }) - .state('billing', { + controller: 'SupportUpdateCtrl', + }) + .state('billing', { url: '/billing?frm', parent: 'dashboard', templateUrl: 'views/pages/billing.html', - controller: 'BillingCtrl' - }) - .state('billing-add-card', { + controller: 'BillingCtrl', + }) + .state('billing-add-card', { url: '/billing/add-card', parent: 'dashboard', templateUrl: 'views/pages/billing-add-card.html', - controller: 'BillingCtrl' - }) - .state('billing-fix-paypal-billing-agreement', { + controller: 'BillingCtrl', + }) + .state('billing-fix-paypal-billing-agreement', { url: '/billing/fix-paypal-billing-agreement', parent: 'dashboard', templateUrl: 'views/pages/billing-fix-paypal-billing-agreement.html', - controller: 'BillingFixPaypalAgreementCtrl' - }) - .state('billing-upgrade-plan', { + controller: 'BillingFixPaypalAgreementCtrl', + }) + .state('billing-upgrade-plan', { url: '/billing/upgrade-plan', parent: 'dashboard', templateUrl: 'views/pages/billing-upgrade.html', - controller: 'BillingUpgradePlanCtrl' - }) - .state('billing-upgrade-submit', { + controller: 'BillingUpgradePlanCtrl', + }) + .state('billing-upgrade-submit', { url: '/billing/upgrade-submit?plan', parent: 'dashboard', templateUrl: 'views/pages/billing-upgrade-submit.html', controller: 'BillingUpgradeSubmitCtrl', params: { - plan: { + plan: { value: 'pay-as-you-go', - squash: true - } - } - }) - .state('billing-upgrade-complete', { + squash: true, + }, + }, + }) + .state('billing-upgrade-complete', { url: '/billing/upgrade-complete', parent: 'dashboard', templateUrl: 'views/pages/billing-upgrade-complete.html', - controller: 'BillingUpgradeCompleteCtrl', - }) - .state('billing-cancel-subscription', { - url: '/billing/cancel-subscription', - parent: 'dashboard', - templateUrl: 'views/pages/billing-cancel-subscription.html', - controller: 'CancelSubscriptionCtrl', - }) - .state('billing-make-payment', { + controller: 'BillingUpgradeCompleteCtrl', + }) + .state('billing-cancel-subscription', { + url: '/billing/cancel-subscription', + parent: 'dashboard', + templateUrl: 'views/pages/billing-cancel-subscription.html', + controller: 'CancelSubscriptionCtrl', + }) + .state('billing-make-payment', { url: '/billing/make-payment', parent: 'dashboard', templateUrl: 'views/pages/make-payment.html', - controller: 'MakePaymentCtrl' - }) - .state('home', { + controller: 'MakePaymentCtrl', + }) + .state('home', { url: '/home', parent: 'dashboard', templateUrl: 'views/pages/dashboard/home.html', - controller: 'HomeCtrl' - }) - .state('settings', { + controller: 'HomeCtrl', + }) + .state('settings', { url: '/settings', parent: 'dashboard', templateUrl: 'views/pages/settings.html', - controller: 'SettingsCtrl' - }) - .state('settings-verified-callerids', { + controller: 'SettingsCtrl', + }) + .state('settings-verified-callerids', { url: '/settings/verified-callerids', parent: 'dashboard', templateUrl: 'views/pages/settings/verified-callerids.html', - controller: 'VerifiedCallerIdsCtrl' - }) - .state('settings-verified-callerids-create', { + controller: 'VerifiedCallerIdsCtrl', + }) + .state('settings-verified-callerids-create', { url: '/settings/verified-callerids/create', parent: 'dashboard', templateUrl: 'views/pages/settings/verified-callerids-create.html', - controller: 'VerifiedCallerIdsCreateCtrl' - }) - .state('settings-blocked-numbers', { + controller: 'VerifiedCallerIdsCreateCtrl', + }) + .state('settings-blocked-numbers', { url: '/settings/blocked-numbers', parent: 'dashboard', templateUrl: 'views/pages/settings/blocked-numbers.html', - controller: 'BlockedNumbersCtrl' - }) - .state('settings-blocked-numbers-create', { + controller: 'BlockedNumbersCtrl', + }) + .state('settings-blocked-numbers-create', { url: '/settings/blocked-numbers/create', parent: 'dashboard', templateUrl: 'views/pages/settings/blocked-numbers-create.html', - controller: 'BlockedNumbersCreateCtrl' - }) - .state('settings-ip-whitelist', { + controller: 'BlockedNumbersCreateCtrl', + }) + .state('settings-ip-whitelist', { url: '/settings/ip-whitelist', parent: 'dashboard', templateUrl: 'views/pages/settings/ip-whitelist.html', - controller: 'IpWhitelistCtrl' - }) - .state('settings-workspace-users', { + controller: 'IpWhitelistCtrl', + }) + .state('settings-workspace-users', { url: '/users', parent: 'dashboard', templateUrl: 'views/pages/settings/workspace-users.html', - controller: 'WorkspaceUserCtrl' - }) - .state('settings-workspace-options', { + controller: 'WorkspaceUserCtrl', + }) + .state('settings-workspace-options', { url: '/settings/workspace-options', parent: 'dashboard', templateUrl: 'views/pages/settings/workspace-options.html', - controller: 'WorkspaceOptionsCtrl' - }) - .state('settings-workspace-api-settings', { + controller: 'WorkspaceOptionsCtrl', + }) + .state('settings-workspace-api-settings', { url: '/settings/workspace-api-settings', parent: 'dashboard', templateUrl: 'views/pages/settings/workspace-api-settings.html', - controller: 'WorkspaceAPISettingsCtrl' - }) - .state('settings-workspace-params', { + controller: 'WorkspaceAPISettingsCtrl', + }) + .state('settings-workspace-params', { url: '/settings/workspace-params', parent: 'dashboard', templateUrl: 'views/pages/settings/workspace-params.html', - controller: 'WorkspaceParamCtrl' - }) + controller: 'WorkspaceParamCtrl', + }) - .state('settings-workspace-users-create', { + .state('settings-workspace-users-create', { url: '/users/create', parent: 'dashboard', templateUrl: 'views/pages/settings/workspace-users-create.html', - controller: 'WorkspaceUserCreateCtrl' - }) - .state('settings-workspace-users-edit', { + controller: 'WorkspaceUserCreateCtrl', + }) + .state('settings-workspace-users-edit', { url: '/users/{userId}/edit', parent: 'dashboard', templateUrl: 'views/pages/settings/workspace-users-edit.html', - controller: 'WorkspaceUserEditCtrl' - }) + controller: 'WorkspaceUserEditCtrl', + }) - .state('settings-workspace-users-assign', { + .state('settings-workspace-users-assign', { url: '/settings/workspace-users/{userId}/assign', parent: 'dashboard', templateUrl: 'views/pages/settings/workspace-users-assign.html', - controller: 'WorkspaceUserAssignCtrl' - }) - .state('settings-extension-codes', { - + controller: 'WorkspaceUserAssignCtrl', + }) + .state('settings-extension-codes', { url: '/settings/extension-codes', parent: 'dashboard', templateUrl: 'views/pages/settings/extension-codes.html', - controller: 'ExtensionCodesCtrl' - }) - .state('settings-geo-permission', { - url: '/settings/geo-permission', - parent: 'dashboard', - templateUrl: 'views/pages/settings/geo-permission.html', - controller: 'GeoPermissionCtrl' - }) - .state('files', { - + controller: 'ExtensionCodesCtrl', + }) + .state('settings-geo-permission', { + url: '/settings/geo-permission', + parent: 'dashboard', + templateUrl: 'views/pages/settings/geo-permission.html', + controller: 'GeoPermissionCtrl', + }) + .state('files', { url: '/files', parent: 'dashboard', templateUrl: 'views/pages/files.html', - controller: 'FilesCtrl' - }) - .state('phones', { + controller: 'FilesCtrl', + }) + .state('phones', { url: '/phones', parent: 'dashboard', templateUrl: 'views/pages/phones.html', controller: 'phonesCtrl', - }) - .state('phones-phones', { + }) + .state('phones-phones', { url: '/provision/phones?page&search', parent: 'dashboard', templateUrl: 'views/pages/phones/phones.html', controller: 'PhonesCtrl', - params: listPageParams - }) + params: listPageParams, + }) - .state('phones-phone-create', { + .state('phones-phone-create', { url: '/provision/create', parent: 'dashboard', templateUrl: 'views/pages/phones/phones-create.html', - controller: 'PhoneCreateCtrl' - }) - .state('phones-phone-edit', { + controller: 'PhoneCreateCtrl', + }) + .state('phones-phone-edit', { url: '/provision/{phoneId}/edit', parent: 'dashboard', templateUrl: 'views/pages/phones/phones-edit.html', - controller: 'PhoneEditCtrl' - }) + controller: 'PhoneEditCtrl', + }) - .state('phones-groups', { + .state('phones-groups', { url: '/provision/groups?page&search', parent: 'dashboard', templateUrl: 'views/pages/phones/groups.html', controller: 'PhoneGroupsCtrl', - params: listPageParams - }) - .state('phones-groups-create', { + params: listPageParams, + }) + .state('phones-groups-create', { url: '/provision/groups/create', parent: 'dashboard', templateUrl: 'views/pages/phones/groups-create.html', - controller: 'PhoneGroupsCreateCtrl' - }) - .state('phones-groups-edit', { + controller: 'PhoneGroupsCreateCtrl', + }) + .state('phones-groups-edit', { url: '/provision/groups/{phoneGroupId}/edit', parent: 'dashboard', templateUrl: 'views/pages/phones/groups-edit.html', - controller: 'PhoneGroupsEditCtrl' - }) - .state('phones-global-settings', { + controller: 'PhoneGroupsEditCtrl', + }) + .state('phones-global-settings', { url: '/provision/global-settings', parent: 'dashboard', templateUrl: 'views/pages/phones/global-settings.html', - controller: 'PhoneGlobalSettingsCtrl' - }) - .state('phones-global-settings-create', { + controller: 'PhoneGlobalSettingsCtrl', + }) + .state('phones-global-settings-create', { url: '/provision/global-settings/create', parent: 'dashboard', templateUrl: 'views/pages/phones/global-settings-create.html', - controller: 'PhoneGlobalSettingsCreateCtrl' - }) - .state('phones-global-settings-modify', { + controller: 'PhoneGlobalSettingsCreateCtrl', + }) + .state('phones-global-settings-modify', { url: '/provision/global-settings/{phoneSettingId}/modify', parent: 'dashboard', templateUrl: 'views/pages/phones/global-settings-modify.html', - controller: 'PhoneGlobalSettingsModifyCtrl' - }) + controller: 'PhoneGlobalSettingsModifyCtrl', + }) - .state('phones-global-settings-modify-category', { + .state('phones-global-settings-modify-category', { url: '/provision/global-settings/{phoneSettingId}/modify/{categoryId}', parent: 'dashboard', templateUrl: 'views/pages/phones/global-settings-modify-category.html', - controller: 'PhoneGlobalSettingsModifyCategoryCtrl' - }) - .state('phones-individual-settings', { + controller: 'PhoneGlobalSettingsModifyCategoryCtrl', + }) + .state('phones-individual-settings', { url: '/provision/individual-settings', parent: 'dashboard', templateUrl: 'views/pages/phones/individual-settings.html', - controller: 'PhoneIndividualSettingsCtrl' - }) - .state('phones-individual-settings-modify', { + controller: 'PhoneIndividualSettingsCtrl', + }) + .state('phones-individual-settings-modify', { url: '/provision/individual-settings/{phoneSettingId}/modify', parent: 'dashboard', templateUrl: 'views/pages/phones/individual-settings-modify.html', - controller: 'PhoneIndividualSettingsModifyCtrl' - }) - + controller: 'PhoneIndividualSettingsModifyCtrl', + }) - .state('phones-individual-settings-modify-category', { + .state('phones-individual-settings-modify-category', { url: '/provision/individual-settings/{phoneSettingId}/modify/{categoryId}', parent: 'dashboard', templateUrl: 'views/pages/phones/individual-settings-modify-category.html', - controller: 'PhoneIndividualSettingsModifyCategoryCtrl' - }) - .state('phones-deploy-config', { + controller: 'PhoneIndividualSettingsModifyCategoryCtrl', + }) + .state('phones-deploy-config', { url: '/provision/deploy', parent: 'dashboard', templateUrl: 'views/pages/phones/deploy.html', - controller: 'PhoneDeployCtrl' - }) + controller: 'PhoneDeployCtrl', + }) - .state('byo-carriers', { + .state('byo-carriers', { url: '/byo/carriers?page&search', parent: 'dashboard', templateUrl: 'views/pages/byo/carriers.html', controller: 'BYOCarriersCtrl', - params: listPageParams - }) - .state('byo-carrier-create', { + params: listPageParams, + }) + .state('byo-carrier-create', { url: '/byo/carrier/create', parent: 'dashboard', templateUrl: 'views/pages/byo/carrier-create.html', - controller: 'BYOCarrierCreateCtrl' - }) - .state('byo-carrier-edit', { + controller: 'BYOCarrierCreateCtrl', + }) + .state('byo-carrier-edit', { url: '/byo/carrier/{carrierId}/edit', parent: 'dashboard', templateUrl: 'views/pages/byo/carrier-edit.html', - controller: 'BYOCarrierEditCtrl' - }) - .state('byo-did-numbers', { + controller: 'BYOCarrierEditCtrl', + }) + .state('byo-did-numbers', { url: '/byo/did-numbers?page&search', parent: 'dashboard', templateUrl: 'views/pages/byo/dids.html', controller: 'BYODIDNumbersCtrl', - params: listPageParams - }) - .state('byo-did-number-create', { + params: listPageParams, + }) + .state('byo-did-number-create', { url: '/byo/did-number/create', parent: 'dashboard', templateUrl: 'views/pages/byo/did-create.html', - controller: 'BYODIDNumberCreateCtrl' - }) - .state('byo-did-number-edit', { + controller: 'BYODIDNumberCreateCtrl', + }) + .state('byo-did-number-edit', { url: '/byo/did-number/{numberId}/edit', parent: 'dashboard', templateUrl: 'views/pages/byo/did-edit.html', - controller: 'BYODIDNumberEditCtrl' - }) - .state('hosted-trunks', { + controller: 'BYODIDNumberEditCtrl', + }) + .state('hosted-trunks', { url: '/hosted-trunks/?page&search', parent: 'dashboard', templateUrl: 'views/pages/trunks/trunks.html', controller: 'HostedTrunksCtrl', - params: listPageParams - }) - .state('hosted-trunks-create', { + params: listPageParams, + }) + .state('hosted-trunks-create', { url: '/hosted-trunks/create', parent: 'dashboard', templateUrl: 'views/pages/trunks/trunk-create.html', - controller: 'HostedTrunksCreateCtrl' - }) - .state('hosted-trunks-edit', { + controller: 'HostedTrunksCreateCtrl', + }) + .state('hosted-trunks-edit', { url: '/hosted-trunks/{trunkId}/edit', parent: 'dashboard', templateUrl: 'views/pages/trunks/trunk-edit.html', - controller: 'HostedTrunksEditCtrl' - }) - - + controller: 'HostedTrunksEditCtrl', + }) - .state('blank', { + .state('blank', { url: '/blank', parent: 'dashboard', templateUrl: 'views/pages/dashboard/blank.html', - }) -}).run(function($rootScope, $shared, $state, Backend, Authenticator, $window, $q) { + }); + }) + .run(function ($rootScope, $shared, $state, Backend, Authenticator, $window, $q) { $rootScope.shared = $shared; - $rootScope.$watch('shared.title', function(newTitle, oldTitle) { - document.title = newTitle; + $rootScope.$watch('shared.title', function (newTitle, oldTitle) { + document.title = newTitle; }); - //Idle.watch(); - $rootScope.$on('IdleStart', function() { - /* Display modal warning or sth */ + //Idle.watch(); + $rootScope.$on('IdleStart', function () { + /* Display modal warning or sth */ }); - $rootScope.$on('IdleTimeout', function() { - /* Logout user */ - $shared.doLogout(); + $rootScope.$on('IdleTimeout', function () { + /* Logout user */ + $shared.doLogout(); }); - $rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams){ - // do something - console.log("state is changing ", arguments); - - // Backend.applyTheme(); - if(toState.requireAuthentication) { - if(!Authenticator.isAuthenticated() || !Authenticator.checkAuthenticationTime()) { - localStorage.clear(); - $state.go('login'); + $rootScope.$on('$stateChangeStart', function (event, toState, toParams, fromState, fromParams) { + // do something + console.log('state is changing ', arguments); + + // Backend.applyTheme(); + if (toState.requireAuthentication) { + if (!Authenticator.isAuthenticated() || !Authenticator.checkAuthenticationTime()) { + localStorage.clear(); + $state.go('login'); + return; + } else { + Authenticator.resetLastAuthenticationTime(); + } + } + $shared.state = toState; + if (fromState.name === 'flow-editor') { + $shared.showNavbar(); + } + var token = localStorage.getItem('AUTH'); + var admin = localStorage.getItem('ADMIN_TOKEN'); + var workspaceId = getWorkspaceID(); + if (admin) { + Backend.get('/admin/getWorkspaces').then(function (res) { + $shared.workspaces = res.data.data; + $shared.isAdmin = true; + if (!workspaceId) { + $shared.selectedAdminWorkspace = $shared.workspaces[0]; + $shared.changeAdminWorkspace2($shared.workspaces[0]); return; - } else { - Authenticator.resetLastAuthenticationTime(); } - } - $shared.state = toState; - if (fromState.name === 'flow-editor') { - $shared.showNavbar(); - } - var token = localStorage.getItem("AUTH"); - var admin = localStorage.getItem("ADMIN_TOKEN"); - var workspaceId = getWorkspaceID(); - if ( admin ) { - Backend.get("/admin/getWorkspaces").then(function(res) { - $shared.workspaces = res.data.data; - $shared.isAdmin = true; - if (!workspaceId) { - $shared.selectedAdminWorkspace = $shared.workspaces[ 0 ]; - $shared.changeAdminWorkspace2( $shared.workspaces[ 0 ] ); - return; - } - angular.forEach($shared.workspaces, function( workspace ) { - console.log("checking workspace ", workspace); - if ( workspace.id === workspaceId ) { - console.log("switching to workspace ", workspace); - $shared.selectedAdminWorkspace= workspace; - $shared.changeAdminWorkspace2( workspace ); - } - }); - - }); - } - if ((!$shared.billInfo || !$shared.userInfo || !$shared.planInfo) && Authenticator.isAuthenticated()) { - Backend.refreshWorkspaceData().then(function(res) { - console.log("updated UI data"); - }); - } - /* + angular.forEach($shared.workspaces, function (workspace) { + console.log('checking workspace ', workspace); + if (workspace.id === workspaceId) { + console.log('switching to workspace ', workspace); + $shared.selectedAdminWorkspace = workspace; + $shared.changeAdminWorkspace2(workspace); + } + }); + }); + } + if ( + (!$shared.billInfo || !$shared.userInfo || !$shared.planInfo) && + Authenticator.isAuthenticated() + ) { + Backend.refreshWorkspaceData().then(function (res) { + console.log('updated UI data'); + }); + } + /* Backend.get("/getBillingInfo").then(function(res) { $shared.billInfo = res.data; }); */ - // get settings & customizations - - console.log("getting all settings...") - $shared.isLoading = true; + // get settings & customizations - if ($shared.customizations) { - return; - } + console.log('getting all settings...'); + $shared.isLoading = true; - var requests = [Backend.get("/getAllSettings")]; - var hasSIPCredentialsRequest = false; - if (Authenticator.isAuthenticated()) { - requests.push(Backend.get("/getSIPCredentials")); - hasSIPCredentialsRequest = true; - } + if ($shared.customizations) { + return; + } - $q.all(requests).then(function(res) { - console.log('state is currently', $state.current.name); - var data = res[0].data; - $shared.customizations = data['customizations']; - $shared.frontend_api_creds = data['frontend_api_creds']; - $shared.available_themes = data['available_themes']; - console.log('customizations are ', $shared.customizations); - - if (hasSIPCredentialsRequest) { - console.log("SIP credentials ", res[1]); - $shared.SIPCredentials = res[1].data; - } - addSocialLoginScript(); - addAnalyticsScript(); - addPaymentScript(); - }); - Backend.get("/getBillingCountries").then((res) => { - $shared.billingCountries = res.data; - applyDefaultTheme(); - }); + var requests = [Backend.get('/getAllSettings')]; + var hasSIPCredentialsRequest = false; + if (Authenticator.isAuthenticated()) { + requests.push(Backend.get('/getSIPCredentials')); + hasSIPCredentialsRequest = true; + } + $q.all(requests).then(function (res) { + console.log('state is currently', $state.current.name); + var data = res[0].data; + $shared.customizations = data['customizations']; + $shared.frontend_api_creds = data['frontend_api_creds']; + $shared.available_themes = data['available_themes']; + console.log('customizations are ', $shared.customizations); + + if ($shared.customizations.login_verification === 'cf-turnstile') { + console.log('adding cloudflare turnstile script'); + addScript('https://challenges.cloudflare.com/turnstile/v0/api.js'); + } else if ($shared.customizations.login_verification === 'hcaptcha') { + // implement code for recaptcha + //addScript('https://js.hcaptcha.com/1/api.js'); + } - }) - $rootScope.$on('$stateChangeError', function(event) { - console.log("no page found - 404"); - $state.go('404'); - }); + if (hasSIPCredentialsRequest) { + console.log('SIP credentials ', res[1]); + $shared.SIPCredentials = res[1].data; + } + addSocialLoginScript(); + addAnalyticsScript(); + addPaymentScript(); + }); + Backend.get('/getBillingCountries').then((res) => { + $shared.billingCountries = res.data; + applyDefaultTheme(); + }); + }); + $rootScope.$on('$stateChangeError', function (event) { + console.log('no page found - 404'); + $state.go('404'); + }); function applyDefaultTheme() { - const defaultTheme = $shared.available_themes && $shared.available_themes.length && $shared.available_themes.find((theme) => theme.is_default); + const defaultTheme = + $shared.available_themes && + $shared.available_themes.length && + $shared.available_themes.find((theme) => theme.is_default); if (!$window.localStorage.THEME && defaultTheme) { $window.localStorage.setItem('THEME', defaultTheme.name); } @@ -2043,25 +2109,30 @@ var regParams = { } function addSocialLoginScript() { - //0 - add microsoft script - if ($shared.customizations.enable_msft_signin) addScript('https://alcdn.msauth.net/browser/2.17.0/js/msal-browser.min.js'); + if ($shared.customizations.enable_msft_signin) + addScript('https://alcdn.msauth.net/browser/2.17.0/js/msal-browser.min.js'); //1 - add apple script if ($shared.customizations.enable_apple_signin) { - addScript('https://appleid.cdn-apple.com/appleauth/static/jsapi/appleid/1/en_US/appleid.auth.js'); - setTimeout(function() { + addScript( + 'https://appleid.cdn-apple.com/appleauth/static/jsapi/appleid/1/en_US/appleid.auth.js' + ); + setTimeout(function () { appleSignInInit(); - }, 1000) + }, 1000); } //2 - add google script - if ($shared.customizations.enable_google_signin) addScript('https://apis.google.com/js/platform.js'); + if ($shared.customizations.enable_google_signin) + addScript('https://apis.google.com/js/platform.js'); } function addPaymentScript() { // if ($shared.customizations.enable_paypal_signin) addScript('https://www.paypal.com/sdk/js?client-id=' + $shared.frontend_api_creds.paypal_client_id + '&components=buttons'); - addScript('https://www.paypal.com/sdk/js?client-id=AUflBHBWaadLlcLUEG5H513ix02TfejudnE-9Lx6ZZ8r0IIa0tU1MHeUlBQHfIR1L0_IV0yePltwqYg3&disable-funding=credit,card&components=buttons'); + addScript( + 'https://www.paypal.com/sdk/js?client-id=AUflBHBWaadLlcLUEG5H513ix02TfejudnE-9Lx6ZZ8r0IIa0tU1MHeUlBQHfIR1L0_IV0yePltwqYg3&disable-funding=credit,card&components=buttons' + ); } function appleSignInInit() { @@ -2074,89 +2145,100 @@ var regParams = { }); } } -}).service('Authenticator', function($window, $q, $shared, $state, $rootScope) { - var lastAuthenticationTime; - this.isAuthenticated = function() { - let authObject = null; - try { - authObject = JSON.parse($window.localStorage.AUTH || ''); - } catch ( e ) { - //console.error( e ); - authObject = null; - } + }) + .service('Authenticator', function ($window, $q, $shared, $state, $rootScope) { + var lastAuthenticationTime; + this.isAuthenticated = function () { + let authObject = null; + try { + authObject = JSON.parse($window.localStorage.AUTH || ''); + } catch (e) { + //console.error( e ); + authObject = null; + } - if (!authObject) return false; - if (!authObject.token.expire_in_timestamp) return false; - const expiresDate = new Date(authObject.token.expire_in_timestamp * 1000); - const nowDate = new Date(); - console.log('expires date ', expiresDate); - console.log('now date ', nowDate); - return expiresDate.getTime() > nowDate.getTime(); - }; - this.checkAuthenticationTime = function() { + if (!authObject) return false; + if (!authObject.token.expire_in_timestamp) return false; + const expiresDate = new Date(authObject.token.expire_in_timestamp * 1000); + const nowDate = new Date(); + console.log('expires date ', expiresDate); + console.log('now date ', nowDate); + return expiresDate.getTime() > nowDate.getTime(); + }; + this.checkAuthenticationTime = function () { var currentTime = new Date().getTime(); var timeSinceLastAuthentication = currentTime - lastAuthenticationTime; return timeSinceLastAuthentication < 30 * 60 * 1000; - }; - this.setLastAuthenticationTime = function() { + }; + this.setLastAuthenticationTime = function () { lastAuthenticationTime = new Date().getTime(); - }; - this.resetLastAuthenticationTime = function() { + }; + this.resetLastAuthenticationTime = function () { lastAuthenticationTime = null; - }; - this.authenticate = function(username, password) { - return Backend.post("/authenticate", {username: username, password: password}).then(function(res) { - if(res.data.token){ - $window.sessionStorage.token = res.data.token; - this.setLastAuthenticationTime(); - return $q.resolve(res); - } else { - return $q.reject(res); - } - }); - }; -}).service('ThemeService', function($window) { - this.setTheme = function(theme) { - $window.localStorage.setItem('THEME', theme); - }; - this.getTheme = function() { - return $window.localStorage.getItem('THEME') || 'default'; - }; + }; + this.authenticate = function (username, password) { + return Backend.post('/authenticate', { username: username, password: password }).then( + function (res) { + if (res.data.token) { + $window.sessionStorage.token = res.data.token; + this.setLastAuthenticationTime(); + return $q.resolve(res); + } else { + return $q.reject(res); + } + } + ); + }; + }) + .service('ThemeService', function ($window) { + this.setTheme = function (theme) { + $window.localStorage.setItem('THEME', theme); + }; + this.getTheme = function () { + return $window.localStorage.getItem('THEME') || 'default'; + }; - function addStyleToDOM(path) { - var link = document.createElement('link'); - link.setAttribute('rel', 'stylesheet'); - link.setAttribute('type', 'text/css'); - link.setAttribute('data-theme', '1'); - link.setAttribute('href', path); - document.head.appendChild(link); - } - this.addStyle = function(path) { - if (!path) return; + function addStyleToDOM(path) { + var link = document.createElement('link'); + link.setAttribute('rel', 'stylesheet'); + link.setAttribute('type', 'text/css'); + link.setAttribute('data-theme', '1'); + link.setAttribute('href', path); + document.head.appendChild(link); + } + this.addStyle = function (path) { + if (!path) return; - console.log('add style ', path); - // remove existing theme - const currentLink = document.head.querySelector('link[data-theme]'); + console.log('add style ', path); + // remove existing theme + const currentLink = document.head.querySelector('link[data-theme]'); - if (currentLink && currentLink.getAttribute('href') !== path) { + if (currentLink && currentLink.getAttribute('href') !== path) { currentLink.remove(); addStyleToDOM(path); - } else if (!currentLink) { + } else if (!currentLink) { addStyleToDOM(path); - } - } + } + }; - this.removeStyle = function(selectedPath) { - const allLinks = ['styles/app-grey.css', 'styles/app-blue.css', 'styles/app-green.css', 'styles/app-red.css', 'styles/app-purple.css', 'styles/app-cyan.css' ] - const links = document.head.querySelectorAll('link[href]'); - for (var i = 0; i < links.length; i++) { - const path = links[i].getAttribute('href'); - if (!allLinks.includes(path)) continue; - if (path === selectedPath) continue; - document.head.removeChild(links[i]); - } - } -}); + this.removeStyle = function (selectedPath) { + const allLinks = [ + 'styles/app-grey.css', + 'styles/app-blue.css', + 'styles/app-green.css', + 'styles/app-red.css', + 'styles/app-purple.css', + 'styles/app-cyan.css', + ]; + const links = document.head.querySelectorAll('link[href]'); + for (var i = 0; i < links.length; i++) { + const path = links[i].getAttribute('href'); + if (!allLinks.includes(path)) continue; + if (path === selectedPath) continue; + document.head.removeChild(links[i]); + } + }; + }); @@ -5550,89 +5632,152 @@ angular.module('Lineblocs').controller('ExtensionEditCtrl', function ($scope, Ba * # MainCtrl * Controller of Lineblocs */ -angular.module('Lineblocs').controller('ExtensionsCtrl', function ($scope, Backend, pagination, $location, $state, $mdDialog, $mdToast, $shared, $q, $stateParams) { - $shared.updateTitle("Extensions"); - $scope.$stateParams = $stateParams; - $scope.$shared = $shared; - $scope.pagination = pagination; - $scope.Backend = Backend; - - function DialogController($scope, $mdDialog, extension, $shared) { +angular + .module('Lineblocs') + .controller( + 'ExtensionsCtrl', + function ( + $scope, + Backend, + pagination, + $location, + $state, + $mdDialog, + $mdToast, + $shared, + $q, + $stateParams + ) { + $shared.updateTitle('Extensions'); + $scope.$stateParams = $stateParams; $scope.$shared = $shared; - $scope.extension = extension; - $scope.close = function() { - $mdDialog.hide(); - } - } - $scope.settings = { - page: 0 - }; - $scope.extensions = []; - $scope.load = function() { - $shared.isLoading = true; - pagination.resetSearch(); - pagination.changeUrl( "/extension/list" ); - pagination.changePage( 1 ); - pagination.changeScope( $scope, 'extensions'); - return $q(function(resolve, reject) { - pagination.loadData().then(function(res) { - $scope.extensions = res.data.data; - $shared.endIsLoading(); - resolve(); - }, reject); - }); - } - $scope.editExtension = function(extension) { - $state.go('extension-edit', {extensionId: extension.public_id}); - } - $scope.createExtension = function(extension) { - $state.go('extension-create', {}); - } - $scope.connectInfo = function($event, extension) { - $mdDialog.show({ - controller: DialogController, - templateUrl: 'views/dialogs/extension-connect-info.html', - parent: angular.element(document.body), - targetEvent: $event, - clickOutsideToClose:true, - fullscreen: $scope.customFullscreen, // Only for -xs, -sm breakpoints. - locals: { - "extension": extension + $scope.pagination = pagination; + $scope.Backend = Backend; + + function DialogController($scope, $mdDialog, extension, $shared) { + $scope.$shared = $shared; + $scope.extension = extension; + $scope.close = function () { + $mdDialog.hide(); + }; } - }) - .then(function() { - }, function() { - }); - } - $scope.deleteExtension = function($event, extension) { - // Appending dialog to document.body to cover sidenav in docs app - var confirm = $mdDialog.confirm() - .title('Are you sure you want to delete this extension?') - .textContent('This will permantely remove the extension and you will no longer be able to use it') - .ariaLabel('Delete extension') - .targetEvent($event) - .ok('Yes') - .cancel('No'); - $mdDialog.show(confirm).then(function() { + $scope.settings = { + page: 0, + }; + $scope.extensions = []; + $scope.load = function () { $shared.isLoading = true; - Backend.delete("/extension/" + extension.public_id).then(function() { - $scope.load().then(function() { - $mdToast.show( - $mdToast.simple() - .textContent('Extension deleted..') - .position("top right") - .hideDelay(3000) - ); + pagination.resetSearch(); + pagination.changeUrl('/extension/list'); + pagination.changePage(1); + pagination.changeScope($scope, 'extensions'); + return $q(function (resolve, reject) { + pagination.loadData().then(function (res) { + $scope.extensions = res.data.data; + $shared.endIsLoading(); + resolve(); + }, reject); + }); + }; + $scope.editExtension = function (extension) { + $state.go('extension-edit', { extensionId: extension.public_id }); + }; + $scope.createExtension = function (extension) { + $state.go('extension-create', {}); + }; + $scope.connectInfo = function ($event, extension) { + $mdDialog + .show({ + controller: DialogController, + templateUrl: 'views/dialogs/extension-connect-info.html', + parent: angular.element(document.body), + targetEvent: $event, + clickOutsideToClose: true, + fullscreen: $scope.customFullscreen, // Only for -xs, -sm breakpoints. + locals: { + extension: extension, + }, + }) + .then( + function () {}, + function () {} + ); + }; + $scope.deleteExtension = function ($event, extension) { + $mdDialog + .show({ + controller: DeleteExtensionDialogCtrl, + template: ` + +
+ +
+

Delete Extension

+
+
+ + +

+ Are you sure you want to delete this extension? + This will permanently remove the extension and you will no longer be able to use it. +

+ + + + + +
+ + + + No + + Delete + + +
+
+ `, + targetEvent: $event, + clickOutsideToClose: true, + }) + .then(function () { + $shared.isLoading = true; + + Backend.delete('/extension/' + extension.public_id).then(function () { + $scope.load().then(function () { + $mdToast.show( + $mdToast + .simple() + .textContent('Extension deleted..') + .position('top right') + .hideDelay(3000) + ); + }); + }); }); + }; - }) - }, function() { - }); - } + $scope.load(); + } + ); - $scope.load(); -}); +function DeleteExtensionDialogCtrl($scope, $mdDialog) { + $scope.confirmText = ''; + + $scope.cancel = function () { + $mdDialog.cancel(); + }; + $scope.confirm = function () { + $mdDialog.hide(true); + }; +} 'use strict'; @@ -10394,388 +10539,485 @@ angular.module('Lineblocs') * # MainCtrl * Controller of Lineblocs */ -angular.module('Lineblocs') - .controller('LoginCtrl', function($scope, $location, $timeout, $q, Backend, $shared, $state, Idle, $interval, $window) { - $shared.updateTitle("Login"); - $shared.processResult(); - $scope.triedSubmit = false; - $scope.couldNotLogin = false; - $scope.invalideOtp = false; - $scope.noUserFound = false; - $scope.shouldSplash = false; - $scope.isLoading = false; - $scope.challenge = null; - $scope.user = { - email: "", - password: "", - otp:"", - }; - $scope.step = 1; - $scope.countdownDuration = 5; - $scope.resendTimeout = $scope.countdownDuration * 60; - $scope.timerDisplay = padZero(Math.floor($scope.resendTimeout / 60)) + ':' + padZero($scope.resendTimeout % 60); - var clickedGoogSignIn = false; - var countdown; - $scope.selectedTheme = localStorage.getItem("THEME"); - - $scope.theme = { - default: 'styles/app-blue.css', - dark: 'styles/app-grey.css', - light: 'styles/app-cyan.css', - } - - $scope.changeTheme = function(theme){ - $window.localStorage.setItem('THEME', theme); - $scope.selectedTheme = theme; - // Backend.post("/updateSelf", { theme: $scope.selectedTheme }).then(function(res) { - addStyle($scope.theme[theme]); - removeStyle($scope.theme[theme]); - // }); - } - function addStyle(path) { - var link = document.createElement('link'); - link.setAttribute('rel', 'stylesheet'); - link.setAttribute('type', 'text/css'); - link.setAttribute('href', path); - document.head.appendChild(link); - } +angular + .module('Lineblocs') + .controller( + 'LoginCtrl', + function ($scope, $location, $timeout, $q, Backend, $shared, $state, Idle, $interval, $window) { + $shared.updateTitle('Login'); + $shared.processResult(); + $scope.triedSubmit = false; + $scope.couldNotLogin = false; + $scope.invalideOtp = false; + $scope.noUserFound = false; + $scope.shouldSplash = false; + $scope.isLoading = false; + $scope.challenge = null; + $scope.user = { + email: '', + password: '', + otp: '', + }; + $scope.step = 1; + $scope.countdownDuration = 5; + $scope.resendTimeout = $scope.countdownDuration * 60; + $scope.timerDisplay = + padZero(Math.floor($scope.resendTimeout / 60)) + ':' + padZero($scope.resendTimeout % 60); + var clickedGoogSignIn = false; + var countdown; + $scope.selectedTheme = localStorage.getItem('THEME'); + + $scope.theme = { + default: 'styles/app-blue.css', + dark: 'styles/app-grey.css', + light: 'styles/app-cyan.css', + }; - function removeStyle(selectedPath) { - const allLinks = ['styles/app-grey.css', 'styles/app-blue.css', 'styles/app-green.css', 'styles/app-red.css', 'styles/app-purple.css', 'styles/app-cyan.css' ] - const links = document.head.querySelectorAll('link[href]'); - for (var i = 0; i < links.length; i++) { - const path = links[i].getAttribute('href'); - if (!allLinks.includes(path)) continue; - if (path === selectedPath) continue; - document.head.removeChild(links[i]); - } - } + $scope.changeTheme = function (theme) { + $window.localStorage.setItem('THEME', theme); + $scope.selectedTheme = theme; + // Backend.post("/updateSelf", { theme: $scope.selectedTheme }).then(function(res) { + addStyle($scope.theme[theme]); + removeStyle($scope.theme[theme]); + // }); + }; + function addStyle(path) { + var link = document.createElement('link'); + link.setAttribute('rel', 'stylesheet'); + link.setAttribute('type', 'text/css'); + link.setAttribute('href', path); + document.head.appendChild(link); + } -function startCountdown() { - countdown = $interval(function() { - var minutes = Math.floor($scope.resendTimeout / 60); - var seconds = $scope.resendTimeout - minutes * 60; - $scope.resendTimeout--; - if ($scope.resendTimeout < 0) { - $interval.cancel(countdown); - } - $scope.timerDisplay = padZero(minutes) + ':' + padZero(seconds); - }, 1000); -} + function removeStyle(selectedPath) { + const allLinks = [ + 'styles/app-grey.css', + 'styles/app-blue.css', + 'styles/app-green.css', + 'styles/app-red.css', + 'styles/app-purple.css', + 'styles/app-cyan.css', + ]; + const links = document.head.querySelectorAll('link[href]'); + for (var i = 0; i < links.length; i++) { + const path = links[i].getAttribute('href'); + if (!allLinks.includes(path)) continue; + if (path === selectedPath) continue; + document.head.removeChild(links[i]); + } + } -startCountdown(); -function padZero(number) { - return (number < 10 ? '0' : '') + number; -} -const code = $location.search().code; -if (code) { - fetch('https://appleid.apple.com/auth/token', { - method: 'POST', - headers: { - 'Content-Type': 'application/x-www-form-urlencoded' - }, - body: new URLSearchParams({ - grant_type: 'authorization_code', - code: code, - client_id: $shared.frontend_api_creds.apple_signin_client_id, - client_secret: $shared.frontend_api_creds.apple_signin_client_secret, - redirect_uri: 'https://your-app.com/callback', - }), - }).then(response => response.json()).then(data => { - const loginOption = { - provider : 'apple', - id_token : data.access_token, - access_token: data.access_token, - }; - $scope.startThirdPartyLogin( user.email, user.displayName, '', '', loginOption); - }) - .catch(error => { - // Handle the error - }); -} + function startCountdown() { + countdown = $interval(function () { + var minutes = Math.floor($scope.resendTimeout / 60); + var seconds = $scope.resendTimeout - minutes * 60; + $scope.resendTimeout--; + if ($scope.resendTimeout < 0) { + $interval.cancel(countdown); + } + $scope.timerDisplay = padZero(minutes) + ':' + padZero(seconds); + }, 1000); + } -function redirectUser() { - Backend.post("/updateSelf", { theme: $scope.selectedTheme }).then(function(res) { - addStyle($scope.theme[$scope.selectedTheme]); - removeStyle($scope.theme[$scope.selectedTheme]); - }); - Idle.watch(); - var hash = window.location.hash.substr(1); - var query = URI(hash).query(true); - if ( query.next ) { - window.location.replace("#/" + query.next); - return; - } - $state.go('dashboard-user-welcome', {}); -} - function finishLogin(data) { - console.log("finishLogin ", arguments); - $scope.isLoading = false; - $scope.couldNotLogin = false; - $shared.isAdmin = data.isAdmin; + startCountdown(); + function padZero(number) { + return (number < 10 ? '0' : '') + number; + } + const code = $location.search().code; + if (code) { + fetch('https://appleid.apple.com/auth/token', { + method: 'POST', + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + }, + body: new URLSearchParams({ + grant_type: 'authorization_code', + code: code, + client_id: $shared.frontend_api_creds.apple_signin_client_id, + client_secret: $shared.frontend_api_creds.apple_signin_client_secret, + redirect_uri: 'https://your-app.com/callback', + }), + }) + .then((response) => response.json()) + .then((data) => { + const loginOption = { + provider: 'apple', + id_token: data.access_token, + access_token: data.access_token, + }; + $scope.startThirdPartyLogin(user.email, user.displayName, '', '', loginOption); + }) + .catch((error) => { + // Handle the error + }); + } - $shared.setAuthToken(data); - $shared.setWorkspace(data.workspace); - if (!$shared.isAdmin) { - redirectUser(); - return; - } - $shared.isAdmin = true; - $shared.setAdminAuthToken(data.adminWorkspaceToken); - Backend.post("/updateSelf", { theme: $scope.selectedTheme }).then(function(res) { + function redirectUser() { + Backend.post('/updateSelf', { theme: $scope.selectedTheme }).then(function (res) { + addStyle($scope.theme[$scope.selectedTheme]); + removeStyle($scope.theme[$scope.selectedTheme]); + }); + Idle.watch(); + var hash = window.location.hash.substr(1); + var query = URI(hash).query(true); + if (query.next) { + window.location.replace('#/' + query.next); + return; + } + $state.go('dashboard-user-welcome', {}); + } + function finishLogin(data) { + console.log('finishLogin ', arguments); + $scope.isLoading = false; + $scope.couldNotLogin = false; + $shared.isAdmin = data.isAdmin; + + $shared.setAuthToken(data); + $shared.setWorkspace(data.workspace); + if (!$shared.isAdmin) { + redirectUser(); + return; + } + $shared.isAdmin = true; + $shared.setAdminAuthToken(data.adminWorkspaceToken); + Backend.post('/updateSelf', { theme: $scope.selectedTheme }).then(function (res) { addStyle($scope.theme[theme]); removeStyle($scope.theme[theme]); }); - Backend.get("/admin/getWorkspaces").then(function(res) { - $shared.workspaces = res.data.data; - $state.go('dashboard-user-welcome', {}); - }); - } + Backend.get('/admin/getWorkspaces').then(function (res) { + $shared.workspaces = res.data.data; + $state.go('dashboard-user-welcome', {}); + }); + } - // Apple Login ============================================================== - $scope.loginWithApple = function () { - console.log("loginWithApple", AppleID); - AppleID.auth.signIn(); - } + // Apple Login ============================================================== + $scope.loginWithApple = function () { + console.log('loginWithApple', AppleID); + AppleID.auth.signIn(); + }; + // Microsoft login =========================================================== + $scope.loginWithMicrosoft = function () { + const msalConfig = { + auth: { + // 'Application (client) ID' of app registration in Azure portal - this value is a GUID + clientId: + $shared.frontend_api_creds.msft_signin_client_id || + '3a49ca34-f4b5-40b3-a8bc-27ed569d7867', + // Full directory URL, in the form of https://login.microsoftonline.com/ + authority: 'https://login.microsoftonline.com/common', + // Full redirect URL, in form of http://localhost:3000 + redirectUri: DEPLOYMENT_DOMAIN, + }, + cache: { + cacheLocation: 'sessionStorage', // This configures where your cache will be stored + storeAuthStateInCookie: false, // Set this to "true" if you are having issues on IE11 or Edge + }, + system: { + loggerOptions: { + loggerCallback: (level, message, containsPii) => { + console.log('loggerCallback', level); + if (containsPii) { + return; + } + switch (level) { + case msal?.LogLevel?.Error: + console.error(message); + return; + case msal?.LogLevel?.Info: + console.info(message); + return; + case msal?.LogLevel?.Verbose: + console.debug(message); + return; + case msal?.LogLevel?.Warning: + console.warn(message); + return; + } + }, + }, + }, + }; - // Microsoft login =========================================================== - $scope.loginWithMicrosoft = function () { + const myMSALObj = new msal.PublicClientApplication(msalConfig); + myMSALObj + .loginPopup({ scopes: ['User.Read'] }) + .then(handleResponse) + .catch((error) => { + console.error(error); + }); + }; - const msalConfig = { - auth: { - // 'Application (client) ID' of app registration in Azure portal - this value is a GUID - clientId: $shared.frontend_api_creds.msft_signin_client_id || "3a49ca34-f4b5-40b3-a8bc-27ed569d7867", - // Full directory URL, in the form of https://login.microsoftonline.com/ - authority: "https://login.microsoftonline.com/common", - // Full redirect URL, in form of http://localhost:3000 - redirectUri: DEPLOYMENT_DOMAIN, - }, - cache: { - cacheLocation: "sessionStorage", // This configures where your cache will be stored - storeAuthStateInCookie: false, // Set this to "true" if you are having issues on IE11 or Edge - }, - system: { - loggerOptions: { - loggerCallback: (level, message, containsPii) => { - console.log("loggerCallback", level); - if (containsPii) { - return; - } - switch (level) { - case msal?.LogLevel?.Error: - console.error(message); - return; - case msal?.LogLevel?.Info: - console.info(message); - return; - case msal?.LogLevel?.Verbose: - console.debug(message); - return; - case msal?.LogLevel?.Warning: - console.warn(message); - return; - } - } - } + function handleResponse(response) { + if (response === null) return; + const loginOption = { + provider: 'microsoft', + id_token: response.idToken, + access_token: response.accessToken, + }; + $scope.startThirdPartyLogin( + response.account.userName, + response.account.name, + '', + '', + loginOption + ); } - }; - const myMSALObj = new msal.PublicClientApplication(msalConfig); - myMSALObj.loginPopup({scopes: ["User.Read"]}).then(handleResponse) - .catch(error => { - console.error(error); - }); - } + $scope.processLoginVerfication = function (token) { + let errorMsg = ''; + if ($shared.customizations.login_verification === 'cf-turnstile' && !$scope.turnstileToken) { + errorMsg = 'Please complete the CAPTCHA'; + return {error: errorMsg, valid: false}; + } else if ($shared.customizations.login_verification === 'recaptcha') { + // add code for recaptcha verification + } - function handleResponse(response) { - if (response === null) return; - const loginOption = { - provider : 'microsoft', - id_token : response.idToken, - access_token: response.accessToken, - }; - $scope.startThirdPartyLogin( response.account.userName, response.account.name, '', '', loginOption); - } + return {valid: true}; + } - $scope.validateEmail = function($event, loginForm) { - $scope.triedSubmit = true; - if (!loginForm.$valid) { + $scope.validateEmail = function ($event, loginForm) { + $scope.triedSubmit = true; - $scope.errorMsg = "Please enter a valid email"; - return; - } - $shared.changingPage = true; - Backend.get("/getUserInfo?email=" + $scope.user.email).then(function( res ) { - $shared.changingPage = false; - if ( res.data.found ) { - $scope.userInfo = res.data.info; - $scope.step = 2; - return; - } - $scope.noUserFound = true; - }); - } + let processedVerification = $scope.processLoginVerfication(); + if (!processedVerification.valid) { + $scope.errorMsg = processedVerification.error; + return; + } - $scope.validatePassword = function($event, loginForm) { - if (!loginForm.$valid) { - return; - } - const data = angular.copy($scope.user); - data['challenge'] = $scope.challenge; - $scope.isLoading = true; - Backend.post("/jwt/authenticate", data, true).then(function (res) { - if (res.data.enable_2fa === true) { - $scope.requestOtp($event, loginForm); - } else { - finishLogin(res.data); - } - }).catch(function () { - $scope.isLoading = false; - $scope.couldNotLogin = true; - }) - } + $scope.errorMsg = ''; + if (!loginForm.$valid) { + $scope.errorMsg = 'Please enter a valid email'; + return; + } + $shared.changingPage = true; + Backend.get('/getUserInfo?email=' + $scope.user.email).then(function (res) { + $shared.changingPage = false; + if (res.data.found) { + $scope.userInfo = res.data.info; + $scope.step = 2; + return; + } + $scope.noUserFound = true; + }); + }; - $scope.requestOtp = function($event) { - $scope.isLoading = true; - $scope.resendTimeout = $scope.countdownDuration * 60; - $scope.timerDisplay = padZero(Math.floor($scope.resendTimeout / 60)) + ':' + padZero($scope.resendTimeout % 60); - $interval.cancel(countdown); - startCountdown(); - Backend.get("/request2FACode", {params: {email: $scope.user.email, password: $scope.user.password}}).then(function( res ) { - $scope.isLoading = false; - $scope.step = 3; - }).catch(function() { - $scope.step = 3; - $scope.isLoading = false; - $scope.couldNotLogin = true; - }) - } + $scope.validatePassword = function ($event, loginForm) { + if (!loginForm.$valid) { + return; + } + const data = angular.copy($scope.user); + data['challenge'] = $scope.challenge; + $scope.isLoading = true; + Backend.post('/jwt/authenticate', data, true) + .then(function (res) { + if (res.data.enable_2fa === true) { + $scope.requestOtp($event, loginForm); + } else { + finishLogin(res.data); + } + }) + .catch(function () { + $scope.isLoading = false; + $scope.couldNotLogin = true; + }); + }; - $scope.validateOtp = function ($event, loginForm) { - $scope.triedSubmit = true; - if (!loginForm.$valid) { - return; - } - $scope.isLoading = true; - $scope.invalideOtp = false; - Backend.post("/verify2FACode", { - "email": $scope.user.email, - "password": $scope.user.password, - "2fa_code": $scope.user.otp - }).then(function( res ) { - $scope.isLoading = false; - console.log("res", res); - if (res.data.success) { - finishLogin(res.data); - } else { - $scope.invalideOtp = true; - $scope.$apply(); + $scope.requestOtp = function ($event) { + $scope.isLoading = true; + $scope.resendTimeout = $scope.countdownDuration * 60; + $scope.timerDisplay = + padZero(Math.floor($scope.resendTimeout / 60)) + ':' + padZero($scope.resendTimeout % 60); + $interval.cancel(countdown); + startCountdown(); + Backend.get('/request2FACode', { + params: { email: $scope.user.email, password: $scope.user.password }, + }) + .then(function (res) { + $scope.isLoading = false; + $scope.step = 3; + }) + .catch(function () { + $scope.step = 3; + $scope.isLoading = false; + $scope.couldNotLogin = true; + }); + }; + + $scope.validateOtp = function ($event, loginForm) { + $scope.triedSubmit = true; + if (!loginForm.$valid) { + return; + } + $scope.isLoading = true; + $scope.invalideOtp = false; + Backend.post('/verify2FACode', { + email: $scope.user.email, + password: $scope.user.password, + '2fa_code': $scope.user.otp, + }) + .then(function (res) { + $scope.isLoading = false; + console.log('res', res); + if (res.data.success) { + finishLogin(res.data); + } else { + $scope.invalideOtp = true; + $scope.$apply(); + } + }) + .catch(function () { + $scope.isLoading = false; + $scope.couldNotLogin = true; + }); + }; + + $scope.requestAssistant = function () { + window.open( + `https://${DEPLOYMENT_DOMAIN}/resources/other-topics/2fa-verification-support`, + '_blank' + ); + }; + + $scope.gotoRegister = function () { + $shared.changingPage = true; + $shared.scrollToTop(); + $state.go('register'); + }; + $scope.gotoForgot = function () { + $shared.changingPage = true; + $shared.scrollToTop(); + $state.go('forgot'); + }; + + $scope.startThirdPartyLogin = function (email, firstname, lastname, avatar, loginOption) { + var data = {}; + data['email'] = email; + data['first_name'] = firstname; + data['last_name'] = lastname; + data['avatar'] = avatar; + data['challenge'] = $scope.challenge; + data['login_option'] = loginOption; + $shared.changingPage = true; + Backend.post('/thirdPartyLogin', data).then(function (res) { + $timeout(function () { + $scope.$apply(); + $shared.scrollToTop(); + + if (res.data.confirmed) { + finishLogin(res.data); + return; + } + $state.go('register', { + hasData: true, + userId: res.data.userId, + authData: { token: res.data.info.token }, + }); + }, 0); + }); + }; + + function renderButton() { + gapi.signin2.render('gSignIn', { + scope: 'profile email', + width: 400, + height: 50, + longtitle: true, + theme: 'dark', + onsuccess: function (googleLoginResponse) { + if (!clickedGoogSignIn) { + return; + } + var profile = googleLoginResponse.getBasicProfile(); + console.log('ID: ' + profile.getId()); // Do not send to your backend! Use an ID token instead. + console.log('Name: ' + profile.getName()); + console.log('Image URL: ' + profile.getImageUrl()); + console.log('Email: ' + profile.getEmail()); // This is null if the 'email' scope is not present. + var ctrl = angular.element('body').scope(); + var fullName = profile.getName().split(' '), + firstName = fullName[0], + lastName = fullName[fullName.length - 1]; + const { id_token, access_token } = googleLoginResponse.getAuthResponse(); + const loginOption = { + provider: 'google', + id_token, + access_token, + }; + $scope.startThirdPartyLogin( + profile.getEmail(), + firstName, + lastName, + profile.getImageUrl(), + loginOption + ); + }, + onerror: function (err) { + console.log('Google signIn2.render button err: ' + err); + }, + onfailure: function () { + console.error('failure ', arguments); + }, + }); } - }).catch(function() { - $scope.isLoading = false; - $scope.couldNotLogin = true; - }) - } - $scope.requestAssistant = function() { - window.open(`https://${DEPLOYMENT_DOMAIN}/resources/other-topics/2fa-verification-support`, '_blank'); - } + $scope.backStep1 = function () { + $scope.step = 1; + }; + $shared.changingPage = false; + angular.element('#gSignIn').on('click', function () { + clickedGoogSignIn = true; + }); + var full = window.location.host; + //window.location.host is subdomain.domain.com + var parts = full.split('.'); + var sub = parts[0]; + var second = sub.split(':'); + if (sub !== 'app' && second[0] !== 'localhost' && parts[1] !== 'ngrok') { + $scope.challenge = sub; + } - $scope.gotoRegister = function() { - $shared.changingPage = true; - $shared.scrollToTop(); - $state.go('register'); - } - $scope.gotoForgot = function() { - $shared.changingPage = true; - $shared.scrollToTop(); - $state.go('forgot'); - } + $scope.turnstileToken = null; + $scope.turnstileWidgetId = null; - $scope.startThirdPartyLogin = function(email, firstname, lastname, avatar, loginOption) { - var data = {}; - data['email'] = email; - data['first_name'] = firstname; - data['last_name'] = lastname; - data['avatar'] = avatar; - data['challenge'] = $scope.challenge; - data['login_option'] = loginOption; - $shared.changingPage = true; - Backend.post("/thirdPartyLogin", data).then(function( res ) { - $timeout(function() { - $scope.$apply(); - $shared.scrollToTop(); + function renderTurnstile() { + // wait until cloudflare script loads + if (!window.turnstile) { + setTimeout(renderTurnstile, 300); + return; + } - if ( res.data.confirmed ) { - finishLogin(res.data); - return; - } - $state.go('register', { - "hasData": true, - "userId": res.data.userId, - "authData": {"token": res.data.info.token} - }); - }, 0); - }); - } + $scope.turnstileWidgetId = window.turnstile.render( + document.getElementById('turnstile-container'), + { + sitekey: $shared.frontend_api_creds.cloudflare_turnstile_site_key, + callback: function (token) { + // IMPORTANT: tell angular value changed + $scope.$apply(function () { + $scope.turnstileToken = token; + }); + }, + } + ); + } - function renderButton() { - gapi.signin2.render('gSignIn', { - 'scope': 'profile email', - 'width': 400, - 'height': 50, - 'longtitle': true, - 'theme': 'dark', - 'onsuccess': function(googleLoginResponse) { - if (!clickedGoogSignIn) { - return; - } - var profile = googleLoginResponse.getBasicProfile(); - console.log('ID: ' + profile.getId()); // Do not send to your backend! Use an ID token instead. - console.log('Name: ' + profile.getName()); - console.log('Image URL: ' + profile.getImageUrl()); - console.log('Email: ' + profile.getEmail()); // This is null if the 'email' scope is not present. - var ctrl= angular.element("body").scope(); - var fullName = profile.getName().split(' '), - firstName = fullName[0], - lastName = fullName[fullName.length - 1]; - const { id_token, access_token } = googleLoginResponse.getAuthResponse(); - const loginOption = { - provider: 'google', - id_token, - access_token, + $timeout(function () { + $shared.waitUntilLoaded().then(function () { + if ($shared.customizations.login_verification === 'cf-turnstile') { + renderTurnstile(); + } + + renderButton(); + }); + }, 0); + + function resetTurnstile() { + if ($scope.turnstileWidgetId && window.turnstile) { + window.turnstile.reset($scope.turnstileWidgetId); + $scope.turnstileToken = null; } - $scope.startThirdPartyLogin( profile.getEmail(), firstName, lastName, profile.getImageUrl(), loginOption); - }, - onerror: function(err) { - console.log('Google signIn2.render button err: ' + err) - }, - 'onfailure': function() { - console.error("failure ", arguments); - } - }); + } } - - $scope.backStep1 = function() { - $scope.step = 1; - } - $shared.changingPage = false; - angular.element("#gSignIn").on("click", function() { - clickedGoogSignIn = true; - }); - var full = window.location.host - //window.location.host is subdomain.domain.com - var parts = full.split('.') - var sub = parts[0] - var second = sub.split(":"); - if (sub !== 'app' && second[0] !== 'localhost' && parts[1] !== 'ngrok') { - $scope.challenge = sub; - } - $timeout(function() { - renderButton(); - }, 0); - }); + ); 'use strict'; diff --git a/app/styles/app.min.css b/app/styles/app.min.css index 65cb3a3..839c4b2 100644 --- a/app/styles/app.min.css +++ b/app/styles/app.min.css @@ -23,4 +23,4 @@ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE * OR OTHER DEALINGS IN THE SOFTWARE. - */.flag-background{background-size:contain;background-position:50%;background-repeat:no-repeat}.flag{background-size:contain;background-position:50%;background-repeat:no-repeat;position:relative;display:inline-block;width:1.33333333em;line-height:1em}.flag:before{content:"\00a0"}.flag-1x{width:1.33333333em;line-height:1em}.flag-2x{width:2.66666667em;line-height:2em}.flag-3x{width:4em;line-height:3em}.flag-4x{width:5.33333333em;line-height:4em}.flag-5x{width:6.66666667em;line-height:5em}.flag-6x{width:8em;line-height:6em}.flag-7x{width:9.33333333em;line-height:7em}.flag-8x{width:10.66666667em;line-height:8em}.flag-9x{width:12em;line-height:9em}.flag-10x{width:13.33333333em;line-height:10em}.flag-rotate-90{transform:rotate(90deg)}.flag-rotate-180{transform:rotate(180deg)}.flag-rotate-270{transform:rotate(270deg)}.flag-flip-horizontal{transform:scale(-1,1)}.flag-flip-vertical{transform:scale(1,-1)}:root .flag-flip-horizontal,:root .flag-flip-vertical,:root .flag-rotate-180,:root .flag-rotate-270,:root .flag-rotate-90{filter:none}.flag-533,.flag-abw,.flag-aw,.flag-fifa-aru,.flag-ioc-aru{background-image:url(../flags/png/abw.png);background-image:url(../flags/abw.svg)}.flag-4,.flag-af,.flag-afg,.flag-fifa-afg,.flag-ioc-afg{background-image:url(../flags/png/afg.png);background-image:url(../flags/afg.svg)}.flag-24,.flag-ago,.flag-ao,.flag-fifa-ang,.flag-ioc-ang{background-image:url(../flags/png/ago.png);background-image:url(../flags/ago.svg)}.flag-660,.flag-ai,.flag-aia,.flag-fifa-aia,.flag-ioc-aia{background-image:url(../flags/png/aia.png);background-image:url(../flags/aia.svg)}.flag-248,.flag-ala,.flag-ax,.flag-fifa-ald{background-image:url(../flags/png/ala.png);background-image:url(../flags/ala.svg)}.flag-8,.flag-al,.flag-alb,.flag-fifa-alb,.flag-ioc-alb{background-image:url(../flags/png/alb.png);background-image:url(../flags/alb.svg)}.flag-20,.flag-ad,.flag-and,.flag-fifa-and,.flag-ioc-and{background-image:url(../flags/png/and.png);background-image:url(../flags/and.svg)}.flag-784,.flag-ae,.flag-are,.flag-fifa-uae,.flag-ioc-uae{background-image:url(../flags/png/are.png);background-image:url(../flags/are.svg)}.flag-32,.flag-ar,.flag-arg,.flag-fifa-arg,.flag-ioc-arg{background-image:url(../flags/png/arg.png);background-image:url(../flags/arg.svg)}.flag-51,.flag-am,.flag-arm,.flag-fifa-arm,.flag-ioc-arm{background-image:url(../flags/png/arm.png);background-image:url(../flags/arm.svg)}.flag-16,.flag-as,.flag-asm,.flag-fifa-asa,.flag-ioc-asa{background-image:url(../flags/png/asm.png);background-image:url(../flags/asm.svg)}.flag-10,.flag-aq,.flag-ata,.flag-fifa-ros{background-image:url(../flags/png/ata.png);background-image:url(../flags/ata.svg)}.flag-260,.flag-atf,.flag-tf{background-image:url(../flags/png/atf.png);background-image:url(../flags/atf.svg)}.flag-28,.flag-ag,.flag-atg,.flag-fifa-atg,.flag-ioc-ant{background-image:url(../flags/png/atg.png);background-image:url(../flags/atg.svg)}.flag-36,.flag-au,.flag-aus,.flag-fifa-aus,.flag-ioc-aus{background-image:url(../flags/png/aus.png);background-image:url(../flags/aus.svg)}.flag-40,.flag-at,.flag-aut,.flag-fifa-aut,.flag-ioc-aut{background-image:url(../flags/png/aut.png);background-image:url(../flags/aut.svg)}.flag-31,.flag-az,.flag-aze,.flag-fifa-aze,.flag-ioc-aze{background-image:url(../flags/png/aze.png);background-image:url(../flags/aze.svg)}.flag-108,.flag-bdi,.flag-bi,.flag-fifa-bdi,.flag-ioc-bdi{background-image:url(../flags/png/bdi.png);background-image:url(../flags/bdi.svg)}.flag-56,.flag-be,.flag-bel,.flag-fifa-bel,.flag-ioc-bel{background-image:url(../flags/png/bel.png);background-image:url(../flags/bel.svg)}.flag-204,.flag-ben,.flag-bj,.flag-fifa-ben,.flag-ioc-ben{background-image:url(../flags/png/ben.png);background-image:url(../flags/ben.svg)}.flag-535,.flag-bes,.flag-bq,.flag-fifa-ant,.flag-ioc-aho{background-image:url(../flags/png/bes.png);background-image:url(../flags/bes.svg)}.flag-854,.flag-bf,.flag-bfa,.flag-fifa-bfa,.flag-ioc-bur{background-image:url(../flags/png/bfa.png);background-image:url(../flags/bfa.svg)}.flag-50,.flag-bd,.flag-bgd,.flag-fifa-ban,.flag-ioc-ban{background-image:url(../flags/png/bgd.png);background-image:url(../flags/bgd.svg)}.flag-100,.flag-bg,.flag-bgr,.flag-fifa-bul,.flag-ioc-bul{background-image:url(../flags/png/bgr.png);background-image:url(../flags/bgr.svg)}.flag-48,.flag-bh,.flag-bhr,.flag-fifa-bhr,.flag-ioc-brn{background-image:url(../flags/png/bhr.png);background-image:url(../flags/bhr.svg)}.flag-44,.flag-bhs,.flag-bs,.flag-fifa-bah,.flag-ioc-bah{background-image:url(../flags/png/bhs.png);background-image:url(../flags/bhs.svg)}.flag-70,.flag-ba,.flag-bih,.flag-fifa-bih,.flag-ioc-bih{background-image:url(../flags/png/bih.png);background-image:url(../flags/bih.svg)}.flag-652,.flag-bl,.flag-blm{background-image:url(../flags/png/blm.png);background-image:url(../flags/blm.svg)}.flag-112,.flag-blr,.flag-by,.flag-fifa-blr,.flag-ioc-blr{background-image:url(../flags/png/blr.png);background-image:url(../flags/blr.svg)}.flag-84,.flag-blz,.flag-bz,.flag-fifa-blz,.flag-ioc-biz{background-image:url(../flags/png/blz.png);background-image:url(../flags/blz.svg)}.flag-60,.flag-bm,.flag-bmu,.flag-fifa-ber,.flag-ioc-ber{background-image:url(../flags/png/bmu.png);background-image:url(../flags/bmu.svg)}.flag-68,.flag-bo,.flag-bol,.flag-fifa-bol,.flag-ioc-bol{background-image:url(../flags/png/bol.png);background-image:url(../flags/bol.svg)}.flag-76,.flag-br,.flag-bra,.flag-fifa-bra,.flag-ioc-bra{background-image:url(../flags/png/bra.png);background-image:url(../flags/bra.svg)}.flag-52,.flag-bb,.flag-brb,.flag-fifa-brb,.flag-ioc-bar{background-image:url(../flags/png/brb.png);background-image:url(../flags/brb.svg)}.flag-96,.flag-bn,.flag-brn,.flag-fifa-bru,.flag-ioc-bru{background-image:url(../flags/png/brn.png);background-image:url(../flags/brn.svg)}.flag-64,.flag-bt,.flag-btn,.flag-fifa-bhu,.flag-ioc-bhu{background-image:url(../flags/png/btn.png);background-image:url(../flags/btn.svg)}.flag-74,.flag-bv,.flag-bvt{background-image:url(../flags/png/bvt.png);background-image:url(../flags/bvt.svg)}.flag-72,.flag-bw,.flag-bwa,.flag-fifa-bot,.flag-ioc-bot{background-image:url(../flags/png/bwa.png);background-image:url(../flags/bwa.svg)}.flag-140,.flag-caf,.flag-cf,.flag-fifa-cta,.flag-ioc-caf{background-image:url(../flags/png/caf.png);background-image:url(../flags/caf.svg)}.flag-124,.flag-ca,.flag-can,.flag-fifa-can,.flag-ioc-can{background-image:url(../flags/png/can.png);background-image:url(../flags/can.svg)}.flag-166,.flag-cc,.flag-cck,.flag-fifa-cck{background-image:url(../flags/png/cck.png);background-image:url(../flags/cck.svg)}.flag-756,.flag-ch,.flag-che,.flag-fifa-sui,.flag-ioc-sui{background-image:url(../flags/png/che.png);background-image:url(../flags/che.svg)}.flag-152,.flag-chl,.flag-cl,.flag-fifa-chi,.flag-ioc-chi{background-image:url(../flags/png/chl.png);background-image:url(../flags/chl.svg)}.flag-156,.flag-chn,.flag-cn,.flag-fifa-chn,.flag-ioc-chn{background-image:url(../flags/png/chn.png);background-image:url(../flags/chn.svg)}.flag-384,.flag-ci,.flag-civ,.flag-fifa-civ,.flag-ioc-civ{background-image:url(../flags/png/civ.png);background-image:url(../flags/civ.svg)}.flag-120,.flag-cm,.flag-cmr,.flag-fifa-cmr,.flag-ioc-cmr{background-image:url(../flags/png/cmr.png);background-image:url(../flags/cmr.svg)}.flag-180,.flag-cd,.flag-cod,.flag-fifa-cod,.flag-ioc-cod{background-image:url(../flags/png/cod.png);background-image:url(../flags/cod.svg)}.flag-178,.flag-cg,.flag-cog,.flag-fifa-cgo,.flag-ioc-cgo{background-image:url(../flags/png/cog.png);background-image:url(../flags/cog.svg)}.flag-184,.flag-ck,.flag-cok,.flag-fifa-cok,.flag-ioc-cok{background-image:url(../flags/png/cok.png);background-image:url(../flags/cok.svg)}.flag-170,.flag-co,.flag-col,.flag-fifa-col,.flag-ioc-col{background-image:url(../flags/png/col.png);background-image:url(../flags/col.svg)}.flag-174,.flag-com,.flag-fifa-com,.flag-ioc-com,.flag-km{background-image:url(../flags/png/com.png);background-image:url(../flags/com.svg)}.flag-132,.flag-cpv,.flag-cv,.flag-fifa-cpv,.flag-ioc-cpv{background-image:url(../flags/png/cpv.png);background-image:url(../flags/cpv.svg)}.flag-188,.flag-cr,.flag-cri,.flag-fifa-crc,.flag-ioc-crc{background-image:url(../flags/png/cri.png);background-image:url(../flags/cri.svg)}.flag-192,.flag-cu,.flag-cub,.flag-fifa-cub,.flag-ioc-cub{background-image:url(../flags/png/cub.png);background-image:url(../flags/cub.svg)}.flag-531,.flag-cuw,.flag-cw{background-image:url(../flags/png/cuw.png);background-image:url(../flags/cuw.svg)}.flag-162,.flag-cx,.flag-cxr,.flag-fifa-cxr{background-image:url(../flags/png/cxr.png);background-image:url(../flags/cxr.svg)}.flag-136,.flag-cym,.flag-fifa-cay,.flag-ioc-cay,.flag-ky{background-image:url(../flags/png/cym.png);background-image:url(../flags/cym.svg)}.flag-196,.flag-cy,.flag-cyp,.flag-fifa-cyp,.flag-ioc-cyp{background-image:url(../flags/png/cyp.png);background-image:url(../flags/cyp.svg)}.flag-203,.flag-cz,.flag-cze,.flag-fifa-cze,.flag-ioc-cze{background-image:url(../flags/png/cze.png);background-image:url(../flags/cze.svg)}.flag-276,.flag-de,.flag-deu,.flag-fifa-ger,.flag-ioc-ger{background-image:url(../flags/png/deu.png);background-image:url(../flags/deu.svg)}.flag-262,.flag-dj,.flag-dji,.flag-fifa-dji,.flag-ioc-dji{background-image:url(../flags/png/dji.png);background-image:url(../flags/dji.svg)}.flag-212,.flag-dm,.flag-dma,.flag-fifa-dma,.flag-ioc-dma{background-image:url(../flags/png/dma.png);background-image:url(../flags/dma.svg)}.flag-208,.flag-dk,.flag-dnk,.flag-fifa-den,.flag-ioc-den{background-image:url(../flags/png/dnk.png);background-image:url(../flags/dnk.svg)}.flag-214,.flag-do,.flag-dom,.flag-fifa-dom,.flag-ioc-dom{background-image:url(../flags/png/dom.png);background-image:url(../flags/dom.svg)}.flag-12,.flag-dz,.flag-dza,.flag-fifa-alg,.flag-ioc-alg{background-image:url(../flags/png/dza.png);background-image:url(../flags/dza.svg)}.flag-218,.flag-ec,.flag-ecu,.flag-fifa-ecu,.flag-ioc-ecu{background-image:url(../flags/png/ecu.png);background-image:url(../flags/ecu.svg)}.flag-818,.flag-eg,.flag-egy,.flag-fifa-egy,.flag-ioc-egy{background-image:url(../flags/png/egy.png);background-image:url(../flags/egy.svg)}.flag-232,.flag-er,.flag-eri,.flag-fifa-eri,.flag-ioc-eri{background-image:url(../flags/png/eri.png);background-image:url(../flags/eri.svg)}.flag-732,.flag-eh,.flag-esh,.flag-fifa-sah{background-image:url(../flags/png/esh.png);background-image:url(../flags/esh.svg)}.flag-724,.flag-es,.flag-esp,.flag-fifa-esp,.flag-ioc-esp{background-image:url(../flags/png/esp.png);background-image:url(../flags/esp.svg)}.flag-233,.flag-ee,.flag-est,.flag-fifa-est,.flag-ioc-est{background-image:url(../flags/png/est.png);background-image:url(../flags/est.svg)}.flag-231,.flag-et,.flag-eth,.flag-fifa-eth,.flag-ioc-eth{background-image:url(../flags/png/eth.png);background-image:url(../flags/eth.svg)}.flag-246,.flag-fi,.flag-fifa-fin,.flag-fin,.flag-ioc-fin{background-image:url(../flags/png/fin.png);background-image:url(../flags/fin.svg)}.flag-242,.flag-fifa-fij,.flag-fj,.flag-fji,.flag-ioc-fij{background-image:url(../flags/png/fji.png);background-image:url(../flags/fji.svg)}.flag-238,.flag-fifa-flk,.flag-fk,.flag-flk,.flag-ioc-flk{background-image:url(../flags/png/flk.png);background-image:url(../flags/flk.svg)}.flag-250,.flag-fifa-fra,.flag-fr,.flag-fra,.flag-ioc-fra{background-image:url(../flags/png/fra.png);background-image:url(../flags/fra.svg)}.flag-234,.flag-fifa-fro,.flag-fo,.flag-fro,.flag-ioc-far{background-image:url(../flags/png/fro.png);background-image:url(../flags/fro.svg)}.flag-583,.flag-fifa-fsm,.flag-fm,.flag-fsm,.flag-ioc-fsm{background-image:url(../flags/png/fsm.png);background-image:url(../flags/fsm.svg)}.flag-266,.flag-fifa-gab,.flag-ga,.flag-gab,.flag-ioc-gab{background-image:url(../flags/png/gab.png);background-image:url(../flags/gab.svg)}.flag-826,.flag-gb,.flag-gbr,.flag-ioc-gbr{background-image:url(../flags/png/gbr.png);background-image:url(../flags/gbr.svg)}.flag-268,.flag-fifa-geo,.flag-ge,.flag-geo,.flag-ioc-geo{background-image:url(../flags/png/geo.png);background-image:url(../flags/geo.svg)}.flag-831,.flag-fifa-gbg,.flag-gg,.flag-ggy{background-image:url(../flags/png/ggy.png);background-image:url(../flags/ggy.svg)}.flag-288,.flag-fifa-gha,.flag-gh,.flag-gha,.flag-ioc-gha{background-image:url(../flags/png/gha.png);background-image:url(../flags/gha.svg)}.flag-292,.flag-fifa-gbz,.flag-gi,.flag-gib,.flag-ioc-gib{background-image:url(../flags/png/gib.png);background-image:url(../flags/gib.svg)}.flag-324,.flag-fifa-gui,.flag-gin,.flag-gn,.flag-ioc-gui{background-image:url(../flags/png/gin.png);background-image:url(../flags/gin.svg)}.flag-312,.flag-fifa-glp,.flag-glp,.flag-gp,.flag-ioc-gud{background-image:url(../flags/png/glp.png);background-image:url(../flags/glp.svg)}.flag-270,.flag-fifa-gam,.flag-gm,.flag-gmb,.flag-ioc-gam{background-image:url(../flags/png/gmb.png);background-image:url(../flags/gmb.svg)}.flag-624,.flag-fifa-gnb,.flag-gnb,.flag-gw,.flag-ioc-gbs{background-image:url(../flags/png/gnb.png);background-image:url(../flags/gnb.svg)}.flag-226,.flag-fifa-eqg,.flag-gnq,.flag-gq,.flag-ioc-geq{background-image:url(../flags/png/gnq.png);background-image:url(../flags/gnq.svg)}.flag-300,.flag-fifa-gre,.flag-gr,.flag-grc,.flag-ioc-gre{background-image:url(../flags/png/grc.png);background-image:url(../flags/grc.svg)}.flag-308,.flag-fifa-grn,.flag-gd,.flag-grd,.flag-ioc-grn{background-image:url(../flags/png/grd.png);background-image:url(../flags/grd.svg)}.flag-304,.flag-fifa-grl,.flag-gl,.flag-grl,.flag-ioc-grl{background-image:url(../flags/png/grl.png);background-image:url(../flags/grl.svg)}.flag-320,.flag-fifa-gua,.flag-gt,.flag-gtm,.flag-ioc-gua{background-image:url(../flags/png/gtm.png);background-image:url(../flags/gtm.svg)}.flag-254,.flag-fifa-guf,.flag-gf,.flag-guf,.flag-ioc-fgu{background-image:url(../flags/png/guf.png);background-image:url(../flags/guf.svg)}.flag-316,.flag-fifa-gum,.flag-gu,.flag-gum,.flag-ioc-gum{background-image:url(../flags/png/gum.png);background-image:url(../flags/gum.svg)}.flag-328,.flag-fifa-guy,.flag-guy,.flag-gy,.flag-ioc-guy{background-image:url(../flags/png/guy.png);background-image:url(../flags/guy.svg)}.flag-344,.flag-fifa-hkg,.flag-hk,.flag-hkg,.flag-ioc-hkg{background-image:url(../flags/png/hkg.png);background-image:url(../flags/hkg.svg)}.flag-334,.flag-hm,.flag-hmd{background-image:url(../flags/png/hmd.png);background-image:url(../flags/hmd.svg)}.flag-340,.flag-fifa-hon,.flag-hn,.flag-hnd,.flag-ioc-hon{background-image:url(../flags/png/hnd.png);background-image:url(../flags/hnd.svg)}.flag-191,.flag-fifa-cro,.flag-hr,.flag-hrv,.flag-ioc-cro{background-image:url(../flags/png/hrv.png);background-image:url(../flags/hrv.svg)}.flag-332,.flag-fifa-hai,.flag-ht,.flag-hti,.flag-ioc-hai{background-image:url(../flags/png/hti.png);background-image:url(../flags/hti.svg)}.flag-348,.flag-fifa-hun,.flag-hu,.flag-hun,.flag-ioc-hun{background-image:url(../flags/png/hun.png);background-image:url(../flags/hun.svg)}.flag-360,.flag-fifa-idn,.flag-id,.flag-idn,.flag-ioc-ina{background-image:url(../flags/png/idn.png);background-image:url(../flags/idn.svg)}.flag-833,.flag-fifa-gbm,.flag-im,.flag-imn{background-image:url(../flags/png/imn.png);background-image:url(../flags/imn.svg)}.flag-356,.flag-fifa-ind,.flag-in,.flag-ind,.flag-ioc-ind{background-image:url(../flags/png/ind.png);background-image:url(../flags/ind.svg)}.flag-86,.flag-io,.flag-iot{background-image:url(../flags/png/iot.png);background-image:url(../flags/iot.svg)}.flag-372,.flag-fifa-irl,.flag-ie,.flag-ioc-irl,.flag-irl{background-image:url(../flags/png/irl.png);background-image:url(../flags/irl.svg)}.flag-364,.flag-fifa-irn,.flag-ioc-iri,.flag-ir,.flag-irn{background-image:url(../flags/png/irn.png);background-image:url(../flags/irn.svg)}.flag-368,.flag-fifa-irq,.flag-ioc-irq,.flag-iq,.flag-irq{background-image:url(../flags/png/irq.png);background-image:url(../flags/irq.svg)}.flag-352,.flag-fifa-isl,.flag-ioc-isl,.flag-is,.flag-isl{background-image:url(../flags/png/isl.png);background-image:url(../flags/isl.svg)}.flag-376,.flag-fifa-isr,.flag-il,.flag-ioc-isr,.flag-isr{background-image:url(../flags/png/isr.png);background-image:url(../flags/isr.svg)}.flag-380,.flag-fifa-ita,.flag-ioc-ita,.flag-it,.flag-ita{background-image:url(../flags/png/ita.png);background-image:url(../flags/ita.svg)}.flag-388,.flag-fifa-jam,.flag-ioc-jam,.flag-jam,.flag-jm{background-image:url(../flags/png/jam.png);background-image:url(../flags/jam.svg)}.flag-832,.flag-fifa-gbj,.flag-je,.flag-jey{background-image:url(../flags/png/jey.png);background-image:url(../flags/jey.svg)}.flag-400,.flag-fifa-jor,.flag-ioc-jor,.flag-jo,.flag-jor{background-image:url(../flags/png/jor.png);background-image:url(../flags/jor.svg)}.flag-392,.flag-fifa-jpn,.flag-ioc-jpn,.flag-jp,.flag-jpn{background-image:url(../flags/png/jpn.png);background-image:url(../flags/jpn.svg)}.flag-398,.flag-fifa-kaz,.flag-ioc-kaz,.flag-kaz,.flag-kz{background-image:url(../flags/png/kaz.png);background-image:url(../flags/kaz.svg)}.flag-404,.flag-fifa-ken,.flag-ioc-ken,.flag-ke,.flag-ken{background-image:url(../flags/png/ken.png);background-image:url(../flags/ken.svg)}.flag-417,.flag-fifa-kgz,.flag-ioc-kgz,.flag-kg,.flag-kgz{background-image:url(../flags/png/kgz.png);background-image:url(../flags/kgz.svg)}.flag-116,.flag-fifa-cam,.flag-ioc-cam,.flag-kh,.flag-khm{background-image:url(../flags/png/khm.png);background-image:url(../flags/khm.svg)}.flag-296,.flag-fifa-kir,.flag-ioc-kir,.flag-ki,.flag-kir{background-image:url(../flags/png/kir.png);background-image:url(../flags/kir.svg)}.flag-659,.flag-fifa-skn,.flag-ioc-skn,.flag-kn,.flag-kna{background-image:url(../flags/png/kna.png);background-image:url(../flags/kna.svg)}.flag-410,.flag-fifa-kor,.flag-ioc-kor,.flag-kor,.flag-kr{background-image:url(../flags/png/kor.png);background-image:url(../flags/kor.svg)}.flag-414,.flag-fifa-kuw,.flag-ioc-kuw,.flag-kw,.flag-kwt{background-image:url(../flags/png/kwt.png);background-image:url(../flags/kwt.svg)}.flag-418,.flag-fifa-lao,.flag-ioc-lao,.flag-la,.flag-lao{background-image:url(../flags/png/lao.png);background-image:url(../flags/lao.svg)}.flag-422,.flag-fifa-lib,.flag-ioc-lib,.flag-lb,.flag-lbn{background-image:url(../flags/png/lbn.png);background-image:url(../flags/lbn.svg)}.flag-430,.flag-fifa-lbr,.flag-ioc-lbr,.flag-lbr,.flag-lr{background-image:url(../flags/png/lbr.png);background-image:url(../flags/lbr.svg)}.flag-434,.flag-fifa-lby,.flag-ioc-lba,.flag-lby,.flag-ly{background-image:url(../flags/png/lby.png);background-image:url(../flags/lby.svg)}.flag-662,.flag-fifa-lca,.flag-ioc-lca,.flag-lc,.flag-lca{background-image:url(../flags/png/lca.png);background-image:url(../flags/lca.svg)}.flag-438,.flag-fifa-lie,.flag-ioc-lie,.flag-li,.flag-lie{background-image:url(../flags/png/lie.png);background-image:url(../flags/lie.svg)}.flag-144,.flag-fifa-sri,.flag-ioc-sri,.flag-lk,.flag-lka{background-image:url(../flags/png/lka.png);background-image:url(../flags/lka.svg)}.flag-426,.flag-fifa-les,.flag-ioc-les,.flag-ls,.flag-lso{background-image:url(../flags/png/lso.png);background-image:url(../flags/lso.svg)}.flag-440,.flag-fifa-ltu,.flag-ioc-ltu,.flag-lt,.flag-ltu{background-image:url(../flags/png/ltu.png);background-image:url(../flags/ltu.svg)}.flag-442,.flag-fifa-lux,.flag-ioc-lux,.flag-lu,.flag-lux{background-image:url(../flags/png/lux.png);background-image:url(../flags/lux.svg)}.flag-428,.flag-fifa-lva,.flag-ioc-lat,.flag-lv,.flag-lva{background-image:url(../flags/png/lva.png);background-image:url(../flags/lva.svg)}.flag-446,.flag-fifa-mac,.flag-ioc-mac,.flag-mac,.flag-mo{background-image:url(../flags/png/mac.png);background-image:url(../flags/mac.svg)}.flag-663,.flag-maf,.flag-mf{background-image:url(../flags/png/maf.png);background-image:url(../flags/maf.svg)}.flag-504,.flag-fifa-mar,.flag-ioc-mar,.flag-ma,.flag-mar{background-image:url(../flags/png/mar.png);background-image:url(../flags/mar.svg)}.flag-492,.flag-fifa-mon,.flag-ioc-mon,.flag-mc,.flag-mco{background-image:url(../flags/png/mco.png);background-image:url(../flags/mco.svg)}.flag-498,.flag-fifa-mda,.flag-ioc-mda,.flag-md,.flag-mda{background-image:url(../flags/png/mda.png);background-image:url(../flags/mda.svg)}.flag-450,.flag-fifa-mad,.flag-ioc-mad,.flag-mdg,.flag-mg{background-image:url(../flags/png/mdg.png);background-image:url(../flags/mdg.svg)}.flag-462,.flag-fifa-mdv,.flag-ioc-mdv,.flag-mdv,.flag-mv{background-image:url(../flags/png/mdv.png);background-image:url(../flags/mdv.svg)}.flag-484,.flag-fifa-mex,.flag-ioc-mex,.flag-mex,.flag-mx{background-image:url(../flags/png/mex.png);background-image:url(../flags/mex.svg)}.flag-584,.flag-fifa-mhl,.flag-ioc-msh,.flag-mh,.flag-mhl{background-image:url(../flags/png/mhl.png);background-image:url(../flags/mhl.svg)}.flag-807,.flag-fifa-mkd,.flag-ioc-mkd,.flag-mk,.flag-mkd{background-image:url(../flags/png/mkd.png);background-image:url(../flags/mkd.svg)}.flag-466,.flag-fifa-mli,.flag-ioc-mli,.flag-ml,.flag-mli{background-image:url(../flags/png/mli.png);background-image:url(../flags/mli.svg)}.flag-470,.flag-fifa-mlt,.flag-ioc-mlt,.flag-mlt,.flag-mt{background-image:url(../flags/png/mlt.png);background-image:url(../flags/mlt.svg)}.flag-104,.flag-fifa-mya,.flag-ioc-mya,.flag-mm,.flag-mmr{background-image:url(../flags/png/mmr.png);background-image:url(../flags/mmr.svg)}.flag-499,.flag-fifa-mne,.flag-ioc-mgo,.flag-me,.flag-mne{background-image:url(../flags/png/mne.png);background-image:url(../flags/mne.svg)}.flag-496,.flag-fifa-mng,.flag-ioc-mgl,.flag-mn,.flag-mng{background-image:url(../flags/png/mng.png);background-image:url(../flags/mng.svg)}.flag-580,.flag-fifa-nmi,.flag-ioc-nma,.flag-mnp,.flag-mp{background-image:url(../flags/png/mnp.png);background-image:url(../flags/mnp.svg)}.flag-508,.flag-fifa-moz,.flag-ioc-moz,.flag-moz,.flag-mz{background-image:url(../flags/png/moz.png);background-image:url(../flags/moz.svg)}.flag-478,.flag-fifa-mtn,.flag-ioc-mtn,.flag-mr,.flag-mrt{background-image:url(../flags/png/mrt.png);background-image:url(../flags/mrt.svg)}.flag-500,.flag-fifa-msr,.flag-ioc-mnt,.flag-ms,.flag-msr{background-image:url(../flags/png/msr.png);background-image:url(../flags/msr.svg)}.flag-474,.flag-fifa-mtq,.flag-ioc-mrt,.flag-mq,.flag-mtq{background-image:url(../flags/png/mtq.png);background-image:url(../flags/mtq.svg)}.flag-480,.flag-fifa-mri,.flag-ioc-mri,.flag-mu,.flag-mus{background-image:url(../flags/png/mus.png);background-image:url(../flags/mus.svg)}.flag-454,.flag-fifa-mwi,.flag-ioc-maw,.flag-mw,.flag-mwi{background-image:url(../flags/png/mwi.png);background-image:url(../flags/mwi.svg)}.flag-458,.flag-fifa-mas,.flag-ioc-mas,.flag-my,.flag-mys{background-image:url(../flags/png/mys.png);background-image:url(../flags/mys.svg)}.flag-175,.flag-fifa-myt,.flag-ioc-may,.flag-myt,.flag-yt{background-image:url(../flags/png/myt.png);background-image:url(../flags/myt.svg)}.flag-516,.flag-fifa-nam,.flag-ioc-nam,.flag-na,.flag-nam{background-image:url(../flags/png/nam.png);background-image:url(../flags/nam.svg)}.flag-540,.flag-fifa-ncl,.flag-ioc-ncd,.flag-nc,.flag-ncl{background-image:url(../flags/png/ncl.png);background-image:url(../flags/ncl.svg)}.flag-562,.flag-fifa-nig,.flag-ioc-nig,.flag-ne,.flag-ner{background-image:url(../flags/png/ner.png);background-image:url(../flags/ner.svg)}.flag-574,.flag-fifa-nfk,.flag-ioc-nfi,.flag-nf,.flag-nfk{background-image:url(../flags/png/nfk.png);background-image:url(../flags/nfk.svg)}.flag-566,.flag-fifa-nga,.flag-ioc-ngr,.flag-ng,.flag-nga{background-image:url(../flags/png/nga.png);background-image:url(../flags/nga.svg)}.flag-558,.flag-fifa-nca,.flag-ioc-nca,.flag-ni,.flag-nic{background-image:url(../flags/png/nic.png);background-image:url(../flags/nic.svg)}.flag-570,.flag-fifa-niu,.flag-ioc-niu,.flag-niu,.flag-nu{background-image:url(../flags/png/niu.png);background-image:url(../flags/niu.svg)}.flag-528,.flag-fifa-ned,.flag-ioc-ned,.flag-nl,.flag-nld{background-image:url(../flags/png/nld.png);background-image:url(../flags/nld.svg)}.flag-578,.flag-fifa-nor,.flag-ioc-nor,.flag-no,.flag-nor{background-image:url(../flags/png/nor.png);background-image:url(../flags/nor.svg)}.flag-524,.flag-fifa-nep,.flag-ioc-nep,.flag-np,.flag-npl{background-image:url(../flags/png/npl.png);background-image:url(../flags/npl.svg)}.flag-520,.flag-fifa-nru,.flag-ioc-nru,.flag-nr,.flag-nru{background-image:url(../flags/png/nru.png);background-image:url(../flags/nru.svg)}.flag-554,.flag-fifa-nzl,.flag-ioc-nzl,.flag-nz,.flag-nzl{background-image:url(../flags/png/nzl.png);background-image:url(../flags/nzl.svg)}.flag-512,.flag-fifa-oma,.flag-ioc-oma,.flag-om,.flag-omn{background-image:url(../flags/png/omn.png);background-image:url(../flags/omn.svg)}.flag-586,.flag-fifa-pak,.flag-ioc-pak,.flag-pak,.flag-pk{background-image:url(../flags/png/pak.png);background-image:url(../flags/pak.svg)}.flag-591,.flag-fifa-pan,.flag-ioc-pan,.flag-pa,.flag-pan{background-image:url(../flags/png/pan.png);background-image:url(../flags/pan.svg)}.flag-612,.flag-fifa-pcn,.flag-pcn,.flag-pn{background-image:url(../flags/png/pcn.png);background-image:url(../flags/pcn.svg)}.flag-604,.flag-fifa-per,.flag-ioc-per,.flag-pe,.flag-per{background-image:url(../flags/png/per.png);background-image:url(../flags/per.svg)}.flag-608,.flag-fifa-phi,.flag-ioc-phi,.flag-ph,.flag-phl{background-image:url(../flags/png/phl.png);background-image:url(../flags/phl.svg)}.flag-585,.flag-fifa-plw,.flag-ioc-plw,.flag-plw,.flag-pw{background-image:url(../flags/png/plw.png);background-image:url(../flags/plw.svg)}.flag-598,.flag-fifa-png,.flag-ioc-png,.flag-pg,.flag-png{background-image:url(../flags/png/png.png);background-image:url(../flags/png.svg)}.flag-616,.flag-fifa-pol,.flag-ioc-pol,.flag-pl,.flag-pol{background-image:url(../flags/png/pol.png);background-image:url(../flags/pol.svg)}.flag-630,.flag-fifa-pur,.flag-ioc-pur,.flag-pr,.flag-pri{background-image:url(../flags/png/pri.png);background-image:url(../flags/pri.svg)}.flag-408,.flag-fifa-prk,.flag-ioc-prk,.flag-kp,.flag-prk{background-image:url(../flags/png/prk.png);background-image:url(../flags/prk.svg)}.flag-620,.flag-fifa-por,.flag-ioc-por,.flag-prt,.flag-pt{background-image:url(../flags/png/prt.png);background-image:url(../flags/prt.svg)}.flag-600,.flag-fifa-par,.flag-ioc-par,.flag-pry,.flag-py{background-image:url(../flags/png/pry.png);background-image:url(../flags/pry.svg)}.flag-275,.flag-fifa-ple,.flag-ioc-ple,.flag-ps,.flag-pse{background-image:url(../flags/png/pse.png);background-image:url(../flags/pse.svg)}.flag-258,.flag-fifa-tah2,.flag-ioc-fpo,.flag-pf,.flag-pyf{background-image:url(../flags/png/pyf.png);background-image:url(../flags/pyf.svg)}.flag-634,.flag-fifa-qat,.flag-ioc-qat,.flag-qa,.flag-qat{background-image:url(../flags/png/qat.png);background-image:url(../flags/qat.svg)}.flag-638,.flag-fifa-reu,.flag-ioc-reu,.flag-re,.flag-reu{background-image:url(../flags/png/reu.png);background-image:url(../flags/reu.svg)}.flag-642,.flag-fifa-rou,.flag-ioc-rou,.flag-ro,.flag-rou{background-image:url(../flags/png/rou.png);background-image:url(../flags/rou.svg)}.flag-643,.flag-fifa-rus,.flag-ioc-rus,.flag-ru,.flag-rus{background-image:url(../flags/png/rus.png);background-image:url(../flags/rus.svg)}.flag-646,.flag-fifa-rwa,.flag-ioc-rwa,.flag-rw,.flag-rwa{background-image:url(../flags/png/rwa.png);background-image:url(../flags/rwa.svg)}.flag-682,.flag-fifa-ksa,.flag-ioc-ksa,.flag-sa,.flag-sau{background-image:url(../flags/png/sau.png);background-image:url(../flags/sau.svg)}.flag-729,.flag-fifa-sud,.flag-ioc-sud,.flag-sd,.flag-sdn{background-image:url(../flags/png/sdn.png);background-image:url(../flags/sdn.svg)}.flag-686,.flag-fifa-sen,.flag-ioc-sen,.flag-sen,.flag-sn{background-image:url(../flags/png/sen.png);background-image:url(../flags/sen.svg)}.flag-702,.flag-fifa-sin,.flag-ioc-sin,.flag-sg,.flag-sgp{background-image:url(../flags/png/sgp.png);background-image:url(../flags/sgp.svg)}.flag-239,.flag-gs,.flag-sgs{background-image:url(../flags/png/sgs.png);background-image:url(../flags/sgs.svg)}.flag-654,.flag-fifa-shn,.flag-ioc-hel,.flag-sh,.flag-shn{background-image:url(../flags/png/shn.png);background-image:url(../flags/shn.svg)}.flag-744,.flag-sj,.flag-sjm{background-image:url(../flags/png/sjm.png);background-image:url(../flags/sjm.svg)}.flag-90,.flag-fifa-sol,.flag-ioc-sol,.flag-sb,.flag-slb{background-image:url(../flags/png/slb.png);background-image:url(../flags/slb.svg)}.flag-694,.flag-fifa-sle,.flag-ioc-sle,.flag-sl,.flag-sle{background-image:url(../flags/png/sle.png);background-image:url(../flags/sle.svg)}.flag-222,.flag-fifa-slv,.flag-ioc-esa,.flag-slv,.flag-sv{background-image:url(../flags/png/slv.png);background-image:url(../flags/slv.svg)}.flag-674,.flag-fifa-smr,.flag-ioc-smr,.flag-sm,.flag-smr{background-image:url(../flags/png/smr.png);background-image:url(../flags/smr.svg)}.flag-706,.flag-fifa-som,.flag-ioc-som,.flag-so,.flag-som{background-image:url(../flags/png/som.png);background-image:url(../flags/som.svg)}.flag-666,.flag-fifa-spm,.flag-ioc-spm,.flag-pm,.flag-spm{background-image:url(../flags/png/spm.png);background-image:url(../flags/spm.svg)}.flag-688,.flag-fifa-srb,.flag-ioc-srb,.flag-rs,.flag-srb{background-image:url(../flags/png/srb.png);background-image:url(../flags/srb.svg)}.flag-728,.flag-ss,.flag-ssd{background-image:url(../flags/png/ssd.png);background-image:url(../flags/ssd.svg)}.flag-678,.flag-fifa-stp,.flag-ioc-stp,.flag-st,.flag-stp{background-image:url(../flags/png/stp.png);background-image:url(../flags/stp.svg)}.flag-740,.flag-fifa-sur,.flag-ioc-sur,.flag-sr,.flag-sur{background-image:url(../flags/png/sur.png);background-image:url(../flags/sur.svg)}.flag-703,.flag-fifa-svk,.flag-ioc-svk,.flag-sk,.flag-svk{background-image:url(../flags/png/svk.png);background-image:url(../flags/svk.svg)}.flag-705,.flag-fifa-svn,.flag-ioc-slo,.flag-si,.flag-svn{background-image:url(../flags/png/svn.png);background-image:url(../flags/svn.svg)}.flag-752,.flag-fifa-swe,.flag-ioc-swe,.flag-se,.flag-swe{background-image:url(../flags/png/swe.png);background-image:url(../flags/swe.svg)}.flag-748,.flag-fifa-swz,.flag-ioc-swz,.flag-swz,.flag-sz{background-image:url(../flags/png/swz.png);background-image:url(../flags/swz.svg)}.flag-534,.flag-sx,.flag-sxm{background-image:url(../flags/png/sxm.png);background-image:url(../flags/sxm.svg)}.flag-690,.flag-fifa-sey,.flag-ioc-sey,.flag-sc,.flag-syc{background-image:url(../flags/png/syc.png);background-image:url(../flags/syc.svg)}.flag-760,.flag-fifa-syr,.flag-ioc-syr,.flag-sy,.flag-syr{background-image:url(../flags/png/syr.png);background-image:url(../flags/syr.svg)}.flag-796,.flag-fifa-tca,.flag-ioc-tks,.flag-tc,.flag-tca{background-image:url(../flags/png/tca.png);background-image:url(../flags/tca.svg)}.flag-148,.flag-fifa-cha,.flag-ioc-cha,.flag-tcd,.flag-td{background-image:url(../flags/png/tcd.png);background-image:url(../flags/tcd.svg)}.flag-768,.flag-fifa-tog,.flag-ioc-tog,.flag-tg,.flag-tgo{background-image:url(../flags/png/tgo.png);background-image:url(../flags/tgo.svg)}.flag-764,.flag-fifa-tha,.flag-ioc-tha,.flag-th,.flag-tha{background-image:url(../flags/png/tha.png);background-image:url(../flags/tha.svg)}.flag-762,.flag-fifa-tjk,.flag-ioc-tjk,.flag-tj,.flag-tjk{background-image:url(../flags/png/tjk.png);background-image:url(../flags/tjk.svg)}.flag-772,.flag-fifa-tkl,.flag-tk,.flag-tkl{background-image:url(../flags/png/tkl.png);background-image:url(../flags/tkl.svg)}.flag-795,.flag-fifa-tkm,.flag-ioc-tkm,.flag-tkm,.flag-tm{background-image:url(../flags/png/tkm.png);background-image:url(../flags/tkm.svg)}.flag-626,.flag-fifa-tls,.flag-ioc-tls,.flag-tl,.flag-tls{background-image:url(../flags/png/tls.png);background-image:url(../flags/tls.svg)}.flag-776,.flag-fifa-tga,.flag-ioc-tga,.flag-to,.flag-ton{background-image:url(../flags/png/ton.png);background-image:url(../flags/ton.svg)}.flag-780,.flag-fifa-tri,.flag-ioc-tto,.flag-tt,.flag-tto{background-image:url(../flags/png/tto.png);background-image:url(../flags/tto.svg)}.flag-788,.flag-fifa-tun,.flag-ioc-tun,.flag-tn,.flag-tun{background-image:url(../flags/png/tun.png);background-image:url(../flags/tun.svg)}.flag-792,.flag-fifa-tur,.flag-ioc-tur,.flag-tr,.flag-tur{background-image:url(../flags/png/tur.png);background-image:url(../flags/tur.svg)}.flag-798,.flag-fifa-tuv,.flag-ioc-tuv,.flag-tuv,.flag-tv{background-image:url(../flags/png/tuv.png);background-image:url(../flags/tuv.svg)}.flag-158,.flag-tw,.flag-twn{background-image:url(../flags/png/twn.png);background-image:url(../flags/twn.svg)}.flag-834,.flag-fifa-tan,.flag-ioc-tan,.flag-tz,.flag-tza{background-image:url(../flags/png/tza.png);background-image:url(../flags/tza.svg)}.flag-800,.flag-fifa-uga,.flag-ioc-uga,.flag-ug,.flag-uga{background-image:url(../flags/png/uga.png);background-image:url(../flags/uga.svg)}.flag-804,.flag-fifa-ukr,.flag-ioc-ukr,.flag-ua,.flag-ukr{background-image:url(../flags/png/ukr.png);background-image:url(../flags/ukr.svg)}.flag-581,.flag-um,.flag-umi{background-image:url(../flags/png/umi.png);background-image:url(../flags/umi.svg)}.flag-858,.flag-fifa-uru,.flag-ioc-uru,.flag-ury,.flag-uy{background-image:url(../flags/png/ury.png);background-image:url(../flags/ury.svg)}.flag-840,.flag-fifa-usa,.flag-ioc-usa,.flag-us,.flag-usa{background-image:url(../flags/png/usa.png);background-image:url(../flags/usa.svg)}.flag-860,.flag-fifa-uzb,.flag-ioc-uzb,.flag-uz,.flag-uzb{background-image:url(../flags/png/uzb.png);background-image:url(../flags/uzb.svg)}.flag-336,.flag-fifa-vat,.flag-va,.flag-vat{background-image:url(../flags/png/vat.png);background-image:url(../flags/vat.svg)}.flag-670,.flag-fifa-vin,.flag-ioc-vin,.flag-vc,.flag-vct{background-image:url(../flags/png/vct.png);background-image:url(../flags/vct.svg)}.flag-862,.flag-fifa-ven,.flag-ioc-ven,.flag-ve,.flag-ven{background-image:url(../flags/png/ven.png);background-image:url(../flags/ven.svg)}.flag-92,.flag-fifa-vgb,.flag-ioc-ivb,.flag-vg,.flag-vgb{background-image:url(../flags/png/vgb.png);background-image:url(../flags/vgb.svg)}.flag-850,.flag-fifa-vir,.flag-ioc-isv,.flag-vi,.flag-vir{background-image:url(../flags/png/vir.png);background-image:url(../flags/vir.svg)}.flag-704,.flag-fifa-vie,.flag-ioc-vie,.flag-vn,.flag-vnm{background-image:url(../flags/png/vnm.png);background-image:url(../flags/vnm.svg)}.flag-548,.flag-fifa-van,.flag-ioc-van,.flag-vu,.flag-vut{background-image:url(../flags/png/vut.png);background-image:url(../flags/vut.svg)}.flag-876,.flag-fifa-wlf,.flag-ioc-waf,.flag-wf,.flag-wlf{background-image:url(../flags/png/wlf.png);background-image:url(../flags/wlf.svg)}.flag-882,.flag-fifa-sam,.flag-ioc-sam,.flag-ws,.flag-wsm{background-image:url(../flags/png/wsm.png);background-image:url(../flags/wsm.svg)}.flag-887,.flag-fifa-yem,.flag-ioc-yem,.flag-ye,.flag-yem{background-image:url(../flags/png/yem.png);background-image:url(../flags/yem.svg)}.flag-710,.flag-fifa-rsa,.flag-ioc-rsa,.flag-za,.flag-zaf{background-image:url(../flags/png/zaf.png);background-image:url(../flags/zaf.svg)}.flag-894,.flag-fifa-zam,.flag-ioc-zam,.flag-zm,.flag-zmb{background-image:url(../flags/png/zmb.png);background-image:url(../flags/zmb.svg)}.flag-716,.flag-fifa-zim,.flag-ioc-zim,.flag-zw,.flag-zwe{background-image:url(../flags/png/zwe.png);background-image:url(../flags/zwe.svg)}.flag-fifa-eng{background-image:url(../flags/png/eng.png);background-image:url(../flags/eng.svg)}.flag-eu,.flag-eur{background-image:url(../flags/png/eur.png);background-image:url(../flags/eur.svg)}.flag-ioc-kos{background-image:url(../flags/png/kos.png);background-image:url(../flags/kos.svg)}.flag-fifa-nir{background-image:url(../flags/png/nir.png);background-image:url(../flags/nir.svg)}.flag-fifa-tpe,.flag-ico-tpe{background-image:url(../flags/png/tpe.png);background-image:url(../flags/tpe.svg)}.flag-fifa-sco{background-image:url(../flags/png/sco.png);background-image:url(../flags/sco.svg)}.flag-fifa-wal{background-image:url(../flags/png/wal.png);background-image:url(../flags/wal.svg)}@font-face{font-family:"Material Design Icons";src:url(../fonts/materialdesignicons-webfont.eot?v=1.9.32);src:url(../fonts/materialdesignicons-webfont.eot?#iefix&v=1.9.32) format("embedded-opentype"),url(../fonts/materialdesignicons-webfont.woff2?v=1.9.32) format("woff2"),url(../fonts/materialdesignicons-webfont.woff?v=1.9.32) format("woff"),url(../fonts/materialdesignicons-webfont.ttf?v=1.9.32) format("truetype"),url(../fonts/materialdesignicons-webfont.svg?v=1.9.32#materialdesigniconsregular) format("svg");font-weight:400;font-style:normal}.mdi-set,.mdi:before{display:inline-block;font:normal normal normal 24px/1 "Material Design Icons";font-size:inherit;text-rendering:auto;line-height:inherit;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.mdi-access-point:before{content:"\F002"}.mdi-access-point-network:before{content:"\F003"}.mdi-account:before{content:"\F004"}.mdi-account-alert:before{content:"\F005"}.mdi-account-box:before{content:"\F006"}.mdi-account-box-outline:before{content:"\F007"}.mdi-account-card-details:before{content:"\F5D2"}.mdi-account-check:before{content:"\F008"}.mdi-account-circle:before{content:"\F009"}.mdi-account-convert:before{content:"\F00A"}.mdi-account-edit:before{content:"\F6BB"}.mdi-account-key:before{content:"\F00B"}.mdi-account-location:before{content:"\F00C"}.mdi-account-minus:before{content:"\F00D"}.mdi-account-multiple:before{content:"\F00E"}.mdi-account-multiple-minus:before{content:"\F5D3"}.mdi-account-multiple-outline:before{content:"\F00F"}.mdi-account-multiple-plus:before{content:"\F010"}.mdi-account-network:before{content:"\F011"}.mdi-account-off:before{content:"\F012"}.mdi-account-outline:before{content:"\F013"}.mdi-account-plus:before{content:"\F014"}.mdi-account-remove:before{content:"\F015"}.mdi-account-search:before{content:"\F016"}.mdi-account-settings:before{content:"\F630"}.mdi-account-settings-variant:before{content:"\F631"}.mdi-account-star:before{content:"\F017"}.mdi-account-switch:before{content:"\F019"}.mdi-adjust:before{content:"\F01A"}.mdi-air-conditioner:before{content:"\F01B"}.mdi-airballoon:before{content:"\F01C"}.mdi-airplane:before{content:"\F01D"}.mdi-airplane-landing:before{content:"\F5D4"}.mdi-airplane-off:before{content:"\F01E"}.mdi-airplane-takeoff:before{content:"\F5D5"}.mdi-airplay:before{content:"\F01F"}.mdi-alarm:before{content:"\F020"}.mdi-alarm-check:before{content:"\F021"}.mdi-alarm-multiple:before{content:"\F022"}.mdi-alarm-off:before{content:"\F023"}.mdi-alarm-plus:before{content:"\F024"}.mdi-alarm-snooze:before{content:"\F68D"}.mdi-album:before{content:"\F025"}.mdi-alert:before{content:"\F026"}.mdi-alert-box:before{content:"\F027"}.mdi-alert-circle:before{content:"\F028"}.mdi-alert-circle-outline:before{content:"\F5D6"}.mdi-alert-decagram:before{content:"\F6BC"}.mdi-alert-octagon:before{content:"\F029"}.mdi-alert-octagram:before{content:"\F766"}.mdi-alert-outline:before{content:"\F02A"}.mdi-all-inclusive:before{content:"\F6BD"}.mdi-alpha:before{content:"\F02B"}.mdi-alphabetical:before{content:"\F02C"}.mdi-altimeter:before{content:"\F5D7"}.mdi-amazon:before{content:"\F02D"}.mdi-amazon-clouddrive:before{content:"\F02E"}.mdi-ambulance:before{content:"\F02F"}.mdi-amplifier:before{content:"\F030"}.mdi-anchor:before{content:"\F031"}.mdi-android:before{content:"\F032"}.mdi-android-debug-bridge:before{content:"\F033"}.mdi-android-studio:before{content:"\F034"}.mdi-angular:before{content:"\F6B1"}.mdi-angularjs:before{content:"\F6BE"}.mdi-animation:before{content:"\F5D8"}.mdi-apple:before{content:"\F035"}.mdi-apple-finder:before{content:"\F036"}.mdi-apple-ios:before{content:"\F037"}.mdi-apple-keyboard-caps:before{content:"\F632"}.mdi-apple-keyboard-command:before{content:"\F633"}.mdi-apple-keyboard-control:before{content:"\F634"}.mdi-apple-keyboard-option:before{content:"\F635"}.mdi-apple-keyboard-shift:before{content:"\F636"}.mdi-apple-mobileme:before{content:"\F038"}.mdi-apple-safari:before{content:"\F039"}.mdi-application:before{content:"\F614"}.mdi-apps:before{content:"\F03B"}.mdi-archive:before{content:"\F03C"}.mdi-arrange-bring-forward:before{content:"\F03D"}.mdi-arrange-bring-to-front:before{content:"\F03E"}.mdi-arrange-send-backward:before{content:"\F03F"}.mdi-arrange-send-to-back:before{content:"\F040"}.mdi-arrow-all:before{content:"\F041"}.mdi-arrow-bottom-left:before{content:"\F042"}.mdi-arrow-bottom-right:before{content:"\F043"}.mdi-arrow-compress:before{content:"\F615"}.mdi-arrow-compress-all:before{content:"\F044"}.mdi-arrow-down:before{content:"\F045"}.mdi-arrow-down-bold:before{content:"\F72D"}.mdi-arrow-down-bold-box:before{content:"\F72E"}.mdi-arrow-down-bold-box-outline:before{content:"\F72F"}.mdi-arrow-down-bold-circle:before{content:"\F047"}.mdi-arrow-down-bold-circle-outline:before{content:"\F048"}.mdi-arrow-down-bold-hexagon-outline:before{content:"\F049"}.mdi-arrow-down-box:before{content:"\F6BF"}.mdi-arrow-down-drop-circle:before{content:"\F04A"}.mdi-arrow-down-drop-circle-outline:before{content:"\F04B"}.mdi-arrow-down-thick:before{content:"\F046"}.mdi-arrow-expand:before{content:"\F616"}.mdi-arrow-expand-all:before{content:"\F04C"}.mdi-arrow-left:before{content:"\F04D"}.mdi-arrow-left-bold:before{content:"\F730"}.mdi-arrow-left-bold-box:before{content:"\F731"}.mdi-arrow-left-bold-box-outline:before{content:"\F732"}.mdi-arrow-left-bold-circle:before{content:"\F04F"}.mdi-arrow-left-bold-circle-outline:before{content:"\F050"}.mdi-arrow-left-bold-hexagon-outline:before{content:"\F051"}.mdi-arrow-left-box:before{content:"\F6C0"}.mdi-arrow-left-drop-circle:before{content:"\F052"}.mdi-arrow-left-drop-circle-outline:before{content:"\F053"}.mdi-arrow-left-thick:before{content:"\F04E"}.mdi-arrow-right:before{content:"\F054"}.mdi-arrow-right-bold:before{content:"\F733"}.mdi-arrow-right-bold-box:before{content:"\F734"}.mdi-arrow-right-bold-box-outline:before{content:"\F735"}.mdi-arrow-right-bold-circle:before{content:"\F056"}.mdi-arrow-right-bold-circle-outline:before{content:"\F057"}.mdi-arrow-right-bold-hexagon-outline:before{content:"\F058"}.mdi-arrow-right-box:before{content:"\F6C1"}.mdi-arrow-right-drop-circle:before{content:"\F059"}.mdi-arrow-right-drop-circle-outline:before{content:"\F05A"}.mdi-arrow-right-thick:before{content:"\F055"}.mdi-arrow-top-left:before{content:"\F05B"}.mdi-arrow-top-right:before{content:"\F05C"}.mdi-arrow-up:before{content:"\F05D"}.mdi-arrow-up-bold:before{content:"\F736"}.mdi-arrow-up-bold-box:before{content:"\F737"}.mdi-arrow-up-bold-box-outline:before{content:"\F738"}.mdi-arrow-up-bold-circle:before{content:"\F05F"}.mdi-arrow-up-bold-circle-outline:before{content:"\F060"}.mdi-arrow-up-bold-hexagon-outline:before{content:"\F061"}.mdi-arrow-up-box:before{content:"\F6C2"}.mdi-arrow-up-drop-circle:before{content:"\F062"}.mdi-arrow-up-drop-circle-outline:before{content:"\F063"}.mdi-arrow-up-thick:before{content:"\F05E"}.mdi-assistant:before{content:"\F064"}.mdi-asterisk:before{content:"\F6C3"}.mdi-at:before{content:"\F065"}.mdi-atom:before{content:"\F767"}.mdi-attachment:before{content:"\F066"}.mdi-audiobook:before{content:"\F067"}.mdi-auto-fix:before{content:"\F068"}.mdi-auto-upload:before{content:"\F069"}.mdi-autorenew:before{content:"\F06A"}.mdi-av-timer:before{content:"\F06B"}.mdi-baby:before{content:"\F06C"}.mdi-baby-buggy:before{content:"\F68E"}.mdi-backburger:before{content:"\F06D"}.mdi-backspace:before{content:"\F06E"}.mdi-backup-restore:before{content:"\F06F"}.mdi-bandcamp:before{content:"\F674"}.mdi-bank:before{content:"\F070"}.mdi-barcode:before{content:"\F071"}.mdi-barcode-scan:before{content:"\F072"}.mdi-barley:before{content:"\F073"}.mdi-barrel:before{content:"\F074"}.mdi-basecamp:before{content:"\F075"}.mdi-basket:before{content:"\F076"}.mdi-basket-fill:before{content:"\F077"}.mdi-basket-unfill:before{content:"\F078"}.mdi-battery:before{content:"\F079"}.mdi-battery-10:before{content:"\F07A"}.mdi-battery-20:before{content:"\F07B"}.mdi-battery-30:before{content:"\F07C"}.mdi-battery-40:before{content:"\F07D"}.mdi-battery-50:before{content:"\F07E"}.mdi-battery-60:before{content:"\F07F"}.mdi-battery-70:before{content:"\F080"}.mdi-battery-80:before{content:"\F081"}.mdi-battery-90:before{content:"\F082"}.mdi-battery-alert:before{content:"\F083"}.mdi-battery-charging:before{content:"\F084"}.mdi-battery-charging-100:before{content:"\F085"}.mdi-battery-charging-20:before{content:"\F086"}.mdi-battery-charging-30:before{content:"\F087"}.mdi-battery-charging-40:before{content:"\F088"}.mdi-battery-charging-60:before{content:"\F089"}.mdi-battery-charging-80:before{content:"\F08A"}.mdi-battery-charging-90:before{content:"\F08B"}.mdi-battery-minus:before{content:"\F08C"}.mdi-battery-negative:before{content:"\F08D"}.mdi-battery-outline:before{content:"\F08E"}.mdi-battery-plus:before{content:"\F08F"}.mdi-battery-positive:before{content:"\F090"}.mdi-battery-unknown:before{content:"\F091"}.mdi-beach:before{content:"\F092"}.mdi-beaker:before{content:"\F68F"}.mdi-beats:before{content:"\F097"}.mdi-beer:before{content:"\F098"}.mdi-behance:before{content:"\F099"}.mdi-bell:before{content:"\F09A"}.mdi-bell-off:before{content:"\F09B"}.mdi-bell-outline:before{content:"\F09C"}.mdi-bell-plus:before{content:"\F09D"}.mdi-bell-ring:before{content:"\F09E"}.mdi-bell-ring-outline:before{content:"\F09F"}.mdi-bell-sleep:before{content:"\F0A0"}.mdi-beta:before{content:"\F0A1"}.mdi-bible:before{content:"\F0A2"}.mdi-bike:before{content:"\F0A3"}.mdi-bing:before{content:"\F0A4"}.mdi-binoculars:before{content:"\F0A5"}.mdi-bio:before{content:"\F0A6"}.mdi-biohazard:before{content:"\F0A7"}.mdi-bitbucket:before{content:"\F0A8"}.mdi-black-mesa:before{content:"\F0A9"}.mdi-blackberry:before{content:"\F0AA"}.mdi-blender:before{content:"\F0AB"}.mdi-blinds:before{content:"\F0AC"}.mdi-block-helper:before{content:"\F0AD"}.mdi-blogger:before{content:"\F0AE"}.mdi-bluetooth:before{content:"\F0AF"}.mdi-bluetooth-audio:before{content:"\F0B0"}.mdi-bluetooth-connect:before{content:"\F0B1"}.mdi-bluetooth-off:before{content:"\F0B2"}.mdi-bluetooth-settings:before{content:"\F0B3"}.mdi-bluetooth-transfer:before{content:"\F0B4"}.mdi-blur:before{content:"\F0B5"}.mdi-blur-linear:before{content:"\F0B6"}.mdi-blur-off:before{content:"\F0B7"}.mdi-blur-radial:before{content:"\F0B8"}.mdi-bomb:before{content:"\F690"}.mdi-bomb-off:before{content:"\F6C4"}.mdi-bone:before{content:"\F0B9"}.mdi-book:before{content:"\F0BA"}.mdi-book-minus:before{content:"\F5D9"}.mdi-book-multiple:before{content:"\F0BB"}.mdi-book-multiple-variant:before{content:"\F0BC"}.mdi-book-open:before{content:"\F0BD"}.mdi-book-open-page-variant:before{content:"\F5DA"}.mdi-book-open-variant:before{content:"\F0BE"}.mdi-book-plus:before{content:"\F5DB"}.mdi-book-variant:before{content:"\F0BF"}.mdi-bookmark:before{content:"\F0C0"}.mdi-bookmark-check:before{content:"\F0C1"}.mdi-bookmark-music:before{content:"\F0C2"}.mdi-bookmark-outline:before{content:"\F0C3"}.mdi-bookmark-plus:before{content:"\F0C5"}.mdi-bookmark-plus-outline:before{content:"\F0C4"}.mdi-bookmark-remove:before{content:"\F0C6"}.mdi-boombox:before{content:"\F5DC"}.mdi-bootstrap:before{content:"\F6C5"}.mdi-border-all:before{content:"\F0C7"}.mdi-border-bottom:before{content:"\F0C8"}.mdi-border-color:before{content:"\F0C9"}.mdi-border-horizontal:before{content:"\F0CA"}.mdi-border-inside:before{content:"\F0CB"}.mdi-border-left:before{content:"\F0CC"}.mdi-border-none:before{content:"\F0CD"}.mdi-border-outside:before{content:"\F0CE"}.mdi-border-right:before{content:"\F0CF"}.mdi-border-style:before{content:"\F0D0"}.mdi-border-top:before{content:"\F0D1"}.mdi-border-vertical:before{content:"\F0D2"}.mdi-bow-tie:before{content:"\F677"}.mdi-bowl:before{content:"\F617"}.mdi-bowling:before{content:"\F0D3"}.mdi-box:before{content:"\F0D4"}.mdi-box-cutter:before{content:"\F0D5"}.mdi-box-shadow:before{content:"\F637"}.mdi-bridge:before{content:"\F618"}.mdi-briefcase:before{content:"\F0D6"}.mdi-briefcase-check:before{content:"\F0D7"}.mdi-briefcase-download:before{content:"\F0D8"}.mdi-briefcase-upload:before{content:"\F0D9"}.mdi-brightness-1:before{content:"\F0DA"}.mdi-brightness-2:before{content:"\F0DB"}.mdi-brightness-3:before{content:"\F0DC"}.mdi-brightness-4:before{content:"\F0DD"}.mdi-brightness-5:before{content:"\F0DE"}.mdi-brightness-6:before{content:"\F0DF"}.mdi-brightness-7:before{content:"\F0E0"}.mdi-brightness-auto:before{content:"\F0E1"}.mdi-broom:before{content:"\F0E2"}.mdi-brush:before{content:"\F0E3"}.mdi-buffer:before{content:"\F619"}.mdi-bug:before{content:"\F0E4"}.mdi-bulletin-board:before{content:"\F0E5"}.mdi-bullhorn:before{content:"\F0E6"}.mdi-bullseye:before{content:"\F5DD"}.mdi-burst-mode:before{content:"\F5DE"}.mdi-bus:before{content:"\F0E7"}.mdi-cached:before{content:"\F0E8"}.mdi-cake:before{content:"\F0E9"}.mdi-cake-layered:before{content:"\F0EA"}.mdi-cake-variant:before{content:"\F0EB"}.mdi-calculator:before{content:"\F0EC"}.mdi-calendar:before{content:"\F0ED"}.mdi-calendar-blank:before{content:"\F0EE"}.mdi-calendar-check:before{content:"\F0EF"}.mdi-calendar-clock:before{content:"\F0F0"}.mdi-calendar-multiple:before{content:"\F0F1"}.mdi-calendar-multiple-check:before{content:"\F0F2"}.mdi-calendar-plus:before{content:"\F0F3"}.mdi-calendar-question:before{content:"\F691"}.mdi-calendar-range:before{content:"\F678"}.mdi-calendar-remove:before{content:"\F0F4"}.mdi-calendar-text:before{content:"\F0F5"}.mdi-calendar-today:before{content:"\F0F6"}.mdi-call-made:before{content:"\F0F7"}.mdi-call-merge:before{content:"\F0F8"}.mdi-call-missed:before{content:"\F0F9"}.mdi-call-received:before{content:"\F0FA"}.mdi-call-split:before{content:"\F0FB"}.mdi-camcorder:before{content:"\F0FC"}.mdi-camcorder-box:before{content:"\F0FD"}.mdi-camcorder-box-off:before{content:"\F0FE"}.mdi-camcorder-off:before{content:"\F0FF"}.mdi-camera:before{content:"\F100"}.mdi-camera-burst:before{content:"\F692"}.mdi-camera-enhance:before{content:"\F101"}.mdi-camera-front:before{content:"\F102"}.mdi-camera-front-variant:before{content:"\F103"}.mdi-camera-iris:before{content:"\F104"}.mdi-camera-off:before{content:"\F5DF"}.mdi-camera-party-mode:before{content:"\F105"}.mdi-camera-rear:before{content:"\F106"}.mdi-camera-rear-variant:before{content:"\F107"}.mdi-camera-switch:before{content:"\F108"}.mdi-camera-timer:before{content:"\F109"}.mdi-cancel:before{content:"\F739"}.mdi-candle:before{content:"\F5E2"}.mdi-candycane:before{content:"\F10A"}.mdi-car:before{content:"\F10B"}.mdi-car-battery:before{content:"\F10C"}.mdi-car-connected:before{content:"\F10D"}.mdi-car-wash:before{content:"\F10E"}.mdi-cards:before{content:"\F638"}.mdi-cards-outline:before{content:"\F639"}.mdi-cards-playing-outline:before{content:"\F63A"}.mdi-cards-variant:before{content:"\F6C6"}.mdi-carrot:before{content:"\F10F"}.mdi-cart:before{content:"\F110"}.mdi-cart-off:before{content:"\F66B"}.mdi-cart-outline:before{content:"\F111"}.mdi-cart-plus:before{content:"\F112"}.mdi-case-sensitive-alt:before{content:"\F113"}.mdi-cash:before{content:"\F114"}.mdi-cash-100:before{content:"\F115"}.mdi-cash-multiple:before{content:"\F116"}.mdi-cash-usd:before{content:"\F117"}.mdi-cast:before{content:"\F118"}.mdi-cast-connected:before{content:"\F119"}.mdi-cast-off:before{content:"\F789"}.mdi-castle:before{content:"\F11A"}.mdi-cat:before{content:"\F11B"}.mdi-ceiling-light:before{content:"\F768"}.mdi-cellphone:before{content:"\F11C"}.mdi-cellphone-android:before{content:"\F11D"}.mdi-cellphone-basic:before{content:"\F11E"}.mdi-cellphone-dock:before{content:"\F11F"}.mdi-cellphone-iphone:before{content:"\F120"}.mdi-cellphone-link:before{content:"\F121"}.mdi-cellphone-link-off:before{content:"\F122"}.mdi-cellphone-settings:before{content:"\F123"}.mdi-certificate:before{content:"\F124"}.mdi-chair-school:before{content:"\F125"}.mdi-chart-arc:before{content:"\F126"}.mdi-chart-areaspline:before{content:"\F127"}.mdi-chart-bar:before{content:"\F128"}.mdi-chart-bar-stacked:before{content:"\F769"}.mdi-chart-bubble:before{content:"\F5E3"}.mdi-chart-gantt:before{content:"\F66C"}.mdi-chart-histogram:before{content:"\F129"}.mdi-chart-line:before{content:"\F12A"}.mdi-chart-line-stacked:before{content:"\F76A"}.mdi-chart-pie:before{content:"\F12B"}.mdi-chart-scatterplot-hexbin:before{content:"\F66D"}.mdi-chart-timeline:before{content:"\F66E"}.mdi-check:before{content:"\F12C"}.mdi-check-all:before{content:"\F12D"}.mdi-check-circle:before{content:"\F5E0"}.mdi-check-circle-outline:before{content:"\F5E1"}.mdi-checkbox-blank:before{content:"\F12E"}.mdi-checkbox-blank-circle:before{content:"\F12F"}.mdi-checkbox-blank-circle-outline:before{content:"\F130"}.mdi-checkbox-blank-outline:before{content:"\F131"}.mdi-checkbox-marked:before{content:"\F132"}.mdi-checkbox-marked-circle:before{content:"\F133"}.mdi-checkbox-marked-circle-outline:before{content:"\F134"}.mdi-checkbox-marked-outline:before{content:"\F135"}.mdi-checkbox-multiple-blank:before{content:"\F136"}.mdi-checkbox-multiple-blank-circle:before{content:"\F63B"}.mdi-checkbox-multiple-blank-circle-outline:before{content:"\F63C"}.mdi-checkbox-multiple-blank-outline:before{content:"\F137"}.mdi-checkbox-multiple-marked:before{content:"\F138"}.mdi-checkbox-multiple-marked-circle:before{content:"\F63D"}.mdi-checkbox-multiple-marked-circle-outline:before{content:"\F63E"}.mdi-checkbox-multiple-marked-outline:before{content:"\F139"}.mdi-checkerboard:before{content:"\F13A"}.mdi-chemical-weapon:before{content:"\F13B"}.mdi-chevron-double-down:before{content:"\F13C"}.mdi-chevron-double-left:before{content:"\F13D"}.mdi-chevron-double-right:before{content:"\F13E"}.mdi-chevron-double-up:before{content:"\F13F"}.mdi-chevron-down:before{content:"\F140"}.mdi-chevron-left:before{content:"\F141"}.mdi-chevron-right:before{content:"\F142"}.mdi-chevron-up:before{content:"\F143"}.mdi-chip:before{content:"\F61A"}.mdi-church:before{content:"\F144"}.mdi-circle:before{content:"\F764"}.mdi-circle-outline:before{content:"\F765"}.mdi-cisco-webex:before{content:"\F145"}.mdi-city:before{content:"\F146"}.mdi-clipboard:before{content:"\F147"}.mdi-clipboard-account:before{content:"\F148"}.mdi-clipboard-alert:before{content:"\F149"}.mdi-clipboard-arrow-down:before{content:"\F14A"}.mdi-clipboard-arrow-left:before{content:"\F14B"}.mdi-clipboard-check:before{content:"\F14C"}.mdi-clipboard-flow:before{content:"\F6C7"}.mdi-clipboard-outline:before{content:"\F14D"}.mdi-clipboard-plus:before{content:"\F750"}.mdi-clipboard-text:before{content:"\F14E"}.mdi-clippy:before{content:"\F14F"}.mdi-clock:before{content:"\F150"}.mdi-clock-alert:before{content:"\F5CE"}.mdi-clock-end:before{content:"\F151"}.mdi-clock-fast:before{content:"\F152"}.mdi-clock-in:before{content:"\F153"}.mdi-clock-out:before{content:"\F154"}.mdi-clock-start:before{content:"\F155"}.mdi-close:before{content:"\F156"}.mdi-close-box:before{content:"\F157"}.mdi-close-box-outline:before{content:"\F158"}.mdi-close-circle:before{content:"\F159"}.mdi-close-circle-outline:before{content:"\F15A"}.mdi-close-network:before{content:"\F15B"}.mdi-close-octagon:before{content:"\F15C"}.mdi-close-octagon-outline:before{content:"\F15D"}.mdi-close-outline:before{content:"\F6C8"}.mdi-closed-caption:before{content:"\F15E"}.mdi-cloud:before{content:"\F15F"}.mdi-cloud-check:before{content:"\F160"}.mdi-cloud-circle:before{content:"\F161"}.mdi-cloud-download:before{content:"\F162"}.mdi-cloud-off-outline:before{content:"\F164"}.mdi-cloud-outline:before{content:"\F163"}.mdi-cloud-print:before{content:"\F165"}.mdi-cloud-print-outline:before{content:"\F166"}.mdi-cloud-sync:before{content:"\F63F"}.mdi-cloud-upload:before{content:"\F167"}.mdi-code-array:before{content:"\F168"}.mdi-code-braces:before{content:"\F169"}.mdi-code-brackets:before{content:"\F16A"}.mdi-code-equal:before{content:"\F16B"}.mdi-code-greater-than:before{content:"\F16C"}.mdi-code-greater-than-or-equal:before{content:"\F16D"}.mdi-code-less-than:before{content:"\F16E"}.mdi-code-less-than-or-equal:before{content:"\F16F"}.mdi-code-not-equal:before{content:"\F170"}.mdi-code-not-equal-variant:before{content:"\F171"}.mdi-code-parentheses:before{content:"\F172"}.mdi-code-string:before{content:"\F173"}.mdi-code-tags:before{content:"\F174"}.mdi-code-tags-check:before{content:"\F693"}.mdi-codepen:before{content:"\F175"}.mdi-coffee:before{content:"\F176"}.mdi-coffee-outline:before{content:"\F6C9"}.mdi-coffee-to-go:before{content:"\F177"}.mdi-coin:before{content:"\F178"}.mdi-coins:before{content:"\F694"}.mdi-collage:before{content:"\F640"}.mdi-color-helper:before{content:"\F179"}.mdi-comment:before{content:"\F17A"}.mdi-comment-account:before{content:"\F17B"}.mdi-comment-account-outline:before{content:"\F17C"}.mdi-comment-alert:before{content:"\F17D"}.mdi-comment-alert-outline:before{content:"\F17E"}.mdi-comment-check:before{content:"\F17F"}.mdi-comment-check-outline:before{content:"\F180"}.mdi-comment-multiple-outline:before{content:"\F181"}.mdi-comment-outline:before{content:"\F182"}.mdi-comment-plus-outline:before{content:"\F183"}.mdi-comment-processing:before{content:"\F184"}.mdi-comment-processing-outline:before{content:"\F185"}.mdi-comment-question-outline:before{content:"\F186"}.mdi-comment-remove-outline:before{content:"\F187"}.mdi-comment-text:before{content:"\F188"}.mdi-comment-text-outline:before{content:"\F189"}.mdi-compare:before{content:"\F18A"}.mdi-compass:before{content:"\F18B"}.mdi-compass-outline:before{content:"\F18C"}.mdi-console:before{content:"\F18D"}.mdi-contact-mail:before{content:"\F18E"}.mdi-contacts:before{content:"\F6CA"}.mdi-content-copy:before{content:"\F18F"}.mdi-content-cut:before{content:"\F190"}.mdi-content-duplicate:before{content:"\F191"}.mdi-content-paste:before{content:"\F192"}.mdi-content-save:before{content:"\F193"}.mdi-content-save-all:before{content:"\F194"}.mdi-content-save-settings:before{content:"\F61B"}.mdi-contrast:before{content:"\F195"}.mdi-contrast-box:before{content:"\F196"}.mdi-contrast-circle:before{content:"\F197"}.mdi-cookie:before{content:"\F198"}.mdi-copyright:before{content:"\F5E6"}.mdi-counter:before{content:"\F199"}.mdi-cow:before{content:"\F19A"}.mdi-creation:before{content:"\F1C9"}.mdi-credit-card:before{content:"\F19B"}.mdi-credit-card-multiple:before{content:"\F19C"}.mdi-credit-card-off:before{content:"\F5E4"}.mdi-credit-card-plus:before{content:"\F675"}.mdi-credit-card-scan:before{content:"\F19D"}.mdi-crop:before{content:"\F19E"}.mdi-crop-free:before{content:"\F19F"}.mdi-crop-landscape:before{content:"\F1A0"}.mdi-crop-portrait:before{content:"\F1A1"}.mdi-crop-rotate:before{content:"\F695"}.mdi-crop-square:before{content:"\F1A2"}.mdi-crosshairs:before{content:"\F1A3"}.mdi-crosshairs-gps:before{content:"\F1A4"}.mdi-crown:before{content:"\F1A5"}.mdi-cube:before{content:"\F1A6"}.mdi-cube-outline:before{content:"\F1A7"}.mdi-cube-send:before{content:"\F1A8"}.mdi-cube-unfolded:before{content:"\F1A9"}.mdi-cup:before{content:"\F1AA"}.mdi-cup-off:before{content:"\F5E5"}.mdi-cup-water:before{content:"\F1AB"}.mdi-currency-btc:before{content:"\F1AC"}.mdi-currency-eur:before{content:"\F1AD"}.mdi-currency-gbp:before{content:"\F1AE"}.mdi-currency-inr:before{content:"\F1AF"}.mdi-currency-ngn:before{content:"\F1B0"}.mdi-currency-rub:before{content:"\F1B1"}.mdi-currency-try:before{content:"\F1B2"}.mdi-currency-usd:before{content:"\F1B3"}.mdi-currency-usd-off:before{content:"\F679"}.mdi-cursor-default:before{content:"\F1B4"}.mdi-cursor-default-outline:before{content:"\F1B5"}.mdi-cursor-move:before{content:"\F1B6"}.mdi-cursor-pointer:before{content:"\F1B7"}.mdi-cursor-text:before{content:"\F5E7"}.mdi-database:before{content:"\F1B8"}.mdi-database-minus:before{content:"\F1B9"}.mdi-database-plus:before{content:"\F1BA"}.mdi-debug-step-into:before{content:"\F1BB"}.mdi-debug-step-out:before{content:"\F1BC"}.mdi-debug-step-over:before{content:"\F1BD"}.mdi-decagram:before{content:"\F76B"}.mdi-decagram-outline:before{content:"\F76C"}.mdi-decimal-decrease:before{content:"\F1BE"}.mdi-decimal-increase:before{content:"\F1BF"}.mdi-delete:before{content:"\F1C0"}.mdi-delete-circle:before{content:"\F682"}.mdi-delete-empty:before{content:"\F6CB"}.mdi-delete-forever:before{content:"\F5E8"}.mdi-delete-sweep:before{content:"\F5E9"}.mdi-delete-variant:before{content:"\F1C1"}.mdi-delta:before{content:"\F1C2"}.mdi-deskphone:before{content:"\F1C3"}.mdi-desktop-mac:before{content:"\F1C4"}.mdi-desktop-tower:before{content:"\F1C5"}.mdi-details:before{content:"\F1C6"}.mdi-developer-board:before{content:"\F696"}.mdi-deviantart:before{content:"\F1C7"}.mdi-dialpad:before{content:"\F61C"}.mdi-diamond:before{content:"\F1C8"}.mdi-dice-1:before{content:"\F1CA"}.mdi-dice-2:before{content:"\F1CB"}.mdi-dice-3:before{content:"\F1CC"}.mdi-dice-4:before{content:"\F1CD"}.mdi-dice-5:before{content:"\F1CE"}.mdi-dice-6:before{content:"\F1CF"}.mdi-dice-d10:before{content:"\F76E"}.mdi-dice-d20:before{content:"\F5EA"}.mdi-dice-d4:before{content:"\F5EB"}.mdi-dice-d6:before{content:"\F5EC"}.mdi-dice-d8:before{content:"\F5ED"}.mdi-dice-multiple:before{content:"\F76D"}.mdi-dictionary:before{content:"\F61D"}.mdi-directions:before{content:"\F1D0"}.mdi-directions-fork:before{content:"\F641"}.mdi-discord:before{content:"\F66F"}.mdi-disk:before{content:"\F5EE"}.mdi-disk-alert:before{content:"\F1D1"}.mdi-disqus:before{content:"\F1D2"}.mdi-disqus-outline:before{content:"\F1D3"}.mdi-division:before{content:"\F1D4"}.mdi-division-box:before{content:"\F1D5"}.mdi-dna:before{content:"\F683"}.mdi-dns:before{content:"\F1D6"}.mdi-do-not-disturb:before{content:"\F697"}.mdi-do-not-disturb-off:before{content:"\F698"}.mdi-dolby:before{content:"\F6B2"}.mdi-domain:before{content:"\F1D7"}.mdi-dots-horizontal:before{content:"\F1D8"}.mdi-dots-vertical:before{content:"\F1D9"}.mdi-douban:before{content:"\F699"}.mdi-download:before{content:"\F1DA"}.mdi-download-network:before{content:"\F6F3"}.mdi-drag:before{content:"\F1DB"}.mdi-drag-horizontal:before{content:"\F1DC"}.mdi-drag-vertical:before{content:"\F1DD"}.mdi-drawing:before{content:"\F1DE"}.mdi-drawing-box:before{content:"\F1DF"}.mdi-dribbble:before{content:"\F1E0"}.mdi-dribbble-box:before{content:"\F1E1"}.mdi-drone:before{content:"\F1E2"}.mdi-dropbox:before{content:"\F1E3"}.mdi-drupal:before{content:"\F1E4"}.mdi-duck:before{content:"\F1E5"}.mdi-dumbbell:before{content:"\F1E6"}.mdi-earth:before{content:"\F1E7"}.mdi-earth-box:before{content:"\F6CC"}.mdi-earth-box-off:before{content:"\F6CD"}.mdi-earth-off:before{content:"\F1E8"}.mdi-edge:before{content:"\F1E9"}.mdi-eject:before{content:"\F1EA"}.mdi-elevation-decline:before{content:"\F1EB"}.mdi-elevation-rise:before{content:"\F1EC"}.mdi-elevator:before{content:"\F1ED"}.mdi-email:before{content:"\F1EE"}.mdi-email-alert:before{content:"\F6CE"}.mdi-email-open:before{content:"\F1EF"}.mdi-email-open-outline:before{content:"\F5EF"}.mdi-email-outline:before{content:"\F1F0"}.mdi-email-secure:before{content:"\F1F1"}.mdi-email-variant:before{content:"\F5F0"}.mdi-emby:before{content:"\F6B3"}.mdi-emoticon:before{content:"\F1F2"}.mdi-emoticon-cool:before{content:"\F1F3"}.mdi-emoticon-dead:before{content:"\F69A"}.mdi-emoticon-devil:before{content:"\F1F4"}.mdi-emoticon-excited:before{content:"\F69B"}.mdi-emoticon-happy:before{content:"\F1F5"}.mdi-emoticon-neutral:before{content:"\F1F6"}.mdi-emoticon-poop:before{content:"\F1F7"}.mdi-emoticon-sad:before{content:"\F1F8"}.mdi-emoticon-tongue:before{content:"\F1F9"}.mdi-engine:before{content:"\F1FA"}.mdi-engine-outline:before{content:"\F1FB"}.mdi-equal:before{content:"\F1FC"}.mdi-equal-box:before{content:"\F1FD"}.mdi-eraser:before{content:"\F1FE"}.mdi-eraser-variant:before{content:"\F642"}.mdi-escalator:before{content:"\F1FF"}.mdi-ethernet:before{content:"\F200"}.mdi-ethernet-cable:before{content:"\F201"}.mdi-ethernet-cable-off:before{content:"\F202"}.mdi-etsy:before{content:"\F203"}.mdi-ev-station:before{content:"\F5F1"}.mdi-evernote:before{content:"\F204"}.mdi-exclamation:before{content:"\F205"}.mdi-exit-to-app:before{content:"\F206"}.mdi-export:before{content:"\F207"}.mdi-eye:before{content:"\F208"}.mdi-eye-off:before{content:"\F209"}.mdi-eye-off-outline:before{content:"\F6D0"}.mdi-eye-outline:before{content:"\F6CF"}.mdi-eyedropper:before{content:"\F20A"}.mdi-eyedropper-variant:before{content:"\F20B"}.mdi-face:before{content:"\F643"}.mdi-face-profile:before{content:"\F644"}.mdi-facebook:before{content:"\F20C"}.mdi-facebook-box:before{content:"\F20D"}.mdi-facebook-messenger:before{content:"\F20E"}.mdi-factory:before{content:"\F20F"}.mdi-fan:before{content:"\F210"}.mdi-fast-forward:before{content:"\F211"}.mdi-fast-forward-outline:before{content:"\F6D1"}.mdi-fax:before{content:"\F212"}.mdi-feather:before{content:"\F6D2"}.mdi-ferry:before{content:"\F213"}.mdi-file:before{content:"\F214"}.mdi-file-account:before{content:"\F73A"}.mdi-file-chart:before{content:"\F215"}.mdi-file-check:before{content:"\F216"}.mdi-file-cloud:before{content:"\F217"}.mdi-file-delimited:before{content:"\F218"}.mdi-file-document:before{content:"\F219"}.mdi-file-document-box:before{content:"\F21A"}.mdi-file-excel:before{content:"\F21B"}.mdi-file-excel-box:before{content:"\F21C"}.mdi-file-export:before{content:"\F21D"}.mdi-file-find:before{content:"\F21E"}.mdi-file-hidden:before{content:"\F613"}.mdi-file-image:before{content:"\F21F"}.mdi-file-import:before{content:"\F220"}.mdi-file-lock:before{content:"\F221"}.mdi-file-multiple:before{content:"\F222"}.mdi-file-music:before{content:"\F223"}.mdi-file-outline:before{content:"\F224"}.mdi-file-pdf:before{content:"\F225"}.mdi-file-pdf-box:before{content:"\F226"}.mdi-file-plus:before{content:"\F751"}.mdi-file-powerpoint:before{content:"\F227"}.mdi-file-powerpoint-box:before{content:"\F228"}.mdi-file-presentation-box:before{content:"\F229"}.mdi-file-restore:before{content:"\F670"}.mdi-file-send:before{content:"\F22A"}.mdi-file-tree:before{content:"\F645"}.mdi-file-video:before{content:"\F22B"}.mdi-file-word:before{content:"\F22C"}.mdi-file-word-box:before{content:"\F22D"}.mdi-file-xml:before{content:"\F22E"}.mdi-film:before{content:"\F22F"}.mdi-filmstrip:before{content:"\F230"}.mdi-filmstrip-off:before{content:"\F231"}.mdi-filter:before{content:"\F232"}.mdi-filter-outline:before{content:"\F233"}.mdi-filter-remove:before{content:"\F234"}.mdi-filter-remove-outline:before{content:"\F235"}.mdi-filter-variant:before{content:"\F236"}.mdi-find-replace:before{content:"\F6D3"}.mdi-fingerprint:before{content:"\F237"}.mdi-fire:before{content:"\F238"}.mdi-firefox:before{content:"\F239"}.mdi-fish:before{content:"\F23A"}.mdi-flag:before{content:"\F23B"}.mdi-flag-checkered:before{content:"\F23C"}.mdi-flag-outline:before{content:"\F23D"}.mdi-flag-outline-variant:before{content:"\F23E"}.mdi-flag-triangle:before{content:"\F23F"}.mdi-flag-variant:before{content:"\F240"}.mdi-flash:before{content:"\F241"}.mdi-flash-auto:before{content:"\F242"}.mdi-flash-off:before{content:"\F243"}.mdi-flash-outline:before{content:"\F6D4"}.mdi-flash-red-eye:before{content:"\F67A"}.mdi-flashlight:before{content:"\F244"}.mdi-flashlight-off:before{content:"\F245"}.mdi-flask:before{content:"\F093"}.mdi-flask-empty:before{content:"\F094"}.mdi-flask-empty-outline:before{content:"\F095"}.mdi-flask-outline:before{content:"\F096"}.mdi-flattr:before{content:"\F246"}.mdi-flip-to-back:before{content:"\F247"}.mdi-flip-to-front:before{content:"\F248"}.mdi-floppy:before{content:"\F249"}.mdi-flower:before{content:"\F24A"}.mdi-folder:before{content:"\F24B"}.mdi-folder-account:before{content:"\F24C"}.mdi-folder-download:before{content:"\F24D"}.mdi-folder-google-drive:before{content:"\F24E"}.mdi-folder-image:before{content:"\F24F"}.mdi-folder-lock:before{content:"\F250"}.mdi-folder-lock-open:before{content:"\F251"}.mdi-folder-move:before{content:"\F252"}.mdi-folder-multiple:before{content:"\F253"}.mdi-folder-multiple-image:before{content:"\F254"}.mdi-folder-multiple-outline:before{content:"\F255"}.mdi-folder-open:before{content:"\F76F"}.mdi-folder-outline:before{content:"\F256"}.mdi-folder-plus:before{content:"\F257"}.mdi-folder-remove:before{content:"\F258"}.mdi-folder-star:before{content:"\F69C"}.mdi-folder-upload:before{content:"\F259"}.mdi-font-awesome:before{content:"\F03A"}.mdi-food:before{content:"\F25A"}.mdi-food-apple:before{content:"\F25B"}.mdi-food-fork-drink:before{content:"\F5F2"}.mdi-food-off:before{content:"\F5F3"}.mdi-food-variant:before{content:"\F25C"}.mdi-football:before{content:"\F25D"}.mdi-football-australian:before{content:"\F25E"}.mdi-football-helmet:before{content:"\F25F"}.mdi-format-align-bottom:before{content:"\F752"}.mdi-format-align-center:before{content:"\F260"}.mdi-format-align-justify:before{content:"\F261"}.mdi-format-align-left:before{content:"\F262"}.mdi-format-align-middle:before{content:"\F753"}.mdi-format-align-right:before{content:"\F263"}.mdi-format-align-top:before{content:"\F754"}.mdi-format-annotation-plus:before{content:"\F646"}.mdi-format-bold:before{content:"\F264"}.mdi-format-clear:before{content:"\F265"}.mdi-format-color-fill:before{content:"\F266"}.mdi-format-color-text:before{content:"\F69D"}.mdi-format-float-center:before{content:"\F267"}.mdi-format-float-left:before{content:"\F268"}.mdi-format-float-none:before{content:"\F269"}.mdi-format-float-right:before{content:"\F26A"}.mdi-format-font:before{content:"\F6D5"}.mdi-format-header-1:before{content:"\F26B"}.mdi-format-header-2:before{content:"\F26C"}.mdi-format-header-3:before{content:"\F26D"}.mdi-format-header-4:before{content:"\F26E"}.mdi-format-header-5:before{content:"\F26F"}.mdi-format-header-6:before{content:"\F270"}.mdi-format-header-decrease:before{content:"\F271"}.mdi-format-header-equal:before{content:"\F272"}.mdi-format-header-increase:before{content:"\F273"}.mdi-format-header-pound:before{content:"\F274"}.mdi-format-horizontal-align-center:before{content:"\F61E"}.mdi-format-horizontal-align-left:before{content:"\F61F"}.mdi-format-horizontal-align-right:before{content:"\F620"}.mdi-format-indent-decrease:before{content:"\F275"}.mdi-format-indent-increase:before{content:"\F276"}.mdi-format-italic:before{content:"\F277"}.mdi-format-line-spacing:before{content:"\F278"}.mdi-format-line-style:before{content:"\F5C8"}.mdi-format-line-weight:before{content:"\F5C9"}.mdi-format-list-bulleted:before{content:"\F279"}.mdi-format-list-bulleted-type:before{content:"\F27A"}.mdi-format-list-checks:before{content:"\F755"}.mdi-format-list-numbers:before{content:"\F27B"}.mdi-format-page-break:before{content:"\F6D6"}.mdi-format-paint:before{content:"\F27C"}.mdi-format-paragraph:before{content:"\F27D"}.mdi-format-pilcrow:before{content:"\F6D7"}.mdi-format-quote-close:before{content:"\F27E"}.mdi-format-quote-open:before{content:"\F756"}.mdi-format-rotate-90:before{content:"\F6A9"}.mdi-format-section:before{content:"\F69E"}.mdi-format-size:before{content:"\F27F"}.mdi-format-strikethrough:before{content:"\F280"}.mdi-format-strikethrough-variant:before{content:"\F281"}.mdi-format-subscript:before{content:"\F282"}.mdi-format-superscript:before{content:"\F283"}.mdi-format-text:before{content:"\F284"}.mdi-format-textdirection-l-to-r:before{content:"\F285"}.mdi-format-textdirection-r-to-l:before{content:"\F286"}.mdi-format-title:before{content:"\F5F4"}.mdi-format-underline:before{content:"\F287"}.mdi-format-vertical-align-bottom:before{content:"\F621"}.mdi-format-vertical-align-center:before{content:"\F622"}.mdi-format-vertical-align-top:before{content:"\F623"}.mdi-format-wrap-inline:before{content:"\F288"}.mdi-format-wrap-square:before{content:"\F289"}.mdi-format-wrap-tight:before{content:"\F28A"}.mdi-format-wrap-top-bottom:before{content:"\F28B"}.mdi-forum:before{content:"\F28C"}.mdi-forward:before{content:"\F28D"}.mdi-foursquare:before{content:"\F28E"}.mdi-fridge:before{content:"\F28F"}.mdi-fridge-filled:before{content:"\F290"}.mdi-fridge-filled-bottom:before{content:"\F291"}.mdi-fridge-filled-top:before{content:"\F292"}.mdi-fullscreen:before{content:"\F293"}.mdi-fullscreen-exit:before{content:"\F294"}.mdi-function:before{content:"\F295"}.mdi-gamepad:before{content:"\F296"}.mdi-gamepad-variant:before{content:"\F297"}.mdi-garage:before{content:"\F6D8"}.mdi-garage-open:before{content:"\F6D9"}.mdi-gas-cylinder:before{content:"\F647"}.mdi-gas-station:before{content:"\F298"}.mdi-gate:before{content:"\F299"}.mdi-gauge:before{content:"\F29A"}.mdi-gavel:before{content:"\F29B"}.mdi-gender-female:before{content:"\F29C"}.mdi-gender-male:before{content:"\F29D"}.mdi-gender-male-female:before{content:"\F29E"}.mdi-gender-transgender:before{content:"\F29F"}.mdi-gesture-double-tap:before{content:"\F73B"}.mdi-gesture-swipe-down:before{content:"\F73C"}.mdi-gesture-swipe-left:before{content:"\F73D"}.mdi-gesture-swipe-right:before{content:"\F73E"}.mdi-gesture-swipe-up:before{content:"\F73F"}.mdi-gesture-tap:before{content:"\F740"}.mdi-gesture-two-double-tap:before{content:"\F741"}.mdi-gesture-two-tap:before{content:"\F742"}.mdi-ghost:before{content:"\F2A0"}.mdi-gift:before{content:"\F2A1"}.mdi-git:before{content:"\F2A2"}.mdi-github-box:before{content:"\F2A3"}.mdi-github-circle:before{content:"\F2A4"}.mdi-github-face:before{content:"\F6DA"}.mdi-glass-flute:before{content:"\F2A5"}.mdi-glass-mug:before{content:"\F2A6"}.mdi-glass-stange:before{content:"\F2A7"}.mdi-glass-tulip:before{content:"\F2A8"}.mdi-glassdoor:before{content:"\F2A9"}.mdi-glasses:before{content:"\F2AA"}.mdi-gmail:before{content:"\F2AB"}.mdi-gnome:before{content:"\F2AC"}.mdi-gondola:before{content:"\F685"}.mdi-google:before{content:"\F2AD"}.mdi-google-cardboard:before{content:"\F2AE"}.mdi-google-chrome:before{content:"\F2AF"}.mdi-google-circles:before{content:"\F2B0"}.mdi-google-circles-communities:before{content:"\F2B1"}.mdi-google-circles-extended:before{content:"\F2B2"}.mdi-google-circles-group:before{content:"\F2B3"}.mdi-google-controller:before{content:"\F2B4"}.mdi-google-controller-off:before{content:"\F2B5"}.mdi-google-drive:before{content:"\F2B6"}.mdi-google-earth:before{content:"\F2B7"}.mdi-google-glass:before{content:"\F2B8"}.mdi-google-keep:before{content:"\F6DB"}.mdi-google-maps:before{content:"\F5F5"}.mdi-google-nearby:before{content:"\F2B9"}.mdi-google-pages:before{content:"\F2BA"}.mdi-google-photos:before{content:"\F6DC"}.mdi-google-physical-web:before{content:"\F2BB"}.mdi-google-play:before{content:"\F2BC"}.mdi-google-plus:before{content:"\F2BD"}.mdi-google-plus-box:before{content:"\F2BE"}.mdi-google-translate:before{content:"\F2BF"}.mdi-google-wallet:before{content:"\F2C0"}.mdi-gradient:before{content:"\F69F"}.mdi-grease-pencil:before{content:"\F648"}.mdi-grid:before{content:"\F2C1"}.mdi-grid-large:before{content:"\F757"}.mdi-grid-off:before{content:"\F2C2"}.mdi-group:before{content:"\F2C3"}.mdi-guitar-acoustic:before{content:"\F770"}.mdi-guitar-electric:before{content:"\F2C4"}.mdi-guitar-pick:before{content:"\F2C5"}.mdi-guitar-pick-outline:before{content:"\F2C6"}.mdi-hackernews:before{content:"\F624"}.mdi-hamburger:before{content:"\F684"}.mdi-hand-pointing-right:before{content:"\F2C7"}.mdi-hanger:before{content:"\F2C8"}.mdi-hangouts:before{content:"\F2C9"}.mdi-harddisk:before{content:"\F2CA"}.mdi-headphones:before{content:"\F2CB"}.mdi-headphones-box:before{content:"\F2CC"}.mdi-headphones-settings:before{content:"\F2CD"}.mdi-headset:before{content:"\F2CE"}.mdi-headset-dock:before{content:"\F2CF"}.mdi-headset-off:before{content:"\F2D0"}.mdi-heart:before{content:"\F2D1"}.mdi-heart-box:before{content:"\F2D2"}.mdi-heart-box-outline:before{content:"\F2D3"}.mdi-heart-broken:before{content:"\F2D4"}.mdi-heart-half:before{content:"\F6DE"}.mdi-heart-half-full:before{content:"\F6DD"}.mdi-heart-half-outline:before{content:"\F6DF"}.mdi-heart-off:before{content:"\F758"}.mdi-heart-outline:before{content:"\F2D5"}.mdi-heart-pulse:before{content:"\F5F6"}.mdi-help:before{content:"\F2D6"}.mdi-help-box:before{content:"\F78A"}.mdi-help-circle:before{content:"\F2D7"}.mdi-help-circle-outline:before{content:"\F625"}.mdi-help-network:before{content:"\F6F4"}.mdi-hexagon:before{content:"\F2D8"}.mdi-hexagon-multiple:before{content:"\F6E0"}.mdi-hexagon-outline:before{content:"\F2D9"}.mdi-highway:before{content:"\F5F7"}.mdi-history:before{content:"\F2DA"}.mdi-hololens:before{content:"\F2DB"}.mdi-home:before{content:"\F2DC"}.mdi-home-map-marker:before{content:"\F5F8"}.mdi-home-modern:before{content:"\F2DD"}.mdi-home-outline:before{content:"\F6A0"}.mdi-home-variant:before{content:"\F2DE"}.mdi-hook:before{content:"\F6E1"}.mdi-hook-off:before{content:"\F6E2"}.mdi-hops:before{content:"\F2DF"}.mdi-hospital:before{content:"\F2E0"}.mdi-hospital-building:before{content:"\F2E1"}.mdi-hospital-marker:before{content:"\F2E2"}.mdi-hotel:before{content:"\F2E3"}.mdi-houzz:before{content:"\F2E4"}.mdi-houzz-box:before{content:"\F2E5"}.mdi-human:before{content:"\F2E6"}.mdi-human-child:before{content:"\F2E7"}.mdi-human-female:before{content:"\F649"}.mdi-human-greeting:before{content:"\F64A"}.mdi-human-handsdown:before{content:"\F64B"}.mdi-human-handsup:before{content:"\F64C"}.mdi-human-male:before{content:"\F64D"}.mdi-human-male-female:before{content:"\F2E8"}.mdi-human-pregnant:before{content:"\F5CF"}.mdi-humble-bundle:before{content:"\F743"}.mdi-image:before{content:"\F2E9"}.mdi-image-album:before{content:"\F2EA"}.mdi-image-area:before{content:"\F2EB"}.mdi-image-area-close:before{content:"\F2EC"}.mdi-image-broken:before{content:"\F2ED"}.mdi-image-broken-variant:before{content:"\F2EE"}.mdi-image-filter:before{content:"\F2EF"}.mdi-image-filter-black-white:before{content:"\F2F0"}.mdi-image-filter-center-focus:before{content:"\F2F1"}.mdi-image-filter-center-focus-weak:before{content:"\F2F2"}.mdi-image-filter-drama:before{content:"\F2F3"}.mdi-image-filter-frames:before{content:"\F2F4"}.mdi-image-filter-hdr:before{content:"\F2F5"}.mdi-image-filter-none:before{content:"\F2F6"}.mdi-image-filter-tilt-shift:before{content:"\F2F7"}.mdi-image-filter-vintage:before{content:"\F2F8"}.mdi-image-multiple:before{content:"\F2F9"}.mdi-import:before{content:"\F2FA"}.mdi-inbox:before{content:"\F686"}.mdi-inbox-arrow-down:before{content:"\F2FB"}.mdi-inbox-arrow-up:before{content:"\F3D1"}.mdi-incognito:before{content:"\F5F9"}.mdi-infinity:before{content:"\F6E3"}.mdi-information:before{content:"\F2FC"}.mdi-information-outline:before{content:"\F2FD"}.mdi-information-variant:before{content:"\F64E"}.mdi-instagram:before{content:"\F2FE"}.mdi-instapaper:before{content:"\F2FF"}.mdi-internet-explorer:before{content:"\F300"}.mdi-invert-colors:before{content:"\F301"}.mdi-itunes:before{content:"\F676"}.mdi-jeepney:before{content:"\F302"}.mdi-jira:before{content:"\F303"}.mdi-jsfiddle:before{content:"\F304"}.mdi-json:before{content:"\F626"}.mdi-keg:before{content:"\F305"}.mdi-kettle:before{content:"\F5FA"}.mdi-key:before{content:"\F306"}.mdi-key-change:before{content:"\F307"}.mdi-key-minus:before{content:"\F308"}.mdi-key-plus:before{content:"\F309"}.mdi-key-remove:before{content:"\F30A"}.mdi-key-variant:before{content:"\F30B"}.mdi-keyboard:before{content:"\F30C"}.mdi-keyboard-backspace:before{content:"\F30D"}.mdi-keyboard-caps:before{content:"\F30E"}.mdi-keyboard-close:before{content:"\F30F"}.mdi-keyboard-off:before{content:"\F310"}.mdi-keyboard-return:before{content:"\F311"}.mdi-keyboard-tab:before{content:"\F312"}.mdi-keyboard-variant:before{content:"\F313"}.mdi-kickstarter:before{content:"\F744"}.mdi-kodi:before{content:"\F314"}.mdi-label:before{content:"\F315"}.mdi-label-outline:before{content:"\F316"}.mdi-lambda:before{content:"\F627"}.mdi-lamp:before{content:"\F6B4"}.mdi-lan:before{content:"\F317"}.mdi-lan-connect:before{content:"\F318"}.mdi-lan-disconnect:before{content:"\F319"}.mdi-lan-pending:before{content:"\F31A"}.mdi-language-c:before{content:"\F671"}.mdi-language-cpp:before{content:"\F672"}.mdi-language-csharp:before{content:"\F31B"}.mdi-language-css3:before{content:"\F31C"}.mdi-language-html5:before{content:"\F31D"}.mdi-language-javascript:before{content:"\F31E"}.mdi-language-php:before{content:"\F31F"}.mdi-language-python:before{content:"\F320"}.mdi-language-python-text:before{content:"\F321"}.mdi-language-swift:before{content:"\F6E4"}.mdi-language-typescript:before{content:"\F6E5"}.mdi-laptop:before{content:"\F322"}.mdi-laptop-chromebook:before{content:"\F323"}.mdi-laptop-mac:before{content:"\F324"}.mdi-laptop-off:before{content:"\F6E6"}.mdi-laptop-windows:before{content:"\F325"}.mdi-lastfm:before{content:"\F326"}.mdi-launch:before{content:"\F327"}.mdi-layers:before{content:"\F328"}.mdi-layers-off:before{content:"\F329"}.mdi-lead-pencil:before{content:"\F64F"}.mdi-leaf:before{content:"\F32A"}.mdi-led-off:before{content:"\F32B"}.mdi-led-on:before{content:"\F32C"}.mdi-led-outline:before{content:"\F32D"}.mdi-led-variant-off:before{content:"\F32E"}.mdi-led-variant-on:before{content:"\F32F"}.mdi-led-variant-outline:before{content:"\F330"}.mdi-library:before{content:"\F331"}.mdi-library-books:before{content:"\F332"}.mdi-library-music:before{content:"\F333"}.mdi-library-plus:before{content:"\F334"}.mdi-lightbulb:before{content:"\F335"}.mdi-lightbulb-on:before{content:"\F6E7"}.mdi-lightbulb-on-outline:before{content:"\F6E8"}.mdi-lightbulb-outline:before{content:"\F336"}.mdi-link:before{content:"\F337"}.mdi-link-off:before{content:"\F338"}.mdi-link-variant:before{content:"\F339"}.mdi-link-variant-off:before{content:"\F33A"}.mdi-linkedin:before{content:"\F33B"}.mdi-linkedin-box:before{content:"\F33C"}.mdi-linux:before{content:"\F33D"}.mdi-loading:before{content:"\F771"}.mdi-lock:before{content:"\F33E"}.mdi-lock-open:before{content:"\F33F"}.mdi-lock-open-outline:before{content:"\F340"}.mdi-lock-outline:before{content:"\F341"}.mdi-lock-pattern:before{content:"\F6E9"}.mdi-lock-plus:before{content:"\F5FB"}.mdi-lock-reset:before{content:"\F772"}.mdi-login:before{content:"\F342"}.mdi-login-variant:before{content:"\F5FC"}.mdi-logout:before{content:"\F343"}.mdi-logout-variant:before{content:"\F5FD"}.mdi-looks:before{content:"\F344"}.mdi-loop:before{content:"\F6EA"}.mdi-loupe:before{content:"\F345"}.mdi-lumx:before{content:"\F346"}.mdi-magnet:before{content:"\F347"}.mdi-magnet-on:before{content:"\F348"}.mdi-magnify:before{content:"\F349"}.mdi-magnify-minus:before{content:"\F34A"}.mdi-magnify-minus-outline:before{content:"\F6EB"}.mdi-magnify-plus:before{content:"\F34B"}.mdi-magnify-plus-outline:before{content:"\F6EC"}.mdi-mail-ru:before{content:"\F34C"}.mdi-mailbox:before{content:"\F6ED"}.mdi-map:before{content:"\F34D"}.mdi-map-marker:before{content:"\F34E"}.mdi-map-marker-circle:before{content:"\F34F"}.mdi-map-marker-minus:before{content:"\F650"}.mdi-map-marker-multiple:before{content:"\F350"}.mdi-map-marker-off:before{content:"\F351"}.mdi-map-marker-plus:before{content:"\F651"}.mdi-map-marker-radius:before{content:"\F352"}.mdi-margin:before{content:"\F353"}.mdi-markdown:before{content:"\F354"}.mdi-marker:before{content:"\F652"}.mdi-marker-check:before{content:"\F355"}.mdi-martini:before{content:"\F356"}.mdi-material-ui:before{content:"\F357"}.mdi-math-compass:before{content:"\F358"}.mdi-matrix:before{content:"\F628"}.mdi-maxcdn:before{content:"\F359"}.mdi-medical-bag:before{content:"\F6EE"}.mdi-medium:before{content:"\F35A"}.mdi-memory:before{content:"\F35B"}.mdi-menu:before{content:"\F35C"}.mdi-menu-down:before{content:"\F35D"}.mdi-menu-down-outline:before{content:"\F6B5"}.mdi-menu-left:before{content:"\F35E"}.mdi-menu-right:before{content:"\F35F"}.mdi-menu-up:before{content:"\F360"}.mdi-menu-up-outline:before{content:"\F6B6"}.mdi-message:before{content:"\F361"}.mdi-message-alert:before{content:"\F362"}.mdi-message-bulleted:before{content:"\F6A1"}.mdi-message-bulleted-off:before{content:"\F6A2"}.mdi-message-draw:before{content:"\F363"}.mdi-message-image:before{content:"\F364"}.mdi-message-outline:before{content:"\F365"}.mdi-message-plus:before{content:"\F653"}.mdi-message-processing:before{content:"\F366"}.mdi-message-reply:before{content:"\F367"}.mdi-message-reply-text:before{content:"\F368"}.mdi-message-settings:before{content:"\F6EF"}.mdi-message-settings-variant:before{content:"\F6F0"}.mdi-message-text:before{content:"\F369"}.mdi-message-text-outline:before{content:"\F36A"}.mdi-message-video:before{content:"\F36B"}.mdi-meteor:before{content:"\F629"}.mdi-microphone:before{content:"\F36C"}.mdi-microphone-off:before{content:"\F36D"}.mdi-microphone-outline:before{content:"\F36E"}.mdi-microphone-settings:before{content:"\F36F"}.mdi-microphone-variant:before{content:"\F370"}.mdi-microphone-variant-off:before{content:"\F371"}.mdi-microscope:before{content:"\F654"}.mdi-microsoft:before{content:"\F372"}.mdi-minecraft:before{content:"\F373"}.mdi-minus:before{content:"\F374"}.mdi-minus-box:before{content:"\F375"}.mdi-minus-box-outline:before{content:"\F6F1"}.mdi-minus-circle:before{content:"\F376"}.mdi-minus-circle-outline:before{content:"\F377"}.mdi-minus-network:before{content:"\F378"}.mdi-mixcloud:before{content:"\F62A"}.mdi-monitor:before{content:"\F379"}.mdi-monitor-multiple:before{content:"\F37A"}.mdi-more:before{content:"\F37B"}.mdi-motorbike:before{content:"\F37C"}.mdi-mouse:before{content:"\F37D"}.mdi-mouse-off:before{content:"\F37E"}.mdi-mouse-variant:before{content:"\F37F"}.mdi-mouse-variant-off:before{content:"\F380"}.mdi-move-resize:before{content:"\F655"}.mdi-move-resize-variant:before{content:"\F656"}.mdi-movie:before{content:"\F381"}.mdi-multiplication:before{content:"\F382"}.mdi-multiplication-box:before{content:"\F383"}.mdi-music:before{content:"\F759"}.mdi-music-box:before{content:"\F384"}.mdi-music-box-outline:before{content:"\F385"}.mdi-music-circle:before{content:"\F386"}.mdi-music-note:before{content:"\F387"}.mdi-music-note-bluetooth:before{content:"\F5FE"}.mdi-music-note-bluetooth-off:before{content:"\F5FF"}.mdi-music-note-eighth:before{content:"\F388"}.mdi-music-note-half:before{content:"\F389"}.mdi-music-note-off:before{content:"\F38A"}.mdi-music-note-quarter:before{content:"\F38B"}.mdi-music-note-sixteenth:before{content:"\F38C"}.mdi-music-note-whole:before{content:"\F38D"}.mdi-music-off:before{content:"\F75A"}.mdi-nature:before{content:"\F38E"}.mdi-nature-people:before{content:"\F38F"}.mdi-navigation:before{content:"\F390"}.mdi-near-me:before{content:"\F5CD"}.mdi-needle:before{content:"\F391"}.mdi-nest-protect:before{content:"\F392"}.mdi-nest-thermostat:before{content:"\F393"}.mdi-netflix:before{content:"\F745"}.mdi-network:before{content:"\F6F2"}.mdi-new-box:before{content:"\F394"}.mdi-newspaper:before{content:"\F395"}.mdi-nfc:before{content:"\F396"}.mdi-nfc-tap:before{content:"\F397"}.mdi-nfc-variant:before{content:"\F398"}.mdi-ninja:before{content:"\F773"}.mdi-nodejs:before{content:"\F399"}.mdi-note:before{content:"\F39A"}.mdi-note-multiple:before{content:"\F6B7"}.mdi-note-multiple-outline:before{content:"\F6B8"}.mdi-note-outline:before{content:"\F39B"}.mdi-note-plus:before{content:"\F39C"}.mdi-note-plus-outline:before{content:"\F39D"}.mdi-note-text:before{content:"\F39E"}.mdi-notification-clear-all:before{content:"\F39F"}.mdi-npm:before{content:"\F6F6"}.mdi-nuke:before{content:"\F6A3"}.mdi-numeric:before{content:"\F3A0"}.mdi-numeric-0-box:before{content:"\F3A1"}.mdi-numeric-0-box-multiple-outline:before{content:"\F3A2"}.mdi-numeric-0-box-outline:before{content:"\F3A3"}.mdi-numeric-1-box:before{content:"\F3A4"}.mdi-numeric-1-box-multiple-outline:before{content:"\F3A5"}.mdi-numeric-1-box-outline:before{content:"\F3A6"}.mdi-numeric-2-box:before{content:"\F3A7"}.mdi-numeric-2-box-multiple-outline:before{content:"\F3A8"}.mdi-numeric-2-box-outline:before{content:"\F3A9"}.mdi-numeric-3-box:before{content:"\F3AA"}.mdi-numeric-3-box-multiple-outline:before{content:"\F3AB"}.mdi-numeric-3-box-outline:before{content:"\F3AC"}.mdi-numeric-4-box:before{content:"\F3AD"}.mdi-numeric-4-box-multiple-outline:before{content:"\F3AE"}.mdi-numeric-4-box-outline:before{content:"\F3AF"}.mdi-numeric-5-box:before{content:"\F3B0"}.mdi-numeric-5-box-multiple-outline:before{content:"\F3B1"}.mdi-numeric-5-box-outline:before{content:"\F3B2"}.mdi-numeric-6-box:before{content:"\F3B3"}.mdi-numeric-6-box-multiple-outline:before{content:"\F3B4"}.mdi-numeric-6-box-outline:before{content:"\F3B5"}.mdi-numeric-7-box:before{content:"\F3B6"}.mdi-numeric-7-box-multiple-outline:before{content:"\F3B7"}.mdi-numeric-7-box-outline:before{content:"\F3B8"}.mdi-numeric-8-box:before{content:"\F3B9"}.mdi-numeric-8-box-multiple-outline:before{content:"\F3BA"}.mdi-numeric-8-box-outline:before{content:"\F3BB"}.mdi-numeric-9-box:before{content:"\F3BC"}.mdi-numeric-9-box-multiple-outline:before{content:"\F3BD"}.mdi-numeric-9-box-outline:before{content:"\F3BE"}.mdi-numeric-9-plus-box:before{content:"\F3BF"}.mdi-numeric-9-plus-box-multiple-outline:before{content:"\F3C0"}.mdi-numeric-9-plus-box-outline:before{content:"\F3C1"}.mdi-nut:before{content:"\F6F7"}.mdi-nutrition:before{content:"\F3C2"}.mdi-oar:before{content:"\F67B"}.mdi-octagon:before{content:"\F3C3"}.mdi-octagon-outline:before{content:"\F3C4"}.mdi-octagram:before{content:"\F6F8"}.mdi-octagram-outline:before{content:"\F774"}.mdi-odnoklassniki:before{content:"\F3C5"}.mdi-office:before{content:"\F3C6"}.mdi-oil:before{content:"\F3C7"}.mdi-oil-temperature:before{content:"\F3C8"}.mdi-omega:before{content:"\F3C9"}.mdi-onedrive:before{content:"\F3CA"}.mdi-onenote:before{content:"\F746"}.mdi-opacity:before{content:"\F5CC"}.mdi-open-in-app:before{content:"\F3CB"}.mdi-open-in-new:before{content:"\F3CC"}.mdi-openid:before{content:"\F3CD"}.mdi-opera:before{content:"\F3CE"}.mdi-orbit:before{content:"\F018"}.mdi-ornament:before{content:"\F3CF"}.mdi-ornament-variant:before{content:"\F3D0"}.mdi-owl:before{content:"\F3D2"}.mdi-package:before{content:"\F3D3"}.mdi-package-down:before{content:"\F3D4"}.mdi-package-up:before{content:"\F3D5"}.mdi-package-variant:before{content:"\F3D6"}.mdi-package-variant-closed:before{content:"\F3D7"}.mdi-page-first:before{content:"\F600"}.mdi-page-last:before{content:"\F601"}.mdi-page-layout-body:before{content:"\F6F9"}.mdi-page-layout-footer:before{content:"\F6FA"}.mdi-page-layout-header:before{content:"\F6FB"}.mdi-page-layout-sidebar-left:before{content:"\F6FC"}.mdi-page-layout-sidebar-right:before{content:"\F6FD"}.mdi-palette:before{content:"\F3D8"}.mdi-palette-advanced:before{content:"\F3D9"}.mdi-panda:before{content:"\F3DA"}.mdi-pandora:before{content:"\F3DB"}.mdi-panorama:before{content:"\F3DC"}.mdi-panorama-fisheye:before{content:"\F3DD"}.mdi-panorama-horizontal:before{content:"\F3DE"}.mdi-panorama-vertical:before{content:"\F3DF"}.mdi-panorama-wide-angle:before{content:"\F3E0"}.mdi-paper-cut-vertical:before{content:"\F3E1"}.mdi-paperclip:before{content:"\F3E2"}.mdi-parking:before{content:"\F3E3"}.mdi-pause:before{content:"\F3E4"}.mdi-pause-circle:before{content:"\F3E5"}.mdi-pause-circle-outline:before{content:"\F3E6"}.mdi-pause-octagon:before{content:"\F3E7"}.mdi-pause-octagon-outline:before{content:"\F3E8"}.mdi-paw:before{content:"\F3E9"}.mdi-paw-off:before{content:"\F657"}.mdi-pen:before{content:"\F3EA"}.mdi-pencil:before{content:"\F3EB"}.mdi-pencil-box:before{content:"\F3EC"}.mdi-pencil-box-outline:before{content:"\F3ED"}.mdi-pencil-circle:before{content:"\F6FE"}.mdi-pencil-circle-outline:before{content:"\F775"}.mdi-pencil-lock:before{content:"\F3EE"}.mdi-pencil-off:before{content:"\F3EF"}.mdi-pentagon:before{content:"\F6FF"}.mdi-pentagon-outline:before{content:"\F700"}.mdi-percent:before{content:"\F3F0"}.mdi-periscope:before{content:"\F747"}.mdi-pharmacy:before{content:"\F3F1"}.mdi-phone:before{content:"\F3F2"}.mdi-phone-bluetooth:before{content:"\F3F3"}.mdi-phone-classic:before{content:"\F602"}.mdi-phone-forward:before{content:"\F3F4"}.mdi-phone-hangup:before{content:"\F3F5"}.mdi-phone-in-talk:before{content:"\F3F6"}.mdi-phone-incoming:before{content:"\F3F7"}.mdi-phone-locked:before{content:"\F3F8"}.mdi-phone-log:before{content:"\F3F9"}.mdi-phone-minus:before{content:"\F658"}.mdi-phone-missed:before{content:"\F3FA"}.mdi-phone-outgoing:before{content:"\F3FB"}.mdi-phone-paused:before{content:"\F3FC"}.mdi-phone-plus:before{content:"\F659"}.mdi-phone-settings:before{content:"\F3FD"}.mdi-phone-voip:before{content:"\F3FE"}.mdi-pi:before{content:"\F3FF"}.mdi-pi-box:before{content:"\F400"}.mdi-piano:before{content:"\F67C"}.mdi-pig:before{content:"\F401"}.mdi-pill:before{content:"\F402"}.mdi-pillar:before{content:"\F701"}.mdi-pin:before{content:"\F403"}.mdi-pin-off:before{content:"\F404"}.mdi-pine-tree:before{content:"\F405"}.mdi-pine-tree-box:before{content:"\F406"}.mdi-pinterest:before{content:"\F407"}.mdi-pinterest-box:before{content:"\F408"}.mdi-pistol:before{content:"\F702"}.mdi-pizza:before{content:"\F409"}.mdi-plane-shield:before{content:"\F6BA"}.mdi-play:before{content:"\F40A"}.mdi-play-box-outline:before{content:"\F40B"}.mdi-play-circle:before{content:"\F40C"}.mdi-play-circle-outline:before{content:"\F40D"}.mdi-play-pause:before{content:"\F40E"}.mdi-play-protected-content:before{content:"\F40F"}.mdi-playlist-check:before{content:"\F5C7"}.mdi-playlist-minus:before{content:"\F410"}.mdi-playlist-play:before{content:"\F411"}.mdi-playlist-plus:before{content:"\F412"}.mdi-playlist-remove:before{content:"\F413"}.mdi-playstation:before{content:"\F414"}.mdi-plex:before{content:"\F6B9"}.mdi-plus:before{content:"\F415"}.mdi-plus-box:before{content:"\F416"}.mdi-plus-box-outline:before{content:"\F703"}.mdi-plus-circle:before{content:"\F417"}.mdi-plus-circle-multiple-outline:before{content:"\F418"}.mdi-plus-circle-outline:before{content:"\F419"}.mdi-plus-network:before{content:"\F41A"}.mdi-plus-one:before{content:"\F41B"}.mdi-plus-outline:before{content:"\F704"}.mdi-pocket:before{content:"\F41C"}.mdi-pokeball:before{content:"\F41D"}.mdi-polaroid:before{content:"\F41E"}.mdi-poll:before{content:"\F41F"}.mdi-poll-box:before{content:"\F420"}.mdi-polymer:before{content:"\F421"}.mdi-pool:before{content:"\F606"}.mdi-popcorn:before{content:"\F422"}.mdi-pot:before{content:"\F65A"}.mdi-pot-mix:before{content:"\F65B"}.mdi-pound:before{content:"\F423"}.mdi-pound-box:before{content:"\F424"}.mdi-power:before{content:"\F425"}.mdi-power-plug:before{content:"\F6A4"}.mdi-power-plug-off:before{content:"\F6A5"}.mdi-power-settings:before{content:"\F426"}.mdi-power-socket:before{content:"\F427"}.mdi-prescription:before{content:"\F705"}.mdi-presentation:before{content:"\F428"}.mdi-presentation-play:before{content:"\F429"}.mdi-printer:before{content:"\F42A"}.mdi-printer-3d:before{content:"\F42B"}.mdi-printer-alert:before{content:"\F42C"}.mdi-printer-settings:before{content:"\F706"}.mdi-priority-high:before{content:"\F603"}.mdi-priority-low:before{content:"\F604"}.mdi-professional-hexagon:before{content:"\F42D"}.mdi-projector:before{content:"\F42E"}.mdi-projector-screen:before{content:"\F42F"}.mdi-publish:before{content:"\F6A6"}.mdi-pulse:before{content:"\F430"}.mdi-puzzle:before{content:"\F431"}.mdi-qqchat:before{content:"\F605"}.mdi-qrcode:before{content:"\F432"}.mdi-qrcode-scan:before{content:"\F433"}.mdi-quadcopter:before{content:"\F434"}.mdi-quality-high:before{content:"\F435"}.mdi-quicktime:before{content:"\F436"}.mdi-radar:before{content:"\F437"}.mdi-radiator:before{content:"\F438"}.mdi-radio:before{content:"\F439"}.mdi-radio-handheld:before{content:"\F43A"}.mdi-radio-tower:before{content:"\F43B"}.mdi-radioactive:before{content:"\F43C"}.mdi-radiobox-blank:before{content:"\F43D"}.mdi-radiobox-marked:before{content:"\F43E"}.mdi-raspberrypi:before{content:"\F43F"}.mdi-ray-end:before{content:"\F440"}.mdi-ray-end-arrow:before{content:"\F441"}.mdi-ray-start:before{content:"\F442"}.mdi-ray-start-arrow:before{content:"\F443"}.mdi-ray-start-end:before{content:"\F444"}.mdi-ray-vertex:before{content:"\F445"}.mdi-rdio:before{content:"\F446"}.mdi-react:before{content:"\F707"}.mdi-read:before{content:"\F447"}.mdi-readability:before{content:"\F448"}.mdi-receipt:before{content:"\F449"}.mdi-record:before{content:"\F44A"}.mdi-record-rec:before{content:"\F44B"}.mdi-recycle:before{content:"\F44C"}.mdi-reddit:before{content:"\F44D"}.mdi-redo:before{content:"\F44E"}.mdi-redo-variant:before{content:"\F44F"}.mdi-refresh:before{content:"\F450"}.mdi-regex:before{content:"\F451"}.mdi-relative-scale:before{content:"\F452"}.mdi-reload:before{content:"\F453"}.mdi-remote:before{content:"\F454"}.mdi-rename-box:before{content:"\F455"}.mdi-reorder-horizontal:before{content:"\F687"}.mdi-reorder-vertical:before{content:"\F688"}.mdi-repeat:before{content:"\F456"}.mdi-repeat-off:before{content:"\F457"}.mdi-repeat-once:before{content:"\F458"}.mdi-replay:before{content:"\F459"}.mdi-reply:before{content:"\F45A"}.mdi-reply-all:before{content:"\F45B"}.mdi-reproduction:before{content:"\F45C"}.mdi-resize-bottom-right:before{content:"\F45D"}.mdi-responsive:before{content:"\F45E"}.mdi-restart:before{content:"\F708"}.mdi-restore:before{content:"\F6A7"}.mdi-rewind:before{content:"\F45F"}.mdi-rewind-outline:before{content:"\F709"}.mdi-rhombus:before{content:"\F70A"}.mdi-rhombus-outline:before{content:"\F70B"}.mdi-ribbon:before{content:"\F460"}.mdi-road:before{content:"\F461"}.mdi-road-variant:before{content:"\F462"}.mdi-robot:before{content:"\F6A8"}.mdi-rocket:before{content:"\F463"}.mdi-roomba:before{content:"\F70C"}.mdi-rotate-3d:before{content:"\F464"}.mdi-rotate-left:before{content:"\F465"}.mdi-rotate-left-variant:before{content:"\F466"}.mdi-rotate-right:before{content:"\F467"}.mdi-rotate-right-variant:before{content:"\F468"}.mdi-rounded-corner:before{content:"\F607"}.mdi-router-wireless:before{content:"\F469"}.mdi-routes:before{content:"\F46A"}.mdi-rowing:before{content:"\F608"}.mdi-rss:before{content:"\F46B"}.mdi-rss-box:before{content:"\F46C"}.mdi-ruler:before{content:"\F46D"}.mdi-run:before{content:"\F70D"}.mdi-run-fast:before{content:"\F46E"}.mdi-sale:before{content:"\F46F"}.mdi-satellite:before{content:"\F470"}.mdi-satellite-variant:before{content:"\F471"}.mdi-saxophone:before{content:"\F609"}.mdi-scale:before{content:"\F472"}.mdi-scale-balance:before{content:"\F5D1"}.mdi-scale-bathroom:before{content:"\F473"}.mdi-scanner:before{content:"\F6AA"}.mdi-school:before{content:"\F474"}.mdi-screen-rotation:before{content:"\F475"}.mdi-screen-rotation-lock:before{content:"\F476"}.mdi-screwdriver:before{content:"\F477"}.mdi-script:before{content:"\F478"}.mdi-sd:before{content:"\F479"}.mdi-seal:before{content:"\F47A"}.mdi-search-web:before{content:"\F70E"}.mdi-seat-flat:before{content:"\F47B"}.mdi-seat-flat-angled:before{content:"\F47C"}.mdi-seat-individual-suite:before{content:"\F47D"}.mdi-seat-legroom-extra:before{content:"\F47E"}.mdi-seat-legroom-normal:before{content:"\F47F"}.mdi-seat-legroom-reduced:before{content:"\F480"}.mdi-seat-recline-extra:before{content:"\F481"}.mdi-seat-recline-normal:before{content:"\F482"}.mdi-security:before{content:"\F483"}.mdi-security-home:before{content:"\F689"}.mdi-security-network:before{content:"\F484"}.mdi-select:before{content:"\F485"}.mdi-select-all:before{content:"\F486"}.mdi-select-inverse:before{content:"\F487"}.mdi-select-off:before{content:"\F488"}.mdi-selection:before{content:"\F489"}.mdi-selection-off:before{content:"\F776"}.mdi-send:before{content:"\F48A"}.mdi-serial-port:before{content:"\F65C"}.mdi-server:before{content:"\F48B"}.mdi-server-minus:before{content:"\F48C"}.mdi-server-network:before{content:"\F48D"}.mdi-server-network-off:before{content:"\F48E"}.mdi-server-off:before{content:"\F48F"}.mdi-server-plus:before{content:"\F490"}.mdi-server-remove:before{content:"\F491"}.mdi-server-security:before{content:"\F492"}.mdi-set-all:before{content:"\F777"}.mdi-set-center:before{content:"\F778"}.mdi-set-center-right:before{content:"\F779"}.mdi-set-left:before{content:"\F77A"}.mdi-set-left-center:before{content:"\F77B"}.mdi-set-left-right:before{content:"\F77C"}.mdi-set-none:before{content:"\F77D"}.mdi-set-right:before{content:"\F77E"}.mdi-settings:before{content:"\F493"}.mdi-settings-box:before{content:"\F494"}.mdi-shape-circle-plus:before{content:"\F65D"}.mdi-shape-plus:before{content:"\F495"}.mdi-shape-polygon-plus:before{content:"\F65E"}.mdi-shape-rectangle-plus:before{content:"\F65F"}.mdi-shape-square-plus:before{content:"\F660"}.mdi-share:before{content:"\F496"}.mdi-share-variant:before{content:"\F497"}.mdi-shield:before{content:"\F498"}.mdi-shield-half-full:before{content:"\F77F"}.mdi-shield-outline:before{content:"\F499"}.mdi-shopping:before{content:"\F49A"}.mdi-shopping-music:before{content:"\F49B"}.mdi-shovel:before{content:"\F70F"}.mdi-shovel-off:before{content:"\F710"}.mdi-shredder:before{content:"\F49C"}.mdi-shuffle:before{content:"\F49D"}.mdi-shuffle-disabled:before{content:"\F49E"}.mdi-shuffle-variant:before{content:"\F49F"}.mdi-sigma:before{content:"\F4A0"}.mdi-sigma-lower:before{content:"\F62B"}.mdi-sign-caution:before{content:"\F4A1"}.mdi-sign-direction:before{content:"\F780"}.mdi-sign-text:before{content:"\F781"}.mdi-signal:before{content:"\F4A2"}.mdi-signal-2g:before{content:"\F711"}.mdi-signal-3g:before{content:"\F712"}.mdi-signal-4g:before{content:"\F713"}.mdi-signal-hspa:before{content:"\F714"}.mdi-signal-hspa-plus:before{content:"\F715"}.mdi-signal-off:before{content:"\F782"}.mdi-signal-variant:before{content:"\F60A"}.mdi-silverware:before{content:"\F4A3"}.mdi-silverware-fork:before{content:"\F4A4"}.mdi-silverware-spoon:before{content:"\F4A5"}.mdi-silverware-variant:before{content:"\F4A6"}.mdi-sim:before{content:"\F4A7"}.mdi-sim-alert:before{content:"\F4A8"}.mdi-sim-off:before{content:"\F4A9"}.mdi-sitemap:before{content:"\F4AA"}.mdi-skip-backward:before{content:"\F4AB"}.mdi-skip-forward:before{content:"\F4AC"}.mdi-skip-next:before{content:"\F4AD"}.mdi-skip-next-circle:before{content:"\F661"}.mdi-skip-next-circle-outline:before{content:"\F662"}.mdi-skip-previous:before{content:"\F4AE"}.mdi-skip-previous-circle:before{content:"\F663"}.mdi-skip-previous-circle-outline:before{content:"\F664"}.mdi-skull:before{content:"\F68B"}.mdi-skype:before{content:"\F4AF"}.mdi-skype-business:before{content:"\F4B0"}.mdi-slack:before{content:"\F4B1"}.mdi-sleep:before{content:"\F4B2"}.mdi-sleep-off:before{content:"\F4B3"}.mdi-smoking:before{content:"\F4B4"}.mdi-smoking-off:before{content:"\F4B5"}.mdi-snapchat:before{content:"\F4B6"}.mdi-snowflake:before{content:"\F716"}.mdi-snowman:before{content:"\F4B7"}.mdi-soccer:before{content:"\F4B8"}.mdi-sofa:before{content:"\F4B9"}.mdi-solid:before{content:"\F68C"}.mdi-sort:before{content:"\F4BA"}.mdi-sort-alphabetical:before{content:"\F4BB"}.mdi-sort-ascending:before{content:"\F4BC"}.mdi-sort-descending:before{content:"\F4BD"}.mdi-sort-numeric:before{content:"\F4BE"}.mdi-sort-variant:before{content:"\F4BF"}.mdi-soundcloud:before{content:"\F4C0"}.mdi-source-branch:before{content:"\F62C"}.mdi-source-commit:before{content:"\F717"}.mdi-source-commit-end:before{content:"\F718"}.mdi-source-commit-end-local:before{content:"\F719"}.mdi-source-commit-local:before{content:"\F71A"}.mdi-source-commit-next-local:before{content:"\F71B"}.mdi-source-commit-start:before{content:"\F71C"}.mdi-source-commit-start-next-local:before{content:"\F71D"}.mdi-source-fork:before{content:"\F4C1"}.mdi-source-merge:before{content:"\F62D"}.mdi-source-pull:before{content:"\F4C2"}.mdi-speaker:before{content:"\F4C3"}.mdi-speaker-off:before{content:"\F4C4"}.mdi-speaker-wireless:before{content:"\F71E"}.mdi-speedometer:before{content:"\F4C5"}.mdi-spellcheck:before{content:"\F4C6"}.mdi-spotify:before{content:"\F4C7"}.mdi-spotlight:before{content:"\F4C8"}.mdi-spotlight-beam:before{content:"\F4C9"}.mdi-spray:before{content:"\F665"}.mdi-square:before{content:"\F763"}.mdi-square-inc:before{content:"\F4CA"}.mdi-square-inc-cash:before{content:"\F4CB"}.mdi-square-outline:before{content:"\F762"}.mdi-square-root:before{content:"\F783"}.mdi-stackexchange:before{content:"\F60B"}.mdi-stackoverflow:before{content:"\F4CC"}.mdi-stadium:before{content:"\F71F"}.mdi-stairs:before{content:"\F4CD"}.mdi-star:before{content:"\F4CE"}.mdi-star-circle:before{content:"\F4CF"}.mdi-star-half:before{content:"\F4D0"}.mdi-star-off:before{content:"\F4D1"}.mdi-star-outline:before{content:"\F4D2"}.mdi-steam:before{content:"\F4D3"}.mdi-steering:before{content:"\F4D4"}.mdi-step-backward:before{content:"\F4D5"}.mdi-step-backward-2:before{content:"\F4D6"}.mdi-step-forward:before{content:"\F4D7"}.mdi-step-forward-2:before{content:"\F4D8"}.mdi-stethoscope:before{content:"\F4D9"}.mdi-sticker:before{content:"\F5D0"}.mdi-sticker-emoji:before{content:"\F784"}.mdi-stocking:before{content:"\F4DA"}.mdi-stop:before{content:"\F4DB"}.mdi-stop-circle:before{content:"\F666"}.mdi-stop-circle-outline:before{content:"\F667"}.mdi-store:before{content:"\F4DC"}.mdi-store-24-hour:before{content:"\F4DD"}.mdi-stove:before{content:"\F4DE"}.mdi-subdirectory-arrow-left:before{content:"\F60C"}.mdi-subdirectory-arrow-right:before{content:"\F60D"}.mdi-subway:before{content:"\F6AB"}.mdi-subway-variant:before{content:"\F4DF"}.mdi-summit:before{content:"\F785"}.mdi-sunglasses:before{content:"\F4E0"}.mdi-surround-sound:before{content:"\F5C5"}.mdi-svg:before{content:"\F720"}.mdi-swap-horizontal:before{content:"\F4E1"}.mdi-swap-vertical:before{content:"\F4E2"}.mdi-swim:before{content:"\F4E3"}.mdi-switch:before{content:"\F4E4"}.mdi-sword:before{content:"\F4E5"}.mdi-sword-cross:before{content:"\F786"}.mdi-sync:before{content:"\F4E6"}.mdi-sync-alert:before{content:"\F4E7"}.mdi-sync-off:before{content:"\F4E8"}.mdi-tab:before{content:"\F4E9"}.mdi-tab-plus:before{content:"\F75B"}.mdi-tab-unselected:before{content:"\F4EA"}.mdi-table:before{content:"\F4EB"}.mdi-table-column-plus-after:before{content:"\F4EC"}.mdi-table-column-plus-before:before{content:"\F4ED"}.mdi-table-column-remove:before{content:"\F4EE"}.mdi-table-column-width:before{content:"\F4EF"}.mdi-table-edit:before{content:"\F4F0"}.mdi-table-large:before{content:"\F4F1"}.mdi-table-row-height:before{content:"\F4F2"}.mdi-table-row-plus-after:before{content:"\F4F3"}.mdi-table-row-plus-before:before{content:"\F4F4"}.mdi-table-row-remove:before{content:"\F4F5"}.mdi-tablet:before{content:"\F4F6"}.mdi-tablet-android:before{content:"\F4F7"}.mdi-tablet-ipad:before{content:"\F4F8"}.mdi-taco:before{content:"\F761"}.mdi-tag:before{content:"\F4F9"}.mdi-tag-faces:before{content:"\F4FA"}.mdi-tag-heart:before{content:"\F68A"}.mdi-tag-multiple:before{content:"\F4FB"}.mdi-tag-outline:before{content:"\F4FC"}.mdi-tag-plus:before{content:"\F721"}.mdi-tag-remove:before{content:"\F722"}.mdi-tag-text-outline:before{content:"\F4FD"}.mdi-target:before{content:"\F4FE"}.mdi-taxi:before{content:"\F4FF"}.mdi-teamviewer:before{content:"\F500"}.mdi-telegram:before{content:"\F501"}.mdi-television:before{content:"\F502"}.mdi-television-guide:before{content:"\F503"}.mdi-temperature-celsius:before{content:"\F504"}.mdi-temperature-fahrenheit:before{content:"\F505"}.mdi-temperature-kelvin:before{content:"\F506"}.mdi-tennis:before{content:"\F507"}.mdi-tent:before{content:"\F508"}.mdi-terrain:before{content:"\F509"}.mdi-test-tube:before{content:"\F668"}.mdi-text-shadow:before{content:"\F669"}.mdi-text-to-speech:before{content:"\F50A"}.mdi-text-to-speech-off:before{content:"\F50B"}.mdi-textbox:before{content:"\F60E"}.mdi-texture:before{content:"\F50C"}.mdi-theater:before{content:"\F50D"}.mdi-theme-light-dark:before{content:"\F50E"}.mdi-thermometer:before{content:"\F50F"}.mdi-thermometer-lines:before{content:"\F510"}.mdi-thumb-down:before{content:"\F511"}.mdi-thumb-down-outline:before{content:"\F512"}.mdi-thumb-up:before{content:"\F513"}.mdi-thumb-up-outline:before{content:"\F514"}.mdi-thumbs-up-down:before{content:"\F515"}.mdi-ticket:before{content:"\F516"}.mdi-ticket-account:before{content:"\F517"}.mdi-ticket-confirmation:before{content:"\F518"}.mdi-ticket-percent:before{content:"\F723"}.mdi-tie:before{content:"\F519"}.mdi-tilde:before{content:"\F724"}.mdi-timelapse:before{content:"\F51A"}.mdi-timer:before{content:"\F51B"}.mdi-timer-10:before{content:"\F51C"}.mdi-timer-3:before{content:"\F51D"}.mdi-timer-off:before{content:"\F51E"}.mdi-timer-sand:before{content:"\F51F"}.mdi-timer-sand-empty:before{content:"\F6AC"}.mdi-timer-sand-full:before{content:"\F78B"}.mdi-timetable:before{content:"\F520"}.mdi-toggle-switch:before{content:"\F521"}.mdi-toggle-switch-off:before{content:"\F522"}.mdi-tooltip:before{content:"\F523"}.mdi-tooltip-edit:before{content:"\F524"}.mdi-tooltip-image:before{content:"\F525"}.mdi-tooltip-outline:before{content:"\F526"}.mdi-tooltip-outline-plus:before{content:"\F527"}.mdi-tooltip-text:before{content:"\F528"}.mdi-tooth:before{content:"\F529"}.mdi-tor:before{content:"\F52A"}.mdi-tower-beach:before{content:"\F680"}.mdi-tower-fire:before{content:"\F681"}.mdi-traffic-light:before{content:"\F52B"}.mdi-train:before{content:"\F52C"}.mdi-tram:before{content:"\F52D"}.mdi-transcribe:before{content:"\F52E"}.mdi-transcribe-close:before{content:"\F52F"}.mdi-transfer:before{content:"\F530"}.mdi-transit-transfer:before{content:"\F6AD"}.mdi-translate:before{content:"\F5CA"}.mdi-treasure-chest:before{content:"\F725"}.mdi-tree:before{content:"\F531"}.mdi-trello:before{content:"\F532"}.mdi-trending-down:before{content:"\F533"}.mdi-trending-neutral:before{content:"\F534"}.mdi-trending-up:before{content:"\F535"}.mdi-triangle:before{content:"\F536"}.mdi-triangle-outline:before{content:"\F537"}.mdi-trophy:before{content:"\F538"}.mdi-trophy-award:before{content:"\F539"}.mdi-trophy-outline:before{content:"\F53A"}.mdi-trophy-variant:before{content:"\F53B"}.mdi-trophy-variant-outline:before{content:"\F53C"}.mdi-truck:before{content:"\F53D"}.mdi-truck-delivery:before{content:"\F53E"}.mdi-truck-fast:before{content:"\F787"}.mdi-truck-trailer:before{content:"\F726"}.mdi-tshirt-crew:before{content:"\F53F"}.mdi-tshirt-v:before{content:"\F540"}.mdi-tumblr:before{content:"\F541"}.mdi-tumblr-reblog:before{content:"\F542"}.mdi-tune:before{content:"\F62E"}.mdi-tune-vertical:before{content:"\F66A"}.mdi-twitch:before{content:"\F543"}.mdi-twitter:before{content:"\F544"}.mdi-twitter-box:before{content:"\F545"}.mdi-twitter-circle:before{content:"\F546"}.mdi-twitter-retweet:before{content:"\F547"}.mdi-uber:before{content:"\F748"}.mdi-ubuntu:before{content:"\F548"}.mdi-umbraco:before{content:"\F549"}.mdi-umbrella:before{content:"\F54A"}.mdi-umbrella-outline:before{content:"\F54B"}.mdi-undo:before{content:"\F54C"}.mdi-undo-variant:before{content:"\F54D"}.mdi-unfold-less-horizontal:before{content:"\F54E"}.mdi-unfold-less-vertical:before{content:"\F75F"}.mdi-unfold-more-horizontal:before{content:"\F54F"}.mdi-unfold-more-vertical:before{content:"\F760"}.mdi-ungroup:before{content:"\F550"}.mdi-unity:before{content:"\F6AE"}.mdi-untappd:before{content:"\F551"}.mdi-update:before{content:"\F6AF"}.mdi-upload:before{content:"\F552"}.mdi-upload-network:before{content:"\F6F5"}.mdi-usb:before{content:"\F553"}.mdi-vector-arrange-above:before{content:"\F554"}.mdi-vector-arrange-below:before{content:"\F555"}.mdi-vector-circle:before{content:"\F556"}.mdi-vector-circle-variant:before{content:"\F557"}.mdi-vector-combine:before{content:"\F558"}.mdi-vector-curve:before{content:"\F559"}.mdi-vector-difference:before{content:"\F55A"}.mdi-vector-difference-ab:before{content:"\F55B"}.mdi-vector-difference-ba:before{content:"\F55C"}.mdi-vector-intersection:before{content:"\F55D"}.mdi-vector-line:before{content:"\F55E"}.mdi-vector-point:before{content:"\F55F"}.mdi-vector-polygon:before{content:"\F560"}.mdi-vector-polyline:before{content:"\F561"}.mdi-vector-radius:before{content:"\F749"}.mdi-vector-rectangle:before{content:"\F5C6"}.mdi-vector-selection:before{content:"\F562"}.mdi-vector-square:before{content:"\F001"}.mdi-vector-triangle:before{content:"\F563"}.mdi-vector-union:before{content:"\F564"}.mdi-verified:before{content:"\F565"}.mdi-vibrate:before{content:"\F566"}.mdi-video:before{content:"\F567"}.mdi-video-off:before{content:"\F568"}.mdi-video-switch:before{content:"\F569"}.mdi-view-agenda:before{content:"\F56A"}.mdi-view-array:before{content:"\F56B"}.mdi-view-carousel:before{content:"\F56C"}.mdi-view-column:before{content:"\F56D"}.mdi-view-dashboard:before{content:"\F56E"}.mdi-view-day:before{content:"\F56F"}.mdi-view-grid:before{content:"\F570"}.mdi-view-headline:before{content:"\F571"}.mdi-view-list:before{content:"\F572"}.mdi-view-module:before{content:"\F573"}.mdi-view-parallel:before{content:"\F727"}.mdi-view-quilt:before{content:"\F574"}.mdi-view-sequential:before{content:"\F728"}.mdi-view-stream:before{content:"\F575"}.mdi-view-week:before{content:"\F576"}.mdi-vimeo:before{content:"\F577"}.mdi-vine:before{content:"\F578"}.mdi-violin:before{content:"\F60F"}.mdi-visualstudio:before{content:"\F610"}.mdi-vk:before{content:"\F579"}.mdi-vk-box:before{content:"\F57A"}.mdi-vk-circle:before{content:"\F57B"}.mdi-vlc:before{content:"\F57C"}.mdi-voice:before{content:"\F5CB"}.mdi-voicemail:before{content:"\F57D"}.mdi-volume-high:before{content:"\F57E"}.mdi-volume-low:before{content:"\F57F"}.mdi-volume-medium:before{content:"\F580"}.mdi-volume-minus:before{content:"\F75D"}.mdi-volume-mute:before{content:"\F75E"}.mdi-volume-off:before{content:"\F581"}.mdi-volume-plus:before{content:"\F75C"}.mdi-vpn:before{content:"\F582"}.mdi-walk:before{content:"\F583"}.mdi-wallet:before{content:"\F584"}.mdi-wallet-giftcard:before{content:"\F585"}.mdi-wallet-membership:before{content:"\F586"}.mdi-wallet-travel:before{content:"\F587"}.mdi-wan:before{content:"\F588"}.mdi-washing-machine:before{content:"\F729"}.mdi-watch:before{content:"\F589"}.mdi-watch-export:before{content:"\F58A"}.mdi-watch-import:before{content:"\F58B"}.mdi-watch-vibrate:before{content:"\F6B0"}.mdi-water:before{content:"\F58C"}.mdi-water-off:before{content:"\F58D"}.mdi-water-percent:before{content:"\F58E"}.mdi-water-pump:before{content:"\F58F"}.mdi-watermark:before{content:"\F612"}.mdi-waves:before{content:"\F78C"}.mdi-weather-cloudy:before{content:"\F590"}.mdi-weather-fog:before{content:"\F591"}.mdi-weather-hail:before{content:"\F592"}.mdi-weather-lightning:before{content:"\F593"}.mdi-weather-lightning-rainy:before{content:"\F67D"}.mdi-weather-night:before{content:"\F594"}.mdi-weather-partlycloudy:before{content:"\F595"}.mdi-weather-pouring:before{content:"\F596"}.mdi-weather-rainy:before{content:"\F597"}.mdi-weather-snowy:before{content:"\F598"}.mdi-weather-snowy-rainy:before{content:"\F67E"}.mdi-weather-sunny:before{content:"\F599"}.mdi-weather-sunset:before{content:"\F59A"}.mdi-weather-sunset-down:before{content:"\F59B"}.mdi-weather-sunset-up:before{content:"\F59C"}.mdi-weather-windy:before{content:"\F59D"}.mdi-weather-windy-variant:before{content:"\F59E"}.mdi-web:before{content:"\F59F"}.mdi-webcam:before{content:"\F5A0"}.mdi-webhook:before{content:"\F62F"}.mdi-webpack:before{content:"\F72A"}.mdi-wechat:before{content:"\F611"}.mdi-weight:before{content:"\F5A1"}.mdi-weight-kilogram:before{content:"\F5A2"}.mdi-whatsapp:before{content:"\F5A3"}.mdi-wheelchair-accessibility:before{content:"\F5A4"}.mdi-white-balance-auto:before{content:"\F5A5"}.mdi-white-balance-incandescent:before{content:"\F5A6"}.mdi-white-balance-iridescent:before{content:"\F5A7"}.mdi-white-balance-sunny:before{content:"\F5A8"}.mdi-widgets:before{content:"\F72B"}.mdi-wifi:before{content:"\F5A9"}.mdi-wifi-off:before{content:"\F5AA"}.mdi-wii:before{content:"\F5AB"}.mdi-wiiu:before{content:"\F72C"}.mdi-wikipedia:before{content:"\F5AC"}.mdi-window-close:before{content:"\F5AD"}.mdi-window-closed:before{content:"\F5AE"}.mdi-window-maximize:before{content:"\F5AF"}.mdi-window-minimize:before{content:"\F5B0"}.mdi-window-open:before{content:"\F5B1"}.mdi-window-restore:before{content:"\F5B2"}.mdi-windows:before{content:"\F5B3"}.mdi-wordpress:before{content:"\F5B4"}.mdi-worker:before{content:"\F5B5"}.mdi-wrap:before{content:"\F5B6"}.mdi-wrench:before{content:"\F5B7"}.mdi-wunderlist:before{content:"\F5B8"}.mdi-xaml:before{content:"\F673"}.mdi-xbox:before{content:"\F5B9"}.mdi-xbox-controller:before{content:"\F5BA"}.mdi-xbox-controller-battery-alert:before{content:"\F74A"}.mdi-xbox-controller-battery-empty:before{content:"\F74B"}.mdi-xbox-controller-battery-full:before{content:"\F74C"}.mdi-xbox-controller-battery-low:before{content:"\F74D"}.mdi-xbox-controller-battery-medium:before{content:"\F74E"}.mdi-xbox-controller-battery-unknown:before{content:"\F74F"}.mdi-xbox-controller-off:before{content:"\F5BB"}.mdi-xda:before{content:"\F5BC"}.mdi-xing:before{content:"\F5BD"}.mdi-xing-box:before{content:"\F5BE"}.mdi-xing-circle:before{content:"\F5BF"}.mdi-xml:before{content:"\F5C0"}.mdi-yammer:before{content:"\F788"}.mdi-yeast:before{content:"\F5C1"}.mdi-yelp:before{content:"\F5C2"}.mdi-yin-yang:before{content:"\F67F"}.mdi-youtube-play:before{content:"\F5C3"}.mdi-zip-box:before{content:"\F5C4"}.mdi-18px.mdi-set,.mdi-18px.mdi:before{font-size:18px}.mdi-24px.mdi-set,.mdi-24px.mdi:before{font-size:24px}.mdi-36px.mdi-set,.mdi-36px.mdi:before{font-size:36px}.mdi-48px.mdi-set,.mdi-48px.mdi:before{font-size:48px}.mdi-dark:before{color:rgba(0,0,0,.54)}.mdi-dark.mdi-inactive:before{color:rgba(0,0,0,.26)}.mdi-light:before{color:#fff}.mdi-light.mdi-inactive:before{color:rgba(255,255,255,.3)}.mdi-rotate-45:before{transform:rotate(45deg)}.mdi-rotate-90:before{transform:rotate(90deg)}.mdi-rotate-135:before{transform:rotate(135deg)}.mdi-rotate-180:before{transform:rotate(180deg)}.mdi-rotate-225:before{transform:rotate(225deg)}.mdi-rotate-270:before{transform:rotate(270deg)}.mdi-rotate-315:before{transform:rotate(315deg)}.mdi-flip-h:before{transform:scaleX(-1);filter:FlipH;-ms-filter:FlipH}.mdi-flip-v:before{transform:scaleY(-1);filter:FlipV;-ms-filter:FlipV}.mdi-spin:before{animation:mdi-spin 2s infinite linear}@keyframes mdi-spin{0%{transform:rotate(0)}100%{transform:rotate(359deg)}}.flag-icon-background{background-size:contain;background-position:50%;background-repeat:no-repeat}.flag-icon{background-size:contain;background-position:50%;background-repeat:no-repeat;position:relative;display:inline-block;width:1.33333333em;line-height:1em}.flag-icon:before{content:'\00a0'}.flag-icon.flag-icon-squared{width:1em}.flag-icon-ad{background-image:url(../flags/4x3/ad.svg)}.flag-icon-ad.flag-icon-squared{background-image:url(../flags/1x1/ad.svg)}.flag-icon-ae{background-image:url(../flags/4x3/ae.svg)}.flag-icon-ae.flag-icon-squared{background-image:url(../flags/1x1/ae.svg)}.flag-icon-af{background-image:url(../flags/4x3/af.svg)}.flag-icon-af.flag-icon-squared{background-image:url(../flags/1x1/af.svg)}.flag-icon-ag{background-image:url(../flags/4x3/ag.svg)}.flag-icon-ag.flag-icon-squared{background-image:url(../flags/1x1/ag.svg)}.flag-icon-ai{background-image:url(../flags/4x3/ai.svg)}.flag-icon-ai.flag-icon-squared{background-image:url(../flags/1x1/ai.svg)}.flag-icon-al{background-image:url(../flags/4x3/al.svg)}.flag-icon-al.flag-icon-squared{background-image:url(../flags/1x1/al.svg)}.flag-icon-am{background-image:url(../flags/4x3/am.svg)}.flag-icon-am.flag-icon-squared{background-image:url(../flags/1x1/am.svg)}.flag-icon-ao{background-image:url(../flags/4x3/ao.svg)}.flag-icon-ao.flag-icon-squared{background-image:url(../flags/1x1/ao.svg)}.flag-icon-aq{background-image:url(../flags/4x3/aq.svg)}.flag-icon-aq.flag-icon-squared{background-image:url(../flags/1x1/aq.svg)}.flag-icon-ar{background-image:url(../flags/4x3/ar.svg)}.flag-icon-ar.flag-icon-squared{background-image:url(../flags/1x1/ar.svg)}.flag-icon-as{background-image:url(../flags/4x3/as.svg)}.flag-icon-as.flag-icon-squared{background-image:url(../flags/1x1/as.svg)}.flag-icon-at{background-image:url(../flags/4x3/at.svg)}.flag-icon-at.flag-icon-squared{background-image:url(../flags/1x1/at.svg)}.flag-icon-au{background-image:url(../flags/4x3/au.svg)}.flag-icon-au.flag-icon-squared{background-image:url(../flags/1x1/au.svg)}.flag-icon-aw{background-image:url(../flags/4x3/aw.svg)}.flag-icon-aw.flag-icon-squared{background-image:url(../flags/1x1/aw.svg)}.flag-icon-ax{background-image:url(../flags/4x3/ax.svg)}.flag-icon-ax.flag-icon-squared{background-image:url(../flags/1x1/ax.svg)}.flag-icon-az{background-image:url(../flags/4x3/az.svg)}.flag-icon-az.flag-icon-squared{background-image:url(../flags/1x1/az.svg)}.flag-icon-ba{background-image:url(../flags/4x3/ba.svg)}.flag-icon-ba.flag-icon-squared{background-image:url(../flags/1x1/ba.svg)}.flag-icon-bb{background-image:url(../flags/4x3/bb.svg)}.flag-icon-bb.flag-icon-squared{background-image:url(../flags/1x1/bb.svg)}.flag-icon-bd{background-image:url(../flags/4x3/bd.svg)}.flag-icon-bd.flag-icon-squared{background-image:url(../flags/1x1/bd.svg)}.flag-icon-be{background-image:url(../flags/4x3/be.svg)}.flag-icon-be.flag-icon-squared{background-image:url(../flags/1x1/be.svg)}.flag-icon-bf{background-image:url(../flags/4x3/bf.svg)}.flag-icon-bf.flag-icon-squared{background-image:url(../flags/1x1/bf.svg)}.flag-icon-bg{background-image:url(../flags/4x3/bg.svg)}.flag-icon-bg.flag-icon-squared{background-image:url(../flags/1x1/bg.svg)}.flag-icon-bh{background-image:url(../flags/4x3/bh.svg)}.flag-icon-bh.flag-icon-squared{background-image:url(../flags/1x1/bh.svg)}.flag-icon-bi{background-image:url(../flags/4x3/bi.svg)}.flag-icon-bi.flag-icon-squared{background-image:url(../flags/1x1/bi.svg)}.flag-icon-bj{background-image:url(../flags/4x3/bj.svg)}.flag-icon-bj.flag-icon-squared{background-image:url(../flags/1x1/bj.svg)}.flag-icon-bl{background-image:url(../flags/4x3/bl.svg)}.flag-icon-bl.flag-icon-squared{background-image:url(../flags/1x1/bl.svg)}.flag-icon-bm{background-image:url(../flags/4x3/bm.svg)}.flag-icon-bm.flag-icon-squared{background-image:url(../flags/1x1/bm.svg)}.flag-icon-bn{background-image:url(../flags/4x3/bn.svg)}.flag-icon-bn.flag-icon-squared{background-image:url(../flags/1x1/bn.svg)}.flag-icon-bo{background-image:url(../flags/4x3/bo.svg)}.flag-icon-bo.flag-icon-squared{background-image:url(../flags/1x1/bo.svg)}.flag-icon-bq{background-image:url(../flags/4x3/bq.svg)}.flag-icon-bq.flag-icon-squared{background-image:url(../flags/1x1/bq.svg)}.flag-icon-br{background-image:url(../flags/4x3/br.svg)}.flag-icon-br.flag-icon-squared{background-image:url(../flags/1x1/br.svg)}.flag-icon-bs{background-image:url(../flags/4x3/bs.svg)}.flag-icon-bs.flag-icon-squared{background-image:url(../flags/1x1/bs.svg)}.flag-icon-bt{background-image:url(../flags/4x3/bt.svg)}.flag-icon-bt.flag-icon-squared{background-image:url(../flags/1x1/bt.svg)}.flag-icon-bv{background-image:url(../flags/4x3/bv.svg)}.flag-icon-bv.flag-icon-squared{background-image:url(../flags/1x1/bv.svg)}.flag-icon-bw{background-image:url(../flags/4x3/bw.svg)}.flag-icon-bw.flag-icon-squared{background-image:url(../flags/1x1/bw.svg)}.flag-icon-by{background-image:url(../flags/4x3/by.svg)}.flag-icon-by.flag-icon-squared{background-image:url(../flags/1x1/by.svg)}.flag-icon-bz{background-image:url(../flags/4x3/bz.svg)}.flag-icon-bz.flag-icon-squared{background-image:url(../flags/1x1/bz.svg)}.flag-icon-ca{background-image:url(../flags/4x3/ca.svg)}.flag-icon-ca.flag-icon-squared{background-image:url(../flags/1x1/ca.svg)}.flag-icon-cc{background-image:url(../flags/4x3/cc.svg)}.flag-icon-cc.flag-icon-squared{background-image:url(../flags/1x1/cc.svg)}.flag-icon-cd{background-image:url(../flags/4x3/cd.svg)}.flag-icon-cd.flag-icon-squared{background-image:url(../flags/1x1/cd.svg)}.flag-icon-cf{background-image:url(../flags/4x3/cf.svg)}.flag-icon-cf.flag-icon-squared{background-image:url(../flags/1x1/cf.svg)}.flag-icon-cg{background-image:url(../flags/4x3/cg.svg)}.flag-icon-cg.flag-icon-squared{background-image:url(../flags/1x1/cg.svg)}.flag-icon-ch{background-image:url(../flags/4x3/ch.svg)}.flag-icon-ch.flag-icon-squared{background-image:url(../flags/1x1/ch.svg)}.flag-icon-ci{background-image:url(../flags/4x3/ci.svg)}.flag-icon-ci.flag-icon-squared{background-image:url(../flags/1x1/ci.svg)}.flag-icon-ck{background-image:url(../flags/4x3/ck.svg)}.flag-icon-ck.flag-icon-squared{background-image:url(../flags/1x1/ck.svg)}.flag-icon-cl{background-image:url(../flags/4x3/cl.svg)}.flag-icon-cl.flag-icon-squared{background-image:url(../flags/1x1/cl.svg)}.flag-icon-cm{background-image:url(../flags/4x3/cm.svg)}.flag-icon-cm.flag-icon-squared{background-image:url(../flags/1x1/cm.svg)}.flag-icon-cn{background-image:url(../flags/4x3/cn.svg)}.flag-icon-cn.flag-icon-squared{background-image:url(../flags/1x1/cn.svg)}.flag-icon-co{background-image:url(../flags/4x3/co.svg)}.flag-icon-co.flag-icon-squared{background-image:url(../flags/1x1/co.svg)}.flag-icon-cr{background-image:url(../flags/4x3/cr.svg)}.flag-icon-cr.flag-icon-squared{background-image:url(../flags/1x1/cr.svg)}.flag-icon-cu{background-image:url(../flags/4x3/cu.svg)}.flag-icon-cu.flag-icon-squared{background-image:url(../flags/1x1/cu.svg)}.flag-icon-cv{background-image:url(../flags/4x3/cv.svg)}.flag-icon-cv.flag-icon-squared{background-image:url(../flags/1x1/cv.svg)}.flag-icon-cw{background-image:url(../flags/4x3/cw.svg)}.flag-icon-cw.flag-icon-squared{background-image:url(../flags/1x1/cw.svg)}.flag-icon-cx{background-image:url(../flags/4x3/cx.svg)}.flag-icon-cx.flag-icon-squared{background-image:url(../flags/1x1/cx.svg)}.flag-icon-cy{background-image:url(../flags/4x3/cy.svg)}.flag-icon-cy.flag-icon-squared{background-image:url(../flags/1x1/cy.svg)}.flag-icon-cz{background-image:url(../flags/4x3/cz.svg)}.flag-icon-cz.flag-icon-squared{background-image:url(../flags/1x1/cz.svg)}.flag-icon-de{background-image:url(../flags/4x3/de.svg)}.flag-icon-de.flag-icon-squared{background-image:url(../flags/1x1/de.svg)}.flag-icon-dj{background-image:url(../flags/4x3/dj.svg)}.flag-icon-dj.flag-icon-squared{background-image:url(../flags/1x1/dj.svg)}.flag-icon-dk{background-image:url(../flags/4x3/dk.svg)}.flag-icon-dk.flag-icon-squared{background-image:url(../flags/1x1/dk.svg)}.flag-icon-dm{background-image:url(../flags/4x3/dm.svg)}.flag-icon-dm.flag-icon-squared{background-image:url(../flags/1x1/dm.svg)}.flag-icon-do{background-image:url(../flags/4x3/do.svg)}.flag-icon-do.flag-icon-squared{background-image:url(../flags/1x1/do.svg)}.flag-icon-dz{background-image:url(../flags/4x3/dz.svg)}.flag-icon-dz.flag-icon-squared{background-image:url(../flags/1x1/dz.svg)}.flag-icon-ec{background-image:url(../flags/4x3/ec.svg)}.flag-icon-ec.flag-icon-squared{background-image:url(../flags/1x1/ec.svg)}.flag-icon-ee{background-image:url(../flags/4x3/ee.svg)}.flag-icon-ee.flag-icon-squared{background-image:url(../flags/1x1/ee.svg)}.flag-icon-eg{background-image:url(../flags/4x3/eg.svg)}.flag-icon-eg.flag-icon-squared{background-image:url(../flags/1x1/eg.svg)}.flag-icon-eh{background-image:url(../flags/4x3/eh.svg)}.flag-icon-eh.flag-icon-squared{background-image:url(../flags/1x1/eh.svg)}.flag-icon-er{background-image:url(../flags/4x3/er.svg)}.flag-icon-er.flag-icon-squared{background-image:url(../flags/1x1/er.svg)}.flag-icon-es{background-image:url(../flags/4x3/es.svg)}.flag-icon-es.flag-icon-squared{background-image:url(../flags/1x1/es.svg)}.flag-icon-et{background-image:url(../flags/4x3/et.svg)}.flag-icon-et.flag-icon-squared{background-image:url(../flags/1x1/et.svg)}.flag-icon-fi{background-image:url(../flags/4x3/fi.svg)}.flag-icon-fi.flag-icon-squared{background-image:url(../flags/1x1/fi.svg)}.flag-icon-fj{background-image:url(../flags/4x3/fj.svg)}.flag-icon-fj.flag-icon-squared{background-image:url(../flags/1x1/fj.svg)}.flag-icon-fk{background-image:url(../flags/4x3/fk.svg)}.flag-icon-fk.flag-icon-squared{background-image:url(../flags/1x1/fk.svg)}.flag-icon-fm{background-image:url(../flags/4x3/fm.svg)}.flag-icon-fm.flag-icon-squared{background-image:url(../flags/1x1/fm.svg)}.flag-icon-fo{background-image:url(../flags/4x3/fo.svg)}.flag-icon-fo.flag-icon-squared{background-image:url(../flags/1x1/fo.svg)}.flag-icon-fr{background-image:url(../flags/4x3/fr.svg)}.flag-icon-fr.flag-icon-squared{background-image:url(../flags/1x1/fr.svg)}.flag-icon-ga{background-image:url(../flags/4x3/ga.svg)}.flag-icon-ga.flag-icon-squared{background-image:url(../flags/1x1/ga.svg)}.flag-icon-gb{background-image:url(../flags/4x3/gb.svg)}.flag-icon-gb.flag-icon-squared{background-image:url(../flags/1x1/gb.svg)}.flag-icon-gd{background-image:url(../flags/4x3/gd.svg)}.flag-icon-gd.flag-icon-squared{background-image:url(../flags/1x1/gd.svg)}.flag-icon-ge{background-image:url(../flags/4x3/ge.svg)}.flag-icon-ge.flag-icon-squared{background-image:url(../flags/1x1/ge.svg)}.flag-icon-gf{background-image:url(../flags/4x3/gf.svg)}.flag-icon-gf.flag-icon-squared{background-image:url(../flags/1x1/gf.svg)}.flag-icon-gg{background-image:url(../flags/4x3/gg.svg)}.flag-icon-gg.flag-icon-squared{background-image:url(../flags/1x1/gg.svg)}.flag-icon-gh{background-image:url(../flags/4x3/gh.svg)}.flag-icon-gh.flag-icon-squared{background-image:url(../flags/1x1/gh.svg)}.flag-icon-gi{background-image:url(../flags/4x3/gi.svg)}.flag-icon-gi.flag-icon-squared{background-image:url(../flags/1x1/gi.svg)}.flag-icon-gl{background-image:url(../flags/4x3/gl.svg)}.flag-icon-gl.flag-icon-squared{background-image:url(../flags/1x1/gl.svg)}.flag-icon-gm{background-image:url(../flags/4x3/gm.svg)}.flag-icon-gm.flag-icon-squared{background-image:url(../flags/1x1/gm.svg)}.flag-icon-gn{background-image:url(../flags/4x3/gn.svg)}.flag-icon-gn.flag-icon-squared{background-image:url(../flags/1x1/gn.svg)}.flag-icon-gp{background-image:url(../flags/4x3/gp.svg)}.flag-icon-gp.flag-icon-squared{background-image:url(../flags/1x1/gp.svg)}.flag-icon-gq{background-image:url(../flags/4x3/gq.svg)}.flag-icon-gq.flag-icon-squared{background-image:url(../flags/1x1/gq.svg)}.flag-icon-gr{background-image:url(../flags/4x3/gr.svg)}.flag-icon-gr.flag-icon-squared{background-image:url(../flags/1x1/gr.svg)}.flag-icon-gs{background-image:url(../flags/4x3/gs.svg)}.flag-icon-gs.flag-icon-squared{background-image:url(../flags/1x1/gs.svg)}.flag-icon-gt{background-image:url(../flags/4x3/gt.svg)}.flag-icon-gt.flag-icon-squared{background-image:url(../flags/1x1/gt.svg)}.flag-icon-gu{background-image:url(../flags/4x3/gu.svg)}.flag-icon-gu.flag-icon-squared{background-image:url(../flags/1x1/gu.svg)}.flag-icon-gw{background-image:url(../flags/4x3/gw.svg)}.flag-icon-gw.flag-icon-squared{background-image:url(../flags/1x1/gw.svg)}.flag-icon-gy{background-image:url(../flags/4x3/gy.svg)}.flag-icon-gy.flag-icon-squared{background-image:url(../flags/1x1/gy.svg)}.flag-icon-hk{background-image:url(../flags/4x3/hk.svg)}.flag-icon-hk.flag-icon-squared{background-image:url(../flags/1x1/hk.svg)}.flag-icon-hm{background-image:url(../flags/4x3/hm.svg)}.flag-icon-hm.flag-icon-squared{background-image:url(../flags/1x1/hm.svg)}.flag-icon-hn{background-image:url(../flags/4x3/hn.svg)}.flag-icon-hn.flag-icon-squared{background-image:url(../flags/1x1/hn.svg)}.flag-icon-hr{background-image:url(../flags/4x3/hr.svg)}.flag-icon-hr.flag-icon-squared{background-image:url(../flags/1x1/hr.svg)}.flag-icon-ht{background-image:url(../flags/4x3/ht.svg)}.flag-icon-ht.flag-icon-squared{background-image:url(../flags/1x1/ht.svg)}.flag-icon-hu{background-image:url(../flags/4x3/hu.svg)}.flag-icon-hu.flag-icon-squared{background-image:url(../flags/1x1/hu.svg)}.flag-icon-id{background-image:url(../flags/4x3/id.svg)}.flag-icon-id.flag-icon-squared{background-image:url(../flags/1x1/id.svg)}.flag-icon-ie{background-image:url(../flags/4x3/ie.svg)}.flag-icon-ie.flag-icon-squared{background-image:url(../flags/1x1/ie.svg)}.flag-icon-il{background-image:url(../flags/4x3/il.svg)}.flag-icon-il.flag-icon-squared{background-image:url(../flags/1x1/il.svg)}.flag-icon-im{background-image:url(../flags/4x3/im.svg)}.flag-icon-im.flag-icon-squared{background-image:url(../flags/1x1/im.svg)}.flag-icon-in{background-image:url(../flags/4x3/in.svg)}.flag-icon-in.flag-icon-squared{background-image:url(../flags/1x1/in.svg)}.flag-icon-io{background-image:url(../flags/4x3/io.svg)}.flag-icon-io.flag-icon-squared{background-image:url(../flags/1x1/io.svg)}.flag-icon-iq{background-image:url(../flags/4x3/iq.svg)}.flag-icon-iq.flag-icon-squared{background-image:url(../flags/1x1/iq.svg)}.flag-icon-ir{background-image:url(../flags/4x3/ir.svg)}.flag-icon-ir.flag-icon-squared{background-image:url(../flags/1x1/ir.svg)}.flag-icon-is{background-image:url(../flags/4x3/is.svg)}.flag-icon-is.flag-icon-squared{background-image:url(../flags/1x1/is.svg)}.flag-icon-it{background-image:url(../flags/4x3/it.svg)}.flag-icon-it.flag-icon-squared{background-image:url(../flags/1x1/it.svg)}.flag-icon-je{background-image:url(../flags/4x3/je.svg)}.flag-icon-je.flag-icon-squared{background-image:url(../flags/1x1/je.svg)}.flag-icon-jm{background-image:url(../flags/4x3/jm.svg)}.flag-icon-jm.flag-icon-squared{background-image:url(../flags/1x1/jm.svg)}.flag-icon-jo{background-image:url(../flags/4x3/jo.svg)}.flag-icon-jo.flag-icon-squared{background-image:url(../flags/1x1/jo.svg)}.flag-icon-jp{background-image:url(../flags/4x3/jp.svg)}.flag-icon-jp.flag-icon-squared{background-image:url(../flags/1x1/jp.svg)}.flag-icon-ke{background-image:url(../flags/4x3/ke.svg)}.flag-icon-ke.flag-icon-squared{background-image:url(../flags/1x1/ke.svg)}.flag-icon-kg{background-image:url(../flags/4x3/kg.svg)}.flag-icon-kg.flag-icon-squared{background-image:url(../flags/1x1/kg.svg)}.flag-icon-kh{background-image:url(../flags/4x3/kh.svg)}.flag-icon-kh.flag-icon-squared{background-image:url(../flags/1x1/kh.svg)}.flag-icon-ki{background-image:url(../flags/4x3/ki.svg)}.flag-icon-ki.flag-icon-squared{background-image:url(../flags/1x1/ki.svg)}.flag-icon-km{background-image:url(../flags/4x3/km.svg)}.flag-icon-km.flag-icon-squared{background-image:url(../flags/1x1/km.svg)}.flag-icon-kn{background-image:url(../flags/4x3/kn.svg)}.flag-icon-kn.flag-icon-squared{background-image:url(../flags/1x1/kn.svg)}.flag-icon-kp{background-image:url(../flags/4x3/kp.svg)}.flag-icon-kp.flag-icon-squared{background-image:url(../flags/1x1/kp.svg)}.flag-icon-kr{background-image:url(../flags/4x3/kr.svg)}.flag-icon-kr.flag-icon-squared{background-image:url(../flags/1x1/kr.svg)}.flag-icon-kw{background-image:url(../flags/4x3/kw.svg)}.flag-icon-kw.flag-icon-squared{background-image:url(../flags/1x1/kw.svg)}.flag-icon-ky{background-image:url(../flags/4x3/ky.svg)}.flag-icon-ky.flag-icon-squared{background-image:url(../flags/1x1/ky.svg)}.flag-icon-kz{background-image:url(../flags/4x3/kz.svg)}.flag-icon-kz.flag-icon-squared{background-image:url(../flags/1x1/kz.svg)}.flag-icon-la{background-image:url(../flags/4x3/la.svg)}.flag-icon-la.flag-icon-squared{background-image:url(../flags/1x1/la.svg)}.flag-icon-lb{background-image:url(../flags/4x3/lb.svg)}.flag-icon-lb.flag-icon-squared{background-image:url(../flags/1x1/lb.svg)}.flag-icon-lc{background-image:url(../flags/4x3/lc.svg)}.flag-icon-lc.flag-icon-squared{background-image:url(../flags/1x1/lc.svg)}.flag-icon-li{background-image:url(../flags/4x3/li.svg)}.flag-icon-li.flag-icon-squared{background-image:url(../flags/1x1/li.svg)}.flag-icon-lk{background-image:url(../flags/4x3/lk.svg)}.flag-icon-lk.flag-icon-squared{background-image:url(../flags/1x1/lk.svg)}.flag-icon-lr{background-image:url(../flags/4x3/lr.svg)}.flag-icon-lr.flag-icon-squared{background-image:url(../flags/1x1/lr.svg)}.flag-icon-ls{background-image:url(../flags/4x3/ls.svg)}.flag-icon-ls.flag-icon-squared{background-image:url(../flags/1x1/ls.svg)}.flag-icon-lt{background-image:url(../flags/4x3/lt.svg)}.flag-icon-lt.flag-icon-squared{background-image:url(../flags/1x1/lt.svg)}.flag-icon-lu{background-image:url(../flags/4x3/lu.svg)}.flag-icon-lu.flag-icon-squared{background-image:url(../flags/1x1/lu.svg)}.flag-icon-lv{background-image:url(../flags/4x3/lv.svg)}.flag-icon-lv.flag-icon-squared{background-image:url(../flags/1x1/lv.svg)}.flag-icon-ly{background-image:url(../flags/4x3/ly.svg)}.flag-icon-ly.flag-icon-squared{background-image:url(../flags/1x1/ly.svg)}.flag-icon-ma{background-image:url(../flags/4x3/ma.svg)}.flag-icon-ma.flag-icon-squared{background-image:url(../flags/1x1/ma.svg)}.flag-icon-mc{background-image:url(../flags/4x3/mc.svg)}.flag-icon-mc.flag-icon-squared{background-image:url(../flags/1x1/mc.svg)}.flag-icon-md{background-image:url(../flags/4x3/md.svg)}.flag-icon-md.flag-icon-squared{background-image:url(../flags/1x1/md.svg)}.flag-icon-me{background-image:url(../flags/4x3/me.svg)}.flag-icon-me.flag-icon-squared{background-image:url(../flags/1x1/me.svg)}.flag-icon-mf{background-image:url(../flags/4x3/mf.svg)}.flag-icon-mf.flag-icon-squared{background-image:url(../flags/1x1/mf.svg)}.flag-icon-mg{background-image:url(../flags/4x3/mg.svg)}.flag-icon-mg.flag-icon-squared{background-image:url(../flags/1x1/mg.svg)}.flag-icon-mh{background-image:url(../flags/4x3/mh.svg)}.flag-icon-mh.flag-icon-squared{background-image:url(../flags/1x1/mh.svg)}.flag-icon-mk{background-image:url(../flags/4x3/mk.svg)}.flag-icon-mk.flag-icon-squared{background-image:url(../flags/1x1/mk.svg)}.flag-icon-ml{background-image:url(../flags/4x3/ml.svg)}.flag-icon-ml.flag-icon-squared{background-image:url(../flags/1x1/ml.svg)}.flag-icon-mm{background-image:url(../flags/4x3/mm.svg)}.flag-icon-mm.flag-icon-squared{background-image:url(../flags/1x1/mm.svg)}.flag-icon-mn{background-image:url(../flags/4x3/mn.svg)}.flag-icon-mn.flag-icon-squared{background-image:url(../flags/1x1/mn.svg)}.flag-icon-mo{background-image:url(../flags/4x3/mo.svg)}.flag-icon-mo.flag-icon-squared{background-image:url(../flags/1x1/mo.svg)}.flag-icon-mp{background-image:url(../flags/4x3/mp.svg)}.flag-icon-mp.flag-icon-squared{background-image:url(../flags/1x1/mp.svg)}.flag-icon-mq{background-image:url(../flags/4x3/mq.svg)}.flag-icon-mq.flag-icon-squared{background-image:url(../flags/1x1/mq.svg)}.flag-icon-mr{background-image:url(../flags/4x3/mr.svg)}.flag-icon-mr.flag-icon-squared{background-image:url(../flags/1x1/mr.svg)}.flag-icon-ms{background-image:url(../flags/4x3/ms.svg)}.flag-icon-ms.flag-icon-squared{background-image:url(../flags/1x1/ms.svg)}.flag-icon-mt{background-image:url(../flags/4x3/mt.svg)}.flag-icon-mt.flag-icon-squared{background-image:url(../flags/1x1/mt.svg)}.flag-icon-mu{background-image:url(../flags/4x3/mu.svg)}.flag-icon-mu.flag-icon-squared{background-image:url(../flags/1x1/mu.svg)}.flag-icon-mv{background-image:url(../flags/4x3/mv.svg)}.flag-icon-mv.flag-icon-squared{background-image:url(../flags/1x1/mv.svg)}.flag-icon-mw{background-image:url(../flags/4x3/mw.svg)}.flag-icon-mw.flag-icon-squared{background-image:url(../flags/1x1/mw.svg)}.flag-icon-mx{background-image:url(../flags/4x3/mx.svg)}.flag-icon-mx.flag-icon-squared{background-image:url(../flags/1x1/mx.svg)}.flag-icon-my{background-image:url(../flags/4x3/my.svg)}.flag-icon-my.flag-icon-squared{background-image:url(../flags/1x1/my.svg)}.flag-icon-mz{background-image:url(../flags/4x3/mz.svg)}.flag-icon-mz.flag-icon-squared{background-image:url(../flags/1x1/mz.svg)}.flag-icon-na{background-image:url(../flags/4x3/na.svg)}.flag-icon-na.flag-icon-squared{background-image:url(../flags/1x1/na.svg)}.flag-icon-nc{background-image:url(../flags/4x3/nc.svg)}.flag-icon-nc.flag-icon-squared{background-image:url(../flags/1x1/nc.svg)}.flag-icon-ne{background-image:url(../flags/4x3/ne.svg)}.flag-icon-ne.flag-icon-squared{background-image:url(../flags/1x1/ne.svg)}.flag-icon-nf{background-image:url(../flags/4x3/nf.svg)}.flag-icon-nf.flag-icon-squared{background-image:url(../flags/1x1/nf.svg)}.flag-icon-ng{background-image:url(../flags/4x3/ng.svg)}.flag-icon-ng.flag-icon-squared{background-image:url(../flags/1x1/ng.svg)}.flag-icon-ni{background-image:url(../flags/4x3/ni.svg)}.flag-icon-ni.flag-icon-squared{background-image:url(../flags/1x1/ni.svg)}.flag-icon-nl{background-image:url(../flags/4x3/nl.svg)}.flag-icon-nl.flag-icon-squared{background-image:url(../flags/1x1/nl.svg)}.flag-icon-no{background-image:url(../flags/4x3/no.svg)}.flag-icon-no.flag-icon-squared{background-image:url(../flags/1x1/no.svg)}.flag-icon-np{background-image:url(../flags/4x3/np.svg)}.flag-icon-np.flag-icon-squared{background-image:url(../flags/1x1/np.svg)}.flag-icon-nr{background-image:url(../flags/4x3/nr.svg)}.flag-icon-nr.flag-icon-squared{background-image:url(../flags/1x1/nr.svg)}.flag-icon-nu{background-image:url(../flags/4x3/nu.svg)}.flag-icon-nu.flag-icon-squared{background-image:url(../flags/1x1/nu.svg)}.flag-icon-nz{background-image:url(../flags/4x3/nz.svg)}.flag-icon-nz.flag-icon-squared{background-image:url(../flags/1x1/nz.svg)}.flag-icon-om{background-image:url(../flags/4x3/om.svg)}.flag-icon-om.flag-icon-squared{background-image:url(../flags/1x1/om.svg)}.flag-icon-pa{background-image:url(../flags/4x3/pa.svg)}.flag-icon-pa.flag-icon-squared{background-image:url(../flags/1x1/pa.svg)}.flag-icon-pe{background-image:url(../flags/4x3/pe.svg)}.flag-icon-pe.flag-icon-squared{background-image:url(../flags/1x1/pe.svg)}.flag-icon-pf{background-image:url(../flags/4x3/pf.svg)}.flag-icon-pf.flag-icon-squared{background-image:url(../flags/1x1/pf.svg)}.flag-icon-pg{background-image:url(../flags/4x3/pg.svg)}.flag-icon-pg.flag-icon-squared{background-image:url(../flags/1x1/pg.svg)}.flag-icon-ph{background-image:url(../flags/4x3/ph.svg)}.flag-icon-ph.flag-icon-squared{background-image:url(../flags/1x1/ph.svg)}.flag-icon-pk{background-image:url(../flags/4x3/pk.svg)}.flag-icon-pk.flag-icon-squared{background-image:url(../flags/1x1/pk.svg)}.flag-icon-pl{background-image:url(../flags/4x3/pl.svg)}.flag-icon-pl.flag-icon-squared{background-image:url(../flags/1x1/pl.svg)}.flag-icon-pm{background-image:url(../flags/4x3/pm.svg)}.flag-icon-pm.flag-icon-squared{background-image:url(../flags/1x1/pm.svg)}.flag-icon-pn{background-image:url(../flags/4x3/pn.svg)}.flag-icon-pn.flag-icon-squared{background-image:url(../flags/1x1/pn.svg)}.flag-icon-pr{background-image:url(../flags/4x3/pr.svg)}.flag-icon-pr.flag-icon-squared{background-image:url(../flags/1x1/pr.svg)}.flag-icon-ps{background-image:url(../flags/4x3/ps.svg)}.flag-icon-ps.flag-icon-squared{background-image:url(../flags/1x1/ps.svg)}.flag-icon-pt{background-image:url(../flags/4x3/pt.svg)}.flag-icon-pt.flag-icon-squared{background-image:url(../flags/1x1/pt.svg)}.flag-icon-pw{background-image:url(../flags/4x3/pw.svg)}.flag-icon-pw.flag-icon-squared{background-image:url(../flags/1x1/pw.svg)}.flag-icon-py{background-image:url(../flags/4x3/py.svg)}.flag-icon-py.flag-icon-squared{background-image:url(../flags/1x1/py.svg)}.flag-icon-qa{background-image:url(../flags/4x3/qa.svg)}.flag-icon-qa.flag-icon-squared{background-image:url(../flags/1x1/qa.svg)}.flag-icon-re{background-image:url(../flags/4x3/re.svg)}.flag-icon-re.flag-icon-squared{background-image:url(../flags/1x1/re.svg)}.flag-icon-ro{background-image:url(../flags/4x3/ro.svg)}.flag-icon-ro.flag-icon-squared{background-image:url(../flags/1x1/ro.svg)}.flag-icon-rs{background-image:url(../flags/4x3/rs.svg)}.flag-icon-rs.flag-icon-squared{background-image:url(../flags/1x1/rs.svg)}.flag-icon-ru{background-image:url(../flags/4x3/ru.svg)}.flag-icon-ru.flag-icon-squared{background-image:url(../flags/1x1/ru.svg)}.flag-icon-rw{background-image:url(../flags/4x3/rw.svg)}.flag-icon-rw.flag-icon-squared{background-image:url(../flags/1x1/rw.svg)}.flag-icon-sa{background-image:url(../flags/4x3/sa.svg)}.flag-icon-sa.flag-icon-squared{background-image:url(../flags/1x1/sa.svg)}.flag-icon-sb{background-image:url(../flags/4x3/sb.svg)}.flag-icon-sb.flag-icon-squared{background-image:url(../flags/1x1/sb.svg)}.flag-icon-sc{background-image:url(../flags/4x3/sc.svg)}.flag-icon-sc.flag-icon-squared{background-image:url(../flags/1x1/sc.svg)}.flag-icon-sd{background-image:url(../flags/4x3/sd.svg)}.flag-icon-sd.flag-icon-squared{background-image:url(../flags/1x1/sd.svg)}.flag-icon-se{background-image:url(../flags/4x3/se.svg)}.flag-icon-se.flag-icon-squared{background-image:url(../flags/1x1/se.svg)}.flag-icon-sg{background-image:url(../flags/4x3/sg.svg)}.flag-icon-sg.flag-icon-squared{background-image:url(../flags/1x1/sg.svg)}.flag-icon-sh{background-image:url(../flags/4x3/sh.svg)}.flag-icon-sh.flag-icon-squared{background-image:url(../flags/1x1/sh.svg)}.flag-icon-si{background-image:url(../flags/4x3/si.svg)}.flag-icon-si.flag-icon-squared{background-image:url(../flags/1x1/si.svg)}.flag-icon-sj{background-image:url(../flags/4x3/sj.svg)}.flag-icon-sj.flag-icon-squared{background-image:url(../flags/1x1/sj.svg)}.flag-icon-sk{background-image:url(../flags/4x3/sk.svg)}.flag-icon-sk.flag-icon-squared{background-image:url(../flags/1x1/sk.svg)}.flag-icon-sl{background-image:url(../flags/4x3/sl.svg)}.flag-icon-sl.flag-icon-squared{background-image:url(../flags/1x1/sl.svg)}.flag-icon-sm{background-image:url(../flags/4x3/sm.svg)}.flag-icon-sm.flag-icon-squared{background-image:url(../flags/1x1/sm.svg)}.flag-icon-sn{background-image:url(../flags/4x3/sn.svg)}.flag-icon-sn.flag-icon-squared{background-image:url(../flags/1x1/sn.svg)}.flag-icon-so{background-image:url(../flags/4x3/so.svg)}.flag-icon-so.flag-icon-squared{background-image:url(../flags/1x1/so.svg)}.flag-icon-sr{background-image:url(../flags/4x3/sr.svg)}.flag-icon-sr.flag-icon-squared{background-image:url(../flags/1x1/sr.svg)}.flag-icon-ss{background-image:url(../flags/4x3/ss.svg)}.flag-icon-ss.flag-icon-squared{background-image:url(../flags/1x1/ss.svg)}.flag-icon-st{background-image:url(../flags/4x3/st.svg)}.flag-icon-st.flag-icon-squared{background-image:url(../flags/1x1/st.svg)}.flag-icon-sv{background-image:url(../flags/4x3/sv.svg)}.flag-icon-sv.flag-icon-squared{background-image:url(../flags/1x1/sv.svg)}.flag-icon-sx{background-image:url(../flags/4x3/sx.svg)}.flag-icon-sx.flag-icon-squared{background-image:url(../flags/1x1/sx.svg)}.flag-icon-sy{background-image:url(../flags/4x3/sy.svg)}.flag-icon-sy.flag-icon-squared{background-image:url(../flags/1x1/sy.svg)}.flag-icon-sz{background-image:url(../flags/4x3/sz.svg)}.flag-icon-sz.flag-icon-squared{background-image:url(../flags/1x1/sz.svg)}.flag-icon-tc{background-image:url(../flags/4x3/tc.svg)}.flag-icon-tc.flag-icon-squared{background-image:url(../flags/1x1/tc.svg)}.flag-icon-td{background-image:url(../flags/4x3/td.svg)}.flag-icon-td.flag-icon-squared{background-image:url(../flags/1x1/td.svg)}.flag-icon-tf{background-image:url(../flags/4x3/tf.svg)}.flag-icon-tf.flag-icon-squared{background-image:url(../flags/1x1/tf.svg)}.flag-icon-tg{background-image:url(../flags/4x3/tg.svg)}.flag-icon-tg.flag-icon-squared{background-image:url(../flags/1x1/tg.svg)}.flag-icon-th{background-image:url(../flags/4x3/th.svg)}.flag-icon-th.flag-icon-squared{background-image:url(../flags/1x1/th.svg)}.flag-icon-tj{background-image:url(../flags/4x3/tj.svg)}.flag-icon-tj.flag-icon-squared{background-image:url(../flags/1x1/tj.svg)}.flag-icon-tk{background-image:url(../flags/4x3/tk.svg)}.flag-icon-tk.flag-icon-squared{background-image:url(../flags/1x1/tk.svg)}.flag-icon-tl{background-image:url(../flags/4x3/tl.svg)}.flag-icon-tl.flag-icon-squared{background-image:url(../flags/1x1/tl.svg)}.flag-icon-tm{background-image:url(../flags/4x3/tm.svg)}.flag-icon-tm.flag-icon-squared{background-image:url(../flags/1x1/tm.svg)}.flag-icon-tn{background-image:url(../flags/4x3/tn.svg)}.flag-icon-tn.flag-icon-squared{background-image:url(../flags/1x1/tn.svg)}.flag-icon-to{background-image:url(../flags/4x3/to.svg)}.flag-icon-to.flag-icon-squared{background-image:url(../flags/1x1/to.svg)}.flag-icon-tr{background-image:url(../flags/4x3/tr.svg)}.flag-icon-tr.flag-icon-squared{background-image:url(../flags/1x1/tr.svg)}.flag-icon-tt{background-image:url(../flags/4x3/tt.svg)}.flag-icon-tt.flag-icon-squared{background-image:url(../flags/1x1/tt.svg)}.flag-icon-tv{background-image:url(../flags/4x3/tv.svg)}.flag-icon-tv.flag-icon-squared{background-image:url(../flags/1x1/tv.svg)}.flag-icon-tw{background-image:url(../flags/4x3/tw.svg)}.flag-icon-tw.flag-icon-squared{background-image:url(../flags/1x1/tw.svg)}.flag-icon-tz{background-image:url(../flags/4x3/tz.svg)}.flag-icon-tz.flag-icon-squared{background-image:url(../flags/1x1/tz.svg)}.flag-icon-ua{background-image:url(../flags/4x3/ua.svg)}.flag-icon-ua.flag-icon-squared{background-image:url(../flags/1x1/ua.svg)}.flag-icon-ug{background-image:url(../flags/4x3/ug.svg)}.flag-icon-ug.flag-icon-squared{background-image:url(../flags/1x1/ug.svg)}.flag-icon-um{background-image:url(../flags/4x3/um.svg)}.flag-icon-um.flag-icon-squared{background-image:url(../flags/1x1/um.svg)}.flag-icon-us{background-image:url(../flags/4x3/us.svg)}.flag-icon-us.flag-icon-squared{background-image:url(../flags/1x1/us.svg)}.flag-icon-uy{background-image:url(../flags/4x3/uy.svg)}.flag-icon-uy.flag-icon-squared{background-image:url(../flags/1x1/uy.svg)}.flag-icon-uz{background-image:url(../flags/4x3/uz.svg)}.flag-icon-uz.flag-icon-squared{background-image:url(../flags/1x1/uz.svg)}.flag-icon-va{background-image:url(../flags/4x3/va.svg)}.flag-icon-va.flag-icon-squared{background-image:url(../flags/1x1/va.svg)}.flag-icon-vc{background-image:url(../flags/4x3/vc.svg)}.flag-icon-vc.flag-icon-squared{background-image:url(../flags/1x1/vc.svg)}.flag-icon-ve{background-image:url(../flags/4x3/ve.svg)}.flag-icon-ve.flag-icon-squared{background-image:url(../flags/1x1/ve.svg)}.flag-icon-vg{background-image:url(../flags/4x3/vg.svg)}.flag-icon-vg.flag-icon-squared{background-image:url(../flags/1x1/vg.svg)}.flag-icon-vi{background-image:url(../flags/4x3/vi.svg)}.flag-icon-vi.flag-icon-squared{background-image:url(../flags/1x1/vi.svg)}.flag-icon-vn{background-image:url(../flags/4x3/vn.svg)}.flag-icon-vn.flag-icon-squared{background-image:url(../flags/1x1/vn.svg)}.flag-icon-vu{background-image:url(../flags/4x3/vu.svg)}.flag-icon-vu.flag-icon-squared{background-image:url(../flags/1x1/vu.svg)}.flag-icon-wf{background-image:url(../flags/4x3/wf.svg)}.flag-icon-wf.flag-icon-squared{background-image:url(../flags/1x1/wf.svg)}.flag-icon-ws{background-image:url(../flags/4x3/ws.svg)}.flag-icon-ws.flag-icon-squared{background-image:url(../flags/1x1/ws.svg)}.flag-icon-ye{background-image:url(../flags/4x3/ye.svg)}.flag-icon-ye.flag-icon-squared{background-image:url(../flags/1x1/ye.svg)}.flag-icon-yt{background-image:url(../flags/4x3/yt.svg)}.flag-icon-yt.flag-icon-squared{background-image:url(../flags/1x1/yt.svg)}.flag-icon-za{background-image:url(../flags/4x3/za.svg)}.flag-icon-za.flag-icon-squared{background-image:url(../flags/1x1/za.svg)}.flag-icon-zm{background-image:url(../flags/4x3/zm.svg)}.flag-icon-zm.flag-icon-squared{background-image:url(../flags/1x1/zm.svg)}.flag-icon-zw{background-image:url(../flags/4x3/zw.svg)}.flag-icon-zw.flag-icon-squared{background-image:url(../flags/1x1/zw.svg)}.flag-icon-es-ca{background-image:url(../flags/4x3/es-ca.svg)}.flag-icon-es-ca.flag-icon-squared{background-image:url(../flags/1x1/es-ca.svg)}.flag-icon-es-ga{background-image:url(../flags/4x3/es-ga.svg)}.flag-icon-es-ga.flag-icon-squared{background-image:url(../flags/1x1/es-ga.svg)}.flag-icon-eu{background-image:url(../flags/4x3/eu.svg)}.flag-icon-eu.flag-icon-squared{background-image:url(../flags/1x1/eu.svg)}.flag-icon-gb-eng{background-image:url(../flags/4x3/gb-eng.svg)}.flag-icon-gb-eng.flag-icon-squared{background-image:url(../flags/1x1/gb-eng.svg)}.flag-icon-gb-nir{background-image:url(../flags/4x3/gb-nir.svg)}.flag-icon-gb-nir.flag-icon-squared{background-image:url(../flags/1x1/gb-nir.svg)}.flag-icon-gb-sct{background-image:url(../flags/4x3/gb-sct.svg)}.flag-icon-gb-sct.flag-icon-squared{background-image:url(../flags/1x1/gb-sct.svg)}.flag-icon-gb-wls{background-image:url(../flags/4x3/gb-wls.svg)}.flag-icon-gb-wls.flag-icon-squared{background-image:url(../flags/1x1/gb-wls.svg)}.flag-icon-un{background-image:url(../flags/4x3/un.svg)}.flag-icon-un.flag-icon-squared{background-image:url(../flags/1x1/un.svg)}.flag-icon-xk{background-image:url(../flags/4x3/xk.svg)}.flag-icon-xk.flag-icon-squared{background-image:url(../flags/1x1/xk.svg)}*{box-sizing:border-box}:focus{outline:0;box-shadow:none}.clearfix:after{content:"";display:table;clear:both}.container{max-width:1200px;width:100%;padding:0 15px;margin:0 auto}body{font-family:Poppins,sans-serif;color:#0a1247}li{list-style:none}a{cursor:pointer;text-decoration:none}h1{font-size:46px;font-weight:500}h2{font-size:36px;font-weight:500}h3{font-size:32px;font-weight:500}.top-heading{padding-bottom:50px}p{font-size:18px;font-weight:100;color:#666}.my-cards{border-radius:20px}.buttons{background:#fff;border-radius:8px;box-shadow:0 2px 14px #0a124720;padding:12px 30px;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;width:fit-content;cursor:pointer;transition:all .5s ease}.buttons span{margin-right:30px;font-size:18px}.buttons svg{transition:all .5s ease}.buttons:hover{box-shadow:0 2px 20px #0a124730}.buttons:hover svg{transform:translateX(10px)}.login-btn:after{height:49.2px;clear:both;content:'';display:block;margin:0}.header-content{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;padding:25px 40px;width:100%;background:#e9edef;z-index:1;transition:1s}.header-content .menu ul{display:-ms-flexbox;display:flex}.header-content .menu ul li{margin-left:40px;font-size:16px}.header-content .menu ul li a{position:relative;color:#0a1247}.header-content .menu ul li a::after{content:'';position:absolute;height:2px;width:100%;transform:scale(0);background:#0a1247;bottom:-5px;left:0;transition:all .5s ease}.header-content .menu ul li a:hover::after{transform:scale(.8)}.header-content.color-header{background:#ebfcfc}.header-content.fixed-header{background:#ebfcfc;padding:20px 40px;box-shadow:0 2px 4px 0 rgba(0,0,0,.1)}.heading{position:relative}.heading::after{content:'';position:absolute;height:3px;width:180px;background-color:#0a1247;bottom:-10px;border-radius:8px;left:-40px}.hero-content{background:url(../images/hero_bg_img.png);width:100%;background-repeat:no-repeat;background-size:100% 100%;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.hero-content .hero-text .desc{margin-top:40px;color:#0a1247}.hero-content .hero-text .buttons{margin-top:50px;margin-left:-120px;padding:12px 40px}.desc{max-width:600px}.features{padding-top:120px}.features .feature-detail{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;margin:80px 0;-ms-flex-pack:distribute;justify-content:space-around;position:relative}.features .feature-detail .feature-text .desc{max-width:400px}.features .feature-detail .feature-text .heading{position:absolute;left:40%;bottom:140px}.features .feature-detail .feature-text .heading::after{right:-40px;left:unset;top:-10px}.features .feature-detail.editor-detail{-ms-flex-direction:row-reverse;flex-direction:row-reverse}.features .feature-detail.editor-detail .heading{left:45%;top:100px}.features .feature-detail.editor-detail .heading::after{left:-40px;top:-10px}.features .feature-detail.support-detail .heading{top:130px}.support-section{background:url(../images/support-bg-img.png);background-repeat:no-repeat;background-size:70% 100%}.support-section .feature-detail{margin:0}.comparision-section{margin-top:120px;padding-bottom:60px;text-align:center;background:url(../images/table-bg-img.png);background-repeat:no-repeat;background-position:right bottom;background-size:25% 100%}.comparision-section .comparison-content .desc{margin:0 auto}.comparision-section .comparison-content .comparison-table{padding-top:80px}table{width:100%;border-collapse:collapse;color:#333}table thead td{border-bottom:1px solid #d9d9d9;padding:20px 0}table tbody tr td{padding-top:25px}table tbody tr td:nth-child(1){text-align:left;padding-left:20px}.service .serviceheading{padding:70px 0;text-align:center;color:#0a1247}.service-btn{color:#fff;background-color:#0a1247;margin:0 auto}.service-btn span{margin:0}.service-content{display:-ms-flexbox;display:flex;padding-bottom:110px}.service-content .service-img img{width:580px;height:415px;object-fit:contain}.service-content .content{text-align:center}.service-content .content .content-heading{padding:25px 0;color:#0a1247}.service-content .content .content-para{padding-bottom:30px}.pbx-section{background:linear-gradient(0deg,rgba(0,0,0,.65),rgba(0,0,0,.65)),url(../images/pbx-section.png);background-size:cover;padding:100px 0}.pbx-section .pbx-content{text-align:center}.pbx-section .pbx-content .pbx-heading{color:#fff;padding-bottom:30px}.pbx-section .pbx-content .pbx-para{color:#fff;padding-bottom:40px}.overview-section{background-image:linear-gradient(to bottom,#f5f8fd,#fff 44%);padding:120px 0}.overview-section .overview-content{position:relative;text-align:center}.overview-section .overview-content .overview-heading{color:#0a1247;padding-bottom:10px}.overview-section .overview-content .overview-para{margin:0 auto;max-width:865px;padding-bottom:130px}.overview-section .overview-content .picture{position:absolute;right:-127px;top:180px}.overview-section .overview-content .key-feature{display:-ms-flexbox;display:flex}.overview-section .overview-content .key-feature .feature{width:300px;margin-right:50px;margin-bottom:50px;text-align:left}.overview-section .overview-content .key-feature .feature .feature-img{padding-bottom:20px}.overview-section .overview-content .key-feature .feature .feature-heading{font-size:22px;font-weight:500;padding-bottom:20px;color:#0a1247}.overview-section .overview-content .key-feature .feature .feature-para{font-size:16px;font-weight:400;color:#666}.learn_more-section{background:url(../images/learn-bg.png);padding:60px 0;margin-bottom:-120px}.learn_more-section .learn_more-content{text-align:center}.learn_more-section .learn_more-content .learn_more-heading{font-size:32px;font-weight:500;color:#0a1247;padding-bottom:30px}.learn_more-section .learn_more-content .learn_more-para{padding-bottom:40px;font-size:18px;font-weight:400;color:#666}@media only screen and (max-width:760px){.login-page-block{height:100vh;background-size:100% 100%}.login-page-content{-ms-flex-pack:center!important;justify-content:center!important}.login-text{display:none}}.login-page-block{background:url(../images/login-bg.png);background-repeat:no-repeat;background-position:bottom;min-height:650px;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;background-size:100% 100%}.logo-link{position:absolute;top:0;width:100%;min-height:85px;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.login-page-content{margin:0;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;-ms-flex-align:center;align-items:center;padding:10%}.login-page-content .login-block,.login-page-content .password-reset-form{width:100%;max-width:400px}button{border:0;background:0 0}.login-page .logo,.signup-page .logo{text-align:center}.login-page .content .login-form,.login-page .content .signup-form,.signup-page .content .login-form,.signup-page .content .signup-form{border-radius:20px;box-shadow:0 6px 30px 0 rgba(0,0,0,.1);background-color:#fff;padding:50px}.login-page .content .login-form h3,.login-page .content .signup-form h3,.signup-page .content .login-form h3,.signup-page .content .signup-form h3{color:#395373;font-size:22px;font-weight:600;text-align:center}.login-page .content .call-system-picker{width:800px}.login-page .content .login-form h3,.login-page .content .signup-form h3,.signup-page .content .login-form h3,.signup-page .content .signup-form h3{color:#395373;font-size:22px;font-weight:600;text-align:center}.login-page .content .call-system-picker{width:800px}.login-page .content .call-system-picker h3{text-align:left}.login-page .content .login-form .field-input,.login-page .content .signup-form .field-input,.signup-page .content .login-form .field-input,.signup-page .content .signup-form .field-input{display:-ms-flexbox;display:flex;padding:10px 0}.login-page .content .login-form .field-input svg,.login-page .content .signup-form .field-input svg,.signup-page .content .login-form .field-input svg,.signup-page .content .signup-form .field-input svg{margin-right:20px}.login-page .content .login-form .field-input md-input-container{max-height:30px}.login-page .content .login-form .field-input input,.login-page .content .signup-form .field-input input,.signup-page .content .login-form .field-input input,.signup-page .content .signup-form .field-input input{border:none;width:100%;font-size:16px;color:#a0abae;margin:0;border-bottom:1px solid #e3e3e3}.login-page .content .login-form .field-input .fname,.login-page .content .signup-form .field-input .fname,.signup-page .content .login-form .field-input .fname,.signup-page .content .signup-form .field-input .fname{display:-ms-flexbox;display:flex;margin-right:10px}.login-page .content .login-form .field-input .input-box,.login-page .content .signup-form .field-input .input-box,.signup-page .content .login-form .field-input .input-box,.signup-page .content .signup-form .field-input .input-box{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;width:100%;margin-bottom:20px}.login-page .content .login-form .field-input .input-box.no-margin{margin-bottom:0}.login-page .content .login-form .field-input .input-box .input-field,.login-page .content .signup-form .field-input .input-box .input-field,.signup-page .content .login-form .field-input .input-box .input-field,.signup-page .content .signup-form .field-input .input-box .input-field{width:100%;margin:0}.login-page .content .login-form .field-input .input-box .input-field.lname,.login-page .content .signup-form .field-input .input-box .input-field.lname,.signup-page .content .login-form .field-input .input-box .input-field.lname,.signup-page .content .signup-form .field-input .input-box .input-field.lname{padding-left:20px;border-left:2px dotted #f4f2f2}.login-page .content .login-form .field-input .input-box .input-field.lname label,.login-page .content .signup-form .field-input .input-box .input-field.lname label,.signup-page .content .login-form .field-input .input-box .input-field.lname label,.signup-page .content .signup-form .field-input .input-box .input-field.lname label{padding-left:20px}.login-page .content .login-form .field-input .input-box .input-field .validate,.login-page .content .signup-form .field-input .input-box .input-field .validate,.signup-page .content .login-form .field-input .input-box .input-field .validate,.signup-page .content .signup-form .field-input .input-box .input-field .validate{border-bottom:solid 1px #f4f2f2}.login-page .content .login-form .login-btn,.login-page .content .login-form .signup-btn,.login-page .content .signup-form .login-btn,.login-page .content .signup-form .signup-btn,.signup-page .content .login-form .login-btn,.signup-page .content .login-form .signup-btn,.signup-page .content .signup-form .login-btn,.signup-page .content .signup-form .signup-btn{display:-ms-flexbox;display:flex;-ms-flex-pack:end;justify-content:flex-end}.login-page .content .login-form .login-btn span,.login-page .content .login-form .signup-btn span,.login-page .content .signup-form .login-btn span,.login-page .content .signup-form .signup-btn span,.signup-page .content .login-form .login-btn span,.signup-page .content .login-form .signup-btn span,.signup-page .content .signup-form .login-btn span,.signup-page .content .signup-form .signup-btn span{width:100%;border-radius:35px;background-color:#395373;color:#fff}.login-page .content .login-form span.disabled{background-color:#a9a9a9;cursor:not-allowed}.login-page .content .text,.signup-page .content .text{text-align:right;max-width:342px}.login-page .content .text h2,.signup-page .content .text h2{color:#395373;font-size:36px;font-weight:700;position:relative}.login-page .content .text h2::after,.signup-page .content .text h2::after{position:absolute;right:0;content:"";width:180px;height:4px;background:#395373;border-radius:2px;overflow:hidden;bottom:-10px}.login-page .content .text p,.signup-page .content .text p{color:#666;font-size:18px;font-weight:500;margin-top:30px;margin-left:10px}.login-page .content .text p span,.signup-page .content .text p span{color:#395373}.login-page .content .login-form .field-input{width:400px}.login-page .content .text h2::after{transform:translateX(-44%)}.login-page .content .login-form .login-btn{display:-ms-flexbox;display:flex;-ms-flex-pack:start;justify-content:flex-start}.login-btn .login-button-custom{width:100%}.login-btn .login-custom{padding:15px 70px!important}.login-page .content .login-form #gSignIn .abcRioButtonBlue{width:100%!important}.login-page .content .login-form .field-input{width:100%}.login-page .content .login-form .field-input.verify{width:100%}.login-page .field-input.verify md-select{margin:3px 0 0 0}.verification-page{background-image:linear-gradient(235deg,#f7f7f7,#fff 68%,#fff)}.verification-page .logo{text-align:center;padding-top:40px}.verification-page .content{margin:60px 0 0;display:-ms-flexbox;display:flex;-ms-flex-pack:start;justify-content:flex-start;position:relative}.verification-page .content .text{padding-top:60px;margin-left:140px;z-index:1}.verification-page .content .text h2{color:#395373;font-size:36px;font-weight:700;position:relative}.verification-page .content .text h2::after{position:absolute;left:0;content:'';width:180px;height:4px;background:#395373;border-radius:2px;overflow:hidden;bottom:-10px}.verification-page .content .text p{font-size:18px;font-weight:500;color:#666;margin-top:30px;max-width:394px}.verification-page .content .text .verify-form{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:40px;margin-top:100px;border-radius:10px;box-shadow:0 6px 30px 0 rgba(0,0,0,.1);background-color:#fff}.verification-page .content .text .verify-form .details{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.verification-page .content .text .verify-form .details svg{margin-right:20px}.verification-page .content .text .verify-form .details .input-field{margin:0}.verification-page .content .text .verify-form .details .input-field .validate{border:none;color:#a0abae;font-size:16px;width:225px;border-bottom:solid 1px #f4f2f2;margin:0}.verification-page .content .text .verify-form .details .input-field.separator{border-left:2px dotted #f4f2f2;padding-left:25px;margin-left:25px}.verification-page .content .text .verify-form .details .input-field.separator label{padding-left:25px}.verification-page .content .text .verify-form .submit-btn{padding-left:50px;display:-ms-flexbox;display:flex;-ms-flex-pack:end;justify-content:flex-end}.verification-page .content .text .verify-form .submit-btn span{padding:15px 40px;border-radius:35px;background-color:#395373;color:#fff}.verification-page .content .image{position:absolute;right:0;max-height:700px;overflow:hidden}.footer{padding:50px 0;margin-top:120px;background:#ebfcfc;position:relative;background-image:url(../images/footer-bg-img.png);background-repeat:no-repeat}.footer .footer-img{position:absolute;top:-50px}.footer .footer-menu ul{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:end;justify-content:flex-end}.footer .footer-menu ul li{margin-left:50px}.footer .footer-menu ul li a{position:relative;color:#0a1247}.footer .footer-menu ul li a::after{content:'';position:absolute;height:2px;width:100%;transform:scale(0);background:#0a1247;bottom:-5px;left:0;transition:all .5s ease}.footer .footer-menu ul li a:hover::after{transform:scale(.8)}.privacy{background:#0a1247;padding:20px 0}.privacy .privacy-content{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:end;justify-content:flex-end}.privacy .privacy-content p{color:#fff;font-size:14px}.privacy .privacy-content .social-media{display:-ms-flexbox;display:flex}.privacy .privacy-content .social-media img{margin-left:20px;cursor:pointer}.login-image{position:absolute;right:0;max-height:700px;overflow:hidden}.privacy .privacy-content p{color:#fff;font-size:14px}.privacy .privacy-content .social-media{display:-ms-flexbox;display:flex}.privacy .privacy-content .social-media img{margin-left:20px;cursor:pointer}.login-image{position:absolute;right:0;max-height:700px;overflow:hidden}.logo img{max-width:300px}button.custom{width:100%;padding:15px 40px;border-radius:35px;background-color:#395373;color:#fff}ul.no-styling{margin:0;padding:0;list-style:none}.m-16{margin:16px!important}.p-16{padding:16px!important}.microsoft-login-btn{margin-top:14px;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;width:100%;box-shadow:0 2px 4px 0 rgb(0 0 0 / 25%);border-radius:50px}.microsoft-login-btn .login-button-custom{-ms-flex-positive:1;flex-grow:1}.microsoft-login-btn .icon-block{height:48px;width:48px;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.cancel-subscription-block{width:100%;padding:20px;border-radius:10px;margin:10px}.cancel-subscription-block .cancel-subscription-note{background-color:#3a53732b;padding:10px;border-radius:5px}.cancel-subscription-block .cancel-subscription-header{font-size:20px;padding:0 0 20px}.cancel-subscription-block .cancel-subscription-description{font-size:14px;padding:0 0 20px}.confirm-cancel .confirm-button{padding:0 10px 0 10px}.delete-subscription{padding:0 4px 0 0;font-size:18px}.cancel-subscription-block .confirm-cancel{padding:10px 0 0;text-align:right}.cancel-subscription-block .cancel-subscription-note .info-cancel{padding:0 0 0 6px}span.spacer{-ms-flex:1 1 auto;flex:1 1 auto}.search-section{position:relative}.search-section i.first-element{position:absolute;z-index:99;height:calc(100% - 32px);padding:0 10px;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.search-section i.last-element{position:absolute;z-index:99;top:15px;right:15px;height:calc(100% - 32px);padding:0 10px;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;cursor:pointer}.search-input-class input{padding-left:40px!important;background-color:#f5f5f5!important;border-radius:8px}.search-input-class .md-whiteframe-z1{box-shadow:none!important;background-color:#f5f5f5!important;border-radius:8px}.search-section .custom-autocomplete{padding:10px 40px;border:none;background-color:#f5f5f5!important;border-radius:8px;width:100%}.search-section .custom-autocomplete-dropdown{position:absolute;width:calc(100% - 32px);padding:10px 0;background-color:#fff;box-shadow:rgba(0,0,0,.16) 0 1px 4px;border-radius:10px;max-height:294px;overflow-y:auto;display:grid;gap:2px;z-index:1}.search-section .custom-autocomplete-dropdown .custom-autocomplete-dropdown-item{width:100%;padding:10px 12px;cursor:pointer}.search-section .custom-autocomplete-dropdown .custom-autocomplete-dropdown-item:hover{background-color:#f5f5f5}.search-section .custom-autocomplete-dropdown .custom-autocomplete-dropdown-key{background-color:#e6e6e6;cursor:not-allowed;pointer-events:none;padding:8px 10px;text-transform:capitalize}.auth-app-code{display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center;margin-top:20px}.qr-code-auth{margin-top:15px;margin-bottom:15px;height:200px}.auth-code-width{width:30%}.radio-group{margin-bottom:45px}.reset-otp{text-align:right}.reset-otp span{cursor:pointer}.request-otp-info{text-align:center;margin:15px 0;font-size:15px}.request-assistant{text-align:center;margin-top:15px}.request-assistant span{color:red;text-decoration:underline;cursor:pointer}.form-port-details{border:1px solid #f5f5f5;padding:0 20px 0;margin-top:15px}.stepper{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;-ms-flex-align:center;align-items:center;width:100%;margin-top:20px;margin-bottom:20px}.step{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-align:center;align-items:center;position:relative;width:25%;text-align:center}.step-number{display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center;width:30px;height:30px;border-radius:50%;background-color:#fff;border:2px solid #ccc;margin-bottom:10px;font-weight:700;font-size:16px}.step-title{font-size:14px;color:#777}.step-line{position:absolute;height:2px;width:100%;background-color:#ccc;top:15px;left:calc(50% + 15px)}.step:last-child .step-line{display:none}.step.active .step-number{border-color:#4050b5;color:#4050b5}.button-group{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-top:20px;margin-bottom:15px}.next-step-button{display:-ms-flexbox;display:flex;-ms-flex-pack:end;justify-content:end;margin-top:20px;margin-bottom:15px}.file-upload-container{-ms-flex-pack:justify;justify-content:space-between;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:12px}.upload-icon{font-size:60px;color:#ccc}.upload-label-doc{margin-top:25px;margin-bottom:15px}.dash-border{border:2px dashed #ccc;padding:20px;text-align:center}.upload-btn{margin-top:10px;padding:10px;background-color:#3949ab;border:none;color:#fff;cursor:pointer;width:150px;margin-right:auto;margin-left:auto}.file-format{font-size:14px;color:#ccc;margin-top:5px}.selected-file{display:-ms-flexbox;display:flex;margin-top:4px;padding:5px 10px;border:1px solid #d3d3d3;border-radius:3px;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between}.selected-file i{cursor:pointer}.invisible{visibility:hidden}.continue-to-process{text-align:center}.continue-to-process button{padding:5px 50px}.add-block-number-modal{width:100%;max-width:500px}.country-width{width:100px}.info-phone-number{background-color:#3a53732b;padding:10px;border-radius:5px}.info-phone{padding:0 0 0 6px}.info-phone-note{padding:15px}.country-field{padding:0 20px 0 20px}.md-input-container{margin:0}.card-bottom{padding-bottom:0!important}.submit-button{padding-top:0!important}.form-port-details{-ms-flex-wrap:wrap;flex-wrap:wrap}.port-number-details{display:-ms-flexbox;display:flex;width:100%;gap:30px}.port-number-details .action-button{margin-top:14px}.port-number-details .porting-number-counts{margin-top:30px}.form-port-details .action-port-button{display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center}.form-port-details .action-port-button button{margin:0;padding:0 15px;margin-top:12px}.form-port-details .action-port-button button.activated-button{background-color:#fff!important;color:#000!important}.form-port-details .action-port-button button.single-btn{border-top-right-radius:0;border-bottom-right-radius:0}.form-port-details .action-port-button button.multiple-btn{border-top-left-radius:0;border-bottom-left-radius:0}.multi-port-style{width:100%;border:1px solid #f5f5f5;padding:10px 25px;margin-bottom:20px}.multi-port-input{margin-bottom:0}.box{font-size:14px;color:red;margin-top:4px;margin-bottom:4px}.step-check-icon{position:relative;display:inline-block;width:24px;height:24px;border-radius:50%;border:2px solid #4caf50;color:#4caf50;font-size:16px;line-height:24px;text-align:center}.step-check-icon:before{content:"\2713";position:absolute;top:0;left:0;right:0;bottom:0;font-size:16px}.checked-circle{font-size:38px;color:#109c10}.pricing-plan-container{margin-left:auto;margin-right:auto;-ms-flex-pack:center;justify-content:center;-ms-flex-wrap:wrap;flex-wrap:wrap}.pricing-header{-ms-flex-align:center;align-items:center}.plan-cards{width:295px;position:relative;margin-bottom:30px;overflow:hidden;height:980px}.popular{position:absolute;background:#ff655d;top:0;right:0;width:150px;height:150px;transform:rotate(45deg) translateY(-120px);transform-origin:center;font-weight:600;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:end;justify-content:flex-end;-ms-flex-align:center;align-items:center}.popular i{font-size:24px;color:#fff}.popular p{font-size:10px;color:#fff;font-weight:400}.pricing-content{padding:0 24px 0 40px}.pricing-content li{line-height:2}.started-button{border:2px solid #181147;color:#181147;width:130px;height:50px;font-weight:400}.started-button:hover{background-color:#181147!important;color:#fff}.pricing-plan-container md-card-title{-ms-flex:0;flex:0}.button-plan{margin-top:auto;padding:30px}md-content{background-color:#fff}.plan-info li{list-style:disc}.plan-info li::marker{color:#6ad7fa}.featured-popular{border:5px solid #ff655d}.plan-info .plan-plus{list-style:none;margin-top:35px;font-size:12px}.started-button-downgrade{width:150px;height:50px;font-weight:400;border:2px solid}.phone-sms{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-align:center;align-items:center;width:30%}.sms-number-field{margin-bottom:0}.card-img-top{width:100%;height:140px}.appearance-container{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-align:center;align-items:center}.card-appearance{width:265px;margin-right:24px;border:1px solid #f5f5f5;border-radius:6px}.appearance-group{margin-top:25px;margin-bottom:25px}.form-check-appearance{border-top:1px solid #f5f5f5;padding:10px}.card-body-appearance{height:45px}.payment-container{width:100%}.payment-input{margin-right:15px!important;position:relative}.payment-input svg{position:absolute;top:50%;transform:translateY(-50%);right:0;margin-right:0!important}.top-payment-heading{display:-ms-flexbox;display:flex;margin-bottom:0;margin-top:0}.top-payment-heading.payment-method-txt{margin-bottom:25px}.payment-info{margin-bottom:40px;font-weight:400;font-size:12px;line-height:1.5}.accept-payment{margin-right:0;margin-bottom:50px}.accept-payment-terms{font-size:10px;font-weight:400;line-height:1.8}.payment-detail{font-size:20px;color:#395373;font-weight:500;margin-top:20px}.payment-button{border-radius:50px!important;width:130px;margin-right:12px!important}.payment-value-conatiner{height:100%;width:100%;max-width:420px;min-height:250px;padding:18px!important}.pay-trial{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:10px}.trail-text{font-size:14px}.payment-info-billed{font-size:12px;font-weight:400;line-height:1.2}.pay-trial-details{background:#3a537324;padding:10px;border-radius:6px;margin-top:20px}.font-trail{font-weight:500}.trail-button{width:100%;margin-top:18px}.payment-details-container{margin-right:18px}.custom-error{color:#dd2c00;font-size:80%}.credit-card-brand{position:absolute;right:6px;top:6px}.credit-card-brand img{max-height:22px}.field-input-ui{margin-bottom:18px}.address-detail{margin-bottom:30px}.name-details{padding:0}.checkout-container{width:40%;margin-top:auto;margin-bottom:auto;margin-right:20px}.check-checkout{display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;font-size:35px;color:#339d40}.checkout-heading{margin-top:0;margin-bottom:6px}.checkout-details{font-size:14px;font-weight:400;line-height:1.5;text-align:center}.payment-trial-conatiner{width:40%;height:250px;padding:18px!important}.checkout-container-box{display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center}.trail-header{font-size:10px;line-height:1.8}.total-trial{margin-top:16px}.trail-dashboard-button{display:-ms-flexbox;display:flex;margin-right:auto!important;margin-left:auto!important;width:150px;border-radius:50px!important;-ms-flex-pack:center;justify-content:center;margin-top:15px}.paypal-button{width:100%;margin-top:18px;height:40px;border-radius:6px}.md-icon-float{-ms-flex:1 1 auto;flex:1 1 auto}p{font-weight:300}md-checkbox.md-checked .md-icon{background-color:rgb(64 80 181)!important}.trunk-name{margin-top:40px;margin-bottom:0}.trunk-icon{margin-top:50px!important}.theme-moon{width:3%;position:absolute;right:60px;border-radius:50%;padding:8px;background:#395373;transform:rotate(80deg);top:30px;cursor:pointer}.login-page .input-box md-input-container{width:100%!important}.login-page .input-box md-input-container label,.login-page .input-box md-input-container label.md-required{padding-left:6px!important} \ No newline at end of file + */.flag-background{background-size:contain;background-position:50%;background-repeat:no-repeat}.flag{background-size:contain;background-position:50%;background-repeat:no-repeat;position:relative;display:inline-block;width:1.33333333em;line-height:1em}.flag:before{content:"\00a0"}.flag-1x{width:1.33333333em;line-height:1em}.flag-2x{width:2.66666667em;line-height:2em}.flag-3x{width:4em;line-height:3em}.flag-4x{width:5.33333333em;line-height:4em}.flag-5x{width:6.66666667em;line-height:5em}.flag-6x{width:8em;line-height:6em}.flag-7x{width:9.33333333em;line-height:7em}.flag-8x{width:10.66666667em;line-height:8em}.flag-9x{width:12em;line-height:9em}.flag-10x{width:13.33333333em;line-height:10em}.flag-rotate-90{transform:rotate(90deg)}.flag-rotate-180{transform:rotate(180deg)}.flag-rotate-270{transform:rotate(270deg)}.flag-flip-horizontal{transform:scale(-1,1)}.flag-flip-vertical{transform:scale(1,-1)}:root .flag-flip-horizontal,:root .flag-flip-vertical,:root .flag-rotate-180,:root .flag-rotate-270,:root .flag-rotate-90{filter:none}.flag-533,.flag-abw,.flag-aw,.flag-fifa-aru,.flag-ioc-aru{background-image:url(../flags/png/abw.png);background-image:url(../flags/abw.svg)}.flag-4,.flag-af,.flag-afg,.flag-fifa-afg,.flag-ioc-afg{background-image:url(../flags/png/afg.png);background-image:url(../flags/afg.svg)}.flag-24,.flag-ago,.flag-ao,.flag-fifa-ang,.flag-ioc-ang{background-image:url(../flags/png/ago.png);background-image:url(../flags/ago.svg)}.flag-660,.flag-ai,.flag-aia,.flag-fifa-aia,.flag-ioc-aia{background-image:url(../flags/png/aia.png);background-image:url(../flags/aia.svg)}.flag-248,.flag-ala,.flag-ax,.flag-fifa-ald{background-image:url(../flags/png/ala.png);background-image:url(../flags/ala.svg)}.flag-8,.flag-al,.flag-alb,.flag-fifa-alb,.flag-ioc-alb{background-image:url(../flags/png/alb.png);background-image:url(../flags/alb.svg)}.flag-20,.flag-ad,.flag-and,.flag-fifa-and,.flag-ioc-and{background-image:url(../flags/png/and.png);background-image:url(../flags/and.svg)}.flag-784,.flag-ae,.flag-are,.flag-fifa-uae,.flag-ioc-uae{background-image:url(../flags/png/are.png);background-image:url(../flags/are.svg)}.flag-32,.flag-ar,.flag-arg,.flag-fifa-arg,.flag-ioc-arg{background-image:url(../flags/png/arg.png);background-image:url(../flags/arg.svg)}.flag-51,.flag-am,.flag-arm,.flag-fifa-arm,.flag-ioc-arm{background-image:url(../flags/png/arm.png);background-image:url(../flags/arm.svg)}.flag-16,.flag-as,.flag-asm,.flag-fifa-asa,.flag-ioc-asa{background-image:url(../flags/png/asm.png);background-image:url(../flags/asm.svg)}.flag-10,.flag-aq,.flag-ata,.flag-fifa-ros{background-image:url(../flags/png/ata.png);background-image:url(../flags/ata.svg)}.flag-260,.flag-atf,.flag-tf{background-image:url(../flags/png/atf.png);background-image:url(../flags/atf.svg)}.flag-28,.flag-ag,.flag-atg,.flag-fifa-atg,.flag-ioc-ant{background-image:url(../flags/png/atg.png);background-image:url(../flags/atg.svg)}.flag-36,.flag-au,.flag-aus,.flag-fifa-aus,.flag-ioc-aus{background-image:url(../flags/png/aus.png);background-image:url(../flags/aus.svg)}.flag-40,.flag-at,.flag-aut,.flag-fifa-aut,.flag-ioc-aut{background-image:url(../flags/png/aut.png);background-image:url(../flags/aut.svg)}.flag-31,.flag-az,.flag-aze,.flag-fifa-aze,.flag-ioc-aze{background-image:url(../flags/png/aze.png);background-image:url(../flags/aze.svg)}.flag-108,.flag-bdi,.flag-bi,.flag-fifa-bdi,.flag-ioc-bdi{background-image:url(../flags/png/bdi.png);background-image:url(../flags/bdi.svg)}.flag-56,.flag-be,.flag-bel,.flag-fifa-bel,.flag-ioc-bel{background-image:url(../flags/png/bel.png);background-image:url(../flags/bel.svg)}.flag-204,.flag-ben,.flag-bj,.flag-fifa-ben,.flag-ioc-ben{background-image:url(../flags/png/ben.png);background-image:url(../flags/ben.svg)}.flag-535,.flag-bes,.flag-bq,.flag-fifa-ant,.flag-ioc-aho{background-image:url(../flags/png/bes.png);background-image:url(../flags/bes.svg)}.flag-854,.flag-bf,.flag-bfa,.flag-fifa-bfa,.flag-ioc-bur{background-image:url(../flags/png/bfa.png);background-image:url(../flags/bfa.svg)}.flag-50,.flag-bd,.flag-bgd,.flag-fifa-ban,.flag-ioc-ban{background-image:url(../flags/png/bgd.png);background-image:url(../flags/bgd.svg)}.flag-100,.flag-bg,.flag-bgr,.flag-fifa-bul,.flag-ioc-bul{background-image:url(../flags/png/bgr.png);background-image:url(../flags/bgr.svg)}.flag-48,.flag-bh,.flag-bhr,.flag-fifa-bhr,.flag-ioc-brn{background-image:url(../flags/png/bhr.png);background-image:url(../flags/bhr.svg)}.flag-44,.flag-bhs,.flag-bs,.flag-fifa-bah,.flag-ioc-bah{background-image:url(../flags/png/bhs.png);background-image:url(../flags/bhs.svg)}.flag-70,.flag-ba,.flag-bih,.flag-fifa-bih,.flag-ioc-bih{background-image:url(../flags/png/bih.png);background-image:url(../flags/bih.svg)}.flag-652,.flag-bl,.flag-blm{background-image:url(../flags/png/blm.png);background-image:url(../flags/blm.svg)}.flag-112,.flag-blr,.flag-by,.flag-fifa-blr,.flag-ioc-blr{background-image:url(../flags/png/blr.png);background-image:url(../flags/blr.svg)}.flag-84,.flag-blz,.flag-bz,.flag-fifa-blz,.flag-ioc-biz{background-image:url(../flags/png/blz.png);background-image:url(../flags/blz.svg)}.flag-60,.flag-bm,.flag-bmu,.flag-fifa-ber,.flag-ioc-ber{background-image:url(../flags/png/bmu.png);background-image:url(../flags/bmu.svg)}.flag-68,.flag-bo,.flag-bol,.flag-fifa-bol,.flag-ioc-bol{background-image:url(../flags/png/bol.png);background-image:url(../flags/bol.svg)}.flag-76,.flag-br,.flag-bra,.flag-fifa-bra,.flag-ioc-bra{background-image:url(../flags/png/bra.png);background-image:url(../flags/bra.svg)}.flag-52,.flag-bb,.flag-brb,.flag-fifa-brb,.flag-ioc-bar{background-image:url(../flags/png/brb.png);background-image:url(../flags/brb.svg)}.flag-96,.flag-bn,.flag-brn,.flag-fifa-bru,.flag-ioc-bru{background-image:url(../flags/png/brn.png);background-image:url(../flags/brn.svg)}.flag-64,.flag-bt,.flag-btn,.flag-fifa-bhu,.flag-ioc-bhu{background-image:url(../flags/png/btn.png);background-image:url(../flags/btn.svg)}.flag-74,.flag-bv,.flag-bvt{background-image:url(../flags/png/bvt.png);background-image:url(../flags/bvt.svg)}.flag-72,.flag-bw,.flag-bwa,.flag-fifa-bot,.flag-ioc-bot{background-image:url(../flags/png/bwa.png);background-image:url(../flags/bwa.svg)}.flag-140,.flag-caf,.flag-cf,.flag-fifa-cta,.flag-ioc-caf{background-image:url(../flags/png/caf.png);background-image:url(../flags/caf.svg)}.flag-124,.flag-ca,.flag-can,.flag-fifa-can,.flag-ioc-can{background-image:url(../flags/png/can.png);background-image:url(../flags/can.svg)}.flag-166,.flag-cc,.flag-cck,.flag-fifa-cck{background-image:url(../flags/png/cck.png);background-image:url(../flags/cck.svg)}.flag-756,.flag-ch,.flag-che,.flag-fifa-sui,.flag-ioc-sui{background-image:url(../flags/png/che.png);background-image:url(../flags/che.svg)}.flag-152,.flag-chl,.flag-cl,.flag-fifa-chi,.flag-ioc-chi{background-image:url(../flags/png/chl.png);background-image:url(../flags/chl.svg)}.flag-156,.flag-chn,.flag-cn,.flag-fifa-chn,.flag-ioc-chn{background-image:url(../flags/png/chn.png);background-image:url(../flags/chn.svg)}.flag-384,.flag-ci,.flag-civ,.flag-fifa-civ,.flag-ioc-civ{background-image:url(../flags/png/civ.png);background-image:url(../flags/civ.svg)}.flag-120,.flag-cm,.flag-cmr,.flag-fifa-cmr,.flag-ioc-cmr{background-image:url(../flags/png/cmr.png);background-image:url(../flags/cmr.svg)}.flag-180,.flag-cd,.flag-cod,.flag-fifa-cod,.flag-ioc-cod{background-image:url(../flags/png/cod.png);background-image:url(../flags/cod.svg)}.flag-178,.flag-cg,.flag-cog,.flag-fifa-cgo,.flag-ioc-cgo{background-image:url(../flags/png/cog.png);background-image:url(../flags/cog.svg)}.flag-184,.flag-ck,.flag-cok,.flag-fifa-cok,.flag-ioc-cok{background-image:url(../flags/png/cok.png);background-image:url(../flags/cok.svg)}.flag-170,.flag-co,.flag-col,.flag-fifa-col,.flag-ioc-col{background-image:url(../flags/png/col.png);background-image:url(../flags/col.svg)}.flag-174,.flag-com,.flag-fifa-com,.flag-ioc-com,.flag-km{background-image:url(../flags/png/com.png);background-image:url(../flags/com.svg)}.flag-132,.flag-cpv,.flag-cv,.flag-fifa-cpv,.flag-ioc-cpv{background-image:url(../flags/png/cpv.png);background-image:url(../flags/cpv.svg)}.flag-188,.flag-cr,.flag-cri,.flag-fifa-crc,.flag-ioc-crc{background-image:url(../flags/png/cri.png);background-image:url(../flags/cri.svg)}.flag-192,.flag-cu,.flag-cub,.flag-fifa-cub,.flag-ioc-cub{background-image:url(../flags/png/cub.png);background-image:url(../flags/cub.svg)}.flag-531,.flag-cuw,.flag-cw{background-image:url(../flags/png/cuw.png);background-image:url(../flags/cuw.svg)}.flag-162,.flag-cx,.flag-cxr,.flag-fifa-cxr{background-image:url(../flags/png/cxr.png);background-image:url(../flags/cxr.svg)}.flag-136,.flag-cym,.flag-fifa-cay,.flag-ioc-cay,.flag-ky{background-image:url(../flags/png/cym.png);background-image:url(../flags/cym.svg)}.flag-196,.flag-cy,.flag-cyp,.flag-fifa-cyp,.flag-ioc-cyp{background-image:url(../flags/png/cyp.png);background-image:url(../flags/cyp.svg)}.flag-203,.flag-cz,.flag-cze,.flag-fifa-cze,.flag-ioc-cze{background-image:url(../flags/png/cze.png);background-image:url(../flags/cze.svg)}.flag-276,.flag-de,.flag-deu,.flag-fifa-ger,.flag-ioc-ger{background-image:url(../flags/png/deu.png);background-image:url(../flags/deu.svg)}.flag-262,.flag-dj,.flag-dji,.flag-fifa-dji,.flag-ioc-dji{background-image:url(../flags/png/dji.png);background-image:url(../flags/dji.svg)}.flag-212,.flag-dm,.flag-dma,.flag-fifa-dma,.flag-ioc-dma{background-image:url(../flags/png/dma.png);background-image:url(../flags/dma.svg)}.flag-208,.flag-dk,.flag-dnk,.flag-fifa-den,.flag-ioc-den{background-image:url(../flags/png/dnk.png);background-image:url(../flags/dnk.svg)}.flag-214,.flag-do,.flag-dom,.flag-fifa-dom,.flag-ioc-dom{background-image:url(../flags/png/dom.png);background-image:url(../flags/dom.svg)}.flag-12,.flag-dz,.flag-dza,.flag-fifa-alg,.flag-ioc-alg{background-image:url(../flags/png/dza.png);background-image:url(../flags/dza.svg)}.flag-218,.flag-ec,.flag-ecu,.flag-fifa-ecu,.flag-ioc-ecu{background-image:url(../flags/png/ecu.png);background-image:url(../flags/ecu.svg)}.flag-818,.flag-eg,.flag-egy,.flag-fifa-egy,.flag-ioc-egy{background-image:url(../flags/png/egy.png);background-image:url(../flags/egy.svg)}.flag-232,.flag-er,.flag-eri,.flag-fifa-eri,.flag-ioc-eri{background-image:url(../flags/png/eri.png);background-image:url(../flags/eri.svg)}.flag-732,.flag-eh,.flag-esh,.flag-fifa-sah{background-image:url(../flags/png/esh.png);background-image:url(../flags/esh.svg)}.flag-724,.flag-es,.flag-esp,.flag-fifa-esp,.flag-ioc-esp{background-image:url(../flags/png/esp.png);background-image:url(../flags/esp.svg)}.flag-233,.flag-ee,.flag-est,.flag-fifa-est,.flag-ioc-est{background-image:url(../flags/png/est.png);background-image:url(../flags/est.svg)}.flag-231,.flag-et,.flag-eth,.flag-fifa-eth,.flag-ioc-eth{background-image:url(../flags/png/eth.png);background-image:url(../flags/eth.svg)}.flag-246,.flag-fi,.flag-fifa-fin,.flag-fin,.flag-ioc-fin{background-image:url(../flags/png/fin.png);background-image:url(../flags/fin.svg)}.flag-242,.flag-fifa-fij,.flag-fj,.flag-fji,.flag-ioc-fij{background-image:url(../flags/png/fji.png);background-image:url(../flags/fji.svg)}.flag-238,.flag-fifa-flk,.flag-fk,.flag-flk,.flag-ioc-flk{background-image:url(../flags/png/flk.png);background-image:url(../flags/flk.svg)}.flag-250,.flag-fifa-fra,.flag-fr,.flag-fra,.flag-ioc-fra{background-image:url(../flags/png/fra.png);background-image:url(../flags/fra.svg)}.flag-234,.flag-fifa-fro,.flag-fo,.flag-fro,.flag-ioc-far{background-image:url(../flags/png/fro.png);background-image:url(../flags/fro.svg)}.flag-583,.flag-fifa-fsm,.flag-fm,.flag-fsm,.flag-ioc-fsm{background-image:url(../flags/png/fsm.png);background-image:url(../flags/fsm.svg)}.flag-266,.flag-fifa-gab,.flag-ga,.flag-gab,.flag-ioc-gab{background-image:url(../flags/png/gab.png);background-image:url(../flags/gab.svg)}.flag-826,.flag-gb,.flag-gbr,.flag-ioc-gbr{background-image:url(../flags/png/gbr.png);background-image:url(../flags/gbr.svg)}.flag-268,.flag-fifa-geo,.flag-ge,.flag-geo,.flag-ioc-geo{background-image:url(../flags/png/geo.png);background-image:url(../flags/geo.svg)}.flag-831,.flag-fifa-gbg,.flag-gg,.flag-ggy{background-image:url(../flags/png/ggy.png);background-image:url(../flags/ggy.svg)}.flag-288,.flag-fifa-gha,.flag-gh,.flag-gha,.flag-ioc-gha{background-image:url(../flags/png/gha.png);background-image:url(../flags/gha.svg)}.flag-292,.flag-fifa-gbz,.flag-gi,.flag-gib,.flag-ioc-gib{background-image:url(../flags/png/gib.png);background-image:url(../flags/gib.svg)}.flag-324,.flag-fifa-gui,.flag-gin,.flag-gn,.flag-ioc-gui{background-image:url(../flags/png/gin.png);background-image:url(../flags/gin.svg)}.flag-312,.flag-fifa-glp,.flag-glp,.flag-gp,.flag-ioc-gud{background-image:url(../flags/png/glp.png);background-image:url(../flags/glp.svg)}.flag-270,.flag-fifa-gam,.flag-gm,.flag-gmb,.flag-ioc-gam{background-image:url(../flags/png/gmb.png);background-image:url(../flags/gmb.svg)}.flag-624,.flag-fifa-gnb,.flag-gnb,.flag-gw,.flag-ioc-gbs{background-image:url(../flags/png/gnb.png);background-image:url(../flags/gnb.svg)}.flag-226,.flag-fifa-eqg,.flag-gnq,.flag-gq,.flag-ioc-geq{background-image:url(../flags/png/gnq.png);background-image:url(../flags/gnq.svg)}.flag-300,.flag-fifa-gre,.flag-gr,.flag-grc,.flag-ioc-gre{background-image:url(../flags/png/grc.png);background-image:url(../flags/grc.svg)}.flag-308,.flag-fifa-grn,.flag-gd,.flag-grd,.flag-ioc-grn{background-image:url(../flags/png/grd.png);background-image:url(../flags/grd.svg)}.flag-304,.flag-fifa-grl,.flag-gl,.flag-grl,.flag-ioc-grl{background-image:url(../flags/png/grl.png);background-image:url(../flags/grl.svg)}.flag-320,.flag-fifa-gua,.flag-gt,.flag-gtm,.flag-ioc-gua{background-image:url(../flags/png/gtm.png);background-image:url(../flags/gtm.svg)}.flag-254,.flag-fifa-guf,.flag-gf,.flag-guf,.flag-ioc-fgu{background-image:url(../flags/png/guf.png);background-image:url(../flags/guf.svg)}.flag-316,.flag-fifa-gum,.flag-gu,.flag-gum,.flag-ioc-gum{background-image:url(../flags/png/gum.png);background-image:url(../flags/gum.svg)}.flag-328,.flag-fifa-guy,.flag-guy,.flag-gy,.flag-ioc-guy{background-image:url(../flags/png/guy.png);background-image:url(../flags/guy.svg)}.flag-344,.flag-fifa-hkg,.flag-hk,.flag-hkg,.flag-ioc-hkg{background-image:url(../flags/png/hkg.png);background-image:url(../flags/hkg.svg)}.flag-334,.flag-hm,.flag-hmd{background-image:url(../flags/png/hmd.png);background-image:url(../flags/hmd.svg)}.flag-340,.flag-fifa-hon,.flag-hn,.flag-hnd,.flag-ioc-hon{background-image:url(../flags/png/hnd.png);background-image:url(../flags/hnd.svg)}.flag-191,.flag-fifa-cro,.flag-hr,.flag-hrv,.flag-ioc-cro{background-image:url(../flags/png/hrv.png);background-image:url(../flags/hrv.svg)}.flag-332,.flag-fifa-hai,.flag-ht,.flag-hti,.flag-ioc-hai{background-image:url(../flags/png/hti.png);background-image:url(../flags/hti.svg)}.flag-348,.flag-fifa-hun,.flag-hu,.flag-hun,.flag-ioc-hun{background-image:url(../flags/png/hun.png);background-image:url(../flags/hun.svg)}.flag-360,.flag-fifa-idn,.flag-id,.flag-idn,.flag-ioc-ina{background-image:url(../flags/png/idn.png);background-image:url(../flags/idn.svg)}.flag-833,.flag-fifa-gbm,.flag-im,.flag-imn{background-image:url(../flags/png/imn.png);background-image:url(../flags/imn.svg)}.flag-356,.flag-fifa-ind,.flag-in,.flag-ind,.flag-ioc-ind{background-image:url(../flags/png/ind.png);background-image:url(../flags/ind.svg)}.flag-86,.flag-io,.flag-iot{background-image:url(../flags/png/iot.png);background-image:url(../flags/iot.svg)}.flag-372,.flag-fifa-irl,.flag-ie,.flag-ioc-irl,.flag-irl{background-image:url(../flags/png/irl.png);background-image:url(../flags/irl.svg)}.flag-364,.flag-fifa-irn,.flag-ioc-iri,.flag-ir,.flag-irn{background-image:url(../flags/png/irn.png);background-image:url(../flags/irn.svg)}.flag-368,.flag-fifa-irq,.flag-ioc-irq,.flag-iq,.flag-irq{background-image:url(../flags/png/irq.png);background-image:url(../flags/irq.svg)}.flag-352,.flag-fifa-isl,.flag-ioc-isl,.flag-is,.flag-isl{background-image:url(../flags/png/isl.png);background-image:url(../flags/isl.svg)}.flag-376,.flag-fifa-isr,.flag-il,.flag-ioc-isr,.flag-isr{background-image:url(../flags/png/isr.png);background-image:url(../flags/isr.svg)}.flag-380,.flag-fifa-ita,.flag-ioc-ita,.flag-it,.flag-ita{background-image:url(../flags/png/ita.png);background-image:url(../flags/ita.svg)}.flag-388,.flag-fifa-jam,.flag-ioc-jam,.flag-jam,.flag-jm{background-image:url(../flags/png/jam.png);background-image:url(../flags/jam.svg)}.flag-832,.flag-fifa-gbj,.flag-je,.flag-jey{background-image:url(../flags/png/jey.png);background-image:url(../flags/jey.svg)}.flag-400,.flag-fifa-jor,.flag-ioc-jor,.flag-jo,.flag-jor{background-image:url(../flags/png/jor.png);background-image:url(../flags/jor.svg)}.flag-392,.flag-fifa-jpn,.flag-ioc-jpn,.flag-jp,.flag-jpn{background-image:url(../flags/png/jpn.png);background-image:url(../flags/jpn.svg)}.flag-398,.flag-fifa-kaz,.flag-ioc-kaz,.flag-kaz,.flag-kz{background-image:url(../flags/png/kaz.png);background-image:url(../flags/kaz.svg)}.flag-404,.flag-fifa-ken,.flag-ioc-ken,.flag-ke,.flag-ken{background-image:url(../flags/png/ken.png);background-image:url(../flags/ken.svg)}.flag-417,.flag-fifa-kgz,.flag-ioc-kgz,.flag-kg,.flag-kgz{background-image:url(../flags/png/kgz.png);background-image:url(../flags/kgz.svg)}.flag-116,.flag-fifa-cam,.flag-ioc-cam,.flag-kh,.flag-khm{background-image:url(../flags/png/khm.png);background-image:url(../flags/khm.svg)}.flag-296,.flag-fifa-kir,.flag-ioc-kir,.flag-ki,.flag-kir{background-image:url(../flags/png/kir.png);background-image:url(../flags/kir.svg)}.flag-659,.flag-fifa-skn,.flag-ioc-skn,.flag-kn,.flag-kna{background-image:url(../flags/png/kna.png);background-image:url(../flags/kna.svg)}.flag-410,.flag-fifa-kor,.flag-ioc-kor,.flag-kor,.flag-kr{background-image:url(../flags/png/kor.png);background-image:url(../flags/kor.svg)}.flag-414,.flag-fifa-kuw,.flag-ioc-kuw,.flag-kw,.flag-kwt{background-image:url(../flags/png/kwt.png);background-image:url(../flags/kwt.svg)}.flag-418,.flag-fifa-lao,.flag-ioc-lao,.flag-la,.flag-lao{background-image:url(../flags/png/lao.png);background-image:url(../flags/lao.svg)}.flag-422,.flag-fifa-lib,.flag-ioc-lib,.flag-lb,.flag-lbn{background-image:url(../flags/png/lbn.png);background-image:url(../flags/lbn.svg)}.flag-430,.flag-fifa-lbr,.flag-ioc-lbr,.flag-lbr,.flag-lr{background-image:url(../flags/png/lbr.png);background-image:url(../flags/lbr.svg)}.flag-434,.flag-fifa-lby,.flag-ioc-lba,.flag-lby,.flag-ly{background-image:url(../flags/png/lby.png);background-image:url(../flags/lby.svg)}.flag-662,.flag-fifa-lca,.flag-ioc-lca,.flag-lc,.flag-lca{background-image:url(../flags/png/lca.png);background-image:url(../flags/lca.svg)}.flag-438,.flag-fifa-lie,.flag-ioc-lie,.flag-li,.flag-lie{background-image:url(../flags/png/lie.png);background-image:url(../flags/lie.svg)}.flag-144,.flag-fifa-sri,.flag-ioc-sri,.flag-lk,.flag-lka{background-image:url(../flags/png/lka.png);background-image:url(../flags/lka.svg)}.flag-426,.flag-fifa-les,.flag-ioc-les,.flag-ls,.flag-lso{background-image:url(../flags/png/lso.png);background-image:url(../flags/lso.svg)}.flag-440,.flag-fifa-ltu,.flag-ioc-ltu,.flag-lt,.flag-ltu{background-image:url(../flags/png/ltu.png);background-image:url(../flags/ltu.svg)}.flag-442,.flag-fifa-lux,.flag-ioc-lux,.flag-lu,.flag-lux{background-image:url(../flags/png/lux.png);background-image:url(../flags/lux.svg)}.flag-428,.flag-fifa-lva,.flag-ioc-lat,.flag-lv,.flag-lva{background-image:url(../flags/png/lva.png);background-image:url(../flags/lva.svg)}.flag-446,.flag-fifa-mac,.flag-ioc-mac,.flag-mac,.flag-mo{background-image:url(../flags/png/mac.png);background-image:url(../flags/mac.svg)}.flag-663,.flag-maf,.flag-mf{background-image:url(../flags/png/maf.png);background-image:url(../flags/maf.svg)}.flag-504,.flag-fifa-mar,.flag-ioc-mar,.flag-ma,.flag-mar{background-image:url(../flags/png/mar.png);background-image:url(../flags/mar.svg)}.flag-492,.flag-fifa-mon,.flag-ioc-mon,.flag-mc,.flag-mco{background-image:url(../flags/png/mco.png);background-image:url(../flags/mco.svg)}.flag-498,.flag-fifa-mda,.flag-ioc-mda,.flag-md,.flag-mda{background-image:url(../flags/png/mda.png);background-image:url(../flags/mda.svg)}.flag-450,.flag-fifa-mad,.flag-ioc-mad,.flag-mdg,.flag-mg{background-image:url(../flags/png/mdg.png);background-image:url(../flags/mdg.svg)}.flag-462,.flag-fifa-mdv,.flag-ioc-mdv,.flag-mdv,.flag-mv{background-image:url(../flags/png/mdv.png);background-image:url(../flags/mdv.svg)}.flag-484,.flag-fifa-mex,.flag-ioc-mex,.flag-mex,.flag-mx{background-image:url(../flags/png/mex.png);background-image:url(../flags/mex.svg)}.flag-584,.flag-fifa-mhl,.flag-ioc-msh,.flag-mh,.flag-mhl{background-image:url(../flags/png/mhl.png);background-image:url(../flags/mhl.svg)}.flag-807,.flag-fifa-mkd,.flag-ioc-mkd,.flag-mk,.flag-mkd{background-image:url(../flags/png/mkd.png);background-image:url(../flags/mkd.svg)}.flag-466,.flag-fifa-mli,.flag-ioc-mli,.flag-ml,.flag-mli{background-image:url(../flags/png/mli.png);background-image:url(../flags/mli.svg)}.flag-470,.flag-fifa-mlt,.flag-ioc-mlt,.flag-mlt,.flag-mt{background-image:url(../flags/png/mlt.png);background-image:url(../flags/mlt.svg)}.flag-104,.flag-fifa-mya,.flag-ioc-mya,.flag-mm,.flag-mmr{background-image:url(../flags/png/mmr.png);background-image:url(../flags/mmr.svg)}.flag-499,.flag-fifa-mne,.flag-ioc-mgo,.flag-me,.flag-mne{background-image:url(../flags/png/mne.png);background-image:url(../flags/mne.svg)}.flag-496,.flag-fifa-mng,.flag-ioc-mgl,.flag-mn,.flag-mng{background-image:url(../flags/png/mng.png);background-image:url(../flags/mng.svg)}.flag-580,.flag-fifa-nmi,.flag-ioc-nma,.flag-mnp,.flag-mp{background-image:url(../flags/png/mnp.png);background-image:url(../flags/mnp.svg)}.flag-508,.flag-fifa-moz,.flag-ioc-moz,.flag-moz,.flag-mz{background-image:url(../flags/png/moz.png);background-image:url(../flags/moz.svg)}.flag-478,.flag-fifa-mtn,.flag-ioc-mtn,.flag-mr,.flag-mrt{background-image:url(../flags/png/mrt.png);background-image:url(../flags/mrt.svg)}.flag-500,.flag-fifa-msr,.flag-ioc-mnt,.flag-ms,.flag-msr{background-image:url(../flags/png/msr.png);background-image:url(../flags/msr.svg)}.flag-474,.flag-fifa-mtq,.flag-ioc-mrt,.flag-mq,.flag-mtq{background-image:url(../flags/png/mtq.png);background-image:url(../flags/mtq.svg)}.flag-480,.flag-fifa-mri,.flag-ioc-mri,.flag-mu,.flag-mus{background-image:url(../flags/png/mus.png);background-image:url(../flags/mus.svg)}.flag-454,.flag-fifa-mwi,.flag-ioc-maw,.flag-mw,.flag-mwi{background-image:url(../flags/png/mwi.png);background-image:url(../flags/mwi.svg)}.flag-458,.flag-fifa-mas,.flag-ioc-mas,.flag-my,.flag-mys{background-image:url(../flags/png/mys.png);background-image:url(../flags/mys.svg)}.flag-175,.flag-fifa-myt,.flag-ioc-may,.flag-myt,.flag-yt{background-image:url(../flags/png/myt.png);background-image:url(../flags/myt.svg)}.flag-516,.flag-fifa-nam,.flag-ioc-nam,.flag-na,.flag-nam{background-image:url(../flags/png/nam.png);background-image:url(../flags/nam.svg)}.flag-540,.flag-fifa-ncl,.flag-ioc-ncd,.flag-nc,.flag-ncl{background-image:url(../flags/png/ncl.png);background-image:url(../flags/ncl.svg)}.flag-562,.flag-fifa-nig,.flag-ioc-nig,.flag-ne,.flag-ner{background-image:url(../flags/png/ner.png);background-image:url(../flags/ner.svg)}.flag-574,.flag-fifa-nfk,.flag-ioc-nfi,.flag-nf,.flag-nfk{background-image:url(../flags/png/nfk.png);background-image:url(../flags/nfk.svg)}.flag-566,.flag-fifa-nga,.flag-ioc-ngr,.flag-ng,.flag-nga{background-image:url(../flags/png/nga.png);background-image:url(../flags/nga.svg)}.flag-558,.flag-fifa-nca,.flag-ioc-nca,.flag-ni,.flag-nic{background-image:url(../flags/png/nic.png);background-image:url(../flags/nic.svg)}.flag-570,.flag-fifa-niu,.flag-ioc-niu,.flag-niu,.flag-nu{background-image:url(../flags/png/niu.png);background-image:url(../flags/niu.svg)}.flag-528,.flag-fifa-ned,.flag-ioc-ned,.flag-nl,.flag-nld{background-image:url(../flags/png/nld.png);background-image:url(../flags/nld.svg)}.flag-578,.flag-fifa-nor,.flag-ioc-nor,.flag-no,.flag-nor{background-image:url(../flags/png/nor.png);background-image:url(../flags/nor.svg)}.flag-524,.flag-fifa-nep,.flag-ioc-nep,.flag-np,.flag-npl{background-image:url(../flags/png/npl.png);background-image:url(../flags/npl.svg)}.flag-520,.flag-fifa-nru,.flag-ioc-nru,.flag-nr,.flag-nru{background-image:url(../flags/png/nru.png);background-image:url(../flags/nru.svg)}.flag-554,.flag-fifa-nzl,.flag-ioc-nzl,.flag-nz,.flag-nzl{background-image:url(../flags/png/nzl.png);background-image:url(../flags/nzl.svg)}.flag-512,.flag-fifa-oma,.flag-ioc-oma,.flag-om,.flag-omn{background-image:url(../flags/png/omn.png);background-image:url(../flags/omn.svg)}.flag-586,.flag-fifa-pak,.flag-ioc-pak,.flag-pak,.flag-pk{background-image:url(../flags/png/pak.png);background-image:url(../flags/pak.svg)}.flag-591,.flag-fifa-pan,.flag-ioc-pan,.flag-pa,.flag-pan{background-image:url(../flags/png/pan.png);background-image:url(../flags/pan.svg)}.flag-612,.flag-fifa-pcn,.flag-pcn,.flag-pn{background-image:url(../flags/png/pcn.png);background-image:url(../flags/pcn.svg)}.flag-604,.flag-fifa-per,.flag-ioc-per,.flag-pe,.flag-per{background-image:url(../flags/png/per.png);background-image:url(../flags/per.svg)}.flag-608,.flag-fifa-phi,.flag-ioc-phi,.flag-ph,.flag-phl{background-image:url(../flags/png/phl.png);background-image:url(../flags/phl.svg)}.flag-585,.flag-fifa-plw,.flag-ioc-plw,.flag-plw,.flag-pw{background-image:url(../flags/png/plw.png);background-image:url(../flags/plw.svg)}.flag-598,.flag-fifa-png,.flag-ioc-png,.flag-pg,.flag-png{background-image:url(../flags/png/png.png);background-image:url(../flags/png.svg)}.flag-616,.flag-fifa-pol,.flag-ioc-pol,.flag-pl,.flag-pol{background-image:url(../flags/png/pol.png);background-image:url(../flags/pol.svg)}.flag-630,.flag-fifa-pur,.flag-ioc-pur,.flag-pr,.flag-pri{background-image:url(../flags/png/pri.png);background-image:url(../flags/pri.svg)}.flag-408,.flag-fifa-prk,.flag-ioc-prk,.flag-kp,.flag-prk{background-image:url(../flags/png/prk.png);background-image:url(../flags/prk.svg)}.flag-620,.flag-fifa-por,.flag-ioc-por,.flag-prt,.flag-pt{background-image:url(../flags/png/prt.png);background-image:url(../flags/prt.svg)}.flag-600,.flag-fifa-par,.flag-ioc-par,.flag-pry,.flag-py{background-image:url(../flags/png/pry.png);background-image:url(../flags/pry.svg)}.flag-275,.flag-fifa-ple,.flag-ioc-ple,.flag-ps,.flag-pse{background-image:url(../flags/png/pse.png);background-image:url(../flags/pse.svg)}.flag-258,.flag-fifa-tah2,.flag-ioc-fpo,.flag-pf,.flag-pyf{background-image:url(../flags/png/pyf.png);background-image:url(../flags/pyf.svg)}.flag-634,.flag-fifa-qat,.flag-ioc-qat,.flag-qa,.flag-qat{background-image:url(../flags/png/qat.png);background-image:url(../flags/qat.svg)}.flag-638,.flag-fifa-reu,.flag-ioc-reu,.flag-re,.flag-reu{background-image:url(../flags/png/reu.png);background-image:url(../flags/reu.svg)}.flag-642,.flag-fifa-rou,.flag-ioc-rou,.flag-ro,.flag-rou{background-image:url(../flags/png/rou.png);background-image:url(../flags/rou.svg)}.flag-643,.flag-fifa-rus,.flag-ioc-rus,.flag-ru,.flag-rus{background-image:url(../flags/png/rus.png);background-image:url(../flags/rus.svg)}.flag-646,.flag-fifa-rwa,.flag-ioc-rwa,.flag-rw,.flag-rwa{background-image:url(../flags/png/rwa.png);background-image:url(../flags/rwa.svg)}.flag-682,.flag-fifa-ksa,.flag-ioc-ksa,.flag-sa,.flag-sau{background-image:url(../flags/png/sau.png);background-image:url(../flags/sau.svg)}.flag-729,.flag-fifa-sud,.flag-ioc-sud,.flag-sd,.flag-sdn{background-image:url(../flags/png/sdn.png);background-image:url(../flags/sdn.svg)}.flag-686,.flag-fifa-sen,.flag-ioc-sen,.flag-sen,.flag-sn{background-image:url(../flags/png/sen.png);background-image:url(../flags/sen.svg)}.flag-702,.flag-fifa-sin,.flag-ioc-sin,.flag-sg,.flag-sgp{background-image:url(../flags/png/sgp.png);background-image:url(../flags/sgp.svg)}.flag-239,.flag-gs,.flag-sgs{background-image:url(../flags/png/sgs.png);background-image:url(../flags/sgs.svg)}.flag-654,.flag-fifa-shn,.flag-ioc-hel,.flag-sh,.flag-shn{background-image:url(../flags/png/shn.png);background-image:url(../flags/shn.svg)}.flag-744,.flag-sj,.flag-sjm{background-image:url(../flags/png/sjm.png);background-image:url(../flags/sjm.svg)}.flag-90,.flag-fifa-sol,.flag-ioc-sol,.flag-sb,.flag-slb{background-image:url(../flags/png/slb.png);background-image:url(../flags/slb.svg)}.flag-694,.flag-fifa-sle,.flag-ioc-sle,.flag-sl,.flag-sle{background-image:url(../flags/png/sle.png);background-image:url(../flags/sle.svg)}.flag-222,.flag-fifa-slv,.flag-ioc-esa,.flag-slv,.flag-sv{background-image:url(../flags/png/slv.png);background-image:url(../flags/slv.svg)}.flag-674,.flag-fifa-smr,.flag-ioc-smr,.flag-sm,.flag-smr{background-image:url(../flags/png/smr.png);background-image:url(../flags/smr.svg)}.flag-706,.flag-fifa-som,.flag-ioc-som,.flag-so,.flag-som{background-image:url(../flags/png/som.png);background-image:url(../flags/som.svg)}.flag-666,.flag-fifa-spm,.flag-ioc-spm,.flag-pm,.flag-spm{background-image:url(../flags/png/spm.png);background-image:url(../flags/spm.svg)}.flag-688,.flag-fifa-srb,.flag-ioc-srb,.flag-rs,.flag-srb{background-image:url(../flags/png/srb.png);background-image:url(../flags/srb.svg)}.flag-728,.flag-ss,.flag-ssd{background-image:url(../flags/png/ssd.png);background-image:url(../flags/ssd.svg)}.flag-678,.flag-fifa-stp,.flag-ioc-stp,.flag-st,.flag-stp{background-image:url(../flags/png/stp.png);background-image:url(../flags/stp.svg)}.flag-740,.flag-fifa-sur,.flag-ioc-sur,.flag-sr,.flag-sur{background-image:url(../flags/png/sur.png);background-image:url(../flags/sur.svg)}.flag-703,.flag-fifa-svk,.flag-ioc-svk,.flag-sk,.flag-svk{background-image:url(../flags/png/svk.png);background-image:url(../flags/svk.svg)}.flag-705,.flag-fifa-svn,.flag-ioc-slo,.flag-si,.flag-svn{background-image:url(../flags/png/svn.png);background-image:url(../flags/svn.svg)}.flag-752,.flag-fifa-swe,.flag-ioc-swe,.flag-se,.flag-swe{background-image:url(../flags/png/swe.png);background-image:url(../flags/swe.svg)}.flag-748,.flag-fifa-swz,.flag-ioc-swz,.flag-swz,.flag-sz{background-image:url(../flags/png/swz.png);background-image:url(../flags/swz.svg)}.flag-534,.flag-sx,.flag-sxm{background-image:url(../flags/png/sxm.png);background-image:url(../flags/sxm.svg)}.flag-690,.flag-fifa-sey,.flag-ioc-sey,.flag-sc,.flag-syc{background-image:url(../flags/png/syc.png);background-image:url(../flags/syc.svg)}.flag-760,.flag-fifa-syr,.flag-ioc-syr,.flag-sy,.flag-syr{background-image:url(../flags/png/syr.png);background-image:url(../flags/syr.svg)}.flag-796,.flag-fifa-tca,.flag-ioc-tks,.flag-tc,.flag-tca{background-image:url(../flags/png/tca.png);background-image:url(../flags/tca.svg)}.flag-148,.flag-fifa-cha,.flag-ioc-cha,.flag-tcd,.flag-td{background-image:url(../flags/png/tcd.png);background-image:url(../flags/tcd.svg)}.flag-768,.flag-fifa-tog,.flag-ioc-tog,.flag-tg,.flag-tgo{background-image:url(../flags/png/tgo.png);background-image:url(../flags/tgo.svg)}.flag-764,.flag-fifa-tha,.flag-ioc-tha,.flag-th,.flag-tha{background-image:url(../flags/png/tha.png);background-image:url(../flags/tha.svg)}.flag-762,.flag-fifa-tjk,.flag-ioc-tjk,.flag-tj,.flag-tjk{background-image:url(../flags/png/tjk.png);background-image:url(../flags/tjk.svg)}.flag-772,.flag-fifa-tkl,.flag-tk,.flag-tkl{background-image:url(../flags/png/tkl.png);background-image:url(../flags/tkl.svg)}.flag-795,.flag-fifa-tkm,.flag-ioc-tkm,.flag-tkm,.flag-tm{background-image:url(../flags/png/tkm.png);background-image:url(../flags/tkm.svg)}.flag-626,.flag-fifa-tls,.flag-ioc-tls,.flag-tl,.flag-tls{background-image:url(../flags/png/tls.png);background-image:url(../flags/tls.svg)}.flag-776,.flag-fifa-tga,.flag-ioc-tga,.flag-to,.flag-ton{background-image:url(../flags/png/ton.png);background-image:url(../flags/ton.svg)}.flag-780,.flag-fifa-tri,.flag-ioc-tto,.flag-tt,.flag-tto{background-image:url(../flags/png/tto.png);background-image:url(../flags/tto.svg)}.flag-788,.flag-fifa-tun,.flag-ioc-tun,.flag-tn,.flag-tun{background-image:url(../flags/png/tun.png);background-image:url(../flags/tun.svg)}.flag-792,.flag-fifa-tur,.flag-ioc-tur,.flag-tr,.flag-tur{background-image:url(../flags/png/tur.png);background-image:url(../flags/tur.svg)}.flag-798,.flag-fifa-tuv,.flag-ioc-tuv,.flag-tuv,.flag-tv{background-image:url(../flags/png/tuv.png);background-image:url(../flags/tuv.svg)}.flag-158,.flag-tw,.flag-twn{background-image:url(../flags/png/twn.png);background-image:url(../flags/twn.svg)}.flag-834,.flag-fifa-tan,.flag-ioc-tan,.flag-tz,.flag-tza{background-image:url(../flags/png/tza.png);background-image:url(../flags/tza.svg)}.flag-800,.flag-fifa-uga,.flag-ioc-uga,.flag-ug,.flag-uga{background-image:url(../flags/png/uga.png);background-image:url(../flags/uga.svg)}.flag-804,.flag-fifa-ukr,.flag-ioc-ukr,.flag-ua,.flag-ukr{background-image:url(../flags/png/ukr.png);background-image:url(../flags/ukr.svg)}.flag-581,.flag-um,.flag-umi{background-image:url(../flags/png/umi.png);background-image:url(../flags/umi.svg)}.flag-858,.flag-fifa-uru,.flag-ioc-uru,.flag-ury,.flag-uy{background-image:url(../flags/png/ury.png);background-image:url(../flags/ury.svg)}.flag-840,.flag-fifa-usa,.flag-ioc-usa,.flag-us,.flag-usa{background-image:url(../flags/png/usa.png);background-image:url(../flags/usa.svg)}.flag-860,.flag-fifa-uzb,.flag-ioc-uzb,.flag-uz,.flag-uzb{background-image:url(../flags/png/uzb.png);background-image:url(../flags/uzb.svg)}.flag-336,.flag-fifa-vat,.flag-va,.flag-vat{background-image:url(../flags/png/vat.png);background-image:url(../flags/vat.svg)}.flag-670,.flag-fifa-vin,.flag-ioc-vin,.flag-vc,.flag-vct{background-image:url(../flags/png/vct.png);background-image:url(../flags/vct.svg)}.flag-862,.flag-fifa-ven,.flag-ioc-ven,.flag-ve,.flag-ven{background-image:url(../flags/png/ven.png);background-image:url(../flags/ven.svg)}.flag-92,.flag-fifa-vgb,.flag-ioc-ivb,.flag-vg,.flag-vgb{background-image:url(../flags/png/vgb.png);background-image:url(../flags/vgb.svg)}.flag-850,.flag-fifa-vir,.flag-ioc-isv,.flag-vi,.flag-vir{background-image:url(../flags/png/vir.png);background-image:url(../flags/vir.svg)}.flag-704,.flag-fifa-vie,.flag-ioc-vie,.flag-vn,.flag-vnm{background-image:url(../flags/png/vnm.png);background-image:url(../flags/vnm.svg)}.flag-548,.flag-fifa-van,.flag-ioc-van,.flag-vu,.flag-vut{background-image:url(../flags/png/vut.png);background-image:url(../flags/vut.svg)}.flag-876,.flag-fifa-wlf,.flag-ioc-waf,.flag-wf,.flag-wlf{background-image:url(../flags/png/wlf.png);background-image:url(../flags/wlf.svg)}.flag-882,.flag-fifa-sam,.flag-ioc-sam,.flag-ws,.flag-wsm{background-image:url(../flags/png/wsm.png);background-image:url(../flags/wsm.svg)}.flag-887,.flag-fifa-yem,.flag-ioc-yem,.flag-ye,.flag-yem{background-image:url(../flags/png/yem.png);background-image:url(../flags/yem.svg)}.flag-710,.flag-fifa-rsa,.flag-ioc-rsa,.flag-za,.flag-zaf{background-image:url(../flags/png/zaf.png);background-image:url(../flags/zaf.svg)}.flag-894,.flag-fifa-zam,.flag-ioc-zam,.flag-zm,.flag-zmb{background-image:url(../flags/png/zmb.png);background-image:url(../flags/zmb.svg)}.flag-716,.flag-fifa-zim,.flag-ioc-zim,.flag-zw,.flag-zwe{background-image:url(../flags/png/zwe.png);background-image:url(../flags/zwe.svg)}.flag-fifa-eng{background-image:url(../flags/png/eng.png);background-image:url(../flags/eng.svg)}.flag-eu,.flag-eur{background-image:url(../flags/png/eur.png);background-image:url(../flags/eur.svg)}.flag-ioc-kos{background-image:url(../flags/png/kos.png);background-image:url(../flags/kos.svg)}.flag-fifa-nir{background-image:url(../flags/png/nir.png);background-image:url(../flags/nir.svg)}.flag-fifa-tpe,.flag-ico-tpe{background-image:url(../flags/png/tpe.png);background-image:url(../flags/tpe.svg)}.flag-fifa-sco{background-image:url(../flags/png/sco.png);background-image:url(../flags/sco.svg)}.flag-fifa-wal{background-image:url(../flags/png/wal.png);background-image:url(../flags/wal.svg)}@font-face{font-family:"Material Design Icons";src:url(../fonts/materialdesignicons-webfont.eot?v=1.9.32);src:url(../fonts/materialdesignicons-webfont.eot?#iefix&v=1.9.32) format("embedded-opentype"),url(../fonts/materialdesignicons-webfont.woff2?v=1.9.32) format("woff2"),url(../fonts/materialdesignicons-webfont.woff?v=1.9.32) format("woff"),url(../fonts/materialdesignicons-webfont.ttf?v=1.9.32) format("truetype"),url(../fonts/materialdesignicons-webfont.svg?v=1.9.32#materialdesigniconsregular) format("svg");font-weight:400;font-style:normal}.mdi-set,.mdi:before{display:inline-block;font:normal normal normal 24px/1 "Material Design Icons";font-size:inherit;text-rendering:auto;line-height:inherit;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.mdi-access-point:before{content:"\F002"}.mdi-access-point-network:before{content:"\F003"}.mdi-account:before{content:"\F004"}.mdi-account-alert:before{content:"\F005"}.mdi-account-box:before{content:"\F006"}.mdi-account-box-outline:before{content:"\F007"}.mdi-account-card-details:before{content:"\F5D2"}.mdi-account-check:before{content:"\F008"}.mdi-account-circle:before{content:"\F009"}.mdi-account-convert:before{content:"\F00A"}.mdi-account-edit:before{content:"\F6BB"}.mdi-account-key:before{content:"\F00B"}.mdi-account-location:before{content:"\F00C"}.mdi-account-minus:before{content:"\F00D"}.mdi-account-multiple:before{content:"\F00E"}.mdi-account-multiple-minus:before{content:"\F5D3"}.mdi-account-multiple-outline:before{content:"\F00F"}.mdi-account-multiple-plus:before{content:"\F010"}.mdi-account-network:before{content:"\F011"}.mdi-account-off:before{content:"\F012"}.mdi-account-outline:before{content:"\F013"}.mdi-account-plus:before{content:"\F014"}.mdi-account-remove:before{content:"\F015"}.mdi-account-search:before{content:"\F016"}.mdi-account-settings:before{content:"\F630"}.mdi-account-settings-variant:before{content:"\F631"}.mdi-account-star:before{content:"\F017"}.mdi-account-switch:before{content:"\F019"}.mdi-adjust:before{content:"\F01A"}.mdi-air-conditioner:before{content:"\F01B"}.mdi-airballoon:before{content:"\F01C"}.mdi-airplane:before{content:"\F01D"}.mdi-airplane-landing:before{content:"\F5D4"}.mdi-airplane-off:before{content:"\F01E"}.mdi-airplane-takeoff:before{content:"\F5D5"}.mdi-airplay:before{content:"\F01F"}.mdi-alarm:before{content:"\F020"}.mdi-alarm-check:before{content:"\F021"}.mdi-alarm-multiple:before{content:"\F022"}.mdi-alarm-off:before{content:"\F023"}.mdi-alarm-plus:before{content:"\F024"}.mdi-alarm-snooze:before{content:"\F68D"}.mdi-album:before{content:"\F025"}.mdi-alert:before{content:"\F026"}.mdi-alert-box:before{content:"\F027"}.mdi-alert-circle:before{content:"\F028"}.mdi-alert-circle-outline:before{content:"\F5D6"}.mdi-alert-decagram:before{content:"\F6BC"}.mdi-alert-octagon:before{content:"\F029"}.mdi-alert-octagram:before{content:"\F766"}.mdi-alert-outline:before{content:"\F02A"}.mdi-all-inclusive:before{content:"\F6BD"}.mdi-alpha:before{content:"\F02B"}.mdi-alphabetical:before{content:"\F02C"}.mdi-altimeter:before{content:"\F5D7"}.mdi-amazon:before{content:"\F02D"}.mdi-amazon-clouddrive:before{content:"\F02E"}.mdi-ambulance:before{content:"\F02F"}.mdi-amplifier:before{content:"\F030"}.mdi-anchor:before{content:"\F031"}.mdi-android:before{content:"\F032"}.mdi-android-debug-bridge:before{content:"\F033"}.mdi-android-studio:before{content:"\F034"}.mdi-angular:before{content:"\F6B1"}.mdi-angularjs:before{content:"\F6BE"}.mdi-animation:before{content:"\F5D8"}.mdi-apple:before{content:"\F035"}.mdi-apple-finder:before{content:"\F036"}.mdi-apple-ios:before{content:"\F037"}.mdi-apple-keyboard-caps:before{content:"\F632"}.mdi-apple-keyboard-command:before{content:"\F633"}.mdi-apple-keyboard-control:before{content:"\F634"}.mdi-apple-keyboard-option:before{content:"\F635"}.mdi-apple-keyboard-shift:before{content:"\F636"}.mdi-apple-mobileme:before{content:"\F038"}.mdi-apple-safari:before{content:"\F039"}.mdi-application:before{content:"\F614"}.mdi-apps:before{content:"\F03B"}.mdi-archive:before{content:"\F03C"}.mdi-arrange-bring-forward:before{content:"\F03D"}.mdi-arrange-bring-to-front:before{content:"\F03E"}.mdi-arrange-send-backward:before{content:"\F03F"}.mdi-arrange-send-to-back:before{content:"\F040"}.mdi-arrow-all:before{content:"\F041"}.mdi-arrow-bottom-left:before{content:"\F042"}.mdi-arrow-bottom-right:before{content:"\F043"}.mdi-arrow-compress:before{content:"\F615"}.mdi-arrow-compress-all:before{content:"\F044"}.mdi-arrow-down:before{content:"\F045"}.mdi-arrow-down-bold:before{content:"\F72D"}.mdi-arrow-down-bold-box:before{content:"\F72E"}.mdi-arrow-down-bold-box-outline:before{content:"\F72F"}.mdi-arrow-down-bold-circle:before{content:"\F047"}.mdi-arrow-down-bold-circle-outline:before{content:"\F048"}.mdi-arrow-down-bold-hexagon-outline:before{content:"\F049"}.mdi-arrow-down-box:before{content:"\F6BF"}.mdi-arrow-down-drop-circle:before{content:"\F04A"}.mdi-arrow-down-drop-circle-outline:before{content:"\F04B"}.mdi-arrow-down-thick:before{content:"\F046"}.mdi-arrow-expand:before{content:"\F616"}.mdi-arrow-expand-all:before{content:"\F04C"}.mdi-arrow-left:before{content:"\F04D"}.mdi-arrow-left-bold:before{content:"\F730"}.mdi-arrow-left-bold-box:before{content:"\F731"}.mdi-arrow-left-bold-box-outline:before{content:"\F732"}.mdi-arrow-left-bold-circle:before{content:"\F04F"}.mdi-arrow-left-bold-circle-outline:before{content:"\F050"}.mdi-arrow-left-bold-hexagon-outline:before{content:"\F051"}.mdi-arrow-left-box:before{content:"\F6C0"}.mdi-arrow-left-drop-circle:before{content:"\F052"}.mdi-arrow-left-drop-circle-outline:before{content:"\F053"}.mdi-arrow-left-thick:before{content:"\F04E"}.mdi-arrow-right:before{content:"\F054"}.mdi-arrow-right-bold:before{content:"\F733"}.mdi-arrow-right-bold-box:before{content:"\F734"}.mdi-arrow-right-bold-box-outline:before{content:"\F735"}.mdi-arrow-right-bold-circle:before{content:"\F056"}.mdi-arrow-right-bold-circle-outline:before{content:"\F057"}.mdi-arrow-right-bold-hexagon-outline:before{content:"\F058"}.mdi-arrow-right-box:before{content:"\F6C1"}.mdi-arrow-right-drop-circle:before{content:"\F059"}.mdi-arrow-right-drop-circle-outline:before{content:"\F05A"}.mdi-arrow-right-thick:before{content:"\F055"}.mdi-arrow-top-left:before{content:"\F05B"}.mdi-arrow-top-right:before{content:"\F05C"}.mdi-arrow-up:before{content:"\F05D"}.mdi-arrow-up-bold:before{content:"\F736"}.mdi-arrow-up-bold-box:before{content:"\F737"}.mdi-arrow-up-bold-box-outline:before{content:"\F738"}.mdi-arrow-up-bold-circle:before{content:"\F05F"}.mdi-arrow-up-bold-circle-outline:before{content:"\F060"}.mdi-arrow-up-bold-hexagon-outline:before{content:"\F061"}.mdi-arrow-up-box:before{content:"\F6C2"}.mdi-arrow-up-drop-circle:before{content:"\F062"}.mdi-arrow-up-drop-circle-outline:before{content:"\F063"}.mdi-arrow-up-thick:before{content:"\F05E"}.mdi-assistant:before{content:"\F064"}.mdi-asterisk:before{content:"\F6C3"}.mdi-at:before{content:"\F065"}.mdi-atom:before{content:"\F767"}.mdi-attachment:before{content:"\F066"}.mdi-audiobook:before{content:"\F067"}.mdi-auto-fix:before{content:"\F068"}.mdi-auto-upload:before{content:"\F069"}.mdi-autorenew:before{content:"\F06A"}.mdi-av-timer:before{content:"\F06B"}.mdi-baby:before{content:"\F06C"}.mdi-baby-buggy:before{content:"\F68E"}.mdi-backburger:before{content:"\F06D"}.mdi-backspace:before{content:"\F06E"}.mdi-backup-restore:before{content:"\F06F"}.mdi-bandcamp:before{content:"\F674"}.mdi-bank:before{content:"\F070"}.mdi-barcode:before{content:"\F071"}.mdi-barcode-scan:before{content:"\F072"}.mdi-barley:before{content:"\F073"}.mdi-barrel:before{content:"\F074"}.mdi-basecamp:before{content:"\F075"}.mdi-basket:before{content:"\F076"}.mdi-basket-fill:before{content:"\F077"}.mdi-basket-unfill:before{content:"\F078"}.mdi-battery:before{content:"\F079"}.mdi-battery-10:before{content:"\F07A"}.mdi-battery-20:before{content:"\F07B"}.mdi-battery-30:before{content:"\F07C"}.mdi-battery-40:before{content:"\F07D"}.mdi-battery-50:before{content:"\F07E"}.mdi-battery-60:before{content:"\F07F"}.mdi-battery-70:before{content:"\F080"}.mdi-battery-80:before{content:"\F081"}.mdi-battery-90:before{content:"\F082"}.mdi-battery-alert:before{content:"\F083"}.mdi-battery-charging:before{content:"\F084"}.mdi-battery-charging-100:before{content:"\F085"}.mdi-battery-charging-20:before{content:"\F086"}.mdi-battery-charging-30:before{content:"\F087"}.mdi-battery-charging-40:before{content:"\F088"}.mdi-battery-charging-60:before{content:"\F089"}.mdi-battery-charging-80:before{content:"\F08A"}.mdi-battery-charging-90:before{content:"\F08B"}.mdi-battery-minus:before{content:"\F08C"}.mdi-battery-negative:before{content:"\F08D"}.mdi-battery-outline:before{content:"\F08E"}.mdi-battery-plus:before{content:"\F08F"}.mdi-battery-positive:before{content:"\F090"}.mdi-battery-unknown:before{content:"\F091"}.mdi-beach:before{content:"\F092"}.mdi-beaker:before{content:"\F68F"}.mdi-beats:before{content:"\F097"}.mdi-beer:before{content:"\F098"}.mdi-behance:before{content:"\F099"}.mdi-bell:before{content:"\F09A"}.mdi-bell-off:before{content:"\F09B"}.mdi-bell-outline:before{content:"\F09C"}.mdi-bell-plus:before{content:"\F09D"}.mdi-bell-ring:before{content:"\F09E"}.mdi-bell-ring-outline:before{content:"\F09F"}.mdi-bell-sleep:before{content:"\F0A0"}.mdi-beta:before{content:"\F0A1"}.mdi-bible:before{content:"\F0A2"}.mdi-bike:before{content:"\F0A3"}.mdi-bing:before{content:"\F0A4"}.mdi-binoculars:before{content:"\F0A5"}.mdi-bio:before{content:"\F0A6"}.mdi-biohazard:before{content:"\F0A7"}.mdi-bitbucket:before{content:"\F0A8"}.mdi-black-mesa:before{content:"\F0A9"}.mdi-blackberry:before{content:"\F0AA"}.mdi-blender:before{content:"\F0AB"}.mdi-blinds:before{content:"\F0AC"}.mdi-block-helper:before{content:"\F0AD"}.mdi-blogger:before{content:"\F0AE"}.mdi-bluetooth:before{content:"\F0AF"}.mdi-bluetooth-audio:before{content:"\F0B0"}.mdi-bluetooth-connect:before{content:"\F0B1"}.mdi-bluetooth-off:before{content:"\F0B2"}.mdi-bluetooth-settings:before{content:"\F0B3"}.mdi-bluetooth-transfer:before{content:"\F0B4"}.mdi-blur:before{content:"\F0B5"}.mdi-blur-linear:before{content:"\F0B6"}.mdi-blur-off:before{content:"\F0B7"}.mdi-blur-radial:before{content:"\F0B8"}.mdi-bomb:before{content:"\F690"}.mdi-bomb-off:before{content:"\F6C4"}.mdi-bone:before{content:"\F0B9"}.mdi-book:before{content:"\F0BA"}.mdi-book-minus:before{content:"\F5D9"}.mdi-book-multiple:before{content:"\F0BB"}.mdi-book-multiple-variant:before{content:"\F0BC"}.mdi-book-open:before{content:"\F0BD"}.mdi-book-open-page-variant:before{content:"\F5DA"}.mdi-book-open-variant:before{content:"\F0BE"}.mdi-book-plus:before{content:"\F5DB"}.mdi-book-variant:before{content:"\F0BF"}.mdi-bookmark:before{content:"\F0C0"}.mdi-bookmark-check:before{content:"\F0C1"}.mdi-bookmark-music:before{content:"\F0C2"}.mdi-bookmark-outline:before{content:"\F0C3"}.mdi-bookmark-plus:before{content:"\F0C5"}.mdi-bookmark-plus-outline:before{content:"\F0C4"}.mdi-bookmark-remove:before{content:"\F0C6"}.mdi-boombox:before{content:"\F5DC"}.mdi-bootstrap:before{content:"\F6C5"}.mdi-border-all:before{content:"\F0C7"}.mdi-border-bottom:before{content:"\F0C8"}.mdi-border-color:before{content:"\F0C9"}.mdi-border-horizontal:before{content:"\F0CA"}.mdi-border-inside:before{content:"\F0CB"}.mdi-border-left:before{content:"\F0CC"}.mdi-border-none:before{content:"\F0CD"}.mdi-border-outside:before{content:"\F0CE"}.mdi-border-right:before{content:"\F0CF"}.mdi-border-style:before{content:"\F0D0"}.mdi-border-top:before{content:"\F0D1"}.mdi-border-vertical:before{content:"\F0D2"}.mdi-bow-tie:before{content:"\F677"}.mdi-bowl:before{content:"\F617"}.mdi-bowling:before{content:"\F0D3"}.mdi-box:before{content:"\F0D4"}.mdi-box-cutter:before{content:"\F0D5"}.mdi-box-shadow:before{content:"\F637"}.mdi-bridge:before{content:"\F618"}.mdi-briefcase:before{content:"\F0D6"}.mdi-briefcase-check:before{content:"\F0D7"}.mdi-briefcase-download:before{content:"\F0D8"}.mdi-briefcase-upload:before{content:"\F0D9"}.mdi-brightness-1:before{content:"\F0DA"}.mdi-brightness-2:before{content:"\F0DB"}.mdi-brightness-3:before{content:"\F0DC"}.mdi-brightness-4:before{content:"\F0DD"}.mdi-brightness-5:before{content:"\F0DE"}.mdi-brightness-6:before{content:"\F0DF"}.mdi-brightness-7:before{content:"\F0E0"}.mdi-brightness-auto:before{content:"\F0E1"}.mdi-broom:before{content:"\F0E2"}.mdi-brush:before{content:"\F0E3"}.mdi-buffer:before{content:"\F619"}.mdi-bug:before{content:"\F0E4"}.mdi-bulletin-board:before{content:"\F0E5"}.mdi-bullhorn:before{content:"\F0E6"}.mdi-bullseye:before{content:"\F5DD"}.mdi-burst-mode:before{content:"\F5DE"}.mdi-bus:before{content:"\F0E7"}.mdi-cached:before{content:"\F0E8"}.mdi-cake:before{content:"\F0E9"}.mdi-cake-layered:before{content:"\F0EA"}.mdi-cake-variant:before{content:"\F0EB"}.mdi-calculator:before{content:"\F0EC"}.mdi-calendar:before{content:"\F0ED"}.mdi-calendar-blank:before{content:"\F0EE"}.mdi-calendar-check:before{content:"\F0EF"}.mdi-calendar-clock:before{content:"\F0F0"}.mdi-calendar-multiple:before{content:"\F0F1"}.mdi-calendar-multiple-check:before{content:"\F0F2"}.mdi-calendar-plus:before{content:"\F0F3"}.mdi-calendar-question:before{content:"\F691"}.mdi-calendar-range:before{content:"\F678"}.mdi-calendar-remove:before{content:"\F0F4"}.mdi-calendar-text:before{content:"\F0F5"}.mdi-calendar-today:before{content:"\F0F6"}.mdi-call-made:before{content:"\F0F7"}.mdi-call-merge:before{content:"\F0F8"}.mdi-call-missed:before{content:"\F0F9"}.mdi-call-received:before{content:"\F0FA"}.mdi-call-split:before{content:"\F0FB"}.mdi-camcorder:before{content:"\F0FC"}.mdi-camcorder-box:before{content:"\F0FD"}.mdi-camcorder-box-off:before{content:"\F0FE"}.mdi-camcorder-off:before{content:"\F0FF"}.mdi-camera:before{content:"\F100"}.mdi-camera-burst:before{content:"\F692"}.mdi-camera-enhance:before{content:"\F101"}.mdi-camera-front:before{content:"\F102"}.mdi-camera-front-variant:before{content:"\F103"}.mdi-camera-iris:before{content:"\F104"}.mdi-camera-off:before{content:"\F5DF"}.mdi-camera-party-mode:before{content:"\F105"}.mdi-camera-rear:before{content:"\F106"}.mdi-camera-rear-variant:before{content:"\F107"}.mdi-camera-switch:before{content:"\F108"}.mdi-camera-timer:before{content:"\F109"}.mdi-cancel:before{content:"\F739"}.mdi-candle:before{content:"\F5E2"}.mdi-candycane:before{content:"\F10A"}.mdi-car:before{content:"\F10B"}.mdi-car-battery:before{content:"\F10C"}.mdi-car-connected:before{content:"\F10D"}.mdi-car-wash:before{content:"\F10E"}.mdi-cards:before{content:"\F638"}.mdi-cards-outline:before{content:"\F639"}.mdi-cards-playing-outline:before{content:"\F63A"}.mdi-cards-variant:before{content:"\F6C6"}.mdi-carrot:before{content:"\F10F"}.mdi-cart:before{content:"\F110"}.mdi-cart-off:before{content:"\F66B"}.mdi-cart-outline:before{content:"\F111"}.mdi-cart-plus:before{content:"\F112"}.mdi-case-sensitive-alt:before{content:"\F113"}.mdi-cash:before{content:"\F114"}.mdi-cash-100:before{content:"\F115"}.mdi-cash-multiple:before{content:"\F116"}.mdi-cash-usd:before{content:"\F117"}.mdi-cast:before{content:"\F118"}.mdi-cast-connected:before{content:"\F119"}.mdi-cast-off:before{content:"\F789"}.mdi-castle:before{content:"\F11A"}.mdi-cat:before{content:"\F11B"}.mdi-ceiling-light:before{content:"\F768"}.mdi-cellphone:before{content:"\F11C"}.mdi-cellphone-android:before{content:"\F11D"}.mdi-cellphone-basic:before{content:"\F11E"}.mdi-cellphone-dock:before{content:"\F11F"}.mdi-cellphone-iphone:before{content:"\F120"}.mdi-cellphone-link:before{content:"\F121"}.mdi-cellphone-link-off:before{content:"\F122"}.mdi-cellphone-settings:before{content:"\F123"}.mdi-certificate:before{content:"\F124"}.mdi-chair-school:before{content:"\F125"}.mdi-chart-arc:before{content:"\F126"}.mdi-chart-areaspline:before{content:"\F127"}.mdi-chart-bar:before{content:"\F128"}.mdi-chart-bar-stacked:before{content:"\F769"}.mdi-chart-bubble:before{content:"\F5E3"}.mdi-chart-gantt:before{content:"\F66C"}.mdi-chart-histogram:before{content:"\F129"}.mdi-chart-line:before{content:"\F12A"}.mdi-chart-line-stacked:before{content:"\F76A"}.mdi-chart-pie:before{content:"\F12B"}.mdi-chart-scatterplot-hexbin:before{content:"\F66D"}.mdi-chart-timeline:before{content:"\F66E"}.mdi-check:before{content:"\F12C"}.mdi-check-all:before{content:"\F12D"}.mdi-check-circle:before{content:"\F5E0"}.mdi-check-circle-outline:before{content:"\F5E1"}.mdi-checkbox-blank:before{content:"\F12E"}.mdi-checkbox-blank-circle:before{content:"\F12F"}.mdi-checkbox-blank-circle-outline:before{content:"\F130"}.mdi-checkbox-blank-outline:before{content:"\F131"}.mdi-checkbox-marked:before{content:"\F132"}.mdi-checkbox-marked-circle:before{content:"\F133"}.mdi-checkbox-marked-circle-outline:before{content:"\F134"}.mdi-checkbox-marked-outline:before{content:"\F135"}.mdi-checkbox-multiple-blank:before{content:"\F136"}.mdi-checkbox-multiple-blank-circle:before{content:"\F63B"}.mdi-checkbox-multiple-blank-circle-outline:before{content:"\F63C"}.mdi-checkbox-multiple-blank-outline:before{content:"\F137"}.mdi-checkbox-multiple-marked:before{content:"\F138"}.mdi-checkbox-multiple-marked-circle:before{content:"\F63D"}.mdi-checkbox-multiple-marked-circle-outline:before{content:"\F63E"}.mdi-checkbox-multiple-marked-outline:before{content:"\F139"}.mdi-checkerboard:before{content:"\F13A"}.mdi-chemical-weapon:before{content:"\F13B"}.mdi-chevron-double-down:before{content:"\F13C"}.mdi-chevron-double-left:before{content:"\F13D"}.mdi-chevron-double-right:before{content:"\F13E"}.mdi-chevron-double-up:before{content:"\F13F"}.mdi-chevron-down:before{content:"\F140"}.mdi-chevron-left:before{content:"\F141"}.mdi-chevron-right:before{content:"\F142"}.mdi-chevron-up:before{content:"\F143"}.mdi-chip:before{content:"\F61A"}.mdi-church:before{content:"\F144"}.mdi-circle:before{content:"\F764"}.mdi-circle-outline:before{content:"\F765"}.mdi-cisco-webex:before{content:"\F145"}.mdi-city:before{content:"\F146"}.mdi-clipboard:before{content:"\F147"}.mdi-clipboard-account:before{content:"\F148"}.mdi-clipboard-alert:before{content:"\F149"}.mdi-clipboard-arrow-down:before{content:"\F14A"}.mdi-clipboard-arrow-left:before{content:"\F14B"}.mdi-clipboard-check:before{content:"\F14C"}.mdi-clipboard-flow:before{content:"\F6C7"}.mdi-clipboard-outline:before{content:"\F14D"}.mdi-clipboard-plus:before{content:"\F750"}.mdi-clipboard-text:before{content:"\F14E"}.mdi-clippy:before{content:"\F14F"}.mdi-clock:before{content:"\F150"}.mdi-clock-alert:before{content:"\F5CE"}.mdi-clock-end:before{content:"\F151"}.mdi-clock-fast:before{content:"\F152"}.mdi-clock-in:before{content:"\F153"}.mdi-clock-out:before{content:"\F154"}.mdi-clock-start:before{content:"\F155"}.mdi-close:before{content:"\F156"}.mdi-close-box:before{content:"\F157"}.mdi-close-box-outline:before{content:"\F158"}.mdi-close-circle:before{content:"\F159"}.mdi-close-circle-outline:before{content:"\F15A"}.mdi-close-network:before{content:"\F15B"}.mdi-close-octagon:before{content:"\F15C"}.mdi-close-octagon-outline:before{content:"\F15D"}.mdi-close-outline:before{content:"\F6C8"}.mdi-closed-caption:before{content:"\F15E"}.mdi-cloud:before{content:"\F15F"}.mdi-cloud-check:before{content:"\F160"}.mdi-cloud-circle:before{content:"\F161"}.mdi-cloud-download:before{content:"\F162"}.mdi-cloud-off-outline:before{content:"\F164"}.mdi-cloud-outline:before{content:"\F163"}.mdi-cloud-print:before{content:"\F165"}.mdi-cloud-print-outline:before{content:"\F166"}.mdi-cloud-sync:before{content:"\F63F"}.mdi-cloud-upload:before{content:"\F167"}.mdi-code-array:before{content:"\F168"}.mdi-code-braces:before{content:"\F169"}.mdi-code-brackets:before{content:"\F16A"}.mdi-code-equal:before{content:"\F16B"}.mdi-code-greater-than:before{content:"\F16C"}.mdi-code-greater-than-or-equal:before{content:"\F16D"}.mdi-code-less-than:before{content:"\F16E"}.mdi-code-less-than-or-equal:before{content:"\F16F"}.mdi-code-not-equal:before{content:"\F170"}.mdi-code-not-equal-variant:before{content:"\F171"}.mdi-code-parentheses:before{content:"\F172"}.mdi-code-string:before{content:"\F173"}.mdi-code-tags:before{content:"\F174"}.mdi-code-tags-check:before{content:"\F693"}.mdi-codepen:before{content:"\F175"}.mdi-coffee:before{content:"\F176"}.mdi-coffee-outline:before{content:"\F6C9"}.mdi-coffee-to-go:before{content:"\F177"}.mdi-coin:before{content:"\F178"}.mdi-coins:before{content:"\F694"}.mdi-collage:before{content:"\F640"}.mdi-color-helper:before{content:"\F179"}.mdi-comment:before{content:"\F17A"}.mdi-comment-account:before{content:"\F17B"}.mdi-comment-account-outline:before{content:"\F17C"}.mdi-comment-alert:before{content:"\F17D"}.mdi-comment-alert-outline:before{content:"\F17E"}.mdi-comment-check:before{content:"\F17F"}.mdi-comment-check-outline:before{content:"\F180"}.mdi-comment-multiple-outline:before{content:"\F181"}.mdi-comment-outline:before{content:"\F182"}.mdi-comment-plus-outline:before{content:"\F183"}.mdi-comment-processing:before{content:"\F184"}.mdi-comment-processing-outline:before{content:"\F185"}.mdi-comment-question-outline:before{content:"\F186"}.mdi-comment-remove-outline:before{content:"\F187"}.mdi-comment-text:before{content:"\F188"}.mdi-comment-text-outline:before{content:"\F189"}.mdi-compare:before{content:"\F18A"}.mdi-compass:before{content:"\F18B"}.mdi-compass-outline:before{content:"\F18C"}.mdi-console:before{content:"\F18D"}.mdi-contact-mail:before{content:"\F18E"}.mdi-contacts:before{content:"\F6CA"}.mdi-content-copy:before{content:"\F18F"}.mdi-content-cut:before{content:"\F190"}.mdi-content-duplicate:before{content:"\F191"}.mdi-content-paste:before{content:"\F192"}.mdi-content-save:before{content:"\F193"}.mdi-content-save-all:before{content:"\F194"}.mdi-content-save-settings:before{content:"\F61B"}.mdi-contrast:before{content:"\F195"}.mdi-contrast-box:before{content:"\F196"}.mdi-contrast-circle:before{content:"\F197"}.mdi-cookie:before{content:"\F198"}.mdi-copyright:before{content:"\F5E6"}.mdi-counter:before{content:"\F199"}.mdi-cow:before{content:"\F19A"}.mdi-creation:before{content:"\F1C9"}.mdi-credit-card:before{content:"\F19B"}.mdi-credit-card-multiple:before{content:"\F19C"}.mdi-credit-card-off:before{content:"\F5E4"}.mdi-credit-card-plus:before{content:"\F675"}.mdi-credit-card-scan:before{content:"\F19D"}.mdi-crop:before{content:"\F19E"}.mdi-crop-free:before{content:"\F19F"}.mdi-crop-landscape:before{content:"\F1A0"}.mdi-crop-portrait:before{content:"\F1A1"}.mdi-crop-rotate:before{content:"\F695"}.mdi-crop-square:before{content:"\F1A2"}.mdi-crosshairs:before{content:"\F1A3"}.mdi-crosshairs-gps:before{content:"\F1A4"}.mdi-crown:before{content:"\F1A5"}.mdi-cube:before{content:"\F1A6"}.mdi-cube-outline:before{content:"\F1A7"}.mdi-cube-send:before{content:"\F1A8"}.mdi-cube-unfolded:before{content:"\F1A9"}.mdi-cup:before{content:"\F1AA"}.mdi-cup-off:before{content:"\F5E5"}.mdi-cup-water:before{content:"\F1AB"}.mdi-currency-btc:before{content:"\F1AC"}.mdi-currency-eur:before{content:"\F1AD"}.mdi-currency-gbp:before{content:"\F1AE"}.mdi-currency-inr:before{content:"\F1AF"}.mdi-currency-ngn:before{content:"\F1B0"}.mdi-currency-rub:before{content:"\F1B1"}.mdi-currency-try:before{content:"\F1B2"}.mdi-currency-usd:before{content:"\F1B3"}.mdi-currency-usd-off:before{content:"\F679"}.mdi-cursor-default:before{content:"\F1B4"}.mdi-cursor-default-outline:before{content:"\F1B5"}.mdi-cursor-move:before{content:"\F1B6"}.mdi-cursor-pointer:before{content:"\F1B7"}.mdi-cursor-text:before{content:"\F5E7"}.mdi-database:before{content:"\F1B8"}.mdi-database-minus:before{content:"\F1B9"}.mdi-database-plus:before{content:"\F1BA"}.mdi-debug-step-into:before{content:"\F1BB"}.mdi-debug-step-out:before{content:"\F1BC"}.mdi-debug-step-over:before{content:"\F1BD"}.mdi-decagram:before{content:"\F76B"}.mdi-decagram-outline:before{content:"\F76C"}.mdi-decimal-decrease:before{content:"\F1BE"}.mdi-decimal-increase:before{content:"\F1BF"}.mdi-delete:before{content:"\F1C0"}.mdi-delete-circle:before{content:"\F682"}.mdi-delete-empty:before{content:"\F6CB"}.mdi-delete-forever:before{content:"\F5E8"}.mdi-delete-sweep:before{content:"\F5E9"}.mdi-delete-variant:before{content:"\F1C1"}.mdi-delta:before{content:"\F1C2"}.mdi-deskphone:before{content:"\F1C3"}.mdi-desktop-mac:before{content:"\F1C4"}.mdi-desktop-tower:before{content:"\F1C5"}.mdi-details:before{content:"\F1C6"}.mdi-developer-board:before{content:"\F696"}.mdi-deviantart:before{content:"\F1C7"}.mdi-dialpad:before{content:"\F61C"}.mdi-diamond:before{content:"\F1C8"}.mdi-dice-1:before{content:"\F1CA"}.mdi-dice-2:before{content:"\F1CB"}.mdi-dice-3:before{content:"\F1CC"}.mdi-dice-4:before{content:"\F1CD"}.mdi-dice-5:before{content:"\F1CE"}.mdi-dice-6:before{content:"\F1CF"}.mdi-dice-d10:before{content:"\F76E"}.mdi-dice-d20:before{content:"\F5EA"}.mdi-dice-d4:before{content:"\F5EB"}.mdi-dice-d6:before{content:"\F5EC"}.mdi-dice-d8:before{content:"\F5ED"}.mdi-dice-multiple:before{content:"\F76D"}.mdi-dictionary:before{content:"\F61D"}.mdi-directions:before{content:"\F1D0"}.mdi-directions-fork:before{content:"\F641"}.mdi-discord:before{content:"\F66F"}.mdi-disk:before{content:"\F5EE"}.mdi-disk-alert:before{content:"\F1D1"}.mdi-disqus:before{content:"\F1D2"}.mdi-disqus-outline:before{content:"\F1D3"}.mdi-division:before{content:"\F1D4"}.mdi-division-box:before{content:"\F1D5"}.mdi-dna:before{content:"\F683"}.mdi-dns:before{content:"\F1D6"}.mdi-do-not-disturb:before{content:"\F697"}.mdi-do-not-disturb-off:before{content:"\F698"}.mdi-dolby:before{content:"\F6B2"}.mdi-domain:before{content:"\F1D7"}.mdi-dots-horizontal:before{content:"\F1D8"}.mdi-dots-vertical:before{content:"\F1D9"}.mdi-douban:before{content:"\F699"}.mdi-download:before{content:"\F1DA"}.mdi-download-network:before{content:"\F6F3"}.mdi-drag:before{content:"\F1DB"}.mdi-drag-horizontal:before{content:"\F1DC"}.mdi-drag-vertical:before{content:"\F1DD"}.mdi-drawing:before{content:"\F1DE"}.mdi-drawing-box:before{content:"\F1DF"}.mdi-dribbble:before{content:"\F1E0"}.mdi-dribbble-box:before{content:"\F1E1"}.mdi-drone:before{content:"\F1E2"}.mdi-dropbox:before{content:"\F1E3"}.mdi-drupal:before{content:"\F1E4"}.mdi-duck:before{content:"\F1E5"}.mdi-dumbbell:before{content:"\F1E6"}.mdi-earth:before{content:"\F1E7"}.mdi-earth-box:before{content:"\F6CC"}.mdi-earth-box-off:before{content:"\F6CD"}.mdi-earth-off:before{content:"\F1E8"}.mdi-edge:before{content:"\F1E9"}.mdi-eject:before{content:"\F1EA"}.mdi-elevation-decline:before{content:"\F1EB"}.mdi-elevation-rise:before{content:"\F1EC"}.mdi-elevator:before{content:"\F1ED"}.mdi-email:before{content:"\F1EE"}.mdi-email-alert:before{content:"\F6CE"}.mdi-email-open:before{content:"\F1EF"}.mdi-email-open-outline:before{content:"\F5EF"}.mdi-email-outline:before{content:"\F1F0"}.mdi-email-secure:before{content:"\F1F1"}.mdi-email-variant:before{content:"\F5F0"}.mdi-emby:before{content:"\F6B3"}.mdi-emoticon:before{content:"\F1F2"}.mdi-emoticon-cool:before{content:"\F1F3"}.mdi-emoticon-dead:before{content:"\F69A"}.mdi-emoticon-devil:before{content:"\F1F4"}.mdi-emoticon-excited:before{content:"\F69B"}.mdi-emoticon-happy:before{content:"\F1F5"}.mdi-emoticon-neutral:before{content:"\F1F6"}.mdi-emoticon-poop:before{content:"\F1F7"}.mdi-emoticon-sad:before{content:"\F1F8"}.mdi-emoticon-tongue:before{content:"\F1F9"}.mdi-engine:before{content:"\F1FA"}.mdi-engine-outline:before{content:"\F1FB"}.mdi-equal:before{content:"\F1FC"}.mdi-equal-box:before{content:"\F1FD"}.mdi-eraser:before{content:"\F1FE"}.mdi-eraser-variant:before{content:"\F642"}.mdi-escalator:before{content:"\F1FF"}.mdi-ethernet:before{content:"\F200"}.mdi-ethernet-cable:before{content:"\F201"}.mdi-ethernet-cable-off:before{content:"\F202"}.mdi-etsy:before{content:"\F203"}.mdi-ev-station:before{content:"\F5F1"}.mdi-evernote:before{content:"\F204"}.mdi-exclamation:before{content:"\F205"}.mdi-exit-to-app:before{content:"\F206"}.mdi-export:before{content:"\F207"}.mdi-eye:before{content:"\F208"}.mdi-eye-off:before{content:"\F209"}.mdi-eye-off-outline:before{content:"\F6D0"}.mdi-eye-outline:before{content:"\F6CF"}.mdi-eyedropper:before{content:"\F20A"}.mdi-eyedropper-variant:before{content:"\F20B"}.mdi-face:before{content:"\F643"}.mdi-face-profile:before{content:"\F644"}.mdi-facebook:before{content:"\F20C"}.mdi-facebook-box:before{content:"\F20D"}.mdi-facebook-messenger:before{content:"\F20E"}.mdi-factory:before{content:"\F20F"}.mdi-fan:before{content:"\F210"}.mdi-fast-forward:before{content:"\F211"}.mdi-fast-forward-outline:before{content:"\F6D1"}.mdi-fax:before{content:"\F212"}.mdi-feather:before{content:"\F6D2"}.mdi-ferry:before{content:"\F213"}.mdi-file:before{content:"\F214"}.mdi-file-account:before{content:"\F73A"}.mdi-file-chart:before{content:"\F215"}.mdi-file-check:before{content:"\F216"}.mdi-file-cloud:before{content:"\F217"}.mdi-file-delimited:before{content:"\F218"}.mdi-file-document:before{content:"\F219"}.mdi-file-document-box:before{content:"\F21A"}.mdi-file-excel:before{content:"\F21B"}.mdi-file-excel-box:before{content:"\F21C"}.mdi-file-export:before{content:"\F21D"}.mdi-file-find:before{content:"\F21E"}.mdi-file-hidden:before{content:"\F613"}.mdi-file-image:before{content:"\F21F"}.mdi-file-import:before{content:"\F220"}.mdi-file-lock:before{content:"\F221"}.mdi-file-multiple:before{content:"\F222"}.mdi-file-music:before{content:"\F223"}.mdi-file-outline:before{content:"\F224"}.mdi-file-pdf:before{content:"\F225"}.mdi-file-pdf-box:before{content:"\F226"}.mdi-file-plus:before{content:"\F751"}.mdi-file-powerpoint:before{content:"\F227"}.mdi-file-powerpoint-box:before{content:"\F228"}.mdi-file-presentation-box:before{content:"\F229"}.mdi-file-restore:before{content:"\F670"}.mdi-file-send:before{content:"\F22A"}.mdi-file-tree:before{content:"\F645"}.mdi-file-video:before{content:"\F22B"}.mdi-file-word:before{content:"\F22C"}.mdi-file-word-box:before{content:"\F22D"}.mdi-file-xml:before{content:"\F22E"}.mdi-film:before{content:"\F22F"}.mdi-filmstrip:before{content:"\F230"}.mdi-filmstrip-off:before{content:"\F231"}.mdi-filter:before{content:"\F232"}.mdi-filter-outline:before{content:"\F233"}.mdi-filter-remove:before{content:"\F234"}.mdi-filter-remove-outline:before{content:"\F235"}.mdi-filter-variant:before{content:"\F236"}.mdi-find-replace:before{content:"\F6D3"}.mdi-fingerprint:before{content:"\F237"}.mdi-fire:before{content:"\F238"}.mdi-firefox:before{content:"\F239"}.mdi-fish:before{content:"\F23A"}.mdi-flag:before{content:"\F23B"}.mdi-flag-checkered:before{content:"\F23C"}.mdi-flag-outline:before{content:"\F23D"}.mdi-flag-outline-variant:before{content:"\F23E"}.mdi-flag-triangle:before{content:"\F23F"}.mdi-flag-variant:before{content:"\F240"}.mdi-flash:before{content:"\F241"}.mdi-flash-auto:before{content:"\F242"}.mdi-flash-off:before{content:"\F243"}.mdi-flash-outline:before{content:"\F6D4"}.mdi-flash-red-eye:before{content:"\F67A"}.mdi-flashlight:before{content:"\F244"}.mdi-flashlight-off:before{content:"\F245"}.mdi-flask:before{content:"\F093"}.mdi-flask-empty:before{content:"\F094"}.mdi-flask-empty-outline:before{content:"\F095"}.mdi-flask-outline:before{content:"\F096"}.mdi-flattr:before{content:"\F246"}.mdi-flip-to-back:before{content:"\F247"}.mdi-flip-to-front:before{content:"\F248"}.mdi-floppy:before{content:"\F249"}.mdi-flower:before{content:"\F24A"}.mdi-folder:before{content:"\F24B"}.mdi-folder-account:before{content:"\F24C"}.mdi-folder-download:before{content:"\F24D"}.mdi-folder-google-drive:before{content:"\F24E"}.mdi-folder-image:before{content:"\F24F"}.mdi-folder-lock:before{content:"\F250"}.mdi-folder-lock-open:before{content:"\F251"}.mdi-folder-move:before{content:"\F252"}.mdi-folder-multiple:before{content:"\F253"}.mdi-folder-multiple-image:before{content:"\F254"}.mdi-folder-multiple-outline:before{content:"\F255"}.mdi-folder-open:before{content:"\F76F"}.mdi-folder-outline:before{content:"\F256"}.mdi-folder-plus:before{content:"\F257"}.mdi-folder-remove:before{content:"\F258"}.mdi-folder-star:before{content:"\F69C"}.mdi-folder-upload:before{content:"\F259"}.mdi-font-awesome:before{content:"\F03A"}.mdi-food:before{content:"\F25A"}.mdi-food-apple:before{content:"\F25B"}.mdi-food-fork-drink:before{content:"\F5F2"}.mdi-food-off:before{content:"\F5F3"}.mdi-food-variant:before{content:"\F25C"}.mdi-football:before{content:"\F25D"}.mdi-football-australian:before{content:"\F25E"}.mdi-football-helmet:before{content:"\F25F"}.mdi-format-align-bottom:before{content:"\F752"}.mdi-format-align-center:before{content:"\F260"}.mdi-format-align-justify:before{content:"\F261"}.mdi-format-align-left:before{content:"\F262"}.mdi-format-align-middle:before{content:"\F753"}.mdi-format-align-right:before{content:"\F263"}.mdi-format-align-top:before{content:"\F754"}.mdi-format-annotation-plus:before{content:"\F646"}.mdi-format-bold:before{content:"\F264"}.mdi-format-clear:before{content:"\F265"}.mdi-format-color-fill:before{content:"\F266"}.mdi-format-color-text:before{content:"\F69D"}.mdi-format-float-center:before{content:"\F267"}.mdi-format-float-left:before{content:"\F268"}.mdi-format-float-none:before{content:"\F269"}.mdi-format-float-right:before{content:"\F26A"}.mdi-format-font:before{content:"\F6D5"}.mdi-format-header-1:before{content:"\F26B"}.mdi-format-header-2:before{content:"\F26C"}.mdi-format-header-3:before{content:"\F26D"}.mdi-format-header-4:before{content:"\F26E"}.mdi-format-header-5:before{content:"\F26F"}.mdi-format-header-6:before{content:"\F270"}.mdi-format-header-decrease:before{content:"\F271"}.mdi-format-header-equal:before{content:"\F272"}.mdi-format-header-increase:before{content:"\F273"}.mdi-format-header-pound:before{content:"\F274"}.mdi-format-horizontal-align-center:before{content:"\F61E"}.mdi-format-horizontal-align-left:before{content:"\F61F"}.mdi-format-horizontal-align-right:before{content:"\F620"}.mdi-format-indent-decrease:before{content:"\F275"}.mdi-format-indent-increase:before{content:"\F276"}.mdi-format-italic:before{content:"\F277"}.mdi-format-line-spacing:before{content:"\F278"}.mdi-format-line-style:before{content:"\F5C8"}.mdi-format-line-weight:before{content:"\F5C9"}.mdi-format-list-bulleted:before{content:"\F279"}.mdi-format-list-bulleted-type:before{content:"\F27A"}.mdi-format-list-checks:before{content:"\F755"}.mdi-format-list-numbers:before{content:"\F27B"}.mdi-format-page-break:before{content:"\F6D6"}.mdi-format-paint:before{content:"\F27C"}.mdi-format-paragraph:before{content:"\F27D"}.mdi-format-pilcrow:before{content:"\F6D7"}.mdi-format-quote-close:before{content:"\F27E"}.mdi-format-quote-open:before{content:"\F756"}.mdi-format-rotate-90:before{content:"\F6A9"}.mdi-format-section:before{content:"\F69E"}.mdi-format-size:before{content:"\F27F"}.mdi-format-strikethrough:before{content:"\F280"}.mdi-format-strikethrough-variant:before{content:"\F281"}.mdi-format-subscript:before{content:"\F282"}.mdi-format-superscript:before{content:"\F283"}.mdi-format-text:before{content:"\F284"}.mdi-format-textdirection-l-to-r:before{content:"\F285"}.mdi-format-textdirection-r-to-l:before{content:"\F286"}.mdi-format-title:before{content:"\F5F4"}.mdi-format-underline:before{content:"\F287"}.mdi-format-vertical-align-bottom:before{content:"\F621"}.mdi-format-vertical-align-center:before{content:"\F622"}.mdi-format-vertical-align-top:before{content:"\F623"}.mdi-format-wrap-inline:before{content:"\F288"}.mdi-format-wrap-square:before{content:"\F289"}.mdi-format-wrap-tight:before{content:"\F28A"}.mdi-format-wrap-top-bottom:before{content:"\F28B"}.mdi-forum:before{content:"\F28C"}.mdi-forward:before{content:"\F28D"}.mdi-foursquare:before{content:"\F28E"}.mdi-fridge:before{content:"\F28F"}.mdi-fridge-filled:before{content:"\F290"}.mdi-fridge-filled-bottom:before{content:"\F291"}.mdi-fridge-filled-top:before{content:"\F292"}.mdi-fullscreen:before{content:"\F293"}.mdi-fullscreen-exit:before{content:"\F294"}.mdi-function:before{content:"\F295"}.mdi-gamepad:before{content:"\F296"}.mdi-gamepad-variant:before{content:"\F297"}.mdi-garage:before{content:"\F6D8"}.mdi-garage-open:before{content:"\F6D9"}.mdi-gas-cylinder:before{content:"\F647"}.mdi-gas-station:before{content:"\F298"}.mdi-gate:before{content:"\F299"}.mdi-gauge:before{content:"\F29A"}.mdi-gavel:before{content:"\F29B"}.mdi-gender-female:before{content:"\F29C"}.mdi-gender-male:before{content:"\F29D"}.mdi-gender-male-female:before{content:"\F29E"}.mdi-gender-transgender:before{content:"\F29F"}.mdi-gesture-double-tap:before{content:"\F73B"}.mdi-gesture-swipe-down:before{content:"\F73C"}.mdi-gesture-swipe-left:before{content:"\F73D"}.mdi-gesture-swipe-right:before{content:"\F73E"}.mdi-gesture-swipe-up:before{content:"\F73F"}.mdi-gesture-tap:before{content:"\F740"}.mdi-gesture-two-double-tap:before{content:"\F741"}.mdi-gesture-two-tap:before{content:"\F742"}.mdi-ghost:before{content:"\F2A0"}.mdi-gift:before{content:"\F2A1"}.mdi-git:before{content:"\F2A2"}.mdi-github-box:before{content:"\F2A3"}.mdi-github-circle:before{content:"\F2A4"}.mdi-github-face:before{content:"\F6DA"}.mdi-glass-flute:before{content:"\F2A5"}.mdi-glass-mug:before{content:"\F2A6"}.mdi-glass-stange:before{content:"\F2A7"}.mdi-glass-tulip:before{content:"\F2A8"}.mdi-glassdoor:before{content:"\F2A9"}.mdi-glasses:before{content:"\F2AA"}.mdi-gmail:before{content:"\F2AB"}.mdi-gnome:before{content:"\F2AC"}.mdi-gondola:before{content:"\F685"}.mdi-google:before{content:"\F2AD"}.mdi-google-cardboard:before{content:"\F2AE"}.mdi-google-chrome:before{content:"\F2AF"}.mdi-google-circles:before{content:"\F2B0"}.mdi-google-circles-communities:before{content:"\F2B1"}.mdi-google-circles-extended:before{content:"\F2B2"}.mdi-google-circles-group:before{content:"\F2B3"}.mdi-google-controller:before{content:"\F2B4"}.mdi-google-controller-off:before{content:"\F2B5"}.mdi-google-drive:before{content:"\F2B6"}.mdi-google-earth:before{content:"\F2B7"}.mdi-google-glass:before{content:"\F2B8"}.mdi-google-keep:before{content:"\F6DB"}.mdi-google-maps:before{content:"\F5F5"}.mdi-google-nearby:before{content:"\F2B9"}.mdi-google-pages:before{content:"\F2BA"}.mdi-google-photos:before{content:"\F6DC"}.mdi-google-physical-web:before{content:"\F2BB"}.mdi-google-play:before{content:"\F2BC"}.mdi-google-plus:before{content:"\F2BD"}.mdi-google-plus-box:before{content:"\F2BE"}.mdi-google-translate:before{content:"\F2BF"}.mdi-google-wallet:before{content:"\F2C0"}.mdi-gradient:before{content:"\F69F"}.mdi-grease-pencil:before{content:"\F648"}.mdi-grid:before{content:"\F2C1"}.mdi-grid-large:before{content:"\F757"}.mdi-grid-off:before{content:"\F2C2"}.mdi-group:before{content:"\F2C3"}.mdi-guitar-acoustic:before{content:"\F770"}.mdi-guitar-electric:before{content:"\F2C4"}.mdi-guitar-pick:before{content:"\F2C5"}.mdi-guitar-pick-outline:before{content:"\F2C6"}.mdi-hackernews:before{content:"\F624"}.mdi-hamburger:before{content:"\F684"}.mdi-hand-pointing-right:before{content:"\F2C7"}.mdi-hanger:before{content:"\F2C8"}.mdi-hangouts:before{content:"\F2C9"}.mdi-harddisk:before{content:"\F2CA"}.mdi-headphones:before{content:"\F2CB"}.mdi-headphones-box:before{content:"\F2CC"}.mdi-headphones-settings:before{content:"\F2CD"}.mdi-headset:before{content:"\F2CE"}.mdi-headset-dock:before{content:"\F2CF"}.mdi-headset-off:before{content:"\F2D0"}.mdi-heart:before{content:"\F2D1"}.mdi-heart-box:before{content:"\F2D2"}.mdi-heart-box-outline:before{content:"\F2D3"}.mdi-heart-broken:before{content:"\F2D4"}.mdi-heart-half:before{content:"\F6DE"}.mdi-heart-half-full:before{content:"\F6DD"}.mdi-heart-half-outline:before{content:"\F6DF"}.mdi-heart-off:before{content:"\F758"}.mdi-heart-outline:before{content:"\F2D5"}.mdi-heart-pulse:before{content:"\F5F6"}.mdi-help:before{content:"\F2D6"}.mdi-help-box:before{content:"\F78A"}.mdi-help-circle:before{content:"\F2D7"}.mdi-help-circle-outline:before{content:"\F625"}.mdi-help-network:before{content:"\F6F4"}.mdi-hexagon:before{content:"\F2D8"}.mdi-hexagon-multiple:before{content:"\F6E0"}.mdi-hexagon-outline:before{content:"\F2D9"}.mdi-highway:before{content:"\F5F7"}.mdi-history:before{content:"\F2DA"}.mdi-hololens:before{content:"\F2DB"}.mdi-home:before{content:"\F2DC"}.mdi-home-map-marker:before{content:"\F5F8"}.mdi-home-modern:before{content:"\F2DD"}.mdi-home-outline:before{content:"\F6A0"}.mdi-home-variant:before{content:"\F2DE"}.mdi-hook:before{content:"\F6E1"}.mdi-hook-off:before{content:"\F6E2"}.mdi-hops:before{content:"\F2DF"}.mdi-hospital:before{content:"\F2E0"}.mdi-hospital-building:before{content:"\F2E1"}.mdi-hospital-marker:before{content:"\F2E2"}.mdi-hotel:before{content:"\F2E3"}.mdi-houzz:before{content:"\F2E4"}.mdi-houzz-box:before{content:"\F2E5"}.mdi-human:before{content:"\F2E6"}.mdi-human-child:before{content:"\F2E7"}.mdi-human-female:before{content:"\F649"}.mdi-human-greeting:before{content:"\F64A"}.mdi-human-handsdown:before{content:"\F64B"}.mdi-human-handsup:before{content:"\F64C"}.mdi-human-male:before{content:"\F64D"}.mdi-human-male-female:before{content:"\F2E8"}.mdi-human-pregnant:before{content:"\F5CF"}.mdi-humble-bundle:before{content:"\F743"}.mdi-image:before{content:"\F2E9"}.mdi-image-album:before{content:"\F2EA"}.mdi-image-area:before{content:"\F2EB"}.mdi-image-area-close:before{content:"\F2EC"}.mdi-image-broken:before{content:"\F2ED"}.mdi-image-broken-variant:before{content:"\F2EE"}.mdi-image-filter:before{content:"\F2EF"}.mdi-image-filter-black-white:before{content:"\F2F0"}.mdi-image-filter-center-focus:before{content:"\F2F1"}.mdi-image-filter-center-focus-weak:before{content:"\F2F2"}.mdi-image-filter-drama:before{content:"\F2F3"}.mdi-image-filter-frames:before{content:"\F2F4"}.mdi-image-filter-hdr:before{content:"\F2F5"}.mdi-image-filter-none:before{content:"\F2F6"}.mdi-image-filter-tilt-shift:before{content:"\F2F7"}.mdi-image-filter-vintage:before{content:"\F2F8"}.mdi-image-multiple:before{content:"\F2F9"}.mdi-import:before{content:"\F2FA"}.mdi-inbox:before{content:"\F686"}.mdi-inbox-arrow-down:before{content:"\F2FB"}.mdi-inbox-arrow-up:before{content:"\F3D1"}.mdi-incognito:before{content:"\F5F9"}.mdi-infinity:before{content:"\F6E3"}.mdi-information:before{content:"\F2FC"}.mdi-information-outline:before{content:"\F2FD"}.mdi-information-variant:before{content:"\F64E"}.mdi-instagram:before{content:"\F2FE"}.mdi-instapaper:before{content:"\F2FF"}.mdi-internet-explorer:before{content:"\F300"}.mdi-invert-colors:before{content:"\F301"}.mdi-itunes:before{content:"\F676"}.mdi-jeepney:before{content:"\F302"}.mdi-jira:before{content:"\F303"}.mdi-jsfiddle:before{content:"\F304"}.mdi-json:before{content:"\F626"}.mdi-keg:before{content:"\F305"}.mdi-kettle:before{content:"\F5FA"}.mdi-key:before{content:"\F306"}.mdi-key-change:before{content:"\F307"}.mdi-key-minus:before{content:"\F308"}.mdi-key-plus:before{content:"\F309"}.mdi-key-remove:before{content:"\F30A"}.mdi-key-variant:before{content:"\F30B"}.mdi-keyboard:before{content:"\F30C"}.mdi-keyboard-backspace:before{content:"\F30D"}.mdi-keyboard-caps:before{content:"\F30E"}.mdi-keyboard-close:before{content:"\F30F"}.mdi-keyboard-off:before{content:"\F310"}.mdi-keyboard-return:before{content:"\F311"}.mdi-keyboard-tab:before{content:"\F312"}.mdi-keyboard-variant:before{content:"\F313"}.mdi-kickstarter:before{content:"\F744"}.mdi-kodi:before{content:"\F314"}.mdi-label:before{content:"\F315"}.mdi-label-outline:before{content:"\F316"}.mdi-lambda:before{content:"\F627"}.mdi-lamp:before{content:"\F6B4"}.mdi-lan:before{content:"\F317"}.mdi-lan-connect:before{content:"\F318"}.mdi-lan-disconnect:before{content:"\F319"}.mdi-lan-pending:before{content:"\F31A"}.mdi-language-c:before{content:"\F671"}.mdi-language-cpp:before{content:"\F672"}.mdi-language-csharp:before{content:"\F31B"}.mdi-language-css3:before{content:"\F31C"}.mdi-language-html5:before{content:"\F31D"}.mdi-language-javascript:before{content:"\F31E"}.mdi-language-php:before{content:"\F31F"}.mdi-language-python:before{content:"\F320"}.mdi-language-python-text:before{content:"\F321"}.mdi-language-swift:before{content:"\F6E4"}.mdi-language-typescript:before{content:"\F6E5"}.mdi-laptop:before{content:"\F322"}.mdi-laptop-chromebook:before{content:"\F323"}.mdi-laptop-mac:before{content:"\F324"}.mdi-laptop-off:before{content:"\F6E6"}.mdi-laptop-windows:before{content:"\F325"}.mdi-lastfm:before{content:"\F326"}.mdi-launch:before{content:"\F327"}.mdi-layers:before{content:"\F328"}.mdi-layers-off:before{content:"\F329"}.mdi-lead-pencil:before{content:"\F64F"}.mdi-leaf:before{content:"\F32A"}.mdi-led-off:before{content:"\F32B"}.mdi-led-on:before{content:"\F32C"}.mdi-led-outline:before{content:"\F32D"}.mdi-led-variant-off:before{content:"\F32E"}.mdi-led-variant-on:before{content:"\F32F"}.mdi-led-variant-outline:before{content:"\F330"}.mdi-library:before{content:"\F331"}.mdi-library-books:before{content:"\F332"}.mdi-library-music:before{content:"\F333"}.mdi-library-plus:before{content:"\F334"}.mdi-lightbulb:before{content:"\F335"}.mdi-lightbulb-on:before{content:"\F6E7"}.mdi-lightbulb-on-outline:before{content:"\F6E8"}.mdi-lightbulb-outline:before{content:"\F336"}.mdi-link:before{content:"\F337"}.mdi-link-off:before{content:"\F338"}.mdi-link-variant:before{content:"\F339"}.mdi-link-variant-off:before{content:"\F33A"}.mdi-linkedin:before{content:"\F33B"}.mdi-linkedin-box:before{content:"\F33C"}.mdi-linux:before{content:"\F33D"}.mdi-loading:before{content:"\F771"}.mdi-lock:before{content:"\F33E"}.mdi-lock-open:before{content:"\F33F"}.mdi-lock-open-outline:before{content:"\F340"}.mdi-lock-outline:before{content:"\F341"}.mdi-lock-pattern:before{content:"\F6E9"}.mdi-lock-plus:before{content:"\F5FB"}.mdi-lock-reset:before{content:"\F772"}.mdi-login:before{content:"\F342"}.mdi-login-variant:before{content:"\F5FC"}.mdi-logout:before{content:"\F343"}.mdi-logout-variant:before{content:"\F5FD"}.mdi-looks:before{content:"\F344"}.mdi-loop:before{content:"\F6EA"}.mdi-loupe:before{content:"\F345"}.mdi-lumx:before{content:"\F346"}.mdi-magnet:before{content:"\F347"}.mdi-magnet-on:before{content:"\F348"}.mdi-magnify:before{content:"\F349"}.mdi-magnify-minus:before{content:"\F34A"}.mdi-magnify-minus-outline:before{content:"\F6EB"}.mdi-magnify-plus:before{content:"\F34B"}.mdi-magnify-plus-outline:before{content:"\F6EC"}.mdi-mail-ru:before{content:"\F34C"}.mdi-mailbox:before{content:"\F6ED"}.mdi-map:before{content:"\F34D"}.mdi-map-marker:before{content:"\F34E"}.mdi-map-marker-circle:before{content:"\F34F"}.mdi-map-marker-minus:before{content:"\F650"}.mdi-map-marker-multiple:before{content:"\F350"}.mdi-map-marker-off:before{content:"\F351"}.mdi-map-marker-plus:before{content:"\F651"}.mdi-map-marker-radius:before{content:"\F352"}.mdi-margin:before{content:"\F353"}.mdi-markdown:before{content:"\F354"}.mdi-marker:before{content:"\F652"}.mdi-marker-check:before{content:"\F355"}.mdi-martini:before{content:"\F356"}.mdi-material-ui:before{content:"\F357"}.mdi-math-compass:before{content:"\F358"}.mdi-matrix:before{content:"\F628"}.mdi-maxcdn:before{content:"\F359"}.mdi-medical-bag:before{content:"\F6EE"}.mdi-medium:before{content:"\F35A"}.mdi-memory:before{content:"\F35B"}.mdi-menu:before{content:"\F35C"}.mdi-menu-down:before{content:"\F35D"}.mdi-menu-down-outline:before{content:"\F6B5"}.mdi-menu-left:before{content:"\F35E"}.mdi-menu-right:before{content:"\F35F"}.mdi-menu-up:before{content:"\F360"}.mdi-menu-up-outline:before{content:"\F6B6"}.mdi-message:before{content:"\F361"}.mdi-message-alert:before{content:"\F362"}.mdi-message-bulleted:before{content:"\F6A1"}.mdi-message-bulleted-off:before{content:"\F6A2"}.mdi-message-draw:before{content:"\F363"}.mdi-message-image:before{content:"\F364"}.mdi-message-outline:before{content:"\F365"}.mdi-message-plus:before{content:"\F653"}.mdi-message-processing:before{content:"\F366"}.mdi-message-reply:before{content:"\F367"}.mdi-message-reply-text:before{content:"\F368"}.mdi-message-settings:before{content:"\F6EF"}.mdi-message-settings-variant:before{content:"\F6F0"}.mdi-message-text:before{content:"\F369"}.mdi-message-text-outline:before{content:"\F36A"}.mdi-message-video:before{content:"\F36B"}.mdi-meteor:before{content:"\F629"}.mdi-microphone:before{content:"\F36C"}.mdi-microphone-off:before{content:"\F36D"}.mdi-microphone-outline:before{content:"\F36E"}.mdi-microphone-settings:before{content:"\F36F"}.mdi-microphone-variant:before{content:"\F370"}.mdi-microphone-variant-off:before{content:"\F371"}.mdi-microscope:before{content:"\F654"}.mdi-microsoft:before{content:"\F372"}.mdi-minecraft:before{content:"\F373"}.mdi-minus:before{content:"\F374"}.mdi-minus-box:before{content:"\F375"}.mdi-minus-box-outline:before{content:"\F6F1"}.mdi-minus-circle:before{content:"\F376"}.mdi-minus-circle-outline:before{content:"\F377"}.mdi-minus-network:before{content:"\F378"}.mdi-mixcloud:before{content:"\F62A"}.mdi-monitor:before{content:"\F379"}.mdi-monitor-multiple:before{content:"\F37A"}.mdi-more:before{content:"\F37B"}.mdi-motorbike:before{content:"\F37C"}.mdi-mouse:before{content:"\F37D"}.mdi-mouse-off:before{content:"\F37E"}.mdi-mouse-variant:before{content:"\F37F"}.mdi-mouse-variant-off:before{content:"\F380"}.mdi-move-resize:before{content:"\F655"}.mdi-move-resize-variant:before{content:"\F656"}.mdi-movie:before{content:"\F381"}.mdi-multiplication:before{content:"\F382"}.mdi-multiplication-box:before{content:"\F383"}.mdi-music:before{content:"\F759"}.mdi-music-box:before{content:"\F384"}.mdi-music-box-outline:before{content:"\F385"}.mdi-music-circle:before{content:"\F386"}.mdi-music-note:before{content:"\F387"}.mdi-music-note-bluetooth:before{content:"\F5FE"}.mdi-music-note-bluetooth-off:before{content:"\F5FF"}.mdi-music-note-eighth:before{content:"\F388"}.mdi-music-note-half:before{content:"\F389"}.mdi-music-note-off:before{content:"\F38A"}.mdi-music-note-quarter:before{content:"\F38B"}.mdi-music-note-sixteenth:before{content:"\F38C"}.mdi-music-note-whole:before{content:"\F38D"}.mdi-music-off:before{content:"\F75A"}.mdi-nature:before{content:"\F38E"}.mdi-nature-people:before{content:"\F38F"}.mdi-navigation:before{content:"\F390"}.mdi-near-me:before{content:"\F5CD"}.mdi-needle:before{content:"\F391"}.mdi-nest-protect:before{content:"\F392"}.mdi-nest-thermostat:before{content:"\F393"}.mdi-netflix:before{content:"\F745"}.mdi-network:before{content:"\F6F2"}.mdi-new-box:before{content:"\F394"}.mdi-newspaper:before{content:"\F395"}.mdi-nfc:before{content:"\F396"}.mdi-nfc-tap:before{content:"\F397"}.mdi-nfc-variant:before{content:"\F398"}.mdi-ninja:before{content:"\F773"}.mdi-nodejs:before{content:"\F399"}.mdi-note:before{content:"\F39A"}.mdi-note-multiple:before{content:"\F6B7"}.mdi-note-multiple-outline:before{content:"\F6B8"}.mdi-note-outline:before{content:"\F39B"}.mdi-note-plus:before{content:"\F39C"}.mdi-note-plus-outline:before{content:"\F39D"}.mdi-note-text:before{content:"\F39E"}.mdi-notification-clear-all:before{content:"\F39F"}.mdi-npm:before{content:"\F6F6"}.mdi-nuke:before{content:"\F6A3"}.mdi-numeric:before{content:"\F3A0"}.mdi-numeric-0-box:before{content:"\F3A1"}.mdi-numeric-0-box-multiple-outline:before{content:"\F3A2"}.mdi-numeric-0-box-outline:before{content:"\F3A3"}.mdi-numeric-1-box:before{content:"\F3A4"}.mdi-numeric-1-box-multiple-outline:before{content:"\F3A5"}.mdi-numeric-1-box-outline:before{content:"\F3A6"}.mdi-numeric-2-box:before{content:"\F3A7"}.mdi-numeric-2-box-multiple-outline:before{content:"\F3A8"}.mdi-numeric-2-box-outline:before{content:"\F3A9"}.mdi-numeric-3-box:before{content:"\F3AA"}.mdi-numeric-3-box-multiple-outline:before{content:"\F3AB"}.mdi-numeric-3-box-outline:before{content:"\F3AC"}.mdi-numeric-4-box:before{content:"\F3AD"}.mdi-numeric-4-box-multiple-outline:before{content:"\F3AE"}.mdi-numeric-4-box-outline:before{content:"\F3AF"}.mdi-numeric-5-box:before{content:"\F3B0"}.mdi-numeric-5-box-multiple-outline:before{content:"\F3B1"}.mdi-numeric-5-box-outline:before{content:"\F3B2"}.mdi-numeric-6-box:before{content:"\F3B3"}.mdi-numeric-6-box-multiple-outline:before{content:"\F3B4"}.mdi-numeric-6-box-outline:before{content:"\F3B5"}.mdi-numeric-7-box:before{content:"\F3B6"}.mdi-numeric-7-box-multiple-outline:before{content:"\F3B7"}.mdi-numeric-7-box-outline:before{content:"\F3B8"}.mdi-numeric-8-box:before{content:"\F3B9"}.mdi-numeric-8-box-multiple-outline:before{content:"\F3BA"}.mdi-numeric-8-box-outline:before{content:"\F3BB"}.mdi-numeric-9-box:before{content:"\F3BC"}.mdi-numeric-9-box-multiple-outline:before{content:"\F3BD"}.mdi-numeric-9-box-outline:before{content:"\F3BE"}.mdi-numeric-9-plus-box:before{content:"\F3BF"}.mdi-numeric-9-plus-box-multiple-outline:before{content:"\F3C0"}.mdi-numeric-9-plus-box-outline:before{content:"\F3C1"}.mdi-nut:before{content:"\F6F7"}.mdi-nutrition:before{content:"\F3C2"}.mdi-oar:before{content:"\F67B"}.mdi-octagon:before{content:"\F3C3"}.mdi-octagon-outline:before{content:"\F3C4"}.mdi-octagram:before{content:"\F6F8"}.mdi-octagram-outline:before{content:"\F774"}.mdi-odnoklassniki:before{content:"\F3C5"}.mdi-office:before{content:"\F3C6"}.mdi-oil:before{content:"\F3C7"}.mdi-oil-temperature:before{content:"\F3C8"}.mdi-omega:before{content:"\F3C9"}.mdi-onedrive:before{content:"\F3CA"}.mdi-onenote:before{content:"\F746"}.mdi-opacity:before{content:"\F5CC"}.mdi-open-in-app:before{content:"\F3CB"}.mdi-open-in-new:before{content:"\F3CC"}.mdi-openid:before{content:"\F3CD"}.mdi-opera:before{content:"\F3CE"}.mdi-orbit:before{content:"\F018"}.mdi-ornament:before{content:"\F3CF"}.mdi-ornament-variant:before{content:"\F3D0"}.mdi-owl:before{content:"\F3D2"}.mdi-package:before{content:"\F3D3"}.mdi-package-down:before{content:"\F3D4"}.mdi-package-up:before{content:"\F3D5"}.mdi-package-variant:before{content:"\F3D6"}.mdi-package-variant-closed:before{content:"\F3D7"}.mdi-page-first:before{content:"\F600"}.mdi-page-last:before{content:"\F601"}.mdi-page-layout-body:before{content:"\F6F9"}.mdi-page-layout-footer:before{content:"\F6FA"}.mdi-page-layout-header:before{content:"\F6FB"}.mdi-page-layout-sidebar-left:before{content:"\F6FC"}.mdi-page-layout-sidebar-right:before{content:"\F6FD"}.mdi-palette:before{content:"\F3D8"}.mdi-palette-advanced:before{content:"\F3D9"}.mdi-panda:before{content:"\F3DA"}.mdi-pandora:before{content:"\F3DB"}.mdi-panorama:before{content:"\F3DC"}.mdi-panorama-fisheye:before{content:"\F3DD"}.mdi-panorama-horizontal:before{content:"\F3DE"}.mdi-panorama-vertical:before{content:"\F3DF"}.mdi-panorama-wide-angle:before{content:"\F3E0"}.mdi-paper-cut-vertical:before{content:"\F3E1"}.mdi-paperclip:before{content:"\F3E2"}.mdi-parking:before{content:"\F3E3"}.mdi-pause:before{content:"\F3E4"}.mdi-pause-circle:before{content:"\F3E5"}.mdi-pause-circle-outline:before{content:"\F3E6"}.mdi-pause-octagon:before{content:"\F3E7"}.mdi-pause-octagon-outline:before{content:"\F3E8"}.mdi-paw:before{content:"\F3E9"}.mdi-paw-off:before{content:"\F657"}.mdi-pen:before{content:"\F3EA"}.mdi-pencil:before{content:"\F3EB"}.mdi-pencil-box:before{content:"\F3EC"}.mdi-pencil-box-outline:before{content:"\F3ED"}.mdi-pencil-circle:before{content:"\F6FE"}.mdi-pencil-circle-outline:before{content:"\F775"}.mdi-pencil-lock:before{content:"\F3EE"}.mdi-pencil-off:before{content:"\F3EF"}.mdi-pentagon:before{content:"\F6FF"}.mdi-pentagon-outline:before{content:"\F700"}.mdi-percent:before{content:"\F3F0"}.mdi-periscope:before{content:"\F747"}.mdi-pharmacy:before{content:"\F3F1"}.mdi-phone:before{content:"\F3F2"}.mdi-phone-bluetooth:before{content:"\F3F3"}.mdi-phone-classic:before{content:"\F602"}.mdi-phone-forward:before{content:"\F3F4"}.mdi-phone-hangup:before{content:"\F3F5"}.mdi-phone-in-talk:before{content:"\F3F6"}.mdi-phone-incoming:before{content:"\F3F7"}.mdi-phone-locked:before{content:"\F3F8"}.mdi-phone-log:before{content:"\F3F9"}.mdi-phone-minus:before{content:"\F658"}.mdi-phone-missed:before{content:"\F3FA"}.mdi-phone-outgoing:before{content:"\F3FB"}.mdi-phone-paused:before{content:"\F3FC"}.mdi-phone-plus:before{content:"\F659"}.mdi-phone-settings:before{content:"\F3FD"}.mdi-phone-voip:before{content:"\F3FE"}.mdi-pi:before{content:"\F3FF"}.mdi-pi-box:before{content:"\F400"}.mdi-piano:before{content:"\F67C"}.mdi-pig:before{content:"\F401"}.mdi-pill:before{content:"\F402"}.mdi-pillar:before{content:"\F701"}.mdi-pin:before{content:"\F403"}.mdi-pin-off:before{content:"\F404"}.mdi-pine-tree:before{content:"\F405"}.mdi-pine-tree-box:before{content:"\F406"}.mdi-pinterest:before{content:"\F407"}.mdi-pinterest-box:before{content:"\F408"}.mdi-pistol:before{content:"\F702"}.mdi-pizza:before{content:"\F409"}.mdi-plane-shield:before{content:"\F6BA"}.mdi-play:before{content:"\F40A"}.mdi-play-box-outline:before{content:"\F40B"}.mdi-play-circle:before{content:"\F40C"}.mdi-play-circle-outline:before{content:"\F40D"}.mdi-play-pause:before{content:"\F40E"}.mdi-play-protected-content:before{content:"\F40F"}.mdi-playlist-check:before{content:"\F5C7"}.mdi-playlist-minus:before{content:"\F410"}.mdi-playlist-play:before{content:"\F411"}.mdi-playlist-plus:before{content:"\F412"}.mdi-playlist-remove:before{content:"\F413"}.mdi-playstation:before{content:"\F414"}.mdi-plex:before{content:"\F6B9"}.mdi-plus:before{content:"\F415"}.mdi-plus-box:before{content:"\F416"}.mdi-plus-box-outline:before{content:"\F703"}.mdi-plus-circle:before{content:"\F417"}.mdi-plus-circle-multiple-outline:before{content:"\F418"}.mdi-plus-circle-outline:before{content:"\F419"}.mdi-plus-network:before{content:"\F41A"}.mdi-plus-one:before{content:"\F41B"}.mdi-plus-outline:before{content:"\F704"}.mdi-pocket:before{content:"\F41C"}.mdi-pokeball:before{content:"\F41D"}.mdi-polaroid:before{content:"\F41E"}.mdi-poll:before{content:"\F41F"}.mdi-poll-box:before{content:"\F420"}.mdi-polymer:before{content:"\F421"}.mdi-pool:before{content:"\F606"}.mdi-popcorn:before{content:"\F422"}.mdi-pot:before{content:"\F65A"}.mdi-pot-mix:before{content:"\F65B"}.mdi-pound:before{content:"\F423"}.mdi-pound-box:before{content:"\F424"}.mdi-power:before{content:"\F425"}.mdi-power-plug:before{content:"\F6A4"}.mdi-power-plug-off:before{content:"\F6A5"}.mdi-power-settings:before{content:"\F426"}.mdi-power-socket:before{content:"\F427"}.mdi-prescription:before{content:"\F705"}.mdi-presentation:before{content:"\F428"}.mdi-presentation-play:before{content:"\F429"}.mdi-printer:before{content:"\F42A"}.mdi-printer-3d:before{content:"\F42B"}.mdi-printer-alert:before{content:"\F42C"}.mdi-printer-settings:before{content:"\F706"}.mdi-priority-high:before{content:"\F603"}.mdi-priority-low:before{content:"\F604"}.mdi-professional-hexagon:before{content:"\F42D"}.mdi-projector:before{content:"\F42E"}.mdi-projector-screen:before{content:"\F42F"}.mdi-publish:before{content:"\F6A6"}.mdi-pulse:before{content:"\F430"}.mdi-puzzle:before{content:"\F431"}.mdi-qqchat:before{content:"\F605"}.mdi-qrcode:before{content:"\F432"}.mdi-qrcode-scan:before{content:"\F433"}.mdi-quadcopter:before{content:"\F434"}.mdi-quality-high:before{content:"\F435"}.mdi-quicktime:before{content:"\F436"}.mdi-radar:before{content:"\F437"}.mdi-radiator:before{content:"\F438"}.mdi-radio:before{content:"\F439"}.mdi-radio-handheld:before{content:"\F43A"}.mdi-radio-tower:before{content:"\F43B"}.mdi-radioactive:before{content:"\F43C"}.mdi-radiobox-blank:before{content:"\F43D"}.mdi-radiobox-marked:before{content:"\F43E"}.mdi-raspberrypi:before{content:"\F43F"}.mdi-ray-end:before{content:"\F440"}.mdi-ray-end-arrow:before{content:"\F441"}.mdi-ray-start:before{content:"\F442"}.mdi-ray-start-arrow:before{content:"\F443"}.mdi-ray-start-end:before{content:"\F444"}.mdi-ray-vertex:before{content:"\F445"}.mdi-rdio:before{content:"\F446"}.mdi-react:before{content:"\F707"}.mdi-read:before{content:"\F447"}.mdi-readability:before{content:"\F448"}.mdi-receipt:before{content:"\F449"}.mdi-record:before{content:"\F44A"}.mdi-record-rec:before{content:"\F44B"}.mdi-recycle:before{content:"\F44C"}.mdi-reddit:before{content:"\F44D"}.mdi-redo:before{content:"\F44E"}.mdi-redo-variant:before{content:"\F44F"}.mdi-refresh:before{content:"\F450"}.mdi-regex:before{content:"\F451"}.mdi-relative-scale:before{content:"\F452"}.mdi-reload:before{content:"\F453"}.mdi-remote:before{content:"\F454"}.mdi-rename-box:before{content:"\F455"}.mdi-reorder-horizontal:before{content:"\F687"}.mdi-reorder-vertical:before{content:"\F688"}.mdi-repeat:before{content:"\F456"}.mdi-repeat-off:before{content:"\F457"}.mdi-repeat-once:before{content:"\F458"}.mdi-replay:before{content:"\F459"}.mdi-reply:before{content:"\F45A"}.mdi-reply-all:before{content:"\F45B"}.mdi-reproduction:before{content:"\F45C"}.mdi-resize-bottom-right:before{content:"\F45D"}.mdi-responsive:before{content:"\F45E"}.mdi-restart:before{content:"\F708"}.mdi-restore:before{content:"\F6A7"}.mdi-rewind:before{content:"\F45F"}.mdi-rewind-outline:before{content:"\F709"}.mdi-rhombus:before{content:"\F70A"}.mdi-rhombus-outline:before{content:"\F70B"}.mdi-ribbon:before{content:"\F460"}.mdi-road:before{content:"\F461"}.mdi-road-variant:before{content:"\F462"}.mdi-robot:before{content:"\F6A8"}.mdi-rocket:before{content:"\F463"}.mdi-roomba:before{content:"\F70C"}.mdi-rotate-3d:before{content:"\F464"}.mdi-rotate-left:before{content:"\F465"}.mdi-rotate-left-variant:before{content:"\F466"}.mdi-rotate-right:before{content:"\F467"}.mdi-rotate-right-variant:before{content:"\F468"}.mdi-rounded-corner:before{content:"\F607"}.mdi-router-wireless:before{content:"\F469"}.mdi-routes:before{content:"\F46A"}.mdi-rowing:before{content:"\F608"}.mdi-rss:before{content:"\F46B"}.mdi-rss-box:before{content:"\F46C"}.mdi-ruler:before{content:"\F46D"}.mdi-run:before{content:"\F70D"}.mdi-run-fast:before{content:"\F46E"}.mdi-sale:before{content:"\F46F"}.mdi-satellite:before{content:"\F470"}.mdi-satellite-variant:before{content:"\F471"}.mdi-saxophone:before{content:"\F609"}.mdi-scale:before{content:"\F472"}.mdi-scale-balance:before{content:"\F5D1"}.mdi-scale-bathroom:before{content:"\F473"}.mdi-scanner:before{content:"\F6AA"}.mdi-school:before{content:"\F474"}.mdi-screen-rotation:before{content:"\F475"}.mdi-screen-rotation-lock:before{content:"\F476"}.mdi-screwdriver:before{content:"\F477"}.mdi-script:before{content:"\F478"}.mdi-sd:before{content:"\F479"}.mdi-seal:before{content:"\F47A"}.mdi-search-web:before{content:"\F70E"}.mdi-seat-flat:before{content:"\F47B"}.mdi-seat-flat-angled:before{content:"\F47C"}.mdi-seat-individual-suite:before{content:"\F47D"}.mdi-seat-legroom-extra:before{content:"\F47E"}.mdi-seat-legroom-normal:before{content:"\F47F"}.mdi-seat-legroom-reduced:before{content:"\F480"}.mdi-seat-recline-extra:before{content:"\F481"}.mdi-seat-recline-normal:before{content:"\F482"}.mdi-security:before{content:"\F483"}.mdi-security-home:before{content:"\F689"}.mdi-security-network:before{content:"\F484"}.mdi-select:before{content:"\F485"}.mdi-select-all:before{content:"\F486"}.mdi-select-inverse:before{content:"\F487"}.mdi-select-off:before{content:"\F488"}.mdi-selection:before{content:"\F489"}.mdi-selection-off:before{content:"\F776"}.mdi-send:before{content:"\F48A"}.mdi-serial-port:before{content:"\F65C"}.mdi-server:before{content:"\F48B"}.mdi-server-minus:before{content:"\F48C"}.mdi-server-network:before{content:"\F48D"}.mdi-server-network-off:before{content:"\F48E"}.mdi-server-off:before{content:"\F48F"}.mdi-server-plus:before{content:"\F490"}.mdi-server-remove:before{content:"\F491"}.mdi-server-security:before{content:"\F492"}.mdi-set-all:before{content:"\F777"}.mdi-set-center:before{content:"\F778"}.mdi-set-center-right:before{content:"\F779"}.mdi-set-left:before{content:"\F77A"}.mdi-set-left-center:before{content:"\F77B"}.mdi-set-left-right:before{content:"\F77C"}.mdi-set-none:before{content:"\F77D"}.mdi-set-right:before{content:"\F77E"}.mdi-settings:before{content:"\F493"}.mdi-settings-box:before{content:"\F494"}.mdi-shape-circle-plus:before{content:"\F65D"}.mdi-shape-plus:before{content:"\F495"}.mdi-shape-polygon-plus:before{content:"\F65E"}.mdi-shape-rectangle-plus:before{content:"\F65F"}.mdi-shape-square-plus:before{content:"\F660"}.mdi-share:before{content:"\F496"}.mdi-share-variant:before{content:"\F497"}.mdi-shield:before{content:"\F498"}.mdi-shield-half-full:before{content:"\F77F"}.mdi-shield-outline:before{content:"\F499"}.mdi-shopping:before{content:"\F49A"}.mdi-shopping-music:before{content:"\F49B"}.mdi-shovel:before{content:"\F70F"}.mdi-shovel-off:before{content:"\F710"}.mdi-shredder:before{content:"\F49C"}.mdi-shuffle:before{content:"\F49D"}.mdi-shuffle-disabled:before{content:"\F49E"}.mdi-shuffle-variant:before{content:"\F49F"}.mdi-sigma:before{content:"\F4A0"}.mdi-sigma-lower:before{content:"\F62B"}.mdi-sign-caution:before{content:"\F4A1"}.mdi-sign-direction:before{content:"\F780"}.mdi-sign-text:before{content:"\F781"}.mdi-signal:before{content:"\F4A2"}.mdi-signal-2g:before{content:"\F711"}.mdi-signal-3g:before{content:"\F712"}.mdi-signal-4g:before{content:"\F713"}.mdi-signal-hspa:before{content:"\F714"}.mdi-signal-hspa-plus:before{content:"\F715"}.mdi-signal-off:before{content:"\F782"}.mdi-signal-variant:before{content:"\F60A"}.mdi-silverware:before{content:"\F4A3"}.mdi-silverware-fork:before{content:"\F4A4"}.mdi-silverware-spoon:before{content:"\F4A5"}.mdi-silverware-variant:before{content:"\F4A6"}.mdi-sim:before{content:"\F4A7"}.mdi-sim-alert:before{content:"\F4A8"}.mdi-sim-off:before{content:"\F4A9"}.mdi-sitemap:before{content:"\F4AA"}.mdi-skip-backward:before{content:"\F4AB"}.mdi-skip-forward:before{content:"\F4AC"}.mdi-skip-next:before{content:"\F4AD"}.mdi-skip-next-circle:before{content:"\F661"}.mdi-skip-next-circle-outline:before{content:"\F662"}.mdi-skip-previous:before{content:"\F4AE"}.mdi-skip-previous-circle:before{content:"\F663"}.mdi-skip-previous-circle-outline:before{content:"\F664"}.mdi-skull:before{content:"\F68B"}.mdi-skype:before{content:"\F4AF"}.mdi-skype-business:before{content:"\F4B0"}.mdi-slack:before{content:"\F4B1"}.mdi-sleep:before{content:"\F4B2"}.mdi-sleep-off:before{content:"\F4B3"}.mdi-smoking:before{content:"\F4B4"}.mdi-smoking-off:before{content:"\F4B5"}.mdi-snapchat:before{content:"\F4B6"}.mdi-snowflake:before{content:"\F716"}.mdi-snowman:before{content:"\F4B7"}.mdi-soccer:before{content:"\F4B8"}.mdi-sofa:before{content:"\F4B9"}.mdi-solid:before{content:"\F68C"}.mdi-sort:before{content:"\F4BA"}.mdi-sort-alphabetical:before{content:"\F4BB"}.mdi-sort-ascending:before{content:"\F4BC"}.mdi-sort-descending:before{content:"\F4BD"}.mdi-sort-numeric:before{content:"\F4BE"}.mdi-sort-variant:before{content:"\F4BF"}.mdi-soundcloud:before{content:"\F4C0"}.mdi-source-branch:before{content:"\F62C"}.mdi-source-commit:before{content:"\F717"}.mdi-source-commit-end:before{content:"\F718"}.mdi-source-commit-end-local:before{content:"\F719"}.mdi-source-commit-local:before{content:"\F71A"}.mdi-source-commit-next-local:before{content:"\F71B"}.mdi-source-commit-start:before{content:"\F71C"}.mdi-source-commit-start-next-local:before{content:"\F71D"}.mdi-source-fork:before{content:"\F4C1"}.mdi-source-merge:before{content:"\F62D"}.mdi-source-pull:before{content:"\F4C2"}.mdi-speaker:before{content:"\F4C3"}.mdi-speaker-off:before{content:"\F4C4"}.mdi-speaker-wireless:before{content:"\F71E"}.mdi-speedometer:before{content:"\F4C5"}.mdi-spellcheck:before{content:"\F4C6"}.mdi-spotify:before{content:"\F4C7"}.mdi-spotlight:before{content:"\F4C8"}.mdi-spotlight-beam:before{content:"\F4C9"}.mdi-spray:before{content:"\F665"}.mdi-square:before{content:"\F763"}.mdi-square-inc:before{content:"\F4CA"}.mdi-square-inc-cash:before{content:"\F4CB"}.mdi-square-outline:before{content:"\F762"}.mdi-square-root:before{content:"\F783"}.mdi-stackexchange:before{content:"\F60B"}.mdi-stackoverflow:before{content:"\F4CC"}.mdi-stadium:before{content:"\F71F"}.mdi-stairs:before{content:"\F4CD"}.mdi-star:before{content:"\F4CE"}.mdi-star-circle:before{content:"\F4CF"}.mdi-star-half:before{content:"\F4D0"}.mdi-star-off:before{content:"\F4D1"}.mdi-star-outline:before{content:"\F4D2"}.mdi-steam:before{content:"\F4D3"}.mdi-steering:before{content:"\F4D4"}.mdi-step-backward:before{content:"\F4D5"}.mdi-step-backward-2:before{content:"\F4D6"}.mdi-step-forward:before{content:"\F4D7"}.mdi-step-forward-2:before{content:"\F4D8"}.mdi-stethoscope:before{content:"\F4D9"}.mdi-sticker:before{content:"\F5D0"}.mdi-sticker-emoji:before{content:"\F784"}.mdi-stocking:before{content:"\F4DA"}.mdi-stop:before{content:"\F4DB"}.mdi-stop-circle:before{content:"\F666"}.mdi-stop-circle-outline:before{content:"\F667"}.mdi-store:before{content:"\F4DC"}.mdi-store-24-hour:before{content:"\F4DD"}.mdi-stove:before{content:"\F4DE"}.mdi-subdirectory-arrow-left:before{content:"\F60C"}.mdi-subdirectory-arrow-right:before{content:"\F60D"}.mdi-subway:before{content:"\F6AB"}.mdi-subway-variant:before{content:"\F4DF"}.mdi-summit:before{content:"\F785"}.mdi-sunglasses:before{content:"\F4E0"}.mdi-surround-sound:before{content:"\F5C5"}.mdi-svg:before{content:"\F720"}.mdi-swap-horizontal:before{content:"\F4E1"}.mdi-swap-vertical:before{content:"\F4E2"}.mdi-swim:before{content:"\F4E3"}.mdi-switch:before{content:"\F4E4"}.mdi-sword:before{content:"\F4E5"}.mdi-sword-cross:before{content:"\F786"}.mdi-sync:before{content:"\F4E6"}.mdi-sync-alert:before{content:"\F4E7"}.mdi-sync-off:before{content:"\F4E8"}.mdi-tab:before{content:"\F4E9"}.mdi-tab-plus:before{content:"\F75B"}.mdi-tab-unselected:before{content:"\F4EA"}.mdi-table:before{content:"\F4EB"}.mdi-table-column-plus-after:before{content:"\F4EC"}.mdi-table-column-plus-before:before{content:"\F4ED"}.mdi-table-column-remove:before{content:"\F4EE"}.mdi-table-column-width:before{content:"\F4EF"}.mdi-table-edit:before{content:"\F4F0"}.mdi-table-large:before{content:"\F4F1"}.mdi-table-row-height:before{content:"\F4F2"}.mdi-table-row-plus-after:before{content:"\F4F3"}.mdi-table-row-plus-before:before{content:"\F4F4"}.mdi-table-row-remove:before{content:"\F4F5"}.mdi-tablet:before{content:"\F4F6"}.mdi-tablet-android:before{content:"\F4F7"}.mdi-tablet-ipad:before{content:"\F4F8"}.mdi-taco:before{content:"\F761"}.mdi-tag:before{content:"\F4F9"}.mdi-tag-faces:before{content:"\F4FA"}.mdi-tag-heart:before{content:"\F68A"}.mdi-tag-multiple:before{content:"\F4FB"}.mdi-tag-outline:before{content:"\F4FC"}.mdi-tag-plus:before{content:"\F721"}.mdi-tag-remove:before{content:"\F722"}.mdi-tag-text-outline:before{content:"\F4FD"}.mdi-target:before{content:"\F4FE"}.mdi-taxi:before{content:"\F4FF"}.mdi-teamviewer:before{content:"\F500"}.mdi-telegram:before{content:"\F501"}.mdi-television:before{content:"\F502"}.mdi-television-guide:before{content:"\F503"}.mdi-temperature-celsius:before{content:"\F504"}.mdi-temperature-fahrenheit:before{content:"\F505"}.mdi-temperature-kelvin:before{content:"\F506"}.mdi-tennis:before{content:"\F507"}.mdi-tent:before{content:"\F508"}.mdi-terrain:before{content:"\F509"}.mdi-test-tube:before{content:"\F668"}.mdi-text-shadow:before{content:"\F669"}.mdi-text-to-speech:before{content:"\F50A"}.mdi-text-to-speech-off:before{content:"\F50B"}.mdi-textbox:before{content:"\F60E"}.mdi-texture:before{content:"\F50C"}.mdi-theater:before{content:"\F50D"}.mdi-theme-light-dark:before{content:"\F50E"}.mdi-thermometer:before{content:"\F50F"}.mdi-thermometer-lines:before{content:"\F510"}.mdi-thumb-down:before{content:"\F511"}.mdi-thumb-down-outline:before{content:"\F512"}.mdi-thumb-up:before{content:"\F513"}.mdi-thumb-up-outline:before{content:"\F514"}.mdi-thumbs-up-down:before{content:"\F515"}.mdi-ticket:before{content:"\F516"}.mdi-ticket-account:before{content:"\F517"}.mdi-ticket-confirmation:before{content:"\F518"}.mdi-ticket-percent:before{content:"\F723"}.mdi-tie:before{content:"\F519"}.mdi-tilde:before{content:"\F724"}.mdi-timelapse:before{content:"\F51A"}.mdi-timer:before{content:"\F51B"}.mdi-timer-10:before{content:"\F51C"}.mdi-timer-3:before{content:"\F51D"}.mdi-timer-off:before{content:"\F51E"}.mdi-timer-sand:before{content:"\F51F"}.mdi-timer-sand-empty:before{content:"\F6AC"}.mdi-timer-sand-full:before{content:"\F78B"}.mdi-timetable:before{content:"\F520"}.mdi-toggle-switch:before{content:"\F521"}.mdi-toggle-switch-off:before{content:"\F522"}.mdi-tooltip:before{content:"\F523"}.mdi-tooltip-edit:before{content:"\F524"}.mdi-tooltip-image:before{content:"\F525"}.mdi-tooltip-outline:before{content:"\F526"}.mdi-tooltip-outline-plus:before{content:"\F527"}.mdi-tooltip-text:before{content:"\F528"}.mdi-tooth:before{content:"\F529"}.mdi-tor:before{content:"\F52A"}.mdi-tower-beach:before{content:"\F680"}.mdi-tower-fire:before{content:"\F681"}.mdi-traffic-light:before{content:"\F52B"}.mdi-train:before{content:"\F52C"}.mdi-tram:before{content:"\F52D"}.mdi-transcribe:before{content:"\F52E"}.mdi-transcribe-close:before{content:"\F52F"}.mdi-transfer:before{content:"\F530"}.mdi-transit-transfer:before{content:"\F6AD"}.mdi-translate:before{content:"\F5CA"}.mdi-treasure-chest:before{content:"\F725"}.mdi-tree:before{content:"\F531"}.mdi-trello:before{content:"\F532"}.mdi-trending-down:before{content:"\F533"}.mdi-trending-neutral:before{content:"\F534"}.mdi-trending-up:before{content:"\F535"}.mdi-triangle:before{content:"\F536"}.mdi-triangle-outline:before{content:"\F537"}.mdi-trophy:before{content:"\F538"}.mdi-trophy-award:before{content:"\F539"}.mdi-trophy-outline:before{content:"\F53A"}.mdi-trophy-variant:before{content:"\F53B"}.mdi-trophy-variant-outline:before{content:"\F53C"}.mdi-truck:before{content:"\F53D"}.mdi-truck-delivery:before{content:"\F53E"}.mdi-truck-fast:before{content:"\F787"}.mdi-truck-trailer:before{content:"\F726"}.mdi-tshirt-crew:before{content:"\F53F"}.mdi-tshirt-v:before{content:"\F540"}.mdi-tumblr:before{content:"\F541"}.mdi-tumblr-reblog:before{content:"\F542"}.mdi-tune:before{content:"\F62E"}.mdi-tune-vertical:before{content:"\F66A"}.mdi-twitch:before{content:"\F543"}.mdi-twitter:before{content:"\F544"}.mdi-twitter-box:before{content:"\F545"}.mdi-twitter-circle:before{content:"\F546"}.mdi-twitter-retweet:before{content:"\F547"}.mdi-uber:before{content:"\F748"}.mdi-ubuntu:before{content:"\F548"}.mdi-umbraco:before{content:"\F549"}.mdi-umbrella:before{content:"\F54A"}.mdi-umbrella-outline:before{content:"\F54B"}.mdi-undo:before{content:"\F54C"}.mdi-undo-variant:before{content:"\F54D"}.mdi-unfold-less-horizontal:before{content:"\F54E"}.mdi-unfold-less-vertical:before{content:"\F75F"}.mdi-unfold-more-horizontal:before{content:"\F54F"}.mdi-unfold-more-vertical:before{content:"\F760"}.mdi-ungroup:before{content:"\F550"}.mdi-unity:before{content:"\F6AE"}.mdi-untappd:before{content:"\F551"}.mdi-update:before{content:"\F6AF"}.mdi-upload:before{content:"\F552"}.mdi-upload-network:before{content:"\F6F5"}.mdi-usb:before{content:"\F553"}.mdi-vector-arrange-above:before{content:"\F554"}.mdi-vector-arrange-below:before{content:"\F555"}.mdi-vector-circle:before{content:"\F556"}.mdi-vector-circle-variant:before{content:"\F557"}.mdi-vector-combine:before{content:"\F558"}.mdi-vector-curve:before{content:"\F559"}.mdi-vector-difference:before{content:"\F55A"}.mdi-vector-difference-ab:before{content:"\F55B"}.mdi-vector-difference-ba:before{content:"\F55C"}.mdi-vector-intersection:before{content:"\F55D"}.mdi-vector-line:before{content:"\F55E"}.mdi-vector-point:before{content:"\F55F"}.mdi-vector-polygon:before{content:"\F560"}.mdi-vector-polyline:before{content:"\F561"}.mdi-vector-radius:before{content:"\F749"}.mdi-vector-rectangle:before{content:"\F5C6"}.mdi-vector-selection:before{content:"\F562"}.mdi-vector-square:before{content:"\F001"}.mdi-vector-triangle:before{content:"\F563"}.mdi-vector-union:before{content:"\F564"}.mdi-verified:before{content:"\F565"}.mdi-vibrate:before{content:"\F566"}.mdi-video:before{content:"\F567"}.mdi-video-off:before{content:"\F568"}.mdi-video-switch:before{content:"\F569"}.mdi-view-agenda:before{content:"\F56A"}.mdi-view-array:before{content:"\F56B"}.mdi-view-carousel:before{content:"\F56C"}.mdi-view-column:before{content:"\F56D"}.mdi-view-dashboard:before{content:"\F56E"}.mdi-view-day:before{content:"\F56F"}.mdi-view-grid:before{content:"\F570"}.mdi-view-headline:before{content:"\F571"}.mdi-view-list:before{content:"\F572"}.mdi-view-module:before{content:"\F573"}.mdi-view-parallel:before{content:"\F727"}.mdi-view-quilt:before{content:"\F574"}.mdi-view-sequential:before{content:"\F728"}.mdi-view-stream:before{content:"\F575"}.mdi-view-week:before{content:"\F576"}.mdi-vimeo:before{content:"\F577"}.mdi-vine:before{content:"\F578"}.mdi-violin:before{content:"\F60F"}.mdi-visualstudio:before{content:"\F610"}.mdi-vk:before{content:"\F579"}.mdi-vk-box:before{content:"\F57A"}.mdi-vk-circle:before{content:"\F57B"}.mdi-vlc:before{content:"\F57C"}.mdi-voice:before{content:"\F5CB"}.mdi-voicemail:before{content:"\F57D"}.mdi-volume-high:before{content:"\F57E"}.mdi-volume-low:before{content:"\F57F"}.mdi-volume-medium:before{content:"\F580"}.mdi-volume-minus:before{content:"\F75D"}.mdi-volume-mute:before{content:"\F75E"}.mdi-volume-off:before{content:"\F581"}.mdi-volume-plus:before{content:"\F75C"}.mdi-vpn:before{content:"\F582"}.mdi-walk:before{content:"\F583"}.mdi-wallet:before{content:"\F584"}.mdi-wallet-giftcard:before{content:"\F585"}.mdi-wallet-membership:before{content:"\F586"}.mdi-wallet-travel:before{content:"\F587"}.mdi-wan:before{content:"\F588"}.mdi-washing-machine:before{content:"\F729"}.mdi-watch:before{content:"\F589"}.mdi-watch-export:before{content:"\F58A"}.mdi-watch-import:before{content:"\F58B"}.mdi-watch-vibrate:before{content:"\F6B0"}.mdi-water:before{content:"\F58C"}.mdi-water-off:before{content:"\F58D"}.mdi-water-percent:before{content:"\F58E"}.mdi-water-pump:before{content:"\F58F"}.mdi-watermark:before{content:"\F612"}.mdi-waves:before{content:"\F78C"}.mdi-weather-cloudy:before{content:"\F590"}.mdi-weather-fog:before{content:"\F591"}.mdi-weather-hail:before{content:"\F592"}.mdi-weather-lightning:before{content:"\F593"}.mdi-weather-lightning-rainy:before{content:"\F67D"}.mdi-weather-night:before{content:"\F594"}.mdi-weather-partlycloudy:before{content:"\F595"}.mdi-weather-pouring:before{content:"\F596"}.mdi-weather-rainy:before{content:"\F597"}.mdi-weather-snowy:before{content:"\F598"}.mdi-weather-snowy-rainy:before{content:"\F67E"}.mdi-weather-sunny:before{content:"\F599"}.mdi-weather-sunset:before{content:"\F59A"}.mdi-weather-sunset-down:before{content:"\F59B"}.mdi-weather-sunset-up:before{content:"\F59C"}.mdi-weather-windy:before{content:"\F59D"}.mdi-weather-windy-variant:before{content:"\F59E"}.mdi-web:before{content:"\F59F"}.mdi-webcam:before{content:"\F5A0"}.mdi-webhook:before{content:"\F62F"}.mdi-webpack:before{content:"\F72A"}.mdi-wechat:before{content:"\F611"}.mdi-weight:before{content:"\F5A1"}.mdi-weight-kilogram:before{content:"\F5A2"}.mdi-whatsapp:before{content:"\F5A3"}.mdi-wheelchair-accessibility:before{content:"\F5A4"}.mdi-white-balance-auto:before{content:"\F5A5"}.mdi-white-balance-incandescent:before{content:"\F5A6"}.mdi-white-balance-iridescent:before{content:"\F5A7"}.mdi-white-balance-sunny:before{content:"\F5A8"}.mdi-widgets:before{content:"\F72B"}.mdi-wifi:before{content:"\F5A9"}.mdi-wifi-off:before{content:"\F5AA"}.mdi-wii:before{content:"\F5AB"}.mdi-wiiu:before{content:"\F72C"}.mdi-wikipedia:before{content:"\F5AC"}.mdi-window-close:before{content:"\F5AD"}.mdi-window-closed:before{content:"\F5AE"}.mdi-window-maximize:before{content:"\F5AF"}.mdi-window-minimize:before{content:"\F5B0"}.mdi-window-open:before{content:"\F5B1"}.mdi-window-restore:before{content:"\F5B2"}.mdi-windows:before{content:"\F5B3"}.mdi-wordpress:before{content:"\F5B4"}.mdi-worker:before{content:"\F5B5"}.mdi-wrap:before{content:"\F5B6"}.mdi-wrench:before{content:"\F5B7"}.mdi-wunderlist:before{content:"\F5B8"}.mdi-xaml:before{content:"\F673"}.mdi-xbox:before{content:"\F5B9"}.mdi-xbox-controller:before{content:"\F5BA"}.mdi-xbox-controller-battery-alert:before{content:"\F74A"}.mdi-xbox-controller-battery-empty:before{content:"\F74B"}.mdi-xbox-controller-battery-full:before{content:"\F74C"}.mdi-xbox-controller-battery-low:before{content:"\F74D"}.mdi-xbox-controller-battery-medium:before{content:"\F74E"}.mdi-xbox-controller-battery-unknown:before{content:"\F74F"}.mdi-xbox-controller-off:before{content:"\F5BB"}.mdi-xda:before{content:"\F5BC"}.mdi-xing:before{content:"\F5BD"}.mdi-xing-box:before{content:"\F5BE"}.mdi-xing-circle:before{content:"\F5BF"}.mdi-xml:before{content:"\F5C0"}.mdi-yammer:before{content:"\F788"}.mdi-yeast:before{content:"\F5C1"}.mdi-yelp:before{content:"\F5C2"}.mdi-yin-yang:before{content:"\F67F"}.mdi-youtube-play:before{content:"\F5C3"}.mdi-zip-box:before{content:"\F5C4"}.mdi-18px.mdi-set,.mdi-18px.mdi:before{font-size:18px}.mdi-24px.mdi-set,.mdi-24px.mdi:before{font-size:24px}.mdi-36px.mdi-set,.mdi-36px.mdi:before{font-size:36px}.mdi-48px.mdi-set,.mdi-48px.mdi:before{font-size:48px}.mdi-dark:before{color:rgba(0,0,0,.54)}.mdi-dark.mdi-inactive:before{color:rgba(0,0,0,.26)}.mdi-light:before{color:#fff}.mdi-light.mdi-inactive:before{color:rgba(255,255,255,.3)}.mdi-rotate-45:before{transform:rotate(45deg)}.mdi-rotate-90:before{transform:rotate(90deg)}.mdi-rotate-135:before{transform:rotate(135deg)}.mdi-rotate-180:before{transform:rotate(180deg)}.mdi-rotate-225:before{transform:rotate(225deg)}.mdi-rotate-270:before{transform:rotate(270deg)}.mdi-rotate-315:before{transform:rotate(315deg)}.mdi-flip-h:before{transform:scaleX(-1);filter:FlipH;-ms-filter:FlipH}.mdi-flip-v:before{transform:scaleY(-1);filter:FlipV;-ms-filter:FlipV}.mdi-spin:before{animation:mdi-spin 2s infinite linear}@keyframes mdi-spin{0%{transform:rotate(0)}100%{transform:rotate(359deg)}}.flag-icon-background{background-size:contain;background-position:50%;background-repeat:no-repeat}.flag-icon{background-size:contain;background-position:50%;background-repeat:no-repeat;position:relative;display:inline-block;width:1.33333333em;line-height:1em}.flag-icon:before{content:'\00a0'}.flag-icon.flag-icon-squared{width:1em}.flag-icon-ad{background-image:url(../flags/4x3/ad.svg)}.flag-icon-ad.flag-icon-squared{background-image:url(../flags/1x1/ad.svg)}.flag-icon-ae{background-image:url(../flags/4x3/ae.svg)}.flag-icon-ae.flag-icon-squared{background-image:url(../flags/1x1/ae.svg)}.flag-icon-af{background-image:url(../flags/4x3/af.svg)}.flag-icon-af.flag-icon-squared{background-image:url(../flags/1x1/af.svg)}.flag-icon-ag{background-image:url(../flags/4x3/ag.svg)}.flag-icon-ag.flag-icon-squared{background-image:url(../flags/1x1/ag.svg)}.flag-icon-ai{background-image:url(../flags/4x3/ai.svg)}.flag-icon-ai.flag-icon-squared{background-image:url(../flags/1x1/ai.svg)}.flag-icon-al{background-image:url(../flags/4x3/al.svg)}.flag-icon-al.flag-icon-squared{background-image:url(../flags/1x1/al.svg)}.flag-icon-am{background-image:url(../flags/4x3/am.svg)}.flag-icon-am.flag-icon-squared{background-image:url(../flags/1x1/am.svg)}.flag-icon-ao{background-image:url(../flags/4x3/ao.svg)}.flag-icon-ao.flag-icon-squared{background-image:url(../flags/1x1/ao.svg)}.flag-icon-aq{background-image:url(../flags/4x3/aq.svg)}.flag-icon-aq.flag-icon-squared{background-image:url(../flags/1x1/aq.svg)}.flag-icon-ar{background-image:url(../flags/4x3/ar.svg)}.flag-icon-ar.flag-icon-squared{background-image:url(../flags/1x1/ar.svg)}.flag-icon-as{background-image:url(../flags/4x3/as.svg)}.flag-icon-as.flag-icon-squared{background-image:url(../flags/1x1/as.svg)}.flag-icon-at{background-image:url(../flags/4x3/at.svg)}.flag-icon-at.flag-icon-squared{background-image:url(../flags/1x1/at.svg)}.flag-icon-au{background-image:url(../flags/4x3/au.svg)}.flag-icon-au.flag-icon-squared{background-image:url(../flags/1x1/au.svg)}.flag-icon-aw{background-image:url(../flags/4x3/aw.svg)}.flag-icon-aw.flag-icon-squared{background-image:url(../flags/1x1/aw.svg)}.flag-icon-ax{background-image:url(../flags/4x3/ax.svg)}.flag-icon-ax.flag-icon-squared{background-image:url(../flags/1x1/ax.svg)}.flag-icon-az{background-image:url(../flags/4x3/az.svg)}.flag-icon-az.flag-icon-squared{background-image:url(../flags/1x1/az.svg)}.flag-icon-ba{background-image:url(../flags/4x3/ba.svg)}.flag-icon-ba.flag-icon-squared{background-image:url(../flags/1x1/ba.svg)}.flag-icon-bb{background-image:url(../flags/4x3/bb.svg)}.flag-icon-bb.flag-icon-squared{background-image:url(../flags/1x1/bb.svg)}.flag-icon-bd{background-image:url(../flags/4x3/bd.svg)}.flag-icon-bd.flag-icon-squared{background-image:url(../flags/1x1/bd.svg)}.flag-icon-be{background-image:url(../flags/4x3/be.svg)}.flag-icon-be.flag-icon-squared{background-image:url(../flags/1x1/be.svg)}.flag-icon-bf{background-image:url(../flags/4x3/bf.svg)}.flag-icon-bf.flag-icon-squared{background-image:url(../flags/1x1/bf.svg)}.flag-icon-bg{background-image:url(../flags/4x3/bg.svg)}.flag-icon-bg.flag-icon-squared{background-image:url(../flags/1x1/bg.svg)}.flag-icon-bh{background-image:url(../flags/4x3/bh.svg)}.flag-icon-bh.flag-icon-squared{background-image:url(../flags/1x1/bh.svg)}.flag-icon-bi{background-image:url(../flags/4x3/bi.svg)}.flag-icon-bi.flag-icon-squared{background-image:url(../flags/1x1/bi.svg)}.flag-icon-bj{background-image:url(../flags/4x3/bj.svg)}.flag-icon-bj.flag-icon-squared{background-image:url(../flags/1x1/bj.svg)}.flag-icon-bl{background-image:url(../flags/4x3/bl.svg)}.flag-icon-bl.flag-icon-squared{background-image:url(../flags/1x1/bl.svg)}.flag-icon-bm{background-image:url(../flags/4x3/bm.svg)}.flag-icon-bm.flag-icon-squared{background-image:url(../flags/1x1/bm.svg)}.flag-icon-bn{background-image:url(../flags/4x3/bn.svg)}.flag-icon-bn.flag-icon-squared{background-image:url(../flags/1x1/bn.svg)}.flag-icon-bo{background-image:url(../flags/4x3/bo.svg)}.flag-icon-bo.flag-icon-squared{background-image:url(../flags/1x1/bo.svg)}.flag-icon-bq{background-image:url(../flags/4x3/bq.svg)}.flag-icon-bq.flag-icon-squared{background-image:url(../flags/1x1/bq.svg)}.flag-icon-br{background-image:url(../flags/4x3/br.svg)}.flag-icon-br.flag-icon-squared{background-image:url(../flags/1x1/br.svg)}.flag-icon-bs{background-image:url(../flags/4x3/bs.svg)}.flag-icon-bs.flag-icon-squared{background-image:url(../flags/1x1/bs.svg)}.flag-icon-bt{background-image:url(../flags/4x3/bt.svg)}.flag-icon-bt.flag-icon-squared{background-image:url(../flags/1x1/bt.svg)}.flag-icon-bv{background-image:url(../flags/4x3/bv.svg)}.flag-icon-bv.flag-icon-squared{background-image:url(../flags/1x1/bv.svg)}.flag-icon-bw{background-image:url(../flags/4x3/bw.svg)}.flag-icon-bw.flag-icon-squared{background-image:url(../flags/1x1/bw.svg)}.flag-icon-by{background-image:url(../flags/4x3/by.svg)}.flag-icon-by.flag-icon-squared{background-image:url(../flags/1x1/by.svg)}.flag-icon-bz{background-image:url(../flags/4x3/bz.svg)}.flag-icon-bz.flag-icon-squared{background-image:url(../flags/1x1/bz.svg)}.flag-icon-ca{background-image:url(../flags/4x3/ca.svg)}.flag-icon-ca.flag-icon-squared{background-image:url(../flags/1x1/ca.svg)}.flag-icon-cc{background-image:url(../flags/4x3/cc.svg)}.flag-icon-cc.flag-icon-squared{background-image:url(../flags/1x1/cc.svg)}.flag-icon-cd{background-image:url(../flags/4x3/cd.svg)}.flag-icon-cd.flag-icon-squared{background-image:url(../flags/1x1/cd.svg)}.flag-icon-cf{background-image:url(../flags/4x3/cf.svg)}.flag-icon-cf.flag-icon-squared{background-image:url(../flags/1x1/cf.svg)}.flag-icon-cg{background-image:url(../flags/4x3/cg.svg)}.flag-icon-cg.flag-icon-squared{background-image:url(../flags/1x1/cg.svg)}.flag-icon-ch{background-image:url(../flags/4x3/ch.svg)}.flag-icon-ch.flag-icon-squared{background-image:url(../flags/1x1/ch.svg)}.flag-icon-ci{background-image:url(../flags/4x3/ci.svg)}.flag-icon-ci.flag-icon-squared{background-image:url(../flags/1x1/ci.svg)}.flag-icon-ck{background-image:url(../flags/4x3/ck.svg)}.flag-icon-ck.flag-icon-squared{background-image:url(../flags/1x1/ck.svg)}.flag-icon-cl{background-image:url(../flags/4x3/cl.svg)}.flag-icon-cl.flag-icon-squared{background-image:url(../flags/1x1/cl.svg)}.flag-icon-cm{background-image:url(../flags/4x3/cm.svg)}.flag-icon-cm.flag-icon-squared{background-image:url(../flags/1x1/cm.svg)}.flag-icon-cn{background-image:url(../flags/4x3/cn.svg)}.flag-icon-cn.flag-icon-squared{background-image:url(../flags/1x1/cn.svg)}.flag-icon-co{background-image:url(../flags/4x3/co.svg)}.flag-icon-co.flag-icon-squared{background-image:url(../flags/1x1/co.svg)}.flag-icon-cr{background-image:url(../flags/4x3/cr.svg)}.flag-icon-cr.flag-icon-squared{background-image:url(../flags/1x1/cr.svg)}.flag-icon-cu{background-image:url(../flags/4x3/cu.svg)}.flag-icon-cu.flag-icon-squared{background-image:url(../flags/1x1/cu.svg)}.flag-icon-cv{background-image:url(../flags/4x3/cv.svg)}.flag-icon-cv.flag-icon-squared{background-image:url(../flags/1x1/cv.svg)}.flag-icon-cw{background-image:url(../flags/4x3/cw.svg)}.flag-icon-cw.flag-icon-squared{background-image:url(../flags/1x1/cw.svg)}.flag-icon-cx{background-image:url(../flags/4x3/cx.svg)}.flag-icon-cx.flag-icon-squared{background-image:url(../flags/1x1/cx.svg)}.flag-icon-cy{background-image:url(../flags/4x3/cy.svg)}.flag-icon-cy.flag-icon-squared{background-image:url(../flags/1x1/cy.svg)}.flag-icon-cz{background-image:url(../flags/4x3/cz.svg)}.flag-icon-cz.flag-icon-squared{background-image:url(../flags/1x1/cz.svg)}.flag-icon-de{background-image:url(../flags/4x3/de.svg)}.flag-icon-de.flag-icon-squared{background-image:url(../flags/1x1/de.svg)}.flag-icon-dj{background-image:url(../flags/4x3/dj.svg)}.flag-icon-dj.flag-icon-squared{background-image:url(../flags/1x1/dj.svg)}.flag-icon-dk{background-image:url(../flags/4x3/dk.svg)}.flag-icon-dk.flag-icon-squared{background-image:url(../flags/1x1/dk.svg)}.flag-icon-dm{background-image:url(../flags/4x3/dm.svg)}.flag-icon-dm.flag-icon-squared{background-image:url(../flags/1x1/dm.svg)}.flag-icon-do{background-image:url(../flags/4x3/do.svg)}.flag-icon-do.flag-icon-squared{background-image:url(../flags/1x1/do.svg)}.flag-icon-dz{background-image:url(../flags/4x3/dz.svg)}.flag-icon-dz.flag-icon-squared{background-image:url(../flags/1x1/dz.svg)}.flag-icon-ec{background-image:url(../flags/4x3/ec.svg)}.flag-icon-ec.flag-icon-squared{background-image:url(../flags/1x1/ec.svg)}.flag-icon-ee{background-image:url(../flags/4x3/ee.svg)}.flag-icon-ee.flag-icon-squared{background-image:url(../flags/1x1/ee.svg)}.flag-icon-eg{background-image:url(../flags/4x3/eg.svg)}.flag-icon-eg.flag-icon-squared{background-image:url(../flags/1x1/eg.svg)}.flag-icon-eh{background-image:url(../flags/4x3/eh.svg)}.flag-icon-eh.flag-icon-squared{background-image:url(../flags/1x1/eh.svg)}.flag-icon-er{background-image:url(../flags/4x3/er.svg)}.flag-icon-er.flag-icon-squared{background-image:url(../flags/1x1/er.svg)}.flag-icon-es{background-image:url(../flags/4x3/es.svg)}.flag-icon-es.flag-icon-squared{background-image:url(../flags/1x1/es.svg)}.flag-icon-et{background-image:url(../flags/4x3/et.svg)}.flag-icon-et.flag-icon-squared{background-image:url(../flags/1x1/et.svg)}.flag-icon-fi{background-image:url(../flags/4x3/fi.svg)}.flag-icon-fi.flag-icon-squared{background-image:url(../flags/1x1/fi.svg)}.flag-icon-fj{background-image:url(../flags/4x3/fj.svg)}.flag-icon-fj.flag-icon-squared{background-image:url(../flags/1x1/fj.svg)}.flag-icon-fk{background-image:url(../flags/4x3/fk.svg)}.flag-icon-fk.flag-icon-squared{background-image:url(../flags/1x1/fk.svg)}.flag-icon-fm{background-image:url(../flags/4x3/fm.svg)}.flag-icon-fm.flag-icon-squared{background-image:url(../flags/1x1/fm.svg)}.flag-icon-fo{background-image:url(../flags/4x3/fo.svg)}.flag-icon-fo.flag-icon-squared{background-image:url(../flags/1x1/fo.svg)}.flag-icon-fr{background-image:url(../flags/4x3/fr.svg)}.flag-icon-fr.flag-icon-squared{background-image:url(../flags/1x1/fr.svg)}.flag-icon-ga{background-image:url(../flags/4x3/ga.svg)}.flag-icon-ga.flag-icon-squared{background-image:url(../flags/1x1/ga.svg)}.flag-icon-gb{background-image:url(../flags/4x3/gb.svg)}.flag-icon-gb.flag-icon-squared{background-image:url(../flags/1x1/gb.svg)}.flag-icon-gd{background-image:url(../flags/4x3/gd.svg)}.flag-icon-gd.flag-icon-squared{background-image:url(../flags/1x1/gd.svg)}.flag-icon-ge{background-image:url(../flags/4x3/ge.svg)}.flag-icon-ge.flag-icon-squared{background-image:url(../flags/1x1/ge.svg)}.flag-icon-gf{background-image:url(../flags/4x3/gf.svg)}.flag-icon-gf.flag-icon-squared{background-image:url(../flags/1x1/gf.svg)}.flag-icon-gg{background-image:url(../flags/4x3/gg.svg)}.flag-icon-gg.flag-icon-squared{background-image:url(../flags/1x1/gg.svg)}.flag-icon-gh{background-image:url(../flags/4x3/gh.svg)}.flag-icon-gh.flag-icon-squared{background-image:url(../flags/1x1/gh.svg)}.flag-icon-gi{background-image:url(../flags/4x3/gi.svg)}.flag-icon-gi.flag-icon-squared{background-image:url(../flags/1x1/gi.svg)}.flag-icon-gl{background-image:url(../flags/4x3/gl.svg)}.flag-icon-gl.flag-icon-squared{background-image:url(../flags/1x1/gl.svg)}.flag-icon-gm{background-image:url(../flags/4x3/gm.svg)}.flag-icon-gm.flag-icon-squared{background-image:url(../flags/1x1/gm.svg)}.flag-icon-gn{background-image:url(../flags/4x3/gn.svg)}.flag-icon-gn.flag-icon-squared{background-image:url(../flags/1x1/gn.svg)}.flag-icon-gp{background-image:url(../flags/4x3/gp.svg)}.flag-icon-gp.flag-icon-squared{background-image:url(../flags/1x1/gp.svg)}.flag-icon-gq{background-image:url(../flags/4x3/gq.svg)}.flag-icon-gq.flag-icon-squared{background-image:url(../flags/1x1/gq.svg)}.flag-icon-gr{background-image:url(../flags/4x3/gr.svg)}.flag-icon-gr.flag-icon-squared{background-image:url(../flags/1x1/gr.svg)}.flag-icon-gs{background-image:url(../flags/4x3/gs.svg)}.flag-icon-gs.flag-icon-squared{background-image:url(../flags/1x1/gs.svg)}.flag-icon-gt{background-image:url(../flags/4x3/gt.svg)}.flag-icon-gt.flag-icon-squared{background-image:url(../flags/1x1/gt.svg)}.flag-icon-gu{background-image:url(../flags/4x3/gu.svg)}.flag-icon-gu.flag-icon-squared{background-image:url(../flags/1x1/gu.svg)}.flag-icon-gw{background-image:url(../flags/4x3/gw.svg)}.flag-icon-gw.flag-icon-squared{background-image:url(../flags/1x1/gw.svg)}.flag-icon-gy{background-image:url(../flags/4x3/gy.svg)}.flag-icon-gy.flag-icon-squared{background-image:url(../flags/1x1/gy.svg)}.flag-icon-hk{background-image:url(../flags/4x3/hk.svg)}.flag-icon-hk.flag-icon-squared{background-image:url(../flags/1x1/hk.svg)}.flag-icon-hm{background-image:url(../flags/4x3/hm.svg)}.flag-icon-hm.flag-icon-squared{background-image:url(../flags/1x1/hm.svg)}.flag-icon-hn{background-image:url(../flags/4x3/hn.svg)}.flag-icon-hn.flag-icon-squared{background-image:url(../flags/1x1/hn.svg)}.flag-icon-hr{background-image:url(../flags/4x3/hr.svg)}.flag-icon-hr.flag-icon-squared{background-image:url(../flags/1x1/hr.svg)}.flag-icon-ht{background-image:url(../flags/4x3/ht.svg)}.flag-icon-ht.flag-icon-squared{background-image:url(../flags/1x1/ht.svg)}.flag-icon-hu{background-image:url(../flags/4x3/hu.svg)}.flag-icon-hu.flag-icon-squared{background-image:url(../flags/1x1/hu.svg)}.flag-icon-id{background-image:url(../flags/4x3/id.svg)}.flag-icon-id.flag-icon-squared{background-image:url(../flags/1x1/id.svg)}.flag-icon-ie{background-image:url(../flags/4x3/ie.svg)}.flag-icon-ie.flag-icon-squared{background-image:url(../flags/1x1/ie.svg)}.flag-icon-il{background-image:url(../flags/4x3/il.svg)}.flag-icon-il.flag-icon-squared{background-image:url(../flags/1x1/il.svg)}.flag-icon-im{background-image:url(../flags/4x3/im.svg)}.flag-icon-im.flag-icon-squared{background-image:url(../flags/1x1/im.svg)}.flag-icon-in{background-image:url(../flags/4x3/in.svg)}.flag-icon-in.flag-icon-squared{background-image:url(../flags/1x1/in.svg)}.flag-icon-io{background-image:url(../flags/4x3/io.svg)}.flag-icon-io.flag-icon-squared{background-image:url(../flags/1x1/io.svg)}.flag-icon-iq{background-image:url(../flags/4x3/iq.svg)}.flag-icon-iq.flag-icon-squared{background-image:url(../flags/1x1/iq.svg)}.flag-icon-ir{background-image:url(../flags/4x3/ir.svg)}.flag-icon-ir.flag-icon-squared{background-image:url(../flags/1x1/ir.svg)}.flag-icon-is{background-image:url(../flags/4x3/is.svg)}.flag-icon-is.flag-icon-squared{background-image:url(../flags/1x1/is.svg)}.flag-icon-it{background-image:url(../flags/4x3/it.svg)}.flag-icon-it.flag-icon-squared{background-image:url(../flags/1x1/it.svg)}.flag-icon-je{background-image:url(../flags/4x3/je.svg)}.flag-icon-je.flag-icon-squared{background-image:url(../flags/1x1/je.svg)}.flag-icon-jm{background-image:url(../flags/4x3/jm.svg)}.flag-icon-jm.flag-icon-squared{background-image:url(../flags/1x1/jm.svg)}.flag-icon-jo{background-image:url(../flags/4x3/jo.svg)}.flag-icon-jo.flag-icon-squared{background-image:url(../flags/1x1/jo.svg)}.flag-icon-jp{background-image:url(../flags/4x3/jp.svg)}.flag-icon-jp.flag-icon-squared{background-image:url(../flags/1x1/jp.svg)}.flag-icon-ke{background-image:url(../flags/4x3/ke.svg)}.flag-icon-ke.flag-icon-squared{background-image:url(../flags/1x1/ke.svg)}.flag-icon-kg{background-image:url(../flags/4x3/kg.svg)}.flag-icon-kg.flag-icon-squared{background-image:url(../flags/1x1/kg.svg)}.flag-icon-kh{background-image:url(../flags/4x3/kh.svg)}.flag-icon-kh.flag-icon-squared{background-image:url(../flags/1x1/kh.svg)}.flag-icon-ki{background-image:url(../flags/4x3/ki.svg)}.flag-icon-ki.flag-icon-squared{background-image:url(../flags/1x1/ki.svg)}.flag-icon-km{background-image:url(../flags/4x3/km.svg)}.flag-icon-km.flag-icon-squared{background-image:url(../flags/1x1/km.svg)}.flag-icon-kn{background-image:url(../flags/4x3/kn.svg)}.flag-icon-kn.flag-icon-squared{background-image:url(../flags/1x1/kn.svg)}.flag-icon-kp{background-image:url(../flags/4x3/kp.svg)}.flag-icon-kp.flag-icon-squared{background-image:url(../flags/1x1/kp.svg)}.flag-icon-kr{background-image:url(../flags/4x3/kr.svg)}.flag-icon-kr.flag-icon-squared{background-image:url(../flags/1x1/kr.svg)}.flag-icon-kw{background-image:url(../flags/4x3/kw.svg)}.flag-icon-kw.flag-icon-squared{background-image:url(../flags/1x1/kw.svg)}.flag-icon-ky{background-image:url(../flags/4x3/ky.svg)}.flag-icon-ky.flag-icon-squared{background-image:url(../flags/1x1/ky.svg)}.flag-icon-kz{background-image:url(../flags/4x3/kz.svg)}.flag-icon-kz.flag-icon-squared{background-image:url(../flags/1x1/kz.svg)}.flag-icon-la{background-image:url(../flags/4x3/la.svg)}.flag-icon-la.flag-icon-squared{background-image:url(../flags/1x1/la.svg)}.flag-icon-lb{background-image:url(../flags/4x3/lb.svg)}.flag-icon-lb.flag-icon-squared{background-image:url(../flags/1x1/lb.svg)}.flag-icon-lc{background-image:url(../flags/4x3/lc.svg)}.flag-icon-lc.flag-icon-squared{background-image:url(../flags/1x1/lc.svg)}.flag-icon-li{background-image:url(../flags/4x3/li.svg)}.flag-icon-li.flag-icon-squared{background-image:url(../flags/1x1/li.svg)}.flag-icon-lk{background-image:url(../flags/4x3/lk.svg)}.flag-icon-lk.flag-icon-squared{background-image:url(../flags/1x1/lk.svg)}.flag-icon-lr{background-image:url(../flags/4x3/lr.svg)}.flag-icon-lr.flag-icon-squared{background-image:url(../flags/1x1/lr.svg)}.flag-icon-ls{background-image:url(../flags/4x3/ls.svg)}.flag-icon-ls.flag-icon-squared{background-image:url(../flags/1x1/ls.svg)}.flag-icon-lt{background-image:url(../flags/4x3/lt.svg)}.flag-icon-lt.flag-icon-squared{background-image:url(../flags/1x1/lt.svg)}.flag-icon-lu{background-image:url(../flags/4x3/lu.svg)}.flag-icon-lu.flag-icon-squared{background-image:url(../flags/1x1/lu.svg)}.flag-icon-lv{background-image:url(../flags/4x3/lv.svg)}.flag-icon-lv.flag-icon-squared{background-image:url(../flags/1x1/lv.svg)}.flag-icon-ly{background-image:url(../flags/4x3/ly.svg)}.flag-icon-ly.flag-icon-squared{background-image:url(../flags/1x1/ly.svg)}.flag-icon-ma{background-image:url(../flags/4x3/ma.svg)}.flag-icon-ma.flag-icon-squared{background-image:url(../flags/1x1/ma.svg)}.flag-icon-mc{background-image:url(../flags/4x3/mc.svg)}.flag-icon-mc.flag-icon-squared{background-image:url(../flags/1x1/mc.svg)}.flag-icon-md{background-image:url(../flags/4x3/md.svg)}.flag-icon-md.flag-icon-squared{background-image:url(../flags/1x1/md.svg)}.flag-icon-me{background-image:url(../flags/4x3/me.svg)}.flag-icon-me.flag-icon-squared{background-image:url(../flags/1x1/me.svg)}.flag-icon-mf{background-image:url(../flags/4x3/mf.svg)}.flag-icon-mf.flag-icon-squared{background-image:url(../flags/1x1/mf.svg)}.flag-icon-mg{background-image:url(../flags/4x3/mg.svg)}.flag-icon-mg.flag-icon-squared{background-image:url(../flags/1x1/mg.svg)}.flag-icon-mh{background-image:url(../flags/4x3/mh.svg)}.flag-icon-mh.flag-icon-squared{background-image:url(../flags/1x1/mh.svg)}.flag-icon-mk{background-image:url(../flags/4x3/mk.svg)}.flag-icon-mk.flag-icon-squared{background-image:url(../flags/1x1/mk.svg)}.flag-icon-ml{background-image:url(../flags/4x3/ml.svg)}.flag-icon-ml.flag-icon-squared{background-image:url(../flags/1x1/ml.svg)}.flag-icon-mm{background-image:url(../flags/4x3/mm.svg)}.flag-icon-mm.flag-icon-squared{background-image:url(../flags/1x1/mm.svg)}.flag-icon-mn{background-image:url(../flags/4x3/mn.svg)}.flag-icon-mn.flag-icon-squared{background-image:url(../flags/1x1/mn.svg)}.flag-icon-mo{background-image:url(../flags/4x3/mo.svg)}.flag-icon-mo.flag-icon-squared{background-image:url(../flags/1x1/mo.svg)}.flag-icon-mp{background-image:url(../flags/4x3/mp.svg)}.flag-icon-mp.flag-icon-squared{background-image:url(../flags/1x1/mp.svg)}.flag-icon-mq{background-image:url(../flags/4x3/mq.svg)}.flag-icon-mq.flag-icon-squared{background-image:url(../flags/1x1/mq.svg)}.flag-icon-mr{background-image:url(../flags/4x3/mr.svg)}.flag-icon-mr.flag-icon-squared{background-image:url(../flags/1x1/mr.svg)}.flag-icon-ms{background-image:url(../flags/4x3/ms.svg)}.flag-icon-ms.flag-icon-squared{background-image:url(../flags/1x1/ms.svg)}.flag-icon-mt{background-image:url(../flags/4x3/mt.svg)}.flag-icon-mt.flag-icon-squared{background-image:url(../flags/1x1/mt.svg)}.flag-icon-mu{background-image:url(../flags/4x3/mu.svg)}.flag-icon-mu.flag-icon-squared{background-image:url(../flags/1x1/mu.svg)}.flag-icon-mv{background-image:url(../flags/4x3/mv.svg)}.flag-icon-mv.flag-icon-squared{background-image:url(../flags/1x1/mv.svg)}.flag-icon-mw{background-image:url(../flags/4x3/mw.svg)}.flag-icon-mw.flag-icon-squared{background-image:url(../flags/1x1/mw.svg)}.flag-icon-mx{background-image:url(../flags/4x3/mx.svg)}.flag-icon-mx.flag-icon-squared{background-image:url(../flags/1x1/mx.svg)}.flag-icon-my{background-image:url(../flags/4x3/my.svg)}.flag-icon-my.flag-icon-squared{background-image:url(../flags/1x1/my.svg)}.flag-icon-mz{background-image:url(../flags/4x3/mz.svg)}.flag-icon-mz.flag-icon-squared{background-image:url(../flags/1x1/mz.svg)}.flag-icon-na{background-image:url(../flags/4x3/na.svg)}.flag-icon-na.flag-icon-squared{background-image:url(../flags/1x1/na.svg)}.flag-icon-nc{background-image:url(../flags/4x3/nc.svg)}.flag-icon-nc.flag-icon-squared{background-image:url(../flags/1x1/nc.svg)}.flag-icon-ne{background-image:url(../flags/4x3/ne.svg)}.flag-icon-ne.flag-icon-squared{background-image:url(../flags/1x1/ne.svg)}.flag-icon-nf{background-image:url(../flags/4x3/nf.svg)}.flag-icon-nf.flag-icon-squared{background-image:url(../flags/1x1/nf.svg)}.flag-icon-ng{background-image:url(../flags/4x3/ng.svg)}.flag-icon-ng.flag-icon-squared{background-image:url(../flags/1x1/ng.svg)}.flag-icon-ni{background-image:url(../flags/4x3/ni.svg)}.flag-icon-ni.flag-icon-squared{background-image:url(../flags/1x1/ni.svg)}.flag-icon-nl{background-image:url(../flags/4x3/nl.svg)}.flag-icon-nl.flag-icon-squared{background-image:url(../flags/1x1/nl.svg)}.flag-icon-no{background-image:url(../flags/4x3/no.svg)}.flag-icon-no.flag-icon-squared{background-image:url(../flags/1x1/no.svg)}.flag-icon-np{background-image:url(../flags/4x3/np.svg)}.flag-icon-np.flag-icon-squared{background-image:url(../flags/1x1/np.svg)}.flag-icon-nr{background-image:url(../flags/4x3/nr.svg)}.flag-icon-nr.flag-icon-squared{background-image:url(../flags/1x1/nr.svg)}.flag-icon-nu{background-image:url(../flags/4x3/nu.svg)}.flag-icon-nu.flag-icon-squared{background-image:url(../flags/1x1/nu.svg)}.flag-icon-nz{background-image:url(../flags/4x3/nz.svg)}.flag-icon-nz.flag-icon-squared{background-image:url(../flags/1x1/nz.svg)}.flag-icon-om{background-image:url(../flags/4x3/om.svg)}.flag-icon-om.flag-icon-squared{background-image:url(../flags/1x1/om.svg)}.flag-icon-pa{background-image:url(../flags/4x3/pa.svg)}.flag-icon-pa.flag-icon-squared{background-image:url(../flags/1x1/pa.svg)}.flag-icon-pe{background-image:url(../flags/4x3/pe.svg)}.flag-icon-pe.flag-icon-squared{background-image:url(../flags/1x1/pe.svg)}.flag-icon-pf{background-image:url(../flags/4x3/pf.svg)}.flag-icon-pf.flag-icon-squared{background-image:url(../flags/1x1/pf.svg)}.flag-icon-pg{background-image:url(../flags/4x3/pg.svg)}.flag-icon-pg.flag-icon-squared{background-image:url(../flags/1x1/pg.svg)}.flag-icon-ph{background-image:url(../flags/4x3/ph.svg)}.flag-icon-ph.flag-icon-squared{background-image:url(../flags/1x1/ph.svg)}.flag-icon-pk{background-image:url(../flags/4x3/pk.svg)}.flag-icon-pk.flag-icon-squared{background-image:url(../flags/1x1/pk.svg)}.flag-icon-pl{background-image:url(../flags/4x3/pl.svg)}.flag-icon-pl.flag-icon-squared{background-image:url(../flags/1x1/pl.svg)}.flag-icon-pm{background-image:url(../flags/4x3/pm.svg)}.flag-icon-pm.flag-icon-squared{background-image:url(../flags/1x1/pm.svg)}.flag-icon-pn{background-image:url(../flags/4x3/pn.svg)}.flag-icon-pn.flag-icon-squared{background-image:url(../flags/1x1/pn.svg)}.flag-icon-pr{background-image:url(../flags/4x3/pr.svg)}.flag-icon-pr.flag-icon-squared{background-image:url(../flags/1x1/pr.svg)}.flag-icon-ps{background-image:url(../flags/4x3/ps.svg)}.flag-icon-ps.flag-icon-squared{background-image:url(../flags/1x1/ps.svg)}.flag-icon-pt{background-image:url(../flags/4x3/pt.svg)}.flag-icon-pt.flag-icon-squared{background-image:url(../flags/1x1/pt.svg)}.flag-icon-pw{background-image:url(../flags/4x3/pw.svg)}.flag-icon-pw.flag-icon-squared{background-image:url(../flags/1x1/pw.svg)}.flag-icon-py{background-image:url(../flags/4x3/py.svg)}.flag-icon-py.flag-icon-squared{background-image:url(../flags/1x1/py.svg)}.flag-icon-qa{background-image:url(../flags/4x3/qa.svg)}.flag-icon-qa.flag-icon-squared{background-image:url(../flags/1x1/qa.svg)}.flag-icon-re{background-image:url(../flags/4x3/re.svg)}.flag-icon-re.flag-icon-squared{background-image:url(../flags/1x1/re.svg)}.flag-icon-ro{background-image:url(../flags/4x3/ro.svg)}.flag-icon-ro.flag-icon-squared{background-image:url(../flags/1x1/ro.svg)}.flag-icon-rs{background-image:url(../flags/4x3/rs.svg)}.flag-icon-rs.flag-icon-squared{background-image:url(../flags/1x1/rs.svg)}.flag-icon-ru{background-image:url(../flags/4x3/ru.svg)}.flag-icon-ru.flag-icon-squared{background-image:url(../flags/1x1/ru.svg)}.flag-icon-rw{background-image:url(../flags/4x3/rw.svg)}.flag-icon-rw.flag-icon-squared{background-image:url(../flags/1x1/rw.svg)}.flag-icon-sa{background-image:url(../flags/4x3/sa.svg)}.flag-icon-sa.flag-icon-squared{background-image:url(../flags/1x1/sa.svg)}.flag-icon-sb{background-image:url(../flags/4x3/sb.svg)}.flag-icon-sb.flag-icon-squared{background-image:url(../flags/1x1/sb.svg)}.flag-icon-sc{background-image:url(../flags/4x3/sc.svg)}.flag-icon-sc.flag-icon-squared{background-image:url(../flags/1x1/sc.svg)}.flag-icon-sd{background-image:url(../flags/4x3/sd.svg)}.flag-icon-sd.flag-icon-squared{background-image:url(../flags/1x1/sd.svg)}.flag-icon-se{background-image:url(../flags/4x3/se.svg)}.flag-icon-se.flag-icon-squared{background-image:url(../flags/1x1/se.svg)}.flag-icon-sg{background-image:url(../flags/4x3/sg.svg)}.flag-icon-sg.flag-icon-squared{background-image:url(../flags/1x1/sg.svg)}.flag-icon-sh{background-image:url(../flags/4x3/sh.svg)}.flag-icon-sh.flag-icon-squared{background-image:url(../flags/1x1/sh.svg)}.flag-icon-si{background-image:url(../flags/4x3/si.svg)}.flag-icon-si.flag-icon-squared{background-image:url(../flags/1x1/si.svg)}.flag-icon-sj{background-image:url(../flags/4x3/sj.svg)}.flag-icon-sj.flag-icon-squared{background-image:url(../flags/1x1/sj.svg)}.flag-icon-sk{background-image:url(../flags/4x3/sk.svg)}.flag-icon-sk.flag-icon-squared{background-image:url(../flags/1x1/sk.svg)}.flag-icon-sl{background-image:url(../flags/4x3/sl.svg)}.flag-icon-sl.flag-icon-squared{background-image:url(../flags/1x1/sl.svg)}.flag-icon-sm{background-image:url(../flags/4x3/sm.svg)}.flag-icon-sm.flag-icon-squared{background-image:url(../flags/1x1/sm.svg)}.flag-icon-sn{background-image:url(../flags/4x3/sn.svg)}.flag-icon-sn.flag-icon-squared{background-image:url(../flags/1x1/sn.svg)}.flag-icon-so{background-image:url(../flags/4x3/so.svg)}.flag-icon-so.flag-icon-squared{background-image:url(../flags/1x1/so.svg)}.flag-icon-sr{background-image:url(../flags/4x3/sr.svg)}.flag-icon-sr.flag-icon-squared{background-image:url(../flags/1x1/sr.svg)}.flag-icon-ss{background-image:url(../flags/4x3/ss.svg)}.flag-icon-ss.flag-icon-squared{background-image:url(../flags/1x1/ss.svg)}.flag-icon-st{background-image:url(../flags/4x3/st.svg)}.flag-icon-st.flag-icon-squared{background-image:url(../flags/1x1/st.svg)}.flag-icon-sv{background-image:url(../flags/4x3/sv.svg)}.flag-icon-sv.flag-icon-squared{background-image:url(../flags/1x1/sv.svg)}.flag-icon-sx{background-image:url(../flags/4x3/sx.svg)}.flag-icon-sx.flag-icon-squared{background-image:url(../flags/1x1/sx.svg)}.flag-icon-sy{background-image:url(../flags/4x3/sy.svg)}.flag-icon-sy.flag-icon-squared{background-image:url(../flags/1x1/sy.svg)}.flag-icon-sz{background-image:url(../flags/4x3/sz.svg)}.flag-icon-sz.flag-icon-squared{background-image:url(../flags/1x1/sz.svg)}.flag-icon-tc{background-image:url(../flags/4x3/tc.svg)}.flag-icon-tc.flag-icon-squared{background-image:url(../flags/1x1/tc.svg)}.flag-icon-td{background-image:url(../flags/4x3/td.svg)}.flag-icon-td.flag-icon-squared{background-image:url(../flags/1x1/td.svg)}.flag-icon-tf{background-image:url(../flags/4x3/tf.svg)}.flag-icon-tf.flag-icon-squared{background-image:url(../flags/1x1/tf.svg)}.flag-icon-tg{background-image:url(../flags/4x3/tg.svg)}.flag-icon-tg.flag-icon-squared{background-image:url(../flags/1x1/tg.svg)}.flag-icon-th{background-image:url(../flags/4x3/th.svg)}.flag-icon-th.flag-icon-squared{background-image:url(../flags/1x1/th.svg)}.flag-icon-tj{background-image:url(../flags/4x3/tj.svg)}.flag-icon-tj.flag-icon-squared{background-image:url(../flags/1x1/tj.svg)}.flag-icon-tk{background-image:url(../flags/4x3/tk.svg)}.flag-icon-tk.flag-icon-squared{background-image:url(../flags/1x1/tk.svg)}.flag-icon-tl{background-image:url(../flags/4x3/tl.svg)}.flag-icon-tl.flag-icon-squared{background-image:url(../flags/1x1/tl.svg)}.flag-icon-tm{background-image:url(../flags/4x3/tm.svg)}.flag-icon-tm.flag-icon-squared{background-image:url(../flags/1x1/tm.svg)}.flag-icon-tn{background-image:url(../flags/4x3/tn.svg)}.flag-icon-tn.flag-icon-squared{background-image:url(../flags/1x1/tn.svg)}.flag-icon-to{background-image:url(../flags/4x3/to.svg)}.flag-icon-to.flag-icon-squared{background-image:url(../flags/1x1/to.svg)}.flag-icon-tr{background-image:url(../flags/4x3/tr.svg)}.flag-icon-tr.flag-icon-squared{background-image:url(../flags/1x1/tr.svg)}.flag-icon-tt{background-image:url(../flags/4x3/tt.svg)}.flag-icon-tt.flag-icon-squared{background-image:url(../flags/1x1/tt.svg)}.flag-icon-tv{background-image:url(../flags/4x3/tv.svg)}.flag-icon-tv.flag-icon-squared{background-image:url(../flags/1x1/tv.svg)}.flag-icon-tw{background-image:url(../flags/4x3/tw.svg)}.flag-icon-tw.flag-icon-squared{background-image:url(../flags/1x1/tw.svg)}.flag-icon-tz{background-image:url(../flags/4x3/tz.svg)}.flag-icon-tz.flag-icon-squared{background-image:url(../flags/1x1/tz.svg)}.flag-icon-ua{background-image:url(../flags/4x3/ua.svg)}.flag-icon-ua.flag-icon-squared{background-image:url(../flags/1x1/ua.svg)}.flag-icon-ug{background-image:url(../flags/4x3/ug.svg)}.flag-icon-ug.flag-icon-squared{background-image:url(../flags/1x1/ug.svg)}.flag-icon-um{background-image:url(../flags/4x3/um.svg)}.flag-icon-um.flag-icon-squared{background-image:url(../flags/1x1/um.svg)}.flag-icon-us{background-image:url(../flags/4x3/us.svg)}.flag-icon-us.flag-icon-squared{background-image:url(../flags/1x1/us.svg)}.flag-icon-uy{background-image:url(../flags/4x3/uy.svg)}.flag-icon-uy.flag-icon-squared{background-image:url(../flags/1x1/uy.svg)}.flag-icon-uz{background-image:url(../flags/4x3/uz.svg)}.flag-icon-uz.flag-icon-squared{background-image:url(../flags/1x1/uz.svg)}.flag-icon-va{background-image:url(../flags/4x3/va.svg)}.flag-icon-va.flag-icon-squared{background-image:url(../flags/1x1/va.svg)}.flag-icon-vc{background-image:url(../flags/4x3/vc.svg)}.flag-icon-vc.flag-icon-squared{background-image:url(../flags/1x1/vc.svg)}.flag-icon-ve{background-image:url(../flags/4x3/ve.svg)}.flag-icon-ve.flag-icon-squared{background-image:url(../flags/1x1/ve.svg)}.flag-icon-vg{background-image:url(../flags/4x3/vg.svg)}.flag-icon-vg.flag-icon-squared{background-image:url(../flags/1x1/vg.svg)}.flag-icon-vi{background-image:url(../flags/4x3/vi.svg)}.flag-icon-vi.flag-icon-squared{background-image:url(../flags/1x1/vi.svg)}.flag-icon-vn{background-image:url(../flags/4x3/vn.svg)}.flag-icon-vn.flag-icon-squared{background-image:url(../flags/1x1/vn.svg)}.flag-icon-vu{background-image:url(../flags/4x3/vu.svg)}.flag-icon-vu.flag-icon-squared{background-image:url(../flags/1x1/vu.svg)}.flag-icon-wf{background-image:url(../flags/4x3/wf.svg)}.flag-icon-wf.flag-icon-squared{background-image:url(../flags/1x1/wf.svg)}.flag-icon-ws{background-image:url(../flags/4x3/ws.svg)}.flag-icon-ws.flag-icon-squared{background-image:url(../flags/1x1/ws.svg)}.flag-icon-ye{background-image:url(../flags/4x3/ye.svg)}.flag-icon-ye.flag-icon-squared{background-image:url(../flags/1x1/ye.svg)}.flag-icon-yt{background-image:url(../flags/4x3/yt.svg)}.flag-icon-yt.flag-icon-squared{background-image:url(../flags/1x1/yt.svg)}.flag-icon-za{background-image:url(../flags/4x3/za.svg)}.flag-icon-za.flag-icon-squared{background-image:url(../flags/1x1/za.svg)}.flag-icon-zm{background-image:url(../flags/4x3/zm.svg)}.flag-icon-zm.flag-icon-squared{background-image:url(../flags/1x1/zm.svg)}.flag-icon-zw{background-image:url(../flags/4x3/zw.svg)}.flag-icon-zw.flag-icon-squared{background-image:url(../flags/1x1/zw.svg)}.flag-icon-es-ca{background-image:url(../flags/4x3/es-ca.svg)}.flag-icon-es-ca.flag-icon-squared{background-image:url(../flags/1x1/es-ca.svg)}.flag-icon-es-ga{background-image:url(../flags/4x3/es-ga.svg)}.flag-icon-es-ga.flag-icon-squared{background-image:url(../flags/1x1/es-ga.svg)}.flag-icon-eu{background-image:url(../flags/4x3/eu.svg)}.flag-icon-eu.flag-icon-squared{background-image:url(../flags/1x1/eu.svg)}.flag-icon-gb-eng{background-image:url(../flags/4x3/gb-eng.svg)}.flag-icon-gb-eng.flag-icon-squared{background-image:url(../flags/1x1/gb-eng.svg)}.flag-icon-gb-nir{background-image:url(../flags/4x3/gb-nir.svg)}.flag-icon-gb-nir.flag-icon-squared{background-image:url(../flags/1x1/gb-nir.svg)}.flag-icon-gb-sct{background-image:url(../flags/4x3/gb-sct.svg)}.flag-icon-gb-sct.flag-icon-squared{background-image:url(../flags/1x1/gb-sct.svg)}.flag-icon-gb-wls{background-image:url(../flags/4x3/gb-wls.svg)}.flag-icon-gb-wls.flag-icon-squared{background-image:url(../flags/1x1/gb-wls.svg)}.flag-icon-un{background-image:url(../flags/4x3/un.svg)}.flag-icon-un.flag-icon-squared{background-image:url(../flags/1x1/un.svg)}.flag-icon-xk{background-image:url(../flags/4x3/xk.svg)}.flag-icon-xk.flag-icon-squared{background-image:url(../flags/1x1/xk.svg)}*{box-sizing:border-box}:focus{outline:0;box-shadow:none}.clearfix:after{content:"";display:table;clear:both}.container{max-width:1200px;width:100%;padding:0 15px;margin:0 auto}body{font-family:Poppins,sans-serif;color:#0a1247}li{list-style:none}a{cursor:pointer;text-decoration:none}h1{font-size:46px;font-weight:500}h2{font-size:36px;font-weight:500}h3{font-size:32px;font-weight:500}.top-heading{padding-bottom:50px}p{font-size:18px;font-weight:100;color:#666}.my-cards{border-radius:20px}.buttons{background:#fff;border-radius:8px;box-shadow:0 2px 14px #0a124720;padding:12px 30px;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;width:-webkit-fit-content;width:fit-content;cursor:pointer;transition:all .5s ease}.buttons span{margin-right:30px;font-size:18px}.buttons svg{transition:all .5s ease}.buttons:hover{box-shadow:0 2px 20px #0a124730}.buttons:hover svg{transform:translateX(10px)}.login-btn:after{height:49.2px;clear:both;content:'';display:block;margin:0}.header-content{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;padding:25px 40px;width:100%;background:#e9edef;z-index:1;transition:1s}.header-content .menu ul{display:-ms-flexbox;display:flex}.header-content .menu ul li{margin-left:40px;font-size:16px}.header-content .menu ul li a{position:relative;color:#0a1247}.header-content .menu ul li a::after{content:'';position:absolute;height:2px;width:100%;transform:scale(0);background:#0a1247;bottom:-5px;left:0;transition:all .5s ease}.header-content .menu ul li a:hover::after{transform:scale(.8)}.header-content.color-header{background:#ebfcfc}.header-content.fixed-header{background:#ebfcfc;padding:20px 40px;box-shadow:0 2px 4px 0 rgba(0,0,0,.1)}.heading{position:relative}.heading::after{content:'';position:absolute;height:3px;width:180px;background-color:#0a1247;bottom:-10px;border-radius:8px;left:-40px}.hero-content{background:url(../images/hero_bg_img.png);width:100%;background-repeat:no-repeat;background-size:100% 100%;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.hero-content .hero-text .desc{margin-top:40px;color:#0a1247}.hero-content .hero-text .buttons{margin-top:50px;margin-left:-120px;padding:12px 40px}.desc{max-width:600px}.features{padding-top:120px}.features .feature-detail{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;margin:80px 0;-ms-flex-pack:distribute;justify-content:space-around;position:relative}.features .feature-detail .feature-text .desc{max-width:400px}.features .feature-detail .feature-text .heading{position:absolute;left:40%;bottom:140px}.features .feature-detail .feature-text .heading::after{right:-40px;left:unset;top:-10px}.features .feature-detail.editor-detail{-ms-flex-direction:row-reverse;flex-direction:row-reverse}.features .feature-detail.editor-detail .heading{left:45%;top:100px}.features .feature-detail.editor-detail .heading::after{left:-40px;top:-10px}.features .feature-detail.support-detail .heading{top:130px}.support-section{background:url(../images/support-bg-img.png);background-repeat:no-repeat;background-size:70% 100%}.support-section .feature-detail{margin:0}.comparision-section{margin-top:120px;padding-bottom:60px;text-align:center;background:url(../images/table-bg-img.png);background-repeat:no-repeat;background-position:right bottom;background-size:25% 100%}.comparision-section .comparison-content .desc{margin:0 auto}.comparision-section .comparison-content .comparison-table{padding-top:80px}table{width:100%;border-collapse:collapse;color:#333}table thead td{border-bottom:1px solid #d9d9d9;padding:20px 0}table tbody tr td{padding-top:25px}table tbody tr td:nth-child(1){text-align:left;padding-left:20px}.service .serviceheading{padding:70px 0;text-align:center;color:#0a1247}.service-btn{color:#fff;background-color:#0a1247;margin:0 auto}.service-btn span{margin:0}.service-content{display:-ms-flexbox;display:flex;padding-bottom:110px}.service-content .service-img img{width:580px;height:415px;object-fit:contain}.service-content .content{text-align:center}.service-content .content .content-heading{padding:25px 0;color:#0a1247}.service-content .content .content-para{padding-bottom:30px}.pbx-section{background:linear-gradient(0deg,rgba(0,0,0,.65),rgba(0,0,0,.65)),url(../images/pbx-section.png);background-size:cover;padding:100px 0}.pbx-section .pbx-content{text-align:center}.pbx-section .pbx-content .pbx-heading{color:#fff;padding-bottom:30px}.pbx-section .pbx-content .pbx-para{color:#fff;padding-bottom:40px}.overview-section{background-image:linear-gradient(to bottom,#f5f8fd,#fff 44%);padding:120px 0}.overview-section .overview-content{position:relative;text-align:center}.overview-section .overview-content .overview-heading{color:#0a1247;padding-bottom:10px}.overview-section .overview-content .overview-para{margin:0 auto;max-width:865px;padding-bottom:130px}.overview-section .overview-content .picture{position:absolute;right:-127px;top:180px}.overview-section .overview-content .key-feature{display:-ms-flexbox;display:flex}.overview-section .overview-content .key-feature .feature{width:300px;margin-right:50px;margin-bottom:50px;text-align:left}.overview-section .overview-content .key-feature .feature .feature-img{padding-bottom:20px}.overview-section .overview-content .key-feature .feature .feature-heading{font-size:22px;font-weight:500;padding-bottom:20px;color:#0a1247}.overview-section .overview-content .key-feature .feature .feature-para{font-size:16px;font-weight:400;color:#666}.learn_more-section{background:url(../images/learn-bg.png);padding:60px 0;margin-bottom:-120px}.learn_more-section .learn_more-content{text-align:center}.learn_more-section .learn_more-content .learn_more-heading{font-size:32px;font-weight:500;color:#0a1247;padding-bottom:30px}.learn_more-section .learn_more-content .learn_more-para{padding-bottom:40px;font-size:18px;font-weight:400;color:#666}@media only screen and (max-width:760px){.login-page-block{height:100vh;background-size:100% 100%}.login-page-content{-ms-flex-pack:center!important;justify-content:center!important}.login-text{display:none}}.login-page-block{background:url(../images/login-bg.png);background-repeat:no-repeat;background-position:bottom;min-height:650px;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;background-size:100% 100%}.logo-link{position:absolute;top:0;width:100%;min-height:85px;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.login-page-content{margin:0;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;-ms-flex-align:center;align-items:center;padding:10%}.login-page-content .login-block,.login-page-content .password-reset-form{width:100%;max-width:400px}button{border:0;background:0 0}.login-page .logo,.signup-page .logo{text-align:center}.login-page .content .login-form,.login-page .content .signup-form,.signup-page .content .login-form,.signup-page .content .signup-form{border-radius:20px;box-shadow:0 6px 30px 0 rgba(0,0,0,.1);background-color:#fff;padding:50px}.login-page .content .login-form h3,.login-page .content .signup-form h3,.signup-page .content .login-form h3,.signup-page .content .signup-form h3{color:#395373;font-size:22px;font-weight:600;text-align:center}.login-page .content .call-system-picker{width:800px}.login-page .content .login-form h3,.login-page .content .signup-form h3,.signup-page .content .login-form h3,.signup-page .content .signup-form h3{color:#395373;font-size:22px;font-weight:600;text-align:center}.login-page .content .call-system-picker{width:800px}.login-page .content .call-system-picker h3{text-align:left}.login-page .content .login-form .field-input,.login-page .content .signup-form .field-input,.signup-page .content .login-form .field-input,.signup-page .content .signup-form .field-input{display:-ms-flexbox;display:flex;padding:10px 0}.login-page .content .login-form .field-input svg,.login-page .content .signup-form .field-input svg,.signup-page .content .login-form .field-input svg,.signup-page .content .signup-form .field-input svg{margin-right:20px}.login-page .content .login-form .field-input md-input-container{max-height:30px}.login-page .content .login-form .field-input input,.login-page .content .signup-form .field-input input,.signup-page .content .login-form .field-input input,.signup-page .content .signup-form .field-input input{border:none;width:100%;font-size:16px;color:#a0abae;margin:0;border-bottom:1px solid #e3e3e3}.login-page .content .login-form .field-input .fname,.login-page .content .signup-form .field-input .fname,.signup-page .content .login-form .field-input .fname,.signup-page .content .signup-form .field-input .fname{display:-ms-flexbox;display:flex;margin-right:10px}.login-page .content .login-form .field-input .input-box,.login-page .content .signup-form .field-input .input-box,.signup-page .content .login-form .field-input .input-box,.signup-page .content .signup-form .field-input .input-box{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;width:100%;margin-bottom:20px}.login-page .content .login-form .field-input .input-box.no-margin{margin-bottom:0}.login-page .content .login-form .field-input .input-box .input-field,.login-page .content .signup-form .field-input .input-box .input-field,.signup-page .content .login-form .field-input .input-box .input-field,.signup-page .content .signup-form .field-input .input-box .input-field{width:100%;margin:0}.login-page .content .login-form .field-input .input-box .input-field.lname,.login-page .content .signup-form .field-input .input-box .input-field.lname,.signup-page .content .login-form .field-input .input-box .input-field.lname,.signup-page .content .signup-form .field-input .input-box .input-field.lname{padding-left:20px;border-left:2px dotted #f4f2f2}.login-page .content .login-form .field-input .input-box .input-field.lname label,.login-page .content .signup-form .field-input .input-box .input-field.lname label,.signup-page .content .login-form .field-input .input-box .input-field.lname label,.signup-page .content .signup-form .field-input .input-box .input-field.lname label{padding-left:20px}.login-page .content .login-form .field-input .input-box .input-field .validate,.login-page .content .signup-form .field-input .input-box .input-field .validate,.signup-page .content .login-form .field-input .input-box .input-field .validate,.signup-page .content .signup-form .field-input .input-box .input-field .validate{border-bottom:solid 1px #f4f2f2}.login-page .content .login-form .login-btn,.login-page .content .login-form .signup-btn,.login-page .content .signup-form .login-btn,.login-page .content .signup-form .signup-btn,.signup-page .content .login-form .login-btn,.signup-page .content .login-form .signup-btn,.signup-page .content .signup-form .login-btn,.signup-page .content .signup-form .signup-btn{display:-ms-flexbox;display:flex;-ms-flex-pack:end;justify-content:flex-end}.login-page .content .login-form .login-btn span,.login-page .content .login-form .signup-btn span,.login-page .content .signup-form .login-btn span,.login-page .content .signup-form .signup-btn span,.signup-page .content .login-form .login-btn span,.signup-page .content .login-form .signup-btn span,.signup-page .content .signup-form .login-btn span,.signup-page .content .signup-form .signup-btn span{width:100%;border-radius:35px;background-color:#395373;color:#fff}.login-page .content .login-form span.disabled{background-color:#a9a9a9;cursor:not-allowed}.login-page .content .text,.signup-page .content .text{text-align:right;max-width:342px}.login-page .content .text h2,.signup-page .content .text h2{color:#395373;font-size:36px;font-weight:700;position:relative}.login-page .content .text h2::after,.signup-page .content .text h2::after{position:absolute;right:0;content:"";width:180px;height:4px;background:#395373;border-radius:2px;overflow:hidden;bottom:-10px}.login-page .content .text p,.signup-page .content .text p{color:#666;font-size:18px;font-weight:500;margin-top:30px;margin-left:10px}.login-page .content .text p span,.signup-page .content .text p span{color:#395373}.login-page .content .login-form .field-input{width:400px}.login-page .content .text h2::after{transform:translateX(-44%)}.login-page .content .login-form .login-btn{display:-ms-flexbox;display:flex;-ms-flex-pack:start;justify-content:flex-start}.login-btn .login-button-custom{width:100%}.login-btn .login-custom{padding:15px 70px!important}.login-page .content .login-form #gSignIn .abcRioButtonBlue{width:100%!important}.login-page .content .login-form .field-input{width:100%}.login-page .content .login-form .field-input.verify{width:100%}.login-page .field-input.verify md-select{margin:3px 0 0 0}.verification-page{background-image:linear-gradient(235deg,#f7f7f7,#fff 68%,#fff)}.verification-page .logo{text-align:center;padding-top:40px}.verification-page .content{margin:60px 0 0;display:-ms-flexbox;display:flex;-ms-flex-pack:start;justify-content:flex-start;position:relative}.verification-page .content .text{padding-top:60px;margin-left:140px;z-index:1}.verification-page .content .text h2{color:#395373;font-size:36px;font-weight:700;position:relative}.verification-page .content .text h2::after{position:absolute;left:0;content:'';width:180px;height:4px;background:#395373;border-radius:2px;overflow:hidden;bottom:-10px}.verification-page .content .text p{font-size:18px;font-weight:500;color:#666;margin-top:30px;max-width:394px}.verification-page .content .text .verify-form{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:40px;margin-top:100px;border-radius:10px;box-shadow:0 6px 30px 0 rgba(0,0,0,.1);background-color:#fff}.verification-page .content .text .verify-form .details{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.verification-page .content .text .verify-form .details svg{margin-right:20px}.verification-page .content .text .verify-form .details .input-field{margin:0}.verification-page .content .text .verify-form .details .input-field .validate{border:none;color:#a0abae;font-size:16px;width:225px;border-bottom:solid 1px #f4f2f2;margin:0}.verification-page .content .text .verify-form .details .input-field.separator{border-left:2px dotted #f4f2f2;padding-left:25px;margin-left:25px}.verification-page .content .text .verify-form .details .input-field.separator label{padding-left:25px}.verification-page .content .text .verify-form .submit-btn{padding-left:50px;display:-ms-flexbox;display:flex;-ms-flex-pack:end;justify-content:flex-end}.verification-page .content .text .verify-form .submit-btn span{padding:15px 40px;border-radius:35px;background-color:#395373;color:#fff}.verification-page .content .image{position:absolute;right:0;max-height:700px;overflow:hidden}.footer{padding:50px 0;margin-top:120px;background:#ebfcfc;position:relative;background-image:url(../images/footer-bg-img.png);background-repeat:no-repeat}.footer .footer-img{position:absolute;top:-50px}.footer .footer-menu ul{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:end;justify-content:flex-end}.footer .footer-menu ul li{margin-left:50px}.footer .footer-menu ul li a{position:relative;color:#0a1247}.footer .footer-menu ul li a::after{content:'';position:absolute;height:2px;width:100%;transform:scale(0);background:#0a1247;bottom:-5px;left:0;transition:all .5s ease}.footer .footer-menu ul li a:hover::after{transform:scale(.8)}.privacy{background:#0a1247;padding:20px 0}.privacy .privacy-content{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:end;justify-content:flex-end}.privacy .privacy-content p{color:#fff;font-size:14px}.privacy .privacy-content .social-media{display:-ms-flexbox;display:flex}.privacy .privacy-content .social-media img{margin-left:20px;cursor:pointer}.login-image{position:absolute;right:0;max-height:700px;overflow:hidden}.privacy .privacy-content p{color:#fff;font-size:14px}.privacy .privacy-content .social-media{display:-ms-flexbox;display:flex}.privacy .privacy-content .social-media img{margin-left:20px;cursor:pointer}.login-image{position:absolute;right:0;max-height:700px;overflow:hidden}.logo img{max-width:300px}button.custom{width:100%;padding:15px 40px;border-radius:35px;background-color:#395373;color:#fff}ul.no-styling{margin:0;padding:0;list-style:none}.m-16{margin:16px!important}.p-16{padding:16px!important}.microsoft-login-btn{margin-top:14px;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;width:100%;box-shadow:0 2px 4px 0 rgb(0 0 0 / 25%);border-radius:50px}.microsoft-login-btn .login-button-custom{-ms-flex-positive:1;flex-grow:1}.microsoft-login-btn .icon-block{height:48px;width:48px;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.cancel-subscription-block{width:100%;padding:20px;border-radius:10px;margin:10px}.cancel-subscription-block .cancel-subscription-note{background-color:#3a53732b;padding:10px;border-radius:5px}.cancel-subscription-block .cancel-subscription-header{font-size:20px;padding:0 0 20px}.cancel-subscription-block .cancel-subscription-description{font-size:14px;padding:0 0 20px}.confirm-cancel .confirm-button{padding:0 10px 0 10px}.delete-subscription{padding:0 4px 0 0;font-size:18px}.cancel-subscription-block .confirm-cancel{padding:10px 0 0;text-align:right}.cancel-subscription-block .cancel-subscription-note .info-cancel{padding:0 0 0 6px}span.spacer{-ms-flex:1 1 auto;flex:1 1 auto}.search-section{position:relative}.search-section i.first-element{position:absolute;z-index:99;height:calc(100% - 32px);padding:0 10px;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.search-section i.last-element{position:absolute;z-index:99;top:15px;right:15px;height:calc(100% - 32px);padding:0 10px;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;cursor:pointer}.search-input-class input{padding-left:40px!important;background-color:#f5f5f5!important;border-radius:8px}.search-input-class .md-whiteframe-z1{box-shadow:none!important;background-color:#f5f5f5!important;border-radius:8px}.search-section .custom-autocomplete{padding:10px 40px;border:none;background-color:#f5f5f5!important;border-radius:8px;width:100%}.search-section .custom-autocomplete-dropdown{position:absolute;width:calc(100% - 32px);padding:10px 0;background-color:#fff;box-shadow:rgba(0,0,0,.16) 0 1px 4px;border-radius:10px;max-height:294px;overflow-y:auto;display:grid;gap:2px;z-index:1}.search-section .custom-autocomplete-dropdown .custom-autocomplete-dropdown-item{width:100%;padding:10px 12px;cursor:pointer}.search-section .custom-autocomplete-dropdown .custom-autocomplete-dropdown-item:hover{background-color:#f5f5f5}.search-section .custom-autocomplete-dropdown .custom-autocomplete-dropdown-key{background-color:#e6e6e6;cursor:not-allowed;pointer-events:none;padding:8px 10px;text-transform:capitalize}.auth-app-code{display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center;margin-top:20px}.qr-code-auth{margin-top:15px;margin-bottom:15px;height:200px}.auth-code-width{width:30%}.radio-group{margin-bottom:45px}.reset-otp{text-align:right}.reset-otp span{cursor:pointer}.request-otp-info{text-align:center;margin:15px 0;font-size:15px}.request-assistant{text-align:center;margin-top:15px}.request-assistant span{color:red;text-decoration:underline;cursor:pointer}.form-port-details{border:1px solid #f5f5f5;padding:0 20px 0;margin-top:15px}.stepper{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;-ms-flex-align:center;align-items:center;width:100%;margin-top:20px;margin-bottom:20px}.step{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-align:center;align-items:center;position:relative;width:25%;text-align:center}.step-number{display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center;width:30px;height:30px;border-radius:50%;background-color:#fff;border:2px solid #ccc;margin-bottom:10px;font-weight:700;font-size:16px}.step-title{font-size:14px;color:#777}.step-line{position:absolute;height:2px;width:100%;background-color:#ccc;top:15px;left:calc(50% + 15px)}.step:last-child .step-line{display:none}.step.active .step-number{border-color:#4050b5;color:#4050b5}.button-group{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-top:20px;margin-bottom:15px}.next-step-button{display:-ms-flexbox;display:flex;-ms-flex-pack:end;justify-content:end;margin-top:20px;margin-bottom:15px}.file-upload-container{-ms-flex-pack:justify;justify-content:space-between;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:12px}.upload-icon{font-size:60px;color:#ccc}.upload-label-doc{margin-top:25px;margin-bottom:15px}.dash-border{border:2px dashed #ccc;padding:20px;text-align:center}.upload-btn{margin-top:10px;padding:10px;background-color:#3949ab;border:none;color:#fff;cursor:pointer;width:150px;margin-right:auto;margin-left:auto}.file-format{font-size:14px;color:#ccc;margin-top:5px}.selected-file{display:-ms-flexbox;display:flex;margin-top:4px;padding:5px 10px;border:1px solid #d3d3d3;border-radius:3px;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between}.selected-file i{cursor:pointer}.invisible{visibility:hidden}.continue-to-process{text-align:center}.continue-to-process button{padding:5px 50px}.add-block-number-modal{width:100%;max-width:500px}.country-width{width:100px}.info-phone-number{background-color:#3a53732b;padding:10px;border-radius:5px}.info-phone{padding:0 0 0 6px}.info-phone-note{padding:15px}.country-field{padding:0 20px 0 20px}.md-input-container{margin:0}.card-bottom{padding-bottom:0!important}.submit-button{padding-top:0!important}.form-port-details{-ms-flex-wrap:wrap;flex-wrap:wrap}.port-number-details{display:-ms-flexbox;display:flex;width:100%;gap:30px}.port-number-details .action-button{margin-top:14px}.port-number-details .porting-number-counts{margin-top:30px}.form-port-details .action-port-button{display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center}.form-port-details .action-port-button button{margin:0;padding:0 15px;margin-top:12px}.form-port-details .action-port-button button.activated-button{background-color:#fff!important;color:#000!important}.form-port-details .action-port-button button.single-btn{border-top-right-radius:0;border-bottom-right-radius:0}.form-port-details .action-port-button button.multiple-btn{border-top-left-radius:0;border-bottom-left-radius:0}.multi-port-style{width:100%;border:1px solid #f5f5f5;padding:10px 25px;margin-bottom:20px}.multi-port-input{margin-bottom:0}.box{font-size:14px;color:red;margin-top:4px;margin-bottom:4px}.step-check-icon{position:relative;display:inline-block;width:24px;height:24px;border-radius:50%;border:2px solid #4caf50;color:#4caf50;font-size:16px;line-height:24px;text-align:center}.step-check-icon:before{content:"\2713";position:absolute;top:0;left:0;right:0;bottom:0;font-size:16px}.checked-circle{font-size:38px;color:#109c10}.pricing-plan-container{margin-left:auto;margin-right:auto;-ms-flex-pack:center;justify-content:center;-ms-flex-wrap:wrap;flex-wrap:wrap}.pricing-header{-ms-flex-align:center;align-items:center}.plan-cards{width:295px;position:relative;margin-bottom:30px;overflow:hidden;height:980px}.popular{position:absolute;background:#ff655d;top:0;right:0;width:150px;height:150px;transform:rotate(45deg) translateY(-120px);transform-origin:center;font-weight:600;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:end;justify-content:flex-end;-ms-flex-align:center;align-items:center}.popular i{font-size:24px;color:#fff}.popular p{font-size:10px;color:#fff;font-weight:400}.pricing-content{padding:0 24px 0 40px}.pricing-content li{line-height:2}.started-button{border:2px solid #181147;color:#181147;width:130px;height:50px;font-weight:400}.started-button:hover{background-color:#181147!important;color:#fff}.pricing-plan-container md-card-title{-ms-flex:0;flex:0}.button-plan{margin-top:auto;padding:30px}md-content{background-color:#fff}.plan-info li{list-style:disc}.plan-info li::marker{color:#6ad7fa}.featured-popular{border:5px solid #ff655d}.plan-info .plan-plus{list-style:none;margin-top:35px;font-size:12px}.started-button-downgrade{width:150px;height:50px;font-weight:400;border:2px solid}.phone-sms{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-align:center;align-items:center;width:30%}.sms-number-field{margin-bottom:0}.card-img-top{width:100%;height:140px}.appearance-container{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-align:center;align-items:center}.card-appearance{width:265px;margin-right:24px;border:1px solid #f5f5f5;border-radius:6px}.appearance-group{margin-top:25px;margin-bottom:25px}.form-check-appearance{border-top:1px solid #f5f5f5;padding:10px}.card-body-appearance{height:45px}.payment-container{width:100%}.payment-input{margin-right:15px!important;position:relative}.payment-input svg{position:absolute;top:50%;transform:translateY(-50%);right:0;margin-right:0!important}.top-payment-heading{display:-ms-flexbox;display:flex;margin-bottom:0;margin-top:0}.top-payment-heading.payment-method-txt{margin-bottom:25px}.payment-info{margin-bottom:40px;font-weight:400;font-size:12px;line-height:1.5}.accept-payment{margin-right:0;margin-bottom:50px}.accept-payment-terms{font-size:10px;font-weight:400;line-height:1.8}.payment-detail{font-size:20px;color:#395373;font-weight:500;margin-top:20px}.payment-button{border-radius:50px!important;width:130px;margin-right:12px!important}.payment-value-conatiner{height:100%;width:100%;max-width:420px;min-height:250px;padding:18px!important}.pay-trial{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:10px}.trail-text{font-size:14px}.payment-info-billed{font-size:12px;font-weight:400;line-height:1.2}.pay-trial-details{background:#3a537324;padding:10px;border-radius:6px;margin-top:20px}.font-trail{font-weight:500}.trail-button{width:100%;margin-top:18px}.payment-details-container{margin-right:18px}.custom-error{color:#dd2c00;font-size:80%}.credit-card-brand{position:absolute;right:6px;top:6px}.credit-card-brand img{max-height:22px}.field-input-ui{margin-bottom:18px}.address-detail{margin-bottom:30px}.name-details{padding:0}.checkout-container{width:40%;margin-top:auto;margin-bottom:auto;margin-right:20px}.check-checkout{display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;font-size:35px;color:#339d40}.checkout-heading{margin-top:0;margin-bottom:6px}.checkout-details{font-size:14px;font-weight:400;line-height:1.5;text-align:center}.payment-trial-conatiner{width:40%;height:250px;padding:18px!important}.checkout-container-box{display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center}.trail-header{font-size:10px;line-height:1.8}.total-trial{margin-top:16px}.trail-dashboard-button{display:-ms-flexbox;display:flex;margin-right:auto!important;margin-left:auto!important;width:150px;border-radius:50px!important;-ms-flex-pack:center;justify-content:center;margin-top:15px}.paypal-button{width:100%;margin-top:18px;height:40px;border-radius:6px}.md-icon-float{-ms-flex:1 1 auto;flex:1 1 auto}p{font-weight:300}md-checkbox.md-checked .md-icon{background-color:rgb(64 80 181)!important}.trunk-name{margin-top:40px;margin-bottom:0}.trunk-icon{margin-top:50px!important}.theme-moon{width:3%;position:absolute;right:60px;border-radius:50%;padding:8px;background:#395373;transform:rotate(80deg);top:30px;cursor:pointer}.login-page .input-box md-input-container{width:100%!important}.login-page .input-box md-input-container label,.login-page .input-box md-input-container label.md-required{padding-left:6px!important} \ No newline at end of file diff --git a/app/views/layouts/dashboard.html b/app/views/layouts/dashboard.html index 1bb6e80..5f141ab 100644 --- a/app/views/layouts/dashboard.html +++ b/app/views/layouts/dashboard.html @@ -1,95 +1,125 @@
- + + +
+
+ +
+ +
+
+
+ + Please wait.. +
+
+
+
+
+
+
+
+
+
+
+ + Please wait.. +
+
+
-
+
+
+ + diff --git a/app/views/pages/call-view.html b/app/views/pages/call-view.html index f55cabb..6c6e6af 100644 --- a/app/views/pages/call-view.html +++ b/app/views/pages/call-view.html @@ -26,11 +26,11 @@
Status
{{call.status}}
-
+
Duration
{{call.duration_ended_human}}
-
+
Duration (live)
{{call.duration_live_human}}
diff --git a/app/views/pages/calls.html b/app/views/pages/calls.html index bd6d62c..e481075 100644 --- a/app/views/pages/calls.html +++ b/app/views/pages/calls.html @@ -11,7 +11,17 @@
No calls listed
-
+
+ + + + @@ -19,24 +29,6 @@
No calls listed
X
- Create New -
- - - - - - Delete All - - - -
diff --git a/app/views/pages/extensions.html b/app/views/pages/extensions.html index 68d67cc..acdcb31 100644 --- a/app/views/pages/extensions.html +++ b/app/views/pages/extensions.html @@ -13,7 +13,7 @@
No extensions listed
- + X @@ -65,7 +65,7 @@
No extensions found
- + diff --git a/app/views/pages/login.html b/app/views/pages/login.html index 75d4685..0e68885 100644 --- a/app/views/pages/login.html +++ b/app/views/pages/login.html @@ -1,76 +1,104 @@ - -
-