trackswap 0.0.24 → 0.0.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +26 -26
- package/dist/index.js +26 -26
- package/package.json +3 -2
- package/dist/FIT/base.d.ts +0 -61
- package/dist/FIT/crc.d.ts +0 -1
- package/dist/FIT/decoder.d.ts +0 -35
- package/dist/FIT/encoder.d.ts +0 -45
- package/dist/FIT/index.d.ts +0 -12
- package/dist/FIT/mesg.d.ts +0 -37
- package/dist/FIT/middleware.d.ts +0 -33
- package/dist/FIT/plugins.d.ts +0 -17
- package/dist/FIT/processor.d.ts +0 -34
- package/dist/FIT/types/course_point.d.ts +0 -56
- package/dist/FIT/types/event.d.ts +0 -49
- package/dist/FIT/types/event_type.d.ts +0 -18
- package/dist/FIT/types/file.d.ts +0 -23
- package/dist/FIT/types/index.d.ts +0 -119
- package/dist/FIT/types/mesg_num.d.ts +0 -105
- package/dist/FIT/types/sport.d.ts +0 -47
- package/dist/FIT/types.d.ts +0 -511
- package/dist/FIT/util.d.ts +0 -1
- package/dist/GPX/base.d.ts +0 -16
- package/dist/GPX/converters.d.ts +0 -62
- package/dist/GPX/decoder.d.ts +0 -43
- package/dist/GPX/encoder.d.ts +0 -45
- package/dist/GPX/extensions/index.d.ts +0 -14
- package/dist/GPX/index.d.ts +0 -13
- package/dist/GPX/middleware.d.ts +0 -18
- package/dist/GPX/processor.d.ts +0 -30
- package/dist/GPX/types.d.ts +0 -124
- package/dist/GPX/util.d.ts +0 -1
- package/dist/TCX/base.d.ts +0 -19
- package/dist/TCX/converters.d.ts +0 -52
- package/dist/TCX/decoder.d.ts +0 -33
- package/dist/TCX/encoder.d.ts +0 -41
- package/dist/TCX/index.d.ts +0 -7
- package/dist/TCX/middleware.d.ts +0 -25
- package/dist/TCX/processor.d.ts +0 -39
- package/dist/TCX/types.d.ts +0 -191
- package/dist/TrackSwap.d.ts +0 -48
- package/dist/core/base.d.ts +0 -73
- package/dist/core/index.d.ts +0 -2
- package/dist/core/xml-utils.d.ts +0 -17
- package/dist/index.d.ts +0 -8
- package/dist/types.d.ts +0 -74
package/dist/index.cjs
CHANGED
|
@@ -1,26 +1,26 @@
|
|
|
1
|
-
"use strict";var ct=Object.create;var q=Object.defineProperty;var pt=Object.getOwnPropertyDescriptor;var dt=Object.getOwnPropertyNames;var lt=Object.getPrototypeOf,ut=Object.prototype.hasOwnProperty;var mt=(c,e)=>{for(var t in e)q(c,t,{get:e[t],enumerable:!0})},Ne=(c,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of dt(e))!ut.call(c,n)&&n!==t&&q(c,n,{get:()=>e[n],enumerable:!(r=pt(e,n))||r.enumerable});return c};var f=(c,e,t)=>(t=c!=null?ct(lt(c)):{},Ne(e||!c||!c.__esModule?q(t,"default",{value:c,enumerable:!0}):t,c)),Tt=c=>Ne(q({},"__esModule",{value:!0}),c);var It={};mt(It,{ActivityProcessor:()=>B,ActivityToFITEncoder:()=>$,ActivityToGPXEncoder:()=>O,ActivityToTCXEncoder:()=>G,BaseActivityConverter:()=>S,BaseActivityEncoder:()=>D,BaseActivityMiddleware:()=>We,FITDecoder:()=>v,FITEncoder:()=>x,FITToActivityConverter:()=>_,GPXDecoder:()=>b,GPXEncoder:()=>I,GPXToActivityConverter:()=>L,PipelineStage:()=>N,TCXDecoder:()=>k,TCXEncoder:()=>F,TCXToActivityConverter:()=>M,TrackSwap:()=>H,default:()=>bt,registerDefaultMiddlewares:()=>He});module.exports=Tt(It);var J=class{constructor(){this.stage="parse"}async process(e){let t=Date.now();if(!e.rawData)throw new Error("FIT data cannot be empty");try{let r=await this.parseWithFitSDK(e.rawData);return e.rawMessages=r,e.performance.parseTime=Date.now()-t,e}catch(r){throw new Error(`FIT parsing failed: ${r.message}`)}}async parseWithFitSDK(e){let{Decoder:t,Stream:r}=await import("@garmin/fitsdk"),n=r.fromBuffer(e);if(!t.isFIT(n))throw new Error("Not a valid FIT file");let i=new t(n),{messages:s,errors:o}=i.read();return o&&o.length>0,s}},Q=class{constructor(e){this.getConverters=e;this.stage="extract"}async process(e){let t=Date.now();if(!e.rawMessages)throw new Error("Raw messages cannot be empty");let r={};for(let[n,i]of Object.entries(e.rawMessages)){if(!Array.isArray(i)||i.length===0){r[n]=i;continue}let s=this.getConverters(n);if(s.length===0)r[n]=i;else{let o=s[0];try{let a=o.convertMessages(i,e);r[n]=a}catch(a){e.errors.push(a),r[n]=i}}}return e.rawMessages=r,e.performance.extractTime=Date.now()-t,e}},ee=class{constructor(e){this.getStructurePlugins=e;this.stage="structure"}async process(e){let t=Date.now();if(!e.rawMessages)throw new Error("Message data cannot be empty");let r={},n=this.getStructurePlugins();for(let i of n)try{let s=i.structureData(e.rawMessages,e);r={...r,...s}}catch(s){e.errors.push(s)}return e.result=r,e.performance.structureTime=Date.now()-t,e}},te=class{constructor(){this.stage="complete"}async process(e){e.performance.endTime=Date.now();let t=e.performance.endTime-e.performance.startTime;return e.metadata.set("performance",{totalTime:t,parseTime:e.performance.parseTime,extractTime:e.performance.extractTime,structureTime:e.performance.structureTime}),e.stats&&(e.stats.endTime=Date.now(),e.rawMessages&&(e.stats.processedTokens=this.countTotalMessages(e.rawMessages))),e}countTotalMessages(e){let t=0;return Object.values(e).forEach(r=>{Array.isArray(r)&&(t+=r.length)}),t}};var h=f(require("dayjs"));var w=class{constructor(){this.version="1.0.0";this.priority=100}async initialize(e){e.metadata.set(`plugin:${this.name}:initialized`,!0)}async destroy(e){e.metadata.delete(`plugin:${this.name}:initialized`)}async validate(e){return!0}};var W=class extends w{constructor(){super(...arguments);this.name="SessionStructurePlugin";this.priority=10}structureData(t,r){let{sessionMesgs:n,lapMesgs:i,recordMesgs:s,lengthMesgs:o}=t;return n!=null&&n.length?{sessionMesgs:n.map(p=>{let d=(0,h.default)(p.startTime).valueOf(),l=d+p.totalElapsedTime*1e3,V=((i==null?void 0:i.filter(u=>{let P=(0,h.default)(u.startTime).valueOf(),R=P+(u.totalElapsedTime??0)*1e3;return P>=d&&R<=l}))||[]).map(u=>{let P=(0,h.default)(u.startTime).valueOf(),R=P+(u.totalElapsedTime??0)*1e3,at=(s==null?void 0:s.filter(Re=>{let z=(0,h.default)(Re.timestamp).valueOf();return z>=P&&z<R}))||[],Xe=u.firstLengthIndex??void 0,je=u.numLengths??void 0,Ke=[];if(Xe!==void 0&&je!==void 0){let Re=Xe+je;Ke=(o==null?void 0:o.filter(z=>z.messageIndex>=Xe&&z.messageIndex<Re))||[]}return{...u,recordMesgs:at,lengthMesgs:Ke,messageIndex:u.messageIndex!==void 0?u.messageIndex:0}});return{...p,lapMesgs:V,messageIndex:p.messageIndex!==void 0?p.messageIndex:0}})}:{}}},U=class extends w{constructor(){super(...arguments);this.name="CourseStructurePlugin";this.priority=10}structureData(t,r){let{courseMesgs:n,lapMesgs:i,recordMesgs:s}=t;if(!(n!=null&&n.length))return{};let o=2e3;return{courseMesgs:n.map(p=>{let d=(i==null?void 0:i.map(l=>{let Z=(0,h.default)(l.startTime).valueOf(),V=(0,h.default)(l.timestamp).valueOf(),u=(s==null?void 0:s.filter(P=>{let R=(0,h.default)(P.timestamp).valueOf();return R>=Z-o&&R<=V+o}))||[];return{...l,recordMesgs:u}}))||[];return{...p,lapMesgs:d}})}}},j=class extends w{constructor(){super(...arguments);this.name="FileHeaderPlugin";this.priority=1}structureData(t,r){let{fileIdMesgs:n}=t;if(n!=null&&n.length&&n[0]){let i=n[0];r.fileHeader={type:i.type,manufacturer:i.manufacturer,product:i.product}}return{}}};var v=class{constructor(){this.converterPlugins=new Map;this.registeredPlugins=new Set;this.structurePlugins=[];this.middlewarePlugins=[];this.processors=[];this.initialized=!1;this.defaultPluginsRegistered=!1;this.initializePipeline()}initializePipeline(){this.processors=[new J,new Q(e=>this.getConverters(e)),new ee(()=>this.structurePlugins),new te]}async registerDefaultPlugins(){if(this.defaultPluginsRegistered)return;let e=[new j,new W,new U];for(let t of e)this.addStructurePlugin(t),this.registeredPlugins.add(t.name);this.defaultPluginsRegistered=!0}addConverterForMessageType(e,t){this.converterPlugins.has(e)||this.converterPlugins.set(e,[]);let r=this.converterPlugins.get(e);r.push(t),r.sort((n,i)=>(n.priority||100)-(i.priority||100))}addStructurePlugin(e){this.structurePlugins.push(e),this.structurePlugins.sort((t,r)=>(t.priority||100)-(r.priority||100))}async registerMessageConverter(e){if(this.registeredPlugins.has(e.name))throw new Error(`Message converter plugin ${e.name} already exists`);e.supportedMessageTypes.forEach(r=>{this.addConverterForMessageType(r,e)}),this.registeredPlugins.add(e.name);let t=e.priority!==void 0?` (priority: ${e.priority})`:"";e.supportedMessageTypes.forEach(r=>{let i=(this.converterPlugins.get(r)||[]).map(s=>`${s.name}(${s.priority||100})`)})}async registerStructurePlugin(e){if(this.registeredPlugins.has(e.name))throw new Error(`Structure plugin ${e.name} already exists`);this.addStructurePlugin(e),this.registeredPlugins.add(e.name);let t=e.priority!==void 0?` (priority: ${e.priority})`:""}async registerMiddleware(e){let t=this.middlewarePlugins.findIndex(n=>n.name===e.name);t!==-1?this.middlewarePlugins[t]=e:(this.middlewarePlugins.push(e),this.middlewarePlugins.sort((n,i)=>(n.priority||100)-(i.priority||100)));let r=[];e.onParse&&r.push("onParse"),e.onExtractMessages&&r.push("onExtractMessages"),e.onStructure&&r.push("onStructure"),e.onComplete&&r.push("onComplete"),e.onError&&r.push("onError"),r.length>0}getConverter(e){let t=this.converterPlugins.get(e);return t&&t.length>0?t[0]:void 0}getConverters(e){return this.converterPlugins.get(e)||[]}unregisterPlugin(e){if(!this.registeredPlugins.has(e))return!1;for(let[n,i]of this.converterPlugins){let s=i.findIndex(o=>o.name===e);s!==-1&&(i.splice(s,1),i.length===0&&this.converterPlugins.delete(n))}let t=this.structurePlugins.findIndex(n=>n.name===e);t!==-1&&this.structurePlugins.splice(t,1);let r=this.middlewarePlugins.findIndex(n=>n.name===e);return r!==-1&&this.middlewarePlugins.splice(r,1),this.registeredPlugins.delete(e),!0}async initialize(){var r;if(this.initialized)return;await this.registerDefaultPlugins();let e=this.createContext(),t=[...Array.from(this.converterPlugins.values()).flat(),...this.structurePlugins,...this.middlewarePlugins];for(let n of t)try{await((r=n.initialize)==null?void 0:r.call(n,e))}catch{}this.initialized=!0}async destroy(){var r;if(!this.initialized)return;let e=this.createContext(),t=[...Array.from(this.converterPlugins.values()).flat(),...this.structurePlugins,...this.middlewarePlugins];for(let n of t)try{await((r=n.destroy)==null?void 0:r.call(n,e))}catch{}this.initialized=!1}createContext(){return{metadata:new Map,errors:[],warnings:[],stats:{startTime:Date.now(),processedTokens:0,convertedElements:0},performance:{startTime:Date.now()}}}async executeMiddlewareHook(e,t,r){var i;let n=t;for(let s of this.middlewarePlugins){let o=s[e];if(o)try{n=await o.call(s,n,r)||n}catch(a){r.errors.push(a),await((i=s.onError)==null?void 0:i.call(s,a,r))}}return n}async parseByBuffer(e,t={}){var n;await this.initialize();let r=this.createContext();r.rawData=e,r.userData=t.userData,r.metadata.set("decoder",this);try{for(let i of this.processors)try{switch(r=await i.process(r),i.stage){case"parse":r.rawData&&(r.rawData=await this.executeMiddlewareHook("onParse",r.rawData,r));break;case"extract":r.rawMessages&&(r.rawMessages=await this.executeMiddlewareHook("onExtractMessages",r.rawMessages,r));break;case"structure":r.result&&(r.result=await this.executeMiddlewareHook("onStructure",r.result,r));break;case"complete":r.result&&(r.result=await this.executeMiddlewareHook("onComplete",r.result,r));break}}catch(s){r.errors.push(s);for(let o of this.middlewarePlugins)await((n=o.onError)==null?void 0:n.call(o,s,r))}return r.result}catch(i){throw i}}};var ft={file:{course:6,device:1,settings:2,sport:3,activity:4,workout:5,schedules:7,weight:9,totals:10,goals:11,blood_pressure:14,monitoring_a:15,activity_summary:20,monitoring_daily:28,monitoring_b:32,segment_list:35,exd_configuration:40,invalid:0},sport:{generic:0,running:1,cycling:2,transition:3,fitness_equipment:4,swimming:5,basketball:6,soccer:7,tennis:8,american_football:9,training:10,walking:11,cross_country_skiing:12,alpine_skiing:13,snowboarding:14,rowing:15,mountaineering:16,hiking:17,multisport:18,paddling:19,invalid:254},event:{timer:0,workout:3,workout_step:4,power_down:5,power_up:6,off_course:7,session:8,lap:9,course_point:10,battery:11,virtual_partner_pace:12,hr_high_alert:13,hr_low_alert:14,speed_high_alert:15,speed_low_alert:16,cad_high_alert:17,cad_low_alert:18,power_high_alert:19,power_low_alert:20,recovery_hr:21,battery_low:22,time_duration_alert:23,distance_duration_alert:24,calorie_duration_alert:25,activity:26,fitness_equipment:27,length:28,user_marker:32,sport_point:33,calibration:36,front_gear_change:42,rear_gear_change:43,rider_position_change:44,elev_high_alert:45,elev_low_alert:46,comm_timeout:47,invalid:255},event_type:{start:0,stop:1,consecutive_depreciated:2,marker:3,stop_all:4,begin_depreciated:5,end_depreciated:6,end_all_depreciated:7,stop_disable:8,stop_disable_all:9,invalid:255},course_point:{generic:0,summit:1,valley:2,water:3,food:4,danger:5,left:6,right:7,straight:8,first_aid:9,fourth_category:10,third_category:11,second_category:12,first_category:13,hors_category:14,sprint:15,left_fork:16,right_fork:17,middle_fork:18,slight_left:19,sharp_left:20,slight_right:21,sharp_right:22,u_turn:23,segment_start:24,segment_end:25,invalid:255}},E=c=>{let e=ft[c];return{size:1,baseType:0,mapValue:t=>typeof t=="string"?e[t]??255:t,setValue:function(t,r){this.setUint8(t,r)}}},Le={enum_file:E("file"),enum_activity:E("sport"),enum_sport:E("sport"),enum_sub_sport:E("sport"),enum_event:E("event"),enum_event_type:E("event_type"),enum_course_point:E("course_point"),uint8:{size:1,baseType:2,setValue:DataView.prototype.setUint8},sint8:{size:1,baseType:1,setValue:DataView.prototype.setInt8},uint16:{size:2,baseType:132,setValue:DataView.prototype.setUint16},sint16:{size:2,baseType:131,setValue:DataView.prototype.setInt16},uint32:{size:4,baseType:134,setValue:DataView.prototype.setUint32},sint32:{size:4,baseType:133,setValue:DataView.prototype.setInt32},string:{size:0,baseType:7,mapValue:c=>Array.from(Ze(c)),setValue:yt},distance:{size:4,baseType:134,setValue:DataView.prototype.setUint32,mapValue:c=>Math.round(c*1e3)},speed:{size:2,baseType:132,setValue:DataView.prototype.setUint16,mapValue:c=>Math.round(c*100)},altitude:{size:2,baseType:132,setValue:DataView.prototype.setUint16,mapValue:c=>Math.round((c+500)*5)},seconds:{size:4,baseType:134,setValue:DataView.prototype.setUint32,mapValue:c=>Math.round(c*1e3)},date_time:{size:4,baseType:134,setValue:DataView.prototype.setUint32,mapValue:c=>{let e;return c instanceof Date?(e=Math.floor(c.getTime()/1e3),e-631065600):typeof c=="string"?(e=Math.floor(new Date(c).getTime()/1e3),e-631065600):c<631065600?Math.floor(c):(c>9999999999?e=Math.floor(c/1e3):e=Math.floor(c),e-631065600)}},semicircles:{size:4,baseType:133,setValue:DataView.prototype.setInt32,mapValue:c=>Math.round(c/180*2147483648)}};function Ye(c){return Array.from(Ze(c)).length+1}function*Ze(c){for(let e of gt(c))e<128?yield e:e<2048?(yield 192|e>>6,yield 128|e&63):e<65536?(yield 224|e>>12,yield 128|e>>6&63,yield 128|e&63):(yield 240|e>>18,yield 128|e>>12&63,yield 128|e>>6&63,yield 128|e&63);yield 0}function*gt(c){for(let e=0;e<c.length;){let t=c.codePointAt(e);if(t===void 0)break;yield t,e+=t>65535?2:1}}function yt(c,e){for(let t=0;t<e.length;t++)this.setUint8(c+t,e[t])}var ht={file_id:{mesgNum:0,fieldDefns:[{name:"type",number:0,type:"enum_file"},{name:"time_created",number:4,type:"date_time"}]},session:{mesgNum:18,fieldDefns:[{name:"timestamp",number:253,type:"date_time"},{name:"start_time",number:2,type:"date_time"},{name:"total_elapsed_time",number:7,type:"seconds"},{name:"total_timer_time",number:8,type:"seconds"},{name:"start_position_lat",number:3,type:"semicircles"},{name:"start_position_long",number:4,type:"semicircles"},{name:"total_distance",number:9,type:"distance"},{name:"total_ascent",number:21,type:"uint16"},{name:"total_descent",number:22,type:"uint16"},{name:"sport",number:5,type:"enum_sport"},{name:"sub_sport",number:6,type:"enum_sub_sport"},{name:"first_lap_index",number:11,type:"uint16"},{name:"num_laps",number:26,type:"uint16"}]},lap:{mesgNum:19,fieldDefns:[{name:"timestamp",number:253,type:"date_time"},{name:"start_time",number:2,type:"date_time"},{name:"start_position_lat",number:3,type:"semicircles"},{name:"start_position_long",number:4,type:"semicircles"},{name:"end_position_lat",number:5,type:"semicircles"},{name:"end_position_long",number:6,type:"semicircles"},{name:"total_elapsed_time",number:7,type:"seconds"},{name:"total_timer_time",number:8,type:"seconds"},{name:"total_distance",number:9,type:"distance"},{name:"total_ascent",number:21,type:"uint16"},{name:"total_descent",number:22,type:"uint16"}]},record:{mesgNum:20,fieldDefns:[{name:"timestamp",number:253,type:"date_time"},{name:"position_lat",number:0,type:"semicircles"},{name:"position_long",number:1,type:"semicircles"},{name:"altitude",number:2,type:"altitude"},{name:"distance",number:5,type:"distance"},{name:"heart_rate",number:3,type:"uint8"},{name:"cadence",number:4,type:"uint8"},{name:"speed",number:6,type:"speed"},{name:"power",number:7,type:"uint16"}]},event:{mesgNum:21,fieldDefns:[{name:"timestamp",number:253,type:"date_time"},{name:"event",number:0,type:"enum_event"},{name:"event_type",number:1,type:"enum_event_type"},{name:"event_group",number:4,type:"uint8"}]},course:{mesgNum:31,fieldDefns:[{name:"name",number:5,type:"string"},{name:"sport",number:4,type:"enum_sport"},{name:"sub_sport",number:7,type:"enum_sub_sport"}]},activity:{mesgNum:34,fieldDefns:[{name:"timestamp",number:253,type:"date_time"},{name:"total_timer_time",number:0,type:"seconds"},{name:"num_sessions",number:1,type:"uint16"},{name:"type",number:2,type:"enum_activity"},{name:"event",number:3,type:"enum_event"},{name:"event_type",number:4,type:"enum_event_type"},{name:"local_timestamp",number:5,type:"date_time"},{name:"event_group",number:6,type:"uint8"}]},course_point:{mesgNum:32,fieldDefns:[{name:"timestamp",number:1,type:"date_time"},{name:"position_lat",number:2,type:"semicircles"},{name:"position_long",number:3,type:"semicircles"},{name:"distance",number:4,type:"distance"},{name:"type",number:5,type:"enum_course_point"}]}},vt=(c,e)=>c.map(t=>({...t,value:e[t.name]})).filter(({value:t})=>t!==void 0),re=class c{static check(e,t,r,n){if(t===void 0)throw new Error(`Message '${e}' not known`);if(r===void 0)throw new Error(`Message '${e}' has no field definitions`);let i=r.map(o=>o.name),s=Object.keys(n).filter(o=>!i.includes(o));if(s.length)throw new Error(`Message '${e}' has no field definitions named '${s}'`)}constructor(e,t,r){let n=ht[t];if(!n)throw new Error(`Unknown message type: ${t}`);let{mesgNum:i,fieldDefns:s}=n;c.check(t,i,s,r),this.localNum=e,this.mesgNum=i,this.fields=vt(s,r)}get mesgDefn(){let e=this.fields.map(({number:t,type:r,value:n})=>{let i=Le[r];if(!i)throw new Error(`Unknown type: ${r}`);let{size:s,baseType:o}=i;return r==="string"?{number:t,size:Ye(n),baseType:o}:{number:t,size:s,baseType:o}});return{localNum:this.localNum,mesgNum:this.mesgNum,fieldDefns:e}}isSameDefn(e){let t=(o,a)=>o.number===a.number&&o.size===a.size&&o.baseType===a.baseType,r=(o,a)=>o.length===a.length&&o.every((p,d)=>t(p,a[d])),{localNum:n,mesgNum:i,fieldDefns:s}=this.mesgDefn;return i===e.mesgNum&&n===e.localNum&&r(s,e.fieldDefns)}get defnRecord(){let{localNum:e,mesgNum:t,fieldDefns:r}=this.mesgDefn,n=6+3*r.length,i=new DataView(new ArrayBuffer(n));i.setUint8(0,64|e),i.setUint8(2,1),i.setUint16(3,t),i.setUint8(5,r.length);let s=6;for(let o of r)i.setUint8(s++,o.number),i.setUint8(s++,o.size),i.setUint8(s++,o.baseType);return i.buffer}get dataRecord(){let{fieldDefns:e}=this.mesgDefn,t=1+e.reduce((i,{size:s})=>i+s,0),r=new DataView(new ArrayBuffer(t));r.setUint8(0,this.localNum);let n=1;for(let{number:i,type:s,value:o}of this.fields){let a=Le[s];if(!a)throw new Error(`Unknown type: ${s}`);let{size:p,setValue:d}=a,l;"mapValue"in a?l=a.mapValue(o):l=o,d&&d.call(r,n,l),n+=p}return r.buffer}};var xt=[0,52225,55297,5120,61441,15360,10240,58369,40961,27648,30720,46081,20480,39937,34817,17408],qe=(c,e)=>(c>>>4^xt[c&15^e])&65535,Ct=(c,e,t)=>qe(qe(c,e),t),Pt=(c,e)=>Ct(c,e&15,e>>>4);function _e(c,e=0){let t=e,r=c instanceof ArrayBuffer?new Uint8Array(c):c;for(let n=0;n<r.length;n++)t=Pt(t,r[n]);return t}var Qe=f(require("dayjs")),Je=14,wt=16,Et=2078,At=776358228,x=class{constructor(e={}){this.localNum={};this.mesgDefn=[];this.messages=[];this.options={compact:e.compact??!0,defaultActivity:e.defaultActivity??"cycling",defaultSubActivity:e.defaultSubActivity??"generic"}}async encode(e){return this.reset(),this.buildFITContent(e,"activity"),Buffer.from(await this.blob.arrayBuffer())}async encodeCourse(e){return this.reset(),this.buildFITContent(e,"course"),Buffer.from(await this.blob.arrayBuffer())}async encodeToBlob(e,t="activity"){return this.reset(),this.buildFITContent(e,t),this.blob}reset(){this.localNum={},this.mesgDefn=[],this.messages=[]}buildFITContent(e,t){this.buildFileId(e,t),t==="course"?this.buildCourseContent(e):this.buildActivityContent(e)}buildActivityContent(e){let t=e.sessionMesgs||[];if(t.length===0)throw new Error("Activity file must contain at least one Session");let r=0,n=[],i=[];for(let s of t){if(s.lapMesgs&&this.buildEventsFromLaps(s.lapMesgs,n),s.lapMesgs)for(let o of s.lapMesgs)o.recordMesgs&&this.buildRecords(o.recordMesgs);s.lapMesgs&&this.buildLaps(s.lapMesgs),this.buildSession(s),r++,this.buildActivityFromSession(s,i)}n.forEach(s=>this.buildEvent(s)),i.forEach(s=>this.buildActivity(s))}buildCourseContent(e){let t=e.sessionMesgs||[];if(t.length===0)throw new Error("Course file must contain track data");let r=t[0];if(this.buildCourse({name:"course",sport:this.options.defaultActivity}),r.lapMesgs){let n=[];for(let o of r.lapMesgs)o.recordMesgs&&n.push(...o.recordMesgs);n.sort((o,a)=>o.timestamp&&a.timestamp?new Date(o.timestamp).getTime()-new Date(a.timestamp).getTime():(o.distance||0)-(a.distance||0));let i=n[0],s=n[n.length-1];if(r.startTime&&this.buildEvent({timestamp:r.startTime,event:"timer",eventType:"start",eventGroup:0}),n.forEach(o=>this.buildRecord(o)),s.timestamp&&this.buildEvent({timestamp:s.timestamp,event:"timer",eventType:"stop_all",eventGroup:0}),r.lapMesgs)for(let o=0;o<r.lapMesgs.length;o++)this.buildLap(r.lapMesgs[o])}}buildFileId(e,t){var n;let r=((n=e.fileIdMesgs)==null?void 0:n[0])||{};this.writeMesg("file_id",{type:t,time_created:r.timeCreated?this.parseTimestamp(r.timeCreated):Date.now(),manufacturer:r.manufacturer,product:r.product,serial_number:r.serialNumber})}buildSession(e){var t;this.writeMesg("session",{timestamp:e.timestamp?e.timestamp:void 0,start_time:e.startTime?e.startTime:void 0,total_elapsed_time:e.totalElapsedTime,total_timer_time:e.totalTimerTime,start_position_lat:e.startPositionLat?this.convertToSemicircles(e.startPositionLat):void 0,start_position_long:e.startPositionLong?this.convertToSemicircles(e.startPositionLong):void 0,total_distance:e.totalDistance,total_ascent:e.totalAscent,total_descent:e.totalDescent,sport:e.sport||this.options.defaultActivity,sub_sport:e.subSport||this.options.defaultSubActivity,first_lap_index:e.firstLapIndex||0,num_laps:e.numLaps||((t=e.lapMesgs)==null?void 0:t.length)||1})}buildLaps(e){e.forEach(t=>this.buildLap(t))}buildLap(e){this.writeMesg("lap",{timestamp:e!=null&&e.timestamp?e.timestamp:void 0,start_time:e!=null&&e.startTime?e.startTime:void 0,start_position_lat:e!=null&&e.startPositionLat?this.convertToSemicircles(e.startPositionLat):void 0,start_position_long:e!=null&&e.startPositionLong?this.convertToSemicircles(e.startPositionLong):void 0,end_position_lat:e!=null&&e.endPositionLat?this.convertToSemicircles(e.endPositionLat):void 0,end_position_long:e!=null&&e.endPositionLong?this.convertToSemicircles(e.endPositionLong):void 0,total_elapsed_time:e==null?void 0:e.totalElapsedTime,total_timer_time:e==null?void 0:e.totalTimerTime,total_distance:e==null?void 0:e.totalDistance,total_ascent:e==null?void 0:e.totalAscent,total_descent:e==null?void 0:e.totalDescent})}buildRecords(e){e.forEach(t=>this.buildRecord(t))}buildRecord(e){this.writeMesg("record",{timestamp:e.timestamp,position_lat:e!=null&&e.positionLat?this.convertToSemicircles(e.positionLat):void 0,position_long:e!=null&&e.positionLong?this.convertToSemicircles(e.positionLong):void 0,altitude:e==null?void 0:e.altitude,enhancedAltitude:e==null?void 0:e.enhancedAltitude,distance:e==null?void 0:e.distance,heart_rate:e==null?void 0:e.heartRate,cadence:e==null?void 0:e.cadence,speed:e==null?void 0:e.speed,enhancedSpeed:e==null?void 0:e.enhancedSpeed,power:e==null?void 0:e.power})}buildEvent(e){this.writeMesg("event",{timestamp:e.timestamp?e.timestamp:void 0,event:e.event,event_type:e.eventType,event_group:e.eventGroup})}buildActivity(e){this.writeMesg("activity",{timestamp:e.timestamp?e.timestamp:void 0,total_timer_time:e.totalTimerTime,num_sessions:e.numSessions,type:e.type,event:e.event,event_type:e.eventType,local_timestamp:e.localTimestamp?this.parseTimestamp(e.localTimestamp):void 0,event_group:e.eventGroup})}buildCourse(e){this.writeMesg("course",{name:e.name,sport:e.sport})}buildEventsFromLaps(e,t){e.forEach((r,n)=>{r.startTime&&t.push({timestamp:r.startTime,event:"timer",eventType:"start",eventGroup:n}),r.timestamp&&t.push({timestamp:r.timestamp,event:"timer",eventType:n===e.length-1?"stop_all":"stop",eventGroup:n})})}buildActivityFromSession(e,t){t.push({timestamp:e.timestamp,totalTimerTime:e.totalTimerTime,numSessions:1,type:e.sport||this.options.defaultActivity,event:"activity",eventType:"stop",eventGroup:0})}parseTimestamp(e){return typeof e=="number"?e:(0,Qe.default)(e).valueOf()}convertToSemicircles(e){if(e!=null)return Math.round(e*2**31/180)}validateRequiredFields(e){if(!e.sessionMesgs||e.sessionMesgs.length===0)throw new Error("FIT file must contain at least one Session")}writeMesg(e,t){let r=Object.fromEntries(Object.entries(t).filter(([o,a])=>a!==void 0));if(Object.keys(r).length===0)return;let n=this.localNum[e];n===void 0&&(n=this.localNum[e]=Object.keys(this.localNum).length);let i=new re(n,e,r),s=this.mesgDefn[n];(!s||!i.isSameDefn(s))&&(this.messages.push(i.defnRecord),this.mesgDefn[n]=i.mesgDefn),this.messages.push(i.dataRecord)}get blob(){let e=[this.header,...this.messages,this.trailer];return new Blob(e,{type:"application/octet-stream"})}get dataLen(){return this.messages.reduce((e,t)=>e+t.byteLength,0)}get dataCrc(){return this.messages.reduce((e,t)=>_e(t,e),0)}get header(){let e=new DataView(new ArrayBuffer(Je));return e.setUint8(0,Je),e.setUint8(1,wt),e.setUint16(2,Et,!0),e.setUint32(4,this.dataLen,!0),e.setUint32(8,At),e.setUint16(12,_e(e.buffer.slice(0,12)),!0),e.buffer}get trailer(){let e=new DataView(new ArrayBuffer(2));return e.setUint16(0,this.dataCrc,!0),e.buffer}async encoder(e){return this.encode(e)}};var C=class{constructor(){this.version="1.0.0";this.priority=100}supports(e){return this.supportedTags.includes(e)}async initialize(e){e.metadata.set(`plugin:${this.name}:initialized`,!0)}async destroy(e){e.metadata.delete(`plugin:${this.name}:initialized`)}async validate(e){return!0}parseFloat(e){if(!(typeof e>"u"))return typeof e=="number"?e:typeof e=="string"&&parseFloat(e)||0}parseInt(e){return typeof e=="number"?Math.floor(e):typeof e=="string"&&parseInt(e,10)||0}parseString(e){return String(e||"")}parseBoolean(e){return typeof e=="boolean"?e:typeof e=="string"?e.toLowerCase()==="true":!1}parseDate(e){if(!e)return;let t=new Date(e);return isNaN(t.getTime())?void 0:t}hasRequiredAttributes(e,t){return t.every(r=>{var n;return(n=e.attributes)==null?void 0:n[r]})}extractAttributes(e,t,r){e.attributes&&Object.entries(e.attributes).forEach(([n,i])=>{let s=r[n];s&&s in t&&(t[s]=String(i||""))})}processChildren(e,t,r){var n;(n=e.children)==null||n.forEach(i=>{let s=r[i.tag];s&&s(i,t)})}getChildValue(e,t){var n;let r=(n=e.children)==null?void 0:n.find(i=>i.tag===t);return r!=null&&r.value?String(r.value):void 0}getChildByTag(e,t){var r;return(r=e.children)==null?void 0:r.find(n=>n.tag===t)}getChildrenByTag(e,t){var r;return((r=e.children)==null?void 0:r.filter(n=>n.tag===t))||[]}convertExtensions(e){var r;let t={};return(r=e.children)==null||r.forEach(n=>{t[n.tag]=this.convertExtensionContent(n)}),t}convertExtensionContent(e){var t;if((t=e.children)!=null&&t.length){let r={};return e.children.forEach(n=>{r[n.tag]=this.convertExtensionContent(n)}),r}else return e.value}},A=class{constructor(){this.version="1.0.0";this.description=""}async initialize(e){}async destroy(e){}async validate(e){return!0}async onTokenize(e,t){return e}async onAstGenerate(e,t){return e}async onConvert(e,t){return e}async onComplete(e,t){return e}async onError(e,t){}};var m=class extends C{parseCoordinate(e){let t=this.parseFloat(e);return t===0?void 0:t}parseGPXTime(e){if(!e)return;let t=new Date(e);return isNaN(t.getTime())?void 0:t}extractNumericAttributes(e,t,r){e.attributes&&Object.entries(e.attributes).forEach(([n,i])=>{let s=r[n];s&&s in t&&typeof i<"u"&&(t[s]=this.parseFloat(i))})}},K=class extends A{async onError(e,t){t.warnings.push(`Middleware ${this.name} error: ${e.message}`)}};var ne=class extends m{constructor(){super(...arguments);this.name="wpt-converter";this.supportedTags=["wpt","trkpt","rtept"];this.version="1.0.0"}convert(t,r){var i,s;if(!this.hasRequiredAttributes(t,["lat","lon"]))return;let n={lat:this.parseFloat((i=t.attributes)==null?void 0:i.lat),lon:this.parseFloat((s=t.attributes)==null?void 0:s.lon)};return this.processChildren(t,n,{ele:(o,a)=>a.ele=this.parseFloat(o.value),time:(o,a)=>a.time=new Date(this.parseString(o.value)),speed:(o,a)=>a.speed=this.parseFloat(o.value),power:(o,a)=>a.power=this.parseFloat(o.value),cadence:(o,a)=>a.cadence=this.parseFloat(o.value),heartRate:(o,a)=>a.heartRate=this.parseFloat(o.value),course:(o,a)=>a.course=this.parseFloat(o.value),name:(o,a)=>a.name=this.parseString(o.value),cmt:(o,a)=>a.cmt=this.parseString(o.value),desc:(o,a)=>a.desc=this.parseString(o.value),src:(o,a)=>a.src=this.parseString(o.value),sym:(o,a)=>a.sym=this.parseString(o.value),type:(o,a)=>a.type=this.parseString(o.value),fix:(o,a)=>a.fix=this.parseString(o.value),sat:(o,a)=>a.sat=this.parseString(o.value),hdop:(o,a)=>a.hdop=this.parseFloat(o.value),vdop:(o,a)=>a.vdop=this.parseFloat(o.value),pdop:(o,a)=>a.pdop=this.parseFloat(o.value),ageofdgpsdata:(o,a)=>a.ageofdgpsdata=this.parseFloat(o.value),geoidheight:(o,a)=>a.geoidheight=this.parseFloat(o.value),magvar:(o,a)=>a.magvar=this.parseFloat(o.value),dgpsid:(o,a)=>a.dgpsid=this.parseFloat(o.value),extensions:(o,a)=>{let p=r.metadata.get("decoder"),d=p==null?void 0:p.getConverter("extensions");if(d){let l=d.convert(o,r);l&&(this.mapExtensionsToPoint(l,a),a.extensions=l)}},link:(o,a)=>{var l;a.link||(a.link=[]);let p=r.metadata.get("decoder"),d=(l=p==null?void 0:p.getConverter("link"))==null?void 0:l.convert(o,r);d&&a.link&&a.link.push(d)}}),n}mapExtensionsToPoint(t,r){Object.entries(t).forEach(([n,i])=>{if(i!==void 0&&(typeof i=="string"||typeof i=="number")){let s=o=>(Array.isArray(o)?o:[o]).some(p=>{let d=n.toLowerCase(),l=p.toLowerCase();return d===l||d.endsWith(`:${l}`)});s("speed")?r.speed=this.parseFloat(i):s("hr")?r.heartRate=this.parseFloat(i):s(["cad","cadence"])?r.cadence=this.parseFloat(i):s(["PowerInWatts","power"])&&(r.power=this.parseFloat(i))}})}},ie=class extends m{constructor(){super(...arguments);this.name="rte-converter";this.supportedTags=["rte"]}convert(t,r){let n={rtept:[]};return this.processChildren(t,n,{name:(i,s)=>s.name=this.parseString(i.value),cmt:(i,s)=>s.cmt=this.parseString(i.value),desc:(i,s)=>s.desc=this.parseString(i.value),src:(i,s)=>s.src=this.parseString(i.value),number:(i,s)=>s.number=this.parseFloat(i.value),type:(i,s)=>s.type=this.parseString(i.value),rtept:(i,s)=>{var p;let o=r.metadata.get("decoder"),a=(p=o==null?void 0:o.getConverter("wpt"))==null?void 0:p.convert(i,r);a&&s.rtept&&s.rtept.push(a)},extensions:(i,s)=>{let o=r.metadata.get("decoder"),a=o==null?void 0:o.getConverter("extensions");a&&(s.extensions=a.convert(i,r))},link:(i,s)=>{var a;s.link||(s.link=[]);let o=r.metadata.get("decoder");(a=i.children)==null||a.forEach(p=>{var l;let d=(l=o==null?void 0:o.getConverter("link"))==null?void 0:l.convert(p,r);d&&s.link&&s.link.push(d)})}}),n}},se=class extends m{constructor(){super(...arguments);this.name="trk-converter";this.supportedTags=["trk"]}convert(t,r){let n={trkseg:[]};return this.processChildren(t,n,{name:(i,s)=>s.name=this.parseString(i.value),cmt:(i,s)=>s.cmt=this.parseString(i.value),desc:(i,s)=>s.desc=this.parseString(i.value),src:(i,s)=>s.src=this.parseString(i.value),number:(i,s)=>s.number=this.parseFloat(i.value),type:(i,s)=>s.type=this.parseString(i.value),trkseg:(i,s)=>{var p;let o=r.metadata.get("decoder"),a=(p=o==null?void 0:o.getConverter("trkseg"))==null?void 0:p.convert(i,r);a&&s.trkseg&&s.trkseg.push(a)},extensions:(i,s)=>{let o=r.metadata.get("decoder"),a=o==null?void 0:o.getConverter("extensions");a&&(s.extensions=a.convert(i,r))},link:(i,s)=>{var a;s.link||(s.link=[]);let o=r.metadata.get("decoder");(a=i.children)==null||a.forEach(p=>{var l;let d=(l=o==null?void 0:o.getConverter("link"))==null?void 0:l.convert(p,r);d&&s.link&&s.link.push(d)})}}),n}},oe=class extends m{constructor(){super(...arguments);this.name="trkseg-converter";this.supportedTags=["trkseg"]}convert(t,r){let n={trkpt:[]};return this.processChildren(t,n,{trkpt:(i,s)=>{var p;let o=r.metadata.get("decoder"),a=(p=o==null?void 0:o.getConverter("wpt"))==null?void 0:p.convert(i,r);a&&s.trkpt&&s.trkpt.push(a)},extensions:(i,s)=>{let o=r.metadata.get("decoder"),a=o==null?void 0:o.getConverter("extensions");a&&(s.extensions=a.convert(i,r))}}),n}},ae=class extends m{constructor(){super(...arguments);this.name="link-converter";this.supportedTags=["link"]}convert(t,r){var i;let n={};return(i=t.attributes)!=null&&i.href&&(n.href=t.attributes.href),this.processChildren(t,n,{text:(s,o)=>o.text=this.parseString(s.value),type:(s,o)=>o.type=this.parseString(s.value)}),n}},ce=class extends m{constructor(){super(...arguments);this.name="metadata-converter";this.supportedTags=["metadata"]}convert(t,r){let n={};return this.processChildren(t,n,{name:(i,s)=>s.name=this.parseString(i.value),desc:(i,s)=>s.desc=this.parseString(i.value),keywords:(i,s)=>s.keywords=this.parseString(i.value),time:(i,s)=>s.time=new Date(this.parseString(i.value)),author:(i,s)=>{var a;let o=r.metadata.get("decoder");s.author=(a=o==null?void 0:o.getConverter("author"))==null?void 0:a.convert(i,r)},copyright:(i,s)=>{var a;let o=r.metadata.get("decoder");s.copyright=(a=o==null?void 0:o.getConverter("copyright"))==null?void 0:a.convert(i,r)},bounds:(i,s)=>{var a;let o=r.metadata.get("decoder");s.bounds=(a=o==null?void 0:o.getConverter("bounds"))==null?void 0:a.convert(i,r)},extensions:(i,s)=>{let o=r.metadata.get("decoder"),a=o==null?void 0:o.getConverter("extensions");a&&(s.extensions=a.convert(i,r))},link:(i,s)=>{var p;s.link||(s.link=[]);let o=r.metadata.get("decoder"),a=(p=o==null?void 0:o.getConverter("link"))==null?void 0:p.convert(i,r);a&&s.link&&s.link.push(a)}}),n}},pe=class extends m{constructor(){super(...arguments);this.name="person-converter";this.supportedTags=["author"]}convert(t,r){var i;let n={};return t.value&&!((i=t.children)!=null&&i.length)?(n.name=this.parseString(t.value),n):(this.processChildren(t,n,{name:(s,o)=>o.name=this.parseString(s.value),email:(s,o)=>{var p;let a=r.metadata.get("decoder");o.email=(p=a==null?void 0:a.getConverter("email"))==null?void 0:p.convert(s,r)},link:(s,o)=>{var p;let a=r.metadata.get("decoder");o.link=(p=a==null?void 0:a.getConverter("link"))==null?void 0:p.convert(s,r)}}),n)}},de=class extends m{constructor(){super(...arguments);this.name="email-converter";this.supportedTags=["email"]}convert(t,r){let n={};return this.processChildren(t,n,{id:(i,s)=>s.id=this.parseString(i.value),domain:(i,s)=>s.domain=this.parseString(i.value)}),n}},le=class extends m{constructor(){super(...arguments);this.name="copyright-converter";this.supportedTags=["copyright"]}convert(t,r){var i;let n={};return(i=t.attributes)!=null&&i.author&&(n.author=t.attributes.author),this.processChildren(t,n,{year:(s,o)=>o.year=this.parseString(s.value),license:(s,o)=>o.license=this.parseString(s.value)}),n}},ue=class extends m{constructor(){super(...arguments);this.name="bounds-converter";this.supportedTags=["bounds"]}convert(t,r){let n={};return this.extractAttributes(t,n,{minlat:"minlat",minlon:"minlon",maxlat:"maxlat",maxlon:"maxlon"}),n}},me=class extends m{constructor(){super(...arguments);this.name="extensions-converter";this.supportedTags=["extensions"]}convert(t,r){var i;let n={};return(i=t.children)==null||i.forEach(s=>{this.flattenExtensionElement(s,n)}),n}flattenExtensionElement(t,r){var n,i;if(!((n=t.children)!=null&&n.length)&&t.value!==void 0){r[t.tag]=this.parseExtensionValue(t.value);return}(i=t.children)!=null&&i.length&&t.children.forEach(s=>{this.flattenExtensionElement(s,r)})}parseExtensionValue(t){if(t===void 0)return;let r=String(t),n=parseFloat(r);return!isNaN(n)&&isFinite(n)?n:r}};var et=require("htmlparser2"),N=(n=>(n.TOKENIZE="tokenize",n.AST_GENERATE="ast_generate",n.CONVERT="convert",n.COMPLETE="complete",n))(N||{}),Te=class{constructor(){this.stage="tokenize"}async process(e){let t=Date.now();if(!e.xmlContent)throw new Error("XML content cannot be empty");let r=[],n=new et.Parser({onopentag(i,s){r.push({type:"open",tag:i,attributes:s})},ontext(i){let s=i.replace(/\n/g,"").trim();s&&r.push({type:"text",tag:"text",value:s})},onclosetag(i){r.push({type:"close",tag:i})}},{xmlMode:!0});return n.write(e.xmlContent),n.end(),e.tokens=r,e.performance.tokenizeTime=Date.now()-t,e}},fe=class{constructor(){this.stage="ast_generate"}async process(e){var s;let t=Date.now();if(!e.tokens)throw new Error("Tokens cannot be empty");let r=[],n,i=null;for(let o of e.tokens)if(o.type==="open"){let a={tag:o.tag,attributes:o.attributes||{},children:[]};n?i&&((s=i.children)==null||s.push(a)):n=a,r.push(a),i=a}else o.type==="text"&&i?i.value=o.value:o.type==="close"&&(r.pop(),i=r[r.length-1]||null);return e.ast=n,e.performance.astTime=Date.now()-t,e}},ge=class{constructor(e){this.getConverter=e;this.stage="convert"}async process(e){var n;let t=Date.now();if(!e.ast)throw new Error("AST cannot be empty");let r={};return e.ast.attributes&&Object.entries(e.ast.attributes).forEach(([i,s])=>{i.startsWith("xmlns:")?r[i]=s.replace(/'/g,"'"):i==="xsi:schemaLocation"?r[i]=s.replace(/'/g,"'"):r[i]=s}),(n=e.ast.children)==null||n.forEach(i=>{let s=this.getConverter(i.tag);try{let o=s.convert(i,e);o&&this.assignResult(r,i.tag,o)}catch(o){e.errors.push(o)}}),e.result=r,e.performance.convertTime=Date.now()-t,e}assignResult(e,t,r){switch(t){case"metadata":e.metadata=r;break;case"wpt":e.wpt||(e.wpt=[]),e.wpt.push(r);break;case"rte":e.rte||(e.rte=[]),e.rte.push(r);break;case"trk":e.trk||(e.trk=[]),e.trk.push(r);break;case"extensions":e.extensions=r;break}}},ye=class{constructor(){this.stage="complete"}async process(e){e.performance.endTime=Date.now();let t=e.performance.endTime-e.performance.startTime;return e.metadata.set("performance",{totalTime:t,tokenizeTime:e.performance.tokenizeTime,astTime:e.performance.astTime,convertTime:e.performance.convertTime}),e}};var b=class{constructor(){this.converterPlugins=new Map;this.registeredPlugins=new Set;this.middlewarePlugins=[];this.processors=[];this.initialized=!1;this.defaultConvertersRegistered=!1;this.initializePipeline()}initializePipeline(){this.processors=[new Te,new fe,new ge(e=>this.getConverter(e)),new ye]}async registerDefaultConverters(){var t;if(this.defaultConvertersRegistered)return;let e=[new ne,new ie,new se,new oe,new ae,new ce,new pe,new de,new le,new ue,new me];for(let r of e)(t=r.supportedTags)==null||t.forEach(n=>{this.addConverterForTag(n,r)}),this.registeredPlugins.add(r.name);this.defaultConvertersRegistered=!0}addConverterForTag(e,t){this.converterPlugins.has(e)||this.converterPlugins.set(e,[]);let r=this.converterPlugins.get(e);r.push(t),r.sort((n,i)=>(n.priority||100)-(i.priority||100))}async registerConverter(e){var r,i;if(this.registeredPlugins.has(e.name))throw new Error(`Converter plugin ${e.name} already exists`);(r=e.supportedTags)==null||r.forEach(s=>{this.addConverterForTag(s,e)}),this.registeredPlugins.add(e.name);let t=e.priority!==void 0?` (priority: ${e.priority})`:"";(i=e.supportedTags)==null||i.forEach(s=>{let a=(this.converterPlugins.get(s)||[]).map(p=>`${p.name}(${p.priority||100})`)})}async registerMiddleware(e){let t=this.middlewarePlugins.findIndex(n=>n.name===e.name);t!==-1?this.middlewarePlugins[t]=e:this.middlewarePlugins.push(e);let r=[];e.onTokenize&&r.push("onTokenize"),e.onAstGenerate&&r.push("onAstGenerate"),e.onConvert&&r.push("onConvert"),e.onComplete&&r.push("onComplete"),e.onError&&r.push("onError"),r.length>0}getConverter(e){let t=this.converterPlugins.get(e);return t&&t.length>0?t[0]:void 0}getAllConverters(e){return this.converterPlugins.get(e)||[]}unregisterConverter(e){let t;for(let[r,n]of this.converterPlugins){let i=n.findIndex(s=>s.name===e);i!==-1&&(t=n[i],n.splice(i,1),n.length===0&&this.converterPlugins.delete(r))}t&&this.registeredPlugins.delete(e)}unregisterMiddleware(e){let t=this.middlewarePlugins.findIndex(r=>r.name===e);t!==-1&&this.middlewarePlugins.splice(t,1)}listConverters(){return Array.from(this.converterPlugins.keys())}listConverterPlugins(){return Array.from(this.registeredPlugins)}listMiddlewares(){return this.middlewarePlugins.map(e=>e.name)}listProcessors(){return this.processors.map(e=>e.constructor.name)}getConverterDetails(e){let t={};if(e){let r=this.converterPlugins.get(e);r&&(t[e]=r.map(n=>({name:n.name,priority:n.priority||100})))}else for(let[r,n]of this.converterPlugins)t[r]=n.map(i=>({name:i.name,priority:i.priority||100}));return t}getMiddlewareDetails(){return this.middlewarePlugins.map(e=>{let t=[];return e.onTokenize&&t.push("onTokenize"),e.onAstGenerate&&t.push("onAstGenerate"),e.onConvert&&t.push("onConvert"),e.onComplete&&t.push("onComplete"),e.onError&&t.push("onError"),{name:e.name,hooks:t}})}async initialize(){var r;if(this.initialized)return;await this.registerDefaultConverters();let e=this.createContext(),t=[...Array.from(this.converterPlugins.values()).flat(),...this.middlewarePlugins];for(let n of t)try{await((r=n.initialize)==null?void 0:r.call(n,e))}catch{}this.initialized=!0}async destroy(){var r;if(!this.initialized)return;let e=this.createContext(),t=[...Array.from(this.converterPlugins.values()).flat(),...this.middlewarePlugins];for(let n of t)try{await((r=n.destroy)==null?void 0:r.call(n,e))}catch{}this.initialized=!1}createContext(){return{metadata:new Map,errors:[],warnings:[],stats:{startTime:Date.now(),processedTokens:0,convertedElements:0},performance:{startTime:Date.now()}}}async executeMiddlewareHook(e,t,r){var i;let n=t;for(let s of this.middlewarePlugins){let o=s[e];if(o)try{n=await o.call(s,n,r)||n}catch(a){r.errors.push(a),await((i=s.onError)==null?void 0:i.call(s,a,r))}}return n}async parserByBuffer(e){var r;await this.initialize();let t=this.createContext();t.rawData=e,t.xmlContent=e.toString("utf-8"),t.metadata.set("decoder",this);try{for(let n of this.processors)try{switch(t=await n.process(t),n.stage){case"tokenize":t.tokens&&(t.tokens=await this.executeMiddlewareHook("onTokenize",t.tokens,t));break;case"ast_generate":t.ast&&(t.ast=await this.executeMiddlewareHook("onAstGenerate",t.ast,t));break;case"convert":t.result&&(t.result=await this.executeMiddlewareHook("onConvert",t.result,t));break;case"complete":t.result&&(t.result=await this.executeMiddlewareHook("onComplete",t.result,t));break}}catch(i){t.errors.push(i);for(let s of this.middlewarePlugins)await((r=s.onError)==null?void 0:r.call(s,i,t))}return t.result}catch(n){throw n}}convertExtensions(e){var s,o;let t={},{attributes:r,tag:n,value:i}=e;if(r&&Object.entries(r).forEach(([a,p])=>{t[a]=p}),(s=e==null?void 0:e.children)!=null&&s.length)(o=e.children)==null||o.forEach(a=>{t[a.tag]=this.convertExtensions(a)});else if(i!==void 0)return i;return t}};var $e=f(require("dayjs")),tt=f(require("dayjs/plugin/utc.js"));var Me={temperature:"atemp",wtemp:"wtemp",heartRate:"hr",cadence:"cad"};var Oe={temperature:"Temperature",Depth:"Depth"};$e.default.extend(tt.default);var I=class{constructor(e={}){this.formatElevation=e=>{let t=parseFloat(e);return isNaN(t)?e:this.roundTo(t,2).toString()};this.compact=e.compact??!0}async encode(e){let t=this.buildGPXXML(e);return Buffer.from(t,"utf-8")}encodeToString(e){return this.buildGPXXML(e)}buildGPXXML(e){let t=this.buildXMLHeader(),r=this.buildGPXContent(e),i=`${t}${r}
|
|
2
|
-
</gpx>`;return this.compact?this.compressXML(
|
|
3
|
-
`)}buildGPXContent(
|
|
4
|
-
`)}buildMetadata(
|
|
5
|
-
`)}buildAuthor(
|
|
6
|
-
`)}buildCopyright(
|
|
7
|
-
`)}buildBounds(
|
|
8
|
-
`)}addStandardWaypointElements(
|
|
9
|
-
`)}buildTrack(
|
|
10
|
-
`)}buildTrackSegment(
|
|
11
|
-
`)}addRouteTrackCommonElements(e,t){var r;this.addOptionalElement(e,"name",t.name),this.addOptionalElement(e,"cmt",t.cmt),this.addOptionalElement(e,"desc",t.desc),this.addOptionalElement(e,"src",t.src),t.link&&this.addLinks(e,t.link),this.addOptionalElement(e,"number",(r=t.number)==null?void 0:r.toString()),this.addOptionalElement(e,"type",t.type)}processPointExtensions(e,t){let r={};return Object.entries({"gpxtpx:TrackPointExtension":{"gpxtpx:hr":"heartRate","gpxtpx:cad":"cadence","gpxtpx:speed":"speed","gpxtpx:atemp":"temperature","gpxtpx:wtemp":"wtemp","gpxtpx:temp":"temperature"},"gpxpx:PowerExtension":{"gpxpx:PowerInWatts":"power"},"gpxx:GpxExtensions":{"gpxx:Temperature":"temperature","gpxx:Depth":"depth"}}).forEach(([i,s])=>{let o={},a=!1;Object.entries(s).forEach(([p,d])=>{let l;if(e[d]!==void 0)l=e[d];else if(t)if(t[p]!==void 0)l=t[p];else{let Z=p.split(":").pop();Object.entries(t).forEach(([V,u])=>{V.endsWith(`:${Z}`)&&u!==void 0&&(l=u)})}l!==void 0&&(o[p]=l,a=!0)}),a&&(r[i]=o)}),r}buildTrackPointExtension(e,t){let r=this.deepClone(t["gpxtpx:TrackPointExtension"]||{}),n=Object.keys(Me);return Object.keys(e).filter(i=>n.includes(i)).forEach(i=>{let s=Me[i];s&&e[i]!==void 0&&(r[`gpxtpx:${s}`]=e[i])}),r}buildPowerExtension(e,t){return this.deepClone(t["gpxpx:PowerExtension"]||{})}buildGpxExtensions(e,t){let r=this.deepClone(t["gpxx:GpxExtensions"]||{}),n=Object.keys(Oe);return Object.keys(e).filter(i=>n.includes(i)).forEach(i=>{let s=Oe[i];s&&e[i]!==void 0&&(r[`gpxx:${s}`]=e[i])}),r}buildExtensions(e){let t=this.buildExtensionContent(e);return t?`<extensions>${t}</extensions>`:""}buildExtensionContent(e){return Object.entries(e).filter(([t])=>!t.startsWith("xmlns")).map(([t,r])=>{if(r&&typeof r=="object"){let n=this.buildExtensionContent(r);return`<${t}>${n}</${t}>`}else if(r!=null)return`<${t}>${this.escapeXML(String(r))}</${t}>`;return""}).filter(t=>t).join("")}buildLink(e){let t=[`<link href="${this.escapeXMLAttribute(e.href||"")}">`];return this.addOptionalElement(t,"text",e.text),this.addOptionalElement(t,"type",e.type),t.push("</link>"),t.join("")}addLinks(e,t){(Array.isArray(t)?t:[t]).forEach(n=>{e.push(this.buildLink(n))})}buildTimeElement(e){return typeof e=="string"&&/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z?$/.test(e)?`<time>${e}</time>`:`<time>${(0,$e.default)(e).utc().format("YYYY-MM-DDTHH:mm:ss[Z]")}</time>`}addOptionalElement(e,t,r,n){if(r!=null&&r!==""){let i=n?n(r):this.escapeXML(r);e.push(`<${t}>${i}</${t}>`)}}isValidCoordinate(e,t){return e!=null&&t!==void 0&&t!==null&&!isNaN(e)&&!isNaN(t)}formatCoordinate(e){return this.roundTo(e,6).toString()}roundTo(e,t){let r=Math.pow(10,t);return Math.round(e*r)/r}escapeXML(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}escapeXMLAttribute(e){return typeof e!="string"?String(e||""):e.replace(/&/g,"&").replace(/"/g,""").replace(/'/g,"'").replace(/</g,"<").replace(/>/g,">").replace(/\r/g," ").replace(/\n/g," ").replace(/\t/g,"	")}deepClone(e){if(e===null||typeof e!="object")return e;if(e instanceof Date)return new Date(e.getTime());if(Array.isArray(e))return e.map(r=>this.deepClone(r));let t={};for(let r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=this.deepClone(e[r]));return t}encoder(e){return this.encode(e)}};var Ge=class extends K{constructor(){super(...arguments);this.name="performance-middleware";this.description="Monitor parsing performance"}async onTokenize(t,r){return t}async onAstGenerate(t,r){let n=this.countNodes(t);return t}async onComplete(t,r){let n=r.metadata.get("performance");return t}countNodes(t){let r=1;if(t.children)for(let n of t.children)r+=this.countNodes(n);return r}},Be=class extends K{constructor(){super(...arguments);this.name="validation-middleware";this.description="Validate GPX data integrity"}async onComplete(t,r){let n=this.validateGPX(t);return n.length>0&&r.metadata.set("validation-errors",n),t}validateGPX(t){let r=[];if(t.version||r.push("Missing GPX version information"),t.creator||r.push("Missing GPX creator information"),t.trk){for(let n of t.trk)if(n.trkseg){for(let i of n.trkseg)if(i.trkpt)for(let s of i.trkpt)s.time&&r.push("Invalid track point time")}}return r}};async function He(c){let e=[new Ge,new Be];for(let t of e)await c.registerMiddleware(t)}var T=class extends C{parseHeartRate(e){let t=this.parseFloat(e);if(!(typeof t>"u"))return t>0&&t<300?t:void 0}parseTCXTime(e){if(!e)return;let t=new Date(e);return isNaN(t.getTime())?void 0:t}parseDistance(e){let t=this.parseFloat(e);if(!(typeof t>"u"))return t>0?t:void 0}parseSpeed(e){let t=this.parseFloat(e);if(!(typeof t>"u"))return t>=0?t:void 0}parseAltitude(e){return this.parseFloat(e)}parseCoordinate(e){let t=this.parseFloat(e);return t!==0?t:void 0}};var he=class extends T{constructor(){super(...arguments);this.name="PositionConverter";this.supportedTags=["Position"]}convert(t,r){let n={};return this.processChildren(t,n,{LatitudeDegrees:(i,s)=>s.LatitudeDegrees=this.parseString(i.value),LongitudeDegrees:(i,s)=>s.LongitudeDegrees=this.parseString(i.value)}),n}},ve=class extends T{constructor(){super(...arguments);this.name="TrackpointConverter";this.supportedTags=["Trackpoint"]}convert(t,r){let n={};return this.processChildren(t,n,{Time:(i,s)=>s.Time=this.parseString(i.value),Position:(i,s)=>{var a;let o=r.metadata.get("decoder");s.Position=(a=o==null?void 0:o.getConverter("Position"))==null?void 0:a.convert(i,r)},AltitudeMeters:(i,s)=>s.AltitudeMeters=this.parseFloat(i.value),DistanceMeters:(i,s)=>s.DistanceMeters=this.parseFloat(i.value),HeartRateBpm:(i,s)=>{if(i.value)s.HeartRateBpm=this.parseFloat(i.value);else{let o=this.getChildByTag(i,"Value");o!=null&&o.value&&(s.HeartRateBpm=this.parseFloat(o.value))}},Cadence:(i,s)=>{let o={Low:0,High:0};this.processChildren(i,o,{Low:(a,p)=>p.Low=this.parseFloat(a.value)||0,High:(a,p)=>p.High=this.parseFloat(a.value)||0}),s.Cadence=o},SensorState:(i,s)=>s.SensorState=i.value,Extensions:(i,s)=>{let o=r.metadata.get("decoder"),a=o==null?void 0:o.getConverter("Extensions");a&&(s.Extensions=a.convert(i,r))}}),n}},xe=class extends T{constructor(){super(...arguments);this.name="TrackConverter";this.supportedTags=["Track"]}convert(t,r){let n={Trackpoint:[]};return this.processChildren(t,n,{Trackpoint:(i,s)=>{var p;let o=r.metadata.get("decoder"),a=(p=o==null?void 0:o.getConverter("Trackpoint"))==null?void 0:p.convert(i,r);a&&s.Trackpoint&&s.Trackpoint.push(a)}}),n}},Ce=class extends T{constructor(){super(...arguments);this.name="ActivityLapConverter";this.supportedTags=["Lap"]}convert(t,r){let n={};return this.extractAttributes(t,n,{StartTime:"Id"}),this.processChildren(t,n,{TotalTimeSeconds:(i,s)=>s.TotalTimeSeconds=this.parseFloat(i.value),DistanceMeters:(i,s)=>s.DistanceMeters=this.parseFloat(i.value),MaximumSpeed:(i,s)=>s.MaximumSpeed=this.parseFloat(i.value),Calories:(i,s)=>s.Calories=this.parseFloat(i.value),AverageHeartRateBpm:(i,s)=>s.AverageHeartRateBpm=this.parseFloat(i.value),MaximumHeartRateBpm:(i,s)=>s.MaximumHeartRateBpm=this.parseFloat(i.value),Intensity:(i,s)=>s.Intensity=i.value,TriggerMethod:(i,s)=>s.TriggerMethod=i.value,Track:(i,s)=>{var p;s.Track||(s.Track=[]);let o=r.metadata.get("decoder"),a=(p=o==null?void 0:o.getConverter("Track"))==null?void 0:p.convert(i,r);a&&s.Track.push(a)},Notes:(i,s)=>s.Notes=this.parseString(i.value),Extensions:(i,s)=>{let o=r.metadata.get("decoder"),a=o==null?void 0:o.getConverter("Extensions");a&&(s.Extensions=a.convert(i,r))}}),n}},Pe=class extends T{constructor(){super(...arguments);this.name="ActivityConverter";this.supportedTags=["Activity"]}convert(t,r){let n={Id:"",Lap:[]};return this.extractAttributes(t,n,{Activity:"Activity"}),this.processChildren(t,n,{Id:(i,s)=>s.Id=this.parseString(i.value),Lap:(i,s)=>{var p;let o=r.metadata.get("decoder"),a=(p=o==null?void 0:o.getConverter("Lap"))==null?void 0:p.convert(i,r);a&&s.Lap.push(a)},Notes:(i,s)=>s.Notes=this.parseString(i.value),Training:(i,s)=>s.Training=this.convertTraining(i),Creator:(i,s)=>s.Creator=this.convertCreator(i),Extensions:(i,s)=>{let o=r.metadata.get("decoder"),a=o==null?void 0:o.getConverter("Extensions");a&&(s.Extensions=a.convert(i,r))}}),n}convertTraining(t){var n;let r={};return t.attributes&&Object.entries(t.attributes).forEach(([i,s])=>{r[i]=s}),(n=t.children)==null||n.forEach(i=>{r[i.tag]=this.convertExtensionContent(i)}),r}convertCreator(t){var n;let r={};return(n=t.children)==null||n.forEach(i=>{r[i.tag]=this.convertExtensionContent(i)}),r}},we=class extends T{constructor(){super(...arguments);this.name="ActivityListConverter";this.supportedTags=["Activities"]}convert(t,r){let n={Activity:[],MultiActivitySession:[]};return this.processChildren(t,n,{Activity:(i,s)=>{var p;let o=r.metadata.get("decoder"),a=(p=o==null?void 0:o.getConverter("Activity"))==null?void 0:p.convert(i,r);a&&s.Activity&&s.Activity.push(a)},MultiActivitySession:(i,s)=>{var p;let o=r.metadata.get("decoder"),a=(p=o==null?void 0:o.getConverter("MultiActivitySession"))==null?void 0:p.convert(i,r);a&&s.MultiActivitySession&&s.MultiActivitySession.push(a)}}),n}},Ee=class extends T{constructor(){super(...arguments);this.name="MultiActivitySessionConverter";this.supportedTags=["MultiActivitySession"]}convert(t,r){let n={};return this.processChildren(t,n,{Id:(i,s)=>s.Id=this.parseString(i.value),FirstActivity:(i,s)=>{var a;let o=r.metadata.get("decoder");s.FirstActivity=(a=o==null?void 0:o.getConverter("FirstActivity"))==null?void 0:a.convert(i,r)},NextActivity:(i,s)=>{var p;s.NextActivity||(s.NextActivity=[]);let o=r.metadata.get("decoder"),a=(p=o==null?void 0:o.getConverter("NextActivity"))==null?void 0:p.convert(i,r);a&&s.NextActivity.push(a)},Notes:(i,s)=>s.Notes=this.parseString(i.value)}),n}},Ae=class extends T{constructor(){super(...arguments);this.name="AbstractSourceConverter";this.supportedTags=["Author","Creator"]}convert(t,r){let n={};return this.processChildren(t,n,{Name:(i,s)=>s.Name=this.parseString(i.value)}),n}},be=class extends T{constructor(){super(...arguments);this.name="extensions-converter";this.supportedTags=["Extensions"]}convert(t,r){let n={};return this.flattenExtensionElement(t,n),n}flattenExtensionElement(t,r){var n,i;if(!((n=t.children)!=null&&n.length)&&t.value!==void 0){r[t.tag]=this.parseExtensionValue(t.value);return}(i=t.children)!=null&&i.length&&t.children.forEach(s=>{this.flattenExtensionElement(s,r)})}parseExtensionValue(t){if(t===void 0)return;let r=String(t),n=parseFloat(r);return!isNaN(n)&&isFinite(n)?n:r}};var Ve=require("htmlparser2"),Ie=class{static tokenizeXML(e){let t=[],r=new Ve.Parser({onopentag(n,i){t.push({type:"open",tag:n,attributes:i})},ontext(n){let i=n.replace(/\n/g,"").trim();i&&t.push({type:"text",tag:"text",value:i})},onclosetag(n){t.push({type:"close",tag:n})}},{xmlMode:!0});return r.write(e),r.end(),t}static compressXML(e){return e.replace(/>\s+</g,"><").replace(/\s+/g," ").trim()}static formatXML(e,t=2){let r=" ".repeat(t),n="",i=0,s=!1;for(let o=0;o<e.length;o++){let a=e[o],p=e[o+1];a==="<"?(p==="/"?(i--,s||(n+=`
|
|
12
|
-
`+
|
|
13
|
-
`+
|
|
14
|
-
</TrainingCenterDatabase>`;return this.compact?this.compressXML(
|
|
15
|
-
`)}buildTCXContent(
|
|
16
|
-
`)}buildFolders(
|
|
17
|
-
`)}buildHistory(
|
|
18
|
-
`)}buildHistoryFolder(
|
|
19
|
-
`)}buildActivity(
|
|
20
|
-
`)}buildActivityLap(
|
|
21
|
-
`)}buildTrack(
|
|
22
|
-
`)}buildTrackpoint(
|
|
23
|
-
`)):""}buildPosition(
|
|
24
|
-
`)}buildFirstActivity(
|
|
25
|
-
`)}buildNextActivity(
|
|
26
|
-
`)}buildWorkouts(e){return"<Workouts></Workouts>"}buildCourses(e){return"<Courses></Courses>"}buildAuthor(e){let t=["<Author>"];return this.addOptionalElement(t,"Name",e.Name),t.push("</Author>"),t.join("")}buildExtensions(e){let t=this.buildExtensionContent(e);return t?`<Extensions>${t}</Extensions>`:""}buildExtensionContent(e){return Object.entries(e).filter(([t])=>!t.startsWith("xmlns")).map(([t,r])=>{if(r&&typeof r=="object"){let n=this.buildExtensionContent(r);return`<${t}>${n}</${t}>`}else if(r!=null)return`<${t}>${this.escapeXML(String(r))}</${t}>`;return""}).filter(t=>t).join("")}formatTime(e){return typeof e=="string"&&/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/.test(e)?e:(0,ze.default)(e).utc().format("YYYY-MM-DDTHH:mm:ss[Z]")}addOptionalElement(e,t,r,n){if(r!=null&&r!==""){let i=n?n(r):this.escapeXML(r);e.push(`<${t}>${i}</${t}>`)}}addOptionalNumericElement(e,t,r){r!=null&&!isNaN(r)&&e.push(`<${t}>${r}</${t}>`)}isValidCoordinate(e,t){return e!=null&&t!==void 0&&t!==null&&!isNaN(e)&&!isNaN(t)}formatCoordinate(e){return this.roundTo(e,6).toString()}roundTo(e,t){let r=Math.pow(10,t);return Math.round(e*r)/r}escapeXML(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}escapeXMLAttribute(e){return typeof e!="string"?String(e||""):e.replace(/&/g,"&").replace(/"/g,""").replace(/'/g,"'").replace(/</g,"<").replace(/>/g,">").replace(/\r/g," ").replace(/\n/g," ").replace(/\t/g,"	")}deepClone(e){if(e===null||typeof e!="object")return e;if(e instanceof Date)return new Date(e.getTime());if(Array.isArray(e))return e.map(r=>this.deepClone(r));let t={};for(let r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=this.deepClone(e[r]));return t}encoder(e){return this.encode(e)}};var nt=f(require("dayjs")),S=class extends C{convertPoints(e){return e.map(t=>this.convertPoint(t)).filter(t=>t!==void 0)}convertTime(e){if(!e)return;if(typeof e=="number")return e;let t=(0,nt.default)(e);return t.isValid()?t.valueOf():void 0}},D=class{constructor(){this.version="1.0.0";this.priority=100}supports(e){return this.supportedTags.includes(e)}async initialize(e){e.metadata.set(`plugin:${this.name}:initialized`,!0)}async destroy(e){e.metadata.delete(`plugin:${this.name}:initialized`)}async validate(e){return!0}convertTimeToDate(e){return e?new Date(e):new Date}convertTimeToString(e){return this.convertTimeToDate(e).toISOString()}ensureValidCoordinates(e,t){return e>=-90&&e<=90&&t>=-180&&t<=180}round(e,t=6){let r=Math.pow(10,t);return Math.round(e*r)/r}},We=class extends A{async onError(e,t){t.warnings.push(`Middleware ${this.name} error: ${e.message}`)}validateActivityFile(e){if(!e.metadata)return!1;if(e.routes){for(let t of e.routes)if(!this.validateRoute(t))return!1}if(e.points){for(let t of e.points)if(!this.validatePoint(t))return!1}if(e.activities){for(let t of e.activities)if(!this.validateActivity(t))return!1}return!0}validateActivity(e){return!!(e&&typeof e.index>"u"&&e.laps&&e.laps.length>0)}validateRoute(e){return!!(e.records&&e.records.length>0)}validatePoint(e){return!!e.timestamp}};var it={heartrate:"heartRate","gpxtpx:hr":"heartRate","ns3:hr":"heartRate","gpxdata:hr":"heartRate","gpxdata:cadence":"cadence","gpxtpx:cad":"cadence","ns3:cad":"cadence",cadence:"cadence","gpxtpx:speed":"speed","ns3:speed":"speed",speed:"speed",power:"power","gpxdata:power":"power","gpxpx:PowerInWatts":"power",PowerInWatts:"power","gpxtpx:temp":"temperature","gpxtpx:wtemp":"wtemp","gpxtpx:atemp":"atemp","gpxx:Temperature":"temperature","gpxx:Depth":"depth"},g=c=>c*(180/Math.pow(2,31));var Ue=f(require("dayjs"));var Y=f(require("dayjs")),st=require("geolib"),X=class{calculateRecordsAggMetrics(e){if(!e||e.length===0)return;let t={records:this.preprocessRecords(e)};for(let r=0;r<t.records.length;r++){let n=t.records[r];if(!(!n.positionLat||!n.positionLong)){if(t!=null&&t.startPositionLat||(t.startPositionLat=n.positionLat),t!=null&&t.startPositionLong||(t.startPositionLong=n.positionLong),t.endPositionLat=n.positionLat,t.endPositionLong=n.positionLong,t.timestamp=n.timestamp,t!=null&&t.startTime||(t.startTime=n.timestamp),t.endTime=n.timestamp,t.totalDistance=n.distance,t.totalElapsedTime=(0,Y.default)(n.timestamp).diff((0,Y.default)(t.startTime),"second"),n!=null&&n.speed&&(t.avgSpeed=t.avgSpeed?(t.avgSpeed+n.speed)/2:n.speed,t.maxSpeed=Math.max(t.maxSpeed||0,n.speed)),n!=null&&n.heartRate&&(t.maxHeartRate=Math.max(t.maxHeartRate||0,n.heartRate),t.minHeartRate=Math.min(t.minHeartRate||n.heartRate,n.heartRate),t.avgHeartRate?t.avgHeartRate=(t.avgHeartRate+n.heartRate)/2:t.avgHeartRate=n.heartRate),n!=null&&n.altitude&&(t.maxAltitude=Math.max(t.maxAltitude||0,n.altitude),t.minAltitude=Math.min(t.minAltitude||n.altitude,n.altitude),t.avgAltitude=t.avgAltitude?(t.avgAltitude+n.altitude)/2:n.altitude,r>0&&e[r-1].altitude)){let i=this.calculateElevationChanges(e[r-1],n);t.totalAscent=(t.totalAscent||0)+i.ascent,t.totalDescent=(t.totalDescent||0)+i.descent}if(n!=null&&n.cadence&&(t.maxCadence=Math.max(t.maxCadence||0,n.cadence),t.avgCadence?t.avgCadence=(t.avgCadence+n.cadence)/2:t.avgCadence=n.cadence),n!=null&&n.power){t.maxPower=Math.max(t.maxPower||0,n.power),t.avgPower?t.avgPower=(t.avgPower+n.power)/2:t.avgPower=n.power;let i=this.calculateAccumulatedPower(r>0?e[r-1]:n,n,t.totalWork||0);t.totalWork=i.newAccumulatedWork,t.normalizedPower=void 0}n!=null&&n.temperature&&(t.avgTemperature?t.avgTemperature=(t.avgTemperature+n.temperature)/2:t.avgTemperature=n.temperature,t.maxTemperature=Math.max(t.maxTemperature||0,n.temperature),t.minTemperature=Math.min(t.minTemperature||n.temperature,n.temperature))}}return t}calculateLapAggMetrics(e){var r;if(!e||e.length===0)return;let t={laps:e,timestamp:((r=e[0])==null?void 0:r.timestamp)||new Date};for(let n=0;n<e.length;n++){let i=e[n];i.startPositionLat&&i.startPositionLong&&!(t!=null&&t.startPositionLat)&&!(t!=null&&t.startPositionLong)&&(t.startPositionLat=i.startPositionLat,t.startPositionLong=i.startPositionLong),i.endPositionLat&&i.endPositionLong&&(t.endPositionLat=i.endPositionLat,t.endPositionLong=i.endPositionLong),i.startTime&&!(t!=null&&t.startTime)&&(t.startTime=i.startTime),i.endTime&&(t.endTime=i.endTime),t.timestamp=i.timestamp||i.endTime||t.timestamp,i.totalDistance&&(t.totalDistance=(t.totalDistance||0)+i.totalDistance),i.totalElapsedTime&&(t.totalElapsedTime=(t.totalElapsedTime||0)+i.totalElapsedTime),i.totalMovingTime&&(t.totalMovingTime=(t.totalMovingTime||0)+i.totalMovingTime),i.totalTimerTime&&(t.totalTimerTime=(t.totalTimerTime||0)+i.totalTimerTime),i.maxSpeed&&(t.maxSpeed=Math.max(t.maxSpeed||0,i.maxSpeed)),i.avgSpeed&&(t.avgSpeed?t.avgSpeed=(t.avgSpeed+i.avgSpeed)/2:t.avgSpeed=i.avgSpeed),i.maxHeartRate&&(t.maxHeartRate=Math.max(t.maxHeartRate||0,i.maxHeartRate)),i.minHeartRate&&(t.minHeartRate=t.minHeartRate?Math.min(t.minHeartRate,i.minHeartRate):i.minHeartRate),i.avgHeartRate&&(t.avgHeartRate?t.avgHeartRate=(t.avgHeartRate+i.avgHeartRate)/2:t.avgHeartRate=i.avgHeartRate),i.maxAltitude&&(t.maxAltitude=Math.max(t.maxAltitude||0,i.maxAltitude)),i.minAltitude&&(t.minAltitude=t.minAltitude?Math.min(t.minAltitude,i.minAltitude):i.minAltitude),i.avgAltitude&&(t.avgAltitude?t.avgAltitude=(t.avgAltitude+i.avgAltitude)/2:t.avgAltitude=i.avgAltitude),i.totalAscent&&(t.totalAscent=(t.totalAscent||0)+i.totalAscent),i.totalDescent&&(t.totalDescent=(t.totalDescent||0)+i.totalDescent),i.maxCadence&&(t.maxCadence=Math.max(t.maxCadence||0,i.maxCadence)),i.avgCadence&&(t.avgCadence?t.avgCadence=(t.avgCadence+i.avgCadence)/2:t.avgCadence=i.avgCadence),i.maxPower&&(t.maxPower=Math.max(t.maxPower||0,i.maxPower)),i.avgPower&&(t.avgPower?t.avgPower=(t.avgPower+i.avgPower)/2:t.avgPower=i.avgPower),i.totalWork&&(t.totalWork=(t.totalWork||0)+i.totalWork),i.maxTemperature&&(t.maxTemperature=Math.max(t.maxTemperature||0,i.maxTemperature)),i.minTemperature&&(t.minTemperature=t.minTemperature?Math.min(t.minTemperature,i.minTemperature):i.minTemperature),i.avgTemperature&&(t.avgTemperature?t.avgTemperature=(t.avgTemperature+i.avgTemperature)/2:t.avgTemperature=i.avgTemperature)}return t}preprocessRecords(e){if(!e||e.length===0)return e;let t=e.filter(s=>s.timestamp).sort((s,o)=>s.timestamp.valueOf()-o.timestamp.valueOf()),r=0,n=0,i=[];for(let s=0;s<t.length;s++){let o=t[s],a={...o};if(s>0){let p=this.calculatePointDistanceByPosition(t[s-1],a)||0;if(a.distance||(n+=p,a.distance=n),o.speed||(a.speed=this.calculateInstantSpeed(t[s-1],a,p)),o.power){let d=this.calculateAccumulatedPower(t[s-1],a,r);a.accumulatedPower=d.accumulatedPower,r=d.newAccumulatedWork}}i.push(a)}return i}calculatePointDistanceByPosition(e,t){if(!(!e.positionLat||!e.positionLong||!t.positionLat||!t.positionLong))try{return(0,st.getPreciseDistance)({latitude:e.positionLat,longitude:e.positionLong},{latitude:t.positionLat,longitude:t.positionLong})}catch{return}}calculateInstantSpeed(e,t,r){if(!e.timestamp||!t.timestamp||!r)return;let n=((0,Y.default)(t.timestamp).valueOf()-(0,Y.default)(e.timestamp).valueOf())/1e3;if(!(n<=0))return r/n}calculateAccumulatedPower(e,t,r){var a,p;if(e.power===void 0||t.power===void 0||!e.timestamp||!t.timestamp)return{accumulatedPower:r,newAccumulatedWork:r};let n=((a=t.timestamp)==null?void 0:a.valueOf())-((p=e.timestamp)==null?void 0:p.valueOf());if(n<=0)return{accumulatedPower:r,newAccumulatedWork:r};let s=(e.power+t.power)/2*n,o=r+s;return{accumulatedPower:o,newAccumulatedWork:o}}calculateElevationChanges(e,t){let r=0,n=0;return t.altitude!==void 0&&e.altitude!==void 0&&(t.altitude>e.altitude?r=t.altitude-e.altitude:t.altitude<=e.altitude&&(n=e.altitude-t.altitude)),{ascent:r,descent:n}}};function y(c,e=0){let t=Math.pow(10,e);return Math.round(c*t)/t}var L=class extends S{constructor(){super(...arguments);this.name="gpx-to-activity-converter";this.supportedTags=["gpx"];this.convertGPXExtensions=t=>{let r={};return Object.entries(t).forEach(([n,i])=>{if(typeof i<"u"&&i!=="undefined"){let s=it[n]||n;r[s]=this.autoNumber(i)}}),r}}convert(t,r){if(r.sourceFormat!=="gpx")return;let n=r.sourceData;return this.convertGPX(n)}convertGPX(t){let r={metadata:{originType:"GPX",fileType:"gpx"},activities:[]};return t.wpt&&(r.points=this.convertWpts2Points(t.wpt)),t.trk&&(r.activities=t.trk.map((n,i)=>this.convertTrk2Activity(n,i))),t.rte&&(r.routes=t.rte.map((n,i)=>this.convertTrackSeg2Lap(n,i))),r}convertPoint(t,r){let{extensions:n}=t,i=n?this.convertGPXExtensions(n):{};return{index:r||0,positionLat:t==null?void 0:t.lat,positionLong:t==null?void 0:t.lon,altitude:t==null?void 0:t.ele,heartRate:t==null?void 0:t.heartRate,speed:t==null?void 0:t.speed,power:t==null?void 0:t.power,cadence:t==null?void 0:t.cadence,timestamp:(0,Ue.default)(t.time).toDate(),...i}}convertTrk2Activity(t,r){var s;let n=((s=t.trkseg)==null?void 0:s.map((o,a)=>this.convertTrackSeg2Lap(o,a)))||[],i=new X().calculateLapAggMetrics(n);return{index:r,messageIndex:r,laps:n,...i}}convertTrackSeg2Lap(t,r){var o,a;let n=((a=(o=t.trkpt)==null?void 0:o.filter(p=>p!==void 0&&p.time))==null?void 0:a.map((p,d)=>this.convertPoint(p,d)))||[],s=new X().calculateRecordsAggMetrics(n);return{index:r,messageIndex:r,...s,records:(s==null?void 0:s.records)||[],lengths:[]}}convertWpts2Points(t){let r=[];for(let n=0;n<t.length;n++){let i=this.convertPoint(t[n],n);i&&r.push(i)}return r}autoNumber(t){return typeof t=="string"&&t.trim()!==""&&!isNaN(t)?Number(t):t}},_=class extends S{constructor(){super(...arguments);this.name="fit-to-activity-converter";this.supportedTags=["fit"]}convert(t,r){if(r.sourceFormat!=="fit")return;let n=r.sourceData;return this.convertFIT(n)}convertFIT(t){var n,i;let r={metadata:{originType:"FIT",fileType:"fit"},activities:[]};return(n=t.sessionMesgs)!=null&&n.length?r.activities=t.sessionMesgs.map((s,o)=>({index:o,...s,startPositionLat:s!=null&&s.startPositionLat?y(g(Number(s.startPositionLat)),6):void 0,startPositionLong:s!=null&&s.startPositionLong?y(g(Number(s.startPositionLong)),6):void 0,endPositionLat:s!=null&&s.endPositionLat?y(g(Number(s.endPositionLat)),6):void 0,endPositionLong:s!=null&&s.endPositionLong?y(g(Number(s.endPositionLong)),6):void 0,laps:this.convertFITLap2Trackseg(s==null?void 0:s.lapMesgs)})):(i=t.courseMesgs)!=null&&i.length&&(r.routes=t.courseMesgs.map((s,o)=>({index:o,...s,records:this.convertLap2Points(s==null?void 0:s.lapMesgs)}))),r}convertPoint(t,r){let{positionLong:n,positionLat:i,altitude:s,enhancedAltitude:o,enhancedSpeed:a,speed:p,...d}=t;return{index:r||0,positionLat:i?y(g(Number(i)),6):void 0,positionLong:n?y(g(Number(n)),6):void 0,altitude:s||void 0,enhancedAltitude:o||void 0,speed:p||void 0,enhancedSpeed:a||void 0,...d}}convertFITLap2Trackseg(t){var n,i;let r=[];if(!(t!=null&&t.length))return[];for(let s=0;s<t.length;s++){let o=t[s],a=((n=o==null?void 0:o.recordMesgs)==null?void 0:n.map((d,l)=>this.convertPoint(d,l)).filter(d=>d!==void 0))||[],p=((i=o==null?void 0:o.lengthMesgs)==null?void 0:i.map((d,l)=>({...d,index:l})))||[];r.push({index:s,...o,startPositionLat:o!=null&&o.startPositionLat?y(g(Number(o.startPositionLat)),6):void 0,startPositionLong:o!=null&&o.startPositionLong?y(g(Number(o.startPositionLong)),6):void 0,endPositionLat:o!=null&&o.endPositionLat?y(g(Number(o.endPositionLat)),6):void 0,endPositionLong:o!=null&&o.endPositionLong?y(g(Number(o.endPositionLong)),6):void 0,records:a,lengths:p})}return r}convertLap2Points(t){var n;let r=[];if(!(t!=null&&t.length))return[];for(let i of t){let s=((n=i.recordMesgs)==null?void 0:n.map((o,a)=>this.convertPoint(o,a)).filter(o=>o!==void 0))||[];s.length&&(r=[...r,...s])}return r}},M=class extends S{constructor(){super(...arguments);this.name="tcx-to-activity-converter";this.supportedTags=["tcx"]}convert(t,r){if(r.sourceFormat!=="tcx")return;let n=r.sourceData;return this.convertTCX(n)}convertTCX(t){var n,i,s,o;let r={metadata:{originType:"TCX",fileType:"tcx"},activities:[]};return(i=(n=t.Activities)==null?void 0:n.Activity)!=null&&i.length&&(r.activities=t.Activities.Activity.map((a,p)=>this.convertTCXActivityToActivity(a,p))),(o=(s=t.Courses)==null?void 0:s.Course)!=null&&o.length,r}convertTCXActivityToActivity(t,r){var s;let n=((s=t.Lap)==null?void 0:s.map((o,a)=>this.convertTCXLap2Lap(o,a)))||[],i=new X().calculateLapAggMetrics(n);return{index:r,messageIndex:r,laps:n,...i}}convertTCXLap2Lap(t,r){var a;let n=((a=t==null?void 0:t.Track)==null?void 0:a.flatMap(p=>p.Trackpoint))||[],i=(n==null?void 0:n.filter(p=>p!==void 0&&p.Time!==void 0).map((p,d)=>this.convertPoint(p,d)))||[],o=new X().calculateRecordsAggMetrics(i);return{index:r,messageIndex:r,...o,records:(o==null?void 0:o.records)||[],lengths:[]}}convertPoint(t,r){let{Position:n,Time:i,DistanceMeters:s,AltitudeMeters:o}=t;return{index:r||0,positionLat:n!=null&&n.LatitudeDegrees?Number(n.LatitudeDegrees):void 0,positionLong:n!=null&&n.LongitudeDegrees?Number(n.LongitudeDegrees):void 0,timestamp:(0,Ue.default)(i).toDate(),distance:s,altitude:o}}};var ot=f(require("dayjs"));var O=class extends D{constructor(){super(...arguments);this.name="activity-to-gpx-encoder";this.supportedTags=["gpx"]}encode(t,r){var s,o,a,p,d;if(r.targetFormat!=="gpx"||!((s=t==null?void 0:t.activities)!=null&&s.length))return;let i={version:"1.1",creator:"TrackSwap",metadata:{time:((o=t.activities)==null?void 0:o[0]).timestamp}};return(a=t.points)!=null&&a.length&&(i.wpt=this.convertRecords2Wpts(t.points)),(p=t.routes)!=null&&p.length&&(i.rte=t.routes.map(l=>this.convertRoute2GPXRoute(l))),(d=t.activities)!=null&&d.length&&(i.trk=t.activities.map(l=>this.convertActivity2GPXTrack(l))),i}convertRecords2Wpts(t){return t==null?void 0:t.filter(r=>r.timestamp).map(r=>({lat:r==null?void 0:r.positionLat,lon:r==null?void 0:r.positionLong,ele:r==null?void 0:r.altitude,time:r==null?void 0:r.timestamp,speed:r==null?void 0:r.speed,hdop:r==null?void 0:r.hdop,vdop:r==null?void 0:r.vdop,pdop:r==null?void 0:r.pdop,extensions:this.extractGPXExtensions(r)}))}convertRoute2GPXRoute(t){return{rtept:t.records?this.convertRecords2Wpts(t.records):[]}}convertActivity2GPXTrack(t){var r;return{trkseg:((r=t.laps)==null?void 0:r.map(n=>({trkpt:n.records?this.convertRecords2Wpts(n.records):[]})))||[]}}extractGPXExtensions(t){let r={},n={};return typeof(t==null?void 0:t.heartRate)<"u"&&(n["gpxtpx:hr"]=t.heartRate),typeof(t==null?void 0:t.cadence)<"u"&&(n["gpxtpx:cad"]=t.cadence),typeof(t==null?void 0:t.temperature)<"u"&&(n["gpxtpx:atemp"]=t.temperature),Object.keys(n).length>0&&(r["gpxtpx:TrackPointExtension"]=n),typeof(t==null?void 0:t.power)<"u"&&(r["gpxpx:PowerExtension"]={"gpxpx:PowerInWatts":t.power}),Object.keys(r).length>0?r:void 0}},$=class extends D{constructor(){super(...arguments);this.name="activity-to-fit-encoder";this.supportedTags=["fit"]}encode(t,r){var i,s;if(r.targetFormat!=="fit"||!((i=t==null?void 0:t.activities)!=null&&i.length))return;let n={};return n.sessionMesgs=(s=t.activities)==null?void 0:s.map(o=>this.convertActivity2FITSession(o)),n}convertActivity2FITSession(t){var n;return{...t,event:(t==null?void 0:t.event)||"session",sport:(t==null?void 0:t.sport)||"generic",lapMesgs:((n=t.laps)==null?void 0:n.map(i=>this.convertLap2FITLap(i)))||[]}}convertLap2FITLap(t){var n;return{startTime:t.startTime,...t,recordMesgs:((n=t.records)==null?void 0:n.map(i=>this.convertPoint2FITRecord(i)))||[]}}convertPoint2FITRecord(t){return t}},G=class extends D{constructor(){super(...arguments);this.name="sport-to-tcx-encoder";this.supportedTags=["tcx"]}encode(t,r){var i;if(r.targetFormat!=="tcx"||!((i=t==null?void 0:t.activities)!=null&&i.length))return;let n={Author:{Name:"TrackSwap"}};return n.Activities={Activity:t.activities.map(s=>this.convertActivity2TCXActivity(s))},n}convertActivity2TCXActivity(t){var n;let r="Other";return(t.sport==="Running"||t.sport==="Biking")&&(r=t.sport),{Id:`Activity_${Date.now()}`,Activity:r,Lap:((n=t.laps)==null?void 0:n.map(i=>this.convertLap2TCXLap(i)))||[]}}convertLap2TCXLap(t){let r={TotalTimeSeconds:t.totalElapsedTime,DistanceMeters:t.totalDistance,MaximumSpeed:t.maxSpeed,Calories:t.totalCalories,AverageHeartRateBpm:t.avgHeartRate,MaximumHeartRateBpm:t.maxHeartRate,Intensity:"Active",TriggerMethod:"Manual",Track:t.records?[this.convertRecords2TCXTrack(t.records)]:[]};return(t.avgCadence!==void 0||t.maxCadence!==void 0)&&(r.Cadence={Low:t.avgCadence||0,High:t.maxCadence||0}),r}convertRecords2TCXTrack(t){return{Trackpoint:t.map(r=>this.convertPoint2TCXTrackpoint(r))}}convertPoint2TCXTrackpoint(t){var n,i;let r={Time:(0,ot.default)(t.timestamp).toISOString(),Position:{LatitudeDegrees:(n=t==null?void 0:t.positionLat)==null?void 0:n.toString(),LongitudeDegrees:(i=t==null?void 0:t.positionLong)==null?void 0:i.toString()},AltitudeMeters:t.altitude,DistanceMeters:t.distance};return t.heartRate&&(r.HeartRateBpm=t.heartRate),t.cadence&&(r.Cadence={Low:t.cadence,High:t.cadence256||t.cadence}),t.power&&(r.Extensions={"ns3:TPX":{"ns3:Watts":t.power}}),r}convertRoute2TCXCourse(t){return{Name:`Course_${Date.now()}`,Track:t.records?[this.convertRecords2TCXTrack(t.records)]:[]}}};var B=class{constructor(){this.converters=new Map;this.encoders=new Map;this.registerDefaultConverters(),this.registerDefaultEncoders()}registerDefaultConverters(){this.registerConverter(new L),this.registerConverter(new _),this.registerConverter(new M)}registerDefaultEncoders(){this.registerEncoder(new O),this.registerEncoder(new $),this.registerEncoder(new G)}registerConverter(e){this.converters.set(e.name,e)}registerEncoder(e){this.encoders.set(e.name,e)}async convertToActivity(e,t){let r={metadata:new Map,errors:[],warnings:[],stats:{startTime:Date.now(),processedTokens:0,convertedElements:0},sourceFormat:t,sourceData:e,performance:{startTime:Date.now()}};try{let n=this.findConverter(t);if(!n)throw new Error(`No converter found for format "${t}"`);let i=Date.now(),s=n.convert(e,r);if(r.performance.convertTime=Date.now()-i,!s)throw new Error(`Converter "${n.name}" returned empty result`);let o=s;return r.result=o,r.performance.endTime=Date.now(),r.stats.endTime=Date.now(),o}catch(n){throw r.errors.push(n),n}}async encodeActivity(e,t){let r={metadata:new Map,errors:[],warnings:[],stats:{startTime:Date.now(),processedTokens:0,convertedElements:0},targetFormat:t,performance:{startTime:Date.now()}};try{let n=this.findEncoder(t);if(!n)throw new Error(`No encoder found for format "${t}"`);let i=Date.now(),s=n.encode(e,r);if(r.performance.encodeTime=Date.now()-i,!s)throw new Error(`Encoder "${n.name}" returned empty result`);return r.result=s,r.performance.endTime=Date.now(),r.stats.endTime=Date.now(),s}catch(n){throw r.errors.push(n),n}}findConverter(e){return Array.from(this.converters.values()).find(t=>{var r;return(r=t.supportedTags)==null?void 0:r.includes(e)})}findEncoder(e){return Array.from(this.encoders.values()).find(t=>{var r;return(r=t.supportedTags)==null?void 0:r.includes(e)})}async destroy(){this.converters.clear(),this.encoders.clear()}};var H=class{constructor(){this.gpxDecoder=new b,this.gpxEncoder=new I,this.fitDecoder=new v,this.fitEncoder=new x,this.tcxDecoder=new k,this.tcxEncoder=new F,this.activityProcessor=new B}async parseGPX(e){try{return await this.gpxDecoder.parserByBuffer(e)}catch(t){throw new Error(`GPX parsing failed: ${t.message}`)}}async parseGPXString(e){let t=Buffer.from(e,"utf-8");return this.parseGPX(t)}async encodeGPX(e){try{return await this.gpxEncoder.encode(e)}catch(t){throw new Error(`GPX encoding failed: ${t.message}`)}}encodeGPXString(e){try{return this.gpxEncoder.encodeToString(e)}catch(t){throw new Error(`GPX encoding failed: ${t.message}`)}}async parseFIT(e){try{return await this.fitDecoder.parseByBuffer(e)}catch(t){throw new Error(`FIT parsing failed: ${t.message}`)}}async encodeFIT(e){try{return await this.fitEncoder.encode(e)}catch(t){throw new Error(`FIT encoding failed: ${t.message}`)}}async encodeFITCourse(e){try{return await this.fitEncoder.encodeCourse(e)}catch(t){throw new Error(`FIT Course encoding failed: ${t.message}`)}}async parseTCXString(e){let t=Buffer.from(e,"utf-8");return this.parseTCX(t)}async parseTCX(e){try{let t=await this.tcxDecoder.parseByBuffer(e);if(!t)throw new Error("TCX parsing result is empty");return t}catch(t){throw new Error(`TCX parsing failed: ${t.message}`)}}async encodeTCX(e){try{return await this.tcxEncoder.encode(e)}catch(t){throw new Error(`TCX encoding failed: ${t.message}`)}}async encodeTCXString(e){try{return await this.tcxEncoder.encodeToString(e)}catch(t){throw new Error(`TCX encoding failed: ${t.message}`)}}async convertGPXToActivity(e){return await this.activityProcessor.convertToActivity(e,"gpx")}async convertFITToActivity(e){return await this.activityProcessor.convertToActivity(e,"fit")}async convertTCXToActivity(e){return await this.activityProcessor.convertToActivity(e,"tcx")}async convertActivityToGPX(e){return await this.activityProcessor.encodeActivity(e,"gpx")}async convertActivityToFIT(e){return await this.activityProcessor.encodeActivity(e,"fit")}async convertActivityToTCX(e){return await this.activityProcessor.encodeActivity(e,"tcx")}async convertFile(e,t,r){try{let n=r||this.detectFormat(e);if(n==="unknown"||n==null)throw new Error("Unable to recognize source file format, please specify sourceType parameter");if(n===t)return e;let i;switch(n){case"gpx":let o=await this.parseGPX(e);if(!o)throw new Error("GPX file parsing failed");i=o;break;case"fit":i=await this.parseFIT(e);break;case"tcx":i=await this.parseTCX(e);break;default:throw new Error(`Unsupported source file format: ${n}`)}let s;switch(n){case"gpx":s=await this.convertGPXToActivity(i);break;case"fit":s=await this.convertFITToActivity(i);break;case"tcx":s=await this.convertTCXToActivity(i);break;default:throw new Error(`Unsupported source file format conversion: ${n}`)}switch(t){case"gpx":let o=await this.convertActivityToGPX(s);return await this.encodeGPX(o);case"fit":let a=await this.convertActivityToFIT(s);return await this.encodeFIT(a);case"tcx":let p=await this.convertActivityToTCX(s);return await this.encodeTCX(p);default:throw new Error(`Unsupported target file format: ${t}`)}}catch(n){let i=r||"auto-detect";throw new Error(`${i} to ${t.toUpperCase()} failed: ${n.message}`)}}detectFormat(e){let t=e.toString("utf-8",0,Math.min(1024,e.length));if(e.length>=12&&e.toString("ascii",8,12)===".FIT")return"fit";if(t.includes("<?xml")){if(t.includes("<gpx")||t.includes("http://www.topografix.com/GPX/"))return"gpx";if(t.includes("<TrainingCenterDatabase")||t.includes("http://www.garmin.com/xmlschemas/TrainingCenterDatabase/"))return"tcx"}return"unknown"}async parseFile(e,t){let r=t||this.detectFormat(e);if(r==="unknown")throw new Error("Unable to recognize file format, please specify sourceType parameter");switch(r){case"gpx":let n=await this.parseGPX(e);if(!n)throw new Error("GPX parsing failed");return n;case"fit":return await this.parseFIT(e);case"tcx":return await this.parseTCX(e);default:throw new Error(`Unsupported file format: ${r}`)}}async parseToActivity(e,t){let r=t||this.detectFormat(e);if(r==="unknown")throw new Error("Unable to recognize file format, please specify sourceType parameter");let n;switch(r){case"gpx":let i=await this.parseGPX(e);if(!i)throw new Error("GPX parsing failed");n=await this.convertGPXToActivity(i);break;case"fit":let s=await this.parseFIT(e);s&&(n=await this.convertFITToActivity(s));break;case"tcx":let o=await this.parseTCX(e);n=await this.convertTCXToActivity(o);break;default:throw new Error(`Unsupported file format: ${r}`)}return n}getActivityProcessor(){return this.activityProcessor}getGPXDecoder(){return this.gpxDecoder}getGPXEncoder(){return this.gpxEncoder}getFITDecoder(){return this.fitDecoder}getFITEncoder(){return this.fitEncoder}getTCXDecoder(){return this.tcxDecoder}getTCXEncoder(){return this.tcxEncoder}async destroy(){await this.gpxDecoder.destroy(),await this.fitDecoder.destroy(),await this.tcxDecoder.destroy(),await this.activityProcessor.destroy()}};var bt=H;0&&(module.exports={ActivityProcessor,ActivityToFITEncoder,ActivityToGPXEncoder,ActivityToTCXEncoder,BaseActivityConverter,BaseActivityEncoder,BaseActivityMiddleware,FITDecoder,FITEncoder,FITToActivityConverter,GPXDecoder,GPXEncoder,GPXToActivityConverter,PipelineStage,TCXDecoder,TCXEncoder,TCXToActivityConverter,TrackSwap,registerDefaultMiddlewares});
|
|
1
|
+
"use strict";var FI=Object.create;var __=Object.defineProperty;var oI=Object.getOwnPropertyDescriptor;var fI=Object.getOwnPropertyNames;var WI=Object.getPrototypeOf,BI=Object.prototype.hasOwnProperty;var VI=(n,_)=>{for(var I in _)__(n,I,{get:_[I],enumerable:!0})},II=(n,_,I,A)=>{if(_&&typeof _=="object"||typeof _=="function")for(let T of fI(_))!BI.call(n,T)&&T!==I&&__(n,T,{get:()=>_[T],enumerable:!(A=oI(_,T))||A.enumerable});return n};var o=(n,_,I)=>(I=n!=null?FI(WI(n)):{},II(_||!n||!n.__esModule?__(I,"default",{value:n,enumerable:!0}):I,n)),KI=n=>II(__({},"__esModule",{value:!0}),n);var kI={};VI(kI,{ActivityProcessor:()=>Z,ActivityToFITEncoder:()=>j,ActivityToGPXEncoder:()=>p,ActivityToTCXEncoder:()=>k,BaseActivityConverter:()=>v,BaseActivityEncoder:()=>$,BaseActivityMiddleware:()=>x_,FITDecoder:()=>V,FITEncoder:()=>K,FITToActivityConverter:()=>J,GPXDecoder:()=>P,GPXEncoder:()=>h,GPXToActivityConverter:()=>Q,PipelineStage:()=>x,TCXDecoder:()=>l,TCXEncoder:()=>Y,TCXToActivityConverter:()=>z,TrackSwap:()=>q,buildCourseMesgs:()=>n_,default:()=>jI,encodeCourse:()=>r,registerDefaultMiddlewares:()=>m_});module.exports=KI(kI);var I_=class{constructor(){this.stage="parse"}async process(_){let I=Date.now();if(!_.rawData)throw new Error("FIT data cannot be empty");try{let A=await this.parseWithFitSDK(_.rawData);return _.rawMessages=A,_.performance.parseTime=Date.now()-I,_}catch(A){throw new Error(`FIT parsing failed: ${A.message}`)}}async parseWithFitSDK(_){let{Decoder:I,Stream:A}=await import("@garmin/fitsdk"),T=A.fromBuffer(_);if(!I.isFIT(T))throw new Error("Not a valid FIT file");let R=new I(T),{messages:L,errors:t}=R.read();return t&&t.length>0,L}},A_=class{constructor(_){this.getConverters=_;this.stage="extract"}async process(_){let I=Date.now();if(!_.rawMessages)throw new Error("Raw messages cannot be empty");let A={};for(let[T,R]of Object.entries(_.rawMessages)){if(!Array.isArray(R)||R.length===0){A[T]=R;continue}let L=this.getConverters(T);if(L.length===0)A[T]=R;else{let t=L[0];try{let E=t.convertMessages(R,_);A[T]=E}catch(E){_.errors.push(E),A[T]=R}}}return _.rawMessages=A,_.performance.extractTime=Date.now()-I,_}},T_=class{constructor(_){this.getStructurePlugins=_;this.stage="structure"}async process(_){let I=Date.now();if(!_.rawMessages)throw new Error("Message data cannot be empty");let A={},T=this.getStructurePlugins();for(let R of T)try{let L=R.structureData(_.rawMessages,_);A={...A,...L}}catch(L){_.errors.push(L)}return _.result=A,_.performance.structureTime=Date.now()-I,_}},R_=class{constructor(){this.stage="complete"}async process(_){_.performance.endTime=Date.now();let I=_.performance.endTime-_.performance.startTime;return _.metadata.set("performance",{totalTime:I,parseTime:_.performance.parseTime,extractTime:_.performance.extractTime,structureTime:_.performance.structureTime}),_.stats&&(_.stats.endTime=Date.now(),_.rawMessages&&(_.stats.processedTokens=this.countTotalMessages(_.rawMessages))),_}countTotalMessages(_){let I=0;return Object.values(_).forEach(A=>{Array.isArray(A)&&(I+=A.length)}),I}};var B=o(require("dayjs"));var g=class{constructor(){this.version="1.0.0";this.priority=100}async initialize(_){_.metadata.set(`plugin:${this.name}:initialized`,!0)}async destroy(_){_.metadata.delete(`plugin:${this.name}:initialized`)}async validate(_){return!0}};var u=class extends g{constructor(){super(...arguments);this.name="SessionStructurePlugin";this.priority=10}structureData(I,A){let{sessionMesgs:T,lapMesgs:R,recordMesgs:L,lengthMesgs:t}=I;return T!=null&&T.length?{sessionMesgs:T.map(D=>{let H=(0,B.default)(D.startTime).valueOf(),C=H+D.totalElapsedTime*1e3,y=((R==null?void 0:R.filter(U=>{let M=(0,B.default)(U.startTime).valueOf(),N=M+(U.totalElapsedTime??0)*1e3;return M>=H&&N<=C}))||[]).map(U=>{let M=(0,B.default)(U.startTime).valueOf(),N=M+(U.totalElapsedTime??0)*1e3,GI=(L==null?void 0:L.filter(j_=>{let s=(0,B.default)(j_.timestamp).valueOf();return s>=M&&s<N}))||[],p_=U.firstLengthIndex??void 0,e_=U.numLengths??void 0,_I=[];if(p_!==void 0&&e_!==void 0){let j_=p_+e_;_I=(t==null?void 0:t.filter(s=>s.messageIndex>=p_&&s.messageIndex<j_))||[]}return{...U,recordMesgs:GI,lengthMesgs:_I,messageIndex:U.messageIndex!==void 0?U.messageIndex:0}});return{...D,lapMesgs:y,messageIndex:D.messageIndex!==void 0?D.messageIndex:0}})}:{}}},i=class extends g{constructor(){super(...arguments);this.name="CourseStructurePlugin";this.priority=10}structureData(I,A){let{courseMesgs:T,lapMesgs:R,recordMesgs:L}=I;if(!(T!=null&&T.length))return{};let t=2e3;return{courseMesgs:T.map(D=>{let H=(R==null?void 0:R.map(C=>{let e=(0,B.default)(C.startTime).valueOf(),y=(0,B.default)(C.timestamp).valueOf(),U=(L==null?void 0:L.filter(M=>{let N=(0,B.default)(M.timestamp).valueOf();return N>=e-t&&N<=y+t}))||[];return{...C,recordMesgs:U}}))||[];return{...D,lapMesgs:H}})}}},m=class extends g{constructor(){super(...arguments);this.name="FileHeaderPlugin";this.priority=1}structureData(I,A){let{fileIdMesgs:T}=I;if(T!=null&&T.length&&T[0]){let R=T[0];A.fileHeader={type:R.type,manufacturer:R.manufacturer,product:R.product}}return{}}};var V=class{constructor(){this.converterPlugins=new Map;this.registeredPlugins=new Set;this.structurePlugins=[];this.middlewarePlugins=[];this.processors=[];this.initialized=!1;this.defaultPluginsRegistered=!1;this.initializePipeline()}initializePipeline(){this.processors=[new I_,new A_(_=>this.getConverters(_)),new T_(()=>this.structurePlugins),new R_]}async registerDefaultPlugins(){if(this.defaultPluginsRegistered)return;let _=[new m,new u,new i];for(let I of _)this.addStructurePlugin(I),this.registeredPlugins.add(I.name);this.defaultPluginsRegistered=!0}addConverterForMessageType(_,I){this.converterPlugins.has(_)||this.converterPlugins.set(_,[]);let A=this.converterPlugins.get(_);A.push(I),A.sort((T,R)=>(T.priority||100)-(R.priority||100))}addStructurePlugin(_){this.structurePlugins.push(_),this.structurePlugins.sort((I,A)=>(I.priority||100)-(A.priority||100))}async registerMessageConverter(_){if(this.registeredPlugins.has(_.name))throw new Error(`Message converter plugin ${_.name} already exists`);_.supportedMessageTypes.forEach(A=>{this.addConverterForMessageType(A,_)}),this.registeredPlugins.add(_.name);let I=_.priority!==void 0?` (priority: ${_.priority})`:"";_.supportedMessageTypes.forEach(A=>{let R=(this.converterPlugins.get(A)||[]).map(L=>`${L.name}(${L.priority||100})`)})}async registerStructurePlugin(_){if(this.registeredPlugins.has(_.name))throw new Error(`Structure plugin ${_.name} already exists`);this.addStructurePlugin(_),this.registeredPlugins.add(_.name);let I=_.priority!==void 0?` (priority: ${_.priority})`:""}async registerMiddleware(_){let I=this.middlewarePlugins.findIndex(T=>T.name===_.name);I!==-1?this.middlewarePlugins[I]=_:(this.middlewarePlugins.push(_),this.middlewarePlugins.sort((T,R)=>(T.priority||100)-(R.priority||100)));let A=[];_.onParse&&A.push("onParse"),_.onExtractMessages&&A.push("onExtractMessages"),_.onStructure&&A.push("onStructure"),_.onComplete&&A.push("onComplete"),_.onError&&A.push("onError"),A.length>0}getConverter(_){let I=this.converterPlugins.get(_);return I&&I.length>0?I[0]:void 0}getConverters(_){return this.converterPlugins.get(_)||[]}unregisterPlugin(_){if(!this.registeredPlugins.has(_))return!1;for(let[T,R]of this.converterPlugins){let L=R.findIndex(t=>t.name===_);L!==-1&&(R.splice(L,1),R.length===0&&this.converterPlugins.delete(T))}let I=this.structurePlugins.findIndex(T=>T.name===_);I!==-1&&this.structurePlugins.splice(I,1);let A=this.middlewarePlugins.findIndex(T=>T.name===_);return A!==-1&&this.middlewarePlugins.splice(A,1),this.registeredPlugins.delete(_),!0}async initialize(){var A;if(this.initialized)return;await this.registerDefaultPlugins();let _=this.createContext(),I=[...Array.from(this.converterPlugins.values()).flat(),...this.structurePlugins,...this.middlewarePlugins];for(let T of I)try{await((A=T.initialize)==null?void 0:A.call(T,_))}catch{}this.initialized=!0}async destroy(){var A;if(!this.initialized)return;let _=this.createContext(),I=[...Array.from(this.converterPlugins.values()).flat(),...this.structurePlugins,...this.middlewarePlugins];for(let T of I)try{await((A=T.destroy)==null?void 0:A.call(T,_))}catch{}this.initialized=!1}createContext(){return{metadata:new Map,errors:[],warnings:[],stats:{startTime:Date.now(),processedTokens:0,convertedElements:0},performance:{startTime:Date.now()}}}async executeMiddlewareHook(_,I,A){var R;let T=I;for(let L of this.middlewarePlugins){let t=L[_];if(t)try{T=await t.call(L,T,A)||T}catch(E){A.errors.push(E),await((R=L.onError)==null?void 0:R.call(L,E,A))}}return T}async parseByBuffer(_,I={}){var T;await this.initialize();let A=this.createContext();A.rawData=_,A.userData=I.userData,A.metadata.set("decoder",this);try{for(let R of this.processors)try{switch(A=await R.process(A),R.stage){case"parse":A.rawData&&(A.rawData=await this.executeMiddlewareHook("onParse",A.rawData,A));break;case"extract":A.rawMessages&&(A.rawMessages=await this.executeMiddlewareHook("onExtractMessages",A.rawMessages,A));break;case"structure":A.result&&(A.result=await this.executeMiddlewareHook("onStructure",A.result,A));break;case"complete":A.result&&(A.result=await this.executeMiddlewareHook("onComplete",A.result,A));break}}catch(L){A.errors.push(L);for(let t of this.middlewarePlugins)await((T=t.onError)==null?void 0:T.call(t,L,A))}return A.result}catch(R){throw R}}};var XI={file:{course:6,device:1,settings:2,sport:3,activity:4,workout:5,schedules:7,weight:9,totals:10,goals:11,blood_pressure:14,monitoring_a:15,activity_summary:20,monitoring_daily:28,monitoring_b:32,segment_list:35,exd_configuration:40,invalid:0},sport:{generic:0,running:1,cycling:2,transition:3,fitness_equipment:4,swimming:5,basketball:6,soccer:7,tennis:8,american_football:9,training:10,walking:11,cross_country_skiing:12,alpine_skiing:13,snowboarding:14,rowing:15,mountaineering:16,hiking:17,multisport:18,paddling:19,invalid:254},event:{timer:0,workout:3,workout_step:4,power_down:5,power_up:6,off_course:7,session:8,lap:9,course_point:10,battery:11,virtual_partner_pace:12,hr_high_alert:13,hr_low_alert:14,speed_high_alert:15,speed_low_alert:16,cad_high_alert:17,cad_low_alert:18,power_high_alert:19,power_low_alert:20,recovery_hr:21,battery_low:22,time_duration_alert:23,distance_duration_alert:24,calorie_duration_alert:25,activity:26,fitness_equipment:27,length:28,user_marker:32,sport_point:33,calibration:36,front_gear_change:42,rear_gear_change:43,rider_position_change:44,elev_high_alert:45,elev_low_alert:46,comm_timeout:47,invalid:255},event_type:{start:0,stop:1,consecutive_depreciated:2,marker:3,stop_all:4,begin_depreciated:5,end_depreciated:6,end_all_depreciated:7,stop_disable:8,stop_disable_all:9,invalid:255},course_point:{generic:0,summit:1,valley:2,water:3,food:4,danger:5,left:6,right:7,straight:8,first_aid:9,fourth_category:10,third_category:11,second_category:12,first_category:13,hors_category:14,sprint:15,left_fork:16,right_fork:17,middle_fork:18,slight_left:19,sharp_left:20,slight_right:21,sharp_right:22,u_turn:23,segment_start:24,segment_end:25,invalid:255}},w=n=>{let _=XI[n];return{size:1,baseType:0,mapValue:I=>typeof I=="string"?_[I]??255:I,setValue:function(I,A){this.setUint8(I,A)}}},k_={enum_file:w("file"),enum_activity:w("sport"),enum_sport:w("sport"),enum_sub_sport:w("sport"),enum_event:w("event"),enum_event_type:w("event_type"),enum_course_point:w("course_point"),uint8:{size:1,baseType:2,setValue:DataView.prototype.setUint8},sint8:{size:1,baseType:1,setValue:DataView.prototype.setInt8},uint16:{size:2,baseType:132,setValue:DataView.prototype.setUint16},sint16:{size:2,baseType:131,setValue:DataView.prototype.setInt16},uint32:{size:4,baseType:134,setValue:DataView.prototype.setUint32},sint32:{size:4,baseType:133,setValue:DataView.prototype.setInt32},string:{size:0,baseType:7,mapValue:n=>Array.from(TI(n)),setValue:gI},distance:{size:4,baseType:134,setValue:DataView.prototype.setUint32,mapValue:n=>Math.round(n*1e3)},speed:{size:2,baseType:132,setValue:DataView.prototype.setUint16,mapValue:n=>Math.round(n*100)},altitude:{size:2,baseType:132,setValue:DataView.prototype.setUint16,mapValue:n=>Math.round((n+500)*5)},seconds:{size:4,baseType:134,setValue:DataView.prototype.setUint32,mapValue:n=>Math.round(n*1e3)},date_time:{size:4,baseType:134,setValue:DataView.prototype.setUint32,mapValue:n=>{let _;return n instanceof Date?(_=Math.floor(n.getTime()/1e3),_-631065600):typeof n=="string"?(_=Math.floor(new Date(n).getTime()/1e3),_-631065600):n<631065600?Math.floor(n):(n>9999999999?_=Math.floor(n/1e3):_=Math.floor(n),_-631065600)}},semicircles:{size:4,baseType:133,setValue:DataView.prototype.setInt32,mapValue:n=>Math.round(n/180*2147483648)}};function AI(n){return Array.from(TI(n)).length+1}function*TI(n){for(let _ of MI(n))_<128?yield _:_<2048?(yield 192|_>>6,yield 128|_&63):_<65536?(yield 224|_>>12,yield 128|_>>6&63,yield 128|_&63):(yield 240|_>>18,yield 128|_>>12&63,yield 128|_>>6&63,yield 128|_&63);yield 0}function*MI(n){for(let _=0;_<n.length;){let I=n.codePointAt(_);if(I===void 0)break;yield I,_+=I>65535?2:1}}function gI(n,_){for(let I=0;I<_.length;I++)this.setUint8(n+I,_[I])}var dI={file_id:{mesgNum:0,fieldDefns:[{name:"type",number:0,type:"enum_file"},{name:"time_created",number:4,type:"date_time"}]},session:{mesgNum:18,fieldDefns:[{name:"timestamp",number:253,type:"date_time"},{name:"start_time",number:2,type:"date_time"},{name:"total_elapsed_time",number:7,type:"seconds"},{name:"total_timer_time",number:8,type:"seconds"},{name:"start_position_lat",number:3,type:"semicircles"},{name:"start_position_long",number:4,type:"semicircles"},{name:"total_distance",number:9,type:"distance"},{name:"total_ascent",number:21,type:"uint16"},{name:"total_descent",number:22,type:"uint16"},{name:"sport",number:5,type:"enum_sport"},{name:"sub_sport",number:6,type:"enum_sub_sport"},{name:"first_lap_index",number:11,type:"uint16"},{name:"num_laps",number:26,type:"uint16"}]},lap:{mesgNum:19,fieldDefns:[{name:"timestamp",number:253,type:"date_time"},{name:"start_time",number:2,type:"date_time"},{name:"start_position_lat",number:3,type:"semicircles"},{name:"start_position_long",number:4,type:"semicircles"},{name:"end_position_lat",number:5,type:"semicircles"},{name:"end_position_long",number:6,type:"semicircles"},{name:"total_elapsed_time",number:7,type:"seconds"},{name:"total_timer_time",number:8,type:"seconds"},{name:"total_distance",number:9,type:"distance"},{name:"total_ascent",number:21,type:"uint16"},{name:"total_descent",number:22,type:"uint16"}]},record:{mesgNum:20,fieldDefns:[{name:"timestamp",number:253,type:"date_time"},{name:"position_lat",number:0,type:"semicircles"},{name:"position_long",number:1,type:"semicircles"},{name:"altitude",number:2,type:"altitude"},{name:"distance",number:5,type:"distance"},{name:"heart_rate",number:3,type:"uint8"},{name:"cadence",number:4,type:"uint8"},{name:"speed",number:6,type:"speed"},{name:"power",number:7,type:"uint16"}]},event:{mesgNum:21,fieldDefns:[{name:"timestamp",number:253,type:"date_time"},{name:"event",number:0,type:"enum_event"},{name:"event_type",number:1,type:"enum_event_type"},{name:"event_group",number:4,type:"uint8"}]},course:{mesgNum:31,fieldDefns:[{name:"name",number:5,type:"string"},{name:"sport",number:4,type:"enum_sport"},{name:"sub_sport",number:7,type:"enum_sub_sport"}]},activity:{mesgNum:34,fieldDefns:[{name:"timestamp",number:253,type:"date_time"},{name:"total_timer_time",number:0,type:"seconds"},{name:"num_sessions",number:1,type:"uint16"},{name:"type",number:2,type:"enum_activity"},{name:"event",number:3,type:"enum_event"},{name:"event_type",number:4,type:"enum_event_type"},{name:"local_timestamp",number:5,type:"date_time"},{name:"event_group",number:6,type:"uint8"}]},course_point:{mesgNum:32,fieldDefns:[{name:"timestamp",number:1,type:"date_time"},{name:"position_lat",number:2,type:"semicircles"},{name:"position_long",number:3,type:"semicircles"},{name:"distance",number:4,type:"distance"},{name:"type",number:5,type:"enum_course_point"}]}},PI=(n,_)=>n.map(I=>({...I,value:_[I.name]})).filter(({value:I})=>I!==void 0),L_=class n{static check(_,I,A,T){if(I===void 0)throw new Error(`Message '${_}' not known`);if(A===void 0)throw new Error(`Message '${_}' has no field definitions`);let R=A.map(t=>t.name),L=Object.keys(T).filter(t=>!R.includes(t));if(L.length)throw new Error(`Message '${_}' has no field definitions named '${L}'`)}constructor(_,I,A){let T=dI[I];if(!T)throw new Error(`Unknown message type: ${I}`);let{mesgNum:R,fieldDefns:L}=T;n.check(I,R,L,A),this.localNum=_,this.mesgNum=R,this.fields=PI(L,A)}get mesgDefn(){let _=this.fields.map(({number:I,type:A,value:T})=>{let R=k_[A];if(!R)throw new Error(`Unknown type: ${A}`);let{size:L,baseType:t}=R;return A==="string"?{number:I,size:AI(T),baseType:t}:{number:I,size:L,baseType:t}});return{localNum:this.localNum,mesgNum:this.mesgNum,fieldDefns:_}}isSameDefn(_){let I=(t,E)=>t.number===E.number&&t.size===E.size&&t.baseType===E.baseType,A=(t,E)=>t.length===E.length&&t.every((D,H)=>I(D,E[H])),{localNum:T,mesgNum:R,fieldDefns:L}=this.mesgDefn;return R===_.mesgNum&&T===_.localNum&&A(L,_.fieldDefns)}get defnRecord(){let{localNum:_,mesgNum:I,fieldDefns:A}=this.mesgDefn,T=6+3*A.length,R=new DataView(new ArrayBuffer(T));R.setUint8(0,64|_),R.setUint8(2,1),R.setUint16(3,I),R.setUint8(5,A.length);let L=6;for(let t of A)R.setUint8(L++,t.number),R.setUint8(L++,t.size),R.setUint8(L++,t.baseType);return R.buffer}get dataRecord(){let{fieldDefns:_}=this.mesgDefn,I=1+_.reduce((R,{size:L})=>R+L,0),A=new DataView(new ArrayBuffer(I));A.setUint8(0,this.localNum);let T=1;for(let{number:R,type:L,value:t}of this.fields){let E=k_[L];if(!E)throw new Error(`Unknown type: ${L}`);let{size:D,setValue:H}=E,C;"mapValue"in E?C=E.mapValue(t):C=t,H&&H.call(A,T,C),T+=D}return A.buffer}};var hI=[0,52225,55297,5120,61441,15360,10240,58369,40961,27648,30720,46081,20480,39937,34817,17408],RI=(n,_)=>(n>>>4^hI[n&15^_])&65535,lI=(n,_,I)=>RI(RI(n,_),I),YI=(n,_)=>lI(n,_&15,_>>>4);function Z_(n,_=0){let I=_,A=n instanceof ArrayBuffer?new Uint8Array(n):n;for(let T=0;T<A.length;T++)I=YI(I,A[T]);return I}var tI=o(require("dayjs")),LI=14,vI=16,$I=2078,bI=776358228,K=class{constructor(_={}){this.localNum={};this.mesgDefn=[];this.messages=[];this.options={compact:_.compact??!0,defaultActivity:_.defaultActivity??"cycling",defaultSubActivity:_.defaultSubActivity??"generic"}}async encode(_){return this.reset(),this.buildFITContent(_,"activity"),Buffer.from(await this.blob.arrayBuffer())}async encodeCourse(_){return this.reset(),this.buildFITContent(_,"course"),Buffer.from(await this.blob.arrayBuffer())}async encodeToBlob(_,I="activity"){return this.reset(),this.buildFITContent(_,I),this.blob}reset(){this.localNum={},this.mesgDefn=[],this.messages=[]}buildFITContent(_,I){this.buildFileId(_,I),I==="course"?this.buildCourseContent(_):this.buildActivityContent(_)}buildActivityContent(_){let I=_.sessionMesgs||[];if(I.length===0)throw new Error("Activity file must contain at least one Session");let A=0,T=[],R=[];for(let L of I){if(L.lapMesgs&&this.buildEventsFromLaps(L.lapMesgs,T),L.lapMesgs)for(let t of L.lapMesgs)t.recordMesgs&&this.buildRecords(t.recordMesgs);L.lapMesgs&&this.buildLaps(L.lapMesgs),this.buildSession(L),A++,this.buildActivityFromSession(L,R)}T.forEach(L=>this.buildEvent(L)),R.forEach(L=>this.buildActivity(L))}buildCourseContent(_){let I=_.sessionMesgs||[];if(I.length===0)throw new Error("Course file must contain track data");let A=I[0];if(this.buildCourse({name:"course",sport:this.options.defaultActivity}),A.lapMesgs){let T=[];for(let t of A.lapMesgs)t.recordMesgs&&T.push(...t.recordMesgs);T.sort((t,E)=>t.timestamp&&E.timestamp?new Date(t.timestamp).getTime()-new Date(E.timestamp).getTime():(t.distance||0)-(E.distance||0));let R=T[0],L=T[T.length-1];if(A.startTime&&this.buildEvent({timestamp:A.startTime,event:"timer",eventType:"start",eventGroup:0}),T.forEach(t=>this.buildRecord(t)),L.timestamp&&this.buildEvent({timestamp:L.timestamp,event:"timer",eventType:"stop_all",eventGroup:0}),A.lapMesgs)for(let t=0;t<A.lapMesgs.length;t++)this.buildLap(A.lapMesgs[t])}}buildFileId(_,I){var T;let A=((T=_.fileIdMesgs)==null?void 0:T[0])||{};this.writeMesg("file_id",{type:I,time_created:A.timeCreated?this.parseTimestamp(A.timeCreated):Date.now(),manufacturer:A.manufacturer,product:A.product,serial_number:A.serialNumber})}buildSession(_){var I;this.writeMesg("session",{timestamp:_.timestamp?_.timestamp:void 0,start_time:_.startTime?_.startTime:void 0,total_elapsed_time:_.totalElapsedTime,total_timer_time:_.totalTimerTime,start_position_lat:_.startPositionLat?this.convertToSemicircles(_.startPositionLat):void 0,start_position_long:_.startPositionLong?this.convertToSemicircles(_.startPositionLong):void 0,total_distance:_.totalDistance,total_ascent:_.totalAscent,total_descent:_.totalDescent,sport:_.sport||this.options.defaultActivity,sub_sport:_.subSport||this.options.defaultSubActivity,first_lap_index:_.firstLapIndex||0,num_laps:_.numLaps||((I=_.lapMesgs)==null?void 0:I.length)||1})}buildLaps(_){_.forEach(I=>this.buildLap(I))}buildLap(_){this.writeMesg("lap",{timestamp:_!=null&&_.timestamp?_.timestamp:void 0,start_time:_!=null&&_.startTime?_.startTime:void 0,start_position_lat:_!=null&&_.startPositionLat?this.convertToSemicircles(_.startPositionLat):void 0,start_position_long:_!=null&&_.startPositionLong?this.convertToSemicircles(_.startPositionLong):void 0,end_position_lat:_!=null&&_.endPositionLat?this.convertToSemicircles(_.endPositionLat):void 0,end_position_long:_!=null&&_.endPositionLong?this.convertToSemicircles(_.endPositionLong):void 0,total_elapsed_time:_==null?void 0:_.totalElapsedTime,total_timer_time:_==null?void 0:_.totalTimerTime,total_distance:_==null?void 0:_.totalDistance,total_ascent:_==null?void 0:_.totalAscent,total_descent:_==null?void 0:_.totalDescent})}buildRecords(_){_.forEach(I=>this.buildRecord(I))}buildRecord(_){this.writeMesg("record",{timestamp:_.timestamp,position_lat:_!=null&&_.positionLat?this.convertToSemicircles(_.positionLat):void 0,position_long:_!=null&&_.positionLong?this.convertToSemicircles(_.positionLong):void 0,altitude:_==null?void 0:_.altitude,enhancedAltitude:_==null?void 0:_.enhancedAltitude,distance:_==null?void 0:_.distance,heart_rate:_==null?void 0:_.heartRate,cadence:_==null?void 0:_.cadence,speed:_==null?void 0:_.speed,enhancedSpeed:_==null?void 0:_.enhancedSpeed,power:_==null?void 0:_.power})}buildEvent(_){this.writeMesg("event",{timestamp:_.timestamp?_.timestamp:void 0,event:_.event,event_type:_.eventType,event_group:_.eventGroup})}buildActivity(_){this.writeMesg("activity",{timestamp:_.timestamp?_.timestamp:void 0,total_timer_time:_.totalTimerTime,num_sessions:_.numSessions,type:_.type,event:_.event,event_type:_.eventType,local_timestamp:_.localTimestamp?this.parseTimestamp(_.localTimestamp):void 0,event_group:_.eventGroup})}buildCourse(_){this.writeMesg("course",{name:_.name,sport:_.sport})}buildEventsFromLaps(_,I){_.forEach((A,T)=>{A.startTime&&I.push({timestamp:A.startTime,event:"timer",eventType:"start",eventGroup:T}),A.timestamp&&I.push({timestamp:A.timestamp,event:"timer",eventType:T===_.length-1?"stop_all":"stop",eventGroup:T})})}buildActivityFromSession(_,I){I.push({timestamp:_.timestamp,totalTimerTime:_.totalTimerTime,numSessions:1,type:_.sport||this.options.defaultActivity,event:"activity",eventType:"stop",eventGroup:0})}parseTimestamp(_){return typeof _=="number"?_:(0,tI.default)(_).valueOf()}convertToSemicircles(_){if(_!=null)return Math.round(_*2**31/180)}validateRequiredFields(_){if(!_.sessionMesgs||_.sessionMesgs.length===0)throw new Error("FIT file must contain at least one Session")}writeMesg(_,I){let A=Object.fromEntries(Object.entries(I).filter(([t,E])=>E!==void 0));if(Object.keys(A).length===0)return;let T=this.localNum[_];T===void 0&&(T=this.localNum[_]=Object.keys(this.localNum).length);let R=new L_(T,_,A),L=this.mesgDefn[T];(!L||!R.isSameDefn(L))&&(this.messages.push(R.defnRecord),this.mesgDefn[T]=R.mesgDefn),this.messages.push(R.dataRecord)}get blob(){let _=[this.header,...this.messages,this.trailer];return new Blob(_,{type:"application/octet-stream"})}get dataLen(){return this.messages.reduce((_,I)=>_+I.byteLength,0)}get dataCrc(){return this.messages.reduce((_,I)=>Z_(I,_),0)}get header(){let _=new DataView(new ArrayBuffer(LI));return _.setUint8(0,LI),_.setUint8(1,vI),_.setUint16(2,$I,!0),_.setUint32(4,this.dataLen,!0),_.setUint32(8,bI),_.setUint16(12,Z_(_.buffer.slice(0,12)),!0),_.buffer}get trailer(){let _=new DataView(new ArrayBuffer(2));return _.setUint16(0,this.dataCrc,!0),_.buffer}async encoder(_){return this.encode(_)}};var EI=require("@garmin/fitsdk");var t_=(S=>(S[S.GENERIC=0]="GENERIC",S[S.RUNNING=1]="RUNNING",S[S.CYCLING=2]="CYCLING",S[S.TRANSITION=3]="TRANSITION",S[S.FITNESS_EQUIPMENT=4]="FITNESS_EQUIPMENT",S[S.SWIMMING=5]="SWIMMING",S[S.BASKETBALL=6]="BASKETBALL",S[S.SOCCER=7]="SOCCER",S[S.TENNIS=8]="TENNIS",S[S.AMERICAN_FOOTBALL=9]="AMERICAN_FOOTBALL",S[S.TRAINING=10]="TRAINING",S[S.WALKING=11]="WALKING",S[S.CROSS_COUNTRY_SKIING=12]="CROSS_COUNTRY_SKIING",S[S.ALPINE_SKIING=13]="ALPINE_SKIING",S[S.SNOWBOARDING=14]="SNOWBOARDING",S[S.ROWING=15]="ROWING",S[S.MOUNTAINEERING=16]="MOUNTAINEERING",S[S.HIKING=17]="HIKING",S[S.MULTISPORT=18]="MULTISPORT",S[S.PADDLING=19]="PADDLING",S[S.FLYING=20]="FLYING",S[S.E_BIKING=21]="E_BIKING",S[S.MOTORCYCLING=22]="MOTORCYCLING",S[S.BOATING=23]="BOATING",S[S.DRIVING=24]="DRIVING",S[S.GOLF=25]="GOLF",S[S.HANG_GLIDING=26]="HANG_GLIDING",S[S.HORSEBACK_RIDING=27]="HORSEBACK_RIDING",S[S.HUNTING=28]="HUNTING",S[S.FISHING=29]="FISHING",S[S.INLINE_SKATING=30]="INLINE_SKATING",S[S.ROCK_CLIMBING=31]="ROCK_CLIMBING",S[S.SAILING=32]="SAILING",S[S.ICE_SKATING=33]="ICE_SKATING",S[S.SKY_DIVING=34]="SKY_DIVING",S[S.SNOWSHOEING=35]="SNOWSHOEING",S[S.SNOWMOBILING=36]="SNOWMOBILING",S[S.STAND_UP_PADDLEBOARDING=37]="STAND_UP_PADDLEBOARDING",S[S.SURFING=38]="SURFING",S[S.WAKEBOARDING=39]="WAKEBOARDING",S[S.WATER_SKIING=40]="WATER_SKIING",S[S.KAYAKING=41]="KAYAKING",S[S.RAFTING=42]="RAFTING",S[S.WINDSURFING=43]="WINDSURFING",S[S.KITESURFING=44]="KITESURFING",S[S.TACTICAL=45]="TACTICAL",S[S.JUMPMASTER=46]="JUMPMASTER",S[S.BOXING=47]="BOXING",S[S.FLOOR_CLIMBING=48]="FLOOR_CLIMBING",S[S.BASEBALL=49]="BASEBALL",S[S.DIVING=53]="DIVING",S[S.HIIT=62]="HIIT",S[S.RACKET=64]="RACKET",S[S.WHEELCHAIR_PUSH_WALK=65]="WHEELCHAIR_PUSH_WALK",S[S.WHEELCHAIR_PUSH_RUN=66]="WHEELCHAIR_PUSH_RUN",S[S.MEDITATION=67]="MEDITATION",S[S.DISC_GOLF=69]="DISC_GOLF",S[S.CRICKET=71]="CRICKET",S[S.RUGBY=72]="RUGBY",S[S.HOCKEY=73]="HOCKEY",S[S.LACROSSE=74]="LACROSSE",S[S.VOLLEYBALL=75]="VOLLEYBALL",S[S.WATER_TUBING=76]="WATER_TUBING",S[S.WAKESURFING=77]="WAKESURFING",S[S.MIXED_MARTIAL_ARTS=80]="MIXED_MARTIAL_ARTS",S[S.SNORKELING=82]="SNORKELING",S[S.DANCE=83]="DANCE",S[S.JUMP_ROPE=84]="JUMP_ROPE",S[S.ALL=254]="ALL",S))(t_||{});var E_=(O=>(O[O.GENERIC=0]="GENERIC",O[O.TREADMILL=1]="TREADMILL",O[O.STREET=2]="STREET",O[O.TRAIL=3]="TRAIL",O[O.TRACK=4]="TRACK",O[O.SPIN=5]="SPIN",O[O.INDOOR_CYCLING=6]="INDOOR_CYCLING",O[O.ROAD=7]="ROAD",O[O.MOUNTAIN=8]="MOUNTAIN",O[O.DOWNHILL=9]="DOWNHILL",O[O.RECUMBENT=10]="RECUMBENT",O[O.CYCLOCROSS=11]="CYCLOCROSS",O[O.HAND_CYCLING=12]="HAND_CYCLING",O[O.TRACK_CYCLING=13]="TRACK_CYCLING",O[O.INDOOR_ROWING=14]="INDOOR_ROWING",O[O.ELLIPTICAL=15]="ELLIPTICAL",O[O.STAIR_CLIMBING=16]="STAIR_CLIMBING",O[O.LAP_SWIMMING=17]="LAP_SWIMMING",O[O.OPEN_WATER=18]="OPEN_WATER",O[O.FLEXIBILITY_TRAINING=19]="FLEXIBILITY_TRAINING",O[O.STRENGTH_TRAINING=20]="STRENGTH_TRAINING",O[O.WARM_UP=21]="WARM_UP",O[O.MATCH=22]="MATCH",O[O.EXERCISE=23]="EXERCISE",O[O.CHALLENGE=24]="CHALLENGE",O[O.INDOOR_SKIING=25]="INDOOR_SKIING",O[O.CARDIO_TRAINING=26]="CARDIO_TRAINING",O[O.INDOOR_WALKING=27]="INDOOR_WALKING",O[O.E_BIKE_FITNESS=28]="E_BIKE_FITNESS",O[O.BMX=29]="BMX",O[O.CASUAL_WALKING=30]="CASUAL_WALKING",O[O.SPEED_WALKING=31]="SPEED_WALKING",O[O.BIKE_TO_RUN_TRANSITION=32]="BIKE_TO_RUN_TRANSITION",O[O.RUN_TO_BIKE_TRANSITION=33]="RUN_TO_BIKE_TRANSITION",O[O.SWIM_TO_BIKE_TRANSITION=34]="SWIM_TO_BIKE_TRANSITION",O[O.ATV=35]="ATV",O[O.MOTOCROSS=36]="MOTOCROSS",O[O.BACKCOUNTRY=37]="BACKCOUNTRY",O[O.RESORT=38]="RESORT",O[O.RC_DRONE=39]="RC_DRONE",O[O.WINGSUIT=40]="WINGSUIT",O[O.WHITEWATER=41]="WHITEWATER",O[O.SKATE_SKIING=42]="SKATE_SKIING",O[O.YOGA=43]="YOGA",O[O.PILATES=44]="PILATES",O[O.INDOOR_RUNNING=45]="INDOOR_RUNNING",O[O.GRAVEL_CYCLING=46]="GRAVEL_CYCLING",O[O.E_BIKE_MOUNTAIN=47]="E_BIKE_MOUNTAIN",O[O.COMMUTING=48]="COMMUTING",O[O.MIXED_SURFACE=49]="MIXED_SURFACE",O[O.NAVIGATE=50]="NAVIGATE",O[O.TRACK_ME=51]="TRACK_ME",O[O.MAP=52]="MAP",O[O.SINGLE_GAS_DIVING=53]="SINGLE_GAS_DIVING",O[O.MULTI_GAS_DIVING=54]="MULTI_GAS_DIVING",O[O.GAUGE_DIVING=55]="GAUGE_DIVING",O[O.APNEA_DIVING=56]="APNEA_DIVING",O[O.APNEA_HUNTING=57]="APNEA_HUNTING",O[O.VIRTUAL_ACTIVITY=58]="VIRTUAL_ACTIVITY",O[O.OBSTACLE=59]="OBSTACLE",O[O.BREATHING=62]="BREATHING",O[O.SAIL_RACE=65]="SAIL_RACE",O[O.ULTRA=67]="ULTRA",O[O.INDOOR_CLIMBING=68]="INDOOR_CLIMBING",O[O.BOULDERING=69]="BOULDERING",O[O.HIIT=70]="HIIT",O[O.AMRAP=73]="AMRAP",O[O.EMOM=74]="EMOM",O[O.TABATA=75]="TABATA",O[O.PICKLEBALL=84]="PICKLEBALL",O[O.PADEL=85]="PADEL",O[O.INDOOR_WHEELCHAIR_WALK=86]="INDOOR_WHEELCHAIR_WALK",O[O.INDOOR_WHEELCHAIR_RUN=87]="INDOOR_WHEELCHAIR_RUN",O[O.INDOOR_HAND_CYCLING=88]="INDOOR_HAND_CYCLING",O[O.SQUASH=94]="SQUASH",O[O.BADMINTON=95]="BADMINTON",O[O.RACQUETBALL=96]="RACQUETBALL",O[O.TABLE_TENNIS=97]="TABLE_TENNIS",O[O.FLY_CANOPY=110]="FLY_CANOPY",O[O.FLY_PARAGLIDE=111]="FLY_PARAGLIDE",O[O.FLY_PARAMOTOR=112]="FLY_PARAMOTOR",O[O.FLY_PRESSURIZED=113]="FLY_PRESSURIZED",O[O.FLY_NAVIGATE=114]="FLY_NAVIGATE",O[O.FLY_TIMER=115]="FLY_TIMER",O[O.FLY_ALTIMETER=116]="FLY_ALTIMETER",O[O.FLY_WX=117]="FLY_WX",O[O.FLY_VFR=118]="FLY_VFR",O[O.FLY_IFR=119]="FLY_IFR",O[O.ALL=254]="ALL",O))(E_||{});var NI="development",QI=1,JI=1;function zI(n,_){if(!Number.isFinite(n))throw new Error(`${_} must be a finite number.`)}function O_(n,_){return zI(n,_),Math.abs(n)<=180?Math.round(n*2147483648/180):Math.round(n)}function pI(n){if(!n.name||n.name.trim().length===0)throw new Error("Course name is required.");if(!Array.isArray(n.records)||n.records.length===0)throw new Error("Course must contain at least one record point.");let _=n.records.map((A,T)=>{if(A==null)throw new Error(`Course record #${T+1} is missing.`);if(A.timestamp==null)throw new Error(`Course record #${T+1} is missing timestamp.`);return{...A,positionLat:O_(A.latitude,`records[${T}].latitude`),positionLong:O_(A.longitude,`records[${T}].longitude`)}}),I=(n.coursePoints??[]).map((A,T)=>{if(A==null)throw new Error(`Course point #${T+1} is missing.`);if(A.timestamp==null)throw new Error(`Course point #${T+1} is missing timestamp.`);return{...A,type:A.type??0,positionLat:O_(A.latitude,`coursePoints[${T}].latitude`),positionLong:O_(A.longitude,`coursePoints[${T}].longitude`)}});return{...n,sport:n.sport??2,subSport:n.subSport??0,records:_,coursePoints:I,manufacturer:n.manufacturer??NI,product:n.product??QI,serialNumber:n.serialNumber??JI,timeCreated:n.timeCreated??_[0].timestamp}}function n_(n){let _=pI(n),I=_.records[0],A=_.records[_.records.length-1],T=I.timestamp,R=A.timestamp,L=[{mesgNum:0,data:{type:6,manufacturer:_.manufacturer,product:_.product,serialNumber:_.serialNumber,timeCreated:_.timeCreated}},{mesgNum:31,data:{name:_.name,sport:_.sport,subSport:_.subSport}},{mesgNum:19,data:{startTime:T,timestamp:R,startPositionLat:I.positionLat,startPositionLong:I.positionLong,endPositionLat:A.positionLat,endPositionLong:A.positionLong,totalDistance:A.distance}},{mesgNum:21,data:{timestamp:T,event:0,eventType:0}}];return _.records.forEach(t=>{L.push({mesgNum:20,data:{timestamp:t.timestamp,positionLat:t.positionLat,positionLong:t.positionLong,distance:t.distance,altitude:t.altitude,speed:t.speed}})}),_.coursePoints.forEach((t,E)=>{L.push({mesgNum:32,data:{messageIndex:E,timestamp:t.timestamp,positionLat:t.positionLat,positionLong:t.positionLong,distance:t.distance,type:t.type,name:t.name,favorite:t.favorite}})}),L.push({mesgNum:21,data:{timestamp:R,event:0,eventType:4}}),L}function r(n){let _=new EI.Encoder;return n_(n).forEach(A=>{_.onMesg(A.mesgNum,A.data)}),_.close()}var X=class{constructor(){this.version="1.0.0";this.priority=100}supports(_){return this.supportedTags.includes(_)}async initialize(_){_.metadata.set(`plugin:${this.name}:initialized`,!0)}async destroy(_){_.metadata.delete(`plugin:${this.name}:initialized`)}async validate(_){return!0}parseFloat(_){if(!(typeof _>"u"))return typeof _=="number"?_:typeof _=="string"&&parseFloat(_)||0}parseInt(_){return typeof _=="number"?Math.floor(_):typeof _=="string"&&parseInt(_,10)||0}parseString(_){return String(_||"")}parseBoolean(_){return typeof _=="boolean"?_:typeof _=="string"?_.toLowerCase()==="true":!1}parseDate(_){if(!_)return;let I=new Date(_);return isNaN(I.getTime())?void 0:I}hasRequiredAttributes(_,I){return I.every(A=>{var T;return(T=_.attributes)==null?void 0:T[A]})}extractAttributes(_,I,A){_.attributes&&Object.entries(_.attributes).forEach(([T,R])=>{let L=A[T];L&&L in I&&(I[L]=String(R||""))})}processChildren(_,I,A){var T;(T=_.children)==null||T.forEach(R=>{let L=A[R.tag];L&&L(R,I)})}getChildValue(_,I){var T;let A=(T=_.children)==null?void 0:T.find(R=>R.tag===I);return A!=null&&A.value?String(A.value):void 0}getChildByTag(_,I){var A;return(A=_.children)==null?void 0:A.find(T=>T.tag===I)}getChildrenByTag(_,I){var A;return((A=_.children)==null?void 0:A.filter(T=>T.tag===I))||[]}convertExtensions(_){var A;let I={};return(A=_.children)==null||A.forEach(T=>{I[T.tag]=this.convertExtensionContent(T)}),I}convertExtensionContent(_){var I;if((I=_.children)!=null&&I.length){let A={};return _.children.forEach(T=>{A[T.tag]=this.convertExtensionContent(T)}),A}else return _.value}},d=class{constructor(){this.version="1.0.0";this.description=""}async initialize(_){}async destroy(_){}async validate(_){return!0}async onTokenize(_,I){return _}async onAstGenerate(_,I){return _}async onConvert(_,I){return _}async onComplete(_,I){return _}async onError(_,I){}};var G=class extends X{parseCoordinate(_){let I=this.parseFloat(_);return I===0?void 0:I}parseGPXTime(_){if(!_)return;let I=new Date(_);return isNaN(I.getTime())?void 0:I}extractNumericAttributes(_,I,A){_.attributes&&Object.entries(_.attributes).forEach(([T,R])=>{let L=A[T];L&&L in I&&typeof R<"u"&&(I[L]=this.parseFloat(R))})}},c=class extends d{async onError(_,I){I.warnings.push(`Middleware ${this.name} error: ${_.message}`)}};var S_=class extends G{constructor(){super(...arguments);this.name="wpt-converter";this.supportedTags=["wpt","trkpt","rtept"];this.version="1.0.0"}convert(I,A){var R,L;if(!this.hasRequiredAttributes(I,["lat","lon"]))return;let T={lat:this.parseFloat((R=I.attributes)==null?void 0:R.lat),lon:this.parseFloat((L=I.attributes)==null?void 0:L.lon)};return this.processChildren(I,T,{ele:(t,E)=>E.ele=this.parseFloat(t.value),time:(t,E)=>E.time=new Date(this.parseString(t.value)),speed:(t,E)=>E.speed=this.parseFloat(t.value),power:(t,E)=>E.power=this.parseFloat(t.value),cadence:(t,E)=>E.cadence=this.parseFloat(t.value),heartRate:(t,E)=>E.heartRate=this.parseFloat(t.value),course:(t,E)=>E.course=this.parseFloat(t.value),name:(t,E)=>E.name=this.parseString(t.value),cmt:(t,E)=>E.cmt=this.parseString(t.value),desc:(t,E)=>E.desc=this.parseString(t.value),src:(t,E)=>E.src=this.parseString(t.value),sym:(t,E)=>E.sym=this.parseString(t.value),type:(t,E)=>E.type=this.parseString(t.value),fix:(t,E)=>E.fix=this.parseString(t.value),sat:(t,E)=>E.sat=this.parseString(t.value),hdop:(t,E)=>E.hdop=this.parseFloat(t.value),vdop:(t,E)=>E.vdop=this.parseFloat(t.value),pdop:(t,E)=>E.pdop=this.parseFloat(t.value),ageofdgpsdata:(t,E)=>E.ageofdgpsdata=this.parseFloat(t.value),geoidheight:(t,E)=>E.geoidheight=this.parseFloat(t.value),magvar:(t,E)=>E.magvar=this.parseFloat(t.value),dgpsid:(t,E)=>E.dgpsid=this.parseFloat(t.value),extensions:(t,E)=>{let D=A.metadata.get("decoder"),H=D==null?void 0:D.getConverter("extensions");if(H){let C=H.convert(t,A);C&&(this.mapExtensionsToPoint(C,E),E.extensions=C)}},link:(t,E)=>{var C;E.link||(E.link=[]);let D=A.metadata.get("decoder"),H=(C=D==null?void 0:D.getConverter("link"))==null?void 0:C.convert(t,A);H&&E.link&&E.link.push(H)}}),T}mapExtensionsToPoint(I,A){Object.entries(I).forEach(([T,R])=>{if(R!==void 0&&(typeof R=="string"||typeof R=="number")){let L=t=>(Array.isArray(t)?t:[t]).some(D=>{let H=T.toLowerCase(),C=D.toLowerCase();return H===C||H.endsWith(`:${C}`)});L("speed")?A.speed=this.parseFloat(R):L("hr")?A.heartRate=this.parseFloat(R):L(["cad","cadence"])?A.cadence=this.parseFloat(R):L(["PowerInWatts","power"])&&(A.power=this.parseFloat(R))}})}},D_=class extends G{constructor(){super(...arguments);this.name="rte-converter";this.supportedTags=["rte"]}convert(I,A){let T={rtept:[]};return this.processChildren(I,T,{name:(R,L)=>L.name=this.parseString(R.value),cmt:(R,L)=>L.cmt=this.parseString(R.value),desc:(R,L)=>L.desc=this.parseString(R.value),src:(R,L)=>L.src=this.parseString(R.value),number:(R,L)=>L.number=this.parseFloat(R.value),type:(R,L)=>L.type=this.parseString(R.value),rtept:(R,L)=>{var D;let t=A.metadata.get("decoder"),E=(D=t==null?void 0:t.getConverter("wpt"))==null?void 0:D.convert(R,A);E&&L.rtept&&L.rtept.push(E)},extensions:(R,L)=>{let t=A.metadata.get("decoder"),E=t==null?void 0:t.getConverter("extensions");E&&(L.extensions=E.convert(R,A))},link:(R,L)=>{var E;L.link||(L.link=[]);let t=A.metadata.get("decoder");(E=R.children)==null||E.forEach(D=>{var C;let H=(C=t==null?void 0:t.getConverter("link"))==null?void 0:C.convert(D,A);H&&L.link&&L.link.push(H)})}}),T}},H_=class extends G{constructor(){super(...arguments);this.name="trk-converter";this.supportedTags=["trk"]}convert(I,A){let T={trkseg:[]};return this.processChildren(I,T,{name:(R,L)=>L.name=this.parseString(R.value),cmt:(R,L)=>L.cmt=this.parseString(R.value),desc:(R,L)=>L.desc=this.parseString(R.value),src:(R,L)=>L.src=this.parseString(R.value),number:(R,L)=>L.number=this.parseFloat(R.value),type:(R,L)=>L.type=this.parseString(R.value),trkseg:(R,L)=>{var D;let t=A.metadata.get("decoder"),E=(D=t==null?void 0:t.getConverter("trkseg"))==null?void 0:D.convert(R,A);E&&L.trkseg&&L.trkseg.push(E)},extensions:(R,L)=>{let t=A.metadata.get("decoder"),E=t==null?void 0:t.getConverter("extensions");E&&(L.extensions=E.convert(R,A))},link:(R,L)=>{var E;L.link||(L.link=[]);let t=A.metadata.get("decoder");(E=R.children)==null||E.forEach(D=>{var C;let H=(C=t==null?void 0:t.getConverter("link"))==null?void 0:C.convert(D,A);H&&L.link&&L.link.push(H)})}}),T}},C_=class extends G{constructor(){super(...arguments);this.name="trkseg-converter";this.supportedTags=["trkseg"]}convert(I,A){let T={trkpt:[]};return this.processChildren(I,T,{trkpt:(R,L)=>{var D;let t=A.metadata.get("decoder"),E=(D=t==null?void 0:t.getConverter("wpt"))==null?void 0:D.convert(R,A);E&&L.trkpt&&L.trkpt.push(E)},extensions:(R,L)=>{let t=A.metadata.get("decoder"),E=t==null?void 0:t.getConverter("extensions");E&&(L.extensions=E.convert(R,A))}}),T}},U_=class extends G{constructor(){super(...arguments);this.name="link-converter";this.supportedTags=["link"]}convert(I,A){var R;let T={};return(R=I.attributes)!=null&&R.href&&(T.href=I.attributes.href),this.processChildren(I,T,{text:(L,t)=>t.text=this.parseString(L.value),type:(L,t)=>t.type=this.parseString(L.value)}),T}},G_=class extends G{constructor(){super(...arguments);this.name="metadata-converter";this.supportedTags=["metadata"]}convert(I,A){let T={};return this.processChildren(I,T,{name:(R,L)=>L.name=this.parseString(R.value),desc:(R,L)=>L.desc=this.parseString(R.value),keywords:(R,L)=>L.keywords=this.parseString(R.value),time:(R,L)=>L.time=new Date(this.parseString(R.value)),author:(R,L)=>{var E;let t=A.metadata.get("decoder");L.author=(E=t==null?void 0:t.getConverter("author"))==null?void 0:E.convert(R,A)},copyright:(R,L)=>{var E;let t=A.metadata.get("decoder");L.copyright=(E=t==null?void 0:t.getConverter("copyright"))==null?void 0:E.convert(R,A)},bounds:(R,L)=>{var E;let t=A.metadata.get("decoder");L.bounds=(E=t==null?void 0:t.getConverter("bounds"))==null?void 0:E.convert(R,A)},extensions:(R,L)=>{let t=A.metadata.get("decoder"),E=t==null?void 0:t.getConverter("extensions");E&&(L.extensions=E.convert(R,A))},link:(R,L)=>{var D;L.link||(L.link=[]);let t=A.metadata.get("decoder"),E=(D=t==null?void 0:t.getConverter("link"))==null?void 0:D.convert(R,A);E&&L.link&&L.link.push(E)}}),T}},F_=class extends G{constructor(){super(...arguments);this.name="person-converter";this.supportedTags=["author"]}convert(I,A){var R;let T={};return I.value&&!((R=I.children)!=null&&R.length)?(T.name=this.parseString(I.value),T):(this.processChildren(I,T,{name:(L,t)=>t.name=this.parseString(L.value),email:(L,t)=>{var D;let E=A.metadata.get("decoder");t.email=(D=E==null?void 0:E.getConverter("email"))==null?void 0:D.convert(L,A)},link:(L,t)=>{var D;let E=A.metadata.get("decoder");t.link=(D=E==null?void 0:E.getConverter("link"))==null?void 0:D.convert(L,A)}}),T)}},o_=class extends G{constructor(){super(...arguments);this.name="email-converter";this.supportedTags=["email"]}convert(I,A){let T={};return this.processChildren(I,T,{id:(R,L)=>L.id=this.parseString(R.value),domain:(R,L)=>L.domain=this.parseString(R.value)}),T}},f_=class extends G{constructor(){super(...arguments);this.name="copyright-converter";this.supportedTags=["copyright"]}convert(I,A){var R;let T={};return(R=I.attributes)!=null&&R.author&&(T.author=I.attributes.author),this.processChildren(I,T,{year:(L,t)=>t.year=this.parseString(L.value),license:(L,t)=>t.license=this.parseString(L.value)}),T}},W_=class extends G{constructor(){super(...arguments);this.name="bounds-converter";this.supportedTags=["bounds"]}convert(I,A){let T={};return this.extractAttributes(I,T,{minlat:"minlat",minlon:"minlon",maxlat:"maxlat",maxlon:"maxlon"}),T}},B_=class extends G{constructor(){super(...arguments);this.name="extensions-converter";this.supportedTags=["extensions"]}convert(I,A){var R;let T={};return(R=I.children)==null||R.forEach(L=>{this.flattenExtensionElement(L,T)}),T}flattenExtensionElement(I,A){var T,R;if(!((T=I.children)!=null&&T.length)&&I.value!==void 0){A[I.tag]=this.parseExtensionValue(I.value);return}(R=I.children)!=null&&R.length&&I.children.forEach(L=>{this.flattenExtensionElement(L,A)})}parseExtensionValue(I){if(I===void 0)return;let A=String(I),T=parseFloat(A);return!isNaN(T)&&isFinite(T)?T:A}};var OI=require("htmlparser2"),x=(T=>(T.TOKENIZE="tokenize",T.AST_GENERATE="ast_generate",T.CONVERT="convert",T.COMPLETE="complete",T))(x||{}),V_=class{constructor(){this.stage="tokenize"}async process(_){let I=Date.now();if(!_.xmlContent)throw new Error("XML content cannot be empty");let A=[],T=new OI.Parser({onopentag(R,L){A.push({type:"open",tag:R,attributes:L})},ontext(R){let L=R.replace(/\n/g,"").trim();L&&A.push({type:"text",tag:"text",value:L})},onclosetag(R){A.push({type:"close",tag:R})}},{xmlMode:!0});return T.write(_.xmlContent),T.end(),_.tokens=A,_.performance.tokenizeTime=Date.now()-I,_}},K_=class{constructor(){this.stage="ast_generate"}async process(_){var L;let I=Date.now();if(!_.tokens)throw new Error("Tokens cannot be empty");let A=[],T,R=null;for(let t of _.tokens)if(t.type==="open"){let E={tag:t.tag,attributes:t.attributes||{},children:[]};T?R&&((L=R.children)==null||L.push(E)):T=E,A.push(E),R=E}else t.type==="text"&&R?R.value=t.value:t.type==="close"&&(A.pop(),R=A[A.length-1]||null);return _.ast=T,_.performance.astTime=Date.now()-I,_}},X_=class{constructor(_){this.getConverter=_;this.stage="convert"}async process(_){var T;let I=Date.now();if(!_.ast)throw new Error("AST cannot be empty");let A={};return _.ast.attributes&&Object.entries(_.ast.attributes).forEach(([R,L])=>{R.startsWith("xmlns:")?A[R]=L.replace(/'/g,"'"):R==="xsi:schemaLocation"?A[R]=L.replace(/'/g,"'"):A[R]=L}),(T=_.ast.children)==null||T.forEach(R=>{let L=this.getConverter(R.tag);try{let t=L.convert(R,_);t&&this.assignResult(A,R.tag,t)}catch(t){_.errors.push(t)}}),_.result=A,_.performance.convertTime=Date.now()-I,_}assignResult(_,I,A){switch(I){case"metadata":_.metadata=A;break;case"wpt":_.wpt||(_.wpt=[]),_.wpt.push(A);break;case"rte":_.rte||(_.rte=[]),_.rte.push(A);break;case"trk":_.trk||(_.trk=[]),_.trk.push(A);break;case"extensions":_.extensions=A;break}}},M_=class{constructor(){this.stage="complete"}async process(_){_.performance.endTime=Date.now();let I=_.performance.endTime-_.performance.startTime;return _.metadata.set("performance",{totalTime:I,tokenizeTime:_.performance.tokenizeTime,astTime:_.performance.astTime,convertTime:_.performance.convertTime}),_}};var P=class{constructor(){this.converterPlugins=new Map;this.registeredPlugins=new Set;this.middlewarePlugins=[];this.processors=[];this.initialized=!1;this.defaultConvertersRegistered=!1;this.initializePipeline()}initializePipeline(){this.processors=[new V_,new K_,new X_(_=>this.getConverter(_)),new M_]}async registerDefaultConverters(){var I;if(this.defaultConvertersRegistered)return;let _=[new S_,new D_,new H_,new C_,new U_,new G_,new F_,new o_,new f_,new W_,new B_];for(let A of _)(I=A.supportedTags)==null||I.forEach(T=>{this.addConverterForTag(T,A)}),this.registeredPlugins.add(A.name);this.defaultConvertersRegistered=!0}addConverterForTag(_,I){this.converterPlugins.has(_)||this.converterPlugins.set(_,[]);let A=this.converterPlugins.get(_);A.push(I),A.sort((T,R)=>(T.priority||100)-(R.priority||100))}async registerConverter(_){var A,R;if(this.registeredPlugins.has(_.name))throw new Error(`Converter plugin ${_.name} already exists`);(A=_.supportedTags)==null||A.forEach(L=>{this.addConverterForTag(L,_)}),this.registeredPlugins.add(_.name);let I=_.priority!==void 0?` (priority: ${_.priority})`:"";(R=_.supportedTags)==null||R.forEach(L=>{let E=(this.converterPlugins.get(L)||[]).map(D=>`${D.name}(${D.priority||100})`)})}async registerMiddleware(_){let I=this.middlewarePlugins.findIndex(T=>T.name===_.name);I!==-1?this.middlewarePlugins[I]=_:this.middlewarePlugins.push(_);let A=[];_.onTokenize&&A.push("onTokenize"),_.onAstGenerate&&A.push("onAstGenerate"),_.onConvert&&A.push("onConvert"),_.onComplete&&A.push("onComplete"),_.onError&&A.push("onError"),A.length>0}getConverter(_){let I=this.converterPlugins.get(_);return I&&I.length>0?I[0]:void 0}getAllConverters(_){return this.converterPlugins.get(_)||[]}unregisterConverter(_){let I;for(let[A,T]of this.converterPlugins){let R=T.findIndex(L=>L.name===_);R!==-1&&(I=T[R],T.splice(R,1),T.length===0&&this.converterPlugins.delete(A))}I&&this.registeredPlugins.delete(_)}unregisterMiddleware(_){let I=this.middlewarePlugins.findIndex(A=>A.name===_);I!==-1&&this.middlewarePlugins.splice(I,1)}listConverters(){return Array.from(this.converterPlugins.keys())}listConverterPlugins(){return Array.from(this.registeredPlugins)}listMiddlewares(){return this.middlewarePlugins.map(_=>_.name)}listProcessors(){return this.processors.map(_=>_.constructor.name)}getConverterDetails(_){let I={};if(_){let A=this.converterPlugins.get(_);A&&(I[_]=A.map(T=>({name:T.name,priority:T.priority||100})))}else for(let[A,T]of this.converterPlugins)I[A]=T.map(R=>({name:R.name,priority:R.priority||100}));return I}getMiddlewareDetails(){return this.middlewarePlugins.map(_=>{let I=[];return _.onTokenize&&I.push("onTokenize"),_.onAstGenerate&&I.push("onAstGenerate"),_.onConvert&&I.push("onConvert"),_.onComplete&&I.push("onComplete"),_.onError&&I.push("onError"),{name:_.name,hooks:I}})}async initialize(){var A;if(this.initialized)return;await this.registerDefaultConverters();let _=this.createContext(),I=[...Array.from(this.converterPlugins.values()).flat(),...this.middlewarePlugins];for(let T of I)try{await((A=T.initialize)==null?void 0:A.call(T,_))}catch{}this.initialized=!0}async destroy(){var A;if(!this.initialized)return;let _=this.createContext(),I=[...Array.from(this.converterPlugins.values()).flat(),...this.middlewarePlugins];for(let T of I)try{await((A=T.destroy)==null?void 0:A.call(T,_))}catch{}this.initialized=!1}createContext(){return{metadata:new Map,errors:[],warnings:[],stats:{startTime:Date.now(),processedTokens:0,convertedElements:0},performance:{startTime:Date.now()}}}async executeMiddlewareHook(_,I,A){var R;let T=I;for(let L of this.middlewarePlugins){let t=L[_];if(t)try{T=await t.call(L,T,A)||T}catch(E){A.errors.push(E),await((R=L.onError)==null?void 0:R.call(L,E,A))}}return T}async parserByBuffer(_){var A;await this.initialize();let I=this.createContext();I.rawData=_,I.xmlContent=_.toString("utf-8"),I.metadata.set("decoder",this);try{for(let T of this.processors)try{switch(I=await T.process(I),T.stage){case"tokenize":I.tokens&&(I.tokens=await this.executeMiddlewareHook("onTokenize",I.tokens,I));break;case"ast_generate":I.ast&&(I.ast=await this.executeMiddlewareHook("onAstGenerate",I.ast,I));break;case"convert":I.result&&(I.result=await this.executeMiddlewareHook("onConvert",I.result,I));break;case"complete":I.result&&(I.result=await this.executeMiddlewareHook("onComplete",I.result,I));break}}catch(R){I.errors.push(R);for(let L of this.middlewarePlugins)await((A=L.onError)==null?void 0:A.call(L,R,I))}return I.result}catch(T){throw T}}convertExtensions(_){var L,t;let I={},{attributes:A,tag:T,value:R}=_;if(A&&Object.entries(A).forEach(([E,D])=>{I[E]=D}),(L=_==null?void 0:_.children)!=null&&L.length)(t=_.children)==null||t.forEach(E=>{I[E.tag]=this.convertExtensions(E)});else if(R!==void 0)return R;return I}};var s_=o(require("dayjs")),nI=o(require("dayjs/plugin/utc.js"));var q_={temperature:"atemp",wtemp:"wtemp",heartRate:"hr",cadence:"cad"};var y_={temperature:"Temperature",Depth:"Depth"};s_.default.extend(nI.default);var h=class{constructor(_={}){this.formatElevation=_=>{let I=parseFloat(_);return isNaN(I)?_:this.roundTo(I,2).toString()};this.compact=_.compact??!0}async encode(_){let I=this.buildGPXXML(_);return Buffer.from(I,"utf-8")}encodeToString(_){return this.buildGPXXML(_)}buildGPXXML(_){let I=this.buildXMLHeader(),A=this.buildGPXContent(_),R=`${I}${A}
|
|
2
|
+
</gpx>`;return this.compact?this.compressXML(R):R}compressXML(_){return _.replace(/>\s+</g,"><").replace(/^\s+|\s+$/gm,"").replace(/\s+/g," ").trim()}buildXMLHeader(){return['<?xml version="1.0" encoding="UTF-8"?>','<gpx creator="https://gpxonline.net" version="1.1"',' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"',' xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd'," http://www.garmin.com/xmlschemas/GpxExtensions/v3 http://www.garmin.com/xmlschemas/GpxExtensionsv3.xsd"," http://www.garmin.com/xmlschemas/TrackPointExtension/v1 http://www.garmin.com/xmlschemas/TrackPointExtensionv1.xsd"," http://www.garmin.com/xmlschemas/PowerExtension/v1 http://www.garmin.com/xmlschemas/PowerExtensionv1.xsd",' http://www.topografix.com/GPX/gpx_style/0/2 http://www.topografix.com/GPX/gpx_style/0/2/gpx_style.xsd"',' xmlns:gpxtpx="http://www.garmin.com/xmlschemas/TrackPointExtension/v1"',' xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3"',' xmlns:gpxpx="http://www.garmin.com/xmlschemas/PowerExtension/v1"',' xmlns:gpx_style="http://www.topografix.com/GPX/gpx_style/0/2"',' xmlns="http://www.topografix.com/GPX/1/1">'].join(`
|
|
3
|
+
`)}buildGPXContent(_){let{metadata:I,wpt:A=[],rte:T=[],trk:R=[]}=_,L=[];return I&&L.push(this.buildMetadata(I)),A.forEach(t=>{L.push(this.buildWaypoint(t,"wpt"))}),T.forEach(t=>{L.push(this.buildRoute(t))}),R.forEach(t=>{L.push(this.buildTrack(t))}),L.join(`
|
|
4
|
+
`)}buildMetadata(_){let I=["<metadata>"];return this.addOptionalElement(I,"name",_.name),this.addOptionalElement(I,"desc",_.desc),_.author&&I.push(this.buildAuthor(_.author)),_.copyright&&I.push(this.buildCopyright(_.copyright)),_.link&&this.addLinks(I,_.link),_.time&&I.push(this.buildTimeElement(_.time)),this.addOptionalElement(I,"keywords",_.keywords),_.bounds&&I.push(this.buildBounds(_.bounds)),_.extensions&&I.push(this.buildExtensions(_.extensions)),I.push("</metadata>"),I.join(`
|
|
5
|
+
`)}buildAuthor(_){let I=["<author>"];return this.addOptionalElement(I,"name",_.name),_.email&&I.push(`<email id="${this.escapeXML(_.email.id||"")}" domain="${this.escapeXML(_.email.domain||"")}"/>`),_.link&&I.push(this.buildLink(_.link)),I.push("</author>"),I.join(`
|
|
6
|
+
`)}buildCopyright(_){let I=[`<copyright author="${this.escapeXML(_.author||"")}">`];return this.addOptionalElement(I,"year",_.year),this.addOptionalElement(I,"license",_.license),I.push("</copyright>"),I.join(`
|
|
7
|
+
`)}buildBounds(_){let I=this.escapeXMLAttribute((_.minlat||0).toString()),A=this.escapeXMLAttribute((_.minlon||0).toString()),T=this.escapeXMLAttribute((_.maxlat||0).toString()),R=this.escapeXMLAttribute((_.maxlon||0).toString());return`<bounds minlat="${I}" minlon="${A}" maxlat="${T}" maxlon="${R}"/>`}buildWaypoint(_,I){var T,R,L;if(_.time===void 0)return"";let A=[`<${I} lat="${this.escapeXMLAttribute(_.lat?this.formatCoordinate(_.lat):"")}" lon="${this.escapeXMLAttribute(_.lon?this.formatCoordinate(_.lon):"")}">`];if(this.addOptionalElement(A,"ele",(T=_.ele)==null?void 0:T.toString(),this.formatElevation),_!=null&&_.time&&A.push(this.buildTimeElement(_.time)),this.addOptionalElement(A,"speed",(R=_.speed)==null?void 0:R.toString()),this.addOptionalElement(A,"course",(L=_.course)==null?void 0:L.toString()),this.addStandardWaypointElements(A,_),_.extensions){let t=this.processPointExtensions(_,_.extensions);Object.keys(t).length>0&&A.push(this.buildExtensions(t))}return A.push(`</${I}>`),A.join(`
|
|
8
|
+
`)}addStandardWaypointElements(_,I){var A,T,R,L,t,E,D;this.addOptionalElement(_,"magvar",(A=I.magvar)==null?void 0:A.toString()),this.addOptionalElement(_,"geoidheight",(T=I.geoidheight)==null?void 0:T.toString()),this.addOptionalElement(_,"name",I.name),this.addOptionalElement(_,"cmt",I.cmt),this.addOptionalElement(_,"desc",I.desc),this.addOptionalElement(_,"src",I.src),I.link&&this.addLinks(_,I.link),this.addOptionalElement(_,"sym",I.sym),this.addOptionalElement(_,"type",I.type),this.addOptionalElement(_,"fix",I.fix),this.addOptionalElement(_,"sat",I.sat),this.addOptionalElement(_,"hdop",(R=I.hdop)==null?void 0:R.toString()),this.addOptionalElement(_,"vdop",(L=I.vdop)==null?void 0:L.toString()),this.addOptionalElement(_,"pdop",(t=I.pdop)==null?void 0:t.toString()),this.addOptionalElement(_,"ageofdgpsdata",(E=I.ageofdgpsdata)==null?void 0:E.toString()),this.addOptionalElement(_,"dgpsid",(D=I.dgpsid)==null?void 0:D.toString())}buildRoute(_){var A;let I=["<rte>"];return this.addRouteTrackCommonElements(I,_),_.rtept&&((A=_.rtept)==null||A.forEach(T=>{I.push(this.buildWaypoint(T,"rtept"))})),_.extensions&&I.push(this.buildExtensions(_.extensions)),I.push("</rte>"),I.join(`
|
|
9
|
+
`)}buildTrack(_){let I=["<trk>"];return this.addRouteTrackCommonElements(I,_),_.trkseg&&_.trkseg.forEach(A=>{I.push(this.buildTrackSegment(A))}),_.extensions&&I.push(this.buildExtensions(_.extensions)),I.push("</trk>"),I.join(`
|
|
10
|
+
`)}buildTrackSegment(_){let I=["<trkseg>"];return _.trkpt&&_.trkpt.forEach(A=>{I.push(this.buildWaypoint(A,"trkpt"))}),_.extensions&&I.push(this.buildExtensions(_.extensions)),I.push("</trkseg>"),I.join(`
|
|
11
|
+
`)}addRouteTrackCommonElements(_,I){var A;this.addOptionalElement(_,"name",I.name),this.addOptionalElement(_,"cmt",I.cmt),this.addOptionalElement(_,"desc",I.desc),this.addOptionalElement(_,"src",I.src),I.link&&this.addLinks(_,I.link),this.addOptionalElement(_,"number",(A=I.number)==null?void 0:A.toString()),this.addOptionalElement(_,"type",I.type)}processPointExtensions(_,I){let A={};return Object.entries({"gpxtpx:TrackPointExtension":{"gpxtpx:hr":"heartRate","gpxtpx:cad":"cadence","gpxtpx:speed":"speed","gpxtpx:atemp":"temperature","gpxtpx:wtemp":"wtemp","gpxtpx:temp":"temperature"},"gpxpx:PowerExtension":{"gpxpx:PowerInWatts":"power"},"gpxx:GpxExtensions":{"gpxx:Temperature":"temperature","gpxx:Depth":"depth"}}).forEach(([R,L])=>{let t={},E=!1;Object.entries(L).forEach(([D,H])=>{let C;if(_[H]!==void 0)C=_[H];else if(I)if(I[D]!==void 0)C=I[D];else{let e=D.split(":").pop();Object.entries(I).forEach(([y,U])=>{y.endsWith(`:${e}`)&&U!==void 0&&(C=U)})}C!==void 0&&(t[D]=C,E=!0)}),E&&(A[R]=t)}),A}buildTrackPointExtension(_,I){let A=this.deepClone(I["gpxtpx:TrackPointExtension"]||{}),T=Object.keys(q_);return Object.keys(_).filter(R=>T.includes(R)).forEach(R=>{let L=q_[R];L&&_[R]!==void 0&&(A[`gpxtpx:${L}`]=_[R])}),A}buildPowerExtension(_,I){return this.deepClone(I["gpxpx:PowerExtension"]||{})}buildGpxExtensions(_,I){let A=this.deepClone(I["gpxx:GpxExtensions"]||{}),T=Object.keys(y_);return Object.keys(_).filter(R=>T.includes(R)).forEach(R=>{let L=y_[R];L&&_[R]!==void 0&&(A[`gpxx:${L}`]=_[R])}),A}buildExtensions(_){let I=this.buildExtensionContent(_);return I?`<extensions>${I}</extensions>`:""}buildExtensionContent(_){return Object.entries(_).filter(([I])=>!I.startsWith("xmlns")).map(([I,A])=>{if(A&&typeof A=="object"){let T=this.buildExtensionContent(A);return`<${I}>${T}</${I}>`}else if(A!=null)return`<${I}>${this.escapeXML(String(A))}</${I}>`;return""}).filter(I=>I).join("")}buildLink(_){let I=[`<link href="${this.escapeXMLAttribute(_.href||"")}">`];return this.addOptionalElement(I,"text",_.text),this.addOptionalElement(I,"type",_.type),I.push("</link>"),I.join("")}addLinks(_,I){(Array.isArray(I)?I:[I]).forEach(T=>{_.push(this.buildLink(T))})}buildTimeElement(_){return typeof _=="string"&&/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z?$/.test(_)?`<time>${_}</time>`:`<time>${(0,s_.default)(_).utc().format("YYYY-MM-DDTHH:mm:ss[Z]")}</time>`}addOptionalElement(_,I,A,T){if(A!=null&&A!==""){let R=T?T(A):this.escapeXML(A);_.push(`<${I}>${R}</${I}>`)}}isValidCoordinate(_,I){return _!=null&&I!==void 0&&I!==null&&!isNaN(_)&&!isNaN(I)}formatCoordinate(_){return this.roundTo(_,6).toString()}roundTo(_,I){let A=Math.pow(10,I);return Math.round(_*A)/A}escapeXML(_){return _.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}escapeXMLAttribute(_){return typeof _!="string"?String(_||""):_.replace(/&/g,"&").replace(/"/g,""").replace(/'/g,"'").replace(/</g,"<").replace(/>/g,">").replace(/\r/g," ").replace(/\n/g," ").replace(/\t/g,"	")}deepClone(_){if(_===null||typeof _!="object")return _;if(_ instanceof Date)return new Date(_.getTime());if(Array.isArray(_))return _.map(A=>this.deepClone(A));let I={};for(let A in _)Object.prototype.hasOwnProperty.call(_,A)&&(I[A]=this.deepClone(_[A]));return I}encoder(_){return this.encode(_)}};var u_=class extends c{constructor(){super(...arguments);this.name="performance-middleware";this.description="Monitor parsing performance"}async onTokenize(I,A){return I}async onAstGenerate(I,A){let T=this.countNodes(I);return I}async onComplete(I,A){let T=A.metadata.get("performance");return I}countNodes(I){let A=1;if(I.children)for(let T of I.children)A+=this.countNodes(T);return A}},i_=class extends c{constructor(){super(...arguments);this.name="validation-middleware";this.description="Validate GPX data integrity"}async onComplete(I,A){let T=this.validateGPX(I);return T.length>0&&A.metadata.set("validation-errors",T),I}validateGPX(I){let A=[];if(I.version||A.push("Missing GPX version information"),I.creator||A.push("Missing GPX creator information"),I.trk){for(let T of I.trk)if(T.trkseg){for(let R of T.trkseg)if(R.trkpt)for(let L of R.trkpt)L.time&&A.push("Invalid track point time")}}return A}};async function m_(n){let _=[new u_,new i_];for(let I of _)await n.registerMiddleware(I)}var F=class extends X{parseHeartRate(_){let I=this.parseFloat(_);if(!(typeof I>"u"))return I>0&&I<300?I:void 0}parseTCXTime(_){if(!_)return;let I=new Date(_);return isNaN(I.getTime())?void 0:I}parseDistance(_){let I=this.parseFloat(_);if(!(typeof I>"u"))return I>0?I:void 0}parseSpeed(_){let I=this.parseFloat(_);if(!(typeof I>"u"))return I>=0?I:void 0}parseAltitude(_){return this.parseFloat(_)}parseCoordinate(_){let I=this.parseFloat(_);return I!==0?I:void 0}};var g_=class extends F{constructor(){super(...arguments);this.name="PositionConverter";this.supportedTags=["Position"]}convert(I,A){let T={};return this.processChildren(I,T,{LatitudeDegrees:(R,L)=>L.LatitudeDegrees=this.parseString(R.value),LongitudeDegrees:(R,L)=>L.LongitudeDegrees=this.parseString(R.value)}),T}},w_=class extends F{constructor(){super(...arguments);this.name="TrackpointConverter";this.supportedTags=["Trackpoint"]}convert(I,A){let T={};return this.processChildren(I,T,{Time:(R,L)=>L.Time=this.parseString(R.value),Position:(R,L)=>{var E;let t=A.metadata.get("decoder");L.Position=(E=t==null?void 0:t.getConverter("Position"))==null?void 0:E.convert(R,A)},AltitudeMeters:(R,L)=>L.AltitudeMeters=this.parseFloat(R.value),DistanceMeters:(R,L)=>L.DistanceMeters=this.parseFloat(R.value),HeartRateBpm:(R,L)=>{if(R.value)L.HeartRateBpm=this.parseFloat(R.value);else{let t=this.getChildByTag(R,"Value");t!=null&&t.value&&(L.HeartRateBpm=this.parseFloat(t.value))}},Cadence:(R,L)=>{let t={Low:0,High:0};this.processChildren(R,t,{Low:(E,D)=>D.Low=this.parseFloat(E.value)||0,High:(E,D)=>D.High=this.parseFloat(E.value)||0}),L.Cadence=t},SensorState:(R,L)=>L.SensorState=R.value,Extensions:(R,L)=>{let t=A.metadata.get("decoder"),E=t==null?void 0:t.getConverter("Extensions");E&&(L.Extensions=E.convert(R,A))}}),T}},d_=class extends F{constructor(){super(...arguments);this.name="TrackConverter";this.supportedTags=["Track"]}convert(I,A){let T={Trackpoint:[]};return this.processChildren(I,T,{Trackpoint:(R,L)=>{var D;let t=A.metadata.get("decoder"),E=(D=t==null?void 0:t.getConverter("Trackpoint"))==null?void 0:D.convert(R,A);E&&L.Trackpoint&&L.Trackpoint.push(E)}}),T}},P_=class extends F{constructor(){super(...arguments);this.name="ActivityLapConverter";this.supportedTags=["Lap"]}convert(I,A){let T={};return this.extractAttributes(I,T,{StartTime:"Id"}),this.processChildren(I,T,{TotalTimeSeconds:(R,L)=>L.TotalTimeSeconds=this.parseFloat(R.value),DistanceMeters:(R,L)=>L.DistanceMeters=this.parseFloat(R.value),MaximumSpeed:(R,L)=>L.MaximumSpeed=this.parseFloat(R.value),Calories:(R,L)=>L.Calories=this.parseFloat(R.value),AverageHeartRateBpm:(R,L)=>L.AverageHeartRateBpm=this.parseFloat(R.value),MaximumHeartRateBpm:(R,L)=>L.MaximumHeartRateBpm=this.parseFloat(R.value),Intensity:(R,L)=>L.Intensity=R.value,TriggerMethod:(R,L)=>L.TriggerMethod=R.value,Track:(R,L)=>{var D;L.Track||(L.Track=[]);let t=A.metadata.get("decoder"),E=(D=t==null?void 0:t.getConverter("Track"))==null?void 0:D.convert(R,A);E&&L.Track.push(E)},Notes:(R,L)=>L.Notes=this.parseString(R.value),Extensions:(R,L)=>{let t=A.metadata.get("decoder"),E=t==null?void 0:t.getConverter("Extensions");E&&(L.Extensions=E.convert(R,A))}}),T}},h_=class extends F{constructor(){super(...arguments);this.name="ActivityConverter";this.supportedTags=["Activity"]}convert(I,A){let T={Id:"",Lap:[]};return this.extractAttributes(I,T,{Activity:"Activity"}),this.processChildren(I,T,{Id:(R,L)=>L.Id=this.parseString(R.value),Lap:(R,L)=>{var D;let t=A.metadata.get("decoder"),E=(D=t==null?void 0:t.getConverter("Lap"))==null?void 0:D.convert(R,A);E&&L.Lap.push(E)},Notes:(R,L)=>L.Notes=this.parseString(R.value),Training:(R,L)=>L.Training=this.convertTraining(R),Creator:(R,L)=>L.Creator=this.convertCreator(R),Extensions:(R,L)=>{let t=A.metadata.get("decoder"),E=t==null?void 0:t.getConverter("Extensions");E&&(L.Extensions=E.convert(R,A))}}),T}convertTraining(I){var T;let A={};return I.attributes&&Object.entries(I.attributes).forEach(([R,L])=>{A[R]=L}),(T=I.children)==null||T.forEach(R=>{A[R.tag]=this.convertExtensionContent(R)}),A}convertCreator(I){var T;let A={};return(T=I.children)==null||T.forEach(R=>{A[R.tag]=this.convertExtensionContent(R)}),A}},l_=class extends F{constructor(){super(...arguments);this.name="ActivityListConverter";this.supportedTags=["Activities"]}convert(I,A){let T={Activity:[],MultiActivitySession:[]};return this.processChildren(I,T,{Activity:(R,L)=>{var D;let t=A.metadata.get("decoder"),E=(D=t==null?void 0:t.getConverter("Activity"))==null?void 0:D.convert(R,A);E&&L.Activity&&L.Activity.push(E)},MultiActivitySession:(R,L)=>{var D;let t=A.metadata.get("decoder"),E=(D=t==null?void 0:t.getConverter("MultiActivitySession"))==null?void 0:D.convert(R,A);E&&L.MultiActivitySession&&L.MultiActivitySession.push(E)}}),T}},Y_=class extends F{constructor(){super(...arguments);this.name="MultiActivitySessionConverter";this.supportedTags=["MultiActivitySession"]}convert(I,A){let T={};return this.processChildren(I,T,{Id:(R,L)=>L.Id=this.parseString(R.value),FirstActivity:(R,L)=>{var E;let t=A.metadata.get("decoder");L.FirstActivity=(E=t==null?void 0:t.getConverter("FirstActivity"))==null?void 0:E.convert(R,A)},NextActivity:(R,L)=>{var D;L.NextActivity||(L.NextActivity=[]);let t=A.metadata.get("decoder"),E=(D=t==null?void 0:t.getConverter("NextActivity"))==null?void 0:D.convert(R,A);E&&L.NextActivity.push(E)},Notes:(R,L)=>L.Notes=this.parseString(R.value)}),T}},v_=class extends F{constructor(){super(...arguments);this.name="AbstractSourceConverter";this.supportedTags=["Author","Creator"]}convert(I,A){let T={};return this.processChildren(I,T,{Name:(R,L)=>L.Name=this.parseString(R.value)}),T}},$_=class extends F{constructor(){super(...arguments);this.name="extensions-converter";this.supportedTags=["Extensions"]}convert(I,A){let T={};return this.flattenExtensionElement(I,T),T}flattenExtensionElement(I,A){var T,R;if(!((T=I.children)!=null&&T.length)&&I.value!==void 0){A[I.tag]=this.parseExtensionValue(I.value);return}(R=I.children)!=null&&R.length&&I.children.forEach(L=>{this.flattenExtensionElement(L,A)})}parseExtensionValue(I){if(I===void 0)return;let A=String(I),T=parseFloat(A);return!isNaN(T)&&isFinite(T)?T:A}};var r_=require("htmlparser2"),b_=class{static tokenizeXML(_){let I=[],A=new r_.Parser({onopentag(T,R){I.push({type:"open",tag:T,attributes:R})},ontext(T){let R=T.replace(/\n/g,"").trim();R&&I.push({type:"text",tag:"text",value:R})},onclosetag(T){I.push({type:"close",tag:T})}},{xmlMode:!0});return A.write(_),A.end(),I}static compressXML(_){return _.replace(/>\s+</g,"><").replace(/\s+/g," ").trim()}static formatXML(_,I=2){let A=" ".repeat(I),T="",R=0,L=!1;for(let t=0;t<_.length;t++){let E=_[t],D=_[t+1];E==="<"?(D==="/"?(R--,L||(T+=`
|
|
12
|
+
`+A.repeat(R))):D!=="?"&&D!=="!"&&(L||(T+=`
|
|
13
|
+
`+A.repeat(R)),R++),L=!0):E===">"&&(L=!1,D==="<"&&_[t+2]==="/"&&R--),T+=E}return T.trim()}static validateXML(_){try{let I=new r_.Parser({},{xmlMode:!0});return I.write(_),I.end(),{isValid:!0}}catch(I){return{isValid:!1,error:I.message}}}static extractXMLDeclaration(_){let I=_.match(/<\?xml\s+([^>]+)\?>/);if(!I)return{};let A=I[1],T={},R=A.match(/version=["']([^"']+)["']/);R&&(T.version=R[1]);let L=A.match(/encoding=["']([^"']+)["']/);L&&(T.encoding=L[1]);let t=A.match(/standalone=["']([^"']+)["']/);return t&&(T.standalone=t[1]),T}static escapeXML(_){return _.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}static unescapeXML(_){return _.replace(/</g,"<").replace(/>/g,">").replace(/"/g,'"').replace(/'/g,"'").replace(/&/g,"&")}};var N_=class{constructor(){this.stage="tokenize";this.name="tokenize-processor"}async process(_){if(!_.xmlContent)throw new Error("TCX data cannot be empty");let I=b_.tokenizeXML(_.xmlContent);if(I.length===0)throw new Error("Not a valid TCX file");return _.tokens=I,_.stats.processedTokens=I.length,_}},Q_=class{constructor(){this.stage="ast-generate";this.name="ast-generate-processor"}async process(_){var L;let I=Date.now();if(!_.tokens)throw new Error("Tokens cannot be empty");let A=[],T,R=null;for(let t of _.tokens)if(t.type==="open"){let E={tag:t.tag,attributes:t.attributes||{},children:[]};T?R&&((L=R.children)==null||L.push(E)):T=E,A.push(E),R=E}else t.type==="text"&&R?R.value=t.value:t.type==="close"&&(A.pop(),R=A[A.length-1]||null);return _.ast=T,_.performance.astTime=Date.now()-I,_}},J_=class{constructor(_){this.getConverter=_;this.stage="convert";this.name="convert-processor"}async process(_){if(!_.ast)throw new Error("AST is empty, cannot convert");let I=this.findTCXRoot(_.ast);if(!I)throw new Error("Not a valid TCX file: TrainingCenterDatabase element not found");let A=this.convertAST(I,_);return _.result=A,_.stats.convertedElements=this.countElements(_.ast),_}findTCXRoot(_){if(_.tag==="TrainingCenterDatabase")return _;if(_.children)for(let I of _.children){let A=this.findTCXRoot(I);if(A)return A}}convertAST(_,I){let A=this.getConverter(_.tag);return A?A.convert(_,I):this.genericConvert(_,I)}genericConvert(_,I){let A={};if(_.attributes&&Object.entries(_.attributes).forEach(([T,R])=>{A[T]=R}),_.value!==void 0)if(_.children&&_.children.length>0)A._value=_.value;else return _.value;return _.children&&_.children.forEach(T=>{let R=this.convertAST(T,I);A[T.tag]?(Array.isArray(A[T.tag])||(A[T.tag]=[A[T.tag]]),A[T.tag].push(R)):A[T.tag]=R}),A}countElements(_){let I=1;if(_.children)for(let A of _.children)I+=this.countElements(A);return I}},z_=class{constructor(){this.stage="complete";this.name="complete-processor"}async process(_){if(!_.result)throw new Error("No conversion result found");let I=Date.now(),A=I-_.performance.startTime;return _.performance.endTime=I,_.performance.processingTime=A,_.metadata.set("performance",{processingTime:A,processedTokens:_.stats.processedTokens,convertedElements:_.stats.convertedElements}),_}};var l=class{constructor(){this.converterPlugins=new Map;this.registeredPlugins=new Set;this.middlewarePlugins=[];this.processors=[];this.initialized=!1;this.defaultConvertersRegistered=!1;this.initializePipeline()}initializePipeline(){this.processors=[new N_,new Q_,new J_(_=>this.getConverter(_)),new z_]}async registerDefaultConverters(){var I;if(this.defaultConvertersRegistered)return;let _=[new g_,new w_,new d_,new P_,new h_,new l_,new Y_,new v_,new $_];for(let A of _)(I=A.supportedTags)==null||I.forEach(T=>{this.addConverterForTag(T,A)}),this.registeredPlugins.add(A.name);this.defaultConvertersRegistered=!0}addConverterForTag(_,I){this.converterPlugins.has(_)||this.converterPlugins.set(_,[]);let A=this.converterPlugins.get(_);A.push(I),A.sort((T,R)=>(T.priority||100)-(R.priority||100))}async registerConverter(_){var A,R;if(this.registeredPlugins.has(_.name))throw new Error(`Converter plugin ${_.name} already exists`);(A=_.supportedTags)==null||A.forEach(L=>{this.addConverterForTag(L,_)}),this.registeredPlugins.add(_.name);let I=_.priority!==void 0?` (priority: ${_.priority})`:"";(R=_.supportedTags)==null||R.forEach(L=>{let E=(this.converterPlugins.get(L)||[]).map(D=>`${D.name}(${D.priority||100})`)})}async registerMiddleware(_){let I=this.middlewarePlugins.findIndex(T=>T.name===_.name);I!==-1?this.middlewarePlugins[I]=_:this.middlewarePlugins.push(_);let A=[];_.onTokenize&&A.push("onTokenize"),_.onAstGenerate&&A.push("onAstGenerate"),_.onConvert&&A.push("onConvert"),_.onComplete&&A.push("onComplete"),_.onError&&A.push("onError"),A.length>0}getConverter(_){let I=this.converterPlugins.get(_);return I&&I.length>0?I[0]:void 0}getAllConverters(_){return this.converterPlugins.get(_)||[]}unregisterConverter(_){let I;for(let[A,T]of this.converterPlugins){let R=T.findIndex(L=>L.name===_);R!==-1&&(I=T[R],T.splice(R,1),T.length===0&&this.converterPlugins.delete(A))}I&&this.registeredPlugins.delete(_)}unregisterMiddleware(_){let I=this.middlewarePlugins.findIndex(A=>A.name===_);I!==-1&&this.middlewarePlugins.splice(I,1)}async initialize(){var A;if(this.initialized)return;await this.registerDefaultConverters();let _=this.createContext(),I=[...Array.from(this.converterPlugins.values()).flat(),...this.middlewarePlugins];for(let T of I)try{await((A=T.initialize)==null?void 0:A.call(T,_))}catch{}this.initialized=!0}async destroy(){var A;if(!this.initialized)return;let _=this.createContext(),I=[...Array.from(this.converterPlugins.values()).flat(),...this.middlewarePlugins];for(let T of I)try{await((A=T.destroy)==null?void 0:A.call(T,_))}catch{}this.initialized=!1}createContext(){return{metadata:new Map,errors:[],warnings:[],stats:{startTime:Date.now(),processedTokens:0,convertedElements:0},performance:{startTime:Date.now()}}}async executeMiddlewareHook(_,I,A){var R;let T=I;for(let L of this.middlewarePlugins){let t=L[_];if(t)try{T=await t.call(L,T,A)||T}catch(E){A.errors.push(E),await((R=L.onError)==null?void 0:R.call(L,E,A))}}return T}async parseByBuffer(_){var A;await this.initialize();let I=this.createContext();I.rawData=_,I.xmlContent=_.toString("utf-8"),I.metadata.set("decoder",this);try{for(let T of this.processors)try{switch(I=await T.process(I),T.stage){case"tokenize":I.tokens&&(I.tokens=await this.executeMiddlewareHook("onTokenize",I.tokens,I));break;case"ast-generate":I.ast&&(I.ast=await this.executeMiddlewareHook("onAstGenerate",I.ast,I));break;case"convert":I.result&&(I.result=await this.executeMiddlewareHook("onConvert",I.result,I));break;case"complete":I.result&&(I.result=await this.executeMiddlewareHook("onComplete",I.result,I));break}}catch(R){I.errors.push(R);for(let L of this.middlewarePlugins)await((A=L.onError)==null?void 0:A.call(L,R,I))}return I.result}catch(T){throw T}}convertExtensions(_){var L,t;let I={},{attributes:A,tag:T,value:R}=_;if(A&&Object.entries(A).forEach(([E,D])=>{I[E]=D}),(L=_==null?void 0:_.children)!=null&&L.length)(t=_.children)==null||t.forEach(E=>{I[E.tag]=this.convertExtensions(E)});else if(R!==void 0)return R;return I}async parserByBuffer(_){return this.parseByBuffer(_)}async parseByString(_){let I=Buffer.from(_,"utf-8");return this.parseByBuffer(I)}};var c_=o(require("dayjs")),SI=o(require("dayjs/plugin/utc.js"));c_.default.extend(SI.default);var Y=class{constructor(_={}){this.compact=_.compact??!0}async encode(_){let I=this.buildTCXXML(_);return Buffer.from(I,"utf-8")}encodeToString(_){return this.buildTCXXML(_)}buildTCXXML(_){let I=this.buildXMLHeader(_),A=this.buildTCXContent(_),R=`${I}${A}
|
|
14
|
+
</TrainingCenterDatabase>`;return this.compact?this.compressXML(R):R}compressXML(_){return _.replace(/>\s+</g,"><").replace(/^\s+|\s+$/gm,"").replace(/\s+/g," ").trim()}buildXMLHeader(_){let I=_.version||"1.0",A=_.creator||"trackswap",T=_.xmlns||"http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2",R=_["xmlns:xsi"]||"http://www.w3.org/2001/XMLSchema-instance",L=_["xsi:schemaLocation"]||"http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2 http://www8.garmin.com/xmlschemas/TrainingCenterDatabasev2.xsd";return['<?xml version="1.0" encoding="UTF-8"?>',`<TrainingCenterDatabase version="${this.escapeXMLAttribute(I)}"`,` creator="${this.escapeXMLAttribute(A)}"`,` xmlns="${this.escapeXMLAttribute(T)}"`,` xmlns:xsi="${this.escapeXMLAttribute(R)}"`,` xsi:schemaLocation="${this.escapeXMLAttribute(L)}">`].join(`
|
|
15
|
+
`)}buildTCXContent(_){let I=[];return _.Folders&&I.push(this.buildFolders(_.Folders)),_.Activities&&I.push(this.buildActivities(_.Activities)),_.Workouts&&I.push(this.buildWorkouts(_.Workouts)),_.Courses&&I.push(this.buildCourses(_.Courses)),_.Author&&I.push(this.buildAuthor(_.Author)),_.Extensions&&I.push(this.buildExtensions(_.Extensions)),I.join(`
|
|
16
|
+
`)}buildFolders(_){let I=["<Folders>"];return _.History&&I.push(this.buildHistory(_.History)),_.Workouts&&I.push(this.buildWorkouts(_.Workouts)),_.Courses,I.push("</Folders>"),I.join(`
|
|
17
|
+
`)}buildHistory(_){let I=["<History>"];return _.Running&&I.push(`<Running>${this.buildHistoryFolder(_.Running)}</Running>`),_.Biking&&I.push(`<Biking>${this.buildHistoryFolder(_.Biking)}</Biking>`),_.Other&&I.push(`<Other>${this.buildHistoryFolder(_.Other)}</Other>`),_.MultiActivity&&I.push(`<MultiActivity>${this.buildHistoryFolder(_.MultiActivity)}</MultiActivity>`),_.Extensions&&I.push(this.buildExtensions(_.Extensions)),I.push("</History>"),I.join(`
|
|
18
|
+
`)}buildHistoryFolder(_){return""}buildActivities(_){let I=["<Activities>"];return _.Activity&&_.Activity.forEach(A=>{I.push(this.buildActivity(A))}),_.MultiActivitySession&&_.MultiActivitySession.forEach(A=>{I.push(this.buildMultiActivitySession(A))}),I.push("</Activities>"),I.join(`
|
|
19
|
+
`)}buildActivity(_){let A=[`<Activity Activity="${_.Activity||"Other"}">`];return A.push(`<Id>${this.formatTime(_.Id)}</Id>`),_.Lap&&_.Lap.length>0&&_.Lap.forEach(T=>{A.push(this.buildActivityLap(T))}),this.addOptionalElement(A,"Notes",_.Notes),_.Training,_.Creator,_.Extensions&&A.push(this.buildExtensions(_.Extensions)),A.push("</Activity>"),A.join(`
|
|
20
|
+
`)}buildActivityLap(_){let I=["<Lap>"];return this.addOptionalNumericElement(I,"TotalTimeSeconds",_.TotalTimeSeconds),this.addOptionalNumericElement(I,"DistanceMeters",_.DistanceMeters),this.addOptionalNumericElement(I,"MaximumSpeed",_.MaximumSpeed),this.addOptionalNumericElement(I,"Calories",_.Calories),_.AverageHeartRateBpm&&I.push(`<AverageHeartRateBpm xsi:type="HeartRateInBeatsPerMinute_t"><Value>${_.AverageHeartRateBpm}</Value></AverageHeartRateBpm>`),_.MaximumHeartRateBpm&&I.push(`<MaximumHeartRateBpm xsi:type="HeartRateInBeatsPerMinute_t"><Value>${_.MaximumHeartRateBpm}</Value></MaximumHeartRateBpm>`),this.addOptionalElement(I,"Intensity",_.Intensity),_.Cadence&&I.push(this.buildCadence(_.Cadence)),this.addOptionalElement(I,"TriggerMethod",_.TriggerMethod),_.Track&&_.Track.forEach(A=>{I.push(this.buildTrack(A))}),this.addOptionalElement(I,"Notes",_.Notes),_.Extensions&&I.push(this.buildExtensions(_.Extensions)),I.push("</Lap>"),I.join(`
|
|
21
|
+
`)}buildTrack(_){let I=["<Track>"];return _.Trackpoint&&_.Trackpoint.forEach(A=>{I.push(this.buildTrackpoint(A))}),I.push("</Track>"),I.join(`
|
|
22
|
+
`)}buildTrackpoint(_){let I=["<Trackpoint>"];return _.Time?(I.push(`<Time>${this.formatTime(_.Time)}</Time>`),_.Position&&I.push(this.buildPosition(_.Position)),this.addOptionalNumericElement(I,"AltitudeMeters",_.AltitudeMeters),this.addOptionalNumericElement(I,"DistanceMeters",_.DistanceMeters),_.HeartRateBpm&&I.push(`<HeartRateBpm xsi:type="HeartRateInBeatsPerMinute_t"><Value>${_.HeartRateBpm}</Value></HeartRateBpm>`),_.Cadence&&I.push(this.buildCadence(_.Cadence)),this.addOptionalElement(I,"SensorState",_.SensorState),_.Extensions&&I.push(this.buildExtensions(_.Extensions)),I.push("</Trackpoint>"),I.join(`
|
|
23
|
+
`)):""}buildPosition(_){let I=["<Position>"];return _!=null&&_.LatitudeDegrees&&I.push(`<LatitudeDegrees>${this.formatCoordinate(parseFloat(_.LatitudeDegrees))}</LatitudeDegrees>`),_!=null&&_.LongitudeDegrees&&I.push(`<LongitudeDegrees>${this.formatCoordinate(parseFloat(_.LongitudeDegrees))}</LongitudeDegrees>`),I.push("</Position>"),I.join("")}buildCadence(_){return`<Cadence><Low>${_.Low}</Low><High>${_.High}</High></Cadence>`}buildMultiActivitySession(_){let I=["<MultiActivitySession>"];return _.Id&&I.push(`<Id>${this.formatTime(_.Id)}</Id>`),_.FirstActivity&&I.push(this.buildFirstActivity(_.FirstActivity)),_.NextActivity&&_.NextActivity.forEach(A=>{I.push(this.buildNextActivity(A))}),this.addOptionalElement(I,"Notes",_.Notes),I.push("</MultiActivitySession>"),I.join(`
|
|
24
|
+
`)}buildFirstActivity(_){let I=["<FirstActivity>"];return _.Activity&&I.push(this.buildActivity(_.Activity)),I.push("</FirstActivity>"),I.join(`
|
|
25
|
+
`)}buildNextActivity(_){let I=["<NextActivity>"];return _.Transition&&I.push(`<Transition>${this.buildActivityLap(_.Transition)}</Transition>`),_.Activity&&I.push(this.buildActivity(_.Activity)),I.push("</NextActivity>"),I.join(`
|
|
26
|
+
`)}buildWorkouts(_){return"<Workouts></Workouts>"}buildCourses(_){return"<Courses></Courses>"}buildAuthor(_){let I=["<Author>"];return this.addOptionalElement(I,"Name",_.Name),I.push("</Author>"),I.join("")}buildExtensions(_){let I=this.buildExtensionContent(_);return I?`<Extensions>${I}</Extensions>`:""}buildExtensionContent(_){return Object.entries(_).filter(([I])=>!I.startsWith("xmlns")).map(([I,A])=>{if(A&&typeof A=="object"){let T=this.buildExtensionContent(A);return`<${I}>${T}</${I}>`}else if(A!=null)return`<${I}>${this.escapeXML(String(A))}</${I}>`;return""}).filter(I=>I).join("")}formatTime(_){return typeof _=="string"&&/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/.test(_)?_:(0,c_.default)(_).utc().format("YYYY-MM-DDTHH:mm:ss[Z]")}addOptionalElement(_,I,A,T){if(A!=null&&A!==""){let R=T?T(A):this.escapeXML(A);_.push(`<${I}>${R}</${I}>`)}}addOptionalNumericElement(_,I,A){A!=null&&!isNaN(A)&&_.push(`<${I}>${A}</${I}>`)}isValidCoordinate(_,I){return _!=null&&I!==void 0&&I!==null&&!isNaN(_)&&!isNaN(I)}formatCoordinate(_){return this.roundTo(_,6).toString()}roundTo(_,I){let A=Math.pow(10,I);return Math.round(_*A)/A}escapeXML(_){return _.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}escapeXMLAttribute(_){return typeof _!="string"?String(_||""):_.replace(/&/g,"&").replace(/"/g,""").replace(/'/g,"'").replace(/</g,"<").replace(/>/g,">").replace(/\r/g," ").replace(/\n/g," ").replace(/\t/g,"	")}deepClone(_){if(_===null||typeof _!="object")return _;if(_ instanceof Date)return new Date(_.getTime());if(Array.isArray(_))return _.map(A=>this.deepClone(A));let I={};for(let A in _)Object.prototype.hasOwnProperty.call(_,A)&&(I[A]=this.deepClone(_[A]));return I}encoder(_){return this.encode(_)}};var DI=o(require("dayjs")),v=class extends X{convertPoints(_){return _.map(I=>this.convertPoint(I)).filter(I=>I!==void 0)}convertTime(_){if(!_)return;if(typeof _=="number")return _;let I=(0,DI.default)(_);return I.isValid()?I.valueOf():void 0}},$=class{constructor(){this.version="1.0.0";this.priority=100}supports(_){return this.supportedTags.includes(_)}async initialize(_){_.metadata.set(`plugin:${this.name}:initialized`,!0)}async destroy(_){_.metadata.delete(`plugin:${this.name}:initialized`)}async validate(_){return!0}convertTimeToDate(_){return _?new Date(_):new Date}convertTimeToString(_){return this.convertTimeToDate(_).toISOString()}ensureValidCoordinates(_,I){return _>=-90&&_<=90&&I>=-180&&I<=180}round(_,I=6){let A=Math.pow(10,I);return Math.round(_*A)/A}},x_=class extends d{async onError(_,I){I.warnings.push(`Middleware ${this.name} error: ${_.message}`)}validateActivityFile(_){if(!_.metadata)return!1;if(_.routes){for(let I of _.routes)if(!this.validateRoute(I))return!1}if(_.points){for(let I of _.points)if(!this.validatePoint(I))return!1}if(_.activities){for(let I of _.activities)if(!this.validateActivity(I))return!1}return!0}validateActivity(_){return!!(_&&typeof _.index>"u"&&_.laps&&_.laps.length>0)}validateRoute(_){return!!(_.records&&_.records.length>0)}validatePoint(_){return!!_.timestamp}};var HI={heartrate:"heartRate","gpxtpx:hr":"heartRate","ns3:hr":"heartRate","gpxdata:hr":"heartRate","gpxdata:cadence":"cadence","gpxtpx:cad":"cadence","ns3:cad":"cadence",cadence:"cadence","gpxtpx:speed":"speed","ns3:speed":"speed",speed:"speed",power:"power","gpxdata:power":"power","gpxpx:PowerInWatts":"power",PowerInWatts:"power","gpxtpx:temp":"temperature","gpxtpx:wtemp":"wtemp","gpxtpx:atemp":"atemp","gpxx:Temperature":"temperature","gpxx:Depth":"depth"},f=n=>n*(180/Math.pow(2,31));var a_=o(require("dayjs"));var a=o(require("dayjs")),CI=require("geolib"),b=class{calculateRecordsAggMetrics(_){if(!_||_.length===0)return;let I={records:this.preprocessRecords(_)};for(let A=0;A<I.records.length;A++){let T=I.records[A];if(!(!T.positionLat||!T.positionLong)){if(I!=null&&I.startPositionLat||(I.startPositionLat=T.positionLat),I!=null&&I.startPositionLong||(I.startPositionLong=T.positionLong),I.endPositionLat=T.positionLat,I.endPositionLong=T.positionLong,I.timestamp=T.timestamp,I!=null&&I.startTime||(I.startTime=T.timestamp),I.endTime=T.timestamp,I.totalDistance=T.distance,I.totalElapsedTime=(0,a.default)(T.timestamp).diff((0,a.default)(I.startTime),"second"),T!=null&&T.speed&&(I.avgSpeed=I.avgSpeed?(I.avgSpeed+T.speed)/2:T.speed,I.maxSpeed=Math.max(I.maxSpeed||0,T.speed)),T!=null&&T.heartRate&&(I.maxHeartRate=Math.max(I.maxHeartRate||0,T.heartRate),I.minHeartRate=Math.min(I.minHeartRate||T.heartRate,T.heartRate),I.avgHeartRate?I.avgHeartRate=(I.avgHeartRate+T.heartRate)/2:I.avgHeartRate=T.heartRate),T!=null&&T.altitude&&(I.maxAltitude=Math.max(I.maxAltitude||0,T.altitude),I.minAltitude=Math.min(I.minAltitude||T.altitude,T.altitude),I.avgAltitude=I.avgAltitude?(I.avgAltitude+T.altitude)/2:T.altitude,A>0&&_[A-1].altitude)){let R=this.calculateElevationChanges(_[A-1],T);I.totalAscent=(I.totalAscent||0)+R.ascent,I.totalDescent=(I.totalDescent||0)+R.descent}if(T!=null&&T.cadence&&(I.maxCadence=Math.max(I.maxCadence||0,T.cadence),I.avgCadence?I.avgCadence=(I.avgCadence+T.cadence)/2:I.avgCadence=T.cadence),T!=null&&T.power){I.maxPower=Math.max(I.maxPower||0,T.power),I.avgPower?I.avgPower=(I.avgPower+T.power)/2:I.avgPower=T.power;let R=this.calculateAccumulatedPower(A>0?_[A-1]:T,T,I.totalWork||0);I.totalWork=R.newAccumulatedWork,I.normalizedPower=void 0}T!=null&&T.temperature&&(I.avgTemperature?I.avgTemperature=(I.avgTemperature+T.temperature)/2:I.avgTemperature=T.temperature,I.maxTemperature=Math.max(I.maxTemperature||0,T.temperature),I.minTemperature=Math.min(I.minTemperature||T.temperature,T.temperature))}}return I}calculateLapAggMetrics(_){var A;if(!_||_.length===0)return;let I={laps:_,timestamp:((A=_[0])==null?void 0:A.timestamp)||new Date};for(let T=0;T<_.length;T++){let R=_[T];R.startPositionLat&&R.startPositionLong&&!(I!=null&&I.startPositionLat)&&!(I!=null&&I.startPositionLong)&&(I.startPositionLat=R.startPositionLat,I.startPositionLong=R.startPositionLong),R.endPositionLat&&R.endPositionLong&&(I.endPositionLat=R.endPositionLat,I.endPositionLong=R.endPositionLong),R.startTime&&!(I!=null&&I.startTime)&&(I.startTime=R.startTime),R.endTime&&(I.endTime=R.endTime),I.timestamp=R.timestamp||R.endTime||I.timestamp,R.totalDistance&&(I.totalDistance=(I.totalDistance||0)+R.totalDistance),R.totalElapsedTime&&(I.totalElapsedTime=(I.totalElapsedTime||0)+R.totalElapsedTime),R.totalMovingTime&&(I.totalMovingTime=(I.totalMovingTime||0)+R.totalMovingTime),R.totalTimerTime&&(I.totalTimerTime=(I.totalTimerTime||0)+R.totalTimerTime),R.maxSpeed&&(I.maxSpeed=Math.max(I.maxSpeed||0,R.maxSpeed)),R.avgSpeed&&(I.avgSpeed?I.avgSpeed=(I.avgSpeed+R.avgSpeed)/2:I.avgSpeed=R.avgSpeed),R.maxHeartRate&&(I.maxHeartRate=Math.max(I.maxHeartRate||0,R.maxHeartRate)),R.minHeartRate&&(I.minHeartRate=I.minHeartRate?Math.min(I.minHeartRate,R.minHeartRate):R.minHeartRate),R.avgHeartRate&&(I.avgHeartRate?I.avgHeartRate=(I.avgHeartRate+R.avgHeartRate)/2:I.avgHeartRate=R.avgHeartRate),R.maxAltitude&&(I.maxAltitude=Math.max(I.maxAltitude||0,R.maxAltitude)),R.minAltitude&&(I.minAltitude=I.minAltitude?Math.min(I.minAltitude,R.minAltitude):R.minAltitude),R.avgAltitude&&(I.avgAltitude?I.avgAltitude=(I.avgAltitude+R.avgAltitude)/2:I.avgAltitude=R.avgAltitude),R.totalAscent&&(I.totalAscent=(I.totalAscent||0)+R.totalAscent),R.totalDescent&&(I.totalDescent=(I.totalDescent||0)+R.totalDescent),R.maxCadence&&(I.maxCadence=Math.max(I.maxCadence||0,R.maxCadence)),R.avgCadence&&(I.avgCadence?I.avgCadence=(I.avgCadence+R.avgCadence)/2:I.avgCadence=R.avgCadence),R.maxPower&&(I.maxPower=Math.max(I.maxPower||0,R.maxPower)),R.avgPower&&(I.avgPower?I.avgPower=(I.avgPower+R.avgPower)/2:I.avgPower=R.avgPower),R.totalWork&&(I.totalWork=(I.totalWork||0)+R.totalWork),R.maxTemperature&&(I.maxTemperature=Math.max(I.maxTemperature||0,R.maxTemperature)),R.minTemperature&&(I.minTemperature=I.minTemperature?Math.min(I.minTemperature,R.minTemperature):R.minTemperature),R.avgTemperature&&(I.avgTemperature?I.avgTemperature=(I.avgTemperature+R.avgTemperature)/2:I.avgTemperature=R.avgTemperature)}return I}preprocessRecords(_){if(!_||_.length===0)return _;let I=_.filter(L=>L.timestamp).sort((L,t)=>L.timestamp.valueOf()-t.timestamp.valueOf()),A=0,T=0,R=[];for(let L=0;L<I.length;L++){let t=I[L],E={...t};if(L>0){let D=this.calculatePointDistanceByPosition(I[L-1],E)||0;if(E.distance||(T+=D,E.distance=T),t.speed||(E.speed=this.calculateInstantSpeed(I[L-1],E,D)),t.power){let H=this.calculateAccumulatedPower(I[L-1],E,A);E.accumulatedPower=H.accumulatedPower,A=H.newAccumulatedWork}}R.push(E)}return R}calculatePointDistanceByPosition(_,I){if(!(!_.positionLat||!_.positionLong||!I.positionLat||!I.positionLong))try{return(0,CI.getPreciseDistance)({latitude:_.positionLat,longitude:_.positionLong},{latitude:I.positionLat,longitude:I.positionLong})}catch{return}}calculateInstantSpeed(_,I,A){if(!_.timestamp||!I.timestamp||!A)return;let T=((0,a.default)(I.timestamp).valueOf()-(0,a.default)(_.timestamp).valueOf())/1e3;if(!(T<=0))return A/T}calculateAccumulatedPower(_,I,A){var E,D;if(_.power===void 0||I.power===void 0||!_.timestamp||!I.timestamp)return{accumulatedPower:A,newAccumulatedWork:A};let T=((E=I.timestamp)==null?void 0:E.valueOf())-((D=_.timestamp)==null?void 0:D.valueOf());if(T<=0)return{accumulatedPower:A,newAccumulatedWork:A};let L=(_.power+I.power)/2*T,t=A+L;return{accumulatedPower:t,newAccumulatedWork:t}}calculateElevationChanges(_,I){let A=0,T=0;return I.altitude!==void 0&&_.altitude!==void 0&&(I.altitude>_.altitude?A=I.altitude-_.altitude:I.altitude<=_.altitude&&(T=_.altitude-I.altitude)),{ascent:A,descent:T}}};function W(n,_=0){let I=Math.pow(10,_);return Math.round(n*I)/I}var Q=class extends v{constructor(){super(...arguments);this.name="gpx-to-activity-converter";this.supportedTags=["gpx"];this.convertGPXExtensions=I=>{let A={};return Object.entries(I).forEach(([T,R])=>{if(typeof R<"u"&&R!=="undefined"){let L=HI[T]||T;A[L]=this.autoNumber(R)}}),A}}convert(I,A){if(A.sourceFormat!=="gpx")return;let T=A.sourceData;return this.convertGPX(T)}convertGPX(I){let A={metadata:{originType:"GPX",fileType:"gpx"},activities:[]};return I.wpt&&(A.points=this.convertWpts2Points(I.wpt)),I.trk&&(A.activities=I.trk.map((T,R)=>this.convertTrk2Activity(T,R))),I.rte&&(A.routes=I.rte.map((T,R)=>this.convertTrackSeg2Lap(T,R))),A}convertPoint(I,A,T){let{extensions:R}=I,L=R?this.convertGPXExtensions(R):{};return{lapIndex:T||0,index:A||0,positionLat:I==null?void 0:I.lat,positionLong:I==null?void 0:I.lon,altitude:I==null?void 0:I.ele,heartRate:I==null?void 0:I.heartRate,speed:I==null?void 0:I.speed,power:I==null?void 0:I.power,cadence:I==null?void 0:I.cadence,timestamp:(0,a_.default)(I.time).toDate(),...L}}convertTrk2Activity(I,A){var L;let T=((L=I.trkseg)==null?void 0:L.map((t,E)=>this.convertTrackSeg2Lap(t,E)))||[],R=new b().calculateLapAggMetrics(T);return{index:A,messageIndex:A,laps:T,...R}}convertTrackSeg2Lap(I,A){var t,E;let T=((E=(t=I.trkpt)==null?void 0:t.filter(D=>D!==void 0&&D.time))==null?void 0:E.map((D,H)=>this.convertPoint(D,H,A)))||[],L=new b().calculateRecordsAggMetrics(T);return{index:A,messageIndex:A,...L,records:(L==null?void 0:L.records)||[],lengths:[]}}convertWpts2Points(I){let A=[];for(let T=0;T<I.length;T++){let R=this.convertPoint(I[T],T);R&&A.push(R)}return A}autoNumber(I){return typeof I=="string"&&I.trim()!==""&&!isNaN(I)?Number(I):I}},J=class extends v{constructor(){super(...arguments);this.name="fit-to-activity-converter";this.supportedTags=["fit"]}convert(I,A){if(A.sourceFormat!=="fit")return;let T=A.sourceData;return this.convertFIT(T)}convertFIT(I){var T,R;let A={metadata:{originType:"FIT",fileType:"fit"},activities:[]};return(T=I.sessionMesgs)!=null&&T.length?A.activities=I.sessionMesgs.map((L,t)=>({index:t,...L,startPositionLat:L!=null&&L.startPositionLat?W(f(Number(L.startPositionLat)),6):void 0,startPositionLong:L!=null&&L.startPositionLong?W(f(Number(L.startPositionLong)),6):void 0,endPositionLat:L!=null&&L.endPositionLat?W(f(Number(L.endPositionLat)),6):void 0,endPositionLong:L!=null&&L.endPositionLong?W(f(Number(L.endPositionLong)),6):void 0,laps:this.convertFITLap2Trackseg(L==null?void 0:L.lapMesgs)})):(R=I.courseMesgs)!=null&&R.length&&(A.routes=I.courseMesgs.map((L,t)=>({index:t,...L,records:this.convertLap2Points(L==null?void 0:L.lapMesgs)}))),A}convertPoint(I,A,T){let{positionLong:R,positionLat:L,altitude:t,enhancedAltitude:E,enhancedSpeed:D,speed:H,...C}=I;return{lapIndex:T||0,index:A||0,positionLat:L?W(f(Number(L)),6):void 0,positionLong:R?W(f(Number(R)),6):void 0,altitude:t||void 0,enhancedAltitude:E||void 0,speed:H||void 0,enhancedSpeed:D||void 0,...C}}convertFITLap2Trackseg(I){var T,R;let A=[];if(!(I!=null&&I.length))return[];for(let L=0;L<I.length;L++){let t=I[L],E=((T=t==null?void 0:t.recordMesgs)==null?void 0:T.map((H,C)=>this.convertPoint(H,C,L)).filter(H=>H!==void 0))||[],D=((R=t==null?void 0:t.lengthMesgs)==null?void 0:R.map((H,C)=>({...H,index:C})))||[];A.push({index:L,...t,startPositionLat:t!=null&&t.startPositionLat?W(f(Number(t.startPositionLat)),6):void 0,startPositionLong:t!=null&&t.startPositionLong?W(f(Number(t.startPositionLong)),6):void 0,endPositionLat:t!=null&&t.endPositionLat?W(f(Number(t.endPositionLat)),6):void 0,endPositionLong:t!=null&&t.endPositionLong?W(f(Number(t.endPositionLong)),6):void 0,records:E,lengths:D})}return A}convertLap2Points(I){var T;let A=[];if(!(I!=null&&I.length))return[];for(let R=0;R<I.length;R++){let t=((T=I[R].recordMesgs)==null?void 0:T.map((E,D)=>this.convertPoint(E,D,R)).filter(E=>E!==void 0))||[];t.length&&(A=[...A,...t])}return A}},z=class extends v{constructor(){super(...arguments);this.name="tcx-to-activity-converter";this.supportedTags=["tcx"]}convert(I,A){if(A.sourceFormat!=="tcx")return;let T=A.sourceData;return this.convertTCX(T)}convertTCX(I){var T,R,L,t;let A={metadata:{originType:"TCX",fileType:"tcx"},activities:[]};return(R=(T=I.Activities)==null?void 0:T.Activity)!=null&&R.length&&(A.activities=I.Activities.Activity.map((E,D)=>this.convertTCXActivityToActivity(E,D))),(t=(L=I.Courses)==null?void 0:L.Course)!=null&&t.length,A}convertTCXActivityToActivity(I,A){var L;let T=((L=I.Lap)==null?void 0:L.map((t,E)=>this.convertTCXLap2Lap(t,E)))||[],R=new b().calculateLapAggMetrics(T);return{index:A,messageIndex:A,laps:T,...R}}convertTCXLap2Lap(I,A){var E;let T=((E=I==null?void 0:I.Track)==null?void 0:E.flatMap(D=>D.Trackpoint))||[],R=(T==null?void 0:T.filter(D=>D!==void 0&&D.Time!==void 0).map((D,H)=>this.convertPoint(D,H)))||[],t=new b().calculateRecordsAggMetrics(R);return{index:A,messageIndex:A,...t,records:(t==null?void 0:t.records)||[],lengths:[]}}convertPoint(I,A,T){let{Position:R,Time:L,DistanceMeters:t,AltitudeMeters:E}=I;return{lapIndex:T||0,index:A||0,positionLat:R!=null&&R.LatitudeDegrees?Number(R.LatitudeDegrees):void 0,positionLong:R!=null&&R.LongitudeDegrees?Number(R.LongitudeDegrees):void 0,timestamp:(0,a_.default)(L).toDate(),distance:t,altitude:E}}};var UI=o(require("dayjs"));var p=class extends ${constructor(){super(...arguments);this.name="activity-to-gpx-encoder";this.supportedTags=["gpx"]}encode(I,A){var L,t,E,D,H;if(A.targetFormat!=="gpx"||!((L=I==null?void 0:I.activities)!=null&&L.length))return;let R={version:"1.1",creator:"TrackSwap",metadata:{time:((t=I.activities)==null?void 0:t[0]).timestamp}};return(E=I.points)!=null&&E.length&&(R.wpt=this.convertRecords2Wpts(I.points)),(D=I.routes)!=null&&D.length&&(R.rte=I.routes.map(C=>this.convertRoute2GPXRoute(C))),(H=I.activities)!=null&&H.length&&(R.trk=I.activities.map(C=>this.convertActivity2GPXTrack(C))),R}convertRecords2Wpts(I){return I==null?void 0:I.filter(A=>A.timestamp).map(A=>({lat:A==null?void 0:A.positionLat,lon:A==null?void 0:A.positionLong,ele:A==null?void 0:A.altitude,time:A==null?void 0:A.timestamp,speed:A==null?void 0:A.speed,hdop:A==null?void 0:A.hdop,vdop:A==null?void 0:A.vdop,pdop:A==null?void 0:A.pdop,extensions:this.extractGPXExtensions(A)}))}convertRoute2GPXRoute(I){return{rtept:I.records?this.convertRecords2Wpts(I.records):[]}}convertActivity2GPXTrack(I){var A;return{trkseg:((A=I.laps)==null?void 0:A.map(T=>({trkpt:T.records?this.convertRecords2Wpts(T.records):[]})))||[]}}extractGPXExtensions(I){let A={},T={};return typeof(I==null?void 0:I.heartRate)<"u"&&(T["gpxtpx:hr"]=I.heartRate),typeof(I==null?void 0:I.cadence)<"u"&&(T["gpxtpx:cad"]=I.cadence),typeof(I==null?void 0:I.temperature)<"u"&&(T["gpxtpx:atemp"]=I.temperature),Object.keys(T).length>0&&(A["gpxtpx:TrackPointExtension"]=T),typeof(I==null?void 0:I.power)<"u"&&(A["gpxpx:PowerExtension"]={"gpxpx:PowerInWatts":I.power}),Object.keys(A).length>0?A:void 0}},j=class extends ${constructor(){super(...arguments);this.name="activity-to-fit-encoder";this.supportedTags=["fit"]}encode(I,A){var R,L;if(A.targetFormat!=="fit"||!((R=I==null?void 0:I.activities)!=null&&R.length))return;let T={};return T.sessionMesgs=(L=I.activities)==null?void 0:L.map(t=>this.convertActivity2FITSession(t)),T}convertActivity2FITSession(I){var T;return{...I,event:(I==null?void 0:I.event)||"session",sport:(I==null?void 0:I.sport)||"generic",lapMesgs:((T=I.laps)==null?void 0:T.map(R=>this.convertLap2FITLap(R)))||[]}}convertLap2FITLap(I){var T;return{startTime:I.startTime,...I,recordMesgs:((T=I.records)==null?void 0:T.map(R=>this.convertPoint2FITRecord(R)))||[]}}convertPoint2FITRecord(I){return I}},k=class extends ${constructor(){super(...arguments);this.name="sport-to-tcx-encoder";this.supportedTags=["tcx"]}encode(I,A){var R;if(A.targetFormat!=="tcx"||!((R=I==null?void 0:I.activities)!=null&&R.length))return;let T={Author:{Name:"TrackSwap"}};return T.Activities={Activity:I.activities.map(L=>this.convertActivity2TCXActivity(L))},T}convertActivity2TCXActivity(I){var T;let A="Other";return(I.sport==="Running"||I.sport==="Biking")&&(A=I.sport),{Id:`Activity_${Date.now()}`,Activity:A,Lap:((T=I.laps)==null?void 0:T.map(R=>this.convertLap2TCXLap(R)))||[]}}convertLap2TCXLap(I){let A={TotalTimeSeconds:I.totalElapsedTime,DistanceMeters:I.totalDistance,MaximumSpeed:I.maxSpeed,Calories:I.totalCalories,AverageHeartRateBpm:I.avgHeartRate,MaximumHeartRateBpm:I.maxHeartRate,Intensity:"Active",TriggerMethod:"Manual",Track:I.records?[this.convertRecords2TCXTrack(I.records)]:[]};return(I.avgCadence!==void 0||I.maxCadence!==void 0)&&(A.Cadence={Low:I.avgCadence||0,High:I.maxCadence||0}),A}convertRecords2TCXTrack(I){return{Trackpoint:I.map(A=>this.convertPoint2TCXTrackpoint(A))}}convertPoint2TCXTrackpoint(I){var T,R;let A={Time:(0,UI.default)(I.timestamp).toISOString(),Position:{LatitudeDegrees:(T=I==null?void 0:I.positionLat)==null?void 0:T.toString(),LongitudeDegrees:(R=I==null?void 0:I.positionLong)==null?void 0:R.toString()},AltitudeMeters:I.altitude,DistanceMeters:I.distance};return I.heartRate&&(A.HeartRateBpm=I.heartRate),I.cadence&&(A.Cadence={Low:I.cadence,High:I.cadence256||I.cadence}),I.power&&(A.Extensions={"ns3:TPX":{"ns3:Watts":I.power}}),A}convertRoute2TCXCourse(I){return{Name:`Course_${Date.now()}`,Track:I.records?[this.convertRecords2TCXTrack(I.records)]:[]}}};var Z=class{constructor(){this.converters=new Map;this.encoders=new Map;this.registerDefaultConverters(),this.registerDefaultEncoders()}registerDefaultConverters(){this.registerConverter(new Q),this.registerConverter(new J),this.registerConverter(new z)}registerDefaultEncoders(){this.registerEncoder(new p),this.registerEncoder(new j),this.registerEncoder(new k)}registerConverter(_){this.converters.set(_.name,_)}registerEncoder(_){this.encoders.set(_.name,_)}async convertToActivity(_,I){let A={metadata:new Map,errors:[],warnings:[],stats:{startTime:Date.now(),processedTokens:0,convertedElements:0},sourceFormat:I,sourceData:_,performance:{startTime:Date.now()}};try{let T=this.findConverter(I);if(!T)throw new Error(`No converter found for format "${I}"`);let R=Date.now(),L=T.convert(_,A);if(A.performance.convertTime=Date.now()-R,!L)throw new Error(`Converter "${T.name}" returned empty result`);let t=L;return A.result=t,A.performance.endTime=Date.now(),A.stats.endTime=Date.now(),t}catch(T){throw A.errors.push(T),T}}async encodeActivity(_,I){let A={metadata:new Map,errors:[],warnings:[],stats:{startTime:Date.now(),processedTokens:0,convertedElements:0},targetFormat:I,performance:{startTime:Date.now()}};try{let T=this.findEncoder(I);if(!T)throw new Error(`No encoder found for format "${I}"`);let R=Date.now(),L=T.encode(_,A);if(A.performance.encodeTime=Date.now()-R,!L)throw new Error(`Encoder "${T.name}" returned empty result`);return A.result=L,A.performance.endTime=Date.now(),A.stats.endTime=Date.now(),L}catch(T){throw A.errors.push(T),T}}findConverter(_){return Array.from(this.converters.values()).find(I=>{var A;return(A=I.supportedTags)==null?void 0:A.includes(_)})}findEncoder(_){return Array.from(this.encoders.values()).find(I=>{var A;return(A=I.supportedTags)==null?void 0:A.includes(_)})}async destroy(){this.converters.clear(),this.encoders.clear()}};var q=class{constructor(){this.gpxDecoder=new P,this.gpxEncoder=new h,this.fitDecoder=new V,this.fitEncoder=new K,this.tcxDecoder=new l,this.tcxEncoder=new Y,this.activityProcessor=new Z}async parseGPX(_){try{return await this.gpxDecoder.parserByBuffer(_)}catch(I){throw new Error(`GPX parsing failed: ${I.message}`)}}async parseGPXString(_){let I=Buffer.from(_,"utf-8");return this.parseGPX(I)}async encodeGPX(_){try{return await this.gpxEncoder.encode(_)}catch(I){throw new Error(`GPX encoding failed: ${I.message}`)}}encodeGPXString(_){try{return this.gpxEncoder.encodeToString(_)}catch(I){throw new Error(`GPX encoding failed: ${I.message}`)}}async parseFIT(_){try{return await this.fitDecoder.parseByBuffer(_)}catch(I){throw new Error(`FIT parsing failed: ${I.message}`)}}async encodeFIT(_){try{return await this.fitEncoder.encode(_)}catch(I){throw new Error(`FIT encoding failed: ${I.message}`)}}async encodeFITCourse(_){try{return await this.convertToFITCourse(_)}catch(I){throw new Error(`FIT Course encoding failed: ${I.message}`)}}async convertFITToCourse(_){try{return await this.encodeFITCourse(_)}catch(I){throw new Error(`FIT to Course conversion failed: ${I.message}`)}}async convertToFITCourse(_,I){try{let A=await this.parseToActivity(_,I);if(!A)throw new Error("Activity conversion result is empty");let T=this.buildCoursePlanFromActivityFile(A),R=r(T);return Buffer.from(R)}catch(A){throw new Error(`File to FIT Course conversion failed: ${A.message}`)}}buildCoursePlanFromActivityFile(_){var R,L,t;let I=(R=_.activities)==null?void 0:R[0],T=[...(((L=_.activities)==null?void 0:L.flatMap(E=>E.laps??[]))??[]).flatMap(E=>E.records??[]),...((t=_.routes)==null?void 0:t.flatMap(E=>E.records??[]))??[],..._.points??[]].filter(E=>E.timestamp!=null&&E.positionLat!=null&&E.positionLong!=null).sort((E,D)=>{let H=new Date(E.timestamp).getTime(),C=new Date(D.timestamp).getTime();return H-C}).map(E=>({timestamp:E.timestamp,latitude:E.positionLat,longitude:E.positionLong,distance:E.distance,altitude:E.enhancedAltitude??E.altitude,speed:E.enhancedSpeed??E.speed}));if(T.length===0)throw new Error("Cannot build CoursePlan: no valid activity records with timestamp and coordinates.");return{name:this.resolveCourseName(_),sport:this.toEnumValue(t_,I==null?void 0:I.sport)??2,subSport:this.toEnumValue(E_,I==null?void 0:I.subSport)??0,records:T,timeCreated:T[0].timestamp}}resolveCourseName(_){var T,R,L;let I=(R=(T=_.metadata)==null?void 0:T.fileName)==null?void 0:R.trim();if(I)return I;let A=(L=_.metadata)==null?void 0:L.originType;return A?`${A.toLowerCase()}-course`:"course"}toEnumValue(_,I){if(!I)return;let A=I.replace(/([a-z0-9])([A-Z])/g,"$1_$2").replace(/[^a-zA-Z0-9]+/g,"_").replace(/^_+|_+$/g,"").toUpperCase();for(let T of Object.keys(_))if(Number.isNaN(Number(T))&&T.toUpperCase()===A){let R=_[T];return typeof R=="number"?R:void 0}}async parseTCXString(_){let I=Buffer.from(_,"utf-8");return this.parseTCX(I)}async parseTCX(_){try{let I=await this.tcxDecoder.parseByBuffer(_);if(!I)throw new Error("TCX parsing result is empty");return I}catch(I){throw new Error(`TCX parsing failed: ${I.message}`)}}async encodeTCX(_){try{return await this.tcxEncoder.encode(_)}catch(I){throw new Error(`TCX encoding failed: ${I.message}`)}}async encodeTCXString(_){try{return await this.tcxEncoder.encodeToString(_)}catch(I){throw new Error(`TCX encoding failed: ${I.message}`)}}async convertGPXToActivity(_){return await this.activityProcessor.convertToActivity(_,"gpx")}async convertFITToActivity(_){return await this.activityProcessor.convertToActivity(_,"fit")}async convertTCXToActivity(_){return await this.activityProcessor.convertToActivity(_,"tcx")}async convertActivityToGPX(_){return await this.activityProcessor.encodeActivity(_,"gpx")}async convertActivityToFIT(_){return await this.activityProcessor.encodeActivity(_,"fit")}async convertActivityToTCX(_){return await this.activityProcessor.encodeActivity(_,"tcx")}async convertFile(_,I,A){try{let T=A||this.detectFormat(_);if(T==="unknown"||T==null)throw new Error("Unable to recognize source file format, please specify sourceType parameter");if(T===I)return _;let R;switch(T){case"gpx":let t=await this.parseGPX(_);if(!t)throw new Error("GPX file parsing failed");R=t;break;case"fit":R=await this.parseFIT(_);break;case"tcx":R=await this.parseTCX(_);break;default:throw new Error(`Unsupported source file format: ${T}`)}let L;switch(T){case"gpx":L=await this.convertGPXToActivity(R);break;case"fit":L=await this.convertFITToActivity(R);break;case"tcx":L=await this.convertTCXToActivity(R);break;default:throw new Error(`Unsupported source file format conversion: ${T}`)}switch(I){case"gpx":let t=await this.convertActivityToGPX(L);return await this.encodeGPX(t);case"fit":let E=await this.convertActivityToFIT(L);return await this.encodeFIT(E);case"tcx":let D=await this.convertActivityToTCX(L);return await this.encodeTCX(D);default:throw new Error(`Unsupported target file format: ${I}`)}}catch(T){let R=A||"auto-detect";throw new Error(`${R} to ${I.toUpperCase()} failed: ${T.message}`)}}detectFormat(_){let I=_.toString("utf-8",0,Math.min(1024,_.length));if(_.length>=12&&_.toString("ascii",8,12)===".FIT")return"fit";if(I.includes("<?xml")){if(I.includes("<gpx")||I.includes("http://www.topografix.com/GPX/"))return"gpx";if(I.includes("<TrainingCenterDatabase")||I.includes("http://www.garmin.com/xmlschemas/TrainingCenterDatabase/"))return"tcx"}return"unknown"}async parseFile(_,I){let A=I||this.detectFormat(_);if(A==="unknown")throw new Error("Unable to recognize file format, please specify sourceType parameter");switch(A){case"gpx":let T=await this.parseGPX(_);if(!T)throw new Error("GPX parsing failed");return T;case"fit":return await this.parseFIT(_);case"tcx":return await this.parseTCX(_);default:throw new Error(`Unsupported file format: ${A}`)}}async parseToActivity(_,I){let A=I||this.detectFormat(_);if(A==="unknown")throw new Error("Unable to recognize file format, please specify sourceType parameter");let T;switch(A){case"gpx":let R=await this.parseGPX(_);if(!R)throw new Error("GPX parsing failed");T=await this.convertGPXToActivity(R);break;case"fit":let L=await this.parseFIT(_);L&&(T=await this.convertFITToActivity(L));break;case"tcx":let t=await this.parseTCX(_);T=await this.convertTCXToActivity(t);break;default:throw new Error(`Unsupported file format: ${A}`)}return T}getActivityProcessor(){return this.activityProcessor}getGPXDecoder(){return this.gpxDecoder}getGPXEncoder(){return this.gpxEncoder}getFITDecoder(){return this.fitDecoder}getFITEncoder(){return this.fitEncoder}getTCXDecoder(){return this.tcxDecoder}getTCXEncoder(){return this.tcxEncoder}async destroy(){await this.gpxDecoder.destroy(),await this.fitDecoder.destroy(),await this.tcxDecoder.destroy(),await this.activityProcessor.destroy()}};var jI=q;0&&(module.exports={ActivityProcessor,ActivityToFITEncoder,ActivityToGPXEncoder,ActivityToTCXEncoder,BaseActivityConverter,BaseActivityEncoder,BaseActivityMiddleware,FITDecoder,FITEncoder,FITToActivityConverter,GPXDecoder,GPXEncoder,GPXToActivityConverter,PipelineStage,TCXDecoder,TCXEncoder,TCXToActivityConverter,TrackSwap,buildCourseMesgs,encodeCourse,registerDefaultMiddlewares});
|