{"id":18776550,"url":"https://github.com/alenrajsp/tcxreader","last_synced_at":"2025-04-09T10:05:24.858Z","repository":{"id":40446589,"uuid":"317671425","full_name":"alenrajsp/tcxreader","owner":"alenrajsp","description":"tcxreader is a reader / parser for Garmin’s TCX file format. It also works well with missing data!","archived":false,"fork":false,"pushed_at":"2025-03-04T15:24:55.000Z","size":666,"stargazers_count":23,"open_issues_count":0,"forks_count":11,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-02T08:41:18.566Z","etag":null,"topics":["data-mining","data-science","python","sports-analytics","tcx","tcx-parser"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/alenrajsp.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-12-01T21:24:15.000Z","updated_at":"2025-03-26T01:08:03.000Z","dependencies_parsed_at":"2024-04-11T12:31:11.259Z","dependency_job_id":"653f57e8-a2ea-428f-bea6-08ff3df725c4","html_url":"https://github.com/alenrajsp/tcxreader","commit_stats":{"total_commits":67,"total_committers":5,"mean_commits":13.4,"dds":"0.34328358208955223","last_synced_commit":"c4800d86e867271aef7b609651c85a1696277d4c"},"previous_names":[],"tags_count":14,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alenrajsp%2Ftcxreader","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alenrajsp%2Ftcxreader/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alenrajsp%2Ftcxreader/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alenrajsp%2Ftcxreader/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/alenrajsp","download_url":"https://codeload.github.com/alenrajsp/tcxreader/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248018060,"owners_count":21034048,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["data-mining","data-science","python","sports-analytics","tcx","tcx-parser"],"created_at":"2024-11-07T19:46:37.154Z","updated_at":"2025-04-09T10:05:24.824Z","avatar_url":"https://github.com/alenrajsp.png","language":"Python","funding_links":[],"categories":["Software 💻"],"sub_categories":["Wrestling 🤼‍♀️"],"readme":"\u003cp align=\"center\"\u003e\n    \u003cimg width=\"200\" style=\"margin-bottom:-8px\" src=\"https://raw.githubusercontent.com/alenrajsp/tcxreader/main/.github/logo/logo-white-background.png\"\u003e\n\u003c/p\u003e\n\n\u003ch2 align=\"center\"\u003e\n    Reader for Garmin's TCX file format\n\u003c/h2\u003e\n\n\u003cp align=\"center\"\u003e\n    \u003ca href=\"https://pypi.python.org/pypi/tcxreader\"\u003e\n        \u003cimg alt=\"PyPI Version\" src=\"https://img.shields.io/pypi/v/tcxreader.svg\" /\u003e\n    \u003c/a\u003e\n    \u003cimg alt=\"PyPI - Python Version\" src=\"https://img.shields.io/pypi/pyversions/tcxreader.svg\" /\u003e\n    \u003cimg alt=\"PyPI - Downloads\" src=\"https://img.shields.io/pypi/dm/tcxreader.svg\" /\u003e\n    \u003ca href=\"https://pepy.tech/project/tcxreader\"\u003e\n        \u003cimg alt=\"Downloads\" src=\"https://pepy.tech/badge/tcxreader\" /\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://github.com/alenrajsp/tcxreader/actions/workflows/test.yml\"\u003e\n        \u003cimg alt=\"tcxreader\" src=\"https://github.com/alenrajsp/tcxreader/actions/workflows/test.yml/badge.svg\"\u003e\n    \u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n    \u003cimg alt=\"GitHub repo size\" src=\"https://img.shields.io/github/repo-size/alenrajsp/tcxreader\" /\u003e\n    \u003ca href=\"https://github.com/alenrajsp/tcxreader/blob/master/LICENSE\"\u003e\n        \u003cimg alt=\"GitHub license\" src=\"https://img.shields.io/github/license/alenrajsp/tcxreader.svg\" /\u003e\n    \u003c/a\u003e\n    \u003cimg alt=\"GitHub commit activity\" src=\"https://img.shields.io/github/commit-activity/w/alenrajsp/tcxreader.svg\" /\u003e\n    \u003ca href='http://isitmaintained.com/project/alenrajsp/tcxreader \"Average time to resolve an issue\"'\u003e\n        \u003cimg alt=\"Average time to resolve an issue\" src=\"http://isitmaintained.com/badge/resolution/alenrajsp/tcxreader.svg\" /\u003e\n    \u003c/a\u003e\n    \u003ca href='http://isitmaintained.com/project/alenrajsp/tcxreader \"Percentage of issues still open\"'\u003e\n        \u003cimg alt=\"Percentage of issues still open\" src=\"http://isitmaintained.com/badge/open/alenrajsp/tcxreader.svg\" /\u003e\n    \u003c/a\u003e\n    \u003ca href=\"#-contributors\"\u003e\n        \u003cimg alt=\"All Contributors\" src=\"https://img.shields.io/github/all-contributors/alenrajsp/tcxreader?color=ee8449\" /\u003e\n    \u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n    \u003ca href=\"https://zenodo.org/doi/10.5281/zenodo.10940281\"\u003e\n        \u003cimg alt=\"DOI\" src=\"https://zenodo.org/badge/317671425.svg\" /\u003e\n    \u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n    \u003ca href=\"#-objective\"\u003e🎯 Objective\u003c/a\u003e •\n    \u003ca href=\"#-features\"\u003e✨ Features\u003c/a\u003e •\n    \u003ca href=\"#-installation\"\u003e📦 Installation\u003c/a\u003e •\n    \u003ca href=\"#-usage\"\u003e🚀 Usage\u003c/a\u003e •\n    \u003ca href=\"#-classes-explanation\"\u003e🔍 Classes explanation\u003c/a\u003e •\n    \u003ca href=\"#-missing-data-handling\"\u003e🚨 Missing data handling\u003c/a\u003e •\n    \u003ca href=\"#-datasets\"\u003e💾 Datasets\u003c/a\u003e •\n    \u003ca href=\"#-related-packagesframeworks\"\u003e🔗 Related packages/frameworks\u003c/a\u003e •\n    \u003ca href=\"#-license\"\u003e🔑 License\u003c/a\u003e •\n    \u003ca href=\"#-contributors\"\u003e🫂 Contributors\u003c/a\u003e\n\u003c/p\u003e\n\n## 🎯 Objective\n\nThis is a simple TCX reader which can read Garmin TCX file extension files.  The following data is currently parsed: longitude,\nlatitude, elevation, time, distance, hr_value, cadence, watts, TPX_speed (extension). The following statistics are\ncalculated for each exercise: calories, hr_avg, hr_max, hr_min, avg_speed, start_time, end_time, duration, cadence_avg,\ncadence_max, ascent, descent, distance, altitude_max, altitude_min, altitude_avg, steps and **author data**.\n\nGitHub requests appreciated.\n[pypi](https://pypi.org/project/tcxreader/)\n[github](https://github.com/alenrajsp/tcxreader)\n\n## ✨ Features\n\nAllows parsing / reading of TCX files.\n\n## 📦 Installation\n\n```\npip install tcxreader\n```\n\n## 🚀 Usage\n\nAn example on how to use the package is shown below.\n\n```python\nfrom tcxreader.tcxreader import TCXReader, TCXExercise\n\ntcx_reader = TCXReader()\nfile_location = 'example_data/cross-country-skiing_activity_1.tcx'\n\n\"\"\"\nMinor warning, the read method also has a default parameter of only_gps (tcx_readerread(self, fileLocation: str, only_gps: bool = True)) set to true. If set to True erases any Trackpoints at the start and end of the exercise without GPS data.\n\"\"\"\n\ndata: TCXExercise = tcx_reader.read(file_location)\n\"\"\" Example output:\ndata = {TCXExercise}\n activity_type = {str} 'Other'\naltitude_avg = {float} 2285.6744874553915\naltitude_max = {float} 2337.60009765625\naltitude_min = {float} 1257.5999755859375\nascent = {float} 1117.9996337890625\nauthor = {TCXAuthor} [TCXAuthor]\navg_speed = {float} 8.534458975426906\ncadence_avg = {NoneType} None\ncadence_max = {NoneType} None\ncalories = {int} 532\ndescent = {float} 118.19970703125\ndistance = {float} 5692.01\nduration = {float} 2401.0\nend_time = {datetime} 2020-12-26 15:54:22\nhr_avg = {float} 141.1954732510288\nhr_max = {int} 172\nhr_min = {int} 83\nlaps = {list: 2} [TCXLap]\nlx_ext = {dict: 0} {}\nmax_speed = {float} 23.50810546875\nstart_time = {datetime} 2020-12-26 15:14:21\ntpx_ext_stats = {dict: 2} {'Speed': {'min': 0.0, 'max': 6.1579999923706055, 'avg': 2.2930514418784482}, 'RunCadence': {'min': 0, 'max': 95, 'avg': 40.81069958847737}}\ntrackpoints = {list: 486} [TCXTrackpoint]\n \n    {TCXTrackPoint} \n     cadence = {NoneType} None\n     distance = {float} 7.329999923706055\n     elevation = {float} 2250.60009765625\n     hr_value = {int} 87\n     latitude = {float} 46.49582446552813\n     longitude = {float} 15.50408081151545\n     time = {datetime} 2020-12-26 15:14:28\n     tpx_ext = {dict: 2} {'Speed': 0.7459999918937683, 'RunCadence': 58}\n\"\"\"\n```\n## 🔍 Classes explanation\n\nBelow figure explains the classes of **tcxreader** and the data they contain.\n\n### TCXReader()\nUser initializes the tcxreader by creating a **TCXReader** class instance. To read the data of a **TCX activity** the user must use\n**TCXReader.read(*filename*)** method. \nThe output of **read()** is an instance of **TCXExercise** class.\n\n### TCXExercise\nPrimary class that holds cumulative data of an exercise. TCXExercise contains **all** the **trackpoints** of an activity\n(e.g. from all the laps merged).\n\n### TCXLap\nOne TCX activity may contain multiple laps. In the TCX file they are visible by the **Lap** tag.\n```xml\n\u003cLap StartTime=\"2020-12-26T15:50:22.000Z\"\u003e\n...\n\u003c/Lap\u003e\n```\nTCXLap contains all the trackpoints of a lap.\n\n### TCXTrackpoint\nA point in an exercise. Almost always has **latitude, longitude, time**. Can also have *cadence, distance, elevation, hr_value, tpx_ext*.\nThe tpx_ext refers to individual extensions contained inside the trackpoint. An example of the Trackpoint (pre-parsing) \nin the TCX file is shown below.\n\n```xml\n\u003cTrackpoint\u003e\n    \u003cTime\u003e2020-12-26T15:50:21.000Z\u003c/Time\u003e\n    \u003cPosition\u003e\n        \u003cLatitudeDegrees\u003e46.49732105433941\u003c/LatitudeDegrees\u003e\n        \u003cLongitudeDegrees\u003e15.496849408373237\u003c/LongitudeDegrees\u003e\n    \u003c/Position\u003e\n    \u003cAltitudeMeters\u003e2277.39990234375\u003c/AltitudeMeters\u003e\n    \u003cDistanceMeters\u003e5001.52978515625\u003c/DistanceMeters\u003e\n    \u003cHeartRateBpm\u003e\n        \u003cValue\u003e148\u003c/Value\u003e\n    \u003c/HeartRateBpm\u003e\n    \u003cExtensions\u003e\n        \u003cns3:TPX\u003e\n            \u003cns3:Speed\u003e3.3589999675750732\u003c/ns3:Speed\u003e\n            \u003cns3:RunCadence\u003e61\u003c/ns3:RunCadence\u003e\n        \u003c/ns3:TPX\u003e\n    \u003c/Extensions\u003e\n\u003c/Trackpoint\u003e\n```\n\n### tpx_ext\nThe data parsed from the **trackpoint TPX Extensions**. Example of data (pre-parsing) is shown below.\n```xml\n\u003cExtensions\u003e\n    \u003cns3:TPX\u003e\n        \u003cns3:Speed\u003e3.3589999675750732\u003c/ns3:Speed\u003e\n        \u003cns3:RunCadence\u003e61\u003c/ns3:RunCadence\u003e\n    \u003c/ns3:TPX\u003e\n\u003c/Extensions\u003e\n```\nCan occur **once (1x)** in every **trackpoint**.\n### tpx_ext_stats\nContains **minimum**, **maximum** and **average** values of the recorded **tpx_ext** key.\n\n### lx_ext\nThe data parsed from the **lap LX Extensions**. Example of data (pre-parsing) is shown below.\n```xml\n\u003cExtensions\u003e\n    \u003cns3:LX\u003e\n        \u003cns3:AvgSpeed\u003e1.0820000171661377\u003c/ns3:AvgSpeed\u003e\n        \u003cns3:Steps\u003e65\u003c/ns3:Steps\u003e\n    \u003c/ns3:LX\u003e\n\u003c/Extensions\u003e\n```\nCan occur **once (1x)** in every **lap**. \n\nThe tags which do not contain **Avg, Min, Max** in their name (e.g. steps) are\nsummed in the **TCXExercise** **lx_ext** dictionary. \n\nAll tags are recorded in the **TCXLap** **lx_ext** dictionary\n\n\n### Schema of the data\n\u003cdiv width=\"100%\" style=\"background-color: white; width: 100%\"\u003e\n \u003cimg width=\"100%\" style=\"margin-bottom:-8px\" src=\"https://raw.githubusercontent.com/alenrajsp/tcxreader/7c9af6dc88f9d83a8c6751b454f118220ecfd9a1/.github/images/data-explanation.svg\"\u003e\n\u003c/div\u003e\n\n## 🚨 Missing data handling\nDue to the nature of the TCX file format, some data may be missing. The **tcxreader** can handle this in two ways:\n1) If data is missing at a TCX point it is set to **None**. (*default*)\n    - tcx_reader.read(file_location) (*default*)\n    - tcx_reader.read(file_location, null_value_handling=1) (*default*)\n    - tcx_reader.read(file_location, null_value_handling=NullValueHandling.NONE) (*default*)\n2) If data is missing at one or more TCX points it is linearly interpolated.\n   - tcx_reader.read(file_location, null_value_handling=2)\n   - tcx_reader.read(file_location, null_value_handling=NullValueHandling.LINEAR_INTERPOLATION)\n   \nThis behavior can be set in **TCXReader.read()** method by the **null_value_handling** parameter, where either **int** value or **NullValueHandling** enum can be passed.\n\n## 💾 Datasets\n\nDatasets available and used in the examples on the following links: [DATASET1](http://iztok-jr-fister.eu/static/publications/Sport5.zip), [DATASET2](http://iztok-jr-fister.eu/static/css/datasets/Sport.zip), [DATASET3](https://github.com/firefly-cpp/tcx-test-files).\n\n## 🔗 Related packages/frameworks\n\n[1] [sport-activities-features: A minimalistic toolbox for extracting features from sports activity files written in Python](https://github.com/firefly-cpp/sport-activities-features)\n\n[2] [AST-Monitor: A wearable Raspberry Pi computer for cyclists](https://github.com/firefly-cpp/AST-Monitor)\n\n[3] [TCXReader.jl: Julia package designed for parsing TCX files](https://github.com/firefly-cpp/TCXReader.jl)\n\n## 🔑 License\n\nThis package is distributed under the MIT License. This license can be found online\nat [http://www.opensource.org/licenses/MIT](http://www.opensource.org/licenses/MIT).\n\n## Disclaimer\n\nThis framework is provided as-is, and there are no guarantees that it fits your purposes or that it is bug-free. Use it\nat your own risk!\n\n## 🫂 Contributors\n\n\u003c!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section --\u003e\n\u003c!-- prettier-ignore-start --\u003e\n\u003c!-- markdownlint-disable --\u003e\n\u003ctable\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://github.com/alenrajsp\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/27721714?v=4?s=100\" width=\"100px;\" alt=\"alenrajsp\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003ealenrajsp\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/alenrajsp/tcxreader/commits?author=alenrajsp\" title=\"Code\"\u003e💻\u003c/a\u003e \u003ca href=\"#maintenance-alenrajsp\" title=\"Maintenance\"\u003e🚧\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://github.com/fortysix2ahead\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/40423757?v=4?s=100\" width=\"100px;\" alt=\"fortysix2ahead\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003efortysix2ahead\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/alenrajsp/tcxreader/issues?q=author%3Afortysix2ahead\" title=\"Bug reports\"\u003e🐛\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"http://www.iztok-jr-fister.eu/\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/1633361?v=4?s=100\" width=\"100px;\" alt=\"Iztok Fister Jr.\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eIztok Fister Jr.\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"#data-firefly-cpp\" title=\"Data\"\u003e🔣\u003c/a\u003e \u003ca href=\"#mentoring-firefly-cpp\" title=\"Mentoring\"\u003e🧑‍🏫\u003c/a\u003e \u003ca href=\"#platform-firefly-cpp\" title=\"Packaging/porting to new platform\"\u003e📦\u003c/a\u003e \u003ca href=\"https://github.com/alenrajsp/tcxreader/commits?author=firefly-cpp\" title=\"Tests\"\u003e⚠️\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://github.com/johnleeming\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/13801070?v=4?s=100\" width=\"100px;\" alt=\"johnleeming\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003ejohnleeming\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/alenrajsp/tcxreader/issues?q=author%3Ajohnleeming\" title=\"Bug reports\"\u003e🐛\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://github.com/rpstar\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/10442282?v=4?s=100\" width=\"100px;\" alt=\"rpstar\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003erpstar\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/alenrajsp/tcxreader/issues?q=author%3Arpstar\" title=\"Bug reports\"\u003e🐛\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"http://relatable.dev/\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/1128313?v=4?s=100\" width=\"100px;\" alt=\"James Robinson\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eJames Robinson\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"#maintenance-jlrobins\" title=\"Maintenance\"\u003e🚧\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://github.com/johwiebe\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/33023818?v=4?s=100\" width=\"100px;\" alt=\"johwiebe\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003ejohwiebe\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/alenrajsp/tcxreader/issues?q=author%3Ajohwiebe\" title=\"Bug reports\"\u003e🐛\u003c/a\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://martin-ueding.de/\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/976924?v=4?s=100\" width=\"100px;\" alt=\"Martin Ueding\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eMartin Ueding\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/alenrajsp/tcxreader/issues?q=author%3Amartin-ueding\" title=\"Bug reports\"\u003e🐛\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://github.com/simonpickering\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/1830341?v=4?s=100\" width=\"100px;\" alt=\"Simon Pickering\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eSimon Pickering\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/alenrajsp/tcxreader/issues?q=author%3Asimonpickering\" title=\"Bug reports\"\u003e🐛\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://github.com/rwinklerwilkes\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/2768609?v=4?s=100\" width=\"100px;\" alt=\"Rich Winkler\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eRich Winkler\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/alenrajsp/tcxreader/issues?q=author%3Arwinklerwilkes\" title=\"Bug reports\"\u003e🐛\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://github.com/ToonElewaut\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/12350289?v=4?s=100\" width=\"100px;\" alt=\"Toon Elewaut\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eToon Elewaut\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/alenrajsp/tcxreader/commits?author=ToonElewaut\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://github.com/lahovniktadej\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/57890734?v=4?s=100\" width=\"100px;\" alt=\"Tadej Lahovnik\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eTadej Lahovnik\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/alenrajsp/tcxreader/commits?author=lahovniktadej\" title=\"Documentation\"\u003e📖\u003c/a\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\n\u003c!-- markdownlint-restore --\u003e\n\u003c!-- prettier-ignore-end --\u003e\n\n\u003c!-- ALL-CONTRIBUTORS-LIST:END --\u003e\n\u003c!-- prettier-ignore-start --\u003e\n\u003c!-- markdownlint-disable --\u003e\n\n\u003c!-- markdownlint-restore --\u003e\n\u003c!-- prettier-ignore-end --\u003e\n\n\u003c!-- ALL-CONTRIBUTORS-LIST:END --\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falenrajsp%2Ftcxreader","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Falenrajsp%2Ftcxreader","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falenrajsp%2Ftcxreader/lists"}