Структура проекта статистики фида, авторизация, стр. кабинета, подключение табл.со статой

parent 0eb83fba
......@@ -21,9 +21,76 @@ return [
$acl->deny(null, null)
->allow(Roles::ROLE_GUEST, 'home');
$acl->allow(Roles::ROLE_GUEST, 'get-site-data')
$acl->allow(Roles::ROLE_GUEST, 'login')
->allow(Roles::ROLE_GUEST, 'register')
->allow(Roles::ROLE_GUEST, 'faq')
->allow(Roles::ROLE_GUEST, 'contacts')
->allow(Roles::ROLE_GUEST, 'statistics')
->allow(Roles::ROLE_USER, 'logout')
->allow(Roles::ROLE_GUEST, 'user.password.reset')
->allow(Roles::ROLE_USER, 'user.activate')
->allow(Roles::ROLE_USER, 'user.mail.send.activation')
->allow(Roles::ROLE_USER, 'user.mail.request.activate.protection')
->allow(Roles::ROLE_GUEST, 'user.mail.sent.password')
->allow(Roles::ROLE_USER, 'user.cabinet', null, new \App\Acl\Assertion\UserActive())
->allow(Roles::ROLE_USER, 'user.cabinet.profile', null, new \App\Acl\Assertion\UserActive())
->allow(Roles::ROLE_USER, 'site.add', null, new \App\Acl\Assertion\UserActive())
->allow(Roles::ROLE_USER, 'site.remove', null, new \App\Acl\Assertion\UserActive())
->allow(Roles::ROLE_USER, 'install.counter', null, new \App\Acl\Assertion\UserActive())
->allow(Roles::ROLE_USER, 'download.counter', null, new \App\Acl\Assertion\UserActive())
->allow(Roles::ROLE_USER, 'codestat')
->allow(Roles::ROLE_GUEST, 'email.counter')
->allow(Roles::ROLE_GUEST, 'adm.system.actions')
// Supports area
->allow(Roles::ROLE_GUEST, 'adm.login')
->allow(Roles::ROLE_GUEST, 'adm.logout')
->allow(Roles::ROLE_GUEST, 'adm.init')
// Admin
->allow(Roles::ROLE_ADMIN, 'adm.supports')
->allow(Roles::ROLE_ADMIN, 'adm.supports.create')
->allow(Roles::ROLE_ADMIN, 'adm.supports.delete')
->allow(Roles::ROLE_ADMIN, 'adm.supports.edit')
->allow(Roles::ROLE_ADMIN, 'adm.index')
->allow(Roles::ROLE_ADMIN, 'adm.feeds')
->allow(Roles::ROLE_ADMIN, 'adm.feed.create')
->allow(Roles::ROLE_ADMIN, 'adm.feed.edit')
->allow(Roles::ROLE_MANAGER, 'adm.index')
->allow(Roles::ROLE_MANAGER, 'adm.contacts')
->allow(Roles::ROLE_MANAGER, 'adm.faq')
->allow(Roles::ROLE_MANAGER, 'adm.faq.item.hide')
->allow(Roles::ROLE_MANAGER, 'adm.faq.item.activate')
->allow(Roles::ROLE_MANAGER, 'adm.faq.item.edit')
->allow(Roles::ROLE_MANAGER, 'adm.faq.item.create')
->allow(Roles::ROLE_MANAGER, 'adm.faq.category.hide')
->allow(Roles::ROLE_MANAGER, 'adm.faq.category.activate')
->allow(Roles::ROLE_MANAGER, 'adm.faq.category.edit')
->allow(Roles::ROLE_MANAGER, 'adm.users')
->allow(Roles::ROLE_MANAGER, 'adm.users.create')
->allow(Roles::ROLE_MANAGER, 'adm.users.edit')
->allow(Roles::ROLE_MANAGER, 'adm.users.statistic')
->allow(Roles::ROLE_MANAGER, 'adm.users.status.site')
->allow(Roles::ROLE_MANAGER, 'adm.users.status.block')
->allow(Roles::ROLE_MANAGER, 'adm.users.status.unblock')
->allow(Roles::ROLE_MANAGER, 'adm.users.status.activate')
->allow(Roles::ROLE_MANAGER, 'adm.users.status.deactivate')
->allow(Roles::ROLE_SUPPORT, 'logout')
->allow(Roles::ROLE_SUPPORT, 'adm.profile')
// Manager Feed
->allow(Roles::ROLE_MANAGER_FEED, 'adm.feeds')
;
return $acl;
},
'aclResources' => function (ContainerInterface $container) {
......
<?php
/**
* Copyright (c) 2017 Serhii Borodai <clarifying@gmail.com>.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, 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.
*
*
*/
use App\Entity\Support;
// set primary admin which can't be removed
// other supports users should be added from support interface
return ['admin' =>
[
'email' => 'admin@addcpm.com',
'password' => 'zaqwsx123',
'role' => Support::ROLE_ADMIN
]
];
\ No newline at end of file
<?php
/**
* Copyright (c) 2017 Serhii Borodai <clarifying@gmail.com>.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, 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.
*
*
*/
return [
'blog' => [
'articlesPerPage' => 12,
]
];
\ No newline at end of file
<?php
/**
* Copyright (c) 2016 Serhii Borodai <clarifying@gmail.com>.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, 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.
*
*
*/
return [
'dependencies' => [
'factories' => [
'archiver' => function (\Interop\Container\ContainerInterface $container) {
return new ZipArchive();
}
]
],
\App\Entity\Download\Counter::class => [
\App\Entity\Download\Counter::STORE_DIR => 'data/counter/',
\App\Entity\Download\Counter::FILE_SCRIPT => 'sample-script.js',
\App\Entity\Download\Counter::FILE_MANUAL => 'sample-manual.html',
]
];
\ No newline at end of file
<?php
return [
'contacts' => [
\App\Entity\Contacts::PHONES_KEY => [
0 => 'UK +442080681862',
1 => 'US +13476204620',
2 => 'RU +74993489639',
3 => 'UA +380443794886',
],
\App\Entity\Contacts::MAILS_KEY => [
0 => 'customer@addcpm.com',
],
\App\Entity\Contacts::SKYPES_KEY => [
],
],
];
This diff is collapsed.
......@@ -36,6 +36,43 @@ if(getenv('DEVELOPMENT')) {
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true,
],
];
$db_ecpa_conf = [
'driver' => 'Pdo_mysql',
'host' => 'db',
'dbname' => 'ecpa',
'user' => 'addcpm',
'password' => 'addcpm',
'charset' => 'UTF8',
'driver_options' => [
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'',
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true,
],
];
$db_retarg_conf = [
'driver' => 'Pdo_mysql',
'host' => 'db',
'dbname' => 'retarg',
'user' => 'addcpm',
'password' => 'addcpm',
'charset' => 'UTF8',
'driver_options' => [
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'',
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true,
],
];
$db_tpl_conf = [
'driver' => 'Pdo_mysql',
'host' => 'db',
'dbname' => 'tpl',
'user' => 'addcpm',
'password' => 'addcpm',
'charset' => 'UTF8',
'driver_options' => [
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'',
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true,
],
];
} else {
$db_conf = [
'driver' => 'Pdo_mysql',
......@@ -49,10 +86,50 @@ if(getenv('DEVELOPMENT')) {
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true,
],
];
$db_ecpa_conf = [
'driver' => 'Pdo_mysql',
'host' => '185.187.80.139',
'dbname' => 'ecpa',
'user' => 'addcpm',
'password' => 'Xvq7jtFetUKgHe7vHQTwPA1Jf1LabkV9',
'charset' => 'UTF8',
'driver_options' => [
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'',
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true,
],
];
$db_retarg_conf = [
'driver' => 'Pdo_mysql',
'host' => '185.187.80.139',
'dbname' => 'retarg',
'user' => 'addcpm',
'password' => 'Xvq7jtFetUKgHe7vHQTwPA1Jf1LabkV9',
'charset' => 'UTF8',
'driver_options' => [
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'',
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true,
],
];
$db_tpl_conf = [
'driver' => 'Pdo_mysql',
'host' => '185.187.80.139',
'dbname' => 'tpl',
'user' => 'addcpm',
'password' => 'Xvq7jtFetUKgHe7vHQTwPA1Jf1LabkV9',
'charset' => 'UTF8',
'driver_options' => [
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'',
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true,
],
];
}
return [
'db' => $db_conf,
'db_ecpa' => $db_ecpa_conf,
'db_retarg' => $db_retarg_conf,
'db_tpl' => $db_tpl_conf,
'dependencies' => [
'factories' => [
]
......
This diff is collapsed.
<?php
return [
'feed_conf' => [
'formats' => ['yml', 'gfeed'],
],
];
<?php
return [
'debug' => true,
'config_cache_enabled' => false,
];
<?php
use Interop\Container\ContainerInterface;
use Slim\Flash\Messages;
use Zend\Expressive\Container\ApplicationFactory;
use Zend\Expressive\Helper;
return [
'dependencies' => [
'factories' => [
Helper\ServerUrlMiddleware::class => Helper\ServerUrlMiddlewareFactory::class,
Helper\UrlHelperMiddleware::class => Helper\UrlHelperMiddlewareFactory::class,
App\Middleware\LayoutInfo::class => function (ContainerInterface $container) {
return new App\Middleware\LayoutInfo(
$container->get('layout'),
$container->get(\App\Model\Locales::class),
$container->get(\Zend\Expressive\Router\RouterInterface::class),
$container->get(\Zend\Permissions\Acl\AclInterface::class),
$container->get('config')['contacts'][\App\Entity\Contacts::PHONES_KEY],
$container->get('config')['contacts'][\App\Entity\Contacts::MAILS_KEY],
$container->get('config')['contacts'][\App\Entity\Contacts::SKYPES_KEY]
);
},
'translationsMiddleware' => function (ContainerInterface $container) {
$translations = $container->get(\App\Model\Translations::class);
return function (\Psr\Http\Message\ServerRequestInterface $request, $response, $next) use ($translations) {
$translations->register($request->getAttribute('layoutInfo')->getLang());
return $next($request, $response);
};
},
'flash' => function (ContainerInterface $container) {
return function (\Psr\Http\Message\ServerRequestInterface $request, $response, $next) {
// Start the session whenever we use this!
session_start();
return $next(
$request->withAttribute('flash', new Messages()),
$response
);
};
},
],
],
// This can be used to seed pre- and/or post-routing middleware
'middleware_pipeline' => [
// An array of middleware to register. Each item is of the following
// specification:
//
// [
// Required:
// 'middleware' => 'Name or array of names of middleware services and/or callables',
// Optional:
// 'path' => '/path/to/match', // string; literal path prefix to match
// // middleware will not execute
// // if path does not match!
// 'error' => true, // boolean; true for error middleware
// 'priority' => 1, // int; higher values == register early;
// // lower/negative == register last;
// // default is 1, if none is provided.
// ],
//
// While the ApplicationFactory ignores the keys associated with
// specifications, they can be used to allow merging related values
// defined in multiple configuration files/locations. This file defines
// some conventional keys for middleware to execute early, routing
// middleware, and error middleware.
'always' => [
'middleware' => [
// Add more middleware here that you want to execute on
// every request:
// - bootstrapping
// - pre-conditions
// - modifications to outgoing responses
Helper\ServerUrlMiddleware::class,
'flash',
],
'priority' => 10000,
],
'routing' => [
'middleware' => [
ApplicationFactory::ROUTING_MIDDLEWARE,
Helper\UrlHelperMiddleware::class,
// Add more middleware here that needs to introspect the routing
// results; this might include:
// - route-based authentication
// - route-based validation
// - etc.
App\Middleware\LayoutInfo::class, // init required info for layout
'translationsMiddleware',
App\Middleware\Authentication::class,
App\Middleware\Authorization::class,
ApplicationFactory::DISPATCH_MIDDLEWARE,
],
'priority' => 1,
],
'error' => [
'middleware' => [
// Add error middleware here.
],
'error' => true,
'priority' => -10000,
],
],
];
<?php
return [
'offer_conf' => [
'lang' => array(
'RU' => 'Русский',
),
'raiting' => ['A', 'B', 'C', 'D'],
'landing_geo' => array(
'UA' => 'Украина',
'RU' => 'Россия',
'BY' => 'Беларусь',
'KZ' => 'Казахстан',
)
],
'cpa_stat_conf' => [
'periods' => array(
'total' => 'всего',
'today' => 'сегодня',
'yesterday' => 'вчера',
'24h' => 'сутки',
'7d' => '7 дней',
'30d' => '30 дней',
),
]
];
<?php
return [
'metrics' => [
// DateStat
'pagestat' => array(
'title' => 'страницам',
'type' => 'pages',
'fields_to_show' => array(
'loadCnt' => 'load',
'startCnt' => 'start',
'runCnt' => 'run',
'runRatio' => 'runRatio', // runCnt/loadCnt * 100, в %
),
'fields' => ['loadCnt', 'startCnt', 'runCnt'],
'filters' => ['SiteID', 'Country'],
),
'minstat' => array(
'title' => 'зонам RTB',
'type' => 'zones',
'fields_to_show' => array(
'sspViewsCnt' => 'Показы',
'sspClicksCnt' => 'Клики',
'ctr' => 'CTR', // sspClicksCnt/sspViewsCnt * 100, в %
'sspMoney' => 'Деньги',
'cpm' => 'CPM', // sspMoney/sspViewsCnt * 1000
'siteCpm' => 'SiteCPM', // sspSiteMoney/sspViewsCnt * 1000
'systemCpm' => 'SystemCPM', // (sspMoney - sspSiteMoney)/sspViewsCnt * 1000
'cpc' => 'CPC', // sspMoney/sspClicksCnt * 100
'siteCpc' => 'SiteCPC', // sspSiteMoney/sspClicksCnt * 100
'systemCpc' => 'SystemCPC', // (sspMoney - sspSiteMoney)/sspClicksCnt * 100
'sumRatio' => 'SumRatio', // sspMoney/sspMoney * 100, в %
'siteRatio' => 'SiteRatio', // sspSiteMoney/sspMoney * 100, в %
'systemRatio' => 'SystemRatio', // sspSiteMoney/(sspMoney - sspSiteMoney) * 100, в %
'sspSiteMoney' => 'Деньги сайта',
'sspSystemMoney' => 'Деньги системы', // sspMoney - sspSiteMoney
),
'fields' => ['sspViewsCnt', 'sspClicksCnt', 'sspMoney', 'sspSiteMoney'],
'filters' => ['SiteID', 'Country', 'ZoneID'],
),
'blockstat' => array(
'title' => 'блокам',
'type' => 'zones',
'fields_to_show' => array(
'blockViewsCnt' => 'Показы блоков',
'blockClicksCnt' => 'Клики по блокам',
'sspViewsCnt' => 'Показы rtb',
'sspClicksCnt' => 'Клики rtb',
//'sum' => 'Сумма', // blockViewsCnt+sspViewsCnt
//'ctr' => 'CTR', // blockClicksCnt/blockViewsCnt * 100, в %
'sumViews' => 'Сумма показов', // blockViewsCnt+sspViewsCnt
'sumClicks' => 'Сумма кликов', // blockClicksCnt+sspClicksCnt
'ctr' => 'CTR', // blockClicksCnt/blockViewsCnt * 100, в %
'ctrRtb' => 'CTR rtb', // sspClicksCnt/sspViewsCnt * 100, в %
),
'fields' => ['blockViewsCnt', 'blockClicksCnt', 'sspViewsCnt', 'sspClicksCnt'],
'filters' => ['SiteID', 'Country', 'ZoneID'],
),
'ndspstat' => array(
'title' => 'провайдерам ndsp',
'type' => 'ndsp',
'fields_to_show' => array(
'adViewsCnt' => 'Показы',
'adClicksCnt' => 'Клики',
'adMoney' => 'Деньги',
'ctr' => 'CTR', // adClicksCnt/adViewsCnt * 100, в %
'cpm' => 'CPM', // adMoney/adViewsCnt * 1000
'cpc' => 'CPC', // adMoney/adClicksCnt * 100
),
'fields' => ['ndspProvider', 'adViewsCnt', 'adClicksCnt', 'adMoney'],
'filters' => ['SiteID', 'Country', 'ZoneID'],
),
// ProviderStat
'bidstat' => array(
'title' => 'ставкам SSP',
'type' => 'bids',
'fields_to_show' => array(
'bidCnt' => 'Кол-во ставок',
'bidMoney' => 'Деньги',
'cpm' => 'CPM', // bidMoney/bidCnt * 1000
),
'fields' => ['sspProvider', 'bidCnt', 'bidMoney'],
'filters' => ['SiteID', 'Country', 'ZoneID'],
),
'winstat' => array(
'title' => 'выиграшам SSP',
'type' => 'zones',
'fields_to_show' => array(
'sspViewsCnt' => 'Показы',
'sspClicksCnt' => 'Клики',
'sspMoney' => 'Деньги',
'ctr' => 'CTR', // sspClicksCnt/sspViewsCnt * 100, в %
'cpm' => 'CPM', // sspMoney/sspViewsCnt * 1000
'cpc' => 'CPC', // sspMoney/sspClicksCnt * 100
),
'fields' => ['sspProvider', 'sspViewsCnt', 'sspClicksCnt', 'sspMoney'],
'filters' => ['SiteID', 'Country', 'ZoneID'],
),
'providersblockstat' => array(
'title' => 'провайдерам блоков',
'type' => 'zones',
'fields_to_show' => array(
'blockViewsCnt' => 'Показы блоков',
'blockClicksCnt' => 'Клики по блокам',
//'sspViewsCnt' => 'Показы rtb',
'sum' => 'Сумма', // blockViewsCnt+sspViewsCnt
'ctr' => 'CTR', // blockClicksCnt/blockViewsCnt * 100, в %
),
'fields' => ['argonProvider', 'blockViewsCnt', 'blockClicksCnt', 'sspViewsCnt', 'sspClicksCnt'],
'filters' => ['SiteID', 'Country', 'ZoneID'],
),
]
];
This diff is collapsed.
This diff is collapsed.
<?php
return [
'serverdata' => [
// ssp_conf
'ssp' => array(
'providers' => ['admixer', 'admixer_vip', 'marketgid', 'ndsp', 'trafmag'],
),
// dsp_conf
'dsp' => array(
'providers' => ['marketgid_click', 'mixadvert_click', 'recreativ_click'],
'config_names' => array(
'marketgid_click' => array(
'only_goods' => 'только товары',
'elite' => 'elite',
)
)
),
]
];
<?php
return [
'site_categories' => [
'IAB12' => 'Новости',
'IAB2' => 'Авто',
'IAB13' => 'Финансы',
'IAB15-10' => 'Погода',
'IAB-19' => 'HiTech',
'IAB3-1' => 'Объявления',
'IAB17' => 'Спорт',
'IAB29' => 'Торренты',
'IAB1-5' => 'Кино',
'IAB1' => 'Развлекательный',
'IAB1-2' => 'Глянец',
'IAB24' => 'Портал',
'IAB14' => 'Знакомства',
'IAB9-30' => 'Другое',
'IAB5' => 'Образование',
'IAB6' => 'Семья',
'IAB7' => 'Здоровье',
'IAB15' => 'Наука',
'IAB8' => 'Еда и напитки',
'IAB21' => 'Недвижимость',
'IAB1-1' => 'Литература',
'IAB9' => 'Хобби',
'IAB9-23' => 'Фотография',
'IAB16' => 'Животные'
],
'zone_sizes' => [
'300x250',
'300x600',
'728x90',
'300x300',
],
'site_countries' => [
'UA' => 'Украина',
'RU' => 'Россия',
'US' => 'США',
'EU' => 'Европа',
'DE' => 'Германия',
'NL' => 'Нидерланды',
],
];
......@@ -8,15 +8,15 @@ return [
'factories' => [
'Zend\Expressive\FinalHandler' =>
Zend\Expressive\Container\TemplatedErrorHandlerFactory::class,
Zend\Expressive\Template\TemplateRendererInterface::class => function (\Interop\Container\ContainerInterface $container) {
$class = \Zend\Expressive\ZendView\ZendViewRendererFactory::class;
$factory = new $class;
$layout = $container->get('layout');
$container->get('config')['templates']['layout'] = $layout;
/** @var ZendViewRenderer $renderer */
$renderer = $factory($container);
return $renderer;
},
Zend\Expressive\Template\TemplateRendererInterface::class => function (\Interop\Container\ContainerInterface $container) {
$class = \Zend\Expressive\ZendView\ZendViewRendererFactory::class;
$factory = new $class;
$layout = $container->get('layout');
$container->get('config')['templates']['layout'] = $layout;
/** @var ZendViewRenderer $renderer */
$renderer = $factory($container);
return $renderer;
},
'layout' => function () {
// Create the layout view model
......@@ -34,7 +34,8 @@ return [
'map' => [
'empty' => 'templates/layout/empty.phtml',
'layout/iframe' => 'templates/layout/iframe.phtml',
'layout/default' => 'templates/layout/layout-default.phtml',
'layout/default' => 'templates/layout/layout-main.phtml',
'layout/support' => 'templates/layout/support.phtml',
'error/error' => 'templates/error/error.phtml',
'error/404' => 'templates/error/404.phtml',
],
......
<?php
return [
'users_segment' => [
'A+' => 'A+',
'A' => 'A',
'B' => 'B',
'C' => 'C',
]
];
<?php
/** @var \Interop\Container\ContainerInterface $container */
$container = include 'container.php';
$phinxconfig = $container->get('config')['phinx'];
/** @var \Zend\Db\Adapter\Adapter $adapter */
$adapter = $container->get(Zend\Db\Adapter\AdapterEcpa::class);
$connection = $adapter->getDriver()->getConnection();
// need that because phinx require estabilished \PDO connection
$connection->connect();
$reflection = new ReflectionObject($connection);
$resource = $reflection->getProperty('resource');
$resource->setAccessible(true);
$pdoConnection = $resource->getValue($connection);
// inject schema name from current connection
$dbName = $connection->getCurrentSchema();
$phinxconfig['environments']['development']['name'] = $dbName;
// if required replace that code with connection init depending on environment
array_walk_recursive($phinxconfig, function(&$value, $key, $connection) {
if ($key == 'connection') {
$value = $connection;
}
}, $pdoConnection);
return $phinxconfig;
\ No newline at end of file
......@@ -755,23 +755,45 @@ footer {
height: 85px;
}
header.support.m-menu_small {
height: 35px;
}
header.support.m-menu_small.sub-menu {
height: 65px;
}
header.support .main-items {
header.support.m-menu_small.sub-menu .wrapp{
height: 50%;
box-shadow: 0 1px 15px -2px rgba(0,0,0,0.5);
}
header.support .wrapp.support-items {
height: 50%;
header.support.m-menu_small.sub-menu .delimiter{
border-bottom: 1px solid #ccc;
}
header.support .main-items {
height: 100%;
}
header.support .header-nav {
padding: 0;
justify-content: flex-start;
margin-left: -195px;
}
header.support .support-items .header-nav {
header.support .submenu .header-nav {
margin-left: 0;
padding: 0;
justify-content: flex-start;
}
header.support .support-items .header-nav li {
margin-right: 10px;
header.support .header-nav li {
margin-right: 20px;
}
header.support .header-user .annotation {
font-size: 13px;
}
header.support .header-user img {
height: 25px;
width: 25px;
}
.header-logo {
display: block;
height: 40px;
......@@ -915,6 +937,13 @@ footer {
background-color: rgba(0,0,0,0.5);
}
.b-content__work .b-content__work
{
margin: 0 auto;
max-width: 1240px;
}
/* Стили оформления ссылки на новость блога */
.blog-item__inner {
display: block;
......@@ -1223,7 +1252,7 @@ footer {
height: auto;
}
header.support .support-items .header-nav {
header.support .submenu .header-nav {
padding: 0 20px;
}
......
header,
main,
footer {
min-width: 1024px;
}
/* HEADER */
header {
}
main {
padding-top: 70px;
}
.b-content__work
{
/*
margin: 10px auto;
width: 1024px;
*/
}
.form-group-data
{
display: block;
margin-top: 20px;
}
.zone-item .is-hidden label,
.slot-item .is-hidden label
{
vertical-align: 0;
}
.form-group-data input[type="checkbox"]
{
vertical-align: -2px;
}
.form-group.zones_id label,
.zone-item .zone-content .form-group label
{
float: none;
font-weight: normal;
line-height: normal;
width: auto;
}
.form-group .values-edit,
.form-group .no-values
{
display: block;
}
.zone-item .show-zone .open,
.code-item .show-code .open
{
display: block;
line-height: 9px;
}
.zone-item .zone-content,
.code-item .code-content
{
display: block;
}
.form-group.zone .targets input.form-control.targets
{
margin-top: 0;
}
.code-item .code-title,
.code-item .code-provider
{
float: left;
}
.slot-item .syncHeight-inner
{
display: block;
}
form.b-popup__login
{
margin: auto;
width: 400px;
}
/* FOOTER */
footer {
}
\ No newline at end of file
......@@ -150,6 +150,26 @@
font-size: 12px;
}
.table-striped thead tr th.minstat-common-th
{
padding: 8px 0 2px 40px;
text-align: center;
border-bottom: none;
}
.table-striped thead tr th.minstat-item-th
{
padding: 0 4px 4px 4px;
width: 1px;
text-align: right !important;
font-size: 11px !important;
}
.table-striped thead tr th.minstat-item-th b
{
/*font-weight: normal;*/
}
.table-striped thead tr th:first-child,
.table-striped tfoot tr td:first-child
{
......@@ -174,6 +194,12 @@
font-family: monospace;
}
.table-striped tbody tr td.in-common-group
{
/*padding: 8px 8px;*/
}
.table-striped tbody tr td .double-val
{
display: inline-block;
......@@ -182,21 +208,30 @@
.table-striped.compare thead tr th b
{
display: inline-block;
/*
min-width: 65px;
text-align: left;
*/
}
.table-striped tbody tr td span.diff
{
display: block;
font-size: 11px;
color: #2CA02C;
/*
float: right;
margin-top: 10px;
margin-left: 5px;
font-size: 11px;
color: #2CA02C;
min-width: 65px;
min-width: 35px;
text-align: left;
*/
}
.table-striped tbody tr td span.diff.negative
{
color: #FF0000;
......
......@@ -158,6 +158,15 @@
width: 300px;
}
.b-content__site-currency.user .droplist-current.text
{
cursor: default;
}
.b-content__site .b-content__site-currency.user .droplist-current:after
{
background-image: none;
}
.b-content__site-currency span{
margin-top: 0;
height: 40px;
......@@ -635,7 +644,7 @@
position: absolute;
width: 100%;
height: 100%;
background-color: #FFFFFF;
background: #FFF url('../img/gif-load.gif') center center no-repeat;
opacity: 0.5;
z-index: 1;
}
......@@ -938,12 +947,57 @@
}
.b-filter__switch.time-table {
float: left;
/*margin-left: 30px;*/
}
.b-filter__switch.count-sites {
float: left;
}
.b-filter__switch.category-table {
float: right;
}
.b-filter__switch.time-table-sort {
float: right;
}
.table.table-striped.admin td b.common-sum,
.table.table-striped.admin td span.site-domain
{
cursor: pointer;
}
.table.table-striped.admin td b.common-sum:hover,
.table.table-striped.admin td span.site-domain:hover
{
color: #2CA02C;
}
.table.table-striped.admin thead.metric.sortable tr b
{
color: #2CA02C;
cursor: pointer;
}
.table.table-striped.admin thead.metric.sortable tr b.selected
{
font-size: 13px;
}
.table.table-striped.admin thead.metric tr b .arrow
{
display: none;
}
.table.table-striped.admin thead.metric.sortable tr b.selected .arrow.asc,
.table.table-striped.admin thead.metric.sortable tr b.selected.desc .arrow.desc
{
display: inline;
}
.table.table-striped.admin thead.metric.sortable tr b.selected .arrow.desc,
.table.table-striped.admin thead.metric.sortable tr b.selected.desc .arrow.asc
{
display: none;
}
.category.b-filter__switch {
-ms-flex: 4 0 600px;
......@@ -960,6 +1014,10 @@
*/
max-width: 670px;
}
.display.b-filter__switch.metric-cat {
max-width: none;
}
.b-filter__switch-item {
/*
-ms-flex: 1;
......@@ -994,6 +1052,7 @@
.m-filter__switch-item_active.b-filter__switch-item {
background-color: #E6E6E6;
}
.b-content__traffic canvas {
max-height: 370px;
width: 100%;
......
/* Таблица стилей к странице фида */
.b-content__work.inner
{
max-width: 1240px;
margin: 0 auto;
}
.b-content__work.inner input[type="checkbox"]
{
vertical-align: -2px;
cursor: pointer;
}
.b-clear
{
clear: both;
}
.b-left
{
float: left;
width: 75%;
padding-right: 75px;
}
.b-right
{
float: left;
width: 25%;
}
.form-group
{
margin-bottom: 5px;
}
......@@ -289,12 +289,41 @@
background-repeat: no-repeat;
}
.b-content__title {
padding: 85px 0 25px;
height: 460px;
background-color: #EAEFF1;
}
.b-content__title picture {
display: block;
margin: 0 auto;
width: 90px;
margin-bottom: 5px;
}
.b-content__title p.lead {
margin-bottom: 5px;
text-align: center;
}
.b-content__title-settings {
text-align: center;
}
.b-content__title-settings .annotation:first-child {
margin-right: 30px;
}
.b-content__title-settings .annotation {
color: #0071BC;
}
.b-content__work {
padding: 70px 0 70px;
background : rgba(185, 203, 209, 0.2);
}
.b-content__work h1 {
margin-bottom: 55px;
text-align: center;
}
.b-content__work-item {
......
/* Таблица стилей к странице списка офферов */
.b-partners-link
{
float: right;
margin-left: 10px;
line-height: 34px;
}
.b-offers-list_controls
{
margin-bottom: 5px;
}
.b-data-item_action,
.b-data-item_list-tpl-action
{
display: none;
}
.b-offers-list_controls select
{
display: inline-block;
margin: 0 15px 0 2px;
width: 120px;
height: 30px;
line-height: 15px;
}
.b-offers-list_controls select.data-period
{
margin-right: 0;
}
.b-offers-list_controls select.offer-partner
{
width: 220px;
}
.b-offers-list_controls select.offer-category,
.b-offers-list_controls select.offer-subcategory
{
width: 200px;
}
.b-offers-list_controls select.order-status
{
width: 120px;
}
.b-offers-list_controls select.order-orders,
.b-offers-list_controls select.order-clicks
{
width: 70px;
}
.b-offers-list_controls-subcategory
{
display: none;
}
.b-offers-list_controls.total-info
{
height: 28px;
border-bottom: solid 1px #ccc;
}
.b-filters
{
position: relative;
margin-bottom: 5px;
padding-top: 5px;
padding-bottom: 5px;
border-top: solid 1px #ccc;
border-bottom: solid 1px #ccc;
min-height: 46px;
}
.b-filters .btn.apply
{
position: absolute;
bottom: 5px;
right: 0;
}
.b-data-item_list.orders-list .b-filters .btn.apply
{
position: static;
float: right;
margin-left: 10px;
}
.b-filters__show,
.b-filters-sites-zones__show
{
display: inline-block;
margin-top: 4px;
color: #337ab7;
border-bottom: 1px #337ab7 dashed;
cursor: pointer;
}
.b-filters input[type="checkbox"]
{
vertical-align: -2px;
}
.b-filters__items,
.b-filters_sites-zones
{
display: none;
margin-top: 10px;
}
.b-filters__current
{
}
.b-filters__current span,
.b-filters__items span
{
display: inline-block;
font-weight: bold;
min-width: 80px;
}
.b-filters .form-group
{
display: inline-block;
margin-bottom: 4px;
min-width: 100px;
}
.b-filters select.form-control.data-category,
.b-filters select.form-control.data-subcategory
{
display: inline-block;
width: 200px;
}
.b-filters .add-filter
{
float: left;
margin-bottom: 8px;
}
/* Фильтры стран-зон */
.b-filters_sites-zones
{
/*display: flex;*/
margin-bottom: 38px;
}
.b-filters_site-wrap
{
float: left;
padding-right: 5px;
width: 50%;
}
.b-filters_zone-wrap
{
float: right;
padding-left: 5px;
width: 50%;
}
.b-filters_geo,
.b-filters_site,
.b-filters_zone
{
float: left;
width: 100%;
border: 1px solid #CCC;
border-radius: 4px;
padding: 4px 6px 0;
}
.b-filters_geo
{
width: 585px;
}
.b-filters_zone
{
/*display: none;*/
margin-right: 0;
}
.b-filters_site .form-group,
.b-filters_zone .form-group
{
display: block;
}
.b-filters_sites-zones .filters-select
{
float: left;
padding-right: 3px;
width: 50%;
height: 200px;
}
.b-filters_sites-zones .filters-values
{
float: right;
padding-left: 3px;
width: 50%;
height: 200px;
}
.b-filters_sites-zones .filters-select .filter
{
margin-bottom: 8px;
}
.b-filters_sites-zones .filters-select div
{
display: inline-block;
width: 100%;
border: 1px solid #CCCCCC;
border-radius: 4px;
}
.b-filters_sites-zones .list-filter
{
padding-left: 4px;
height: 150px;
overflow-x: hidden;
overflow-y: scroll;
}
.b-filters_sites-zones .list-filter li
{
white-space: nowrap;
}
.b-filters_sites-zones .list-filter label,
.b-filters_sites-zones .values-string-list label
{
font-weight: normal;
}
.b-filters_sites-zones .values-string-list
{
padding: 2px 6px;
height: 194px;
min-height: 34px;
border: 1px solid #CCCCCC;
border-radius: 4px;
overflow-y: scroll;
}
.b-template-zones-list
{
display: none;
}
.b-export-xls
{
height: 30px;
clear: both;
}
.b-pager
{
}
.b-pager.state-loading
{
opacity: 0.5;
}
.b-pager li
{
display: inline-block;
margin-left: -1px;
width: 33px;
height: 34px;
line-height: 32px;
text-align: center;
border: 1px #DDDDDD solid;
color: #666666;
cursor: pointer;
background-color: #FAFAFA;
}
.b-pager li.not-active
{
cursor: default;
}
.b-pager li.current
{
background-color: #447CB5;
border-color: #447CB5;
color: #FFF;
cursor: default;
}
.b-pager__items
{
float: right;
}
.b-pager__step
{
float: left;
}
.b-pager__step select
{
display: inline-block;
width: 50px;
height: 24px;
padding: 0 15px 0 6px;
}
.b-pager__info
{
float: left;
margin-left: 50px;
line-height: 22px;
}
.table-data-loading
{
position: relative;
margin-bottom: -500px;
width: 100%;
height: 500px;
background: url(../img/ajax-loader-transp.gif) center center no-repeat;
z-index: 2;
}
.b-offers-list_controls input.date-value {
width: 100px;
}
.b-offers-list_controls .partners-status {
float: right;
}
.b-offers-list_controls .order-period {
width: 135px;
}
.panel-body.active table tbody tr.disabled
{
display: none !important;
}
.panel-body.disabled table tbody tr
{
display: none;
}
.panel-body.disabled table tbody tr.disabled
{
display: table-row;
}
.b-offers-list_disabled-count
{
display: none;
color: #A0A0A0;
}
.b-offers-list_controls-period
{
float: right;
}
table.offers thead tr th.is-br
{
font-size: 13px;
line-height: 14px;
}
table.offers tbody tr td .offer-info
{
font-size: 12px;
}
table.offers tbody tr td.stat
{
font-size: 12px;
font-family: monospace;
}
table.offers thead tr th input.select-all,
table.offers tbody tr td input.is-active
{
vertical-align: -2px;
margin-right: 2px;
}
table.offers thead tr th span[data-sort="id"]
{
margin-left: 4px;
}
/* Таблица стилей к странице списка объявлений */
table.adds input[type="checkbox"]
{
vertical-align: -2px;
}
table.adds td .title
{
font-weight: bold;
}
table.adds td .price
{
color: #337ab7;
}
table.adds td .link-offer
{
font-size: 12px;
font-weight: bold;
color: #337ab7;
}
table.adds tbody tr td.stat
{
font-size: 12px;
font-family: monospace;
white-space: nowrap;
}
table.table-striped.adds td.stat span
{
font-weight: normal;
}
\ No newline at end of file
This diff is collapsed.
/* Таблица стилей к странице фида */
.b-content__work.inner
{
max-width: 1240px;
margin: 0 auto;
}
.b-content__work.inner input[type="checkbox"]
{
vertical-align: -2px;
cursor: pointer;
}
.b-clear
{
clear: both;
}
.b-left
{
position: relative;
float: left;
margin-bottom: 15px;
width: 50%;
}
.b-left-fade
{
position: absolute;
top: 0;
left: 0;
height: 100%;
width: 100%;
z-index: 10;
}
.b-right
{
float: left;
width: 50%;
padding-left: 25px;
}
.form-group
{
margin-bottom: 5px;
}
.editor,
.editor-base
{
height: 200px;
border: 1px solid #CCC;
border-radius: 4px;
}
.editor-base
{
height: 583px;
}
.form-group-config label
{
width: 70px;
}
.form-group-config span span
{
display: inline-block;
min-width: 45px;
}
.form-control.size,
.form-control.items,
.form-control.animation,
.form-control.logo
{
display: inline-block;
width: 120px;
}
.form-control.size.from-base,
.form-control.items.from-base,
.form-control.animation.from-base,
.form-control.logo.from-base
{
border-color: #337AB7;
color: #337AB7;
}
.form-group.logo div
{
padding-left: 20px;
}
.form-group.logo div label
{
width: 40px;
}
.form-group.logo div span
{
display: inline-block;
min-width: 45px;
}
.form-group.logo div input
{
margin-bottom: 5px;
}
.form-control.skin-base
{
width: 215px;
}
.b-save
{
display: none;
margin-left: 15px;
}
This diff is collapsed.
/* Таблица стилей к страницам с широкой таблицей в контенте*/
/*
header, main, footer {
min-width: 1344px;
}
......@@ -14,6 +15,47 @@ header nav.wrapp {
min-width: 1270px;
max-width: 1440px;
}
*/
table .btn.btn-primary,
table .btn.btn-danger
{
float: left;
font-size: 12px;
height: 20px;
line-height: 6px;
margin-bottom: 4px;
}
table.orders thead tr th
{
font-size: 13px;
line-height: 14px;
font-weight: bold;
color: #919191;
}
/*
table thead tr th.is-br
{
font-size: 12px;
line-height: 12px;
}
*/
table tbody tr td.is-br
{
font-size: 12px;
line-height: 14px;
}
table.orders tbody tr td .zone-id
{
font-family: monospace;
}
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="12" height="13"><g stroke-width="2" stroke="#fff" fill="none"><path d="M11.29 11.71l-4-4"/><circle cx="5" cy="5" r="4"/></g></svg>
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment