From 8327be620bd5a248d147e6dfecf6f0a759cb7eb2 Mon Sep 17 00:00:00 2001 From: Gwenael HELLEUX Date: Sun, 2 Dec 2018 19:48:42 +0100 Subject: [PATCH 1/2] Fix phpunit version 7.4 --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 8742549..4025fa2 100644 --- a/composer.json +++ b/composer.json @@ -13,7 +13,7 @@ "php": ">=7.0.4" }, "require-dev": { - "phpunit/phpunit": "dev-master" + "phpunit/phpunit": "^7.4" }, "autoload": { "psr-4": { "Waddle\\": "src/" } From af82337c267a64ba0487e07d9a7df0fdc1ccf91e Mon Sep 17 00:00:00 2001 From: Gwenael HELLEUX Date: Sun, 2 Dec 2018 19:49:03 +0100 Subject: [PATCH 2/2] TCX detects namespace --- src/Parsers/TCXParser.php | 30 +- tests/Parsers/TCXParserTest.php | 71 +- tests/run_garmin.tcx | 2753 +++++++++++++++++++++++++++++++ 3 files changed, 2829 insertions(+), 25 deletions(-) create mode 100644 tests/run_garmin.tcx diff --git a/src/Parsers/TCXParser.php b/src/Parsers/TCXParser.php index ce3b3c1..504933d 100644 --- a/src/Parsers/TCXParser.php +++ b/src/Parsers/TCXParser.php @@ -9,7 +9,13 @@ class TCXParser extends Parser { + const NS_ACTIVITY_EXTENSION_V2 = 'http://www.garmin.com/xmlschemas/ActivityExtension/v2'; + /** + * @var string + */ + private $nameNSActivityExtensionV2; + /** * Parse the TCX file * @param type $file @@ -30,6 +36,7 @@ public function parse($file) if (!isset($data->Activities->Activity)){ throw new \Exception("Unable to find valid activity in file contents"); } + $this->detectsNamespace($data); // Parse the first activity $activityNode = $data->Activities->Activity[0]; @@ -48,6 +55,22 @@ public function parse($file) } + + /** + * + * @var \SimpleXMLElement $xml + */ + private function detectsNamespace(\SimpleXMLElement $xml) + { + $this->nameNSActivityExtensionV2 = null; + + $namespaces = $xml->getNamespaces(true); + foreach($namespaces as $name => $ns) { + if ($ns === self::NS_ACTIVITY_EXTENSION_V2) { + $this->nameNSActivityExtensionV2 = $name; + } + } + } /** * Parse the lap XML @@ -87,9 +110,10 @@ protected function parseTrackPoint($trackPointNode) $point->setAltitude( (float)$trackPointNode->AltitudeMeters ); $point->setDistance( (float)$trackPointNode->DistanceMeters ); - if (isset($trackPointNode->Extensions->children('x', true)->TPX->children()->Speed)) - { - $point->setSpeed( (float)$trackPointNode->Extensions->children('x', true)->TPX->children()->Speed ); + if ($this->nameNSActivityExtensionV2) { + if (isset($trackPointNode->Extensions->children('x', true)->TPX->children()->Speed)) { + $point->setSpeed( (float)$trackPointNode->Extensions->children('x', true)->TPX->children()->Speed ); + } } return $point; diff --git a/tests/Parsers/TCXParserTest.php b/tests/Parsers/TCXParserTest.php index c608ecc..65a956a 100644 --- a/tests/Parsers/TCXParserTest.php +++ b/tests/Parsers/TCXParserTest.php @@ -4,75 +4,102 @@ class TXCParserTest extends \PHPUnit\Framework\TestCase { - - public $parser, $activity; + public $parser; public function setUp() { $this->parser = new \Waddle\Parsers\TCXParser(); - $this->activity = $this->parser->parse( __DIR__ . '/../run.tcx' ); } - - // Not sure how to test this, as if run on a system with different timezone/daylight saving, will be different -// public function testActivityStartTime(){ -// $this->assertEquals('2017-05-27 09:13:01', $this->activity->getStartTime('Y-m-d H:i:s')); -// } + + public function testDetectsNamespace() { + $reflector = new \ReflectionClass($this->parser ); + $method = $reflector->getMethod('detectsNamespace'); + $method->setAccessible(true); + $method->invokeArgs($this->parser, [simplexml_load_file(__DIR__ . '/../run_garmin.tcx')]); + + $reflector = new \ReflectionClass($this->parser); + $property = $reflector->getProperty('nameNSActivityExtensionV2'); + $property->setAccessible(true); + + $this->assertEquals('ns3', $property->getValue($this->parser)); + } + + public function testDetectsNamespaceSeveralParse() { + $reflector = new \ReflectionClass($this->parser ); + $method = $reflector->getMethod('detectsNamespace'); + $method->setAccessible(true); + + $reflector = new \ReflectionClass($this->parser); + $property = $reflector->getProperty('nameNSActivityExtensionV2'); + + $method->invokeArgs($this->parser, [simplexml_load_file(__DIR__ . '/../run_garmin.tcx')]); + $property->setAccessible(true); + $this->assertEquals('ns3', $property->getValue($this->parser)); + + $method->invokeArgs($this->parser, [simplexml_load_file(__DIR__ . '/../run.tcx')]); + $property->setAccessible(true); + $this->assertEquals('x', $property->getValue($this->parser)); + } + + private function getActivity() { + return $this->parser->parse( __DIR__ . '/../run.tcx' ); + } public function testActivityLaps(){ - $this->assertEquals(1, count($this->activity->getLaps())); + $this->assertEquals(1, count($this->getActivity()->getLaps())); } public function testActivityTotalDistance(){ - $this->assertEquals(4824.94, $this->activity->getTotalDistance()); + $this->assertEquals(4824.94, $this->getActivity()->getTotalDistance()); } public function testActivityTotalDuration(){ - $this->assertEquals(1424, $this->activity->getTotalDuration()); + $this->assertEquals(1424, $this->getActivity()->getTotalDuration()); } public function testActivityAveragePacePerMile(){ - $this->assertEquals('00:07:54', $this->activity->getAveragePacePerMile()); + $this->assertEquals('00:07:54', $this->getActivity()->getAveragePacePerMile()); } public function testActivityAveragePacePerKilometre(){ - $this->assertEquals('00:04:55', $this->activity->getAveragePacePerKilometre()); + $this->assertEquals('00:04:55', $this->getActivity()->getAveragePacePerKilometre()); } public function testActivityAverageSpeedMPH(){ - $this->assertEquals('7.58', round($this->activity->getAverageSpeedInMPH(), 2)); + $this->assertEquals('7.58', round($this->getActivity()->getAverageSpeedInMPH(), 2)); } public function testActivityAverageSpeedKPH(){ - $this->assertEquals('12.20', round($this->activity->getAverageSpeedInKPH(), 2)); + $this->assertEquals('12.20', round($this->getActivity()->getAverageSpeedInKPH(), 2)); } public function testActivityTotalCalories(){ - $this->assertEquals(372, $this->activity->getTotalCalories()); + $this->assertEquals(372, $this->getActivity()->getTotalCalories()); } public function testActivityMaxSpeedMPH(){ - $this->assertEquals('10.45', round($this->activity->getMaxSpeedInMPH(), 2)); + $this->assertEquals('10.45', round($this->getActivity()->getMaxSpeedInMPH(), 2)); } public function testActivityMaxSpeedKPH(){ - $this->assertEquals('16.81', round($this->activity->getMaxSpeedInKPH(), 2)); + $this->assertEquals('16.81', round($this->getActivity()->getMaxSpeedInKPH(), 2)); } public function testActivityTotalAscent(){ - $result = $this->activity->getTotalAscentDescent(); + $result = $this->getActivity()->getTotalAscentDescent(); $this->assertEquals(50.9, $result['ascent']); } public function testActivityTotalDescent(){ - $result = $this->activity->getTotalAscentDescent(); + $result = $this->getActivity()->getTotalAscentDescent(); $this->assertEquals(50.2, $result['descent']); } public function testActivitySplitsInMiles(){ - $this->assertEquals(3, count($this->activity->getSplits('mi'))); + $this->assertEquals(3, count($this->getActivity()->getSplits('mi'))); } public function testActivitySplitsInKilometres(){ - $this->assertEquals(5, count($this->activity->getSplits('k'))); + $this->assertEquals(5, count($this->getActivity()->getSplits('k'))); } } \ No newline at end of file diff --git a/tests/run_garmin.tcx b/tests/run_garmin.tcx new file mode 100644 index 0000000..65d134f --- /dev/null +++ b/tests/run_garmin.tcx @@ -0,0 +1,2753 @@ + + + + + 2018-11-25T07:20:49.000Z + + 390.0 + 1000.0 + 3.0420000553131104 + 59 + + 137 + + + 150 + + Active + Manual + + + + + 46.158643048256636 + -1.1469579208642244 + + 4.800000190734863 + 2.5299999713897705 + + 112 + + + + 1.184999942779541 + 70 + + + + + + + 46.15868328139186 + -1.1469930410385132 + + 4.599999904632568 + 7.110000133514404 + + 112 + + + + 1.184999942779541 + 93 + + + + + + + 46.15869744680822 + -1.1471690610051155 + + 4.400000095367432 + 20.860000610351562 + + 115 + + + + 2.8269999027252197 + 86 + + + + + + + 46.15867665968835 + -1.1474438197910786 + + 4.400000095367432 + 42.20000076293945 + + 117 + + + + 2.7990000247955322 + 85 + + + + + + + 46.15866140462458 + -1.1475315783172846 + + 4.400000095367432 + 49.619998931884766 + + 118 + + + + 2.305000066757202 + 85 + + + + + + + 46.15851078182459 + -1.1476868111640215 + + 4.599999904632568 + 70.44999694824219 + + 118 + + + + 2.13700008392334 + 93 + + + + + + + 46.158391423523426 + -1.1476892419159412 + + 4.599999904632568 + 83.7300033569336 + + 120 + + + + 2.2950000762939453 + 89 + + + + + + + 46.15820341743529 + -1.147721679881215 + + 4.800000190734863 + 104.87999725341797 + + 123 + + + + 2.4820001125335693 + 87 + + + + + + + 46.15801339969039 + -1.1477191653102636 + + 5.400000095367432 + 125.91999816894531 + + 126 + + + + 2.509999990463257 + 88 + + + + + + + 46.15783897228539 + -1.1477468255907297 + + 6.0 + 145.41000366210938 + + 129 + + + + 2.5290000438690186 + 88 + + + + + + + 46.157706370577216 + -1.1477785930037498 + + 6.400000095367432 + 160.24000549316406 + + 126 + + + + 2.5940001010894775 + 88 + + + + + + + 46.15767493844032 + -1.1477775033563375 + + 6.599999904632568 + 163.6300048828125 + + 128 + + + + 2.6500000953674316 + 82 + + + + + + + 46.15781407803297 + -1.1478178203105927 + + 6.0 + 178.9499969482422 + + 127 + + + + 2.249000072479248 + 87 + + + + + + + 46.15790158510208 + -1.1478329077363014 + + 5.800000190734863 + 188.67999267578125 + + 130 + + + + 2.378999948501587 + 87 + + + + + + + 46.15809353068471 + -1.1478190775960684 + + 5.0 + 210.1199951171875 + + 128 + + + + 2.5940001010894775 + 86 + + + + + + + 46.15825857035816 + -1.1478013917803764 + + 4.800000190734863 + 228.50999450683594 + + 131 + + + + 2.621999979019165 + 86 + + + + + + + 46.15844037383795 + -1.1477513518184423 + + 4.599999904632568 + 249.0800018310547 + + 131 + + + + 2.621999979019165 + 87 + + + + + + + 46.158508602529764 + -1.1477512679994106 + + 4.599999904632568 + 257.239990234375 + + 133 + + + + 2.6029999256134033 + 85 + + + + + + + 46.15838916040957 + -1.1477668583393097 + + 4.599999904632568 + 270.6000061035156 + + 136 + + + + 2.434999942779541 + 88 + + + + + + + 46.15825370885432 + -1.1477858014404774 + + 4.800000190734863 + 285.75 + + 139 + + + + 2.3610000610351562 + 88 + + + + + + + 46.15806033834815 + -1.147795608267188 + + 5.199999809265137 + 307.32000732421875 + + 140 + + + + 2.378999948501587 + 88 + + + + + + + 46.15786738693714 + -1.1478229332715273 + + 5.800000190734863 + 328.8699951171875 + + 138 + + + + 2.500999927520752 + 87 + + + + + + + 46.157768815755844 + -1.147837433964014 + + 6.199999809265137 + 339.95001220703125 + + 139 + + + + 2.6029999256134033 + 87 + + + + + + + 46.157697485759854 + -1.1478505097329617 + + 6.400000095367432 + 355.8900146484375 + + 141 + + + + 2.621999979019165 + 86 + + + + + + + 46.15788943134248 + -1.1478323210030794 + + 5.800000190734863 + 377.3800048828125 + + 143 + + + + 2.4070000648498535 + 89 + + + + + + + 46.1580697260797 + -1.1477916687726974 + + 5.199999809265137 + 397.79998779296875 + + 143 + + + + 2.444999933242798 + 88 + + + + + + + 46.15826711989939 + -1.1477562133222818 + + 4.800000190734863 + 419.8900146484375 + + 144 + + + + 2.61299991607666 + 88 + + + + + + + 46.158453449606895 + -1.1477516032755375 + + 4.599999904632568 + 440.6000061035156 + + 143 + + + + 2.6500000953674316 + 87 + + + + + + + 46.158522851765156 + -1.1477645952254534 + + 4.599999904632568 + 448.5 + + 141 + + + + 2.6410000324249268 + 84 + + + + + + + 46.1584600713104 + -1.1477766651660204 + + 4.599999904632568 + 455.54998779296875 + + 144 + + + + 2.575000047683716 + 88 + + + + + + + 46.158269718289375 + -1.14778446033597 + + 4.800000190734863 + 476.7300109863281 + + 143 + + + + 2.4070000648498535 + 88 + + + + + + + 46.158112389966846 + -1.1477877292782068 + + 5.0 + 494.2300109863281 + + 146 + + + + 2.4630000591278076 + 88 + + + + + + + 46.157918432727456 + -1.14781036041677 + + 5.599999904632568 + 515.9099731445312 + + 144 + + + + 2.4730000495910645 + 88 + + + + + + + 46.15773688070476 + -1.1478460673242807 + + 6.400000095367432 + 536.239990234375 + + 146 + + + + 2.565999984741211 + 87 + + + + + + + 46.15768851712346 + -1.1478393618017435 + + 6.599999904632568 + 541.6400146484375 + + 143 + + + + 2.6029999256134033 + 85 + + + + + + + 46.15768642164767 + -1.1478246096521616 + + 6.599999904632568 + 543.2999877929688 + + 142 + + + + 2.6029999256134033 + 84 + + + + + + + 46.15788255818188 + -1.1478313151746988 + + 5.800000190734863 + 564.9500122070312 + + 140 + + + + 2.378999948501587 + 88 + + + + + + + 46.15800376050174 + -1.1478094384074211 + + 5.400000095367432 + 578.5800170898438 + + 140 + + + + 2.3610000610351562 + 88 + + + + + + + 46.15810224786401 + -1.1477790120989084 + + 5.0 + 589.739990234375 + + 140 + + + + 2.3889999389648438 + 88 + + + + + + + 46.15830165334046 + -1.1477607395499945 + + 4.800000190734863 + 611.989990234375 + + 141 + + + + 2.4730000495910645 + 87 + + + + + + + 46.15848974324763 + -1.1477516032755375 + + 4.599999904632568 + 632.9199829101562 + + 140 + + + + 2.5380001068115234 + 86 + + + + + + + 46.158501813188195 + -1.1477560456842184 + + 4.599999904632568 + 634.47998046875 + + 139 + + + + 2.5380001068115234 + 81 + + + + + + + 46.15844137966633 + -1.1477651819586754 + + 4.599999904632568 + 641.1900024414062 + + 142 + + + + 2.5290000438690186 + 88 + + + + + + + 46.15835236385465 + -1.147771216928959 + + 4.800000190734863 + 651.0999755859375 + + 140 + + + + 2.4820001125335693 + 88 + + + + + + + 46.15815035998821 + -1.147785885259509 + + 5.0 + 673.5900268554688 + + 141 + + + + 2.4630000591278076 + 88 + + + + + + + 46.15804290398955 + -1.1477966140955687 + + 5.199999809265137 + 685.5800170898438 + + 138 + + + + 2.4630000591278076 + 88 + + + + + + + 46.15783913992345 + -1.1478043254464865 + + 6.0 + 708.219970703125 + + 137 + + + + 2.5290000438690186 + 87 + + + + + + + 46.157750291749835 + -1.1478164792060852 + + 6.199999809265137 + 718.1599731445312 + + 136 + + + + 2.556999921798706 + 86 + + + + + + + 46.15771441720426 + -1.1478375177830458 + + 6.400000095367432 + 722.4400024414062 + + 138 + + + + 2.565999984741211 + 85 + + + + + + + 46.157892951741815 + -1.1478372663259506 + + 5.800000190734863 + 742.5499877929688 + + 139 + + + + 2.500999927520752 + 88 + + + + + + + 46.158073246479034 + -1.1478064209222794 + + 5.199999809265137 + 762.6699829101562 + + 139 + + + + 2.5190000534057617 + 88 + + + + + + + 46.15825479850173 + -1.147806840017438 + + 4.800000190734863 + 782.760009765625 + + 141 + + + + 2.565999984741211 + 88 + + + + + + + 46.15845261141658 + -1.1477740667760372 + + 4.599999904632568 + 804.9000244140625 + + 140 + + + + 2.63100004196167 + 87 + + + + + + + 46.15852804854512 + -1.147766187787056 + + 4.599999904632568 + 814.22998046875 + + 140 + + + + 2.6500000953674316 + 84 + + + + + + + 46.158442134037614 + -1.1477754916995764 + + 4.599999904632568 + 823.9000244140625 + + 143 + + + + 2.63100004196167 + 89 + + + + + + + 46.158365020528436 + -1.147769708186388 + + 4.599999904632568 + 832.5 + + 140 + + + + 2.6029999256134033 + 89 + + + + + + + 46.15827332250774 + -1.1477796826511621 + + 4.800000190734863 + 842.72998046875 + + 143 + + + + 2.5940001010894775 + 88 + + + + + + + 46.158161759376526 + -1.1477810237556696 + + 5.0 + 855.1599731445312 + + 146 + + + + 2.5940001010894775 + 89 + + + + + + + 46.157978028059006 + -1.1477882321923971 + + 5.400000095367432 + 875.5800170898438 + + 146 + + + + 2.5940001010894775 + 88 + + + + + + + 46.157798152416945 + -1.1478192452341318 + + 6.199999809265137 + 895.7999877929688 + + 144 + + + + 2.621999979019165 + 88 + + + + + + + 46.15767720155418 + -1.1478208377957344 + + 6.599999904632568 + 908.9600219726562 + + 144 + + + + 2.63100004196167 + 84 + + + + + + + 46.15777149796486 + -1.1478310637176037 + + 6.199999809265137 + 919.4500122070312 + + 143 + + + + 2.6029999256134033 + 86 + + + + + + + 46.15797718986869 + -1.1478370986878872 + + 5.400000095367432 + 942.2899780273438 + + 145 + + + + 2.5850000381469727 + 87 + + + + + + + 46.158077688887715 + -1.1478189937770367 + + 5.199999809265137 + 953.5800170898438 + + 145 + + + + 2.63100004196167 + 88 + + + + + + + 46.15816695615649 + -1.1478161439299583 + + 5.0 + 963.4500122070312 + + 148 + + + + 2.5290000438690186 + 88 + + + + + + + 46.15821632556617 + -1.1478108633309603 + + 4.800000190734863 + 968.9400024414062 + + 149 + + + + 2.5190000534057617 + 88 + + + + + + + 46.15840818732977 + -1.1477863881736994 + + 4.599999904632568 + 990.3200073242188 + + 150 + + + + 2.8459999561309814 + 88 + + + + + + + 46.15845562890172 + -1.1477702111005783 + + 4.599999904632568 + 995.719970703125 + + 147 + + + + 2.818000078201294 + 87 + + + + + + + 46.15849535912275 + -1.1477604880928993 + + 4.599999904632568 + 1000.1599731445312 + + 146 + + + + 2.8369998931884766 + 87 + + + + + + + 2.5450000762939453 + 87 + 93 + + + + + 372.0 + 1000.0 + 3.4619998931884766 + 63 + + 147 + + + 153 + + Active + Manual + + + + + 46.158531149849296 + -1.1477662716060877 + + 4.599999904632568 + 1004.030029296875 + + 143 + + + + 2.8369998931884766 + 84 + + + + + + + 46.15845889784396 + -1.1477807722985744 + + 4.599999904632568 + 1012.4400024414062 + + 147 + + + + 1.809999942779541 + 90 + + + + + + + 46.158272568136454 + -1.1477873101830482 + + 4.800000190734863 + 1033.280029296875 + + 147 + + + + 2.994999885559082 + 89 + + + + + + + 46.15807458758354 + -1.1477716360241175 + + 5.199999809265137 + 1055.469970703125 + + 148 + + + + 2.9760000705718994 + 90 + + + + + + + 46.157919857650995 + -1.147782951593399 + + 5.599999904632568 + 1072.6700439453125 + + 145 + + + + 2.938999891281128 + 88 + + + + + + + 46.15785649046302 + -1.147799463942647 + + 6.0 + 1079.7900390625 + + 149 + + + + 2.930000066757202 + 89 + + + + + + + 46.15775381214917 + -1.1478244420140982 + + 6.199999809265137 + 1091.3599853515625 + + 146 + + + + 2.9579999446868896 + 88 + + + + + + + 46.157677955925465 + -1.1478266213089228 + + 6.599999904632568 + 1101.4000244140625 + + 145 + + + + 1.875 + 87 + + + + + + + 46.157777113839984 + -1.1478195805102587 + + 6.199999809265137 + 1112.43994140625 + + 145 + + + + 2.7249999046325684 + 89 + + + + + + + 46.15796403028071 + -1.1477831192314625 + + 5.599999904632568 + 1133.4200439453125 + + 145 + + + + 2.9670000076293945 + 88 + + + + + + + 46.15816963836551 + -1.1477448139339685 + + 5.0 + 1156.3900146484375 + + 145 + + + + 2.9760000705718994 + 89 + + + + + + + 46.1583236977458 + -1.1477339174598455 + + 4.800000190734863 + 1173.52001953125 + + 148 + + + + 2.9579999446868896 + 90 + + + + + + + 46.15852612070739 + -1.1477447301149368 + + 4.599999904632568 + 1195.93994140625 + + 145 + + + + 2.9579999446868896 + 87 + + + + + + + 46.15858060307801 + -1.1477412935346365 + + 4.599999904632568 + 1201.6700439453125 + + 144 + + + + 2.9670000076293945 + 82 + + + + + + + 46.15859728306532 + -1.147452536970377 + + 4.400000095367432 + 1224.3199462890625 + + 143 + + + + 2.818000078201294 + 87 + + + + + + + 46.158596528694034 + -1.1474081967025995 + + 4.400000095367432 + 1227.739990234375 + + 143 + + + + 2.7899999618530273 + 87 + + + + + + + 46.15860910154879 + -1.1471279058605433 + + 4.599999904632568 + 1249.0400390625 + + 145 + + + + 2.7990000247955322 + 89 + + + + + + + 46.15859602577984 + -1.1468478664755821 + + 5.0 + 1270.8900146484375 + + 146 + + + + 2.8550000190734863 + 87 + + + + + + + 46.158586302772164 + -1.1466823238879442 + + 5.199999809265137 + 1283.989990234375 + + 144 + + + + 2.8269999027252197 + 83 + + + + + + + 46.15861832164228 + -1.1468295939266682 + + 5.0 + 1296.9100341796875 + + 147 + + + + 2.5190000534057617 + 87 + + + + + + + 46.15865453146398 + -1.1471115611493587 + + 4.599999904632568 + 1319.3199462890625 + + 148 + + + + 2.369999885559082 + 88 + + + + + + + 46.158683113753796 + -1.1473713163286448 + + 4.400000095367432 + 1339.699951171875 + + 148 + + + + 2.4820001125335693 + 88 + + + + + + + 46.1587071698159 + -1.1475303210318089 + + 4.400000095367432 + 1352.239990234375 + + 145 + + + + 2.565999984741211 + 87 + + + + + + + 46.15858571603894 + -1.1477039940655231 + + 4.599999904632568 + 1368.8499755859375 + + 145 + + + + 2.6029999256134033 + 86 + + + + + + + 46.158454455435276 + -1.1477375216782093 + + 4.599999904632568 + 1383.75 + + 142 + + + + 2.6689999103546143 + 89 + + + + + + + 46.15840039215982 + -1.147754956036806 + + 4.599999904632568 + 1389.9100341796875 + + 143 + + + + 2.687000036239624 + 87 + + + + + + + 46.1582045070827 + -1.14775319583714 + + 4.800000190734863 + 1411.81005859375 + + 145 + + + + 2.7809998989105225 + 89 + + + + + + + 46.158014154061675 + -1.14776149392128 + + 5.400000095367432 + 1433.0400390625 + + 144 + + + + 2.7899999618530273 + 89 + + + + + + + 46.15781734697521 + -1.1477699596434832 + + 6.0 + 1454.9200439453125 + + 146 + + + + 2.8369998931884766 + 88 + + + + + + + 46.15771626122296 + -1.1477676127105951 + + 6.400000095367432 + 1466.2900390625 + + 145 + + + + 2.7809998989105225 + 85 + + + + + + + 46.15777652710676 + -1.147783286869526 + + 6.199999809265137 + 1473.3800048828125 + + 144 + + + + 2.6410000324249268 + 87 + + + + + + + 46.15797081962228 + -1.1477863881736994 + + 5.599999904632568 + 1494.7900390625 + + 145 + + + + 2.4630000591278076 + 88 + + + + + + + 46.158161675557494 + -1.1477588955312967 + + 5.0 + 1516.0999755859375 + + 147 + + + + 2.5290000438690186 + 88 + + + + + + + 46.15830894559622 + -1.1477491725236177 + + 4.800000190734863 + 1532.5 + + 144 + + + + 2.621999979019165 + 88 + + + + + + + 46.15845110267401 + -1.1477233562618494 + + 4.599999904632568 + 1548.5699462890625 + + 145 + + + + 2.743000030517578 + 86 + + + + + + + 46.15836041048169 + -1.1477471608668566 + + 4.599999904632568 + 1558.8199462890625 + + 147 + + + + 2.7149999141693115 + 91 + + + + + + + 46.15816310048103 + -1.1477705463767052 + + 5.0 + 1580.9200439453125 + + 146 + + + + 2.7060000896453857 + 90 + + + + + + + 46.15797341801226 + -1.147785633802414 + + 5.400000095367432 + 1602.1500244140625 + + 147 + + + + 2.818000078201294 + 91 + + + + + + + 46.15779387764633 + -1.1478250287473202 + + 6.199999809265137 + 1622.280029296875 + + 147 + + + + 2.938999891281128 + 88 + + + + + + + 46.157728331163526 + -1.147815976291895 + + 6.400000095367432 + 1635.1099853515625 + + 146 + + + + 2.994999885559082 + 85 + + + + + + + 46.157796643674374 + -1.147816563025117 + + 6.199999809265137 + 1642.7099609375 + + 149 + + + + 2.9760000705718994 + 91 + + + + + + + 46.15796344354749 + -1.1478258669376373 + + 5.599999904632568 + 1661.18994140625 + + 153 + + + + 2.9670000076293945 + 88 + + + + + + + 46.15814985707402 + -1.1477910820394754 + + 5.0 + 1682.0799560546875 + + 153 + + + + 3.0230000019073486 + 89 + + + + + + + 46.15833828225732 + -1.1477477476000786 + + 4.800000190734863 + 1703.27001953125 + + 152 + + + + 3.0789999961853027 + 88 + + + + + + + 46.15836032666266 + -1.147746741771698 + + 4.599999904632568 + 1705.719970703125 + + 148 + + + + 3.0880000591278076 + 87 + + + + + + + 46.15851757116616 + -1.1477433051913977 + + 4.599999904632568 + 1724.27001953125 + + 150 + + + + 2.994999885559082 + 44 + + + + + + + 46.15843266248703 + -1.1477318219840527 + + 4.599999904632568 + 1733.6600341796875 + + 151 + + + + 2.7899999618530273 + 83 + + + + + + + 46.15833451040089 + -1.147726709023118 + + 4.800000190734863 + 1744.81005859375 + + 152 + + + + 2.6410000324249268 + 87 + + + + + + + 46.15817433223128 + -1.147747915238142 + + 5.0 + 1762.8199462890625 + + 150 + + + + 2.546999931335449 + 86 + + + + + + + 46.157983392477036 + -1.1477698758244514 + + 5.400000095367432 + 1784.1400146484375 + + 152 + + + + 2.556999921798706 + 100 + + + + + + + 46.15787426009774 + -1.147802984341979 + + 5.800000190734863 + 1796.43994140625 + + 149 + + + + 2.565999984741211 + 87 + + + + + + + 46.157706286758184 + -1.1478134617209435 + + 6.400000095367432 + 1815.52001953125 + + 146 + + + + 2.565999984741211 + 85 + + + + + + + 46.15770033560693 + -1.1478110309690237 + + 6.400000095367432 + 1816.0799560546875 + + 146 + + + + 2.565999984741211 + 85 + + + + + + + 46.157754734158516 + -1.1478034872561693 + + 6.199999809265137 + 1822.0799560546875 + + 149 + + + + 2.546999931335449 + 87 + + + + + + + 46.15778071805835 + -1.1478017270565033 + + 6.199999809265137 + 1824.9599609375 + + 150 + + + + 2.5290000438690186 + 88 + + + + + + + 46.15796361118555 + -1.147772390395403 + + 5.599999904632568 + 1845.4100341796875 + + 149 + + + + 2.490999937057495 + 90 + + + + + + + 46.158041479066014 + -1.1477539502084255 + + 5.199999809265137 + 1854.1800537109375 + + 146 + + + + 2.509999990463257 + 86 + + + + + + + 46.15824046544731 + -1.147739700973034 + + 4.800000190734863 + 1876.1099853515625 + + 148 + + + + 2.556999921798706 + 88 + + + + + + + 46.15842637605965 + -1.1477195005863905 + + 4.599999904632568 + 1896.8900146484375 + + 150 + + + + 2.575000047683716 + 54 + + + + + + + 46.158459736034274 + -1.1477160640060902 + + 4.599999904632568 + 1900.6099853515625 + + 147 + + + + 2.575000047683716 + 81 + + + + + + + 46.1584600713104 + -1.1477153934538364 + + 4.599999904632568 + 1900.6099853515625 + + 146 + + + + 2.565999984741211 + 83 + + + + + + + 46.158276507630944 + -1.1477592308074236 + + 4.800000190734863 + 1921.47998046875 + + 148 + + + + 2.9019999504089355 + 89 + + + + + + + 46.15809026174247 + -1.147765265777707 + + 5.0 + 1942.25 + + 147 + + + + 3.2279999256134033 + 88 + + + + + + + 46.15791046991944 + -1.1478131264448166 + + 5.800000190734863 + 1962.6600341796875 + + 145 + + + + 3.2660000324249268 + 87 + + + + + + + 46.15778516046703 + -1.1478402838110924 + + 6.199999809265137 + 1976.8800048828125 + + 142 + + + + 3.1440000534057617 + 85 + + + + + + + 46.15776160731912 + -1.14783919416368 + + 6.199999809265137 + 1979.0699462890625 + + 142 + + + + 3.0980000495910645 + 83 + + + + + + + 46.157825058326125 + -1.1478172335773706 + + 6.0 + 1986.280029296875 + + 146 + + + + 1.6419999599456787 + 92 + + + + + + + 46.1579505354166 + -1.147798541933298 + + 5.599999904632568 + 2000.280029296875 + + 146 + + + + 3.23799991607666 + 89 + + + + + + + 2.6600000858306885 + 86 + 104 + + + + + 54.0 + 153.67 + 3.9000000953674316 + 6 + + 144 + + + 147 + + Active + Manual + + + + + 46.15815262310207 + -1.1477810237556696 + + 5.0 + 2022.719970703125 + + 146 + + + + 2.9210000038146973 + 89 + + + + + + + 46.15834674797952 + -1.1477619968354702 + + 4.800000190734863 + 2044.3499755859375 + + 146 + + + + 3.0880000591278076 + 91 + + + + + + + 46.15854129195213 + -1.1477470770478249 + + 4.599999904632568 + 2066.030029296875 + + 145 + + + + 3.115999937057495 + 85 + + + + + + + 46.158562833443284 + -1.1477277148514986 + + 4.599999904632568 + 2069.2099609375 + + 143 + + + + 3.125999927520752 + 70 + + + + + + + 46.15855721756816 + -1.1475225258618593 + + 4.400000095367432 + 2085.340087890625 + + 142 + + + + 2.7899999618530273 + 87 + + + + + + + 46.15855051204562 + -1.1472412291914225 + + 4.599999904632568 + 2107.179931640625 + + 143 + + + + 2.7060000896453857 + 91 + + + + + + + 46.15855763666332 + -1.146943923085928 + + 4.800000190734863 + 2130.1298828125 + + 142 + + + + 2.8929998874664307 + 91 + + + + + + + 46.1585100274533 + -1.1466902028769255 + + 5.199999809265137 + 2150.6201171875 + + 144 + + + + 3.0230000019073486 + 89 + + + + + + + 46.15852192975581 + -1.1466679070144892 + + 5.199999809265137 + 2152.43994140625 + + 144 + + + + 3.0139999389648438 + 0 + + + + + + + 46.15853240713477 + -1.1466571781784296 + + 5.199999809265137 + 2153.669921875 + + 143 + + + + 2.994999885559082 + 0 + + + + + + + 2.8410000801086426 + 84 + 92 + + + + + Garmin Forerunner 620 + 3878368635 + 1623 + + 3 + 30 + 0 + 0 + + + + + + Connect Api + + + 0 + 0 + 0 + 0 + + + en + 006-D2449-00 + +