summaryrefslogtreecommitdiffstats
path: root/non-puppet/qtmetrics2/src
diff options
context:
space:
mode:
authorJuha Sippola <juhasippola@outlook.com>2015-07-01 16:27:38 +0300
committerTony Sarajärvi <tony.sarajarvi@theqtcompany.com>2015-09-16 07:32:13 +0000
commit58ce8abda57dec8843b14273a6261ae52dcfcc04 (patch)
tree604413e6948f0b7cbe8ed9feb58d5464a3fe7545 /non-puppet/qtmetrics2/src
parent64a14e09f7d3a73f58758f67fe35a779f56f580b (diff)
Qt Metrics 2 (v0.8): Platform pages
Implemented the platform views into build project page by filtering the confs based on the target os. Buttons indicate the selection and can be used to change between the platforms. Home page buttons activated. Change-Id: Id175ff4279091d886d779307ccdf8dd795ffe456 Reviewed-by: Tony Sarajärvi <tony.sarajarvi@theqtcompany.com>
Diffstat (limited to 'non-puppet/qtmetrics2/src')
-rw-r--r--non-puppet/qtmetrics2/src/Database.php117
-rw-r--r--non-puppet/qtmetrics2/src/Factory.php14
-rw-r--r--non-puppet/qtmetrics2/src/test/DatabaseTest.php142
-rw-r--r--non-puppet/qtmetrics2/src/test/FactoryTest.php56
4 files changed, 283 insertions, 46 deletions
diff --git a/non-puppet/qtmetrics2/src/Database.php b/non-puppet/qtmetrics2/src/Database.php
index 5ebf6e1..92bc163 100644
--- a/non-puppet/qtmetrics2/src/Database.php
+++ b/non-puppet/qtmetrics2/src/Database.php
@@ -34,8 +34,8 @@
/**
* Database class
- * @version 0.6
- * @since 30-06-2015
+ * @version 0.7
+ * @since 01-07-2015
* @author Juha Sippola
*/
@@ -186,23 +186,22 @@ class Database {
}
/**
- * Get list of target platform os's and versions
- * @return array (string os, string os_version)
+ * Get list of target platform os's
+ * @return array (string os)
*/
- public function getTargetPlatforms()
+ public function getTargetPlatformOs()
{
$result = array();
$query = $this->db->prepare("
- SELECT platform.os, platform.os_version
+ SELECT DISTINCT platform.os
FROM conf
INNER JOIN platform ON conf.target_id = platform.id
- GROUP BY os_version;
+ ORDER BY platform.os;
");
$query->execute(array());
while($row = $query->fetch(PDO::FETCH_ASSOC)) {
$result[] = array(
- 'os' => $row['os'],
- 'os_version' => $row['os_version']
+ 'os' => $row['os']
);
}
return $result;
@@ -731,6 +730,106 @@ class Database {
}
/**
+ * Get conf run data for selected target os by branch
+ * @param string $runProject
+ * @param string $runState
+ * @param string $targetOs
+ * @return array (string branch, string conf, string build_key, bool forcesuccess, bool insignificant, string result, string timestamp, string duration)
+ */
+ public function getConfOsBuildsByBranch($runProject, $runState, $targetOs)
+ {
+ $result = array();
+ $query = $this->db->prepare("
+ SELECT
+ branch.name AS branch,
+ conf.name AS conf,
+ project_run.build_key,
+ conf_run.forcesuccess,
+ conf_run.insignificant,
+ conf_run.result,
+ conf_run.timestamp,
+ conf_run.duration
+ FROM conf_run
+ INNER JOIN conf ON conf_run.conf_id = conf.id
+ INNER JOIN project_run ON conf_run.project_run_id = project_run.id
+ INNER JOIN branch ON project_run.branch_id = branch.id
+ WHERE
+ project_run.project_id = (SELECT id FROM project WHERE name = ?) AND
+ project_run.state_id = (SELECT id FROM state WHERE name = ?) AND
+ conf.target_id IN (SELECT id FROM platform WHERE os = ?)
+ ORDER BY branch.name, conf, project_run.timestamp DESC;
+ ");
+ $query->execute(array(
+ $runProject,
+ $runState,
+ $targetOs
+ ));
+ while($row = $query->fetch(PDO::FETCH_ASSOC)) {
+ $result[] = array(
+ 'branch' => $row['branch'],
+ 'conf' => $row['conf'],
+ 'buildKey' => $row['build_key'],
+ 'forcesuccess' => $row['forcesuccess'],
+ 'insignificant' => $row['insignificant'],
+ 'result' => $row['result'],
+ 'timestamp' => $row['timestamp'],
+ 'duration' => $row['duration']
+ );
+ }
+ return $result;
+ }
+
+ /**
+ * Get conf run data for selected conf by branch
+ * @param string $runProject
+ * @param string $runState
+ * @param string $conf
+ * @return array (string branch, string conf, string build_key, bool forcesuccess, bool insignificant, string result, string timestamp, string duration)
+ */
+ public function getConfBuildByBranch($runProject, $runState, $conf)
+ {
+ $result = array();
+ $query = $this->db->prepare("
+ SELECT
+ branch.name AS branch,
+ conf.name AS conf,
+ project_run.build_key,
+ conf_run.forcesuccess,
+ conf_run.insignificant,
+ conf_run.result,
+ conf_run.timestamp,
+ conf_run.duration
+ FROM conf_run
+ INNER JOIN conf ON conf_run.conf_id = conf.id
+ INNER JOIN project_run ON conf_run.project_run_id = project_run.id
+ INNER JOIN branch ON project_run.branch_id = branch.id
+ WHERE
+ project_run.project_id = (SELECT id FROM project WHERE name = ?) AND
+ project_run.state_id = (SELECT id FROM state WHERE name = ?) AND
+ conf.name = ?
+ ORDER BY branch.name, conf, project_run.timestamp DESC;
+ ");
+ $query->execute(array(
+ $runProject,
+ $runState,
+ $conf
+ ));
+ while($row = $query->fetch(PDO::FETCH_ASSOC)) {
+ $result[] = array(
+ 'branch' => $row['branch'],
+ 'conf' => $row['conf'],
+ 'buildKey' => $row['build_key'],
+ 'forcesuccess' => $row['forcesuccess'],
+ 'insignificant' => $row['insignificant'],
+ 'result' => $row['result'],
+ 'timestamp' => $row['timestamp'],
+ 'duration' => $row['duration']
+ );
+ }
+ return $result;
+ }
+
+ /**
* Get run results for a testset in specified builds by branch and configuration
* @param string $testset
* @param $testsetProject
diff --git a/non-puppet/qtmetrics2/src/Factory.php b/non-puppet/qtmetrics2/src/Factory.php
index f8e0378..3712013 100644
--- a/non-puppet/qtmetrics2/src/Factory.php
+++ b/non-puppet/qtmetrics2/src/Factory.php
@@ -34,8 +34,8 @@
/**
* Factory class
- * @version 0.4
- * @since 30-06-2015
+ * @version 0.5
+ * @since 01-07-2015
* @author Juha Sippola
*/
@@ -239,12 +239,18 @@ class Factory {
* Create ConfRun objects for those in database
* @param string $runProject
* @param string $runState
+ * @param string $targetOs
* @return array ConfRun objects
*/
- public static function createConfRuns($runProject, $runState)
+ public static function createConfRuns($runProject, $runState, $targetOs, $conf)
{
$objects = array();
- $dbEntries = self::db()->getConfBuildsByBranch($runProject, $runState);
+ if (empty($targetOs) and empty($conf))
+ $dbEntries = self::db()->getConfBuildsByBranch($runProject, $runState);
+ else if (!empty($targetOs))
+ $dbEntries = self::db()->getConfOsBuildsByBranch($runProject, $runState, $targetOs);
+ else
+ $dbEntries = self::db()->getConfBuildByBranch($runProject, $runState, $conf);
foreach($dbEntries as $entry) {
$obj = new ConfRun(
$entry['conf'],
diff --git a/non-puppet/qtmetrics2/src/test/DatabaseTest.php b/non-puppet/qtmetrics2/src/test/DatabaseTest.php
index e15157f..00a0d9d 100644
--- a/non-puppet/qtmetrics2/src/test/DatabaseTest.php
+++ b/non-puppet/qtmetrics2/src/test/DatabaseTest.php
@@ -38,8 +38,8 @@ require_once(__DIR__.'/../Factory.php');
* Database unit test class
* Some of the tests require the test data as inserted into database with qtmetrics_insert.sql
* @example To run (in qtmetrics root directory): php <path-to-phpunit>/phpunit.phar ./src/test
- * @version 0.6
- * @since 30-06-2015
+ * @version 0.7
+ * @since 01-07-2015
* @author Juha Sippola
*/
@@ -50,7 +50,7 @@ class DatabaseTest extends PHPUnit_Framework_TestCase
* Test getProjects
* @dataProvider testGetProjectsData
*/
- public function testGetProjects($project)
+ public function testGetProjects($exp_project)
{
$items = array();
$db = Factory::db();
@@ -60,7 +60,7 @@ class DatabaseTest extends PHPUnit_Framework_TestCase
$this->assertArrayHasKey('name', $row);
$items[] = $row['name'];
}
- $this->assertContains($project, $items);
+ $this->assertContains($exp_project, $items);
}
public function testGetProjectsData()
{
@@ -74,7 +74,7 @@ class DatabaseTest extends PHPUnit_Framework_TestCase
* Test getBranches
* @dataProvider testGetBranchesData
*/
- public function testGetBranches($branch)
+ public function testGetBranches($exp_branch)
{
$items = array();
$db = Factory::db();
@@ -84,7 +84,7 @@ class DatabaseTest extends PHPUnit_Framework_TestCase
$this->assertArrayHasKey('name', $row);
$items[] = $row['name'];
}
- $this->assertContains($branch, $items);
+ $this->assertContains($exp_branch, $items);
}
public function testGetBranchesData()
{
@@ -97,7 +97,7 @@ class DatabaseTest extends PHPUnit_Framework_TestCase
* Test getStates
* @dataProvider testGetStateData
*/
- public function testGetStates($state)
+ public function testGetStates($exp_state)
{
$items = array();
$db = Factory::db();
@@ -107,7 +107,7 @@ class DatabaseTest extends PHPUnit_Framework_TestCase
$this->assertArrayHasKey('name', $row);
$items[] = $row['name'];
}
- $this->assertContains($state, $items);
+ $this->assertContains($exp_state, $items);
}
public function testGetStateData()
{
@@ -194,33 +194,28 @@ class DatabaseTest extends PHPUnit_Framework_TestCase
}
/**
- * Test getTargetPlatforms
- * @dataProvider testGetTargetPlatformsData
+ * Test getTargetPlatformOs
+ * @dataProvider testGetTargetPlatformOsData
*/
- public function testGetTargetPlatforms($exp_os, $exp_os_version, $exp_count_min)
+ public function testGetTargetPlatformOs($exp_os, $exp_count)
{
$db = Factory::db();
- $result = $db->getTargetPlatforms();
+ $result = $db->getTargetPlatformOs();
$this->assertNotEmpty($result);
$osCount = 0;
- $versionCount = 0;
foreach($result as $row) {
$this->assertArrayHasKey('os', $row);
- $this->assertArrayHasKey('os_version', $row);
if ($row['os'] === $exp_os)
$osCount++;
- if ($row['os_version'] === $exp_os_version)
- $versionCount++;
}
- $this->assertGreaterThanOrEqual($exp_count_min, $osCount);
- $this->assertGreaterThanOrEqual($exp_count_min, $versionCount);
+ $this->assertGreaterThanOrEqual($exp_count, $osCount);
}
- public function testGetTargetPlatformsData()
+ public function testGetTargetPlatformOsData()
{
return array(
- array('linux', 'android', 1),
- array('windows', 'win64', 1),
- array('windows', 'invalid', 0)
+ array('linux', 1),
+ array('windows', 1),
+ array('invalid', 0)
);
}
@@ -618,13 +613,114 @@ class DatabaseTest extends PHPUnit_Framework_TestCase
array('Qt5', 'state', 'dev', 'linux-g++_developer-build_qtnamespace_qtlibinfix_Ubuntu_11.10_x64', '1023', 'FAILURE', 1),
array('Qt5', 'state', 'stable', 'win32-msvc2010_developer-build_angle_Windows_7', '1348', 'SUCCESS', 1),
array('Qt5', 'state', 'stable', 'macx-clang_developer-build_OSX_10.8', '1348', 'SUCCESS', 1),
- array('Qt5', 'state', 'stable', 'win32-msvc2010_developer-build_angle_Windows_7', '1348', 'SUCCESS', 1),
array('Qt5', 'state', 'dev', 'linux-g++-32_developer-build_Ubuntu_10.04_x86', 'BuildKeyInStringFormat12345', 'FAILURE', 1),
array('Qt5', 'invalid', '', '', '', '', 0)
);
}
/**
+ * Test getConfOsBuildsByBranch
+ * @dataProvider testGetConfOsBuildsByBranchData
+ */
+ public function testGetConfOsBuildsByBranch($runProject, $runState, $targetOs, $exp_branch, $exp_conf, $exp_key, $exp_result, $has_data, $has_conf)
+ {
+ $branches = array();
+ $confs = array();
+ $keys = array();
+ $results = array();
+ $db = Factory::db();
+ $result = $db->getConfOsBuildsByBranch($runProject, $runState, $targetOs);
+ foreach($result as $row) {
+ $this->assertArrayHasKey('branch', $row);
+ $this->assertArrayHasKey('conf', $row);
+ $this->assertArrayHasKey('buildKey', $row);
+ $this->assertArrayHasKey('forcesuccess', $row);
+ $this->assertArrayHasKey('insignificant', $row);
+ $this->assertArrayHasKey('result', $row);
+ $this->assertArrayHasKey('timestamp', $row);
+ $this->assertArrayHasKey('duration', $row);
+ $branches[] = $row['branch'];
+ $confs[] = $row['conf'];
+ $keys[] = $row['buildKey'];
+ $results[] = $row['result'];
+ }
+ if ($has_data) {
+ $this->assertNotEmpty($result);
+ $this->assertContains($exp_branch, $branches);
+ if ($has_conf)
+ $this->assertContains($exp_conf, $confs);
+ else
+ $this->assertNotContains($exp_conf, $confs);
+ $this->assertContains($exp_key, $keys);
+ $this->assertContains($exp_result, $results);
+ } else {
+ $this->assertEmpty($result);
+ }
+ }
+ public function testGetConfOsBuildsByBranchData()
+ {
+ return array(
+ array('Qt5', 'state', 'linux', 'dev', 'linux-g++_developer-build_qtnamespace_qtlibinfix_Ubuntu_11.10_x64', '1023', 'FAILURE', 1, 1),
+ array('Qt5', 'state', 'linux', 'dev', 'linux-g++-32_developer-build_Ubuntu_10.04_x86', 'BuildKeyInStringFormat12345', 'FAILURE', 1, 1),
+ array('Qt5', 'state', 'windows', 'stable', 'win32-msvc2010_developer-build_angle_Windows_7', '1348', 'SUCCESS', 1, 1),
+ array('Qt5', 'state', 'osx', 'stable', 'macx-clang_developer-build_OSX_10.8', '1348', 'SUCCESS', 1, 1),
+ array('Qt5', 'state', 'linux', 'stable', 'macx-clang_developer-build_OSX_10.8', '1348', 'SUCCESS', 1, 0),
+ array('Qt5', 'state', 'invalid', '', '', '', '', 0, 0)
+ );
+ }
+
+ /**
+ * Test getConfBuildByBranch
+ * @dataProvider testGetConfBuildByBranchData
+ */
+ public function testGetConfBuildByBranch($runProject, $runState, $conf, $exp_branch, $exp_conf, $exp_key, $exp_result, $has_data, $has_conf)
+ {
+ $branches = array();
+ $confs = array();
+ $keys = array();
+ $results = array();
+ $db = Factory::db();
+ $result = $db->getConfBuildByBranch($runProject, $runState, $conf);
+ foreach($result as $row) {
+ $this->assertArrayHasKey('branch', $row);
+ $this->assertArrayHasKey('conf', $row);
+ $this->assertArrayHasKey('buildKey', $row);
+ $this->assertArrayHasKey('forcesuccess', $row);
+ $this->assertArrayHasKey('insignificant', $row);
+ $this->assertArrayHasKey('result', $row);
+ $this->assertArrayHasKey('timestamp', $row);
+ $this->assertArrayHasKey('duration', $row);
+ $branches[] = $row['branch'];
+ $confs[] = $row['conf'];
+ $keys[] = $row['buildKey'];
+ $results[] = $row['result'];
+ }
+ if ($has_data) {
+ $this->assertNotEmpty($result);
+ $this->assertContains($exp_branch, $branches);
+ if ($has_conf)
+ $this->assertContains($exp_conf, $confs);
+ else
+ $this->assertNotContains($exp_conf, $confs);
+ $this->assertContains($exp_key, $keys);
+ $this->assertContains($exp_result, $results);
+ } else {
+ $this->assertEmpty($result);
+ }
+ }
+ public function testGetConfBuildByBranchData()
+ {
+ return array(
+ array('Qt5', 'state', 'linux-g++_developer-build_qtnamespace_qtlibinfix_Ubuntu_11.10_x64', 'dev', 'linux-g++_developer-build_qtnamespace_qtlibinfix_Ubuntu_11.10_x64', '1023', 'FAILURE', 1, 1),
+ array('Qt5', 'state', 'linux-g++-32_developer-build_Ubuntu_10.04_x86', 'dev', 'linux-g++-32_developer-build_Ubuntu_10.04_x86', 'BuildKeyInStringFormat12345', 'FAILURE', 1, 1),
+ array('Qt5', 'state', 'win32-msvc2010_developer-build_angle_Windows_7', 'stable', 'win32-msvc2010_developer-build_angle_Windows_7', '1348', 'SUCCESS', 1, 1),
+ array('Qt5', 'state', 'macx-clang_developer-build_OSX_10.8', 'stable', 'macx-clang_developer-build_OSX_10.8', '1348', 'SUCCESS', 1, 1),
+ array('Qt5', 'state', 'win32-msvc2010_developer-build_angle_Windows_7', 'stable', 'macx-clang_developer-build_OSX_10.8', '1348', 'SUCCESS', 1, 0),
+ array('Qt5', 'state', 'invalid', '', '', '', '', 0, 0)
+ );
+ }
+
+ /**
* Test getTestsetResultsByBranchConf
* @dataProvider testGetTestsetResultsByBranchConfData
*/
diff --git a/non-puppet/qtmetrics2/src/test/FactoryTest.php b/non-puppet/qtmetrics2/src/test/FactoryTest.php
index aa852a6..6508397 100644
--- a/non-puppet/qtmetrics2/src/test/FactoryTest.php
+++ b/non-puppet/qtmetrics2/src/test/FactoryTest.php
@@ -37,8 +37,8 @@ require_once(__DIR__.'/../Factory.php');
/**
* Factory unit test class
* @example To run (in qtmetrics root directory): php <path-to-phpunit>/phpunit.phar ./src/test
- * @version 0.4
- * @since 30-06-2015
+ * @version 0.5
+ * @since 01-07-2015
* @author Juha Sippola
*/
@@ -244,18 +244,39 @@ class FactoryTest extends PHPUnit_Framework_TestCase
* Test createConfRuns
* @dataProvider testCreateConfRunsData
*/
- public function testCreateConfRuns($name, $projectName, $branchName, $stateName, $buildKey, $result, $insignificant, $forcesuccess, $timestamp, $duration)
+ public function testCreateConfRuns($runProject, $runState, $targetOs, $conf, $exp_branch, $exp_buildKey, $exp_conf, $has_data)
{
- $runs = Factory::createConfRuns($name, $projectName, $branchName, $stateName, $buildKey, $result, $insignificant, $forcesuccess, $timestamp, $duration);
+ $branches = array();
+ $buildKeys = array();
+ $confs = array();
+ $runs = Factory::createConfRuns($runProject, $runState, $targetOs, $conf);
foreach($runs as $run) {
$this->assertTrue($run instanceof ConfRun);
+ $branches[] = $run->getBranchName();
+ $buildKeys[] = $run->getBuildKey();
+ $confs[] = $run->getName();
+ }
+ if ($has_data) {
+ $this->assertContains($exp_branch, $branches);
+ $this->assertContains($exp_buildKey, $buildKeys);
+ $this->assertContains($exp_conf, $confs);
+ } else {
+ $this->assertEmpty($runs);
}
}
public function testCreateConfRunsData()
{
return array(
- array('win64-msvc2012_developer-build_qtnamespace_Windows_8', 'Qt5', 'stable', 'state', '1348', 'failed', true, false, '28.5.2013 0:54', 8130),
- array('linux-g++-32_developer-build_Ubuntu_10.04_x86', 'Qt5', 'dev', 'state', 'BuildKeyInStringFormat12345', 'failed', false, true, '28.5.2013 0:54', 8130)
+ array('Qt5', 'state', '', '', 'stable', '1348', 'win64-msvc2012_developer-build_qtnamespace_Windows_8', 1),
+ array('Qt5', 'state', '', '', 'stable', '1348', 'linux-g++-32_developer-build_Ubuntu_10.04_x86', 1),
+ array('Qt5', 'state', 'windows', '', 'stable', '1348', 'win64-msvc2012_developer-build_qtnamespace_Windows_8', 1),
+ array('Qt5', 'state', 'linux', '', 'stable', '1348', 'linux-g++-32_developer-build_Ubuntu_10.04_x86', 1),
+ array('Qt5', 'state', 'linux', '', 'dev', 'BuildKeyInStringFormat12345', 'linux-g++-32_developer-build_Ubuntu_10.04_x86', 1),
+ array('Qt5', 'state', 'invalid', '', '', '', '', 0),
+ array('Qt5', 'state', '', 'win64-msvc2012_developer-build_qtnamespace_Windows_8', 'stable', '1348', 'win64-msvc2012_developer-build_qtnamespace_Windows_8', 1),
+ array('Qt5', 'state', '', 'linux-g++-32_developer-build_Ubuntu_10.04_x86', 'stable', '1348', 'linux-g++-32_developer-build_Ubuntu_10.04_x86', 1),
+ array('Qt5', 'state', '', 'linux-g++-32_developer-build_Ubuntu_10.04_x86', 'dev', 'BuildKeyInStringFormat12345', 'linux-g++-32_developer-build_Ubuntu_10.04_x86', 1),
+ array('Qt5', 'state', '', 'invalid', '', '', '', 0),
);
}
@@ -263,18 +284,33 @@ class FactoryTest extends PHPUnit_Framework_TestCase
* Test createTestsetRuns
* @dataProvider testCreateTestsetRunsData
*/
- public function testCreateTestsetRuns($name, $testsetProject, $projectName, $branchName, $stateName, $buildKey, $confName, $run, $result, $insignificant, $timestamp, $duration)
+ public function testCreateTestsetRuns($name, $testsetProject, $runProject, $runState, $exp_branch, $exp_buildKey, $exp_conf, $has_data)
{
- $runs = Factory::createTestsetRuns($name, $testsetProject, $projectName, $branchName, $stateName, $buildKey, $confName, $run, $result, $insignificant, $timestamp, $duration);
+ $branches = array();
+ $buildKeys = array();
+ $confs = array();
+ $runs = Factory::createTestsetRuns($name, $testsetProject, $runProject, $runState);
foreach($runs as $run) {
$this->assertTrue($run instanceof TestsetRun);
+ $branches[] = $run->getBranchName();
+ $buildKeys[] = $run->getBuildKey();
+ $confs[] = $run->getConfName();
+ }
+ if ($has_data) {
+ $this->assertContains($exp_branch, $branches);
+ $this->assertContains($exp_buildKey, $buildKeys);
+ $this->assertContains($exp_conf, $confs);
+ } else {
+ $this->assertEmpty($runs);
}
}
public function testCreateTestsetRunsData()
{
return array(
- array('tst_qftp', 'qtbase', 'Qt5', 'stable', 'state', '1348', 'win64-msvc2012_developer-build_qtnamespace_Windows_8', 5, 'failed', true, '28.5.2013 0:54', 8130),
- array('tst_qfont', 'qtbase', 'Qt5', 'dev', 'state', 'BuildKeyInStringFormat12345', 'linux-g++-32_developer-build_Ubuntu_10.04_x86', 1, 'failed', false, '28.5.2013 0:54', 8130)
+ array('tst_qftp', 'qtbase', 'Qt5', 'state', 'stable', '1348', 'win64-msvc2012_developer-build_qtnamespace_Windows_8', 1),
+ array('tst_qfont', 'qtbase', 'Qt5', 'state', 'dev', 'BuildKeyInStringFormat12345', 'linux-g++-32_developer-build_Ubuntu_10.04_x86', 1),
+ array('invalid', 'qtbase', 'Qt5', 'state', '', '', '', 0),
+ array('tst_qftp', 'invalid', 'Qt5', 'state', '', '', '', 0),
);
}