@newrelic/video-videojs 4.1.2 → 4.2.1
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/CHANGELOG.md +62 -1
- package/README.md +170 -40
- package/dist/cjs/index.js +1 -1
- package/dist/cjs/index.js.LICENSE.txt +1 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/index.js.LICENSE.txt +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/umd/newrelic-video-videojs.min.js +1 -1
- package/dist/umd/newrelic-video-videojs.min.js.LICENSE.txt +1 -1
- package/dist/umd/newrelic-video-videojs.min.js.map +1 -1
- package/package.json +1 -1
- package/src/ads/media-tailor.js +126 -91
- package/src/ads/utils/mt-constants.js +2 -1
- package/src/ads/utils/mt.js +44 -22
- package/src/register-plugin.js +2 -2
- package/src/tracker.js +150 -16
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","mappings":";sFAAA,IAA6CA,EAA7CC,GAA6CD,EAA7CE,EAAA,OAA6CF,EAAAG,WAAAH,EAAA,CAAAI,QAAAJ,GAE9B,MAAMK,UAA4BC,EAAAA,QAC/C,cAAOC,CAASC,GACd,QAASA,EAAOC,iBAAiC,oBAAPC,IAAsBA,GAAGC,SACrE,CAEAC,cAAAA,GACE,MAAO,eACT,CAEAC,aAAAA,GACE,MAAO,eACT,CAEAC,gBAAAA,GACE,OAAOC,KAAKP,OAAOC,gBAAgBO,OACrC,CAEAC,WAAAA,GACE,GAAIF,KAAKP,OAAOU,IAAIC,GAAGC,YACrB,OAA0C,IAAnCL,KAAKP,OAAOU,IAAIC,GAAGC,aAE9B,CAEAC,WAAAA,GACE,GAAIN,KAAKP,OAAOU,IAAIC,GAAGG,SACrB,OAAqC,IAA9BP,KAAKP,OAAOU,IAAIC,GAAGG,QAE9B,CAEAC,UAAAA,GACE,OAAOR,KAAKP,OAAOU,IAAIC,GAAGK,EAC5B,CAEAC,YAAAA,GACE,MAAO,WACT,CAEAC,eAAAA,GACE,IACE,OAAOX,KAAKP,OAAOU,IAAIS,SAASC,MAAMC,WAAWC,6BAA6BC,OAChF,CAAE,MAAOC,GAAuB,CAClC,CAEAC,MAAAA,GACE,IAEE,OADUlB,KAAKP,OAAOU,IAAIS,SAASC,MAAMC,WAAWC,6BACzCI,mCAAmCC,QAChD,CAAE,MAAOH,GAAuB,CAClC,CAEAI,QAAAA,GACE,IAEE,OADUrB,KAAKP,OAAOU,IAAIS,SAASC,MAAMC,WAAWC,6BACzCI,mCAAmCG,SAChD,CAAE,MAAOL,GAAuB,CAClC,CAEAM,aAAAA,GACE,OAAQvB,KAAKP,OAAOU,IAAIC,GAAGoB,MACzB,IAAK,UACH,OAAOC,QAAQC,UAAUC,YAAYC,IACvC,IAAK,UACH,OAAOH,QAAQC,UAAUC,YAAYE,IACvC,IAAK,WACH,OAAOJ,QAAQC,UAAUC,YAAYG,KAE3C,EACDC,EAAAA,QAAAzC,kFCrED,IAAA0C,EAAAC,EAAA9C,EAAA,MACAD,EAAA+C,EAAA9C,EAAA,MAA6C,SAAA8C,EAAAhD,GAAA,OAAAA,GAAAA,EAAAG,WAAAH,EAAA,CAAAI,QAAAJ,EAAA,CAE9B,MAAMiD,UAAgC3C,EAAAA,QACnD,cAAOC,CAASC,GACd,QAASA,EAAO0C,IAClB,CAEAtC,cAAAA,GACE,MAAO,oBACT,CAEAC,aAAAA,GACE,MAAO,oBACT,CAEAI,WAAAA,GACE,OAAOF,KAAKP,QAAQ0C,MAAMC,UAAU/B,aACtC,CAEAgC,iBAAAA,GACEZ,EAAAA,QAAQa,IAAIC,uBAAuBvC,KAAKP,OAAQ,CAC9C,KACA,aACA,YACA,gBACA,eACA,gBACA,cACA,eACA,cACA,WACA,iBACA,eACA,YACA,WACA,YACA,kBACA,gBACA,0BAGFO,KAAKP,OAAO+C,GAAG,eAAgBxC,KAAKyC,UAAUC,KAAK1C,OACnDA,KAAKP,OAAO+C,GAAG,cAAexC,KAAK2C,SAASD,KAAK1C,OACjDA,KAAKP,OAAO+C,GAAG,eAAgBxC,KAAK4C,SAASF,KAAK1C,OAClDA,KAAKP,OAAO+C,GAAG,gBAAiBxC,KAAK6C,WAAWH,KAAK1C,OACrDA,KAAKP,OAAO+C,GAAG,eAAgBxC,KAAK8C,UAAUJ,KAAK1C,OACnDA,KAAKP,OAAO+C,GAAG,WAAYxC,KAAK+C,QAAQL,KAAK1C,OAC7CA,KAAKP,OAAO+C,GAAG,YAAaxC,KAAKgD,QAAQN,KAAK1C,MAChD,CAEAiD,mBAAAA,GACEjD,KAAKP,OAAOyD,IAAI,eAAgBlD,KAAKyC,WACrCzC,KAAKP,OAAOyD,IAAI,cAAelD,KAAK2C,UACpC3C,KAAKP,OAAOyD,IAAI,eAAgBlD,KAAK4C,UACrC5C,KAAKP,OAAOyD,IAAI,gBAAiBlD,KAAK6C,YACtC7C,KAAKP,OAAOyD,IAAI,eAAgBlD,KAAK8C,WACrC9C,KAAKP,OAAOyD,IAAI,WAAYlD,KAAK+C,SACjC/C,KAAKP,OAAOyD,IAAI,YAAalD,KAAKgD,QACpC,CAEAP,SAAAA,CAAWxD,GACTe,KAAKmD,cACLnD,KAAKoD,WACP,CAEAT,QAAAA,CAAU1D,GACRe,KAAKqD,WACP,CAEAT,QAAAA,CAAU3D,GACRe,KAAKsD,YACP,CAEAT,UAAAA,CAAY5D,GACVe,KAAKuD,SACP,CAEAT,SAAAA,CAAW7D,GACTe,KAAKuD,QAAQ,CAAEC,SAAS,GAC1B,CAEAT,OAAAA,CAAS9D,GACPe,KAAKyD,WACP,CAEAT,OAAAA,CAAS/D,GACPe,KAAK0D,WACP,EACD3B,EAAAA,QAAAG,iFCzFc,MAAMyB,EACnBC,WAAAA,CAAYC,GACV7D,KAAK6D,KAAOA,EAAKC,KACjB9D,KAAKP,OAASoE,EAAKE,KAAKtE,MAC1B,CAEAuE,WAAAA,CAAYH,GACV,OAAO7D,KAAK6D,KAAKI,GACnB,CAEAC,gBAAAA,CAAiBL,GACf,IACE,IAAIM,EAAQnE,KAAK6D,KAAKO,OAAOpE,KAAK6D,KAAKQ,cACvC,GAAIF,GAASA,EAAMG,KAAM,OAAOH,EAAMG,IACxC,CAAE,MAAOrD,GAAM,CACf,OAAO,IACT,CAEAsD,mBAAAA,CAAoBV,GAClB,IACE,IAAIM,EAAQnE,KAAK6D,KAAKO,OAAOpE,KAAK6D,KAAKQ,cACvC,GAAIF,GAASA,EAAMK,QAAS,OAAOC,KAAKC,MAAMP,EAAMK,QACtD,CAAE,MAAOvD,GAAM,CACf,OAAO,IACT,CAEA0D,iBAAAA,CAAkBd,GAChB,IACE,IAAIM,EAAQnE,KAAK6D,KAAKO,OAAOpE,KAAK6D,KAAKQ,cACvC,GAAIF,GAASA,EAAMS,MAAO,OAAOT,EAAMS,KACzC,CAAE,MAAO3D,GAAM,CACf,OAAO,IACT,CAEA4D,kBAAAA,CAAmBhB,GACjB,IACE,IAAIM,EAAQnE,KAAK6D,KAAKO,OAAOpE,KAAK6D,KAAKQ,cACvC,GAAIF,GAASA,EAAMW,OAAQ,OAAOX,EAAMW,MAC1C,CAAE,MAAO7D,GAAM,CACf,OAAO,IACT,CAEA8D,UAAAA,GAEE,OAAO/E,KAAKgF,2BACd,CAEAA,yBAAAA,GACE,IAEE,MAAMb,EAAQnE,KAAK6D,KAAKO,OAAOpE,KAAK6D,KAAKQ,cACzC,GAAIF,GAASA,EAAMK,QACjB,OAAOC,KAAKC,MAAMP,EAAMK,QAE5B,CAAE,MAAOvD,GAAM,CACf,OAAO,IACT,CAEAgE,kBAAAA,GACE,IAEE,GAAIjF,KAAK6D,KAAKO,QAAUpE,KAAK6D,KAAKO,OAAOc,OAAS,EAChD,OAAOT,KAAKC,MAAMD,KAAKU,OAAOnF,KAAK6D,KAAKO,OAAOgB,KAAIC,GAAKA,EAAEb,WAE9D,CAAE,MAAOvD,GAAM,CACf,OAAO,IACT,CAEAqE,yBAAAA,GACE,IAEE,GAAItF,KAAK6D,KAAK0B,OAASvF,KAAK6D,KAAK0B,MAAMC,UAAY,EACjD,OAAOf,KAAKC,MAAM1E,KAAK6D,KAAK0B,MAAMC,UACtC,CAAE,MAAOvE,GAAM,CACf,OAAO,IACT,CAEAwE,yBAAAA,GACE,OAAIzF,KAAK6D,KAAK6B,YAAc1F,KAAK6D,KAAK6B,WAAa,EAC1CjB,KAAKC,MAAM1E,KAAK6D,KAAK6B,YAEvB,IACT,EACD3D,EAAAA,QAAA4B,EAEDA,EAAMnE,QAAU,SAAUqE,GACxB,QAASA,EAAKC,IAChB,mFCtFA,IAAA9B,EAAAC,EAAA9C,EAAA,MACAD,EAAA+C,EAAA9C,EAAA,MAA8C,SAAA8C,EAAAhD,GAAA,OAAAA,GAAAA,EAAAG,WAAAH,EAAA,CAAAI,QAAAJ,EAAA,CAE/B,MAAM0G,UAAsBpG,EAAAA,QACzC,cAAOC,CAAQC,GACb,OAAOA,EAAOmG,KAAyB,oBAAXC,MAC9B,CAEAhG,cAAAA,GACE,MAAO,SACT,CAEAC,aAAAA,GACE,MAAO,KACT,CAEAC,gBAAAA,GACE,MACE,QAAU8F,OAAOD,IAAI3F,QAAU,kBAAoBD,KAAKP,OAAOU,IAAIF,OAEvE,CAEA6F,YAAAA,GACE,OAAO9F,KAAKP,OAAOmG,IAAIG,gBAAgBD,cACzC,CAEAvE,aAAAA,GACE,GACEvB,KAAKgG,YACLhG,KAAKgG,WAAWC,cACqBC,IAArClG,KAAKgG,WAAWC,QAAQE,SACxB,CACA,MAAMA,EAAWnG,KAAKgG,WAAWC,QAAQE,SAEzC,OAAiB,IAAbA,EACK,OACgB,IAAdA,EACF,OAEA,KAEX,CACA,OAAO,IACT,CAEA7F,WAAAA,GACE,OAAIN,KAAKgG,iBAA2CE,IAA7BlG,KAAKgG,WAAWzF,SACH,IAA3BP,KAAKgG,WAAWzF,SAElB,IACT,CAEAC,UAAAA,GACE,OAAIR,KAAKgG,YAAchG,KAAKgG,WAAWI,KAC9BpG,KAAKgG,WAAWI,KAElB,IACT,CAEAzF,eAAAA,GACE,OAAIX,KAAKgG,YAAchG,KAAKgG,WAAWK,WAC9BrG,KAAKgG,WAAWK,WAElB,IACT,CAEAnF,MAAAA,GACE,OAAIlB,KAAKgG,YAAchG,KAAKgG,WAAWM,SAC9BtG,KAAKgG,WAAWM,SAElB,IACT,CAEAjF,QAAAA,GACE,OAAIrB,KAAKgG,YAAchG,KAAKgG,WAAWO,MAC9BvG,KAAKgG,WAAWO,MAElB,IACT,CAEArG,WAAAA,GACE,IAAIsG,EAAUxG,KAAKP,OAAOmG,IAAIG,gBAC9B,GAAIS,EACF,OAA2D,KAAnDxG,KAAKM,cAAgBkG,EAAQC,mBAEzC,CAEAC,WAAAA,GACE,OAAO1G,KAAKP,OAAOkH,cACrB,CAEAjG,YAAAA,GACE,MAAO,KACT,CAEAkG,gBAAAA,GACE,MAAMC,EAAiB7G,KAAK8G,oBAC5B,GAAID,GAAkBA,EAAeE,4BAA6B,CAChE,IAAIvC,EACJ,GAAIxE,KAAKgH,qBAAuB,EAAG,CACjC,MACMC,EADUJ,EAAeE,4BACP/G,KAAKgH,qBACvBE,EAAUlH,KAAKmH,eAAiB,IACtC3C,EAAUC,KAAKC,MAAOuC,EAAQC,EAAW,EAC3C,CAGA,OADAlH,KAAKgH,qBAAuBH,EAAeE,4BACpCvC,GAAW,IACpB,CACA,OAAO,IACT,CAEAD,mBAAAA,GACE,OAAIvE,KAAKgG,YAAchG,KAAKgG,WAAWoB,iBAC9B3C,KAAKC,MAAM1E,KAAKgG,WAAWoB,kBAE7B,IACT,CAEA/E,iBAAAA,GAEE,IAAIpD,EAAI4G,OAAOD,IAAIyB,QAAQC,KACvBC,EAAW1B,OAAOD,IAAI4B,aAAaF,KAAKC,SAG5CvH,KAAKgG,WAAa,KAElBvE,EAAAA,QAAQa,IAAIC,uBAAuBvC,KAAKP,OAAOmG,IAAI6B,iBAAkB,CACnE,KACAxI,EAAEyI,kBACFzI,EAAE0I,eACF1I,EAAE2I,SACF3I,EAAE4I,WACF5I,EAAE6I,WACF7I,EAAE8I,wBACF9I,EAAE+I,yBACF/I,EAAEgJ,QACFhJ,EAAEiJ,wBACFjJ,EAAEkJ,OACFlJ,EAAEmJ,OACFnJ,EAAEoJ,QACFpJ,EAAEqJ,QACFrJ,EAAEsJ,YACFtJ,EAAEuJ,YACFvJ,EAAEwJ,iBACFxJ,EAAEyJ,eACFzJ,EAAE0J,IACF1J,EAAE2J,MACF3J,EAAE4J,eACF5J,EAAE6J,SACF7J,EAAE8J,eACFxB,IAIFvH,KAAKP,OAAOmG,IAAI6B,iBAAiBxI,EAAEkJ,OAAQnI,KAAKgJ,SAAStG,KAAK1C,OAC9DA,KAAKP,OAAOmG,IAAI6B,iBAAiBxI,EAAEqJ,QAAStI,KAAKiJ,QAAQvG,KAAK1C,OAC9DA,KAAKP,OAAOmG,IAAI6B,iBAAiBxI,EAAEmJ,OAAQpI,KAAK2C,SAASD,KAAK1C,OAC9DA,KAAKP,OAAOmG,IAAI6B,iBAAiBxI,EAAEoJ,QAASrI,KAAKkJ,UAAUxG,KAAK1C,OAChEA,KAAKP,OAAOmG,IAAI6B,iBAAiBxI,EAAE2I,SAAU5H,KAAK6C,WAAWH,KAAK1C,OAClEA,KAAKP,OAAOmG,IAAI6B,iBAAiBxI,EAAEgJ,QAASjI,KAAK8C,UAAUJ,KAAK1C,OAChEA,KAAKP,OAAOmG,IAAI6B,iBAAiBxI,EAAE2J,MAAO5I,KAAKgD,QAAQN,KAAK1C,OAC5DA,KAAKP,OAAOmG,IAAI6B,iBACdxI,EAAE4J,eACF7I,KAAKmJ,gBAAgBzG,KAAK1C,OAE5BA,KAAKP,OAAOmG,IAAI6B,iBAAiBxI,EAAE6J,SAAU9I,KAAKoJ,WAAW1G,KAAK1C,OAClEA,KAAKP,OAAOmG,IAAI6B,iBACdxI,EAAE8J,eACF/I,KAAKqJ,gBAAgB3G,KAAK1C,OAE5BA,KAAKP,OAAOmG,IAAI6B,iBAAiBF,EAAUvH,KAAK+C,QAAQL,KAAK1C,MAC/D,CAEAiD,mBAAAA,GAEE,IAAIhE,EAAI4G,OAAOD,IAAIyB,QAAQC,KACvBC,EAAW1B,OAAOD,IAAI4B,aAAaF,KAAKC,SAG5CvH,KAAKP,OAAOmG,IAAI0D,oBAAoBrK,EAAEkJ,OAAQnI,KAAKgJ,UACnDhJ,KAAKP,OAAOmG,IAAI0D,oBAAoBrK,EAAEqJ,QAAStI,KAAKgJ,SAAStG,KAAK1C,OAClEA,KAAKP,OAAOmG,IAAI0D,oBAAoBrK,EAAE6I,WAAY9H,KAAKuJ,cACvDvJ,KAAKP,OAAOmG,IAAI0D,oBAAoBrK,EAAEmJ,OAAQpI,KAAK2C,UACnD3C,KAAKP,OAAOmG,IAAI0D,oBAAoBrK,EAAEoJ,QAASrI,KAAKkJ,WACpDlJ,KAAKP,OAAOmG,IAAI0D,oBAAoBrK,EAAE2I,SAAU5H,KAAK6C,YACrD7C,KAAKP,OAAOmG,IAAI0D,oBAAoBrK,EAAEgJ,QAASjI,KAAK8C,WACpD9C,KAAKP,OAAOmG,IAAI0D,oBAAoBrK,EAAE2J,MAAO5I,KAAKgD,SAClDhD,KAAKP,OAAOmG,IAAI0D,oBAAoBrK,EAAE4J,eAAgB7I,KAAKmJ,iBAC3DnJ,KAAKP,OAAOmG,IAAI0D,oBAAoBrK,EAAE6J,SAAU9I,KAAKoJ,YACrDpJ,KAAKP,OAAOmG,IAAI0D,oBAAoBrK,EAAE8J,eAAgB/I,KAAKqJ,iBAC3DrJ,KAAKP,OAAOmG,IAAI0D,oBAAoB/B,EAAUvH,KAAK+C,SAEnD/C,KAAKgG,WAAa,IACpB,CAEAgD,QAAAA,CAAS/J,GACPe,KAAKgG,WAAahG,KAAKwJ,YACvBxJ,KAAKmD,aACP,CAEA8F,OAAAA,CAAQhK,GACNe,KAAKgG,WAAahG,KAAKwJ,YACvBxJ,KAAKgH,qBAAuB,EAC5BhH,KAAKoD,WACP,CAEAP,UAAAA,CAAW5D,GACTe,KAAKuD,UACLvD,KAAKgG,WAAa,IACpB,CAEAlD,SAAAA,CAAU7D,GACRe,KAAKuD,QAAQ,CAAEC,SAAS,IACxBxD,KAAKgG,WAAa,IACpB,CAEAjD,OAAAA,CAAQ9D,GACN,MAAMwK,EAAUxK,EAAEyK,WAEZC,EAAYF,EAAQG,eACpBC,EAAeJ,EAAQK,aAC7B9J,KAAKyD,UAAU,CAAEgG,UAASE,YAAWE,gBACvC,CAEA7G,OAAAA,CAAQ/D,GACNe,KAAK+J,aACP,CAEAZ,eAAAA,GACEnJ,KAAKgK,eAAe,CAAEC,WAAY,GACpC,CAEAb,UAAAA,GACEpJ,KAAKgK,eAAe,CAAEC,WAAY,GACpC,CAEAZ,eAAAA,GACErJ,KAAKgK,eAAe,CAAEC,WAAY,GACpC,CAEAtH,QAAAA,GACE3C,KAAKqD,WACP,CAEA6F,SAAAA,GACElJ,KAAKsD,YACP,CAEAkG,SAAAA,GACE,IACE,MAAMU,EAAalK,KAAKP,OAAOmG,IAAIG,gBACnC,GAAImE,EAAY,CACd,MAAMC,EAAYD,EAAWE,eAC7B,GAAID,EACF,MAAO,CACL/D,KAAM+D,EAAUE,UAChBhE,WAAY8D,EAAUG,gBACtB/J,SAAU4J,EAAU7J,cACpBgG,SAAU6D,EAAUI,cACpBhE,MAAO4D,EAAU9I,WACjB4E,QAASkE,EAAUK,gBAAgBC,KACnCrD,iBAAkB+C,EAAUO,sBAIlC,CACA,OAAO,IACT,CAAE,MAAOzJ,GACP,OAAO,IACT,CACF,CAEA6F,iBAAAA,GACE,GAAI9G,KAAKP,OAAOmG,KAAO5F,KAAKP,OAAOmG,IAAI+E,YAAc3K,KAAKP,OAAOmG,IAAI+E,WAAWC,KAAM,CACpF,MAAMC,EAAiB7K,KAAKP,OAAOmG,IAAI+E,WAAWC,KAAKC,eACvD,GAAIA,EAAgB,CAClB,MAAMhE,EAAiBgE,EAAeC,cAAc,SACpD,GAAIjE,EACF,OAAOA,CAEX,CACF,CACF,EACD9E,EAAAA,QAAA4D,wzBC7RD,IAAA3D,EAAAC,EAAA9C,EAAA,MACA4L,EAAA9I,EAAA9C,EAAA,MACA6L,EAAA/I,EAAA9C,EAAA,MACA8L,EAAAhJ,EAAA9C,EAAA,MACA+L,EAAAjJ,EAAA9C,EAAA,MACAD,EAAA+C,EAAA9C,EAAA,MACAgM,EAAAlJ,EAAA9C,EAAA,MACAiM,EAAAnJ,EAAA9C,EAAA,KACAkM,EAAApJ,EAAA9C,EAAA,KACAmM,EAAArJ,EAAA9C,EAAA,MACAoM,EAAAtJ,EAAA9C,EAAA,MAAuD,SAAA8C,EAAAhD,GAAA,OAAAA,GAAAA,EAAAG,WAAAH,EAAA,CAAAI,QAAAJ,EAAA,CAExC,MAAMuM,UAAuB/J,EAAAA,QAAQgK,aAClD7H,WAAAA,CAAYnE,EAAQiM,GAClBC,MAAMlM,EAAQiM,GACd1L,KAAK0L,QAAUA,EACf1L,KAAK4L,cAAe,EACpB5L,KAAK6L,eAAiB,GACtB7L,KAAK8L,gBAAiB,EACtBrK,EAAAA,QAAQsK,KAAKC,WAAWhM,KAAM0L,EAChC,CAEAO,OAAAA,GACE,IAAIpI,EAAO7D,KAAKP,OAAOoE,KAAK,CAAEqI,0BAA0B,IAExD,GAAIrI,EAAM,CACR,GAAIsI,EAAAA,QAAe3M,QAAQqE,GACzB,OAAO,IAAIsI,EAAAA,QAAetI,GACrB,GAAIuI,EAAAA,QAAU5M,QAAQqE,GAC3B,OAAO,IAAIuI,EAAAA,QAAUvI,GAChB,GAAIwI,EAAAA,QAAU7M,QAAQqE,GAC3B,OAAO,IAAIwI,EAAAA,QAAUxI,EAEzB,CACF,CAEAhE,cAAAA,GACE,MAAO,SACT,CAEAyM,0BAAAA,GACE,MAAO,WACT,CAEAC,sBAAAA,GACE,OAAOvM,KAAKF,eACd,CAEA0M,yBAAAA,GACE,OAAOxM,KAAKD,kBACd,CAEA0M,iBAAAA,GACE,OAAOC,EAAAA,QAAIC,OACb,CAEAzM,WAAAA,GACE,OACEF,KAAKP,OAAOU,KACc,iBAA1BH,KAAKP,OAAOU,IAAIyM,OAChB5M,KAAKP,OAAOU,IAAI0M,UAChB7M,KAAKP,OAAOU,IAAI0M,SAASxM,YAEqB,IAAvCL,KAAKP,OAAOU,IAAI0M,SAASxM,YACvBL,KAAKP,OAAOqN,aACe,IAA7B9M,KAAKP,OAAOqN,eAEgB,IAA5B9M,KAAKP,OAAOY,aAEvB,CAEAC,WAAAA,GACE,OACEN,KAAKP,OAAOsN,gBAC8B,IAAnC/M,KAAKP,OAAOsN,UAAUxM,SAEW,IAAjCP,KAAKP,OAAOsN,UAAUxM,SAEG,IAAzBP,KAAKP,OAAOc,UAEvB,CAEAc,QAAAA,GACE,OAAOrB,KAAKP,QAAQsN,WAAWzI,IACjC,CAEAtD,KAAAA,GACE,OAAOhB,KAAKP,QAAQsN,WAAWtM,EACjC,CAEAuM,WAAAA,GACE,OAAOhN,KAAKP,QAAQwN,UACtB,CAEA/L,MAAAA,GACE,IAAI2C,EAAO7D,KAAKiM,UAChB,OAAIpI,GAAQA,EAAK3C,OACR2C,EAAK3C,SAELlB,KAAKP,OAAOyN,YAEvB,CAEApN,aAAAA,GACE,OAAOE,KAAKP,QAAQ6E,QAAU,SAChC,CAEAvE,gBAAAA,GACE,OAAOC,KAAKP,QAAQkN,SAAWQ,QAAQlN,OACzC,CAEAmN,OAAAA,GACE,OAAOpN,KAAKP,OAAO4N,OACrB,CAEAtI,UAAAA,GACE,OAAO/E,KAAKgF,2BACd,CAGAA,yBAAAA,GACE,IACE,MAAMnB,EAAO7D,KAAKP,OAAOoE,KAAK,CAAEqI,0BAA0B,IAG1D,GAAIrI,GAAMyJ,KAAKC,WAAWC,QAAS,CACjC,MAAMC,EAAiB5J,EAAKyJ,IAAIC,UAAUC,QAEpChJ,EAAUiJ,EAAeC,WAAW,sBACxCD,EAAeC,WAAWC,WAC1B,KACF,OAAmB,OAAZnJ,EAAmBC,KAAKC,MAAMF,GAAW,IAClD,CAGA,MAAMoJ,EAAc5N,KAAKiM,UACzB,GAAI2B,GAAa7I,WAAY,CAC3B,MAAMP,EAAUoJ,EAAY7I,aAC5B,OAAmB,OAAZP,EAAmBC,KAAKC,MAAMF,GAAW,IAClD,CACF,CAAE,MAAOvD,GACP,CAEF,OAAO,IACT,CAEAiD,gBAAAA,GACE,IAAIL,EAAO7D,KAAKiM,UAChB,GAAIpI,GAAQA,EAAKK,iBACf,OAAOL,EAAKK,kBAEhB,CAEAe,kBAAAA,GACE,IACE,MAAMpB,EAAO7D,KAAKP,OAAOoE,KAAK,CAAEqI,0BAA0B,IAEpD2B,EAAgBhK,GAAMyJ,KAAKC,WAAWO,QAAQP,UAEpD,GAAIM,GAAiBA,EAAc3I,OAAS,EAAG,CAE7C,MAAM6I,EAAatJ,KAAKU,OACnB0I,EAAczI,KAAK4I,GAAMA,EAAEN,WAAWC,WAAa,KAExD,OAAOI,EAAa,EAAItJ,KAAKC,MAAMqJ,GAAc,IACnD,CAGA,MAAMH,EAAc5N,KAAKiM,UACzB,GAAI2B,GAAa3I,mBAAoB,CACnC,MAAMT,EAAUoJ,EAAY3I,qBAC5B,OAAmB,OAAZT,EAAmBC,KAAKC,MAAMF,GAAW,IAClD,CACF,CAAE,MAAOvF,GACP,CAEF,OAAO,IACT,CAEAqG,yBAAAA,GACE,IACE,MAAMzB,EAAO7D,KAAKP,OAAOoE,KAAK,CAAEqI,0BAA0B,IAG1D,GAAIrI,GAAMyJ,KAAK/H,OAAOC,WAAa3B,EAAKyJ,IAAI/H,MAAMC,UAAY,EAC5D,OAAOf,KAAKC,MAAMb,EAAKyJ,IAAI/H,MAAMC,WAInC,MAAMoI,EAAc5N,KAAKiM,UACzB,GAAI2B,GAAatI,0BAA2B,CAC1C,MAAMd,EAAUoJ,EAAYtI,4BAC5B,OAAmB,OAAZd,EAAmBC,KAAKC,MAAMF,GAAW,IAClD,CACF,CAAE,MAAOvD,GACP,CAEF,OAAO,IACT,CAEAwE,yBAAAA,GACE,MAAM5B,EAAO7D,KAAKP,OAAOoE,KAAK,CAAEqI,0BAA0B,IAE1D,GAAIrI,GAAMyJ,KAAK5H,YAAc7B,EAAKyJ,IAAI5H,WAAa,EACjD,OAAOjB,KAAKC,MAAMb,EAAKyJ,IAAI5H,YAI7B,MAAMkI,EAAc5N,KAAKiM,UACzB,GAAI2B,GAAanI,0BAA2B,CAC1C,MAAMjB,EAAUoJ,EAAYnI,4BAC5B,OAAmB,OAAZjB,EAAmBC,KAAKC,MAAMF,GAAW,IAClD,CAEA,OAAO,IACT,CAEAK,kBAAAA,GACE,IAAIhB,EAAO7D,KAAKiM,UAEhB,OAAIpI,GAAQA,EAAKgB,mBACRhB,EAAKgB,qBAEP7E,KAAKP,OAAOwO,aACrB,CAEAtJ,iBAAAA,GACE,IAAId,EAAO7D,KAAKiM,UAChB,OAAIpI,GAAQA,EAAKc,kBACRd,EAAKc,oBAEP3E,KAAKP,OAAOyO,YACrB,CAEAxH,WAAAA,GACE,OAAO1G,KAAKP,OAAOkH,cACrB,CAEAwH,YAAAA,GACE,OAAOnO,KAAKP,OAAO2O,UACrB,CAEAC,YAAAA,GACE,OAAOrO,KAAKP,OAAO4O,cACrB,CAEAC,UAAAA,GACE,OAAOtO,KAAKP,OAAO8O,SACrB,CAEAlM,iBAAAA,GACEZ,EAAAA,QAAQa,IAAIC,uBAAuBvC,KAAKP,OAAQ,CAC9C,UACA,QACA,SACA,WACA,WACA,YAIFO,KAAKwO,WAAaxO,KAAKwO,WAAW9L,KAAK1C,MACvCA,KAAKyO,WAAazO,KAAKyO,WAAW/L,KAAK1C,MACvCA,KAAK0O,UAAY1O,KAAK0O,UAAUhM,KAAK1C,MACrCA,KAAK2O,QAAU3O,KAAK2O,QAAQjM,KAAK1C,MACjCA,KAAK4O,OAAS5O,KAAK4O,OAAOlM,KAAK1C,MAC/BA,KAAK6O,QAAU7O,KAAK6O,QAAQnM,KAAK1C,MACjCA,KAAK8O,UAAY9O,KAAK8O,UAAUpM,KAAK1C,MACrCA,KAAK+O,QAAU/O,KAAK+O,QAAQrM,KAAK1C,MACjCA,KAAKgP,QAAUhP,KAAKgP,QAAQtM,KAAK1C,MACjCA,KAAKiP,UAAYjP,KAAKiP,UAAUvM,KAAK1C,MACrCA,KAAKkP,UAAYlP,KAAKkP,UAAUxM,KAAK1C,MACrCA,KAAKmP,SAAWnP,KAAKmP,SAASzM,KAAK1C,MACnCA,KAAK+C,QAAU/C,KAAK+C,QAAQL,KAAK1C,MACjCA,KAAKoP,UAAYpP,KAAKoP,UAAU1M,KAAK1C,MACrCA,KAAKqP,aAAerP,KAAKqP,aAAa3M,KAAK1C,MAC3CA,KAAKsP,sBAAwBtP,KAAKsP,sBAAsB5M,KAAK1C,MAC7DA,KAAKuP,gBAAkBvP,KAAKuP,gBAAgB7M,KAAK1C,MAEjDA,KAAKP,OAAO+C,GAAG,YAAaxC,KAAKwO,YACjCxO,KAAKP,OAAO+C,GAAG,aAAcxC,KAAKwO,YAClCxO,KAAKP,OAAO+C,GAAG,iBAAkBxC,KAAKwO,YACtCxO,KAAKP,OAAO+C,GAAG,WAAYxC,KAAKyO,YAChCzO,KAAKP,OAAO+C,GAAG,UAAWxC,KAAK0O,WAC/B1O,KAAKP,OAAO+C,GAAG,QAASxC,KAAK2O,SAC7B3O,KAAKP,OAAO+C,GAAG,OAAQxC,KAAK4O,QAC5B5O,KAAKP,OAAO+C,GAAG,QAASxC,KAAK6O,SAC7B7O,KAAKP,OAAO+C,GAAG,UAAWxC,KAAK8O,WAC/B9O,KAAKP,OAAO+C,GAAG,QAASxC,KAAK+O,SAC7B/O,KAAKP,OAAO+C,GAAG,QAASxC,KAAKgP,SAC7BhP,KAAKP,OAAO+C,GAAG,UAAWxC,KAAKiP,WAC/BjP,KAAKP,OAAO+C,GAAG,UAAWxC,KAAKkP,WAC/BlP,KAAKP,OAAO+C,GAAG,SAAUxC,KAAKmP,UAC9BnP,KAAKP,OAAO+C,GAAG,QAASxC,KAAK+C,SAC7B/C,KAAKP,OAAO+C,GAAG,UAAWxC,KAAKoP,WAC/BpP,KAAKP,OAAO+C,GAAG,aAAcxC,KAAKqP,cAClCrP,KAAKP,OAAO+C,GAAG,wBAAyBxC,KAAKsP,uBAC7CtP,KAAKP,OAAO+C,GAAG,iBAAkBxC,KAAKuP,gBACxC,CAEAtM,mBAAAA,GACEjD,KAAKP,OAAOyD,IAAI,YAAalD,KAAKwO,YAClCxO,KAAKP,OAAOyD,IAAI,aAAclD,KAAKwO,YACnCxO,KAAKP,OAAOyD,IAAI,iBAAkBlD,KAAKwO,YACvCxO,KAAKP,OAAOyD,IAAI,WAAYlD,KAAKyO,YACjCzO,KAAKP,OAAOyD,IAAI,UAAWlD,KAAK0O,WAChC1O,KAAKP,OAAOyD,IAAI,QAASlD,KAAK2O,SAC9B3O,KAAKP,OAAOyD,IAAI,OAAQlD,KAAK4O,QAC7B5O,KAAKP,OAAOyD,IAAI,QAASlD,KAAK6O,SAC9B7O,KAAKP,OAAOyD,IAAI,UAAWlD,KAAK8O,WAChC9O,KAAKP,OAAOyD,IAAI,QAASlD,KAAK+O,SAC9B/O,KAAKP,OAAOyD,IAAI,QAASlD,KAAKgP,SAC9BhP,KAAKP,OAAOyD,IAAI,UAAWlD,KAAKiP,WAChCjP,KAAKP,OAAOyD,IAAI,UAAWlD,KAAKkP,WAChClP,KAAKP,OAAOyD,IAAI,SAAUlD,KAAKmP,UAC/BnP,KAAKP,OAAOyD,IAAI,QAASlD,KAAK+C,SAC9B/C,KAAKP,OAAOyD,IAAI,UAAWlD,KAAKoP,WAChCpP,KAAKP,OAAOyD,IAAI,aAAclD,KAAKqP,cACnCrP,KAAKP,OAAOyD,IAAI,wBAAyBlD,KAAKsP,uBAC9CtP,KAAKP,OAAOyD,IAAI,iBAAkBlD,KAAKuP,gBACzC,CAEAf,UAAAA,CAAWvP,GACTe,KAAKwP,aAAa,CAAE5C,MAAO3N,EAAEuC,QAK1BxB,KAAKyP,YACK,cAAXxQ,EAAEuC,MACFkO,EAAAA,QAAsBlQ,QAAQQ,KAAKP,UAEnCkQ,QAAQC,IACN,oEAEF5P,KAAK6P,cAAc,IAAIH,EAAAA,QAAsB1P,KAAKP,OAAQO,KAAK0L,UAE/D1L,KAAKyP,WAAWK,SAAQ,GAE5B,CAGAP,eAAAA,CAAgB1O,GACd,IAAKb,KAAKyP,YAAc5O,EAAMkP,cAAe,CAC3C,MAAMC,EAAa,IAAIC,EAAAA,QAAcjQ,KAAKP,QAC1CuQ,EAAWE,iBAAiBrP,EAAMkP,eAClC/P,KAAK6P,cAAcG,EACrB,CACF,CAGAvB,UAAAA,GACOzO,KAAKyP,aACJvN,EAAAA,QAAwB1C,QAAQQ,KAAKP,QAEvCO,KAAK6P,cAAc,IAAI3N,EAAAA,QAAwBlC,KAAKP,SAC3CkG,EAAAA,QAAcnG,QAAQQ,KAAKP,QAEpCO,KAAK6P,cAAc,IAAIlK,EAAAA,QAAc3F,KAAKP,SACjCH,EAAAA,QAAoBE,QAAQQ,KAAKP,QAG1CO,KAAK6P,cAAc,IAAIvQ,EAAAA,QAAoBU,KAAKP,SAIhDO,KAAK6P,cAAc,IAAItQ,EAAAA,QAAkBS,KAAKP,SAGpD,CAEAiP,SAAAA,GACE1O,KAAKmQ,kBAAmB,EAGnBnQ,KAAK6L,iBACR7L,KAAK6L,eAAiB7L,KAAKP,QAAQmG,KAAKG,gBAAgBD,eAE5D,CACA6I,OAAAA,GACM3O,KAAK4L,cACP5L,KAAKuD,SAET,CAEA+L,qBAAAA,GACEtP,KAAKgP,QAAQtM,KAAK1C,MAClBA,KAAKoQ,uBAAwB,CAC/B,CAMAC,kBAAAA,GACE,OAAOrQ,KAAKyP,YAAczP,KAAKyP,WAAWa,MAAQtQ,KAAKyP,WAAWa,MACpE,CAEA1B,MAAAA,GACE5O,KAAKmD,aACP,CAEA0L,OAAAA,GAEM7O,KAAKqQ,sBAILrQ,KAAKP,OAAO8Q,SAGhBvQ,KAAKqD,WACP,CAEAyL,SAAAA,GAEM9O,KAAKqQ,uBAGTrQ,KAAKsD,aACLtD,KAAKwQ,gBACP,CAEAzB,OAAAA,GACE/O,KAAKuD,SACP,CAEAyL,OAAAA,GACMhP,KAAKyP,YACPzP,KAAK4L,cAAe,EAChB5L,KAAK6L,iBAAmB7L,KAAK6L,eAAe4E,UAAU,IACxDzQ,KAAKuD,WAGPvD,KAAKuD,SAET,CAEA0L,SAAAA,GACEjP,KAAKuD,SACP,CAEA2L,SAAAA,GAEMlP,KAAKqQ,sBAGTrQ,KAAK0Q,eACP,CAEAvB,QAAAA,GAEMnP,KAAKqQ,sBAGTrQ,KAAK2Q,aACP,CAEA5N,OAAAA,GACE,MAAM6N,EAAQ5Q,KAAKP,OAAOmR,QAEpBjH,EAAYiH,EAAMC,KAClBhH,EAAe+G,EAAME,QACvB9Q,KAAKP,OAAOmR,OAAS5Q,KAAKP,OAAOmR,SACnC5Q,KAAKyD,UAAU,CAAEkG,YAAWE,gBAEhC,CAEAuF,SAAAA,CAAUnQ,GAEJe,KAAKqQ,sBAGTrQ,KAAK+Q,iBACP,CAEA1B,YAAAA,CAAapQ,GACPe,KAAKE,cAAgB,IACvBF,KAAKoD,WAET,EAGFrB,EAAAA,QAAAyJ,kuBCzd0BzJ,EAAAA,cAAG,mCACGA,EAAAA,oBAAG,uBACbA,EAAAA,UAAG,2BAKIA,EAAAA,iBAAG,oBACQA,EAAAA,4BAAG,gCACJA,EAAAA,2BAAG,yBACJA,EAAAA,0BAAG,8BACIA,EAAAA,iCAAG,gCACZA,EAAAA,wBAAG,yCAGJA,EAAAA,uBAAG,QACFA,EAAAA,wBAAG,OACHA,EAAAA,wBAAG,gBACRA,EAAAA,mBAAG,iBACJA,EAAAA,kBAAG,gBACIA,EAAAA,yBAAG,WACbA,EAAAA,eAAG,IACGA,EAAAA,qBAAG,SACUA,EAAAA,kCAC5C,yEACwBA,EAAAA,cAAG,gCAGEA,EAAAA,mBAAG,uBAEEA,EAAAA,wBAAG,IACGA,EAAAA,8BAAG,IAEjBA,EAAAA,gBAAG,GACCA,EAAAA,oBAAG,GACCA,EAAAA,wBAAG,IAGfA,EAAAA,YAAG,CACzBiP,IAAK,MACLC,KAAM,QAIkBlP,EAAAA,cAAG,CAC3BmP,IAAK,MACLC,KAAM,QAIgBpP,EAAAA,YAAG,CACzBqP,SAAU,MACVC,SAAU,MACVC,UAAW,QAISvP,EAAAA,UAAG,CACvBwP,aAAc,eACdC,kBAAmB,oBACnBC,aAAc,eACdC,sBAAuB,oBACvBC,UAAW,YACXC,kBAAmB,qBAIC7P,EAAAA,UAAG,CACvB8P,GAAI,IACJC,GAAI,GACJC,GAAI,qwDChFS,MAAM1F,EACnBzI,WAAAA,CAAYC,GACV7D,KAAK6D,KAAOA,EAAKmO,YACjBhS,KAAKP,OAASoE,EAAKE,KAAKtE,MAC1B,CAEAyB,MAAAA,CAAO2C,GACL,IACE,OAAO7D,KAAK6D,KAAKoO,gBACnB,CAAE,MAAOhR,GAAM,CACf,OAAO,IACT,CAEAsD,mBAAAA,CAAoBV,GAClB,IACE,MAAMW,EAAUxE,KAAK6D,KAAKqO,WAAWC,gBACrC,OAAO3N,EAAUC,KAAKC,MAAMF,GAAW,IACzC,CAAE,MAAOvD,GAAM,CACf,OAAO,IACT,CAEAgE,kBAAAA,GACE,IAEE,MAAMmN,EAASpS,KAAK6D,KAAKwO,mBACzB,GAAID,GAAUA,EAAOlN,OAAS,EAC5B,OAAOT,KAAKC,MAAMD,KAAKU,OAClBiN,EAAOhN,KAAKkN,GAAMA,EAAEC,gBAAkBD,EAAEE,gBAAkB,MAGnE,CAAE,MAAOvR,GAAM,CACf,OAAO,IACT,CAEA0D,iBAAAA,CAAkBd,GAChB,IACE,IAAIuO,EAASpS,KAAK6D,KAAKwO,mBACvB,IAAK,IAAII,KAAKL,EAAQ,CACpB,IAAIM,EAAQN,EAAOK,GACnB,GAAIC,EAAMC,QAAyB,UAAfD,EAAMlR,KACxB,OAAOkR,EAAM9N,KAEjB,CACF,CAAE,MAAO3D,GAAM,CACf,OAAO,IACT,CAEA4D,kBAAAA,CAAmBhB,GACjB,IACE,IAAIuO,EAASpS,KAAK6D,KAAKwO,mBACvB,IAAK,IAAII,KAAKL,EAAQ,CACpB,IAAIM,EAAQN,EAAOK,GACnB,GAAIC,EAAMC,QAAyB,UAAfD,EAAMlR,KACxB,OAAOkR,EAAM5N,MAEjB,CACF,CAAE,MAAO7D,GAAM,CACf,OAAO,IACT,CAEA8D,UAAAA,GAEE,OAAO/E,KAAKgF,2BACd,CAEAA,yBAAAA,GACE,IAEE,IAAIO,EAAQvF,KAAK6D,KAAKqO,WACtB,GAAI3M,GAASA,EAAM4M,iBAAmB5M,EAAM4M,gBAAkB,EAC5D,OAAO1N,KAAKC,MAAMa,EAAM4M,gBAE5B,CAAE,MAAOlR,GAAM,CACf,OAAO,IACT,CAEAqE,yBAAAA,GACE,IAEE,IAAIC,EAAQvF,KAAK6D,KAAKqO,WACtB,GAAI3M,GAASA,EAAMqN,mBAAqB,EACtC,OAAOnO,KAAKC,MAAMa,EAAMqN,mBAE5B,CAAE,MAAO3R,GAAM,CACf,OAAO,IACT,CAEAwE,yBAAAA,GACE,IAEE,IAAIF,EAAQvF,KAAK6D,KAAKqO,WACtB,GAAI3M,GAASA,EAAMqN,mBAAqB,EACtC,OAAOnO,KAAKC,MAAMa,EAAMqN,mBAE5B,CAAE,MAAO3R,GAAM,CACf,OAAO,IACT,EACDc,EAAAA,QAAAsK,EAEDA,EAAU7M,QAAU,SAAUqE,GAC5B,QAASA,EAAKmO,WAChB,iFCrGe,MAAM7F,EACnBvI,WAAAA,CAAYC,GACV7D,KAAK6D,KAAOA,EAAKyJ,IACjBtN,KAAKP,OAASoE,EAAKE,KAAKtE,MAC1B,CAEAyE,gBAAAA,GACE,IACE,IAAIsJ,EAAQxN,KAAK6D,KAAK0J,UAAUC,QAChC,GAAIA,GAASA,EAAME,WAAY,OAAOF,EAAME,WAAWmF,IACzD,CAAE,MAAO5R,GAAM,CACf,OAAO,IACT,CAEAsD,mBAAAA,GACE,IACE,IAAIiJ,EAAQxN,KAAK6D,KAAK0J,UAAUC,QAChC,GAAIA,GAASA,EAAME,WAAY,OAAOjJ,KAAKC,MAAM8I,EAAME,WAAWC,UACpE,CAAE,MAAO1M,GAAM,CACf,OAAO,IACT,CAEA0D,iBAAAA,GACE,IACE,IAAI6I,EAAQxN,KAAK6D,KAAK0J,UAAUC,QAChC,GAAIA,GAASA,EAAME,YAAcF,EAAME,WAAWoF,WAChD,OAAOtF,EAAME,WAAWoF,WAAWlO,KAEvC,CAAE,MAAO3D,GAAM,CACf,OAAO,IACT,CAEA4D,kBAAAA,GACE,IACE,IAAI2I,EAAQxN,KAAK6D,KAAK0J,UAAUC,QAChC,GAAIA,GAASA,EAAME,YAAcF,EAAME,WAAWoF,WAChD,OAAOtF,EAAME,WAAWoF,WAAWhO,MAEvC,CAAE,MAAO7D,GAAM,CACf,OAAO,IACT,CAEA8D,UAAAA,GAEE,OAAO/E,KAAKgF,2BACd,CAEAC,kBAAAA,GACE,IAEE,MAAMsI,EAAYvN,KAAK6D,KAAK0J,UAAUO,OAAOP,UAC7C,GAAIA,GAAaA,EAAUrI,OAAS,EAClC,OAAOT,KAAKC,MAAMD,KAAKU,OAAOoI,EAAUnI,KAAK4I,GAAMA,EAAEN,WAAWC,aAEpE,CAAE,MAAO1M,GAAM,CACf,OAAO,IACT,CAEAqE,yBAAAA,GACE,YACiCY,IAA/BlG,KAAK6D,KAAK0B,OAAOC,WACjBxF,KAAK6D,KAAK0B,MAAMC,UAAY,EAErBf,KAAKC,MAAM1E,KAAK6D,KAAK0B,MAAMC,WAE7B,IACT,CAEAC,yBAAAA,GACE,YAA6BS,IAAzBlG,KAAK6D,KAAK6B,YAA4B1F,KAAK6D,KAAK6B,WAAa,EACxDjB,KAAKC,MAAM1E,KAAK6D,KAAK6B,YAEvB,IACT,CAEAV,yBAAAA,GACE,IAEE,MAAMwI,EAAQxN,KAAK6D,KAAK0J,UAAUC,QAClC,GAAIA,GAASA,EAAME,WAAY,CAE7B,MAAMlJ,EAAUgJ,EAAME,WAAW,sBAC/BF,EAAME,WAAWC,WACjB,KACF,OAAmB,OAAZnJ,EAAmBC,KAAKC,MAAMF,GAAW,IAClD,CACF,CAAE,MAAOvD,GAAM,CACf,OAAO,IACT,EACDc,EAAAA,QAAAoK,EAEDA,EAAe3M,QAAU,SAAUqE,GACjC,QAASA,EAAKyJ,GAChB,mFC7FA,IAAAtL,EAAAC,EAAA9C,EAAA,MACA4L,EAAA9I,EAAA9C,EAAA,MACA6L,EAAA/I,EAAA9C,EAAA,MACA8L,EAAAhJ,EAAA9C,EAAA,MACA+L,EAAAjJ,EAAA9C,EAAA,MAAuC,SAAA8C,EAAAhD,GAAA,OAAAA,GAAAA,EAAAG,WAAAH,EAAA,CAAAI,QAAAJ,EAAA,CAExB,MAAMM,UAA0BkC,EAAAA,QAAQgK,aAErDQ,OAAAA,GACI,MAAMpI,EAAO7D,KAAKP,OAAOoE,KAAK,CAAEqI,0BAA0B,IAE1D,GAAIrI,EAAM,CACR,GAAIsI,EAAAA,QAAe3M,QAAQqE,GACzB,OAAO,IAAIsI,EAAAA,QAAetI,GACrB,GAAIuI,EAAAA,QAAU5M,QAAQqE,GAC3B,OAAO,IAAIuI,EAAAA,QAAUvI,GAChB,GAAIwI,EAAAA,QAAU7M,QAAQqE,GAC3B,OAAO,IAAIwI,EAAAA,QAAUxI,EAEzB,CACF,CAEFhE,cAAAA,GACE,MAAO,aACT,CAEA4M,iBAAAA,GACE,OAAOC,EAAAA,QAAIC,OACb,CAEAS,OAAAA,GACE,OAAOpN,KAAKP,OAAO4N,OACrB,CAEAxI,kBAAAA,GACE,OAAO,IACT,CAEAF,iBAAAA,GACE,OAAO,IACT,CAEA7E,aAAAA,GACE,MAAO,aACT,CAEAC,gBAAAA,GACE,OAAOC,KAAKP,OAAOU,IAAIF,OACzB,CAEAoC,iBAAAA,GACEZ,EAAAA,QAAQa,IAAIC,uBAAuBvC,KAAKP,OAAQ,CAC9C,KACA,cACA,WACA,UACA,QACA,SACA,WACA,YACA,kBACA,gBACA,qBACA,eACA,qBACA,YACA,WACA,cAIFO,KAAKP,OAAO+C,GAAG,cAAexC,KAAK+S,YAAYrQ,KAAK1C,OACpDA,KAAKP,OAAO+C,GAAG,WAAYxC,KAAKgT,SAAStQ,KAAK1C,OAC9CA,KAAKP,OAAO+C,GAAG,UAAWxC,KAAKiT,UAAUvQ,KAAK1C,OAC9CA,KAAKP,OAAO+C,GAAG,QAASxC,KAAKkT,QAAQxQ,KAAK1C,OAC1CA,KAAKP,OAAO+C,GAAG,SAAUxC,KAAKmT,SAASzQ,KAAK1C,OAC5CA,KAAKP,OAAO+C,GAAG,WAAYxC,KAAKoT,WAAW1Q,KAAK1C,OAChDA,KAAKP,OAAO+C,GAAG,YAAaxC,KAAKqT,WAAW3Q,KAAK1C,OACjDA,KAAKP,OAAO+C,GAAG,kBAAmBxC,KAAKsT,WAAW5Q,KAAK1C,OACvDA,KAAKP,OAAO+C,GAAG,gBAAiBxC,KAAKuT,SAAS7Q,KAAK1C,OACnDA,KAAKP,OAAO+C,GAAG,qBAAsBxC,KAAKmJ,gBAAgBzG,KAAK1C,OAC/DA,KAAKP,OAAO+C,GAAG,eAAgBxC,KAAKoJ,WAAW1G,KAAK1C,OACpDA,KAAKP,OAAO+C,GAAG,qBAAsBxC,KAAKqJ,gBAAgB3G,KAAK1C,OAC/DA,KAAKP,OAAO+C,GAAG,YAAaxC,KAAKwT,WAAW9Q,KAAK1C,OACjDA,KAAKP,OAAO+C,GAAG,WAAYxC,KAAKyT,UAAU/Q,KAAK1C,MACjD,CAEAiD,mBAAAA,GAEEjD,KAAKP,OAAOyD,IAAI,cAAelD,KAAK+S,aACpC/S,KAAKP,OAAOyD,IAAI,WAAYlD,KAAKgT,UACjChT,KAAKP,OAAOyD,IAAI,UAAWlD,KAAKiT,WAChCjT,KAAKP,OAAOyD,IAAI,QAASlD,KAAKkT,SAC9BlT,KAAKP,OAAOyD,IAAI,SAAUlD,KAAKmT,UAC/BnT,KAAKP,OAAOyD,IAAI,WAAYlD,KAAKoT,YACjCpT,KAAKP,OAAOyD,IAAI,YAAalD,KAAKqT,YAClCrT,KAAKP,OAAOyD,IAAI,kBAAmBlD,KAAKsT,YACxCtT,KAAKP,OAAOyD,IAAI,gBAAiBlD,KAAKuT,UACtCvT,KAAKP,OAAOyD,IAAI,qBAAsBlD,KAAKmJ,iBAC3CnJ,KAAKP,OAAOyD,IAAI,eAAgBlD,KAAKoJ,YACrCpJ,KAAKP,OAAOyD,IAAI,qBAAsBlD,KAAKqJ,iBAC3CrJ,KAAKP,OAAOyD,IAAI,YAAalD,KAAKwT,YAClCxT,KAAKP,OAAOyD,IAAI,WAAYlD,KAAKyT,UACnC,CAEAV,WAAAA,CAAa9T,GACXe,KAAKmD,cACLnD,KAAKwP,aAAa,CAAE5C,MAAO,eAC7B,CAEAoG,QAAAA,CAAU/T,GACRe,KAAKwP,aAAa,CAAE5C,MAAO,YAC7B,CAEAqG,SAAAA,CAAWhU,GACTe,KAAKmD,cACLnD,KAAKoD,WACP,CAEA8P,OAAAA,CAASjU,GACPe,KAAKuD,SACP,CAEA4P,QAAAA,CAAUlU,GACRe,KAAKuD,QAAQ,CAAEC,SAAS,GAC1B,CAEA4P,UAAAA,CAAYnU,GACVe,KAAKyD,WACP,CAEA4P,UAAAA,CAAYpU,GACVe,KAAK+J,YAAY,CAAE9F,IAAK,WAC1B,CAEAqP,UAAAA,CAAYrU,GACVe,KAAK0T,kBACP,CAEAH,QAAAA,CAAUtU,GACRe,KAAK2T,gBACP,CAEAxK,eAAAA,GACEnJ,KAAKgK,eAAe,CAAE4J,SAAU,GAClC,CAEAxK,UAAAA,GACEpJ,KAAKgK,eAAe,CAAE4J,SAAU,GAClC,CAEAvK,eAAAA,GACErJ,KAAKgK,eAAe,CAAE4J,SAAU,GAClC,CAEAJ,UAAAA,GACExT,KAAKqD,WACP,CAEAoQ,SAAAA,GACEzT,KAAKsD,YACP,EACDvB,EAAAA,QAAAxC,+CCjKD,IAAI+S,EAAE,CAAC,IAAIA,EAAErT,EAAEwT,GAAGA,EAAEoB,EAAE5U,GAAGwT,EAAEqB,EAAE7U,EAAE,CAAC8U,wBAAwB,IAAIC,IAAI,IAAIC,EAAExB,EAAE,KAAKoB,EAAEpB,EAAE,KAAKyB,EAAEzB,EAAE,IAAI0B,EAAE1B,EAAE,KAAK2B,EAAE3B,EAAE,KAAK,MAAMuB,EAAE,IAAI,MAAM,WAAApQ,GAAc5D,KAAKqU,eAAc,EAAGrU,KAAKsU,iBAAiB,KAAKtU,KAAKuU,YAAY,IAAI,CAAC,UAAAC,GAAa,GAAGxU,KAAKqU,cAAcF,EAAEM,EAAEC,KAAK,kDAAkD,IAAI1U,KAAKuU,YAAY,IAAIV,EAAEvB,EAAEtS,KAAKsU,iBAAiB,IAAIL,EAAEE,EAAEnU,KAAKuU,aAAavU,KAAKsU,iBAAiBK,iBAAiB3U,KAAKqU,eAAc,EAAGF,EAAEM,EAAEG,OAAO,iDAAiD,CAAC,MAAMtC,GAAG6B,EAAEM,EAAE7D,MAAM,8CAA8C0B,EAAExB,QAAQ,CAAC,CAAC,QAAA+D,CAASvC,GAAGtS,KAAKqU,gBAAgBF,EAAEM,EAAEC,KAAK,2DAA2D1U,KAAKwU,cAAc,IAAI,OAAOlC,EAAEwC,YAAYxC,EAAEwC,aAAaV,EAAEK,EAAEM,OAAOC,cAAc1C,EAAE2C,OAAOjV,KAAKuU,YAAYW,kCAAkCd,EAAEK,EAAEM,OAAOC,cAAc1C,EAAE2C,OAAO3C,GAAGtS,KAAKuU,YAAYY,yBAAyBf,EAAEK,EAAEM,OAAOC,cAAc1C,GAAGtS,KAAKuU,YAAYa,IAAI9C,EAAE,CAAC,MAAMA,GAAG,OAAO6B,EAAEM,EAAE7D,MAAM,4CAA4C0B,EAAExB,UAAS,CAAE,CAAC,CAAC,kBAAAuE,CAAmB/C,GAAGtS,KAAKqU,eAAerU,KAAKwU,aAAaxU,KAAKsU,iBAAiBgB,sBAAsBhD,EAAE,CAAC,iBAAAiD,GAAoBvV,KAAKsU,mBAAmBtU,KAAKsU,iBAAiBiB,mBAAkB,EAAG,CAAC,sBAAAC,CAAuBlD,GAAGtS,KAAKsU,mBAAmBtU,KAAKsU,iBAAiBmB,oBAAoBnD,EAAE,CAAC,cAAAoD,CAAepD,EAAErT,GAAG,IAAIe,KAAKuU,cAAcjC,EAAE,OAAO,MAAMG,EAAExT,EAAEe,KAAKuU,YAAYoB,0BAA0BvB,EAAEK,EAAEM,OAAOC,cAAc/V,GAAGe,KAAKuU,YAAYqB,iBAAiBxB,EAAEK,EAAEM,OAAOC,eAAe,GAAGvC,EAAE,CAAC,MAAMwB,EAAE,IAAIxB,GAAG,IAAI,MAAMxT,KAAKiV,EAAEO,EAAEoB,aAAa5W,KAAKqT,IAAI2B,EAAEhV,GAAGqT,EAAErT,IAAIA,EAAEe,KAAKuU,YAAYW,kCAAkCd,EAAEK,EAAEM,OAAOC,cAAc/V,EAAEgV,GAAGjU,KAAKuU,YAAYY,yBAAyBf,EAAEK,EAAEM,OAAOC,cAAcf,EAAE,CAAC,EAAE,EAAE,IAAI3B,EAAErT,EAAEwT,GAAGA,EAAEqB,EAAE7U,EAAE,CAACwV,EAAE,IAAIZ,IAAI,MAAMI,EAAE,WAAArQ,GAAc5D,KAAK8V,OAAO,CAAC,KAAAA,GAAQ9V,KAAK+V,UAAU,EAAE/V,KAAKgW,SAAS,EAAEhW,KAAKiW,YAAY,EAAEjW,KAAKkW,OAAO,CAAC,CAAC,YAAAC,GAAe,OAAOnW,KAAK+V,UAAU/V,KAAKkW,SAAQ,IAAKE,MAAMC,UAAUrW,KAAK+V,WAAW,IAAI,CAAC,KAAAO,GAAQtW,KAAK+V,WAAU,IAAKK,MAAMC,UAAUrW,KAAKgW,SAAS,CAAC,CAAC,IAAAO,GAAO,OAAOvW,KAAKgW,UAAS,IAAKI,MAAMC,UAAUrW,KAAK+V,UAAU/V,KAAKgW,WAAWhW,KAAKiW,aAAajW,KAAKgW,SAAShW,KAAK+V,WAAW/V,KAAKmW,cAAc,CAAC,WAAA7V,GAAc,OAAON,KAAKgW,SAAShW,KAAKiW,YAAYjW,KAAKkW,OAAOlW,KAAKiW,aAAajW,KAAKmW,gBAAgB,EAAE,CAAC,KAAAK,GAAQ,IAAIlE,EAAE,IAAI2B,EAAE,OAAO3B,EAAEyD,UAAU/V,KAAK+V,UAAUzD,EAAE0D,SAAShW,KAAKgW,SAAS1D,EAAE4D,OAAOlW,KAAKkW,OAAO5D,EAAE2D,YAAYjW,KAAKiW,YAAY3D,CAAC,EAAE,MAAMuB,EAAEI,CAAC,EAAE,GAAG3B,EAAErT,EAAEwT,GAAGA,EAAEqB,EAAE7U,EAAE,CAACwV,EAAE,IAAIZ,IAAI,MAAMI,GAAGA,EAAEtS,YAAY,CAACC,IAAI,MAAMC,IAAI,MAAMC,KAAK,QAAQmS,EAAEwC,UAAU,CAACC,GAAG,CAAC,kBAAkB,wBAAwBC,GAAG,uBAAuBC,QAAQ,+BAA+BC,IAAI,uBAAuB5C,EAAE6C,kBAAkB,CAAC,cAAc,gBAAgB,mBAAmB,qBAAqB7C,EAAE8C,iBAAiB,QAAQ9C,EAAE+C,gBAAgB,MAAM/C,EAAEgD,qBAAqB,IAAIhD,EAAEiD,SAAS,IAAIjD,EAAE4B,aAAa,CAAC,cAAc,cAAc,iBAAiB,gBAAgB,uBAAuB,mBAAmB,kBAAkB,mBAAmB,kBAAkB5B,EAAEkD,mBAAmB,CAAC,cAAc,uBAAuB,2BAA2B,0BAA0B,oBAAoB,aAAa,gBAAgB,MAAM,SAAS,cAAc,sBAAsB,iBAAiB,yBAAyB,wBAAwB,aAAa,iBAAiB,UAAU,cAAc,iBAAiB,kBAAkB,kBAAkB,kBAAkB,iBAAiB,cAAc,eAAe,YAAY,gBAAgB,aAAa,cAAc,qBAAqB,cAAc,aAAa,aAAa,aAAa,uBAAuB,sBAAsB,aAAa,aAAa,kBAAkB,eAAe,cAAc,MAAM,qBAAqB,oBAAoB,MAAMtD,EAAEI,CAAC,EAAE,IAAI3B,EAAErT,EAAEwT,GAAGA,EAAEqB,EAAE7U,EAAE,CAACwV,EAAE,IAAIR,IAAI,MAAMA,EAAE,MAAM,EAAAzR,CAAG8P,EAAErT,GAAG,GAAGe,KAAKoX,WAAWpX,KAAKoX,YAAY,CAAC,EAAE,mBAAmBnY,EAAE,OAAOe,KAAKoX,WAAW9E,GAAGtS,KAAKoX,WAAW9E,IAAI,GAAGtS,KAAKoX,WAAW9E,GAAG+E,KAAKpY,GAAGe,IAAI,CAAC,GAAAkD,CAAIoP,EAAErT,GAAG,GAAGe,KAAKoX,WAAWpX,KAAKoX,YAAY,CAAC,EAAEpX,KAAKoX,WAAW9E,GAAG,CAAC,IAAIG,EAAEzS,KAAKoX,WAAW9E,GAAGgF,QAAQrY,IAAI,IAAIwT,GAAGzS,KAAKoX,WAAW9E,GAAGiF,OAAO9E,EAAE,EAAE,CAAC,OAAOzS,IAAI,CAAC,IAAAwX,CAAKlF,EAAErT,EAAEwT,GAAG,OAAOzS,KAAKoX,WAAWpX,KAAKoX,YAAY,CAAC,EAAE3E,EAAEA,GAAG,CAAC,EAAEgF,MAAMC,QAAQ1X,KAAKoX,WAAWnY,KAAKe,KAAKoX,WAAWnY,GAAG0Y,SAAQ1D,IAAIA,EAAE2D,KAAK5X,KAAK,CAAC6X,UAAUvF,EAAE9Q,KAAKvC,EAAEwL,KAAKgI,EAAEqF,OAAO9X,MAAK,IAAIyX,MAAMC,QAAQ1X,KAAKoX,WAAW,OAAOpX,KAAKoX,WAAW,KAAKO,SAAQ1D,IAAIA,EAAE2D,KAAK5X,KAAK,CAAC6X,UAAUvF,EAAE9Q,KAAKvC,EAAEwL,KAAKgI,EAAEqF,OAAO9X,MAAK,IAAIA,IAAI,EAAE,EAAE,IAAIsS,EAAErT,EAAEwT,GAAGA,EAAEqB,EAAE7U,EAAE,CAACqT,EAAE,IAAI0B,IAAI,IAAIC,EAAExB,EAAE,KAAKoB,EAAEpB,EAAE,IAAIyB,EAAEzB,EAAE,KAAK,MAAMsE,iBAAiB5C,EAAE8C,qBAAqB7C,GAAGP,EAAEY,EAAE,MAAMT,EAAE,WAAApQ,GAAc5D,KAAK+X,OAAO,GAAG/X,KAAKgY,eAAe7D,EAAEnU,KAAKiY,kBAAkB7D,EAAEpU,KAAKkY,mBAAmB,EAAElY,KAAKmY,YAAY,EAAEnY,KAAKoY,6BAA6B3T,KAAK4T,MAAM,GAAGrY,KAAKgY,gBAAgBhY,KAAKsY,yBAAyB7T,KAAK4T,MAAM,GAAGrY,KAAKgY,gBAAgBhY,KAAKuY,2BAA2B9T,KAAK4T,MAAM,GAAGrY,KAAKiY,mBAAmBjY,KAAKwY,uBAAuB/T,KAAK4T,MAAM,GAAGrY,KAAKiY,mBAAmBjY,KAAKyY,sBAAsB,IAAI,CAAC,wBAAAtD,CAAyB7C,EAAErT,GAAG,MAAMwT,EAAEzS,KAAK+X,OAAOW,WAAUzZ,GAAGA,EAAE6V,aAAaxC,IAAG,IAAI,OAAO,IAAIG,EAAEzS,KAAKoV,IAAInW,GAAGe,KAAKoV,IAAInW,EAAEwT,IAAG,CAAE,CAAC,MAAMH,GAAG,OAAO2B,EAAEQ,EAAE7D,MAAM,gDAAgD0B,EAAExB,UAAS,CAAE,CAAC,CAAC,iCAAAoE,CAAkC5C,EAAErT,EAAEwT,GAAG,MAAMoB,EAAE7T,KAAK+X,OAAOW,WAAUjG,GAAGA,EAAEqC,aAAaxC,GAAGG,EAAEwC,SAAShW,IAAG,IAAI,OAAO,IAAI4U,EAAE7T,KAAKoV,IAAI3C,GAAGzS,KAAKoV,IAAI3C,EAAEoB,IAAG,CAAE,CAAC,MAAMvB,GAAG,OAAO2B,EAAEQ,EAAE7D,MAAM,gDAAgD0B,EAAExB,UAAS,CAAE,CAAC,CAAC,yBAAA6E,CAA0BrD,EAAErT,GAAG,OAAOe,KAAK+X,OAAOY,MAAKlG,GAAGA,EAAEqC,aAAaxC,GAAGG,EAAEwC,SAAShW,KAAI,IAAI,CAAC,gBAAA2W,CAAiBtD,GAAG,OAAOtS,KAAK+X,OAAOY,MAAK1Z,GAAGA,EAAE6V,aAAaxC,KAAI,IAAI,CAAC,GAAA8C,CAAI9C,EAAErT,GAAG,IAAI,MAAMwT,GAAE,EAAGyB,EAAEnC,IAAIO,GAAG2B,EAAEjU,KAAKkY,mBAAmBzF,GAAGzS,KAAKgY,eAAenE,EAAE7T,KAAKmY,YAAY,GAAGnY,KAAKiY,kBAAkB,IAAIhE,GAAGJ,IAAI7T,KAAK4Y,SAASnG,GAAG,MAAMxT,GAAGA,GAAG,EAAE,CAAC,MAAMgV,GAAE,EAAGC,EAAEnC,IAAI/R,KAAK+X,OAAO9Y,IAAIe,KAAK+X,OAAO9Y,GAAGqT,EAAEtS,KAAKkY,oBAAoBzF,EAAEwB,CAAC,MAAMjU,KAAK+X,OAAOV,KAAK/E,GAAGtS,KAAKmY,cAAcnY,KAAKkY,oBAAoBzF,EAAE,OAAOzS,KAAK6Y,4BAA2B,CAAE,CAAC,MAAMvG,GAAG,OAAO2B,EAAEQ,EAAE7D,MAAM,iCAAiC0B,EAAExB,UAAS,CAAE,CAAC,CAAC,wBAAA+H,GAA2B,MAAMvG,EAAEtS,KAAKkY,mBAAmBlY,KAAKgY,eAAe/Y,EAAEe,KAAKmY,YAAYnY,KAAKiY,kBAAkBxF,EAAEzS,KAAKkY,oBAAoBlY,KAAKsY,yBAAyBzE,EAAE7T,KAAKmY,aAAanY,KAAKwY,uBAAuB,GAAG/F,GAAGoB,EAAE,CAAC,MAAMA,EAAEpB,EAAE,WAAWzS,KAAKkY,sBAAsBlY,KAAKgY,yBAAyBvT,KAAKC,MAAM,IAAI4N,OAAO,UAAUtS,KAAKmY,eAAenY,KAAKiY,sBAAsBxT,KAAKC,MAAM,IAAIzF,OAAOgV,EAAEQ,EAAEC,KAAK,wBAAwBb,mCAAmC7T,KAAKyY,uBAAuB,mBAAmBzY,KAAKyY,uBAAuBzY,KAAKyY,sBAAsB,WAAW,GAAG,KAAK,CAAC,MAAMnG,EAAEtS,KAAKkY,oBAAoBlY,KAAKoY,6BAA6BnZ,EAAEe,KAAKmY,aAAanY,KAAKuY,4BAA4BjG,GAAGrT,IAAIe,KAAKyY,uBAAuB,mBAAmBzY,KAAKyY,uBAAuBzY,KAAKyY,sBAAsB,QAAQ,GAAG,CAAC,CAAC,uBAAAK,CAAwBxG,GAAGtS,KAAKyY,sBAAsBnG,CAAC,CAAC,KAAAyG,GAAQ,IAAI,MAAMzG,EAAEtS,KAAK+X,OAAOR,OAAO,GAAG,OAAOvX,KAAKmY,YAAY,EAAEnY,KAAKkY,mBAAmB,EAAE5F,CAAC,CAAC,MAAMA,GAAG,OAAO2B,EAAEQ,EAAE7D,MAAM,sCAAsC0B,EAAExB,SAAS,EAAE,CAAC,CAAC,OAAAkI,GAAU,OAAO,IAAIhZ,KAAKmY,WAAW,CAAC,IAAAc,GAAO,OAAOjZ,KAAKmY,WAAW,CAAC,KAAAe,GAAQlZ,KAAK+X,OAAO,GAAG/X,KAAKmY,YAAY,CAAC,CAAC,QAAAS,CAAStG,GAAG,GAAGA,EAAEtS,KAAKgY,eAAe/D,EAAEQ,EAAE7D,MAAM,gEAAgE,MAAM5Q,KAAKmY,aAAanY,KAAKiY,mBAAmBjY,KAAKkY,mBAAmB5F,GAAGtS,KAAKgY,iBAAiBhY,KAAK+X,OAAO7S,OAAO,GAAG,CAAC,MAAMoN,EAAEtS,KAAK+X,OAAOoB,QAAQla,GAAE,EAAGiV,EAAEnC,IAAIO,GAAGtS,KAAKmY,cAAcnY,KAAKkY,oBAAoBjZ,EAAEgV,EAAEQ,EAAEC,KAAK,2CAA2C,CAAC,EAAE,EAAE,IAAIpC,EAAErT,EAAEwT,GAAGA,EAAEqB,EAAE7U,EAAE,CAACkV,EAAE,IAAI9O,IAAI,IAAI4O,EAAExB,EAAE,KAAKoB,EAAEpB,EAAE,KAAKyB,EAAEzB,EAAE,KAAK0B,EAAE1B,EAAE,KAAK2B,EAAE3B,EAAE,IAAIuB,EAAEvB,EAAE,KAAKqB,EAAErB,EAAE,KAAK,MAAMpN,EAAE,WAAAzB,CAAY0O,GAAGtS,KAAKuU,YAAYjC,EAAEtS,KAAKoZ,kBAAkB,IAAIvF,EAAEwF,EAAErZ,KAAKsZ,WAAW,IAAIpF,EAAEqF,EAAEvZ,KAAKwZ,YAAY,GAAGxZ,KAAKyZ,WAAW,EAAEzZ,KAAKuU,uBAAuBN,EAAE3B,GAAGtS,KAAKuU,YAAYuE,yBAAwB,CAACxG,EAAErT,IAAIe,KAAK0Z,oBAAoBpH,EAAErT,KAAIe,KAAK2Z,WAAU,EAAG3Z,KAAK4Z,eAAe,KAAK5Z,KAAK6Z,aAAazF,EAAEK,EAAEyC,SAASlX,KAAK8Z,cAAa,EAAG9Z,KAAK+Z,cAAc,EAAE/Z,KAAKuV,mBAAkB,EAAGvV,KAAKyV,oBAAoB,KAAKzV,KAAKga,iBAAiB,CAAC,EAAEha,KAAKia,4BAA4B,CAAC,cAAAtF,GAAiB3U,KAAK2Z,UAAU7F,EAAEW,EAAEC,KAAK,yCAAyC1U,KAAK2Z,WAAU,EAAG7F,EAAEW,EAAEG,OAAO,6BAA6B,CAACiF,aAAa7Z,KAAK6Z,aAAaK,gBAAgBla,KAAKuU,YAAYvU,KAAKuU,YAAY0E,OAAO,IAAIjZ,KAAKma,sBAAsB,CAAC,aAAAC,GAAgBpa,KAAK2Z,YAAY3Z,KAAK2Z,WAAU,EAAG3Z,KAAK4Z,iBAAiBS,aAAara,KAAK4Z,gBAAgB5Z,KAAK4Z,eAAe,MAAM9F,EAAEW,EAAEG,OAAO,6BAA6B,CAAC,yBAAM8E,CAAoBpH,EAAErT,GAAG,GAAG6U,EAAEW,EAAEG,OAAO,GAAGtC,0BAA0BrT,eAAe,CAACuC,KAAK8Q,EAAEgI,UAAUrb,IAAIe,KAAKuU,cAAcvU,KAAKuU,YAAYyE,UAAU,CAAChZ,KAAK4Z,iBAAiBS,aAAara,KAAK4Z,gBAAgB5Z,KAAK4Z,eAAe,MAAM,UAAU5Z,KAAKua,eAAe,CAAC,EAAE,CAAC,MAAMtb,GAAG6U,EAAEW,EAAE7D,MAAM,GAAG0B,oBAAoBrT,EAAE6R,QAAQ,CAAC,QAAQ9Q,KAAK2Z,WAAW3Z,KAAKma,qBAAqB,CAAC,CAAC,CAAC,mBAAAA,GAAsB,IAAIna,KAAK2Z,UAAU,OAAO,MAAMrH,EAAEtS,KAAK6Z,aAAa7Z,KAAK4Z,eAAeY,YAAW,IAAIxa,KAAKya,qBAAoBnI,EAAE,CAAC,uBAAMmI,GAAoB,IAAI,MAAMnI,EAAEtS,KAAKuU,cAAcvU,KAAKuU,YAAYyE,UAAU/Z,EAAEe,KAAKoZ,mBAAmBpZ,KAAKoZ,kBAAkBsB,eAAe,EAAE,IAAIpI,IAAIrT,EAAE,aAAae,KAAKua,eAAe,CAAC,EAAE,CAAC,MAAMjI,GAAGwB,EAAEW,EAAE7D,MAAM,kCAAkC0B,EAAExB,QAAQ,CAAC,QAAQ9Q,KAAKma,qBAAqB,CAAC,CAAC,oBAAMI,CAAejI,EAAE,CAAC,GAAG,GAAGtS,KAAK8Z,aAAa,MAAM,CAACa,SAAQ,EAAGC,OAAO,uBAAuB5a,KAAK8Z,cAAa,EAAG,IAAI,IAAI7a,EAAEe,KAAK6a,YAAYvI,GAAG,GAAGA,EAAEwI,eAAe,CAAC,MAAMxI,EAAE8B,EAAEK,EAAEuC,iBAAgB,EAAG7C,EAAEpC,IAAI9S,GAAGqT,IAAIrT,EAAEe,KAAK+a,gBAAgB9b,EAAEqT,GAAG,CAAC,MAAMG,QAAQzS,KAAKgb,UAAU/b,EAAEqT,GAAE,GAAI,MAAM,CAACqI,QAAQlI,EAAEkI,QAAQM,YAAY,EAAEC,QAAQ,CAACzI,GAAG,CAAC,MAAMH,GAAG,OAAOwB,EAAEW,EAAE7D,MAAM,wBAAwB0B,EAAExB,SAAS9Q,KAAKmb,qBAAqB7I,GAAG,CAACqI,SAAQ,EAAG/J,MAAM0B,EAAExB,QAAQsK,oBAAoBpb,KAAKob,oBAAoB,CAAC,QAAQpb,KAAK8Z,cAAa,CAAE,CAAC,CAAC,eAAAiB,CAAgBzI,EAAErT,GAAG,GAAG,IAAIqT,EAAEpN,OAAO,OAAOoN,EAAE,MAAMG,EAAE,GAAG,IAAIwB,EAAE,EAAE,IAAI,IAAIJ,EAAEvB,EAAEpN,OAAO,EAAE2O,GAAG,EAAEA,IAAI,CAAC,MAAMK,EAAE5B,EAAEuB,GAAGO,GAAE,EAAGD,EAAEpC,IAAI,CAACsJ,IAAI,CAACnH,KAAKzB,KAAK2B,EAAEnV,IAAIwT,EAAE6I,QAAQpH,GAAGD,EAAEG,EAAE,CAAC,MAAMP,EAAEvB,EAAEpN,OAAOuN,EAAEvN,OAAO,GAAG2O,EAAE,EAAE,CAAC,MAAMK,EAAE5B,EAAEiJ,MAAM,EAAE1H,GAAGC,EAAEW,EAAEC,KAAK,aAAab,oCAAoC,CAAC2H,cAAclJ,EAAEpN,OAAOuW,aAAahJ,EAAEvN,OAAOwW,UAAUzH,EAAE0H,QAAQ1c,IAAIe,KAAKoZ,mBAAmBpZ,KAAKoZ,kBAAkBwC,gBAAgB1H,EAAE,CAAC,OAAOzB,CAAC,CAAC,WAAAoI,CAAYvI,EAAE,CAAC,GAAG,MAAMrT,EAAE4c,OAAOC,SAASC,QAAQC,mBAAmB,EAAEvJ,IAAIH,EAAEwI,gBAAgB9a,KAAKuV,kBAAkBtB,GAAGjU,KAAK+Z,cAAc,GAAG9a,GAAG,GAAGwT,EAAE,GAAGzS,KAAKuV,oBAAoBvV,KAAKuV,mBAAkB,GAAIvV,KAAKyV,qBAAqB,mBAAmBzV,KAAKyV,oBAAoB,IAAIzV,KAAKyV,qBAAqB,CAAC,MAAMnD,GAAGwB,EAAEW,EAAE7D,MAAM,gCAAgC0B,EAAExB,QAAQ,CAAC,MAAM+C,EAAE7T,KAAKuU,YAAYwE,QAAQ,IAAI7E,EAAE,GAAGD,EAAEC,EAAEL,MAAM,CAACK,EAAE,GAAG,IAAI,MAAM5B,KAAKuB,EAAEvB,EAAEwC,aAAad,EAAES,EAAEM,OAAOC,cAAchV,KAAKuU,YAAYa,IAAI9C,GAAG4B,EAAEmD,KAAK/E,EAAE,CAACtS,KAAK+Z,gBAAgB,IAAI,IAAIzH,EAAE4B,EAAEhP,OAAO,EAAEoN,GAAG,EAAEA,IAAI,CAAC,MAAMrT,EAAEiV,EAAE5B,GAAGrT,EAAE6V,aAAad,EAAES,EAAEM,OAAOC,iBAAiBvC,GAAGzS,KAAKic,kBAAkBhd,GAAGiV,EAAEqD,OAAOjF,EAAE,GAAGtS,KAAKkc,aAAajd,GAAG,CAAC,IAAIoG,EAAE,IAAI6O,GAAGiI,GAAE,EAAGhI,EAAEpC,IAAImC,GAAG,GAAGlU,KAAKoZ,mBAAmBpZ,KAAKoZ,kBAAkBsB,eAAe,EAAE,CAAC,MAAMpI,EAAE8B,EAAEK,EAAEsC,iBAAiBoF,EAAEld,EAAEmV,EAAEK,EAAEwC,qBAAqB5R,EAAEH,OAAO,GAAGoN,EAAE,GAAGrT,EAAE,EAAE,CAAC,MAAMwT,EAAEzS,KAAKoZ,kBAAkBgD,oBAAoB9J,EAAErT,GAAGwT,EAAEvN,OAAO,IAAIG,EAAE,IAAIoN,KAAKpN,GAAG,CAAC,CAAC,OAAOA,CAAC,CAAC,eAAM2V,CAAU1I,EAAErT,EAAEwT,GAAG,MAAMwB,EAAE,CAAChQ,KAAI,EAAGkQ,EAAEkI,IAAIrc,KAAKwZ,aAAa8C,QAAQ,CAACC,KAAK,CAAClB,IAAI/I,IAAI5G,QAAQ,IAAIzM,EAAEud,YAAY/J,IAAI,OAAO,IAAIgK,SAAQxd,IAAIe,KAAKsZ,WAAWoD,KAAKzI,GAAExB,IAAIA,EAAEkK,MAAM3c,KAAK4c,qBAAqBtK,IAAItS,KAAKyZ,WAAW,EAAEzZ,KAAKwZ,YAAY,IAAIva,EAAE,CAAC0b,SAASlI,EAAEkK,MAAME,OAAOpK,EAAEoK,OAAOjM,MAAM6B,EAAE7B,MAAMkM,MAAMxK,EAAEyK,WAAWzK,EAAEpN,QAAO,GAAE,GAAG,CAAC,oBAAA0X,CAAqBtK,GAAGtS,KAAKoZ,kBAAkBwC,gBAAgBtJ,GAAG,OAAOuJ,OAAOC,SAASkB,MAAMC,SAASjd,KAAKyZ,aAAazZ,KAAKyZ,WAAW,GAAGzZ,KAAKyZ,WAAW,EAAEzZ,KAAKwZ,YAAY,IAAIxZ,KAAKyZ,YAAY,IAAIzZ,KAAKwZ,YAAYpF,EAAEK,EAAEgC,UAAUC,GAAG,IAAI,CAAC,oBAAAyE,CAAqB7I,GAAGtS,KAAKob,sBAAsBtH,EAAEW,EAAEC,KAAK,0BAA0B,CAAC9D,MAAM0B,EAAExB,QAAQsK,oBAAoBpb,KAAKob,qBAAqB,CAAC,qBAAA9F,CAAsBhD,GAAG,iBAAiBA,GAAG4K,MAAM5K,GAAGwB,EAAEW,EAAEC,KAAK,yDAAyDpC,EAAE,KAAKA,EAAE,IAAIwB,EAAEW,EAAEC,KAAK,qDAAqD1U,KAAK6Z,eAAevH,IAAItS,KAAK6Z,aAAavH,EAAEwB,EAAEW,EAAEG,OAAO,wBAAwB5U,KAAK6Z,cAAc7Z,KAAK4Z,iBAAiBS,aAAara,KAAK4Z,gBAAgB5Z,KAAK4Z,eAAe,MAAM5Z,KAAK2Z,WAAW3Z,KAAKma,sBAAsB,CAAC,0BAAAF,GAA6B,IAAI3H,GAAE,EAAG,MAAMrT,EAAE,KAAKqT,IAAIA,GAAE,EAAGtS,KAAKua,eAAe,CAACO,gBAAe,EAAGqC,OAAM,IAAI,EAAGC,SAAS3V,iBAAiB,oBAAmB,KAAK2V,SAASC,QAAQpe,GAAE,IAAI4c,OAAOpU,iBAAiB,YAAW,KAAKxI,GAAE,IAAI4c,OAAOpU,iBAAiB,gBAAe,KAAKxI,GAAE,GAAG,CAAC,iBAAAgd,CAAkB3J,GAAG,MAAMrT,EAAEe,KAAKga,iBAAiB1H,EAAE2C,QAAQ,IAAIhW,EAAE,OAAM,EAAG,IAAI,MAAMwT,KAAK2B,EAAEK,EAAEoB,aAAa,GAAGvD,EAAEG,KAAKxT,EAAEwT,GAAG,OAAM,EAAG,OAAM,CAAE,CAAC,YAAAyJ,CAAa5J,GAAG,MAAMrT,EAAE,CAAC,EAAE,IAAI,MAAMwT,KAAK2B,EAAEK,EAAEoB,aAAa5W,EAAEwT,GAAGH,EAAEG,GAAGzS,KAAKga,iBAAiB1H,EAAE2C,QAAQhW,CAAC,EAAE,EAAE,IAAIqT,EAAErT,EAAEwT,GAAGA,EAAEqB,EAAE7U,EAAE,CAACwV,EAAE,IAAIL,IAAI,MAAMH,EAAE,YAAOrD,IAAS0B,GAAGuB,EAAEvB,EAAE2B,EAAEqJ,OAAOC,MAAM,UAAU,CAAC,WAAO7I,IAAQpC,GAAGuB,EAAEvB,EAAE2B,EAAEqJ,OAAOE,QAAQ,aAAa,CAAC,aAAO5I,IAAUtC,GAAGuB,EAAE,GAAG0H,MAAM3D,KAAK6F,WAAWxJ,EAAEqJ,OAAOI,OAAO,WAAW,CAAC,YAAOC,IAASrL,GAAGuB,EAAEvB,EAAE2B,EAAEqJ,OAAOM,MAAM,SAAS,CAAC,6BAAOrb,CAAuB+P,EAAErT,EAAEwT,GAAG,IAAI,GAAGwB,EAAE9P,OAAO8P,EAAEqJ,OAAOM,MAAM,CAACnL,EAAEA,GAAG,SAASH,GAAG2B,EAAE0J,MAAM,UAAUrL,EAAE9Q,KAAK,EAAE,IAAIqS,EAAE,CAAC,UAAU,YAAY,UAAU,QAAQ,OAAO,UAAU,QAAQ,SAAS,QAAQ,QAAQ,OAAO,UAAU,SAAS,UAAU,UAAU,aAAa,YAAY,kBAAkB5U,IAAI,OAAOA,EAAE,IAAIA,EAAEka,QAAQtF,EAAE5U,GAAG4U,EAAEA,EAAEgK,OAAO5e,IAAI,IAAI,IAAIiV,EAAE,EAAEA,EAAEL,EAAE3O,OAAOgP,IAAI,mBAAmB5B,EAAEA,EAAEsF,KAAKiE,OAAOhI,EAAEK,GAAGzB,GAAGH,EAAE9P,GAAG8P,EAAE9P,GAAGqR,EAAEK,GAAGzB,GAAGH,EAAE7K,iBAAiB6K,EAAE7K,iBAAiBoM,EAAEK,GAAGzB,GAAGH,EAAEwL,gBAAgBxL,EAAEwL,gBAAgBjK,EAAEK,GAAGzB,GAAGwB,EAAES,KAAK,iEAAiEpC,EAAE,CAAC,CAAC,MAAMA,GAAG2B,EAAES,KAAKpC,EAAE,CAAC,EAAE,SAASuB,EAAEvB,EAAErT,EAAEwT,GAAGxT,EAAEA,GAAGgV,EAAEqJ,OAAOI,OAAOjL,EAAEA,GAAG,WAAW,IAAIoB,EAAEO,EAAEJ,EAAEC,EAAE8J,OAAO9J,EAAE+J,cAAchK,GAAG,KAAK,KAAKH,EAAE,IAAIuC,MAAM6H,WAAW1C,OAAO,GAAG,KAAK,IAAI1H,EAAEqK,cAAc3C,OAAO,GAAG,KAAK,IAAI1H,EAAEsK,cAAc5C,OAAO,GAAG,KAAK,KAAK1H,EAAEuK,mBAAmB7C,OAAO,GAAG,MAAMvH,GAAG,SAAS1B,GAAG,OAAO6B,EAAE7B,EAAE,CAAvB,CAAyBrT,GAAG,IAAIgV,EAAE9P,OAAOlF,GAAGA,IAAIgV,EAAEqJ,OAAOe,UAAUpK,EAAEqK,UAAU,oBAAoBlB,UAAUA,SAASmB,aAAarK,EAAE5B,EAAE0B,IAAII,EAAEnV,IAAIgV,EAAEqJ,OAAOC,OAAO5N,QAAQiB,MAAMjB,QAAQiB,MAAM3R,IAAIgV,EAAEqJ,OAAOE,SAAS7N,QAAQ+E,KAAK/E,QAAQ+E,KAAKzV,IAAIgV,EAAEqJ,OAAOM,OAAOjO,QAAQgO,OAAO,MAAM9B,OAAO2C,KAAK7O,QAAQgO,MAAMhO,QAAQC,IAAIoE,EAAE,KAAKA,EAAE1B,EAAEiF,OAAO,EAAE,EAAEvD,EAAE,UAAUvB,GAAG2B,EAAEqK,MAAM9O,QAAQ2C,IAAI,CAAC,SAAS4B,EAAE5B,EAAErT,GAAG,GAAGqT,aAAamF,MAAM,IAAI,IAAIhF,KAAKH,EAAE4B,EAAE5B,EAAEG,GAAGxT,OAAO,iBAAiBqT,EAAE3C,QAAQC,IAAI3Q,EAAE,IAAIqT,IAAI3C,QAAQC,IAAI3Q,EAAE,KAAK0Q,QAAQC,IAAI0C,GAAG,CAAC2B,EAAEqJ,OAAO,CAACe,OAAO,EAAEd,MAAM,EAAEC,QAAQ,EAAEE,OAAO,EAAEE,MAAM,EAAEc,IAAI,GAAGzK,EAAE9P,MAAM8P,EAAEqJ,OAAOC,MAAMtJ,EAAEqK,UAAS,EAAGrK,EAAE+J,aAAY,EAAG/J,EAAE8J,OAAO,YAAY,MAAM5J,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,WAAW,GAAG,oBAAoB0H,QAAQA,OAAO8C,UAAU9C,OAAO8C,SAASC,OAAO,CAAC,IAAItM,EAAE,4BAA4BuM,KAAKhD,OAAO8C,SAASC,QAAQ,OAAOtM,IAAI,SAASA,EAAE,GAAG2B,EAAE9P,MAAM8P,EAAEqJ,OAAOoB,IAAIzK,EAAE9P,MAAMmO,EAAE,IAAI,OAAO,8BAA8BuM,KAAKhD,OAAO8C,SAASC,UAAU3K,EAAEqK,UAAS,EAAG,CAAC,CAAjS,GAAqS,MAAMlK,EAAEH,CAAC,EAAE,IAAI3B,EAAErT,EAAEwT,GAAGA,EAAEqB,EAAE7U,EAAE,CAACsa,EAAE,IAAIrF,IAAI,IAAID,EAAExB,EAAE,KAAKoB,EAAEpB,EAAE,KAAK,MAAMyB,EAAE,UAAMwI,CAAKpK,EAAErT,GAAG,MAAMgF,IAAIwO,EAAE6J,QAAQrI,EAAEvI,QAAQwI,EAAE,CAAC,GAAG5B,EAAE,IAAI,IAAIG,IAAIwB,EAAE,MAAM,IAAI6K,MAAM,gCAAgC,MAAMxM,EAAE,CAACrO,IAAIwO,EAAE6J,QAAQrI,EAAEvI,QAAQwI,EAAE6K,SAAS9f,SAASe,KAAKgf,eAAe1M,EAAE,CAAC,MAAMA,GAAGuB,EAAEY,EAAE7D,MAAM,0BAA0B0B,EAAExB,SAAS7R,EAAE,CAAC0d,OAAM,EAAGE,OAAO,EAAEjM,MAAM0B,EAAExB,SAAS,CAAC,CAAC,oBAAMkO,CAAe1M,GAAG,MAAMrO,IAAIhF,EAAEqd,QAAQ7J,EAAE/G,QAAQuI,EAAE8K,SAAS7K,GAAG5B,EAAE6B,EAAEiC,KAAK6I,MAAM,IAAI,MAAM/K,GAAGE,EAAE8K,KAAKC,UAAU1M,EAAE8J,MAAMvI,EAAE6H,OAAOC,SAASC,QAAQqD,UAAUpL,GAAG,IAAIA,EAAE9O,OAAO8O,EAAEqL,QAAO,CAAC/M,EAAErT,KAAK,IAAIwT,EAAE,IAAI,GAAGxT,EAAEqgB,iBAAiBC,OAAO,CAAC,MAAMjN,EAAErT,EAAEqgB,MAAME,MAAM/O,SAAS,KAAKxR,EAAEqgB,MAAME,MAAMvgB,EAAEqgB,MAAME,MAAM,IAAI/M,EAAE,IAAI8M,OAAOtgB,EAAEqgB,MAAMG,OAAOnN,EAAE,MAAMG,EAAE,IAAI8M,OAAOtgB,EAAEqgB,MAAM,IAAI,CAAC,MAAM7M,GAAG,OAAOoB,EAAEY,EAAEC,KAAK,uDAAuDzV,EAAEqgB,MAAM7M,EAAE3B,SAASwB,CAAC,CAAC,OAAOA,EAAEoN,QAAQjN,EAAExT,EAAE0gB,YAAW,GAAGvL,GAAGA,GAAG,GAAGH,EAAE6G,gBAAgB8E,UAAUC,WAAW,CAAC,MAAMpN,QAAQzS,KAAK8f,eAAe7gB,EAAEiV,GAAGD,EAAE,CAAC0G,QAAQlI,EAAEoK,OAAOpK,EAAE,IAAI,GAAG,YAAYzS,KAAK+f,sBAAsBzN,EAAE2B,EAAEE,EAAE,CAAC,MAAML,QAAQ9T,KAAKggB,iBAAiB/gB,EAAE,CAACghB,OAAO,OAAO1D,KAAKrI,EAAEgM,QAAQ,CAAC,eAAe,oBAAoBC,UAAUlM,EAAE6G,gBAAgB,KAAKzV,EAAE,CAACsV,QAAQ7G,EAAEsM,GAAGvD,OAAO/I,EAAE+I,OAAOwD,WAAWvM,EAAEuM,YAAYrgB,KAAK+f,sBAAsBzN,EAAEjN,EAAE8O,EAAE,CAAC,MAAMlV,GAAG,MAAMwT,EAAE,CAACkI,SAAQ,EAAGkC,OAAO,EAAEjM,MAAM3R,EAAE6R,SAAS9Q,KAAK+f,sBAAsBzN,EAAEG,EAAE0B,EAAE,CAAC,IAAIC,EAAEJ,CAAC,CAAC,qBAAA+L,CAAsBzN,EAAErT,GAAG,MAAM8f,SAAStM,GAAGH,EAAEG,EAAE,CAACkK,OAAO1d,EAAE0b,UAAU,IAAI1b,EAAE4d,SAAQ,EAAG5I,EAAEqM,IAAIrhB,EAAE4d,SAASA,OAAO5d,EAAE4d,OAAOjM,MAAM3R,EAAE2R,OAAO,CAAC,oBAAMkP,CAAexN,EAAErT,GAAG,IAAI,OAAO2gB,UAAUC,WAAWvN,EAAErT,EAAE,CAAC,MAAMqT,GAAG,OAAOuB,EAAEY,EAAEC,KAAK,4CAA4CpC,EAAExB,UAAS,CAAE,CAAC,CAAC,sBAAMkP,CAAiB1N,EAAErT,EAAEwT,GAAG,MAAMwB,EAAE,IAAIsM,gBAAgB1M,EAAE2G,YAAW,IAAIvG,EAAEuM,SAAQ/N,GAAG,IAAI,MAAMA,QAAQgO,MAAMnO,EAAE,IAAIrT,EAAEyhB,OAAOzM,EAAEyM,SAAS,OAAOrG,aAAaxG,GAAGpB,CAAC,CAAC,MAAMH,GAAG,GAAG+H,aAAaxG,GAAG,eAAevB,EAAEhO,KAAK,MAAM,IAAIwa,MAAM,yBAAyBrM,OAAO,MAAMH,CAAC,CAAC,EAAE,EAAE,IAAIA,EAAErT,EAAEwT,GAAGA,EAAEqB,EAAE7U,EAAE,CAACoa,EAAE,IAAIrF,IAAI,IAAIC,EAAExB,EAAE,KAAKoB,EAAEpB,EAAE,KAAKyB,EAAEzB,EAAE,IAAI,MAAMsE,iBAAiB5C,EAAE8C,qBAAqB7C,GAAGF,EAAEO,EAAE,MAAMT,EAAE,WAAApQ,GAAc5D,KAAK2gB,WAAW,GAAG3gB,KAAK4gB,aAAaxM,EAAEpU,KAAK6gB,kBAAkB1M,CAAC,CAAC,eAAAyH,CAAgBtJ,GAAG,IAAI,MAAMrT,EAAEwY,MAAMC,QAAQpF,GAAGA,EAAE,CAACA,GAAG2B,EAAEQ,EAAEG,OAAO,UAAU3V,EAAEiG,sCAAsC,CAAC4b,gBAAgB9gB,KAAK2gB,WAAWzb,SAAS,IAAI,MAAMoN,KAAKrT,EAAE,CAACe,KAAK2gB,WAAWzb,QAAQlF,KAAK4gB,cAAc5gB,KAAK+gB,mBAAmB,MAAM9hB,GAAE,EAAG4U,EAAE9B,IAAIO,GAAG,MAAK,EAAGuB,EAAE9B,IAAI/R,KAAK2gB,YAAY1hB,EAAEe,KAAK6gB,mBAAmB7gB,KAAK+gB,mBAAmB/gB,KAAK2gB,WAAWtJ,KAAK,IAAI/E,GAAG,CAAC,CAAC,MAAMA,GAAG2B,EAAEQ,EAAE7D,MAAM,uCAAuC0B,EAAExB,QAAQ,CAAC,CAAC,YAAAkQ,CAAa1O,EAAErT,GAAGgV,EAAEQ,EAAEC,KAAK,kBAAkB,CAACkG,OAAO3b,EAAE4Y,UAAUvF,EAAEuF,WAAW,CAAC,gBAAAkJ,GAAmB,GAAG/gB,KAAK2gB,WAAWzb,OAAO,EAAE,CAAC,MAAMoN,EAAEtS,KAAK2gB,WAAWxH,QAAQnZ,KAAKghB,aAAa1O,EAAE,8BAA8B,CAAC,CAAC,mBAAA8J,CAAoB9J,EAAErT,GAAG,MAAMwT,EAAE,GAAG,IAAIwB,EAAE,EAAEC,EAAE,EAAE,IAAI,IAAIC,EAAEnU,KAAK2gB,WAAWzb,OAAO,EAAEiP,GAAG,EAAEA,IAAI,CAAC,MAAMC,EAAEpU,KAAK2gB,WAAWxM,GAAG,GAAGD,GAAGjV,EAAE,MAAM,MAAM+U,GAAE,EAAGH,EAAE9B,IAAIqC,GAAG,GAAGH,EAAED,EAAE1B,EAAE,MAAMG,EAAE6I,QAAQlH,GAAGH,GAAGD,EAAEE,IAAIlU,KAAK2gB,WAAWpJ,OAAOpD,EAAE,EAAE,CAAC,OAAO1B,CAAC,CAAC,YAAAiI,GAAe,OAAO1a,KAAK2gB,WAAWzb,MAAM,CAAC,KAAAgU,GAAQlZ,KAAK2gB,WAAW,EAAE,EAAE,EAAE,IAAIrO,EAAErT,EAAEwT,GAAGA,EAAEqB,EAAE7U,EAAE,CAACwV,EAAE,IAAIpP,IAAI,IAAI4O,EAAExB,EAAE,KAAKoB,EAAEpB,EAAE,KAAKyB,EAAEzB,EAAE,KAAK0B,EAAE1B,EAAE,IAAI2B,EAAE3B,EAAE,KAAKuB,EAAEvB,EAAE,KAAK,MAAMqB,UAAUD,EAAEY,EAAE,WAAA7Q,CAAY0O,GAAG3G,QAAQ3L,KAAKihB,WAAW,CAAC,EAAEjhB,KAAKkhB,UAAU,KAAKlhB,KAAKmhB,cAAc,KAAKnhB,KAAKohB,oBAAoB,IAAIlN,EAAEO,EAAEzU,KAAKohB,oBAAoB9K,QAAQtW,KAAKqhB,aAAalN,EAAEM,EAAE6M,aAAathB,KAAKuhB,eAAepN,EAAEM,EAAE+M,gBAAgBlP,EAAEA,GAAG,CAAC,EAAEtS,KAAKyhB,WAAWnP,EAAE,CAAC,UAAAmP,CAAWnP,GAAGA,IAAIA,EAAE6O,gBAAgBnhB,KAAKmhB,cAAc7O,EAAE6O,eAAe7O,EAAE2O,aAAajhB,KAAKihB,WAAW3O,EAAE2O,YAAY3O,EAAE4O,YAAYlhB,KAAKkhB,UAAU5O,EAAE4O,WAAW,CAAC,OAAAQ,GAAU1hB,KAAKiD,qBAAqB,CAAC,iBAAAZ,GAAoB,CAAC,mBAAAY,GAAsB,CAAC,YAAAkE,GAAe,OAAOnH,KAAK4M,MAAM+U,MAAM,IAAI3hB,KAAKkhB,UAAUlhB,KAAKkhB,UAAUlhB,KAAKmhB,eAAenhB,KAAKmhB,cAAcD,UAAUlhB,KAAKmhB,cAAcD,UAAU,GAAG,CAAC,cAAAU,GAAiB5hB,KAAK6hB,mBAAmBC,YAAY9hB,KAAK+hB,cAAcrf,KAAK1C,MAAMyE,KAAKU,IAAInF,KAAKmH,eAAe,KAAK,CAAC,aAAA6a,GAAgBhiB,KAAK6hB,oBAAoBI,cAAcjiB,KAAK6hB,mBAAmB,CAAC,aAAAE,CAAczP,GAAGtS,KAAKkiB,gBAAgBpO,EAAEiB,OAAOoN,UAAU7P,EAAE,CAAC,aAAA8P,CAAc9P,EAAErT,IAAIqT,EAAEA,GAAG,CAAC,GAAG+P,YAAYriB,KAAKH,iBAAiByS,EAAEgQ,eAAetiB,KAAKyM,oBAAoB6F,EAAEiQ,YAAYtO,EAAEuO,GAAGlQ,EAAEmQ,sBAAsBziB,KAAKohB,oBAAoBjL,eAAe,IAAI,IAAIlX,KAAKe,KAAKihB,WAAW3O,EAAErT,GAAGe,KAAKihB,WAAWhiB,GAAG,OAAO,MAAMme,SAASC,SAAS/K,EAAEoQ,kBAAkBtF,SAASC,QAAQ/K,CAAC,CAAC,iBAAA7F,GAAoB,OAAOwH,EAAEuO,EAAE,CAAC,cAAA3iB,GAAiB,MAAM,cAAc,CAAC,eAAAqiB,CAAgB5P,EAAErT,GAAGe,KAAKwX,KAAK,cAAclF,EAAEtS,KAAKoiB,cAAcnjB,GAAG,CAAC,iBAAA0jB,CAAkBrQ,EAAErT,GAAGe,KAAKwX,KAAK,gBAAgBlF,EAAEtS,KAAKoiB,cAAcnjB,GAAG,CAAC,oBAAA2jB,CAAqBtQ,EAAErT,GAAG,IAAIwT,EAAEzS,KAAKsQ,OAAO,UAAU,aAAatQ,KAAKwX,KAAK,mBAAmBlF,EAAEtS,KAAKoiB,cAAcnjB,EAAEwT,GAAG,CAAC,qBAAAoQ,CAAsBvQ,EAAErT,GAAGe,KAAKwX,KAAK,oBAAoBlF,EAAEtS,KAAKoiB,cAAcnjB,EAAE,gBAAgB,CAAC,kBAAAoW,CAAmB/C,GAAG,GAAG8B,EAAEL,wBAAwB,IAAIK,EAAEL,wBAAwBsB,mBAAmB/C,EAAE,CAAC,MAAMA,GAAG,YAAY0B,EAAES,EAAE7D,MAAM,kCAAkC0B,EAAExB,QAAQ,MAAMkD,EAAES,EAAE7D,MAAM,2CAA2C,EAAEkD,EAAEiB,OAAO,CAACoN,UAAU,YAAYnN,cAAc,iBAAiB,MAAM3P,EAAEyO,CAAC,EAAE,IAAIxB,EAAErT,EAAEwT,GAAGA,EAAEqB,EAAE7U,EAAE,CAAC8S,GAAG,IAAIoC,EAAEmM,GAAG,IAAIlM,EAAEiI,GAAG,IAAInI,EAAE4O,GAAG,IAAI9O,IAAI,IAAIC,EAAExB,EAAE,KAAKoB,EAAEpB,EAAE,KAAK,SAASyB,EAAE5B,GAAG,IAAI,IAAIuJ,OAAOC,UAAUD,OAAOC,QAAQkB,KAAK,MAAM,IAAI8B,MAAM,kCAAkC,IAAIiE,OAAO9jB,EAAE+jB,WAAWvQ,EAAEwQ,cAAcpP,GAAGgI,OAAOC,QAAQkB,KAAK,IAAI/d,IAAIwT,EAAE,MAAM,IAAIqM,MAAM,qEAAqE,OAAOjL,EAAE,WAAWvB,GAAGrT,WAAWwT,OAAOoB,OAAOI,EAAEuO,UAAU3G,OAAO8C,SAASuE,aAAa,WAAW5Q,GAAGrT,WAAWwT,QAAQwB,EAAEuO,UAAU3G,OAAO8C,SAASuE,YAAY,CAAC,MAAM5Q,GAAG,OAAO3C,QAAQiB,MAAM0B,EAAExB,SAAS,IAAI,CAAC,CAAC,SAASqD,EAAE7B,GAAG,GAAG,iBAAiBA,GAAGA,EAAEpN,OAAO,OAAOoN,EAAEpN,OAAO,GAAG,iBAAiBoN,EAAE,CAAC,GAAG,oBAAoB6Q,aAAa7Q,aAAa6Q,aAAa7Q,EAAE8Q,WAAW,OAAO9Q,EAAE8Q,WAAW,GAAG,oBAAoBC,MAAM/Q,aAAa+Q,MAAM/Q,EAAE2G,KAAK,OAAO3G,EAAE2G,KAAK,KAAK,oBAAoBqK,UAAUhR,aAAagR,UAAU,IAAI,OAAO,SAAShR,GAAG,IAAI,OAAO4M,KAAKC,UAAU7M,EAAE,MAAM,MAAMA,EAAE,IAAIiR,QAAQ,MAAM,CAACtkB,EAAEwT,KAAK,GAAG,iBAAiBA,GAAG,OAAOA,EAAE,CAAC,GAAGH,EAAEkR,IAAI/Q,GAAG,OAAOH,EAAE8C,IAAI3C,EAAE,CAAC,OAAOA,EAAG,EAA/G,KAAqH,EAAE,CAAC,MAAMH,GAAG,OAAOuB,EAAEY,EAAE7D,MAAM,4BAA4B0B,EAAExB,SAAS,EAAE,CAAC,CAApO,CAAsOwB,GAAGpN,MAAM,CAAC,MAAMoN,GAAG,MAAM,CAAC,CAAC,CAAC,SAAS8B,EAAE9B,GAAG,OAAOA,GAAG,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,OAAM,EAAG,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,OAAM,EAAG,OAAOA,GAAG,KAAKA,GAAG,KAAKA,GAAG,KAAKA,GAAG,GAAG,CAAC,SAAS0B,EAAE1B,EAAErT,GAAG,OAAOqT,GAAGmF,MAAMC,QAAQpF,IAAI,IAAIA,EAAEpN,OAAOjG,GAAG,iBAAiBA,EAAEqT,EAAE+M,QAAO,CAAC/M,EAAEG,KAAKA,KAAKxT,IAAIqT,EAAEG,GAAGxT,EAAEwT,IAAIH,IAAG,CAAC,GAAG,CAAC,EAAErT,CAAC,CAAC,EAAE,IAAIqT,GAAGA,EAAEvQ,QAAQ,CAACygB,GAAG,QAAQ,GAAGvjB,EAAE,CAAC,EAAE,SAASwT,EAAEwB,GAAG,IAAIJ,EAAE5U,EAAEgV,GAAG,QAAG,IAASJ,EAAE,OAAOA,EAAE9R,QAAQ,IAAImS,EAAEjV,EAAEgV,GAAG,CAAClS,QAAQ,CAAC,GAAG,OAAOuQ,EAAE2B,GAAGC,EAAEA,EAAEnS,QAAQ0Q,GAAGyB,EAAEnS,OAAO,CAAC0Q,EAAEqB,EAAE,CAACxB,EAAErT,KAAK,IAAI,IAAIgV,KAAKhV,EAAEwT,EAAE2B,EAAEnV,EAAEgV,KAAKxB,EAAE2B,EAAE9B,EAAE2B,IAAIwP,OAAOC,eAAepR,EAAE2B,EAAE,CAAC0P,YAAW,EAAGC,IAAI3kB,EAAEgV,IAAG,EAAGxB,EAAE2B,EAAE,CAAC9B,EAAErT,IAAIwkB,OAAOI,UAAUC,eAAelM,KAAKtF,EAAErT,GAAGwT,EAAEoB,EAAEvB,IAAI,oBAAoByR,QAAQA,OAAOC,aAAaP,OAAOC,eAAepR,EAAEyR,OAAOC,YAAY,CAACC,MAAM,WAAWR,OAAOC,eAAepR,EAAE,aAAa,CAAC2R,OAAM,GAAG,EAAG,IAAIhQ,EAAExB,EAAE,KAAKoB,EAAEpB,EAAE,KAAKyB,EAAEzB,EAAE,IAAI0B,EAAE1B,EAAE,KAAK2B,EAAE3B,EAAE,KAAK,SAASuB,EAAE1B,EAAErT,EAAE,CAAC,GAAG,IAAI,IAAIiV,EAAEO,EAAEqC,kBAAkBrG,SAAS6B,GAAG,OAAO2B,EAAEQ,EAAEC,KAAK,6CAA6C,CAACmD,UAAUvF,KAAI,EAAG,IAAIuJ,QAAQC,SAASkB,KAAK,OAAO,MAAMkH,QAAQzR,EAAEwQ,cAAcjP,GAAG6H,OAAOC,QAAQkB,MAAMmH,IAAIrQ,KAAKzO,GAAGpG,EAAEkd,EAAErI,EAAE,IAAIA,GAAG,CAAC,EAAEuF,EAAE,IAAIrF,EAAE,CAAC,EAAE,CAACkQ,QAAQzR,GAAG2R,UAAUhO,KAAK6I,MAAMoF,cAAcxI,OAAOyI,YAAYzI,OAAOyI,YAAYrF,MAAM,IAAI,MAAMxK,EAAE,IAAIpP,EAAEwS,UAAUvF,KAAK+G,GAAGkL,GAAE,EAAGnQ,EAAE0O,IAAI5O,EAAEO,EAAE0C,mBAAmBlY,GAAG,IAAIulB,EAAE,KAAK,gBAAgBlS,IAAIkS,EAAE,CAAC3M,UAAU,cAAc/C,WAAWX,EAAEM,EAAEM,OAAOC,cAAcyP,oBAAoB,WAAWtI,KAAKoI,KAAKlL,IAAI,MAAMqL,EAAE7Q,EAAEE,wBAAwBc,SAASJ,GAAG,GAAG+P,GAAG3I,QAAQC,SAASC,QAAQ4I,aAAa,CAAC,MAAMrS,EAAEuB,EAAEE,wBAAwBc,SAAS2P,GAAG,OAAOE,GAAGpS,CAAC,CAAC,OAAOoS,CAAC,CAAC,MAAMpS,GAAG,OAAO2B,EAAEQ,EAAE7D,MAAM,0BAA0B0B,EAAExB,UAAS,CAAE,CAAC,CAAC,MAAM2F,UAAU3C,GAAGI,EAAEO,EAAQpP,EAAE,IAAI,MAAM,gBAAAuf,CAAiBtS,EAAErT,GAAG,QAAQe,KAAK6kB,uBAAuBvS,MAAMtS,KAAK8kB,qBAAqB7lB,KAAKe,KAAK+kB,uBAAuBzS,EAAErT,GAAGgV,EAAEQ,EAAEG,OAAO,2DAA0D,EAAG,CAAC,sBAAAiQ,CAAuBvS,GAAG,IAAIA,GAAG,iBAAiBA,EAAE,OAAO2B,EAAEQ,EAAE7D,MAAM,oCAAmC,EAAG,MAAMoS,WAAW/jB,EAAEilB,QAAQzR,EAAEwK,OAAOpJ,EAAEoP,cAAc/O,EAAE6O,OAAO5O,GAAG7B,EAAE,IAAIrT,EAAE,OAAOgV,EAAEQ,EAAE7D,MAAM,2BAA0B,EAAG,GAAGsD,EAAE,CAAC,IAAIC,EAAE,OAAOF,EAAEQ,EAAE7D,MAAM,sDAAqD,EAAG,IAAI6S,OAAOuB,OAAOlR,GAAGmR,SAAQ3S,GAAGA,IAAG7B,SAAS0D,GAAG,OAAOF,EAAEQ,EAAE7D,MAAM,mBAAmBuD,MAAK,CAAE,KAAK,CAAC,IAAI1B,IAAIoB,EAAE,OAAOI,EAAEQ,EAAE7D,MAAM,uEAAsE,EAAG,IAAIkD,EAAED,GAAG,OAAOI,EAAEQ,EAAE7D,MAAM,mBAAmBiD,yBAAyB4P,OAAOyB,KAAKpR,GAAGqR,KAAK,UAAS,CAAE,CAAC,OAAM,CAAE,CAAC,oBAAAL,CAAqBxS,GAAG,GAAG,MAAMA,EAAE,OAAM,EAAG,GAAG,iBAAiBA,GAAGmF,MAAMC,QAAQpF,GAAG,OAAO2B,EAAEQ,EAAE7D,MAAM,6BAA4B,EAAG,MAAM+T,aAAa1lB,EAAEmgB,UAAU3M,GAAGH,EAAE,YAAO,IAASrT,GAAG,kBAAkBA,GAAGgV,EAAEQ,EAAE7D,MAAM,mCAAkC,UAAM,IAAS6B,IAAIgF,MAAMC,QAAQjF,KAAKwB,EAAEQ,EAAE7D,MAAM,8BAA8B,GAAG,CAAC,oBAAAwU,CAAqB9S,GAAG,OAAOA,EAAEA,EAAE+S,QAAO/S,IAAI,MAAMrT,OAAE,IAASqT,EAAEgN,QAAQ,iBAAiBhN,EAAEgN,OAAOhN,EAAEgN,iBAAiBC,QAAQ9M,OAAE,IAASH,EAAEqN,aAAa,iBAAiBrN,EAAEqN,YAAY,SAAS1gB,IAAIwT,KAAKwB,EAAEQ,EAAEC,KAAK,mGAAmGpC,IAAG,EAAE,IAAI,EAAE,CAAC,yBAAAgT,CAA0BhT,GAAG,OAAO,MAAMA,EAAE,EAAE,iBAAiBA,GAAGiT,OAAOC,UAAUlT,IAAIA,GAAG,EAAEA,GAAG3C,QAAQ+E,KAAK,wCAAwCpC,qDAAqD,EAAE,CAAC,sBAAAyS,CAAuBzS,EAAErT,GAAG,IAAI+jB,WAAWvQ,EAAEyR,QAAQjQ,EAAEgJ,OAAOpJ,EAAEkP,OAAO5O,EAAE8O,cAAc7O,GAAG9B,EAAE6B,EAAE,OAAON,EAAEK,EAAEO,EAAEgC,UAAUC,GAAG,GAAGvC,GAAGL,EAAED,GAAGgI,OAAOC,QAAQ,CAACkB,KAAK,IAAInJ,EAAE,CAACoJ,OAAOpJ,GAAG,CAAC,EAAEkP,OAAO5O,EAAE6O,WAAWvQ,EAAEwQ,cAAc7O,KAAKA,EAAE,CAAC,EAAE,CAAC8P,QAAQjQ,IAAI8H,OAAO,CAAC4I,aAAa1lB,GAAG0lB,eAAc,EAAG3I,kBAAkBhc,KAAKslB,0BAA0BrmB,GAAG+c,mBAAmBoD,UAAUpf,KAAKolB,qBAAqBnmB,GAAGmgB,YAAY,GAAG,MAAMjD,EAAE,iBAAOnQ,CAAWsG,EAAErT,GAAG,IAAIwT,EAAEoB,EAAE5U,GAAG+d,OAAOvK,EAAExT,EAAE+d,KAAKnJ,EAAE5U,GAAG8c,OAAO1W,EAAEuf,iBAAiBnS,EAAEoB,IAAIvB,EAAE9P,IAAI8P,EAAEkF,MAAM6B,EAAEhC,KAAK/E,GAAGA,EAAE9P,GAAG,IAAIiS,GAAG,mBAAmBnC,EAAEmT,aAAanT,EAAEmT,eAAexR,EAAEQ,EAAE7D,MAAM,+BAA+B0B,EAAE,CAAC,oBAAOoT,CAAcpT,GAAGA,EAAEpP,IAAI,IAAIuR,GAAGnC,EAAEoP,UAAU,IAAIziB,EAAEoa,EAAE/B,QAAQhF,IAAI,IAAIrT,GAAGoa,EAAE9B,OAAOtY,EAAE,EAAE,CAAC,kBAAO0mB,GAAc,OAAOtM,CAAC,CAAC,WAAOqD,CAAKpK,EAAErT,EAAEwT,GAAG,OAAOuB,EAAE1B,EAAE,CAACwC,WAAW7V,KAAKwT,GAAG,CAAC,gBAAOhP,CAAU6O,GAAG,OAAO0B,EAAE,mBAAmB,CAACc,WAAW,WAAWxC,GAAG,CAAC,yBAAasT,GAAe,IAAI,MAAM7R,wBAAwBzB,GAAGG,EAAE,KAAK,aAAaH,EAAEsT,cAAc,CAAC,MAAMtT,GAAG,OAAO2B,EAAEQ,EAAE7D,MAAM,2BAA2B0B,EAAExB,SAAS,CAAC6J,SAAQ,EAAG/J,MAAM0B,EAAExB,QAAQ,CAAC,EAAE,IAAIuI,EAAE,GAAG,SAAS5E,EAAEnC,GAAG,IAAI,IAAIrT,EAAE,SAASqT,GAAG,IAAIrT,EAAE,CAAC,EAAE,IAAI,IAAIwT,KAAKH,EAAE,OAAOA,EAAEG,SAAI,IAASH,EAAEG,KAAKxT,EAAEwT,GAAGH,EAAEG,IAAI,OAAOxT,CAAC,CAApF,CAAsFqT,EAAE7H,MAAMwJ,EAAEQ,EAAEtQ,OAAO8P,EAAEQ,EAAE6I,OAAOM,MAAM3J,EAAEQ,EAAEG,OAAO,OAAOtC,EAAE9Q,KAAKvC,GAAGgV,EAAEQ,EAAEG,OAAO,OAAOtC,EAAE9Q,MAAM2a,EAAEO,KAAKpK,EAAEuF,UAAUvF,EAAE9Q,KAAKvC,EAAE,CAAC,MAAMqT,GAAG2B,EAAEQ,EAAE7D,MAAM,0BAA0B0B,EAAExB,QAAQ,CAAC,CAAC,MAAMyT,EAAEpI,EAAE,IAAIqI,EAAE/R,EAAE,KAAKiS,EAAEjS,EAAE,KAAK,MAAMoT,EAAE,MAAM,WAAAjiB,GAAc5D,KAAK8V,QAAQ9V,KAAK8lB,WAAW1P,KAAK6I,MAAMjf,KAAK+lB,KAAI,EAAG/lB,KAAKgmB,KAAK,EAAEhmB,KAAKimB,WAAW,CAAC,CAAC,KAAAnQ,GAAQ9V,KAAKkmB,aAAa,KAAKlmB,KAAKmmB,WAAW,EAAEnmB,KAAK2hB,OAAM,EAAG3hB,KAAKomB,eAAe,EAAEpmB,KAAKqmB,YAAY,EAAErmB,KAAKsmB,eAAe,EAAEtmB,KAAKumB,cAAc,EAAEvmB,KAAKwmB,uBAAuB,EAAExmB,KAAKymB,gBAAgB,EAAEzmB,KAAK0mB,WAAU,EAAG1mB,KAAK2mB,0BAAyB,EAAG3mB,KAAK4mB,YAAY,KAAK5mB,KAAK6mB,YAAY,EAAE7mB,KAAK8mB,aAAa,KAAK9mB,KAAK+mB,4BAA4B,KAAK/mB,KAAKgnB,sBAAsB,EAAEhnB,KAAKinB,sBAAsB,EAAEjnB,KAAKknB,iBAAgB,EAAGlnB,KAAKmnB,kBAAiB,EAAGnnB,KAAKonB,qBAAqB,EAAEpnB,KAAKqnB,aAAarnB,KAAKsnB,cAAc,CAAC,UAAAD,GAAarnB,KAAKunB,eAAc,EAAGvnB,KAAKwnB,aAAY,EAAGxnB,KAAK2Z,WAAU,EAAG3Z,KAAKynB,UAAS,EAAGznB,KAAK0nB,WAAU,EAAG1nB,KAAK2nB,aAAY,EAAG3nB,KAAK4nB,WAAU,CAAE,CAAC,YAAAN,GAAetnB,KAAK6nB,mBAAmB,IAAIrD,EAAE/P,EAAEzU,KAAK8nB,iBAAiB,IAAItD,EAAE/P,EAAEzU,KAAK+nB,gBAAgB,IAAIvD,EAAE/P,EAAEzU,KAAKgoB,mBAAmB,IAAIxD,EAAE/P,EAAEzU,KAAKioB,qBAAqB,IAAIzD,EAAE/P,EAAEzU,KAAKkoB,sBAAsB,IAAI1D,EAAE/P,EAAEzU,KAAKmoB,sBAAsB,IAAI3D,EAAE/P,EAAEzU,KAAKooB,uBAAuB,IAAI5D,EAAE/P,EAAEzU,KAAKqoB,6BAA6B,IAAI7D,EAAE/P,EAAEzU,KAAKsoB,wBAAwB,IAAI9D,EAAE/P,EAAEzU,KAAKuoB,gBAAgB,IAAI/D,EAAE/P,EAAEzU,KAAKwoB,mBAAmB,IAAIhE,EAAE/P,EAAEzU,KAAKyoB,qBAAqB,IAAIjE,EAAE/P,EAAEzU,KAAK0oB,iBAAiB,IAAIlE,EAAE/P,EAAEzU,KAAK2oB,iBAAiB,IAAInE,EAAE/P,EAAEzU,KAAK4oB,uBAAuB,IAAIpE,EAAE/P,EAAEzU,KAAK6oB,0BAA0B,CAAC,EAAE7oB,KAAK8oB,YAAY,IAAItE,EAAE/P,EAAEzU,KAAK+oB,kBAAkB,IAAIvE,EAAE/P,EAAEzU,KAAKgpB,iBAAiB,IAAIxE,EAAE/P,CAAC,CAAC,IAAAnE,GAAO,OAAOtQ,KAAK2hB,KAAK,CAAC,OAAA7R,CAAQwC,GAAGtS,KAAK2hB,MAAMrP,CAAC,CAAC,qBAAA2W,CAAsB3W,GAAGtS,KAAK6oB,0BAA0BvW,GAAG,IAAIkS,EAAE/P,EAAEzU,KAAK6oB,0BAA0BvW,GAAGgE,OAAO,CAAC,wBAAA4S,CAAyB5W,UAAUtS,KAAK6oB,0BAA0BvW,EAAE,CAAC,cAAA6W,GAAiB,IAAInpB,KAAKkmB,aAAa,CAAC,IAAI5T,GAAE,IAAK8D,MAAMC,UAAUpX,EAAEwF,KAAK2kB,SAASC,SAAS,IAAIC,UAAU,GAAG7kB,KAAK2kB,SAASC,SAAS,IAAIC,UAAU,GAAGtpB,KAAKkmB,aAAa5T,EAAE,IAAIrT,CAAC,CAAC,OAAOe,KAAKkmB,YAAY,CAAC,SAAAqD,GAAY,OAAOvpB,KAAKmpB,iBAAiB,IAAInpB,KAAKmmB,UAAU,CAAC,kBAAAqD,CAAmBlX,GAAGA,EAAEA,GAAG,CAAC,EAAEtS,KAAKsQ,QAAQtQ,KAAKwnB,cAAclV,EAAEmX,qBAAqBzpB,KAAK6nB,mBAAmB1R,eAAe7D,EAAEoX,yBAAyB1pB,KAAKooB,uBAAuBjS,gBAAgBnW,KAAK2Z,YAAYrH,EAAEqX,mBAAmB3pB,KAAK8nB,iBAAiB3R,gBAAgBnW,KAAKynB,WAAWnV,EAAEsX,kBAAkB5pB,KAAK+nB,gBAAgB5R,gBAAgBnW,KAAK2nB,cAAcrV,EAAEuX,uBAAuB7pB,KAAKioB,qBAAqB9R,gBAAgBnW,KAAK0nB,YAAYpV,EAAEwX,qBAAqB9pB,KAAKgoB,mBAAmB7R,gBAAgBnW,KAAK0mB,YAAYpU,EAAEyX,sBAAsB/pB,KAAKkoB,sBAAsB/R,gBAAgBnW,KAAKomB,eAAe,GAAGpmB,KAAKyoB,qBAAqB1S,UAAU,IAAIzD,EAAEmW,qBAAqBzoB,KAAKyoB,qBAAqBtS,gBAAgB7D,EAAE+T,YAAYrmB,KAAKqmB,cAAcrmB,KAAKwnB,cAAclV,EAAEuV,mBAAmB7nB,KAAK6nB,mBAAmB1R,eAAe7D,EAAE8V,uBAAuBpoB,KAAKooB,uBAAuBjS,gBAAgBnW,KAAK2Z,YAAYrH,EAAEwV,iBAAiB9nB,KAAK8nB,iBAAiB3R,gBAAgBnW,KAAKynB,WAAWnV,EAAEyV,gBAAgB/nB,KAAK+nB,gBAAgB5R,gBAAgBnW,KAAK2nB,cAAcrV,EAAE2V,qBAAqBjoB,KAAKioB,qBAAqB9R,gBAAgBnW,KAAK0nB,YAAYpV,EAAE0V,mBAAmBhoB,KAAKgoB,mBAAmB7R,gBAAgB7D,EAAEiW,gBAAgBvoB,KAAKuoB,gBAAgBpS,eAAenW,KAAKomB,eAAe,GAAGpmB,KAAKwoB,mBAAmBzS,UAAU,IAAIzD,EAAEkW,mBAAmBxoB,KAAKwoB,mBAAmBrS,gBAAgB7D,EAAEgU,eAAetmB,KAAKsmB,gBAAgBhU,EAAE8T,eAAepmB,KAAKomB,eAAepmB,KAAKsQ,SAAStQ,KAAK4oB,uBAAuB7S,UAAU,EAAEzD,EAAEsW,uBAAuB5oB,KAAK4oB,uBAAuBzS,eAAe7D,EAAEsW,uBAAuB,EAAE5oB,KAAK4nB,UAAU5nB,KAAK4oB,uBAAuBtS,QAAQtW,KAAK4oB,uBAAuB9S,QAAQ9V,KAAKumB,eAAejU,EAAEsW,uBAAuBtW,EAAEiU,cAAcvmB,KAAKumB,eAAe,IAAI,MAAMtnB,EAAEwT,KAAKgR,OAAOuG,QAAQhqB,KAAK6oB,2BAA2BvW,EAAErT,GAAGwT,EAAE0D,eAAe,OAAO7D,CAAC,CAAC,gBAAA2X,CAAiB3X,GAAGA,EAAEA,GAAG,CAAC,EAAE,MAAMrT,EAAE,CAAC,EAAE,IAAI,OAAOe,KAAK4mB,cAAc3nB,EAAE2nB,YAAY5mB,KAAK4mB,aAAa5mB,KAAK6mB,YAAY,IAAI5nB,EAAE4nB,YAAY7mB,KAAK6mB,aAAa5nB,EAAEioB,gBAAgBlnB,KAAKknB,gBAAgBjoB,EAAEkoB,iBAAiBnnB,KAAKmnB,iBAAiBloB,EAAEmoB,qBAAqBpnB,KAAKonB,qBAAqBnoB,EAAEirB,iBAAiBlqB,KAAKumB,cAAc,EAAEvmB,KAAKonB,qBAAqBpnB,KAAKumB,cAAc,IAAI,EAAEtnB,EAAEsnB,cAAcvmB,KAAKumB,cAActnB,EAAEkrB,eAAenqB,KAAKoqB,gBAAgBnrB,EAAEmnB,eAAepmB,KAAKomB,cAAc,CAAC,MAAM9T,GAAG2B,EAAEQ,EAAE7D,MAAM,wCAAwC0B,EAAExB,QAAQ,CAAC,OAAOwB,EAAE6R,IAAIllB,EAAEqT,CAAC,CAAC,mBAAA+X,CAAoB/X,GAAG,IAAIrT,EAAE,GAAG,OAAOA,EAAEqT,EAAE,UAAUtS,KAAK0nB,UAAU,OAAO1nB,KAAKynB,SAAS,QAAQ,aAAaxT,EAAEQ,EAAEkJ,MAAM,iBAAiB1e,GAAGA,CAAC,CAAC,aAAAqrB,GAAgBtqB,KAAKmmB,YAAY,CAAC,aAAAoE,GAAgB,OAAOvqB,KAAKunB,gBAAgBvnB,KAAKunB,eAAc,GAAG,EAAG,CAAC,SAAAiD,GAAY,OAAOxqB,KAAKwnB,cAAcxnB,KAAKwnB,aAAY,EAAGxnB,KAAKuoB,gBAAgBzS,QAAQ9V,KAAK6nB,mBAAmBvR,SAAQ,EAAG,CAAC,OAAAmU,GAAU,SAASzqB,KAAKwnB,aAAaxnB,KAAK2Z,YAAY3Z,KAAKsQ,OAAOtQ,KAAKqmB,cAAcrmB,KAAKsmB,iBAAiBtmB,KAAK2Z,WAAU,EAAG3Z,KAAK4nB,WAAU,EAAG5nB,KAAK8nB,iBAAiBxR,QAAQtW,KAAK4oB,uBAAuBtS,QAAQ,GAAG,CAAC,KAAAoU,GAAQ,QAAQ1qB,KAAKwnB,cAAcxnB,KAAKomB,eAAe,EAAEpmB,KAAKqnB,aAAarnB,KAAK6nB,mBAAmBtR,OAAOvW,KAAK8nB,iBAAiBvR,OAAOvW,KAAK4oB,uBAAuBrS,OAAOvW,KAAK4nB,WAAU,GAAG,EAAG,CAAC,OAAA+C,GAAU,SAAS3qB,KAAK2Z,WAAW3Z,KAAKynB,WAAWznB,KAAKynB,UAAS,EAAGznB,KAAK4nB,WAAU,EAAG5nB,KAAK+nB,gBAAgBzR,QAAQtW,KAAK4oB,uBAAuBrS,OAAOvW,KAAK0oB,iBAAiB5S,QAAQ9V,KAAK2nB,cAAc3nB,KAAKimB,YAAYjmB,KAAK+oB,kBAAkB5S,gBAAgBnW,KAAK8oB,YAAYxS,QAAQ,GAAG,CAAC,QAAAsU,GAAW,SAAS5qB,KAAK2Z,YAAY3Z,KAAKynB,WAAWznB,KAAKynB,UAAS,EAAGznB,KAAK4nB,WAAU,EAAG5nB,KAAK+nB,gBAAgBxR,OAAOvW,KAAK0oB,iBAAiBpS,QAAQtW,KAAK+lB,KAAK/lB,KAAKgmB,KAAKhmB,KAAK8oB,YAAY3S,eAAenW,KAAK+lB,KAAI,IAAK/lB,KAAK2nB,aAAa3nB,KAAK+oB,kBAAkBzS,QAAQtW,KAAKgmB,MAAMhmB,KAAK8oB,YAAY3S,gBAAgB,GAAG,CAAC,aAAA0U,GAAgB,SAAS7qB,KAAKwnB,aAAaxnB,KAAK2nB,cAAc3nB,KAAK2nB,aAAY,EAAG3nB,KAAK4nB,WAAU,EAAG5nB,KAAKioB,qBAAqB3R,QAAQtW,KAAK+oB,kBAAkBzS,QAAQ,GAAG,CAAC,WAAAwU,GAAc,SAAS9qB,KAAKwnB,cAAcxnB,KAAK2nB,cAAc3nB,KAAK2nB,aAAY,EAAG3nB,KAAK4nB,WAAU,EAAG5nB,KAAKioB,qBAAqB1R,OAAOvW,KAAK+lB,KAAK/lB,KAAKimB,WAAWjmB,KAAK+oB,kBAAkB5S,eAAenW,KAAK+lB,KAAI,GAAI/lB,KAAKimB,YAAYjmB,KAAK+oB,kBAAkB5S,gBAAgBnW,KAAKsQ,QAAQtQ,KAAK2mB,2BAA2B3mB,KAAKonB,sBAAsBpnB,KAAKioB,qBAAqBjS,SAAShW,KAAKioB,qBAAqBlS,WAAW,GAAG,CAAC,WAAAgV,GAAc,SAAS/qB,KAAK2Z,WAAW3Z,KAAK0nB,YAAY1nB,KAAK0nB,WAAU,EAAG1nB,KAAK4nB,WAAU,EAAG5nB,KAAKgoB,mBAAmB1R,QAAQtW,KAAK2oB,iBAAiB7S,QAAQ,GAAG,CAAC,SAAAkV,GAAY,SAAShrB,KAAK2Z,YAAY3Z,KAAK0nB,YAAY1nB,KAAK0nB,WAAU,EAAG1nB,KAAK4nB,WAAU,EAAG5nB,KAAKgoB,mBAAmBzR,OAAOvW,KAAK2oB,iBAAiBrS,QAAQ,GAAG,CAAC,cAAA2U,GAAiB,OAAOjrB,KAAK0mB,YAAY1mB,KAAK0mB,WAAU,EAAG1mB,KAAKkoB,sBAAsB5R,SAAQ,EAAG,CAAC,YAAA4U,GAAe,QAAQlrB,KAAK0mB,YAAY1mB,KAAKwnB,aAAY,EAAGxnB,KAAK0mB,WAAU,EAAG1mB,KAAKymB,gBAAgBzmB,KAAKkoB,sBAAsB/R,eAAenW,KAAKkoB,sBAAsB3R,QAAO,EAAG,CAAC,UAAA4U,GAAanrB,KAAKmoB,sBAAsB7R,OAAO,CAAC,WAAA8U,GAAcprB,KAAKooB,uBAAuB9R,OAAO,CAAC,iBAAA+U,GAAoBrrB,KAAKqoB,6BAA6B/R,OAAO,CAAC,YAAAgV,GAAetrB,KAAKsoB,wBAAwBhS,OAAO,CAAC,OAAAiV,GAAUvrB,KAAKwrB,SAAQ,EAAGxrB,KAAKomB,iBAAiBpmB,KAAKsQ,OAAOtQ,KAAKyoB,qBAAqBnS,SAAStW,KAAKwoB,mBAAmBlS,QAAQtW,KAAK2Z,UAAU3Z,KAAKmnB,kBAAiB,EAAGnnB,KAAKknB,iBAAgB,EAAG,CAAC,QAAAuE,GAAWzrB,KAAKuoB,gBAAgBjS,OAAO,CAAC,wBAAAoV,CAAyBpZ,GAAG,GAAGA,GAAG,iBAAiBA,EAAE,CAACtS,KAAK6mB,YAAYpiB,KAAKU,IAAInF,KAAK6mB,YAAYvU,GAAG,MAAMrT,EAAEmX,KAAK6I,MAAM,IAAIjf,KAAK4nB,UAAU,CAAC,GAAG,OAAO5nB,KAAK8mB,cAAc,OAAO9mB,KAAK+mB,4BAA4B,CAAC,MAAMzU,EAAErT,EAAEe,KAAK+mB,4BAA4BzU,EAAE,IAAItS,KAAKgnB,uBAAuBhnB,KAAK8mB,aAAaxU,EAAEtS,KAAKinB,uBAAuB3U,GAAGtS,KAAK+mB,4BAA4B,IAAI,CAAC,YAAY/mB,KAAK8mB,aAAaxU,EAAE,CAAC,GAAG,OAAOtS,KAAK+mB,6BAA6B,OAAO/mB,KAAK8mB,eAAe9mB,KAAK+mB,4BAA4B9nB,GAAG,OAAOe,KAAK8mB,cAAc9mB,KAAK8mB,eAAexU,GAAG,OAAOtS,KAAK+mB,4BAA4B,CAAC,MAAMzU,EAAErT,EAAEe,KAAK+mB,4BAA4BzU,EAAE,IAAItS,KAAKgnB,uBAAuBhnB,KAAK8mB,aAAaxU,EAAEtS,KAAKinB,uBAAuB3U,GAAGtS,KAAK+mB,4BAA4B9nB,CAAC,CAAC,OAAOe,KAAK+mB,8BAA8B/mB,KAAK+mB,4BAA4B9nB,GAAGe,KAAK8mB,aAAaxU,EAAE,IAAIG,EAAEzS,KAAKgnB,sBAAsB/S,EAAEjU,KAAKinB,sBAAsB,MAAMpT,EAAE5U,EAAEe,KAAK+mB,4BAA4BlT,EAAE,IAAIpB,GAAGH,EAAEuB,EAAEI,GAAGJ,GAAG7T,KAAKoqB,gBAAgBnW,EAAE,EAAExP,KAAKC,MAAM+N,EAAEwB,GAAG3B,CAAC,CAAC,CAAC,uBAAAqZ,GAA0B3rB,KAAK6mB,YAAY,EAAE7mB,KAAKgnB,sBAAsB,EAAEhnB,KAAKinB,sBAAsB,EAAEjnB,KAAK4mB,YAAY,KAAK5mB,KAAK8mB,aAAa,KAAK9mB,KAAK+mB,4BAA4B,IAAI,CAAC,iBAAA6E,GAAoB3X,EAAEQ,EAAEkJ,MAAM,uBAAuB3d,KAAK6rB,aAAa7rB,KAAKgpB,iBAAiBlT,OAAO,CAAC,WAAA+V,GAAc,OAAO7rB,KAAKgpB,iBAAiB1oB,aAAa,CAAC,YAAAwrB,GAAe,OAAO7X,EAAEQ,EAAEkJ,MAAM,gBAAgB3d,KAAKgpB,iBAAiB1S,OAAO,CAAC,WAAAyV,GAAc,OAAO9X,EAAEQ,EAAEkJ,MAAM,eAAe3d,KAAKgpB,iBAAiBzS,MAAM,CAAC,cAAAyV,CAAe1Z,GAAG,OAAOtS,KAAK4mB,cAAc5mB,KAAK4mB,YAAYniB,KAAKU,IAAInF,KAAK6nB,mBAAmB1R,eAAe7D,EAAE,GAAG,GAAG,IAAI2Z,EAAExZ,EAAE,KAAK,MAAMyZ,UAAU/X,EAAEM,EAAE,WAAA7Q,CAAY0O,EAAErT,GAAG0M,QAAQ3L,KAAK4M,MAAM,IAAIiZ,EAAE7lB,KAAKyP,WAAW,KAAKzP,KAAKmsB,gBAAgB,KAAKnsB,KAAKosB,QAAQ,KAAKntB,EAAEA,GAAG,CAAC,EAAEe,KAAKyhB,WAAWxiB,GAAGqT,GAAGtS,KAAKqsB,UAAU/Z,EAAErT,EAAEqtB,KAAKrY,EAAEQ,EAAEG,OAAO,WAAW5U,KAAKH,iBAAiB,KAAKG,KAAKyM,oBAAoB,aAAa,CAAC,SAAA8f,CAAUja,GAAGtS,KAAKosB,QAAQ9Z,CAAC,CAAC,UAAAmP,CAAWnP,GAAGA,IAAIA,EAAE7C,YAAYzP,KAAK6P,cAAcyC,EAAE7C,YAAY,kBAAkB6C,EAAEhC,MAAMtQ,KAAK8P,QAAQwC,EAAEhC,MAAM6D,EAAEM,EAAEoP,UAAUpC,WAAWhD,MAAMze,KAAKyd,WAAW,CAAC,SAAA4O,CAAU/Z,EAAErT,IAAIe,KAAKP,QAAQO,KAAKssB,MAAMtsB,KAAK0hB,UAAU,oBAAoBtE,UAAUA,SAASoP,iBAAiB,iBAAiBla,IAAIA,EAAE8K,SAASoP,eAAela,IAAI,iBAAiBrT,IAAIA,EAAEme,SAASoP,eAAevtB,KAAKA,EAAEA,GAAGqT,EAAEtS,KAAKP,OAAO6S,EAAEtS,KAAKssB,IAAIrtB,EAAEe,KAAKqC,mBAAmB,CAAC,IAAAiO,GAAO,OAAOtQ,KAAK4M,MAAM0D,MAAM,CAAC,OAAAR,CAAQwC,GAAGtS,KAAK4M,MAAMkD,QAAQwC,EAAE,CAAC,aAAAzC,CAAcyC,GAAGtS,KAAKysB,oBAAoBna,IAAItS,KAAKyP,WAAW6C,EAAEtS,KAAKyP,WAAWK,SAAQ,GAAI9P,KAAKyP,WAAW0R,cAAcnhB,KAAKA,KAAKyP,WAAWjN,GAAG,IAAIkqB,EAAEhqB,KAAK1C,OAAO,CAAC,iBAAAysB,GAAoBzsB,KAAKyP,aAAazP,KAAKyP,WAAWvM,IAAI,IAAIwpB,GAAG1sB,KAAKyP,WAAWiS,UAAU,CAAC,OAAAA,GAAU1hB,KAAKgiB,gBAAgBhiB,KAAKysB,oBAAoBzsB,KAAKiD,sBAAsBjD,KAAKP,OAAO,KAAKO,KAAKssB,IAAI,IAAI,CAAC,iBAAAjqB,GAAoB,CAAC,mBAAAY,GAAsB,CAAC,SAAAsmB,GAAY,OAAOvpB,KAAKmhB,cAAcnhB,KAAKmhB,cAAcoI,YAAYvpB,KAAK4M,MAAM2c,WAAW,CAAC,cAAAJ,GAAiB,OAAOnpB,KAAKmhB,cAAcnhB,KAAKmhB,cAAcgI,iBAAiBnpB,KAAK4M,MAAMuc,gBAAgB,CAAC,UAAA3oB,GAAa,OAAO,IAAI,CAAC,QAAAa,GAAW,OAAO,IAAI,CAAC,MAAAsrB,GAAS,OAAO,IAAI,CAAC,UAAA5nB,GAAa,OAAO,IAAI,CAAC,kBAAAE,GAAqB,OAAO,IAAI,CAAC,yBAAAK,GAA4B,OAAO,IAAI,CAAC,yBAAAG,GAA4B,OAAO,IAAI,CAAC,gBAAAmB,GAAmB,GAAG5G,KAAKssB,KAAKtsB,KAAKssB,IAAIvlB,4BAA4B,CAAC,IAAIuL,EAAE,GAAGtS,KAAK4sB,mBAAmB,CAACta,EAAEtS,KAAKssB,IAAIvlB,4BAA4B,IAAI9H,EAAEqT,EAAEtS,KAAK4sB,mBAAmBna,EAAEzS,KAAKmH,eAAe,IAAImL,EAAE7N,KAAKC,MAAMzF,EAAEwT,EAAE,EAAE,CAAC,OAAOzS,KAAK4sB,mBAAmB5sB,KAAKssB,IAAIvlB,4BAA4BuL,GAAG,IAAI,CAAC,CAAC,gBAAApO,GAAmB,OAAO,IAAI,CAAC,mBAAAK,GAAsB,OAAO,IAAI,CAAC,iBAAAsoB,CAAkBva,GAAG,IAAIrT,EAAEwT,EAAEzS,KAAKuE,sBAAsB,OAAOvE,KAAKsQ,QAAQrR,EAAEe,KAAK8sB,iBAAiBxa,IAAItS,KAAK8sB,iBAAiBra,KAAKxT,EAAEe,KAAK+sB,eAAeza,IAAItS,KAAK+sB,eAAeta,IAAIA,GAAGxT,EAAEwT,EAAExT,EAAE,KAAKwT,EAAExT,EAAE,OAAO,KAAK,IAAI,CAAC,kBAAA4F,GAAqB,OAAO7E,KAAKssB,IAAItsB,KAAKssB,IAAIre,YAAY,IAAI,CAAC,iBAAAtJ,GAAoB,OAAO3E,KAAKssB,IAAItsB,KAAKssB,IAAIpe,WAAW,IAAI,CAAC,WAAA5N,GAAc,OAAON,KAAKssB,IAAItsB,KAAKssB,IAAI/rB,SAAS,IAAI,CAAC,WAAAL,GAAc,OAAOF,KAAKssB,IAAItsB,KAAKssB,IAAIjsB,YAAY,IAAI,CAAC,WAAA2M,GAAc,OAAO,IAAI,CAAC,MAAA9L,GAAS,OAAOlB,KAAKssB,IAAItsB,KAAKssB,IAAIpf,WAAW,IAAI,CAAC,WAAAxG,GAAc,OAAO1G,KAAKssB,IAAItsB,KAAKssB,IAAI3lB,aAAa,IAAI,CAAC,OAAAyG,GAAU,OAAOpN,KAAKssB,IAAItsB,KAAKssB,IAAIjf,MAAM,IAAI,CAAC,YAAAgB,GAAe,OAAO,IAAI,CAAC,MAAA2e,GAAS,OAAO,IAAI,CAAC,aAAAltB,GAAgB,OAAOE,KAAKH,gBAAgB,CAAC,gBAAAE,GAAmB,OAAOksB,EAAEzJ,EAAE,CAAC,MAAAyK,GAAS,OAAO,IAAI,CAAC,YAAA9e,GAAe,OAAOnO,KAAKssB,IAAItsB,KAAKssB,IAAIle,SAAS,IAAI,CAAC,UAAAE,GAAa,OAAOtO,KAAKssB,IAAItsB,KAAKssB,IAAI/d,QAAQ,IAAI,CAAC,aAAA2e,GAAgB,OAAO,IAAI,CAAC,aAAA3rB,GAAgB,OAAOvB,KAAKmhB,cAAcnhB,KAAKmhB,cAAcvU,MAAM+M,UAAU,MAAM,MAAM,IAAI,CAAC,YAAAjZ,GAAe,OAAO,IAAI,CAAC,eAAAC,GAAkB,OAAO,IAAI,CAAC,0BAAA2L,GAA6B,OAAO,IAAI,CAAC,sBAAAC,GAAyB,OAAO,IAAI,CAAC,yBAAAC,GAA4B,OAAO,IAAI,CAAC,aAAA4V,CAAc9P,EAAErT,GAAG,QAAG,KAAUqT,EAAE6B,EAAEM,EAAEoP,UAAUzB,cAAc3D,MAAMze,KAAKyd,YAAYnN,OAAOgC,EAAEhC,KAAKtQ,KAAKsQ,QAAQgC,EAAE6a,YAAYntB,KAAKmpB,iBAAiB7W,EAAE2C,OAAOjV,KAAKupB,YAAYjX,EAAE8a,WAAWptB,KAAKF,gBAAgBwS,EAAE+a,cAAcrtB,KAAKD,mBAAmBuS,EAAE,4BAA4BtS,KAAKsM,6BAA6BgG,EAAE,wBAAwBtS,KAAKuM,yBAAyB+F,EAAE,2BAA2BtS,KAAKwM,4BAA4B8F,EAAE,cAActS,KAAKosB,QAAQ9Z,EAAEgb,IAAI,UAAU,iBAAiBruB,EAAE,OAAOqT,EAAE,IAAIA,EAAEib,QAAQ1R,OAAO8C,SAASuE,IAAI,CAAC,MAAM5Q,GAAG,CAACtS,KAAKsQ,QAAQgC,EAAElM,KAAKpG,KAAKQ,aAAa8R,EAAEkb,QAAQxtB,KAAKqB,WAAWiR,EAAEmb,MAAMztB,KAAKkB,SAASoR,EAAEob,MAAM1tB,KAAKgtB,SAAShtB,KAAK4M,MAAM+M,YAAYrH,EAAEqb,UAAU3tB,KAAK+E,cAAc,GAAGuN,EAAEsb,gBAAgB5tB,KAAKkE,mBAAmBoO,EAAEub,kBAAkB7tB,KAAK6E,qBAAqByN,EAAEwb,iBAAiB9tB,KAAK2E,oBAAoB2N,EAAEyb,WAAW/tB,KAAKM,cAAcgS,EAAE0b,WAAWhuB,KAAKE,cAAcoS,EAAE2b,WAAWjuB,KAAKgN,cAAcsF,EAAE4b,UAAUluB,KAAKoN,UAAUkF,EAAE6b,MAAMnuB,KAAKitB,SAAS3a,EAAE8b,WAAWpuB,KAAKuB,gBAAgB+Q,EAAE+b,aAAaruB,KAAKW,kBAAkB2R,EAAEgc,UAAUtuB,KAAKU,iBAAiB4R,EAAEic,UAAUvuB,KAAKQ,aAAa8R,EAAEkc,aAAaxuB,KAAKqB,WAAWiR,EAAEmc,WAAWzuB,KAAKkB,SAASoR,EAAEoc,WAAW1uB,KAAKgtB,SAAS1a,EAAEqc,gBAAgB3uB,KAAKE,cAAcoS,EAAEsc,cAAc5uB,KAAK2sB,SAAS3sB,KAAK4M,MAAM+M,YAAYrH,EAAEuc,eAAe7uB,KAAK+E,cAAc,EAAEuN,EAAEwc,uBAAuB9uB,KAAKiF,sBAAsB,EAAEqN,EAAEyc,8BAA8B/uB,KAAKsF,6BAA6B,EAAEgN,EAAE0c,8BAA8BhvB,KAAKyF,6BAA6B,GAAG6M,EAAE2c,qBAAqBjvB,KAAKkE,mBAAmBoO,EAAE4c,uBAAuBlvB,KAAK6E,qBAAqByN,EAAE6c,sBAAsBnvB,KAAK2E,oBAAoB2N,EAAE8c,gBAAgBpvB,KAAKM,cAAcgS,EAAE+c,gBAAgBrvB,KAAKgN,cAAcsF,EAAEgd,gBAAgBtvB,KAAK0G,cAAc4L,EAAEid,oBAAoBvvB,KAAKqO,eAAeiE,EAAEkd,eAAexvB,KAAKoN,UAAUkF,EAAEmd,oBAAoBzvB,KAAKmO,eAAemE,EAAEod,eAAe1vB,KAAKsO,aAAagE,EAAEqd,WAAW3vB,KAAKitB,SAAS,MAAMjtB,KAAKyP,YAAYzP,KAAKyP,WAAW7C,MAAM6Z,gBAAgB,IAAInU,EAAEmU,gBAAgBzmB,KAAKyP,WAAW7C,MAAM6Z,kBAAkBzmB,KAAK4M,MAAM4c,mBAAmBlX,GAAGtS,KAAK4M,MAAM+M,YAAY3Z,KAAKsQ,QAAQtQ,KAAK4M,MAAM8e,yBAAyBpZ,EAAEuc,gBAAgB,IAAI,IAAI5vB,KAAKe,KAAKihB,WAAW3O,EAAErT,GAAGe,KAAKihB,WAAWhiB,GAAG,OAAOe,KAAK4vB,iBAAiBtd,GAAGA,CAAC,CAAC,gBAAAsd,CAAiBtd,GAAG,MAAMrT,GAAGqT,EAAEtS,KAAK4M,MAAMqd,iBAAiB3X,IAAI6R,IAAI,IAAI,IAAI7R,KAAKtS,KAAKihB,WAAWhiB,EAAEqT,GAAGtS,KAAKihB,WAAW3O,EAAE,CAAC,UAAAud,CAAWvd,EAAErT,EAAEwT,GAAGA,EAAEA,GAAG,CAAC,EAAEzS,KAAK6iB,sBAAsBvQ,EAAEG,GAAGzS,KAAK4M,MAAMqc,sBAAsBhqB,EAAE,CAAC,eAAA6wB,CAAgBxd,GAAGtS,KAAK4M,MAAM2d,kBAAkBjY,EAAEA,GAAG,CAAC,EAAEtS,KAAKkiB,gBAAgBgK,EAAEnX,OAAOgb,aAAazd,GAAG,CAAC,WAAAnP,CAAYmP,GAAG,GAAGtS,KAAK4M,MAAM4d,YAAY,CAAC,IAAIvrB,EAAEe,KAAKsQ,QAAQrR,EAAEitB,EAAEnX,OAAOib,WAAWhwB,KAAK2iB,kBAAkB1jB,EAAEqT,KAAKrT,EAAEitB,EAAEnX,OAAOkb,gBAAgBjwB,KAAKkiB,gBAAgBjjB,EAAEqT,GAAG,CAAC,CAAC,SAAAlP,CAAUkP,GAAG,GAAGtS,KAAK4M,MAAM6d,UAAU,CAAC,IAAIxrB,EAAE,GAAGe,KAAKsQ,OAAOrR,EAAEitB,EAAEnX,OAAOmb,SAASlwB,KAAKmhB,gBAAgBnhB,KAAKmhB,cAAcvU,MAAMgb,WAAU,GAAI5nB,KAAK2iB,kBAAkB1jB,EAAEqT,GAAGtS,KAAK4M,MAAMkf,mBAAmB,CAAC7sB,EAAEitB,EAAEnX,OAAOob,cAAc,IAAI1d,EAAE,EAAEzS,KAAKyP,cAAczP,KAAKyP,WAAW7C,MAAMgb,WAAW5nB,KAAKyP,WAAW7C,MAAM+a,eAAe3nB,KAAKyP,WAAW7C,MAAMmf,cAAc/rB,KAAKyP,WAAW7C,MAAMgb,WAAU,EAAG5nB,KAAKyP,WAAW7C,MAAM+a,aAAY,GAAIlV,EAAEzS,KAAKyP,WAAW7C,MAAMif,eAAe,GAAG7rB,KAAK4M,MAAMof,eAAevZ,GAAGzS,KAAKkiB,gBAAgBjjB,EAAEqT,GAAGuB,EAAEE,wBAAwByB,wBAAuB,KAAK,GAAGxV,KAAK4M,MAAM,CAAC,MAAM0F,EAAEtS,KAAK4M,MAAMqd,iBAAiB,CAAC,GAAG9F,IAAItQ,EAAEE,wBAAwB2B,eAAepD,EAAEtS,KAAKupB,YAAY,IAAG,CAACvpB,KAAK4hB,iBAAiB5hB,KAAK4M,MAAMwe,aAAa,CAAC,CAAC,OAAA7nB,CAAQ+O,GAAG,GAAGtS,KAAK4M,MAAM8d,QAAQ,CAAC,IAAIzrB,EAAEqT,EAAEA,GAAG,CAAC,EAAEtS,KAAKsQ,QAAQrR,EAAEitB,EAAEnX,OAAOqb,OAAO9d,EAAEmX,qBAAqBzpB,KAAK4M,MAAMib,mBAAmB1R,eAAe7D,EAAEqX,mBAAmB3pB,KAAK4M,MAAMkb,iBAAiB3R,eAAenW,KAAKmhB,gBAAgBnhB,KAAKmhB,cAAcvU,MAAMgb,WAAU,GAAI5nB,KAAK4M,MAAMmf,gBAAgB9sB,EAAEitB,EAAEnX,OAAOsb,YAAY/d,EAAEuV,mBAAmB7nB,KAAK4M,MAAMib,mBAAmB1R,eAAe7D,EAAEwV,iBAAiB9nB,KAAK4M,MAAMkb,iBAAiB3R,gBAAgBnW,KAAKgiB,gBAAgBhiB,KAAKsQ,OAAOtQ,KAAK2iB,kBAAkB1jB,EAAEqT,GAAGtS,KAAKkiB,gBAAgBjjB,EAAEqT,GAAGtS,KAAKmhB,eAAenhB,KAAKsQ,QAAQtQ,KAAKmhB,cAAcvU,MAAM6e,WAAWzrB,KAAK4M,MAAM0d,gBAAgBtqB,KAAK4M,MAAM2Z,cAAc,EAAEvmB,KAAKsQ,SAASuD,EAAEE,wBAAwBwB,oBAAoB1B,EAAEE,wBAAwByB,uBAAuB,MAAMxV,KAAKyP,YAAYzP,KAAKyP,WAAW7C,MAAMgf,oBAAoB5rB,KAAK4M,MAAM+e,0BAA0B,CAAC,CAAC,SAAAtoB,CAAUiP,GAAG,GAAGtS,KAAK4M,MAAM+d,UAAU,CAAC,IAAI1rB,EAAEe,KAAKsQ,OAAO4b,EAAEnX,OAAOub,SAASpE,EAAEnX,OAAOwb,cAAcvwB,KAAKsQ,OAAOtQ,KAAK2iB,kBAAkB1jB,EAAEqT,GAAGtS,KAAKkiB,gBAAgBjjB,EAAEqT,EAAE,CAAC,CAAC,UAAAhP,CAAWgP,GAAG,GAAGtS,KAAK4M,MAAMge,WAAW,CAAC,IAAI3rB,EAAEqT,EAAEA,GAAG,CAAC,EAAEtS,KAAKsQ,QAAQrR,EAAEitB,EAAEnX,OAAOyb,UAAUle,EAAEsX,kBAAkB5pB,KAAK4M,MAAMmb,gBAAgB5R,iBAAiBlX,EAAEitB,EAAEnX,OAAO0b,eAAene,EAAEyV,gBAAgB/nB,KAAK4M,MAAMmb,gBAAgB5R,gBAAgBnW,KAAKsQ,OAAOtQ,KAAK2iB,kBAAkB1jB,EAAEqT,GAAGtS,KAAKkiB,gBAAgBjjB,EAAEqT,EAAE,CAAC,CAAC,eAAAvB,CAAgBuB,GAAG,GAAGtS,KAAK4M,MAAMie,gBAAgB,CAAC,IAAI5rB,EAAEqT,EAAEA,GAAG,CAAC,EAAErT,EAAEe,KAAKsQ,OAAO4b,EAAEnX,OAAO2b,gBAAgBxE,EAAEnX,OAAO4b,qBAAqBre,EAAEtS,KAAK4wB,sBAAsBte,GAAGtS,KAAKmsB,gBAAgB7Z,EAAEue,WAAW7wB,KAAKsQ,OAAOtQ,KAAK2iB,kBAAkB1jB,EAAEqT,GAAGtS,KAAKkiB,gBAAgBjjB,EAAEqT,EAAE,CAAC,CAAC,aAAA9B,CAAc8B,GAAG,GAAGtS,KAAK4M,MAAMke,cAAc,CAAC,IAAI7rB,EAAEqT,EAAEA,GAAG,CAAC,EAAEtS,KAAKsQ,QAAQrR,EAAEitB,EAAEnX,OAAO+b,cAAcxe,EAAEuX,uBAAuB7pB,KAAK4M,MAAMqb,qBAAqB9R,iBAAiBlX,EAAEitB,EAAEnX,OAAOgc,mBAAmBze,EAAE2V,qBAAqBjoB,KAAK4M,MAAMqb,qBAAqB9R,gBAAgB7D,EAAEtS,KAAK4wB,sBAAsBte,GAAG,MAAMtS,KAAKmsB,kBAAkB7Z,EAAEue,WAAW7wB,KAAKmsB,iBAAiBnsB,KAAKsQ,OAAOtQ,KAAK2iB,kBAAkB1jB,EAAEqT,GAAGtS,KAAKkiB,gBAAgBjjB,EAAEqT,GAAGtS,KAAK4M,MAAM+Z,0BAAyB,CAAE,CAAC,CAAC,qBAAAiK,CAAsBte,GAAG,OAAO,MAAMA,EAAEwV,kBAAkBxV,EAAEwV,iBAAiB,IAAIxV,EAAE0e,oBAAoBhxB,KAAK4M,MAAM+Z,yBAAyBrU,EAAE0e,oBAAmB,EAAG1e,EAAEue,WAAW7wB,KAAK4M,MAAMyd,oBAAoB/X,EAAE0e,oBAAoB1e,EAAEoW,iBAAiB1oB,KAAK4M,MAAM8b,iBAAiBvS,eAAe7D,EAAEqW,iBAAiB3oB,KAAK4M,MAAM+b,iBAAiBxS,eAAe7D,CAAC,CAAC,aAAA5B,CAAc4B,GAAG,GAAGtS,KAAK4M,MAAMme,cAAc,CAAC,IAAI9rB,EAAEA,EAAEe,KAAKsQ,OAAO4b,EAAEnX,OAAOkc,cAAc/E,EAAEnX,OAAOmc,mBAAmBlxB,KAAKsQ,OAAOtQ,KAAK2iB,kBAAkB1jB,EAAEqT,GAAGtS,KAAKkiB,gBAAgBjjB,EAAEqT,EAAE,CAAC,CAAC,WAAA3B,CAAY2B,GAAG,GAAGtS,KAAK4M,MAAMoe,YAAY,CAAC,IAAI/rB,EAAEqT,EAAEA,GAAG,CAAC,EAAEtS,KAAKsQ,QAAQrR,EAAEitB,EAAEnX,OAAOoc,YAAY7e,EAAEwX,qBAAqB9pB,KAAK4M,MAAMob,mBAAmB7R,iBAAiBlX,EAAEitB,EAAEnX,OAAOqc,iBAAiB9e,EAAE0V,mBAAmBhoB,KAAK4M,MAAMob,mBAAmB7R,gBAAgBnW,KAAKsQ,OAAOtQ,KAAK2iB,kBAAkB1jB,EAAEqT,GAAGtS,KAAKkiB,gBAAgBjjB,EAAEqT,EAAE,CAAC,CAAC,YAAA9C,CAAa8C,IAAIA,EAAEA,GAAG,CAAC,GAAG1F,OAAOqH,EAAEQ,EAAEC,KAAK,iDAAiD1U,KAAKkiB,gBAAgBgK,EAAEnX,OAAOsc,SAAS/e,GAAGtS,KAAK4M,MAAMue,YAAY,CAAC,SAAA1nB,CAAU6O,IAAIA,EAAEA,GAAG,CAAC,GAAGhC,KAAKtQ,KAAKsQ,OAAOtQ,KAAK4M,MAAM2e,UAAU,IAAItsB,EAAEe,KAAKsQ,OAAO4b,EAAEnX,OAAOxN,SAAS2kB,EAAEnX,OAAOuc,cAActxB,KAAK4iB,qBAAqB3jB,EAAEqT,EAAE,CAAC,oBAAAif,CAAqBjf,GAAG,IAAIrT,GAAGqT,EAAEA,GAAG,CAAC,GAAG+V,6BAA6BroB,KAAK4M,MAAMyb,6BAA6BlS,eAAe7D,EAAE6G,MAAMnZ,KAAK6sB,mBAAkB,GAAI5tB,EAAEe,KAAKsQ,OAAO4b,EAAEnX,OAAOyc,oBAAoBtF,EAAEnX,OAAO0c,yBAAyBzxB,KAAKsQ,OAAOtQ,KAAK2iB,kBAAkB1jB,EAAEqT,GAAGtS,KAAKkiB,gBAAgBjjB,EAAEqT,GAAGtS,KAAK4M,MAAMye,mBAAmB,CAAC,aAAAtJ,CAAczP,GAAG,GAAGtS,KAAK4M,MAAM4a,YAAY,CAAC,IAAIvoB,EAAEwT,EAAEzS,KAAKmH,eAAenH,KAAK4M,MAAMmZ,KAAI,EAAGtT,EAAEzS,KAAK0xB,0BAA0Bjf,GAAGzS,KAAKsQ,QAAQrR,EAAEitB,EAAEnX,OAAO4c,aAAa,iBAAiB3xB,KAAKF,gBAAgBE,KAAK2iB,kBAAkB1jB,EAAEqT,GAAGtS,KAAK2iB,kBAAkB1jB,EAAE,CAAC6pB,YAAYrW,KAAKH,MAAMrT,EAAEitB,EAAEnX,OAAO6c,kBAAkB5xB,KAAKkiB,gBAAgBjjB,EAAE,CAAC6pB,YAAYrW,KAAKH,KAAKtS,KAAK4M,MAAMwe,aAAa,CAAC,CAAC,yBAAAsG,CAA0Bpf,GAAG,OAAOtS,KAAK4M,MAAMoZ,OAAO1T,GAAGtS,KAAK4M,MAAMoZ,KAAKhmB,KAAK4M,MAAMoZ,KAAK,GAAGhmB,KAAK4M,MAAM6a,YAAYnV,GAAGtS,KAAK4M,MAAMkc,YAAY3S,gBAAgB,KAAK7D,EAAE,GAAGtS,KAAK4M,MAAMkc,YAAYxS,SAAStW,KAAK4M,MAAMqZ,YAAY3T,GAAGtS,KAAK4M,MAAMqZ,WAAWjmB,KAAK4M,MAAMqZ,WAAW,GAAGjmB,KAAK4M,MAAM+a,eAAerV,GAAGtS,KAAK4M,MAAMmc,kBAAkB5S,gBAAgB,IAAI7D,EAAE,GAAGtS,KAAK4M,MAAMmc,kBAAkBzS,SAAS7R,KAAKU,IAAI,EAAEmN,EAAE,CAAC,gBAAAoB,CAAiBpB,GAAGtS,KAAKsQ,QAAQtQ,KAAK4M,MAAMqe,mBAAmBjrB,KAAK4M,MAAM6Z,gBAAgB,EAAEzmB,KAAKmhB,gBAAgBnhB,KAAKmhB,cAAcvU,MAAMgb,WAAU,GAAI5nB,KAAK2iB,kBAAkBuJ,EAAEnX,OAAO8c,eAAevf,GAAG,CAAC,cAAAqB,CAAerB,GAAGtS,KAAKsQ,QAAQtQ,KAAK4M,MAAMse,kBAAkB5Y,EAAEA,GAAG,CAAC,GAAGyX,sBAAsB/pB,KAAK4M,MAAMsb,sBAAsB/R,eAAenW,KAAK2iB,kBAAkBuJ,EAAEnX,OAAO+c,aAAaxf,GAAGtS,KAAKmhB,gBAAgBnhB,KAAKmhB,cAAcvU,MAAMgb,WAAU,GAAI5nB,KAAKgiB,gBAAgBhiB,KAAKmhB,eAAenhB,KAAKsQ,QAAQtQ,KAAKmhB,cAAcvU,MAAM6e,WAAW,CAAC,cAAAzhB,CAAesI,GAAGtS,KAAKsQ,UAAUgC,EAAEA,GAAG,CAAC,GAAGsB,UAAUK,EAAEQ,EAAEC,KAAK,sDAAsDpC,EAAEgW,wBAAwBtoB,KAAK4M,MAAM0b,wBAAwBnS,eAAenW,KAAK2iB,kBAAkBuJ,EAAEnX,OAAOgd,YAAYzf,GAAGtS,KAAK4M,MAAM0e,eAAe,CAAC,WAAAvhB,CAAYuI,GAAGtS,KAAKsQ,UAAUgC,EAAEA,GAAG,CAAC,GAAGrO,KAAKgQ,EAAEQ,EAAEC,KAAK,8CAA8C1U,KAAK2iB,kBAAkBuJ,EAAEnX,OAAOid,SAAS1f,GAAG,EAAE,SAASoa,EAAEpa,GAAGA,EAAE9Q,OAAO0qB,EAAEnX,OAAOxN,SAASvH,KAAK2iB,kBAAkBrQ,EAAE9Q,KAAK8Q,EAAE7H,MAAMzK,KAAK4iB,qBAAqBtQ,EAAE9Q,KAAK8Q,EAAE7H,KAAK,CAACyhB,EAAEnX,OAAO,CAACgb,aAAa,eAAesB,SAAS,WAAW9T,MAAM,QAAQ0S,gBAAgB,kBAAkBE,cAAc,gBAAgBE,YAAY,cAAcE,cAAc,gBAAgBE,eAAe,iBAAiBS,mBAAmB,qBAAqBE,iBAAiB,mBAAmBT,qBAAqB,uBAAuBI,mBAAmB,qBAAqBa,kBAAkB,oBAAoBH,yBAAyB,2BAA2BH,cAAc,gBAAgBtB,WAAW,aAAaE,SAAS,WAAWE,OAAO,SAASE,SAAS,WAAWE,UAAU,YAAYS,cAAc,gBAAgBE,YAAY,cAAcT,gBAAgB,kBAAkBI,cAAc,gBAAgBa,aAAa,eAAeH,oBAAoB,sBAAsBjqB,SAAS,WAAWsqB,eAAe,iBAAiBC,aAAa,eAAeC,YAAY,cAAcC,SAAS,YAAY,MAAMhkB,EAAEke,EAAE,IAAI+F,EAAExf,EAAE,KAAKyf,EAAEzf,EAAE,KAAK0f,EAAE1f,EAAE,KAAK2f,EAAE3f,EAAE,KAAK,MAAM4f,EAAE,CAAC3wB,UAAUwS,EAAEO,EAAE6d,OAAO9N,EAAE/P,EAAEnS,IAAI2R,EAAEQ,EAAE8d,QAAQ7N,EAAEjQ,EAAE+d,QAAQre,EAAEM,EAAEhJ,aAAauC,EAAEykB,kBAAkB5M,EAAE9Z,KAAKwY,EAAE5X,QAAQsf,EAAEzJ,GAAGkQ,uBAAuBT,EAAE3f,EAAEqgB,kBAAkBT,EAAE7Y,EAAEuZ,oBAAoBT,EAAE5Y,EAAEsZ,iBAAiBT,EAAEje,EAAE2e,YAAY9e,8FC+Dvy+C,SAAkC+e,GACvC,MAAMC,EAAQD,EAAYC,MAAMC,EAAAA,kBAEhC,IAAKD,EACH,OAAO,KAGT,MAAME,EAAYF,EAAM,GASxB,OAJ4BD,EACzBrT,QAAQyT,EAAAA,4BAA6B,iBACrCzT,QAAQ0T,EAAAA,2BAA4B,IAAIF,IAG7C,yDA+QO,SAAuCG,GAC5C,MAAMC,EAAWD,EAASC,SACpBC,EAAsBF,EAASE,qBAAuB,GACtDC,EAAW,GAEjB,IAAIC,EAAiB,KACjBC,EAAa,KACbrzB,EAAc,EAElBizB,EAAS3b,SAAQ,CAACgc,EAASC,KACzB,MAAMC,EAAcC,EAAqBH,GACnCI,EAAmBR,EAAoB9iB,SAASmjB,GAEtD,GAAIC,EAAa,CAEXE,GAAoBL,IACtBA,EAAWM,QAAU3zB,EACjBqzB,EAAWnzB,SAAW0zB,EAAAA,iBACxBR,EAAeS,KAAK7c,KAAKqc,GAE3BA,EAAa,MAIVD,IACHA,EAAiB,CACfhzB,GAAI,SAASJ,IACb0V,UAAW1V,EACXE,SAAU,EACVyzB,QAAS,KACTvU,OAAQ,oBACR0U,qBAAqB,EACrBC,eAAe,EACfC,aAAa,EACbC,iBAAiB,EACjBC,YAAY,EACZC,YAAY,EACZC,YAAY,EACZP,KAAM,KAKLR,IACHA,EAAa,CACX3d,UAAW1V,EACXE,SAAU,EACVyzB,QAAS,KACTI,eAAe,EACfG,YAAY,EACZC,YAAY,EACZC,YAAY,IAKhB,MAAMC,EAAkBf,EAAQpzB,UAAY,EAC5CkzB,EAAelzB,UAAYm0B,EAC3BhB,EAAWnzB,UAAYm0B,CACzB,MAEMjB,IAEEC,IACFA,EAAWM,QAAU3zB,EACjBqzB,EAAWnzB,SAAW0zB,EAAAA,iBACxBR,EAAeS,KAAK7c,KAAKqc,GAE3BA,EAAa,MAIfD,EAAeO,QAAU3zB,EACrBozB,EAAelzB,SAAW0zB,EAAAA,iBAC5BT,EAASnc,KAAKoc,GAEhBA,EAAiB,MAIrBpzB,GAAeszB,EAAQpzB,UAAY,CAAC,IAIlCkzB,IACEC,IACFA,EAAWM,QAAU3zB,EACjBqzB,EAAWnzB,SAAW0zB,EAAAA,iBACxBR,EAAeS,KAAK7c,KAAKqc,IAG7BD,EAAeO,QAAU3zB,EACrBozB,EAAelzB,SAAW0zB,EAAAA,iBAC5BT,EAASnc,KAAKoc,IAIlB,OAAOD,CACT,gCAtZO,SAAqCvvB,GAC1C,GAAIA,EAAIwM,SAASkkB,EAAAA,wBACf,OAAOC,EAAAA,cAAc1jB,IAChB,GAAIjN,EAAIwM,SAASokB,EAAAA,yBACtB,OAAOD,EAAAA,cAAczjB,KAEvB,OAAOyjB,EAAAA,cAAc1jB,GACvB,6BAKO,SAAkC3Q,GACvC,OAAOA,IAAau0B,IAAWC,EAAAA,YAAY9jB,KAAO8jB,EAAAA,YAAY/jB,GAChE,wBA2CO,SAA6BgkB,EAAcC,EAAeC,GAC/D,GAAIA,IAAeH,EAAAA,YAAY9jB,KAC7B,OAAO,KAIT,OAAqB,IAAjB+jB,EACKG,EAAAA,YAAY/jB,SACV4jB,IAAiBC,EAAgB,EACnCE,EAAAA,YAAY7jB,UAEZ6jB,EAAAA,YAAY9jB,QAEvB,yCAqVO,SAA8C+jB,EAAYC,GAC/D,MAAMC,EAAc,IAAIC,IAGxBH,EAAWzd,SAASvX,IAClB,MAAMo1B,EAAM/wB,KAAKC,MAAMtE,EAAG2V,WAC1Buf,EAAYG,IAAID,EAAKp1B,EAAG,IAI1B,MAAMs1B,EAAS,GAwEf,OAvEAL,EAAe1d,SAASge,IACtB,MAAMC,EAAUD,EAAMx1B,KAAOw1B,EAAMx1B,IAAI+E,OAAS,EAAIywB,EAAMx1B,IAAI,GAAK,KACnE,IAAKy1B,EAAS,OAEd,MAAMJ,EAAM/wB,KAAKC,MAAMkxB,EAAQC,oBACzBC,EAAaR,EAAY1R,IAAI4R,GAE/BM,GAEFA,EAAWr1B,GAAKk1B,EAAMI,QACtBD,EAAWzvB,WAAauvB,EAAQxvB,KAChC0vB,EAAWvvB,MAAQqvB,EAAQpI,QAC3BsI,EAAW3B,qBAAsB,EAG7BwB,EAAMx1B,KAAOw1B,EAAMx1B,IAAI+E,OAAS,GAAK4wB,EAAW5B,MAClDyB,EAAMx1B,IAAIwX,SAAQ,CAACqe,EAAYC,KACzBH,EAAW5B,KAAK+B,IAElBH,EAAW5B,KAAK+B,GAAS1vB,MAAQyvB,EAAWxI,QAC5CsI,EAAW5B,KAAK+B,GAAS5vB,WAAa2vB,EAAW5vB,KACjD0vB,EAAW5B,KAAK+B,GAASC,kBAAoBF,EAAWH,mBACxDC,EAAW5B,KAAK+B,GAASE,iBAAmBH,EAAWI,mBAGvDN,EAAW5B,KAAK7c,KAAK,CACnBtB,UAAWigB,EAAWH,mBACtBt1B,SAAUy1B,EAAWI,kBACrBpC,QAASgC,EAAWH,mBAAqBG,EAAWI,kBACpD7vB,MAAOyvB,EAAWxI,QAClBnnB,WAAY2vB,EAAW5vB,KACvBguB,eAAe,EACfG,YAAY,EACZC,YAAY,EACZC,YAAY,GAEhB,KAKJiB,EAAOre,KAAK,CACV5W,GAAIk1B,EAAMI,QACVhgB,UAAW6f,EAAQC,mBACnBt1B,SAAUo1B,EAAMS,kBAChBpC,QAAS4B,EAAQC,mBAAqBF,EAAMS,kBAC5C7vB,MAAOqvB,EAAQpI,QACfnnB,WAAYuvB,EAAQxvB,KACpBqZ,OAAQ,eACR0U,qBAAqB,EACrBC,eAAe,EACfC,aAAa,EACbC,iBAAiB,EACjBC,YAAY,EACZC,YAAY,EACZC,YAAY,EACZP,KAAMyB,EAAMx1B,IAAIiF,KAAKhF,IAAE,CACrB2V,UAAW3V,EAAGy1B,mBACdt1B,SAAUH,EAAGg2B,kBACbpC,QAAS5zB,EAAGy1B,mBAAqBz1B,EAAGg2B,kBACpC7vB,MAAOnG,EAAGotB,QACVnnB,WAAYjG,EAAGgG,KACfguB,eAAe,EACfG,YAAY,EACZC,YAAY,EACZC,YAAY,OAGlB,IAGKiB,CACT,0CAeO,SAA+CW,GACpD,MAAMrD,EAAQqD,EAAarD,MAAMsD,EAAAA,kCACjC,OAAOtD,EAAQuD,EAAiBvD,EAAM,IAAM,IAC9C,oCAZO,SAAyCqD,GAC9C,MAAMrD,EAAQqD,EAAarD,MAAMwD,EAAAA,2BACjC,OAAOxD,EAAQyD,SAASzD,EAAM,GAAI,IAAM,IAC1C,4BAuOO,SAAiC0D,EAAYC,GAClD,MAAMC,EAAQF,EAAWG,MAAM,MAE/B,IAAK,MAAMC,KAAQF,EACjB,IACGE,EAAKC,WAAWC,EAAAA,iBACjBF,EAAKrmB,SAASkkB,EAAAA,wBAEd,OAAO,IAAIsC,IAAIH,EAAKI,OAAQP,GAASzT,KAIzC,OAAO,IACT,sBA7LOiU,eAAiCpE,GACtC,aAAaqE,EAAiBrE,EAChC,2BA7BOoE,eAAsCpE,GAC3C,MAAM2D,QAAmBU,EAAiBrE,GAGpC6D,EAAQF,EAAWG,MAAM,MAC/B,IAAIQ,EAAmB,KAEvB,IAAK,MAAMP,KAAQF,EACjB,IAAKE,EAAKC,WAAWC,EAAAA,iBAAmBF,EAAKrmB,SAASkkB,EAAAA,wBAAyB,CAC7E0C,EAAmB,IAAIJ,IAAIH,EAAKI,OAAQnE,GAAa7P,KACrD,KACF,CAGF,MAAO,CAAEwT,aAAYW,mBACvB,0BAKOF,eAAqCG,GAC1C,aAAaF,EAAiBE,EAChC,sBAtbO,SAA2BlC,EAAY/0B,GAC5C,OAAO+0B,EAAWzc,MACfvY,GAAOC,GAAeD,EAAG2V,WAAa1V,EAAcD,EAAG4zB,SAE5D,kBAKO,SAAuBuD,EAASl3B,GACrC,IAAKk3B,IAAYA,EAAQrD,MAAgC,IAAxBqD,EAAQrD,KAAKhvB,OAC5C,OAAO,KAGT,OAAOqyB,EAAQrD,KAAKvb,MACjB6e,GAAQn3B,GAAem3B,EAAIzhB,WAAa1V,EAAcm3B,EAAIxD,SAE/D,qBAzDO,SAA0BoB,EAAYrf,GAC3C,OAAOqf,EAAW1c,WACftY,GAAOqE,KAAKgzB,IAAIr3B,EAAG2V,UAAYA,GAAa2hB,EAAAA,qBAEjD,uBAgBO,SAA4BC,EAAUp3B,EAAUq3B,GACrD,MAAMC,EAAYC,EAAmBv3B,GAC/Bw3B,EAAS,GAEXJ,GAAYE,EAAUG,KAAOJ,EAAeI,IAC9CD,EAAO1gB,KAAK,CAAEzD,SAAU,EAAG4hB,IAAK,OAE9BmC,GAAYE,EAAUI,KAAOL,EAAeK,IAC9CF,EAAO1gB,KAAK,CAAEzD,SAAU,EAAG4hB,IAAK,OAE9BmC,GAAYE,EAAUK,KAAON,EAAeM,IAC9CH,EAAO1gB,KAAK,CAAEzD,SAAU,EAAG4hB,IAAK,OAGlC,OAAOuC,CACT,iBAtHO,WAEL,OADY,IAAI3hB,MACL+hB,cAAc7O,UAAU,GAAI,GACzC,wBA4rBO6N,eAAmCiB,EAAqBC,EAAU,IAAMC,EAAiB,MAE9F,MAAM3tB,EAAa,IAAI4V,gBACjBgY,EAAY/d,YAAW,IAAM7P,EAAW6V,SAAS6X,GAGjDG,EAAeA,IAAM7tB,EAAW6V,QAClC8X,GACFA,EAAe7wB,iBAAiB,QAAS+wB,GAG3C,IACE,MAAMC,QAAiBhY,MAAM,GAAG2X,OAAyBhiB,KAAK6I,QAAS,CACrEyB,OAAQ/V,EAAW+V,OACnBgY,YAAa,YAQf,GALAre,aAAake,GACTD,GACFA,EAAehvB,oBAAoB,QAASkvB,IAGzCC,EAASrY,GACZ,MAAM,IAAItB,MAAM,uBAAuB2Z,EAAS5b,UAGlD,aAAa4b,EAASE,MACxB,CAAE,MAAO/nB,GAKP,MAJAyJ,aAAake,GACTD,GACFA,EAAehvB,oBAAoB,QAASkvB,GAExC5nB,CACR,CACF,4CAhlBO,SAAwB2mB,GAC7B,OAAOA,EAAQh3B,SAAW0zB,EAAAA,eAC5B,qBAKO,SAA0B2E,EAAkBlD,GACjD,MAAMJ,EAAc,IAAIC,IAGxBqD,EAAiBjhB,SAASvX,IACxB,MAAMo1B,EAAM/wB,KAAKC,MAAMtE,EAAG2V,WAC1Buf,EAAYG,IAAID,EAAKp1B,EAAG,IAI1B,MAAMy4B,EAAS,GACfnD,EAAO/d,SAASmhB,IACd,MAAMtD,EAAM/wB,KAAKC,MAAMo0B,EAAM/iB,WACvB+f,EAAaR,EAAY1R,IAAI4R,GAE9BM,GAGOA,EAAW3B,qBAAuB2E,EAAM3E,qBAClD1Q,OAAOsV,OAAOjD,EAAYgD,IAH1BD,EAAOxhB,KAAKyhB,GACZxD,EAAYG,IAAID,EAAKsD,GAGvB,IAIF,MAAME,EAAgB,IAAIJ,KAAqBC,GAG/C,OAFAG,EAAcC,MAAK,CAAC/kB,EAAGme,IAAMne,EAAE6B,UAAYsc,EAAEtc,YAEtCijB,CACT,iCA6ZO,SAAsCE,GAC3C,MACMC,GADS,IAAIC,WACAC,gBAAgBH,EAAS,YACtC/4B,EAAM,GAENm5B,EAAcH,EAAIruB,cAAc,eACtC,GAAIwuB,EAEF,OADA3pB,QAAQiB,MAAM,6BAA8B0oB,EAAYC,aACjDp5B,EAGT,MAAMq5B,EAAUL,EAAIM,iBAAiB,UAGrC,GAFA9pB,QAAQC,IAAI,cAAc4pB,EAAQt0B,qCAE9Bs0B,EAAQt0B,OAAS,EAGnBs0B,EAAQ7hB,SAAS+hB,IACf,MAAMC,EAAYD,EAAO5uB,cAAc,WAGvC,KAFgB6uB,EAAYA,EAAUJ,YAAYrC,OAAS,IAE9CzmB,SAASmpB,EAAAA,oBACpB,OAGF,MAAMC,EAAWH,EAAOI,aAAa,OAAS,GACxC/jB,EAAYwgB,EAAiBmD,EAAOI,aAAa,UAAY,QAC7Dv5B,EAAWg2B,EAAiBmD,EAAOI,aAAa,aAAe,IAEjEv5B,EAAW0zB,EAAAA,gBACbtkB,QAAQC,IAAI,wBAAwBiqB,2BAAkCt5B,QAIxEoP,QAAQC,IAAI,4BAA4BiqB,IAAY,CAAE9jB,YAAWxV,aAEjEJ,EAAIkX,KAAK,CACP5W,GAAIo5B,EACJ9jB,YACAxV,WACAyzB,QAASje,EAAYxV,EACrBkf,OAAQsa,EAAAA,UAAUxoB,aAClB4iB,qBAAqB,EACrBC,eAAe,EACfC,aAAa,EACbC,iBAAiB,EACjBC,YAAY,EACZC,YAAY,EACZC,YAAY,EACZP,KAAM,KACN,QAEC,CAGL,MAAM8F,EAAeb,EAAIM,iBACvBQ,EAAAA,mCAGFtqB,QAAQC,IAAI,cAAcoqB,EAAa90B,2DAEvC80B,EAAariB,SAASuiB,IACpB,MAAMC,EAAYC,WAAWF,EAAOJ,aAAa,cAAgB,KAEjEI,EAAOT,iBAAiB,SAAS9hB,SAAS9W,IACxC,MAAMw5B,EAAmBD,WAAWv5B,EAAMi5B,aAAa,qBAAuB,GACxEv5B,EAAW65B,WAAWv5B,EAAMi5B,aAAa,aAAe,GACxDQ,EACJz5B,EAAMi5B,aAAa,OACnB,GAAGS,EAAAA,wBAAwBF,IAEvBtkB,EAA0B,IAAdokB,EAAkBE,EAAmBF,EAAYE,EAC7DG,EAAgC,IAAdL,EAAkB55B,EAAW45B,EAAY55B,EAE7Di6B,EAAkBvG,EAAAA,gBACpBtkB,QAAQC,IAAI,uBAAuB0qB,2BAAiCE,QAItE7qB,QAAQC,IAAI,gCAAgC0qB,IAAW,CAAEvkB,YAAWykB,oBAEpEr6B,EAAIkX,KAAK,CACP5W,GAAI65B,EACJvkB,YACAxV,SAAUi6B,EACVxG,QAASje,EAAYykB,EACrB/a,OAAQsa,EAAAA,UAAUxoB,aAClB4iB,qBAAqB,EACrBC,eAAe,EACfC,aAAa,EACbC,iBAAiB,EACjBC,YAAY,EACZC,YAAY,EACZC,YAAY,EACZP,KAAM,KACN,GACF,GAEN,CAGA,OADAvkB,QAAQC,IAAI,eAAezP,EAAI+E,+CACxB/E,CACT,gCA9fO,SAAqCk2B,GAC1C,MAAMO,EAAQP,EAAaQ,MAAM,MAC3BrD,EAAW,GAEjB,IAAInzB,EAAc,EACdozB,EAAiB,KACjBgH,EAAsB,KACtBC,EAAa,KACbC,EAAS,GACTC,GAAc,EAElB,IAAK,MAAM9D,KAAQF,EAAO,CAExB,GAAIiE,EAAAA,oBAAoBC,KAAKhE,IACvB8D,GAAeF,EAAY,CAC7B,MAAMK,EAAWjE,EAAK9D,MAAMgI,EAAAA,WACtBC,EAASF,EAAWA,EAAS,GAAK,KAExC,GAAIE,GAAUA,IAAWP,EAAY,CAEnC,GAA4B,OAAxBD,EAA8B,CAChC,MAAMS,EAAc76B,EAAco6B,EAClCE,EAAOtjB,KAAK,CACVtB,UAAW0kB,EACXl6B,SAAU26B,EACVlH,QAAS3zB,EACT46B,OAAQP,GAEZ,CACAD,EAAsBp6B,EACtBq6B,EAAaO,CACf,CACF,CAIF,MAAMF,EAAWjE,EAAK9D,MAAMgI,EAAAA,WAC5B,GAAID,GAAYH,EAAa,CAC3B,MAAMK,EAASF,EAAS,GACxB,GAAIE,GAAUA,IAAWP,EAAY,CAEnC,GAA4B,OAAxBD,EAA8B,CAChC,MAAMS,EAAc76B,EAAco6B,EAClCE,EAAOtjB,KAAK,CACVtB,UAAW0kB,EACXl6B,SAAU26B,EACVlH,QAAS3zB,EACT46B,OAAQP,GAEZ,CACAD,EAAsBp6B,EACtBq6B,EAAaO,CACf,CACF,CAGA,GAAInE,EAAKC,WAAWoE,EAAAA,oBAAqB,CACvC,MAAMC,EAAgBtE,EAAK9D,MAAMqI,EAAAA,eAGjCT,GAAc,EACdD,EAAS,GACTlH,EAAiB,CACfhzB,GAAI,SAASJ,IACb0V,UAAW1V,EACXE,SAPe66B,EAAgBhB,WAAWgB,EAAc,IAAM,KAQ9DpH,QAAS,KACTE,KAAM,GACNE,eAAe,EACfC,aAAa,EACbC,iBAAiB,EACjBH,qBAAqB,EAEzB,CAGA,GAAI2C,EAAKC,WAAWuE,EAAAA,oBACd7H,EAAgB,CAElB,GAA4B,OAAxBgH,EAA8B,CAChC,MAAMS,EAAc76B,EAAco6B,EAClCE,EAAOtjB,KAAK,CACVtB,UAAW0kB,EACXl6B,SAAU26B,EACVlH,QAAS3zB,EACT46B,OAAQP,GAEZ,CAGA,MAAMa,EAAiBl7B,EAAcozB,EAAe1d,UAGhDwlB,GAAkBtH,EAAAA,kBACpBR,EAAelzB,SAAWg7B,EAC1B9H,EAAeO,QAAU3zB,EACzBozB,EAAeS,KAAOyG,EACtBnH,EAASnc,KAAKoc,IAIhBA,EAAiB,KACjBmH,GAAc,EACdH,EAAsB,KACtBC,EAAa,KACbC,EAAS,EACX,CAIF,GAAI7D,EAAKC,WAAWyE,EAAAA,0BAA2B,CAC7C,MAAMj7B,EAAW65B,WAAWtD,EAAKD,MAAM,KAAK,IACvC3Z,MAAM3c,KACTF,GAAeE,EAEnB,CACF,CAGIkzB,GAAkBA,EAAelzB,WACnCkzB,EAAeO,QAAUP,EAAe1d,UAAY0d,EAAelzB,SACnEkzB,EAAeS,KAAOyG,EACtBnH,EAASnc,KAAKoc,IAGhB,OAAOD,CACT,uBAtVA,IAAAiI,EAAAt8B,EAAA,KAiFO,SAAS20B,EAAqBH,GAEnC,SAAIA,EAAQvuB,KAAOuuB,EAAQvuB,IAAIs2B,KAAO/H,EAAQvuB,IAAIs2B,IAAIjrB,SAASmpB,EAAAA,yBAI3DjG,EAAQ+H,MAAO/H,EAAQ+H,IAAIjrB,SAASmpB,EAAAA,oBAI1C,CAgCO,SAAS9B,EAAmBv3B,GACjC,MAAO,CACLy3B,GAAIz3B,EAAWo7B,EAAAA,UAAU9pB,GACzBomB,GAAI13B,EAAWo7B,EAAAA,UAAU7pB,GACzBomB,GAAI33B,EAAWo7B,EAAAA,UAAU5pB,GAE7B,CAwaAolB,eAAeC,EAAiBnzB,GAC9B,MAAMw0B,QAAiBhY,MAAMxc,EAAK,CAAEy0B,YAAa,YAEjD,IAAoB,IAAhBD,EAASrY,GACX,MAAM,IAAItB,MACR,4BAA4B2Z,EAAS5b,QAAU,aAC7C4b,EAASpY,YAAc,oBAK7B,aAAaoY,EAASmD,MACxB,CAwCO,SAASrF,EAAiBsF,GAC/B,IAAKA,EAAa,OAAO,EACzB,MAAM7I,EAAQ6I,EAAY7I,MAAM8I,EAAAA,yBAChC,IAAK9I,EAAO,OAAO,EAInB,OAAe,KAHDoH,WAAWpH,EAAM,IAAM,GAGL,GAFhBoH,WAAWpH,EAAM,IAAM,GACvBoH,WAAWpH,EAAM,IAAM,EAEzC,mFCzmBA,IAAAhxB,EAAAC,EAAA9C,EAAA,MACAD,EAAA+C,EAAA9C,EAAA,MACAs8B,EAAAt8B,EAAA,KASA48B,EAAA58B,EAAA,KAoBuB,SAAA8C,EAAAhD,GAAA,OAAAA,GAAAA,EAAAG,WAAAH,EAAA,CAAAI,QAAAJ,EAAA,EAGHwC,EAAAA,QAAQpC,SAAWoC,EAAAA,SACfa,IAaT,MAAMoN,UAA8BnQ,EAAAA,QAIjD,cAAOC,CAAQC,GACb,OACEA,GAC6B,mBAAtBA,EAAOyN,YACdzN,EAAOyN,aAAauD,SAASurB,EAAAA,wBAEjC,CAKAn8B,cAAAA,GACE,MAAO,kBACT,CAKAE,gBAAAA,GACE,MAAO,aACT,CAMAwB,aAAAA,GACE,OAAIvB,KAAKyzB,gBAAkBzzB,KAAKyzB,eAAerF,WACtCpuB,KAAKyzB,eAAerF,WAEtBziB,MAAMpK,eACf,CAEAqC,WAAAA,CAAYnE,EAAQiM,EAAU,CAAC,GAC7BC,MAAMlM,GAGNO,KAAKk1B,WAAa,KAClBl1B,KAAKi8B,eAAiB,KACtBj8B,KAAKk8B,oBAAsBz8B,EAAOyN,aAGlClN,KAAKo1B,WAAa,GAClBp1B,KAAKyzB,eAAiB,KACtBzzB,KAAKm8B,aAAe,KACpBn8B,KAAKo8B,iBAAkB,EAGvBp8B,KAAKq8B,YAAa,EAClBr8B,KAAKs8B,wBAA0B,KAC/Bt8B,KAAKu8B,wBAA0B,KAC/Bv8B,KAAKw8B,oBAAqB,EAC1Bx8B,KAAKy8B,oBAAqB,EAG1Bz8B,KAAKo4B,oBAAsB,KAC3Bp4B,KAAK08B,2BAA4B,EACjC18B,KAAK28B,qBAAuB,EAC5B38B,KAAK48B,mBAAqB,EAG1B58B,KAAK68B,kBAAoB,KACzB78B,KAAK88B,kBAAoB,KACzB98B,KAAK+8B,2BAA6B,KAGlC/8B,KAAKq3B,iBAAmB,KACxBr3B,KAAKg9B,sBAAwB,KAE7BrtB,QAAQC,IAAI,UAAS,EAAAqtB,EAAAA,qDAAqD,CACxEC,SAAUl9B,KAAKk8B,oBACfiB,mBAAoBC,EAAAA,0BAGtBp9B,KAAKi8B,gBAAiB,EAAAoB,EAAAA,6BAA4Br9B,KAAKk8B,qBACvDvsB,QAAQC,IACN,UAAS,EAAAqtB,EAAAA,mCAAkCj9B,KAAKi8B,eAAeqB,iBAGjEt9B,KAAKP,OAAO89B,IAAI,kBAAkB,KAChCv9B,KAAKk1B,YAAa,EAAAsI,EAAAA,0BAAyBx9B,KAAKP,OAAOc,YACvDoP,QAAQC,IACN,UAAS,EAAAqtB,EAAAA,iCAAgCj9B,KAAKk1B,WAAWoI,iBAE3Dt9B,KAAKy9B,oBAAoB,GAE7B,CAKAA,kBAAAA,GACE9tB,QAAQC,IACN,UAAS,EAAAqtB,EAAAA,iCAAgCj9B,KAAKi8B,eAAeqB,iBAAiBt9B,KAAKk1B,WAAWoI,0BAIhGt9B,KAAKo4B,qBAAsB,EAAAsF,EAAAA,0BAAyB19B,KAAKk8B,qBACrDl8B,KAAKo4B,oBACPzoB,QAAQC,IACN,UAAS,EAAAqtB,EAAAA,2CACTj9B,KAAKo4B,qBAGPzoB,QAAQ+E,KACN,UAAS,EAAAuoB,EAAAA,iFAKTj9B,KAAKk1B,aAAeH,EAAAA,YAAY/jB,IAClChR,KAAK29B,mBAEL39B,KAAK49B,mBAET,CAKAv7B,iBAAAA,GACEsJ,MAAMtJ,oBAINrC,KAAK6O,QAAU7O,KAAK6O,QAAQnM,KAAK1C,MACjCA,KAAK8O,UAAY9O,KAAK8O,UAAUpM,KAAK1C,MACrCA,KAAKkP,UAAYlP,KAAKkP,UAAUxM,KAAK1C,MACrCA,KAAKmP,SAAWnP,KAAKmP,SAASzM,KAAK1C,MACnCA,KAAKoP,UAAYpP,KAAKoP,UAAU1M,KAAK1C,MACrCA,KAAKgP,QAAUhP,KAAKgP,QAAQtM,KAAK1C,MACjCA,KAAK69B,aAAe79B,KAAK69B,aAAan7B,KAAK1C,MAE3CA,KAAKP,OAAO+C,GAAG,QAASxC,KAAK6O,SAC7B7O,KAAKP,OAAO+C,GAAG,UAAWxC,KAAK8O,WAC/B9O,KAAKP,OAAO+C,GAAG,UAAWxC,KAAKkP,WAC/BlP,KAAKP,OAAO+C,GAAG,SAAUxC,KAAKmP,UAC9BnP,KAAKP,OAAO+C,GAAG,UAAWxC,KAAKoP,WAC/BpP,KAAKP,OAAO+C,GAAG,QAASxC,KAAKgP,SAC7BhP,KAAKP,OAAO+C,GAAG,aAAcxC,KAAK69B,cAClCluB,QAAQC,IAAI,UAAS,EAAAqtB,EAAAA,8CACvB,CAKAh6B,mBAAAA,GACE0I,MAAM1I,sBACNjD,KAAKP,OAAOyD,IAAI,QAASlD,KAAK6O,SAC9B7O,KAAKP,OAAOyD,IAAI,UAAWlD,KAAK8O,WAChC9O,KAAKP,OAAOyD,IAAI,UAAWlD,KAAKkP,WAChClP,KAAKP,OAAOyD,IAAI,SAAUlD,KAAKmP,UAC/BnP,KAAKP,OAAOyD,IAAI,UAAWlD,KAAKoP,WAChCpP,KAAKP,OAAOyD,IAAI,QAASlD,KAAKgP,SAC9BhP,KAAKP,OAAOyD,IAAI,aAAclD,KAAK69B,cACnC79B,KAAK89B,iBACP,CAKAA,eAAAA,GACM99B,KAAK68B,oBACPxiB,aAAara,KAAK68B,mBAClB78B,KAAK68B,kBAAoB,MAGvB78B,KAAK88B,oBACP7a,cAAcjiB,KAAK88B,mBACnB98B,KAAK88B,kBAAoB,KAE7B,CAKAa,gBAAAA,GACEhuB,QAAQC,IAAI,UAAS,EAAAqtB,EAAAA,oDACrBj9B,KAAK+9B,oBACP,CAKAH,iBAAAA,GACEjuB,QAAQC,IAAI,UAAS,EAAAqtB,EAAAA,kDACrBj9B,KAAK+9B,qBAEL,MAAMC,EAAkBh+B,KAAKi+B,2BAG7Bj+B,KAAK68B,kBAAoB/a,aAAY,KACnC9hB,KAAKk+B,uBAAuB,GAC3BF,GAEHh+B,KAAK88B,kBAAoBhb,aAAY,KACnC9hB,KAAKm+B,+BAA+B,GACnCH,GAEHruB,QAAQC,IAAI,UAAS,EAAAqtB,EAAAA,wCAAwC,CAC3De,mBAEJ,CAKAC,wBAAAA,GACE,OAAOj+B,KAAK+8B,2BAC0B,IAAlC/8B,KAAK+8B,2BACLqB,EAAAA,6BACN,CAKAC,wBAAAA,GACE,IAAKr+B,KAAK+8B,2BAA4B,OAEtC,MAAMuB,EAAct+B,KAAKi+B,2BACzBtuB,QAAQC,IACN,UAAS,EAAAqtB,EAAAA,oDAAmDj9B,KAAK+8B,+BAI/D/8B,KAAK68B,mBAAmB5a,cAAcjiB,KAAK68B,mBAC3C78B,KAAK88B,mBAAmB7a,cAAcjiB,KAAK88B,mBAE/C98B,KAAK68B,kBAAoB/a,aAAY,KACnC9hB,KAAKk+B,uBAAuB,GAC3BI,GAEHt+B,KAAK88B,kBAAoBhb,aAAY,KACnC9hB,KAAKm+B,+BAA+B,GACnCG,EACL,CAMAP,kBAAAA,GACE,MAAMl6B,EAAO7D,KAAKP,OAAOoE,KAAK,CAAEqI,0BAA0B,IAC1D,IAAKrI,EAGH,OAFA8L,QAAQC,IAAI,UAAS,EAAAqtB,EAAAA,wDACrBj9B,KAAKu+B,sBAKP,GAAIv+B,KAAKi8B,iBAAmBrH,EAAAA,cAAc1jB,KACxC,GACElR,KAAKw+B,cAAc36B,IACnB7D,KAAKy+B,iBAAiB56B,IACtB7D,KAAK0+B,qBAAqB76B,GAE1B,YAEG,GAAI7D,KAAKi8B,iBAAmBrH,EAAAA,cAAczjB,OAC3CnR,KAAK2+B,iBAAiB96B,IAAS7D,KAAK4+B,kBAAkB/6B,IACxD,OAKJ8L,QAAQC,IACN,UAAS,EAAAqtB,EAAAA,0DAEXj9B,KAAKu+B,qBACP,CAKAC,aAAAA,CAAc36B,GACZ,IAAKA,EAAKyJ,MAAQzJ,EAAKyJ,IAAIC,UAAW,OAAO,EAE7CoC,QAAQC,IAAI,UAAS,EAAAqtB,EAAAA,gCAGrB,MAAM4B,EAAkBh7B,EAAKyJ,IAAIC,UAAUC,QAkB3C,OAhBEqxB,GACAA,EAAgBvL,UAChBuL,EAAgBvL,SAASpuB,OAAS,IAElCyK,QAAQC,IAAI,UAAS,EAAAqtB,EAAAA,8CACrBj9B,KAAK8+B,4BAA4BD,IAInCh7B,EAAKyJ,IAAI9K,GAAG,kBAAkB,KAC5B,MAAM6wB,EAAWxvB,EAAKyJ,IAAIC,UAAUC,QAChC6lB,GACFrzB,KAAK8+B,4BAA4BzL,EACnC,KAGK,CACT,CAKAoL,gBAAAA,CAAiB56B,GAEf,SACEA,EAAKk7B,KACLl7B,EAAKk7B,IAAIC,aACTn7B,EAAKk7B,IAAIC,YAAYC,EAAAA,kBAErBtvB,QAAQC,IACN,UAAS,EAAAqtB,EAAAA,yDAEXj9B,KAAKu+B,uBACE,EAGX,CAKAG,oBAAAA,CAAqB76B,GACnB,IAAKA,EAAKq7B,MAAQr7B,EAAKq7B,IAAI3xB,UAAW,OAAO,EAE7CoC,QAAQC,IAAI,UAAS,EAAAqtB,EAAAA,iDAGrB,MAAM4B,EAAkBh7B,EAAKq7B,IAAI3xB,UAAUC,QAiB3C,OAfEqxB,GACAA,EAAgBvL,UAChBuL,EAAgBvL,SAASpuB,OAAS,GAElClF,KAAK8+B,4BAA4BD,GAInCh7B,EAAKq7B,IAAI18B,GAAG,kBAAkB,KAC5B,MAAM6wB,EAAWxvB,EAAKq7B,IAAI3xB,UAAUC,QAChC6lB,GACFrzB,KAAK8+B,4BAA4BzL,EACnC,KAGK,CACT,CAKAsL,gBAAAA,CAAiB96B,GACf,QAAKA,EAAKmO,cAEVrC,QAAQC,IAAI,UAAS,EAAAqtB,EAAAA,yCACrBp5B,EAAKmO,YAAYvK,iBAAiB,QAAS5G,IACzCb,KAAKm/B,oBAAoBt+B,EAAM,KAG1B,EACT,CAKA+9B,iBAAAA,CAAkB/6B,GAChB,SAAKA,EAAKu7B,OAASv7B,EAAKu7B,KAAK58B,MAE7BmN,QAAQC,IAAI,UAAS,EAAAqtB,EAAAA,oCACrBp5B,EAAKu7B,KAAK58B,GAAG,yBAA0B3B,IACrCb,KAAKq/B,sBAAsBx+B,EAAM,KAG5B,EACT,CAKA,yBAAM09B,GACJ5uB,QAAQC,IACN,UAAS,EAAAqtB,EAAAA,yDAGX,IACE,MAAMlK,EAAc/yB,KAAKk8B,oBAErBl8B,KAAKi8B,iBAAmBrH,EAAAA,cAAc1jB,UAClClR,KAAKs/B,yBAAyBvM,GAC3B/yB,KAAKi8B,iBAAmBrH,EAAAA,cAAczjB,YACzCnR,KAAKu/B,0BAA0BxM,EAEzC,CAAE,MAAOniB,GACPjB,QAAQC,IAAI,UAAS,EAAAqtB,EAAAA,yCAAyCrsB,EAChE,CACF,CAKA,8BAAM0uB,CAAyBvM,GAC7B,IACEpjB,QAAQC,IAAI,UAAS,EAAAqtB,EAAAA,iDAGrB,MAAM,iBAAE5F,SAA2B,EAAAmI,EAAAA,wBAAuBzM,GAE1D,IAAKsE,EAEH,YADA1nB,QAAQC,IAAI,UAAS,EAAAqtB,EAAAA,4CAIvBttB,QAAQC,IAAI,UAAS,EAAAqtB,EAAAA,4CAGrB,MAAMwC,QAAkB,EAAAC,EAAAA,uBAAsBrI,GAExCsI,GAA2B,EAAAC,EAAAA,iCAAgCH,GACjEz/B,KAAK6/B,sCACHF,EACA,uBAIF,MAAMx/B,GAAM,EAAA2/B,EAAAA,6BAA4BL,GACpCt/B,EAAI+E,OAAS,IACfyK,QAAQC,IACN,UAAS,EAAAqtB,EAAAA,6BAA4B98B,EAAI+E,sBAE3ClF,KAAK+/B,YAAY5/B,GAErB,CAAE,MAAOyQ,GACPjB,QAAQC,IAAI,UAAS,EAAAqtB,EAAAA,oCAAoCrsB,EAC3D,CACF,CAKA,+BAAM2uB,CAA0BxM,GAC9B,IACEpjB,QAAQC,IAAI,UAAS,EAAAqtB,EAAAA,2CAGrB,MAAM/D,QAAgB,EAAA8G,EAAAA,mBAAkBjN,GAElCkN,GACJ,EAAAC,EAAAA,uCAAsChH,GACxCl5B,KAAK6/B,sCACHI,EACA,4BAIF,MAAM9/B,GAAM,EAAAggC,EAAAA,8BAA6BjH,GAEzCvpB,QAAQC,IACN,UAAS,EAAAqtB,EAAAA,0BAAyB98B,EAAI+E,4BAGpC/E,EAAI+E,OAAS,EACflF,KAAK+/B,YAAY5/B,GAEjBH,KAAKk1B,aAAeH,EAAAA,YAAY/jB,KAChChR,KAAKo4B,sBACJp4B,KAAK08B,4BAGN/sB,QAAQC,IACN,UAAS,EAAAqtB,EAAAA,kEAEXj9B,KAAK08B,2BAA4B,EACjC18B,KAAKm+B,gCAET,CAAE,MAAOvtB,GACPjB,QAAQC,IAAI,UAAS,EAAAqtB,EAAAA,qCAAqCrsB,EAC5D,CACF,CAKAuuB,mBAAAA,CAAoBt+B,GAClB8O,QAAQC,IAAI,UAAS,EAAAqtB,EAAAA,oCAAoCp8B,GAEzD,IAEE,MAAMu/B,EAAWv/B,EAAMw/B,OAEvB,IAAKD,EAEH,YADAzwB,QAAQC,IAAI,UAAS,EAAAqtB,EAAAA,0CAMvB,MAAMqD,EAAcF,EAASE,aAAe,GAE5C,IAAKA,EAAY7vB,SAAS8pB,EAAAA,sBAKxB,YAJA5qB,QAAQC,IACN,UAAS,EAAAqtB,EAAAA,+CACTqD,GAKJ3wB,QAAQC,IAAI,UAAS,EAAAqtB,EAAAA,0CAA0C,CAC7DqD,YAAaF,EAASE,YACtBrc,MAAOmc,EAASnc,MAChBkW,UAAWiG,EAASjG,UACpBE,iBAAkB+F,EAAS/F,iBAC3BkG,sBAAuBH,EAASG,sBAChCC,cAAeJ,EAASI,gBAI1B,MAAMrG,EAAYiG,EAASjG,WAAa,EAClCE,EAAmB+F,EAAS/F,kBAAoB,EAChDmG,EAAgBJ,EAASI,eAAiB,EAE1CzqB,EAAYskB,EAAmBF,EAC/B55B,EAAWigC,EAAgBrG,EAKjC,GAFoBiG,EAASK,aAEVlgC,EAAW,EAAG,CAC/B,MAAMg3B,EAAU,CACd92B,GAAI,aAAasV,IACjBA,UAAWA,EACXxV,SAAUA,EACVyzB,QAASje,EAAYxV,EACrBkf,OAAQ,YACR0U,qBAAqB,EACrBC,eAAe,EACfC,aAAa,EACbC,iBAAiB,EACjBJ,KAAM,IAGRvkB,QAAQC,IACN,UAAS,EAAAqtB,EAAAA,mDACT1F,GAEFv3B,KAAK+/B,YAAY,CAACxI,GACpB,CACF,CAAE,MAAO3mB,GACPjB,QAAQC,IACN,UAAS,EAAAqtB,EAAAA,kDACTrsB,EAEJ,CACF,CAKAyuB,qBAAAA,CAAsBx+B,GACpB8O,QAAQC,IAAI,UAAS,EAAAqtB,EAAAA,sCAAsCp8B,GAE3D,IAEE,MAAM6/B,EAAY7/B,EAAMA,OAASA,EAEjC,IAAK6/B,EAEH,YADA/wB,QAAQC,IAAI,UAAS,EAAAqtB,EAAAA,kCAKvB,MAAMqD,EAAcI,EAAUJ,aAAe,GAE7C,IAAKA,EAAY7vB,SAAS8pB,EAAAA,sBAKxB,YAJA5qB,QAAQC,IACN,UAAS,EAAAqtB,EAAAA,gDACTqD,GAKJ3wB,QAAQC,IAAI,UAAS,EAAAqtB,EAAAA,kDAAkD,CACrEx8B,GAAIigC,EAAUjgC,GACd6/B,YAAaI,EAAUJ,YACvBjG,iBAAkBqG,EAAUrG,iBAC5B95B,SAAUmgC,EAAUngC,SACpBkgC,YAAaC,EAAUD,cAIzB,MAAM1qB,EAAYqkB,WAAWsG,EAAUrG,kBAAoB,GACrD95B,EAAW65B,WAAWsG,EAAUngC,UAAY,GAElD,GAAIA,EAAW,EAAG,CAChB,MAAMg3B,EAAU,CACd92B,GAAIigC,EAAUjgC,IAAM,cAAcsV,IAClCA,UAAWA,EACXxV,SAAUA,EACVyzB,QAASje,EAAYxV,EACrBkf,OAAQ,oBACR0U,qBAAqB,EACrBC,eAAe,EACfC,aAAa,EACbC,iBAAiB,EACjBJ,KAAM,IAGRvkB,QAAQC,IACN,UAAS,EAAAqtB,EAAAA,2DACT1F,GAEFv3B,KAAK+/B,YAAY,CAACxI,GACpB,CACF,CAAE,MAAO3mB,GACPjB,QAAQC,IACN,UAAS,EAAAqtB,EAAAA,oDACTrsB,EAEJ,CACF,CAKAkuB,2BAAAA,CAA4BzL,GAO1B,GANA1jB,QAAQC,IACN,UAAS,EAAAqtB,EAAAA,0CACP5J,EAASC,UAAUpuB,QAAU,gBAI5BmuB,EAASC,UAAyC,IAA7BD,EAASC,SAASpuB,OAE1C,YADAyK,QAAQC,IAAI,UAAS,EAAAqtB,EAAAA,4CAIvBj9B,KAAK6/B,sCACHxM,EAASsN,eACT,uBAIF,MAAMxgC,GAAM,EAAAygC,EAAAA,+BAA8BvN,GAEtClzB,EAAI+E,OAAS,GACfyK,QAAQC,IACN,UAAS,EAAAqtB,EAAAA,iCAAgC98B,EAAI+E,uBAAuB/E,EAAIkf,QACtE,CAACwhB,EAAKC,IAAOD,EAAMC,EAAG5M,KAAKhvB,QAC3B,aAGJlF,KAAK+/B,YAAY5/B,IAEjBwP,QAAQC,IAAI,UAAS,EAAAqtB,EAAAA,mDAEzB,CAKA,2BAAMiB,GACJ,IAAIl+B,KAAKq8B,YACLr8B,KAAKk1B,aAAeH,EAAAA,YAAY9jB,KAEpC,GAAIjR,KAAKy8B,mBACP9sB,QAAQC,IACN,UAAS,EAAAqtB,EAAAA,qEAFb,CAOAj9B,KAAKy8B,oBAAqB,EAE1B,IACE,MAAM54B,EAAO7D,KAAKP,OAAOoE,KAAK,CAAEqI,0BAA0B,IAC1D,GAAIrI,GAAQA,EAAKyJ,IAAK,CACpB,MAAM+lB,EAAWxvB,EAAKyJ,IAAIC,UAAUC,QAChC6lB,GACFrzB,KAAK8+B,4BAA4BzL,EAErC,MAAWrzB,KAAKi8B,iBAAmBrH,EAAAA,cAAczjB,YACzCnR,KAAKu/B,0BAA0Bv/B,KAAKk8B,oBAE9C,CAAE,MAAOtrB,GACPjB,QAAQC,IAAI,UAAS,EAAAqtB,EAAAA,wCAAwCrsB,EAC/D,CAAE,QACA5Q,KAAKy8B,oBAAqB,CAC5B,CAlBA,CAmBF,CAKAsD,WAAAA,CAAYrK,GACV11B,KAAKo1B,YAAa,EAAA2L,EAAAA,kBAAiB/gC,KAAKo1B,WAAYM,GAEpD/lB,QAAQC,IACN,UAAS,EAAAqtB,EAAAA,iCAAgCj9B,KAAKo1B,WAAWlwB,sBAKzDlF,KAAKk1B,aAAeH,EAAAA,YAAY/jB,KAChChR,KAAKo4B,sBACJp4B,KAAK08B,4BAEN18B,KAAK08B,2BAA4B,EACjC/sB,QAAQC,IACN,UAAS,EAAAqtB,EAAAA,sEAEXj9B,KAAKm+B,gCAET,CAKA0B,qCAAAA,CAAsCmB,EAAiBvhB,GAEnDzf,KAAKk1B,aAAeH,EAAAA,YAAY9jB,OAC/B+vB,GACDA,GAAmB,GAKjBhhC,KAAK+8B,6BAA+BiE,IAIxChhC,KAAK+8B,2BAA6BiE,EAClCrxB,QAAQC,IACN,UAAS,EAAAqtB,EAAAA,uDAAsDxd,MAAWuhB,OAGxEhhC,KAAK68B,mBAAqB78B,KAAK88B,oBACjC98B,KAAKq+B,2BAET,CAKA,mCAAMF,GACJ,IAAIn+B,KAAKq8B,YAAer8B,KAAKo4B,oBAE7B,GAAIp4B,KAAKw8B,mBACP7sB,QAAQC,IACN,UAAS,EAAAqtB,EAAAA,qEAFb,CAOAj9B,KAAKw8B,oBAAqB,EAE1B,IACE7sB,QAAQC,IAAI,UAAS,EAAAqtB,EAAAA,+CAErBj9B,KAAKs8B,wBAA0B,IAAI/b,gBAEnC,MAAM9V,QAAa,EAAAw2B,EAAAA,qBACjBjhC,KAAKo4B,oBACLgF,EAAAA,wBACAp9B,KAAKs8B,wBAAwB5b,QAG/B,GAAI1gB,KAAKq8B,WAIP,YAHA1sB,QAAQC,IACN,UAAS,EAAAqtB,EAAAA,oEAKTxyB,EAAKy2B,QAAUz2B,EAAKy2B,OAAOh8B,OAAS,GACtCyK,QAAQC,IACN,UAAS,EAAAqtB,EAAAA,mCAAkCxyB,EAAKy2B,OAAOh8B,mBAEzDlF,KAAKmhC,2BAA2B12B,EAAKy2B,QACrClhC,KAAK28B,qBAAuB,GAE5BhtB,QAAQC,IAAI,UAAS,EAAAqtB,EAAAA,kDAEzB,CAAE,MAAOrsB,GACP,GAAmB,eAAfA,EAAMtM,MAAyBtE,KAAKq8B,WAEtC,YADA1sB,QAAQC,IAAI,UAAS,EAAAqtB,EAAAA,2CASvB,GALAttB,QAAQC,IACN,UAAS,EAAAqtB,EAAAA,wCAAuCrsB,EAAME,UACtDF,GAGE5Q,KAAK28B,qBAAuB38B,KAAK48B,mBAOnC,OANA58B,KAAK28B,uBACLhtB,QAAQC,IACN,UAAS,EAAAqtB,EAAAA,6CAA4Cj9B,KAAK28B,wBAAwB38B,KAAK48B,uBAEzF58B,KAAKw8B,oBAAqB,aACpBx8B,KAAKm+B,gCAIbxuB,QAAQC,IACN,UAAS,EAAAqtB,EAAAA,2EAEb,CAAE,QACAj9B,KAAKw8B,oBAAqB,EAC1Bx8B,KAAKs8B,wBAA0B,IACjC,CA1DA,CA2DF,CAKA6E,0BAAAA,CAA2BD,GACzB,MAAMxL,GAAS,EAAA0L,EAAAA,sCAAqCphC,KAAKo1B,WAAY8L,GAGjExL,EAAOxwB,OAAS,IAClBlF,KAAKo1B,WAAW/d,QAAQqe,GACxB11B,KAAKo1B,WAAW6D,MAAK,CAAC/kB,EAAGme,IAAMne,EAAE6B,UAAYsc,EAAEtc,aAGjDpG,QAAQC,IACN,UAAS,EAAAqtB,EAAAA,yCACPj9B,KAAKo1B,WAAWlwB,sBAKpByK,QAAQC,IACN,UAAS,EAAAqtB,EAAAA,sCACTj9B,KAAKo1B,WAAWhwB,KAAK07B,IAAE,CACrBrgC,GAAIqgC,EAAGrgC,GACPsV,UAAW+qB,EAAG/qB,UACdie,QAAS8M,EAAG9M,QACZzzB,SAAUugC,EAAGvgC,SACbgG,MAAOu6B,EAAGv6B,MACV86B,SAAUP,EAAG5M,KAAKhvB,OAClBgvB,KAAM4M,EAAG5M,KAAK9uB,KAAK4I,IAAC,CAClBzH,MAAOyH,EAAEzH,MACTwP,UAAW/H,EAAE+H,UACbie,QAAShmB,EAAEgmB,QACXzzB,SAAUyN,EAAEzN,kBAMlBoP,QAAQC,IACN,UAAS,EAAAqtB,EAAAA,yCAAwCj9B,KAAKP,OAAOY,iBAEjE,CAKAihC,cAAAA,CAAeC,EAAU5J,GACvB,IAAK4J,EAAShhC,UAAYghC,EAAShhC,UAAY,EAAG,QAE1B,EAAAihC,EAAAA,oBAAmB7J,EAAU4J,EAAShhC,SAAU,CACtEy3B,GAAIuJ,EAAShN,WACb0D,GAAIsJ,EAAS/M,WACb0D,GAAIqJ,EAAS9M,aAGC9c,SAAQ,EAAG/D,WAAU4hB,UACnC7lB,QAAQC,IAAI,UAAS,EAAAqtB,EAAAA,kCAA4C,GAAXrpB,MACtD5T,KAAKgK,eAAe,CAAE4J,aACtB2tB,EAAS,WAAW/L,EAAI8H,kBAAmB,CAAI,GAEnD,CAKAO,YAAAA,GACE,MAAMx9B,EAAcL,KAAKP,OAAOY,cAC1BohC,GAAgB,EAAAC,EAAAA,mBAAkB1hC,KAAKo1B,WAAY/0B,GAezD,GAXEL,KAAKo1B,WAAWlwB,OAAS,GACzBT,KAAK4T,MAAMhY,GAAe,GAAM,GAChCoE,KAAK4T,MAAoB,GAAdhY,GAAoB,IAAO,GAEtCsP,QAAQC,IACN,UAAS,EAAAqtB,EAAAA,gCAA+B58B,EAAYshC,QAAQ,sBAC1DF,EAAgBA,EAAchhC,GAAK,2BAChBT,KAAKo1B,WAAWlwB,UAIrCu8B,EAAe,CAIjB,IAAKA,EAAcrN,cAAe,CAChCp0B,KAAKyzB,eAAiBgO,EACtBzhC,KAAK8P,SAAQ,GACbH,QAAQC,IACN,UAAS,EAAAqtB,EAAAA,sDAIX,MAAMjI,EAAeh1B,KAAKo1B,WAAW1c,WAClCtY,GAAOqE,KAAKgzB,IAAIr3B,EAAG2V,UAAY0rB,EAAc1rB,WAAa,KAEvDqY,GAAa,EAAAwT,EAAAA,qBACjB5M,EACAh1B,KAAKo1B,WAAWlwB,OAChBlF,KAAKk1B,YAIPuM,EAAcrT,WAAaA,EAE3Bze,QAAQC,IAAI,UAAS,EAAAqtB,EAAAA,oCAAoC,CACvDlnB,UAAW0rB,EAAc1rB,UACzBxV,SAAUkhC,EAAclhC,SACxB8gC,SAAUI,EAAcvN,MAAMhvB,QAAU,EACxC28B,SAAUzT,EACV0T,WAAY9M,EACZ+M,YAAa/hC,KAAKo1B,WAAWlwB,SAE/BlF,KAAK0T,mBACL+tB,EAAcrN,eAAgB,CAChC,CAGA,GAAIqN,EAAcvN,MAAQuN,EAAcvN,KAAKhvB,OAAS,EAAG,CACvD,MAAM88B,GAAY,EAAAC,EAAAA,eAAcR,EAAephC,GAE/C,GAAI2hC,EAAW,CAERhiC,KAAKm8B,cAAgBn8B,KAAKm8B,eAAiB6F,IAE1ChiC,KAAKm8B,eACPxsB,QAAQC,IAAI,UAAS,EAAAqtB,EAAAA,8CACrBj9B,KAAKuD,WAIPvD,KAAKm8B,aAAe6F,EAEpBryB,QAAQC,IAAI,UAAS,EAAAqtB,EAAAA,wCAAwC,CAC3DlnB,UAAWisB,EAAUjsB,UACrBxV,SAAUyhC,EAAUzhC,SACpBshC,SAAUJ,EAAcrT,aAW1BpuB,KAAKmD,YAAY,CACfmrB,UAAW,kBACXF,WAAYqT,EAAcrT,aAG5BpuB,KAAKoD,UAAU,CACbkrB,UAAW,kBACXF,WAAYqT,EAAcrT,aAE5B4T,EAAU5N,eAAgB,GAI5B,MAAM8N,EAAc7hC,EAAc2hC,EAAUjsB,UAC5C/V,KAAKshC,eAAeU,EAAWE,EACjC,CACF,KAAO,CAEAT,EAAcnN,kBACjB3kB,QAAQC,IAAI,UAAS,EAAAqtB,EAAAA,wCAAwC,CAC3DlnB,UAAW0rB,EAAc1rB,UACzBxV,SAAUkhC,EAAclhC,SACxBshC,SAAUJ,EAAcrT,aAI1BpuB,KAAKmD,YAAY,CACfmrB,UAAW,kBACXF,WAAYqT,EAAcrT,aAI5BpuB,KAAKoD,UAAU,CACbkrB,UAAW,kBACXF,WAAYqT,EAAcrT,aAE5BqT,EAAcnN,iBAAkB,GAIlC,MAAM6N,EAAa9hC,EAAcohC,EAAc1rB,UAC/C/V,KAAKshC,eAAeG,EAAeU,EACrC,CACF,MAAWniC,KAAKyzB,iBAIVzzB,KAAKm8B,eACPxsB,QAAQC,IAAI,UAAS,EAAAqtB,EAAAA,yCACrBj9B,KAAKuD,UACLvD,KAAKm8B,aAAe,MAIjBn8B,KAAKyzB,eAAeY,cACvB1kB,QAAQC,IAAI,UAAS,EAAAqtB,EAAAA,mCACrBj9B,KAAK2T,iBACL3T,KAAKyzB,eAAeY,aAAc,GAGpCr0B,KAAKyzB,eAAiB,KACtBzzB,KAAK8P,SAAQ,GACbH,QAAQC,IAAI,UAAS,EAAAqtB,EAAAA,sDAGjBj9B,KAAKP,OAAO8Q,UAAYvQ,KAAKo8B,kBAC/BzsB,QAAQC,IACN,UAAS,EAAAqtB,EAAAA,4DAEXj9B,KAAKoiC,iBACLpiC,KAAKo8B,iBAAkB,GAG7B,CAKAgG,cAAAA,GACMpiC,KAAKmhB,cACPnhB,KAAKmhB,cAAc5d,UAEnBoI,MAAMpI,SAEV,CAOA8+B,aAAAA,CAAcC,EAAWC,GACnBviC,KAAKsQ,SACPX,QAAQC,IAAI,UAAS,EAAAqtB,EAAAA,sBAAqBqF,KAC1CC,EAAW3qB,KAAK5X,MAEpB,CAKA6O,OAAAA,GACE7O,KAAKqiC,cAAc,WAAYriC,KAAKqD,UACtC,CAKAyL,SAAAA,GACM9O,KAAKsQ,SACPX,QAAQC,IAAI,UAAS,EAAAqtB,EAAAA,gCACrBj9B,KAAKsD,aACLtD,KAAKwQ,gBAET,CAKAtB,SAAAA,GACElP,KAAKqiC,cAAc,gBAAiBriC,KAAK0Q,cAC3C,CAKAvB,QAAAA,GACEnP,KAAKqiC,cAAc,cAAeriC,KAAK2Q,YACzC,CAKAvB,SAAAA,GACEpP,KAAKqiC,cAAc,kBAAmBriC,KAAK+Q,gBAC7C,CAKA/B,OAAAA,GACOhP,KAAKo8B,kBACRzsB,QAAQC,IAAI,UAAS,EAAAqtB,EAAAA,8CACrBj9B,KAAKoiC,iBACLpiC,KAAKo8B,iBAAkB,EAE3B,CAKA/6B,QAAAA,GACE,OAAIrB,KAAKm8B,aACAn8B,KAAKm8B,aAAa51B,OAASvG,KAAKyzB,gBAAgBhzB,IAAM,KAExDT,KAAKyzB,gBAAgBltB,OAASvG,KAAKyzB,gBAAgBhzB,IAAM,IAClE,CAKAD,UAAAA,GACE,OAAIR,KAAKm8B,aAELn8B,KAAKm8B,aAAa91B,YAClBrG,KAAKm8B,aAAa51B,OAClBvG,KAAKyzB,gBAAgBhzB,IACrB,KAGGT,KAAKyzB,gBAAgBptB,YAAcrG,KAAKyzB,gBAAgBhzB,IAAM,IACvE,CAKAS,MAAAA,GAEE,OAAOlB,KAAKo4B,qBAAuBp4B,KAAKk8B,qBAAuB,IACjE,CAKA57B,WAAAA,GACE,OAAIN,KAAKm8B,aAC6B,IAA7Bn8B,KAAKm8B,aAAa57B,SAEpBP,KAAKyzB,eAAgD,IAA/BzzB,KAAKyzB,eAAelzB,SAAkB,IACrE,CAKAiiC,WAAAA,GACMxiC,KAAK68B,oBACP5a,cAAcjiB,KAAK68B,mBACnB78B,KAAK68B,kBAAoB,MAGvB78B,KAAK88B,oBACP7a,cAAcjiB,KAAK88B,mBACnB98B,KAAK88B,kBAAoB,MAG3BntB,QAAQC,IAAI,UAAS,EAAAqtB,EAAAA,mCACvB,CAKAvb,OAAAA,GACE/R,QAAQC,IAAI,UAAS,EAAAqtB,EAAAA,oDAErBj9B,KAAKq8B,YAAa,EAEdr8B,KAAKs8B,0BACP3sB,QAAQC,IAAI,UAAS,EAAAqtB,EAAAA,sDACrBj9B,KAAKs8B,wBAAwB9b,QAC7BxgB,KAAKs8B,wBAA0B,MAG7Bt8B,KAAKu8B,0BACP5sB,QAAQC,IAAI,UAAS,EAAAqtB,EAAAA,sDACrBj9B,KAAKu8B,wBAAwB/b,QAC7BxgB,KAAKu8B,wBAA0B,MAGjCv8B,KAAK89B,kBACL99B,KAAKiD,sBACL0I,MAAM+V,SAAW/V,MAAM+V,SACzB,EACD3f,EAAAA,QAAA2N,mFC5tCD,IAAA1N,EAAAC,EAAA9C,EAAA,MACAD,EAAA+C,EAAA9C,EAAA,MAA8C,SAAA8C,EAAAhD,GAAA,OAAAA,GAAAA,EAAAG,WAAAH,EAAA,CAAAI,QAAAJ,EAAA,CAE9C,MAAMwjC,EAAY,CAEhBC,uBAAwB,yBACxBC,kBAAmB,oBACnBC,iBAAkB,mBAGlBC,qBAAsB,uBACtBC,mBAAoB,qBACpBC,sBAAuB,wBACvBC,oBAAqB,sBACrBC,eAAgB,iBAChBC,sBAAuB,wBACvBC,gBAAiB,kBACjBC,sBAAuB,wBACvBC,gBAAiB,kBACjBC,eAAgB,iBAChBC,cAAe,gBACfC,eAAgB,iBAChBC,eAAgB,iBAChBC,aAAc,eAGdC,sBAAuB,wBAGvBC,mBAAoB,sBAGP,MAAM3zB,UAAsB1Q,EAAAA,QACzC,cAAOC,CAAQC,GAEb,OACGA,EAAOokC,QAAmC,mBAAlBpkC,EAAOokC,QAC/BpkC,EAAOqkC,UAAqC,IAAvBrkC,EAAOqkC,IAAI7jC,SAChCR,EAAOmG,KAAOnG,EAAOmG,IAAIk+B,KAC1BrkC,EAAOskC,aAEX,CAEAngC,WAAAA,CAAYnE,GACVkM,MAAMlM,GACNO,KAAK+jC,cAAgB,KACrB/jC,KAAKgkC,cAAgB,KACrBhkC,KAAKikC,YAAc,KACnBjkC,KAAKkkC,WAAa,KAClBlkC,KAAKmkC,UAAY,GACjBnkC,KAAKokC,aAAc,EACnBpkC,KAAKqkC,cAAgB,IACvB,CAEAn0B,gBAAAA,CAAiB6zB,GACf/jC,KAAK+jC,cAAgBA,EACrB/jC,KAAKskC,8BACLtkC,KAAKokC,aAAc,EACnB3iC,EAAAA,QAAQa,IAAIqb,MACV,4DAEJ,CAEA2mB,2BAAAA,GACE,IAAKtkC,KAAK+jC,gBAAkBl+B,QAAQD,KAAKk+B,KAAKS,KAAKC,YAEjD,YADA/iC,EAAAA,QAAQa,IAAIoS,KAAK,yDAInB,MAAM8vB,EAAc3+B,OAAOD,IAAIk+B,IAAIS,IAAIC,YAAYl9B,KAGnDtH,KAAKqkC,cAAgB,CAEnB,CAACG,EAAYr8B,QAASnI,KAAKykC,eAAe/hC,KAAK1C,MAC/C,CAACwkC,EAAYE,oBAAqB1kC,KAAK2kC,oBAAoBjiC,KAAK1C,MAChE,CAACwkC,EAAYjnB,OAAQvd,KAAK4kC,cAAcliC,KAAK1C,MAG7C,CAACwkC,EAAYK,kBAAmB7kC,KAAK8kC,iBAAiBpiC,KAAK1C,MAC3D,CAACwkC,EAAYO,gBAAiB/kC,KAAKglC,eAAetiC,KAAK1C,MAGvD,CAACwkC,EAAYS,mBAAoBjlC,KAAKklC,kBAAkBxiC,KAAK1C,MAC7D,CAACwkC,EAAYW,iBAAkBnlC,KAAKolC,gBAAgB1iC,KAAK1C,MAGzD,CAACwkC,EAAYl8B,SAAUtI,KAAKqlC,YAAY3iC,KAAK1C,MAC7C,CAACwkC,EAAY37B,gBAAiB7I,KAAKslC,kBAAkB5iC,KAAK1C,MAC1D,CAACwkC,EAAY17B,UAAW9I,KAAKulC,aAAa7iC,KAAK1C,MAC/C,CAACwkC,EAAYz7B,gBAAiB/I,KAAKwlC,kBAAkB9iC,KAAK1C,MAC1D,CAACwkC,EAAY58B,UAAW5H,KAAKylC,aAAa/iC,KAAK1C,MAC/C,CAACwkC,EAAYv8B,SAAUjI,KAAK0lC,YAAYhjC,KAAK1C,MAC7C,CAACwkC,EAAYp8B,QAASpI,KAAK2lC,WAAWjjC,KAAK1C,MAC3C,CAACwkC,EAAYn8B,SAAUrI,KAAK4lC,YAAYljC,KAAK1C,MAC7C,CAACwkC,EAAY57B,OAAQ5I,KAAK6lC,YAAYnjC,KAAK1C,MAC3C,CAACwkC,EAAYsB,eAAgB9lC,KAAK6lC,YAAYnjC,KAAK1C,MAGnD,CAACwkC,EAAYuB,mBAAoB/lC,KAAKgmC,mBAAmBtjC,KAAK1C,MAC9D,CAACwkC,EAAYyB,gBAAiBjmC,KAAKkmC,gBAAgBxjC,KAAK1C,OAI1DyjB,OAAOuG,QAAQhqB,KAAKqkC,eAAe1sB,SAAQ,EAAEE,EAAWsuB,MACtDnmC,KAAK+jC,cAAct8B,iBAAiBoQ,EAAWsuB,EAAQ,IAGzD1kC,EAAAA,QAAQa,IAAIqb,MAAM,oDACpB,CAEAtb,iBAAAA,GAEEsJ,MAAMtJ,oBAENZ,EAAAA,QAAQa,IAAIC,uBAAuBvC,KAAKP,OAAQ,CAC9C,KACAgkB,OAAOuB,OAAOyd,IAElB,CAEAx/B,mBAAAA,GAEE0I,MAAM1I,sBAGFjD,KAAK+jC,eAAiB/jC,KAAKqkC,eAC7B5gB,OAAOuG,QAAQhqB,KAAKqkC,eAAe1sB,SAAQ,EAAEE,EAAWsuB,MACtDnmC,KAAK+jC,cAAcz6B,oBAAoBuO,EAAWsuB,EAAQ,IAK9DnmC,KAAK+jC,cAAgB,KACrB/jC,KAAKgkC,cAAgB,KACrBhkC,KAAKikC,YAAc,KACnBjkC,KAAKkkC,WAAa,KAClBlkC,KAAKmkC,UAAY,GACjBnkC,KAAKokC,aAAc,EACnBpkC,KAAKqkC,cAAgB,IACvB,CAGAI,cAAAA,CAAe5jC,GACbb,KAAKkkC,WAAalkC,KAAKomC,kBAAkBvlC,GACzCY,EAAAA,QAAQa,IAAIqb,MAAM,+BAAgC3d,KAAKkkC,YACvDlkC,KAAKmD,aACP,CAEAwhC,mBAAAA,CAAoB9jC,GAClBY,EAAAA,QAAQa,IAAIqb,MAAM,qCAClB3d,KAAKwP,aAAa,CAAE5C,MAAO,sBAC7B,CAEAg4B,aAAAA,CAAc/jC,GACZ,MAAMwlC,EAAYrmC,KAAKsmC,iBAAiBzlC,GACxCY,EAAAA,QAAQa,IAAIsO,MAAM,8BAA+By1B,GACjDrmC,KAAKyD,UAAU4iC,EACjB,CAGAvB,gBAAAA,CAAiBjkC,GACfb,KAAKikC,YAAcjkC,KAAKumC,mBAAmB1lC,GAC3CY,EAAAA,QAAQa,IAAIqb,MAAM,kCAAmC3d,KAAKikC,aAC1DjkC,KAAK0T,iBAAiB1T,KAAKikC,YAC7B,CAEAe,cAAAA,CAAenkC,GACbY,EAAAA,QAAQa,IAAIqb,MAAM,iCAClB3d,KAAK2T,iBACL3T,KAAKikC,YAAc,IACrB,CAGAiB,iBAAAA,CAAkBrkC,GAChBY,EAAAA,QAAQa,IAAIqb,MAAM,oCAEb3d,KAAKikC,aACRjkC,KAAK8kC,iBAAiBjkC,EAE1B,CAEAukC,eAAAA,CAAgBvkC,GACdY,EAAAA,QAAQa,IAAIqb,MAAM,iCAEpB,CAGA0nB,WAAAA,CAAYxkC,GACVb,KAAKgkC,cAAgBhkC,KAAKwmC,cAAc3lC,GACxCY,EAAAA,QAAQa,IAAIqb,MAAM,4BAA6B3d,KAAKgkC,eACpDhkC,KAAKoD,WACP,CAEAkiC,iBAAAA,CAAkBzkC,GAChBY,EAAAA,QAAQa,IAAIqb,MAAM,oCAClB3d,KAAKgK,eAAe,CAAE4J,SAAU,GAClC,CAEA2xB,YAAAA,CAAa1kC,GACXY,EAAAA,QAAQa,IAAIqb,MAAM,8BAClB3d,KAAKgK,eAAe,CAAE4J,SAAU,GAClC,CAEA4xB,iBAAAA,CAAkB3kC,GAChBY,EAAAA,QAAQa,IAAIqb,MAAM,oCAClB3d,KAAKgK,eAAe,CAAE4J,SAAU,GAClC,CAEA6xB,YAAAA,CAAa5kC,GACXY,EAAAA,QAAQa,IAAIqb,MAAM,8BAClB3d,KAAKuD,UACLvD,KAAKgkC,cAAgB,IACvB,CAEA0B,WAAAA,CAAY7kC,GACVY,EAAAA,QAAQa,IAAIqb,MAAM,6BAClB3d,KAAKuD,QAAQ,CAAEC,SAAS,IACxBxD,KAAKgkC,cAAgB,IACvB,CAEA2B,UAAAA,CAAW9kC,GACTY,EAAAA,QAAQa,IAAIqb,MAAM,4BAClB3d,KAAKqD,WACP,CAEAuiC,WAAAA,CAAY/kC,GACVY,EAAAA,QAAQa,IAAIqb,MAAM,6BAClB3d,KAAKsD,YACP,CAEAuiC,WAAAA,CAAYhlC,GACVY,EAAAA,QAAQa,IAAIqb,MAAM,6BAClB3d,KAAK+J,YAAY,CAAE9F,IAAKjE,KAAKymC,sBAC/B,CAGAT,kBAAAA,CAAmBnlC,GACjBb,KAAKmkC,UAAYnkC,KAAK0mC,iBAAiB7lC,GACvCY,EAAAA,QAAQa,IAAIqb,MAAM,oCAAqC3d,KAAKmkC,UAC9D,CAGA+B,eAAAA,CAAgBrlC,GACd,MAAM8lC,EAAW3mC,KAAK4mC,qBAAqB/lC,GAC3CY,EAAAA,QAAQa,IAAIqb,MAAM,gCAAiCgpB,EACrD,CAGAP,iBAAAA,CAAkBvlC,GAChB,IACE,MAAMqjC,EAAarjC,EAAMgmC,gBACzB,MAAO,CACLC,SAAU5C,GAAY4C,SACtB7iC,IAAKigC,GAAYjgC,IACjB8iC,gBAAiB7C,GAAY6C,gBAC7B7R,WAAYl1B,KAAKgnC,gBAErB,CAAE,MAAOp2B,GAEP,OADAnP,EAAAA,QAAQa,IAAIoS,KAAK,+CAAgD9D,GAC1D,CAAC,CACV,CACF,CAEA21B,kBAAAA,CAAmB1lC,GACjB,IACE,MAAMojC,EAAcpjC,EAAMomC,aAC1B,MAAO,CACLC,UAAWjD,GAAaxjC,GACxB0mC,aAAclD,GAAa19B,MAC3B6gC,QAASnD,GAAa9jC,KAAK+E,QAAU,EACrC28B,SAAU7hC,KAAKuB,gBAEnB,CAAE,MAAOqP,GAEP,OADAnP,EAAAA,QAAQa,IAAIoS,KAAK,iDAAkD9D,GAC5D,CAAC,CACV,CACF,CAEA41B,aAAAA,CAAc3lC,GACZ,IACE,MAAMT,EAAKS,EAAMwmC,QACjB,MAAO,CACLjhC,KAAMhG,GAAIiK,UACVhE,WAAYjG,GAAIkK,gBAChB/J,SAAUH,GAAIE,cACdiG,MAAOnG,GAAIiB,WACXimC,YAAalnC,GAAImnC,iBACjBC,eAAgBpnC,GAAIqnC,oBACpBC,gBAAiBtnC,GAAIqmC,qBACrBkB,OAAQvnC,GAAIwnC,YACZC,aAAcznC,GAAI0nC,kBAClBjG,SAAU7hC,KAAKuB,gBAEnB,CAAE,MAAOqP,GAEP,OADAnP,EAAAA,QAAQa,IAAIoS,KAAK,2CAA4C9D,GACtD,CAAC,CACV,CACF,CAEA01B,gBAAAA,CAAiBzlC,GACf,IACE,MAAM+P,EAAQ/P,EAAM6I,WACpB,MAAO,CACLC,UAAWiH,GAAOhH,eAClBC,aAAc+G,GAAO9G,aACrBi+B,WAAYn3B,GAAOo3B,gBAEvB,CAAE,MAAOp3B,GAEP,OADAnP,EAAAA,QAAQa,IAAIoS,KAAK,8CAA+C9D,GACzD,CAAE/G,aAAc,oBACzB,CACF,CAEA68B,gBAAAA,CAAiB7lC,GACf,IACE,OAAOA,EAAMonC,gBAAkB,EACjC,CAAE,MAAOr3B,GAEP,OADAnP,EAAAA,QAAQa,IAAIoS,KAAK,8CAA+C9D,GACzD,EACT,CACF,CAEAg2B,oBAAAA,CAAqB/lC,GACnB,IACE,MAAO,CACLW,KAAMX,EAAMqnC,UACZz9B,KAAM5J,EAAMsnC,UAEhB,CAAE,MAAOv3B,GAKP,OAJAnP,EAAAA,QAAQa,IAAIoS,KACV,kDACA9D,GAEK,CAAC,CACV,CACF,CAGA/Q,cAAAA,GACE,MAAO,SACT,CAEAC,aAAAA,GACE,MAAO,aACT,CAEAC,gBAAAA,GACE,OAAIC,KAAKP,OAAOqkC,KAAK7jC,QACZD,KAAKP,OAAOqkC,IAAI7jC,QAErBD,KAAKP,OAAOmG,KAAK3F,QACZ,YAAYD,KAAKP,OAAOmG,IAAI3F,UAE9B,SACT,CAEAmoC,cAAAA,GACE,OAAOpoC,KAAKmkC,SACd,CAEA5iC,aAAAA,GACE,IAAKvB,KAAKgkC,gBAAkBhkC,KAAKikC,YAAa,OAAO,KAGrD,MAAM5jC,EAAcL,KAAKP,OAAOY,cAC1BE,EAAWP,KAAKP,OAAOc,WAE7B,OAAIF,EAAc,EACT,MACEE,GAAYF,EAAcE,EAAW,GACvC,OAEA,KAEX,CAEAD,WAAAA,GACE,YAAqC4F,IAAjClG,KAAKgkC,eAAezjC,SACe,IAA9BP,KAAKgkC,cAAczjC,SAErB,IACT,CAEAC,UAAAA,GACE,OAAOR,KAAKgkC,eAAe59B,MAAQ,IACrC,CAEAzF,eAAAA,GACE,OAAOX,KAAKgkC,eAAe39B,YAAc,IAC3C,CAEAhF,QAAAA,GACE,OAAOrB,KAAKgkC,eAAez9B,OAAS,IACtC,CAEArF,MAAAA,GACE,OAAOlB,KAAKkkC,YAAYjgC,KAAO,IACjC,CAEA/D,WAAAA,GACE,GAAIF,KAAK+jC,cACP,IAEE,OAAoB,IADD/jC,KAAK+jC,cAAcsE,eAExC,CAAE,MAAOz3B,GAEP,OAAmC,IAA5B5Q,KAAKP,OAAOY,aACrB,CAEF,OAAmC,IAA5BL,KAAKP,OAAOY,aACrB,CAEAK,YAAAA,GACE,MAAO,YACT,CAEA+lC,kBAAAA,GACE,OAAOzmC,KAAKgkC,eAAe0D,iBAAmB,IAChD,CAEAV,aAAAA,GAEE,GAAIhnC,KAAKkkC,YAAYhP,WACnB,OAAOl1B,KAAKkkC,WAAWhP,WAIzB,OADiBl1B,KAAKP,OAAOc,aACTu0B,IAAW,OAAS,KAC1C,CAGAwT,YAAAA,GACE,MAAgC,SAAzBtoC,KAAKgnC,eACd,CAEAuB,iBAAAA,GACE,OAAOvoC,KAAKikC,WACd,CAEA75B,YAAAA,GACE,OAAOpK,KAAKgkC,aACd,CAEA6C,aAAAA,GACE,OAAO7mC,KAAKkkC,UACd,CAEAn/B,UAAAA,GACE,MAAMlB,EAAO7D,KAAKiM,UAClB,OAAIpI,GAAQA,EAAKA,MAAQA,EAAKA,KAAK0B,OAAS1B,EAAKA,KAAK0B,MAAMC,UACnDf,KAAKC,MAAMb,EAAKA,KAAK0B,MAAMC,WAE7B,IACT,CAEAjB,mBAAAA,GACE,MAAMV,EAAO7D,KAAKiM,UAClB,GAAIpI,GAAQA,EAAKU,oBAAqB,CACpC,MAAMC,EAAUX,EAAKU,sBACrB,OAAmB,OAAZC,EAAmBC,KAAKC,MAAMF,GAAW,IAClD,CACA,OAAO,IACT,EACDzC,EAAAA,QAAAkO,IChdGu4B,EAA2B,CAAC,EAGhC,SAASC,EAAoBC,GAE5B,IAAIC,EAAeH,EAAyBE,GAC5C,QAAqBxiC,IAAjByiC,EACH,OAAOA,EAAa5mC,QAGrB,IAAI6mC,EAASJ,EAAyBE,GAAY,CAGjD3mC,QAAS,CAAC,GAOX,OAHA8mC,EAAoBH,GAAUE,EAAQA,EAAO7mC,QAAS0mC,GAG/CG,EAAO7mC,OACf,CCrBA0mC,EAAoB30B,EAAI,CAAC/R,EAAS+mC,KACjC,IAAI,IAAItT,KAAOsT,EACXL,EAAoBr0B,EAAE00B,EAAYtT,KAASiT,EAAoBr0B,EAAErS,EAASyzB,IAC5E/R,OAAOC,eAAe3hB,EAASyzB,EAAK,CAAE7R,YAAY,EAAMC,IAAKklB,EAAWtT,IAE1E,ECNDiT,EAAoBr0B,EAAI,CAAC20B,EAAKC,IAAUvlB,OAAOI,UAAUC,eAAelM,KAAKmxB,EAAKC,GCClFP,EAAoB50B,EAAK9R,IACH,oBAAXgiB,QAA0BA,OAAOC,aAC1CP,OAAOC,eAAe3hB,EAASgiB,OAAOC,YAAa,CAAEC,MAAO,WAE7DR,OAAOC,eAAe3hB,EAAS,aAAc,CAAEkiB,OAAO,GAAO,4ECL9D,IAAuChlB,EAAvCgqC,GAAuChqC,EAAvCE,EAAA,OAAuCF,EAAAG,WAAAH,EAAA,CAAAI,QAAAJ,GAAA8C,EAAAA,EACxByJ,EAAAA","sources":["webpack://@newrelic/video-videojs/./src/ads/freewheel.js","webpack://@newrelic/video-videojs/./src/ads/brightcove-ima.js","webpack://@newrelic/video-videojs/./src/techs/hls-js.js","webpack://@newrelic/video-videojs/./src/ads/ima.js","webpack://@newrelic/video-videojs/./src/tracker.js","webpack://@newrelic/video-videojs/./src/ads/utils/mt-constants.js","webpack://@newrelic/video-videojs/./src/techs/shaka.js","webpack://@newrelic/video-videojs/./src/techs/contrib-hls.js","webpack://@newrelic/video-videojs/./src/ads/videojs-ads.js","webpack://@newrelic/video-videojs/./node_modules/@newrelic/video-core/dist/esm/index.js","webpack://@newrelic/video-videojs/./src/ads/utils/mt.js","webpack://@newrelic/video-videojs/./src/ads/media-tailor.js","webpack://@newrelic/video-videojs/./src/ads/dai.js","webpack://@newrelic/video-videojs/webpack/bootstrap","webpack://@newrelic/video-videojs/webpack/runtime/define property getters","webpack://@newrelic/video-videojs/webpack/runtime/hasOwnProperty shorthand","webpack://@newrelic/video-videojs/webpack/runtime/make namespace object","webpack://@newrelic/video-videojs/./src/index.js"],"sourcesContent":["import VideojsAdsTracker from './videojs-ads'\n\nexport default class FreewheelAdsTracker extends VideojsAdsTracker {\n static isUsing (player) {\n return !!player.FreeWheelPlugin && typeof tv !== 'undefined' && tv.freewheel\n }\n\n getTrackerName () {\n return 'freewheel-ads'\n }\n\n getPlayerName () {\n return 'freewheel-ads'\n }\n\n getPlayerVersion () {\n return this.player.FreeWheelPlugin.VERSION\n }\n\n getPlayhead () {\n if (this.player.ads.ad.currentTime) {\n return this.player.ads.ad.currentTime() * 1000\n }\n }\n\n getDuration () {\n if (this.player.ads.ad.duration) {\n return this.player.ads.ad.duration * 1000\n }\n }\n\n getVideoId () {\n return this.player.ads.ad.id\n }\n\n getAdPartner () {\n return 'freewheel'\n }\n\n getAdCreativeId () {\n try {\n return this.player.ads.provider.event.adInstance.getActiveCreativeRendition().getId()\n } catch (err) { /* do nothing */ }\n }\n\n getSrc () {\n try {\n let acr = this.player.ads.provider.event.adInstance.getActiveCreativeRendition()\n return acr.getPrimaryCreativeRenditionAsset().getUrl()\n } catch (err) { /* do nothing */ }\n }\n\n getTitle () {\n try {\n let acr = this.player.ads.provider.event.adInstance.getActiveCreativeRendition()\n return acr.getPrimaryCreativeRenditionAsset().getName()\n } catch (err) { /* do nothing */ }\n }\n\n getAdPosition () {\n switch (this.player.ads.ad.type) {\n case 'PREROLL':\n return nrvideo.Constants.AdPositions.PRE\n case 'MIDROLL':\n return nrvideo.Constants.AdPositions.MID\n case 'POSTROLL':\n return nrvideo.Constants.AdPositions.POST\n }\n }\n}\n","import nrvideo from '@newrelic/video-core'\nimport VideojsAdsTracker from './videojs-ads'\n\nexport default class BrightcoveImaAdsTracker extends VideojsAdsTracker {\n static isUsing (player) {\n return !!player.ima3\n }\n\n getTrackerName () {\n return 'brightcove-ima-ads'\n }\n\n getPlayerName () {\n return 'brightcove-ima-ads'\n }\n\n getPlayhead () {\n return this.player?.ima3?.adPlayer?.currentTime()\n }\n\n registerListeners () {\n nrvideo.Log.debugCommonVideoEvents(this.player, [\n null,\n 'ima3-ready',\n 'ima3error',\n 'ima3-ad-error',\n 'ima3-started',\n 'ima3-complete',\n 'ima3-paused',\n 'ima3-resumed',\n 'ads-request',\n 'ads-load',\n 'ads-ad-started',\n 'ads-ad-ended',\n 'ads-pause',\n 'ads-play',\n 'ads-click',\n 'ads-pod-started',\n 'ads-pod-ended',\n 'ads-allpods-completed'\n ])\n\n this.player.on('ima3-started', this.onStarted.bind(this))\n this.player.on('ima3-paused', this.onPaused.bind(this))\n this.player.on('ima3-resumed', this.onResume.bind(this))\n this.player.on('ima3-complete', this.onComplete.bind(this))\n this.player.on('ima3-skipped', this.onSkipped.bind(this))\n this.player.on('adserror', this.onError.bind(this))\n this.player.on('ads-click', this.onClick.bind(this))\n }\n\n unregisterListeners () {\n this.player.off('ima3-started', this.onStarted)\n this.player.off('ima3-paused', this.onPaused)\n this.player.off('ima3-resumed', this.onResume)\n this.player.off('ima3-complete', this.onComplete)\n this.player.off('ima3-skipped', this.onSkipped)\n this.player.off('adserror', this.onError)\n this.player.off('ads-click', this.onClick)\n }\n\n onStarted (e) {\n this.sendRequest()\n this.sendStart()\n }\n\n onPaused (e) {\n this.sendPause()\n }\n\n onResume (e) {\n this.sendResume()\n }\n\n onComplete (e) {\n this.sendEnd()\n }\n\n onSkipped (e) {\n this.sendEnd({ skipped: true })\n }\n\n onError (e) {\n this.sendError()\n }\n\n onClick (e) {\n this.sendClick()\n }\n}\n","export default class HlsJs {\n constructor(tech) {\n this.tech = tech.vhs_;\n this.player = tech.el().player; // Store player reference for currentTime\n }\n\n getResource(tech) {\n return this.tech.url;\n }\n\n getRenditionName(tech) {\n try {\n var level = this.tech.levels[this.tech.currentLevel];\n if (level && level.name) return level.name;\n } catch (err) {}\n return null;\n }\n\n getRenditionBitrate(tech) {\n try {\n var level = this.tech.levels[this.tech.currentLevel];\n if (level && level.bitrate) return Math.round(level.bitrate);\n } catch (err) {}\n return null;\n }\n\n getRenditionWidth(tech) {\n try {\n var level = this.tech.levels[this.tech.currentLevel];\n if (level && level.width) return level.width;\n } catch (err) {}\n return null;\n }\n\n getRenditionHeight(tech) {\n try {\n var level = this.tech.levels[this.tech.currentLevel];\n if (level && level.height) return level.height;\n } catch (err) {}\n return null;\n }\n\n getBitrate() {\n // Default uses playback bitrate (Method 4)\n return this.getContentBitratePlayback();\n }\n\n getContentBitratePlayback() {\n try {\n // Get the current active level's bitrate from manifest\n const level = this.tech.levels[this.tech.currentLevel];\n if (level && level.bitrate) {\n return Math.round(level.bitrate);\n }\n } catch (err) {}\n return null;\n }\n\n getManifestBitrate() {\n try {\n // Return highest available bitrate from all renditions\n if (this.tech.levels && this.tech.levels.length > 0) {\n return Math.round(Math.max(...this.tech.levels.map(l => l.bitrate)));\n }\n } catch (err) {}\n return null;\n }\n\n getSegmentDownloadBitrate() {\n try {\n // VHS stats.bandwidth\n if (this.tech.stats && this.tech.stats.bandwidth > 0)\n return Math.round(this.tech.stats.bandwidth);\n } catch (err) {}\n return null;\n }\n\n getNetworkDownloadBitrate() {\n if (this.tech.throughput && this.tech.throughput > 0) {\n return Math.round(this.tech.throughput);\n }\n return null;\n }\n}\n\nHlsJs.isUsing = function (tech) {\n return !!tech.vhs_;\n};\n","/* global google */\nimport nrvideo from '@newrelic/video-core';\nimport VideojsAdsTracker from './videojs-ads';\n\nexport default class ImaAdsTracker extends VideojsAdsTracker {\n static isUsing(player) {\n return player.ima && typeof google !== 'undefined';\n }\n\n getTrackerName() {\n return 'ima-ads';\n }\n\n getPlayerName() {\n return 'ima';\n }\n\n getPlayerVersion() {\n return (\n 'ima: ' + google.ima.VERSION + '; contrib-ads: ' + this.player.ads.VERSION\n );\n }\n\n getCuePoints() {\n return this.player.ima.getAdsManager().getCuePoints();\n }\n\n getAdPosition() {\n if (\n this.lastAdData &&\n this.lastAdData.podInfo &&\n this.lastAdData.podInfo.podIndex !== undefined\n ) {\n const podIndex = this.lastAdData.podInfo.podIndex;\n\n if (podIndex === 0) {\n return 'pre';\n } else if (podIndex === -1) {\n return 'post';\n } else {\n return 'mid';\n }\n }\n return null;\n }\n\n getDuration() {\n if (this.lastAdData && this.lastAdData.duration !== undefined) {\n return this.lastAdData.duration * 1000;\n }\n return null;\n }\n\n getVideoId() {\n if (this.lastAdData && this.lastAdData.adId) {\n return this.lastAdData.adId;\n }\n return null;\n }\n\n getAdCreativeId() {\n if (this.lastAdData && this.lastAdData.creativeId) {\n return this.lastAdData.creativeId;\n }\n return null;\n }\n\n getSrc() {\n if (this.lastAdData && this.lastAdData.mediaUrl) {\n return this.lastAdData.mediaUrl;\n }\n return null;\n }\n\n getTitle() {\n if (this.lastAdData && this.lastAdData.title) {\n return this.lastAdData.title;\n }\n return null;\n }\n\n getPlayhead() {\n let manager = this.player.ima.getAdsManager();\n if (manager) {\n return (this.getDuration() - manager.getRemainingTime()) * 1000;\n }\n }\n\n getPlayrate() {\n return this.player.playbackRate();\n }\n\n getAdPartner() {\n return 'ima';\n }\n\n getWebkitBitrate() {\n const adVideoElement = this.getAdVideoElement();\n if (adVideoElement && adVideoElement.webkitVideoDecodedByteCount) {\n let bitrate;\n if (this._lastAdWebkitBitrate > 0) {\n const current = adVideoElement.webkitVideoDecodedByteCount;\n const delta = current - this._lastAdWebkitBitrate;\n const seconds = this.getHeartbeat() / 1000;\n bitrate = Math.round((delta / seconds) * 8);\n }\n \n this._lastAdWebkitBitrate = adVideoElement.webkitVideoDecodedByteCount;\n return bitrate ?? null;\n }\n return null;\n }\n\n getRenditionBitrate() {\n if (this.lastAdData && this.lastAdData.renditionBitrate) {\n return Math.round(this.lastAdData.renditionBitrate);\n }\n return null;\n }\n\n registerListeners() {\n // Shortcut events\n let e = google.ima.AdEvent.Type;\n let AD_ERROR = google.ima.AdErrorEvent.Type.AD_ERROR;\n\n //store ad data\n this.lastAdData = null;\n // debug\n nrvideo.Log.debugCommonVideoEvents(this.player.ima.addEventListener, [\n null,\n e.ALL_ADS_COMPLETED,\n e.LINEAR_CHANGED,\n e.COMPLETE,\n e.USER_CLOSE,\n e.IMPRESSION,\n e.CONTENT_PAUSE_REQUESTED,\n e.CONTENT_RESUME_REQUESTED,\n e.SKIPPED,\n e.SKIPPABLE_STATE_CHANGED,\n e.LOADED,\n e.PAUSED,\n e.RESUMED,\n e.STARTED,\n e.AD_CAN_PLAY,\n e.AD_METADATA,\n e.EXPANDED_CHANGED,\n e.AD_BREAK_READY,\n e.LOG,\n e.CLICK,\n e.FIRST_QUARTILE,\n e.MIDPOINT,\n e.THIRD_QUARTILE,\n AD_ERROR,\n ]);\n\n // Register listeners\n this.player.ima.addEventListener(e.LOADED, this.onLoaded.bind(this));\n this.player.ima.addEventListener(e.STARTED, this.onStart.bind(this));\n this.player.ima.addEventListener(e.PAUSED, this.onPaused.bind(this));\n this.player.ima.addEventListener(e.RESUMED, this.onResumed.bind(this));\n this.player.ima.addEventListener(e.COMPLETE, this.onComplete.bind(this));\n this.player.ima.addEventListener(e.SKIPPED, this.onSkipped.bind(this));\n this.player.ima.addEventListener(e.CLICK, this.onClick.bind(this));\n this.player.ima.addEventListener(\n e.FIRST_QUARTILE,\n this.onFirstQuartile.bind(this)\n );\n this.player.ima.addEventListener(e.MIDPOINT, this.onMidpoint.bind(this));\n this.player.ima.addEventListener(\n e.THIRD_QUARTILE,\n this.onThirdQuartile.bind(this)\n );\n this.player.ima.addEventListener(AD_ERROR, this.onError.bind(this));\n }\n\n unregisterListeners() {\n // Shortcut events\n let e = google.ima.AdEvent.Type;\n let AD_ERROR = google.ima.AdErrorEvent.Type.AD_ERROR;\n\n // unregister listeners\n this.player.ima.removeEventListener(e.LOADED, this.onLoaded);\n this.player.ima.removeEventListener(e.STARTED, this.onLoaded.bind(this));\n this.player.ima.removeEventListener(e.IMPRESSION, this.onImpression);\n this.player.ima.removeEventListener(e.PAUSED, this.onPaused);\n this.player.ima.removeEventListener(e.RESUMED, this.onResumed);\n this.player.ima.removeEventListener(e.COMPLETE, this.onComplete);\n this.player.ima.removeEventListener(e.SKIPPED, this.onSkipped);\n this.player.ima.removeEventListener(e.CLICK, this.onClick);\n this.player.ima.removeEventListener(e.FIRST_QUARTILE, this.onFirstQuartile);\n this.player.ima.removeEventListener(e.MIDPOINT, this.onMidpoint);\n this.player.ima.removeEventListener(e.THIRD_QUARTILE, this.onThirdQuartile);\n this.player.ima.removeEventListener(AD_ERROR, this.onError);\n //clear ad data\n this.lastAdData = null;\n }\n\n onLoaded(e) {\n this.lastAdData = this.getAdData();\n this.sendRequest();\n }\n\n onStart(e) {\n this.lastAdData = this.getAdData();\n this._lastAdWebkitBitrate = 0;\n this.sendStart();\n }\n\n onComplete(e) {\n this.sendEnd();\n this.lastAdData = null; // Clear the data\n }\n\n onSkipped(e) {\n this.sendEnd({ skipped: true });\n this.lastAdData = null; // Clear the data\n }\n\n onError(e) {\n const adError = e.getError();\n\n const errorCode = adError.getErrorCode();\n const errorMessage = adError.getMessage();\n this.sendError({ adError, errorCode, errorMessage });\n }\n\n onClick(e) {\n this.sendAdClick();\n }\n\n onFirstQuartile() {\n this.sendAdQuartile({ adQuartile: 1 });\n }\n\n onMidpoint() {\n this.sendAdQuartile({ adQuartile: 2 });\n }\n\n onThirdQuartile() {\n this.sendAdQuartile({ adQuartile: 3 });\n }\n\n onPaused() {\n this.sendPause();\n }\n\n onResumed() {\n this.sendResume();\n }\n\n getAdData() {\n try {\n const adsManager = this.player.ima.getAdsManager();\n if (adsManager) {\n const currentAd = adsManager.getCurrentAd();\n if (currentAd) {\n return {\n adId: currentAd.getAdId(),\n creativeId: currentAd.getCreativeId(),\n duration: currentAd.getDuration(),\n mediaUrl: currentAd.getMediaUrl(),\n title: currentAd.getTitle(),\n podInfo: currentAd.getAdPodInfo()?.data,\n renditionBitrate: currentAd.getVastMediaBitrate(),\n // Add other properties as needed\n };\n }\n }\n return null;\n } catch (err) {\n return null;\n }\n }\n\n getAdVideoElement() {\n if (this.player.ima && this.player.ima.controller && this.player.ima.controller.adUi) {\n const adContainerDiv = this.player.ima.controller.adUi.adContainerDiv;\n if (adContainerDiv) {\n const adVideoElement = adContainerDiv.querySelector('video');\n if (adVideoElement) {\n return adVideoElement;\n }\n }\n }\n }\n}\n","import nrvideo from '@newrelic/video-core';\nimport pkg from '../package.json';\nimport ContribHlsTech from './techs/contrib-hls';\nimport HlsJsTech from './techs/hls-js';\nimport ShakaTech from './techs/shaka';\nimport VideojsAdsTracker from './ads/videojs-ads';\nimport ImaAdsTracker from './ads/ima';\nimport BrightcoveImaAdsTracker from './ads/brightcove-ima';\nimport FreewheelAdsTracker from './ads/freewheel';\nimport DaiAdsTracker from './ads/dai';\nimport MediaTailorAdsTracker from './ads/media-tailor';\n\nexport default class VideojsTracker extends nrvideo.VideoTracker {\n constructor(player, options) {\n super(player, options);\n this.options = options;\n this.isContentEnd = false;\n this.imaAdCuePoints = '';\n this.daiInitialized = false;\n nrvideo.Core.addTracker(this, options);\n }\n\n getTech() {\n let tech = this.player.tech({ IWillNotUseThisInPlugins: true });\n\n if (tech) {\n if (ContribHlsTech.isUsing(tech)) {\n return new ContribHlsTech(tech);\n } else if (HlsJsTech.isUsing(tech)) {\n return new HlsJsTech(tech);\n } else if (ShakaTech.isUsing(tech)) {\n return new ShakaTech(tech);\n }\n }\n }\n\n getTrackerName() {\n return 'videojs';\n }\n\n getInstrumentationProvider() {\n return 'New Relic';\n }\n\n getInstrumentationName() {\n return this.getPlayerName();\n }\n\n getInstrumentationVersion() {\n return this.getPlayerVersion();\n }\n\n getTrackerVersion() {\n return pkg.version;\n }\n\n getPlayhead() {\n if (\n this.player.ads &&\n this.player.ads.state === 'ads-playback' &&\n this.player.ads.snapshot &&\n this.player.ads.snapshot.currentTime\n ) {\n return this.player.ads.snapshot.currentTime * 1000;\n } else if (this.player.absoluteTime) {\n return this.player.absoluteTime() * 1000;\n } else {\n return this.player.currentTime() * 1000;\n }\n }\n\n getDuration() {\n if (\n this.player.mediainfo &&\n typeof this.player.mediainfo.duration !== 'undefined'\n ) {\n return this.player.mediainfo.duration * 1000; // Brightcove\n } else {\n return this.player.duration() * 1000;\n }\n }\n\n getTitle() {\n return this.player?.mediainfo?.name; // Brightcove\n }\n\n getId() {\n return this.player?.mediainfo?.id; // Brightcove\n }\n\n getLanguage() {\n return this.player?.language();\n }\n\n getSrc() {\n let tech = this.getTech();\n if (tech && tech.getSrc) {\n return tech.getSrc();\n } else {\n return this.player.currentSrc();\n }\n }\n\n getPlayerName() {\n return this.player?.name() || 'videojs';\n }\n\n getPlayerVersion() {\n return this.player?.version || videojs.VERSION;\n }\n\n isMuted() {\n return this.player.muted();\n }\n\n getBitrate() {\n return this.getContentBitratePlayback();\n }\n\n // Measures: Actual content consumption rate during playback\n getContentBitratePlayback() {\n try {\n const tech = this.player.tech({ IWillNotUseThisInPlugins: true });\n\n // 1. Get the current active rendition (The most accurate \"Playback Bitrate\")\n if (tech?.vhs?.playlists?.media()) {\n const activePlaylist = tech.vhs.playlists.media();\n // Use AVERAGE-BANDWIDTH if available, fallback to BANDWIDTH\n const bitrate = activePlaylist.attributes['AVERAGE-BANDWIDTH'] ||\n activePlaylist.attributes.BANDWIDTH ||\n null;\n return bitrate !== null ? Math.round(bitrate) : null;\n }\n\n // 2. Fallback to tech wrappers (Shaka/Hls.js) if they have a getBitrate method\n const techWrapper = this.getTech();\n if (techWrapper?.getBitrate) {\n const bitrate = techWrapper.getBitrate();\n return bitrate !== null ? Math.round(bitrate) : null;\n }\n } catch (err) {\n /* ignore */\n }\n return null;\n }\n\n getRenditionName() {\n let tech = this.getTech();\n if (tech && tech.getRenditionName) {\n return tech.getRenditionName();\n }\n }\n\n getManifestBitrate() {\n try {\n const tech = this.player.tech({ IWillNotUseThisInPlugins: true });\n // tech.vhs.playlists.master.playlists contains the array of all renditions\n const allRenditions = tech?.vhs?.playlists?.master?.playlists;\n\n if (allRenditions && allRenditions.length > 0) {\n // Find the highest BANDWIDTH value in the list\n const maxBitrate = Math.max(\n ...allRenditions.map((p) => p.attributes.BANDWIDTH || 0),\n );\n return maxBitrate > 0 ? Math.round(maxBitrate) : null;\n }\n\n // Fallback to tech wrappers (Shaka/Hls.js)\n const techWrapper = this.getTech();\n if (techWrapper?.getManifestBitrate) {\n const bitrate = techWrapper.getManifestBitrate();\n return bitrate !== null ? Math.round(bitrate) : null;\n }\n } catch (e) {\n /* ignore */\n }\n return null;\n }\n\n getSegmentDownloadBitrate() {\n try {\n const tech = this.player.tech({ IWillNotUseThisInPlugins: true });\n\n // VHS stats.bandwidth\n if (tech?.vhs?.stats?.bandwidth && tech.vhs.stats.bandwidth > 0) {\n return Math.round(tech.vhs.stats.bandwidth);\n }\n\n // Fallback to tech wrappers (Shaka/Hls.js)\n const techWrapper = this.getTech();\n if (techWrapper?.getSegmentDownloadBitrate) {\n const bitrate = techWrapper.getSegmentDownloadBitrate();\n return bitrate !== null ? Math.round(bitrate) : null;\n }\n } catch (err) {\n /* ignore */\n }\n return null;\n }\n\n getNetworkDownloadBitrate() {\n const tech = this.player.tech({ IWillNotUseThisInPlugins: true });\n\n if (tech?.vhs?.throughput && tech.vhs.throughput > 0) {\n return Math.round(tech.vhs.throughput);\n }\n\n // Fallback to tech wrapper implementation\n const techWrapper = this.getTech();\n if (techWrapper?.getNetworkDownloadBitrate) {\n const bitrate = techWrapper.getNetworkDownloadBitrate();\n return bitrate !== null ? Math.round(bitrate) : null;\n }\n\n return null;\n }\n\n getRenditionHeight() {\n let tech = this.getTech();\n\n if (tech && tech.getRenditionHeight) {\n return tech.getRenditionHeight();\n }\n return this.player.videoHeight();\n }\n\n getRenditionWidth() {\n let tech = this.getTech();\n if (tech && tech.getRenditionWidth) {\n return tech.getRenditionWidth();\n }\n return this.player.videoWidth();\n }\n\n getPlayrate() {\n return this.player.playbackRate();\n }\n\n isAutoplayed() {\n return this.player.autoplay();\n }\n\n isFullscreen() {\n return this.player.isFullscreen();\n }\n\n getPreload() {\n return this.player.preload();\n }\n\n registerListeners() {\n nrvideo.Log.debugCommonVideoEvents(this.player, [\n 'adstart',\n 'adend',\n 'adskip',\n 'adsready',\n 'adserror',\n 'dispose',\n ]);\n\n // BIND LISTENER METHODS\n this.onDownload = this.onDownload.bind(this);\n this.onAdsready = this.onAdsready.bind(this);\n this.onAdStart = this.onAdStart.bind(this);\n this.onAdEnd = this.onAdEnd.bind(this);\n this.onPlay = this.onPlay.bind(this);\n this.onPause = this.onPause.bind(this);\n this.onPlaying = this.onPlaying.bind(this);\n this.onAbort = this.onAbort.bind(this);\n this.onEnded = this.onEnded.bind(this);\n this.onDispose = this.onDispose.bind(this);\n this.onSeeking = this.onSeeking.bind(this);\n this.onSeeked = this.onSeeked.bind(this);\n this.onError = this.onError.bind(this);\n this.onWaiting = this.onWaiting.bind(this);\n this.onTimeupdate = this.onTimeupdate.bind(this);\n this.OnAdsAllpodsCompleted = this.OnAdsAllpodsCompleted.bind(this);\n this.onStreamManager = this.onStreamManager.bind(this);\n\n this.player.on('loadstart', this.onDownload);\n this.player.on('loadeddata', this.onDownload);\n this.player.on('loadedmetadata', this.onDownload);\n this.player.on('adsready', this.onAdsready);\n this.player.on('adstart', this.onAdStart);\n this.player.on('adend', this.onAdEnd);\n this.player.on('play', this.onPlay);\n this.player.on('pause', this.onPause);\n this.player.on('playing', this.onPlaying);\n this.player.on('abort', this.onAbort);\n this.player.on('ended', this.onEnded);\n this.player.on('dispose', this.onDispose);\n this.player.on('seeking', this.onSeeking);\n this.player.on('seeked', this.onSeeked);\n this.player.on('error', this.onError);\n this.player.on('waiting', this.onWaiting);\n this.player.on('timeupdate', this.onTimeupdate);\n this.player.on('ads-allpods-completed', this.OnAdsAllpodsCompleted);\n this.player.on('stream-manager', this.onStreamManager);\n }\n\n unregisterListeners() {\n this.player.off('loadstart', this.onDownload);\n this.player.off('loadeddata', this.onDownload);\n this.player.off('loadedmetadata', this.onDownload);\n this.player.off('adsready', this.onAdsready);\n this.player.off('adstart', this.onAdStart);\n this.player.off('adend', this.onAdEnd);\n this.player.off('play', this.onPlay);\n this.player.off('pause', this.onPause);\n this.player.off('playing', this.onPlaying);\n this.player.off('abort', this.onAbort);\n this.player.off('ended', this.onEnded);\n this.player.off('dispose', this.onDispose);\n this.player.off('seeking', this.onSeeking);\n this.player.off('seeked', this.onSeeked);\n this.player.off('error', this.onError);\n this.player.off('waiting', this.onWaiting);\n this.player.off('timeupdate', this.onTimeupdate);\n this.player.off('ads-allpods-completed', this.OnAdsAllpodsCompleted);\n this.player.off('stream-manager', this.onStreamManager);\n }\n\n onDownload(e) {\n this.sendDownload({ state: e.type });\n\n // Check if MediaTailor should be used after the source is loaded\n // Only check on 'loadstart' to avoid multiple checks\n if (\n !this.adsTracker &&\n e.type === 'loadstart' &&\n MediaTailorAdsTracker.isUsing(this.player)\n ) {\n console.log(\n 'VideojsTracker: Creating MediaTailorAdsTracker after source load'\n );\n this.setAdsTracker(new MediaTailorAdsTracker(this.player, this.options));\n // MediaTailor SSAI starts with content, not ads (unlike client-side ad frameworks)\n this.adsTracker.setIsAd(false);\n }\n }\n\n // DAI methods\n onStreamManager(event) {\n if (!this.adsTracker && event.StreamManager) {\n const daiTracker = new DaiAdsTracker(this.player);\n daiTracker.setStreamManager(event.StreamManager);\n this.setAdsTracker(daiTracker);\n }\n }\n // DAI methods end\n\n onAdsready() {\n if (!this.adsTracker) {\n if (BrightcoveImaAdsTracker.isUsing(this.player)) {\n // BC IMA\n this.setAdsTracker(new BrightcoveImaAdsTracker(this.player));\n } else if (ImaAdsTracker.isUsing(this.player)) {\n // IMA\n this.setAdsTracker(new ImaAdsTracker(this.player));\n } else if (FreewheelAdsTracker.isUsing(this.player)) {\n // FW\n\n this.setAdsTracker(new FreewheelAdsTracker(this.player));\n // } else if (OnceAdsTracker.isUsing(this)) { // Once\n } else {\n // Generic\n this.setAdsTracker(new VideojsAdsTracker(this.player));\n }\n }\n }\n\n onAdStart() {\n this.currentAdPlaying = true;\n\n /* get the array with all the cue points which will be played */\n if (!this.imaAdCuePoints) {\n this.imaAdCuePoints = this.player?.ima?.getAdsManager().getCuePoints();\n }\n }\n onAdEnd() {\n if (this.isContentEnd) {\n this.sendEnd();\n }\n }\n\n OnAdsAllpodsCompleted() {\n this.onEnded.bind(this);\n this.FreewheelAdsCompleted = true;\n }\n\n /**\n * Check if ads tracker is currently in ad mode\n * @returns {boolean} True if ads are playing\n */\n isAdsTrackerActive() {\n return this.adsTracker && this.adsTracker.isAd && this.adsTracker.isAd();\n }\n\n onPlay() {\n this.sendRequest();\n }\n\n onPause() {\n // Don't send CONTENT_PAUSE if ads are playing (ads tracker handles it)\n if (this.isAdsTrackerActive()) {\n return;\n }\n // Don't send CONTENT_PAUSE if video has ended (CONTENT_END will be sent instead)\n if (this.player.ended()) {\n return;\n }\n this.sendPause();\n }\n\n onPlaying() {\n // Don't send CONTENT_RESUME if ads are playing (ads tracker handles it)\n if (this.isAdsTrackerActive()) {\n return;\n }\n this.sendResume();\n this.sendBufferEnd();\n }\n\n onAbort() {\n this.sendEnd();\n }\n\n onEnded() {\n if (this.adsTracker) {\n this.isContentEnd = true;\n if (this.imaAdCuePoints && !this.imaAdCuePoints.includes(-1)) {\n this.sendEnd();\n }\n } else {\n this.sendEnd();\n }\n }\n\n onDispose() {\n this.sendEnd();\n }\n\n onSeeking() {\n // Don't send CONTENT_SEEK_START if ads are playing (ads tracker handles it)\n if (this.isAdsTrackerActive()) {\n return;\n }\n this.sendSeekStart();\n }\n\n onSeeked() {\n // Don't send CONTENT_SEEK_END if ads are playing (ads tracker handles it)\n if (this.isAdsTrackerActive()) {\n return;\n }\n this.sendSeekEnd();\n }\n\n onError() {\n const error = this.player.error();\n\n const errorCode = error.code;\n const errorMessage = error.message;\n if (this.player.error && this.player.error()) {\n this.sendError({ errorCode, errorMessage });\n }\n }\n\n onWaiting(e) {\n // Don't send CONTENT_BUFFER_START if ads are playing (ads tracker handles it)\n if (this.isAdsTrackerActive()) {\n return;\n }\n this.sendBufferStart();\n }\n\n onTimeupdate(e) {\n if (this.getPlayhead() > 0.1) {\n this.sendStart();\n }\n }\n}\n\n// Static members\nexport {\n HlsJsTech,\n ContribHlsTech,\n ShakaTech,\n VideojsAdsTracker,\n ImaAdsTracker,\n BrightcoveImaAdsTracker,\n FreewheelAdsTracker,\n MediaTailorAdsTracker,\n};\n","/**\n * MediaTailor Constants\n * Contains all regex patterns, config defaults, and constant values for AWS MediaTailor ad tracking\n */\n\n// HLS manifest regex patterns used while scanning raw MediaTailor playlists.\n// Example inputs:\n// - #EXT-X-CUE-OUT:DURATION=29.988\n// - #EXT-X-DISCONTINUITY\n// - #EXT-X-MAP:URI=\"https://segments.mediatailor.../init.mp4\"\nexport const REGEX_CUE_OUT = /#EXT-X-CUE-OUT:DURATION=([\\d.]+)/; // Captures the numeric ad break duration from a MediaTailor CUE-OUT tag so the tracker can seed an ad break before CUE-IN arrives\nexport const REGEX_DISCONTINUITY = /#EXT-X-DISCONTINUITY/; // Detects HLS discontinuity boundaries, which MediaTailor playlists can use around ad/content transitions and pod boundaries\nexport const REGEX_MAP = /#EXT-X-MAP:URI=\"([^\"]+)\"/; // Captures the MAP URI from fMP4 playlists so MAP changes can be used to split one avail into multiple ad pods\n\n// MediaTailor URL and manifest regex patterns.\n// These are used to derive the tracking endpoint and to read manifest refresh metadata\n// directly from HLS and DASH payloads.\nexport const REGEX_SESSION_ID = /sessionId=([^&]+)/; // Captures the session id from a sessionized playback URL query string such as ?aws.sessionId=abc123 so we can construct the MediaTailor tracking endpoint\nexport const REGEX_TRACKING_PATH_SEGMENT = /\\/v1\\/(master|session|dash)\\//; // Matches the playback path prefix in URLs like /v1/master/... or /v1/dash/... so it can be rewritten to /v1/tracking/...\nexport const REGEX_MANIFEST_FILE_SUFFIX = /\\/[^/]*\\.(m3u8|mpd).*$/; // Matches the trailing manifest filename and any query string, such as /master.m3u8?... or /index.mpd?..., so it can be replaced with /{sessionId}\nexport const REGEX_HLS_TARGET_DURATION = /#EXT-X-TARGETDURATION:(\\d+)/; // Captures the HLS target duration value from a line like #EXT-X-TARGETDURATION:6, which we use as the live polling cadence when available\nexport const REGEX_DASH_MINIMUM_UPDATE_PERIOD = /minimumUpdatePeriod=\"([^\"]+)\"/; // Captures the DASH MPD minimumUpdatePeriod attribute, for example minimumUpdatePeriod=\"PT5S\", so live polling follows the manifest's declared refresh rate\nexport const REGEX_ISO_8601_DURATION = /PT(?:(\\d+)H)?(?:(\\d+)M)?(?:([\\d.]+)S)?/; // Parses ISO 8601 duration values like PT5S, PT1M14S, or PT1H2M3.5S into hour, minute, and second groups for DASH timing calculations\n\n// MediaTailor string markers used across tracker selection and manifest parsing\nexport const HLS_MANIFEST_EXTENSION = '.m3u8'; // Identifies HLS manifest URLs and child playlist references\nexport const DASH_MANIFEST_EXTENSION = '.mpd'; // Identifies DASH manifest URLs\nexport const MEDIATAILOR_HOST_MARKER = '.mediatailor.'; // Identifies MediaTailor playback URLs when selecting this ads tracker\nexport const MT_HLS_CUE_OUT_TAG = '#EXT-X-CUE-OUT'; // Marks the start of an HLS ad break in MediaTailor manifests\nexport const MT_HLS_CUE_IN_TAG = '#EXT-X-CUE-IN'; // Marks the end of an HLS ad break in MediaTailor manifests\nexport const HLS_SEGMENT_DURATION_TAG = '#EXTINF:'; // Carries HLS segment duration values used to advance manifest time\nexport const HLS_TAG_PREFIX = '#'; // Distinguishes HLS tags from playlist URI lines in manifest scans\nexport const SCTE35_SCHEME_MARKER = 'scte35'; // Identifies SCTE-35 DASH signaling in schemeIdUri values\nexport const DASH_SCTE35_EVENT_STREAM_SELECTOR =\n 'EventStream[schemeIdUri*=\"scte35\"], EventStream[schemeIdUri*=\"SCTE35\"]'; // Selects DASH EventStream nodes that carry SCTE-35 ad markers\nexport const HLS_MIME_TYPE = 'application/vnd.apple.mpegurl'; // MIME type used to detect Safari/native HLS playback support\n\n// MediaTailor URL Patterns\nexport const MT_SEGMENT_PATTERN = 'segments.mediatailor'; // Identifies MediaTailor ad segments\n\nexport const TRACKING_API_TIMEOUT_MS = 5000; // Keep tracking metadata requests within the guide's 5s end-to-end budget\nexport const DEFAULT_LIVE_POLL_INTERVAL_MS = 5000; // Temporary fallback until manifest metadata provides cadence\n// Timing Thresholds\nexport const MIN_AD_DURATION = 0.5; // Minimum ad duration in seconds (filter false positives)\nexport const AD_TIMING_TOLERANCE = 0.5; // Tolerance for matching ad times in seconds\nexport const POST_AD_PAUSE_THRESHOLD = 500; // Ignore pause events within 500ms after ad break (avoids false CONTENT_PAUSE)\n\n// Stream Types\nexport const STREAM_TYPE = {\n VOD: 'vod', // Video on Demand\n LIVE: 'live', // Live streaming\n};\n\n// Manifest Types\nexport const MANIFEST_TYPE = {\n HLS: 'hls', // HTTP Live Streaming (.m3u8)\n DASH: 'dash', // Dynamic Adaptive Streaming over HTTP (.mpd)\n};\n\n// Ad Position Types (for VOD only)\nexport const AD_POSITION = {\n PRE_ROLL: 'pre', // First ad break\n MID_ROLL: 'mid', // Middle ad break\n POST_ROLL: 'post', // Last ad break\n};\n\n// Ad Detection Sources\nexport const AD_SOURCE = {\n MANIFEST_CUE: 'manifest-cue', // Detected from CUE-OUT/CUE-IN tags (HLS) or EventStream (DASH)\n VHS_DISCONTINUITY: 'vhs-discontinuity', // Detected from VHS discontinuityStarts\n TRACKING_API: 'tracking-api', // Added from tracking API response\n MANIFEST_AND_TRACKING: 'manifest+tracking', // Enriched by both sources\n DASH_EMSG: 'dash-emsg', // Detected from DASH emsg events (Shaka Player)\n DASH_EVENT_STREAM: 'dash-event-stream', // Detected from DASH EventStream (dash.js)\n};\n\n// Quartile Percentages\nexport const QUARTILES = {\n Q1: 0.25, // 25% progress\n Q2: 0.5, // 50% progress\n Q3: 0.75, // 75% progress\n};\n","export default class ShakaTech {\n constructor(tech) {\n this.tech = tech.shakaPlayer;\n this.player = tech.el().player; // Store player reference for playback bitrate calculation\n }\n\n getSrc(tech) {\n try {\n return this.tech.getManifestUri();\n } catch (err) {}\n return null;\n }\n\n getRenditionBitrate(tech) {\n try {\n const bitrate = this.tech.getStats().streamBandwidth;\n return bitrate ? Math.round(bitrate) : null;\n } catch (err) {}\n return null;\n }\n\n getManifestBitrate() {\n try {\n // Return highest available bitrate from all variants\n const tracks = this.tech.getVariantTracks();\n if (tracks && tracks.length > 0) {\n return Math.round(Math.max(\n ...tracks.map((t) => t.videoBandwidth + (t.audioBandwidth || 0)),\n ));\n }\n } catch (err) {}\n return null;\n }\n\n getRenditionWidth(tech) {\n try {\n var tracks = this.tech.getVariantTracks();\n for (var i in tracks) {\n var track = tracks[i];\n if (track.active && track.type === 'video') {\n return track.width;\n }\n }\n } catch (err) {}\n return null;\n }\n\n getRenditionHeight(tech) {\n try {\n var tracks = this.tech.getVariantTracks();\n for (var i in tracks) {\n var track = tracks[i];\n if (track.active && track.type === 'video') {\n return track.height;\n }\n }\n } catch (err) {}\n return null;\n }\n\n getBitrate() {\n // Calculate playback bitrate (actual content consumption rate)\n return this.getContentBitratePlayback();\n }\n\n getContentBitratePlayback() {\n try {\n // Get the current variant's bitrate from manifest (streamBandwidth)\n var stats = this.tech.getStats();\n if (stats && stats.streamBandwidth && stats.streamBandwidth > 0) {\n return Math.round(stats.streamBandwidth);\n }\n } catch (err) {}\n return null;\n }\n\n getSegmentDownloadBitrate() {\n try {\n // Use estimatedBandwidth for measured bitrate\n var stats = this.tech.getStats();\n if (stats && stats.estimatedBandwidth > 0) {\n return Math.round(stats.estimatedBandwidth);\n }\n } catch (err) {}\n return null;\n }\n\n getNetworkDownloadBitrate() {\n try {\n // Shaka: use estimatedBandwidth for download bitrate (no separate property)\n var stats = this.tech.getStats();\n if (stats && stats.estimatedBandwidth > 0) {\n return Math.round(stats.estimatedBandwidth);\n }\n } catch (err) {}\n return null;\n }\n}\n\nShakaTech.isUsing = function (tech) {\n return !!tech.shakaPlayer;\n};\n","export default class ContribHlsTech {\n constructor(tech) {\n this.tech = tech.vhs;\n this.player = tech.el().player; // Store player reference for playback bitrate calculation\n }\n\n getRenditionName() {\n try {\n var media = this.tech.playlists.media();\n if (media && media.attributes) return media.attributes.NAME;\n } catch (err) {}\n return null;\n }\n\n getRenditionBitrate() {\n try {\n var media = this.tech.playlists.media();\n if (media && media.attributes) return Math.round(media.attributes.BANDWIDTH);\n } catch (err) {}\n return null;\n }\n\n getRenditionWidth() {\n try {\n var media = this.tech.playlists.media();\n if (media && media.attributes && media.attributes.RESOLUTION) {\n return media.attributes.RESOLUTION.width;\n }\n } catch (err) {}\n return null;\n }\n\n getRenditionHeight() {\n try {\n var media = this.tech.playlists.media();\n if (media && media.attributes && media.attributes.RESOLUTION) {\n return media.attributes.RESOLUTION.height;\n }\n } catch (err) {}\n return null;\n }\n\n getBitrate() {\n // Calculate playback bitrate (actual content consumption rate)\n return this.getContentBitratePlayback();\n }\n\n getManifestBitrate() {\n try {\n // Return highest available bitrate from all renditions\n const playlists = this.tech.playlists.master.playlists;\n if (playlists && playlists.length > 0) {\n return Math.round(Math.max(...playlists.map((p) => p.attributes.BANDWIDTH)));\n }\n } catch (err) {}\n return null;\n }\n\n getSegmentDownloadBitrate() {\n if (\n this.tech.stats?.bandwidth !== undefined &&\n this.tech.stats.bandwidth > 0\n ) {\n return Math.round(this.tech.stats.bandwidth);\n }\n return null;\n }\n\n getNetworkDownloadBitrate() {\n if (this.tech.throughput !== undefined && this.tech.throughput > 0) {\n return Math.round(this.tech.throughput);\n }\n return null;\n }\n\n getContentBitratePlayback() {\n try {\n // Get the current active rendition's bitrate from manifest\n const media = this.tech.playlists.media();\n if (media && media.attributes) {\n // Use AVERAGE-BANDWIDTH if available, fallback to BANDWIDTH\n const bitrate = media.attributes['AVERAGE-BANDWIDTH'] ||\n media.attributes.BANDWIDTH ||\n null;\n return bitrate !== null ? Math.round(bitrate) : null;\n }\n } catch (err) {}\n return null;\n }\n}\n\nContribHlsTech.isUsing = function (tech) {\n return !!tech.vhs;\n};\n","import nrvideo from '@newrelic/video-core'\nimport pkg from '../../package.json'\nimport ContribHlsTech from '../techs/contrib-hls';\nimport HlsJsTech from '../techs/hls-js';\nimport ShakaTech from '../techs/shaka';\n\nexport default class VideojsAdsTracker extends nrvideo.VideoTracker {\n\n getTech() {\n const tech = this.player.tech({ IWillNotUseThisInPlugins: true });\n \n if (tech) {\n if (ContribHlsTech.isUsing(tech)) {\n return new ContribHlsTech(tech);\n } else if (HlsJsTech.isUsing(tech)) {\n return new HlsJsTech(tech);\n } else if (ShakaTech.isUsing(tech)) {\n return new ShakaTech(tech);\n }\n }\n }\n \n getTrackerName () {\n return 'videojs-ads'\n }\n\n getTrackerVersion () {\n return pkg.version\n }\n\n isMuted () {\n return this.player.muted()\n }\n\n getRenditionHeight () {\n return null\n }\n\n getRenditionWidth () {\n return null\n }\n\n getPlayerName () {\n return 'videojs-ads'\n }\n\n getPlayerVersion () {\n return this.player.ads.VERSION\n }\n\n registerListeners () {\n nrvideo.Log.debugCommonVideoEvents(this.player, [\n null,\n 'ads-request',\n 'ads-load',\n 'adstart',\n 'adend',\n 'adskip',\n 'adserror',\n 'ads-click',\n 'ads-pod-started',\n 'ads-pod-ended',\n 'ads-first-quartile',\n 'ads-midpoint',\n 'ads-third-quartile',\n 'ads-pause',\n 'ads-play',\n 'adtimeout'\n ])\n\n // Register listeners\n this.player.on('ads-request', this.onAdrequest.bind(this))\n this.player.on('ads-load', this.onAdload.bind(this))\n this.player.on('adstart', this.onAdstart.bind(this))\n this.player.on('adend', this.onAdend.bind(this))\n this.player.on('adskip', this.onAdskip.bind(this))\n this.player.on('adserror', this.onAdserror.bind(this))\n this.player.on('ads-click', this.onAdsClick.bind(this))\n this.player.on('ads-pod-started', this.onPodStart.bind(this))\n this.player.on('ads-pod-ended', this.onPodEnd.bind(this))\n this.player.on('ads-first-quartile', this.onFirstQuartile.bind(this))\n this.player.on('ads-midpoint', this.onMidpoint.bind(this))\n this.player.on('ads-third-quartile', this.onThirdQuartile.bind(this))\n this.player.on('ads-pause', this.onAdspause.bind(this))\n this.player.on('ads-play', this.onAdsplay.bind(this))\n }\n\n unregisterListeners () {\n // unregister listeners\n this.player.off('ads-request', this.onAdrequest)\n this.player.off('ads-load', this.onAdload)\n this.player.off('adstart', this.onAdstart)\n this.player.off('adend', this.onAdend)\n this.player.off('adskip', this.onAdskip)\n this.player.off('adserror', this.onAdserror)\n this.player.off('ads-click', this.onAdsClick)\n this.player.off('ads-pod-started', this.onPodStart)\n this.player.off('ads-pod-ended', this.onPodEnd)\n this.player.off('ads-first-quartile', this.onFirstQuartile)\n this.player.off('ads-midpoint', this.onMidpoint)\n this.player.off('ads-third-quartile', this.onThirdQuartile)\n this.player.off('ads-pause', this.onAdspause)\n this.player.off('ads-play', this.onAdsplay)\n }\n\n onAdrequest (e) {\n this.sendRequest()\n this.sendDownload({ state: 'ads-request' })\n }\n\n onAdload (e) {\n this.sendDownload({ state: 'ads-load' })\n }\n\n onAdstart (e) {\n this.sendRequest()\n this.sendStart()\n }\n\n onAdend (e) {\n this.sendEnd()\n }\n\n onAdskip (e) {\n this.sendEnd({ skipped: true })\n }\n\n onAdserror (e) {\n this.sendError()\n }\n\n onAdsClick (e) {\n this.sendAdClick({ url: 'unknown' })\n }\n\n onPodStart (e) {\n this.sendAdBreakStart()\n }\n\n onPodEnd (e) {\n this.sendAdBreakEnd()\n }\n\n onFirstQuartile () {\n this.sendAdQuartile({ quartile: 1 })\n }\n\n onMidpoint () {\n this.sendAdQuartile({ quartile: 2 })\n }\n\n onThirdQuartile () {\n this.sendAdQuartile({ quartile: 3 })\n }\n\n onAdspause () {\n this.sendPause()\n }\n\n onAdsplay () {\n this.sendResume()\n }\n}\n","/*! For license information please see index.js.LICENSE.txt */\nvar t={487(t,e,i){i.r(e),i.d(e,{videoAnalyticsHarvester:()=>h});var s=i(374),r=i(431),a=i(51),n=i(144),o=i(302);const h=new class{constructor(){this.isInitialized=!1,this.harvestScheduler=null,this.eventBuffer=null}initialize(){if(this.isInitialized)n.A.warn(\"Video analytics agent already initialized\");else try{this.eventBuffer=new r.t,this.harvestScheduler=new s.n(this.eventBuffer),this.harvestScheduler.startScheduler(),this.isInitialized=!0,n.A.notice(\"Video analytics agent initialized successfully\")}catch(t){n.A.error(\"Failed to initialize video analytics agent:\",t.message)}}addEvent(t){this.isInitialized||(n.A.warn(\"Video analytics agent not initialized, initializing now\"),this.initialize());try{return t.actionName&&t.actionName===o.A.Events.QOE_AGGREGATE?t.viewId?this.eventBuffer.addOrReplaceByActionNameAndViewId(o.A.Events.QOE_AGGREGATE,t.viewId,t):this.eventBuffer.addOrReplaceByActionName(o.A.Events.QOE_AGGREGATE,t):this.eventBuffer.add(t)}catch(t){return n.A.error(\"Failed to add event to harvesting system:\",t.message),!1}}setHarvestInterval(t){this.isInitialized||this.initialize(),this.harvestScheduler.updateHarvestInterval(t)}forceNextQoeCycle(){this.harvestScheduler&&(this.harvestScheduler.forceNextQoeCycle=!0)}setBeforeDrainCallback(t){this.harvestScheduler&&(this.harvestScheduler.beforeDrainCallback=t)}refreshQoeKpis(t,e){if(!this.eventBuffer||!t)return;const i=e?this.eventBuffer.findByActionNameAndViewId(o.A.Events.QOE_AGGREGATE,e):this.eventBuffer.findByActionName(o.A.Events.QOE_AGGREGATE);if(i){const s={...i};for(const e of a.A.QOE_KPI_KEYS)e in t&&(s[e]=t[e]);e?this.eventBuffer.addOrReplaceByActionNameAndViewId(o.A.Events.QOE_AGGREGATE,e,s):this.eventBuffer.addOrReplaceByActionName(o.A.Events.QOE_AGGREGATE,s)}}}},455(t,e,i){i.d(e,{A:()=>r});class s{constructor(){this.reset()}reset(){this.startTime=0,this.stopTime=0,this.accumulator=0,this.offset=0}getDeltaTime(){return this.startTime?this.offset+((new Date).getTime()-this.startTime):null}start(){this.startTime=(new Date).getTime(),this.stopTime=0}stop(){return this.stopTime=(new Date).getTime(),this.startTime<this.stopTime&&(this.accumulator+=this.stopTime-this.startTime),this.getDeltaTime()}getDuration(){return this.stopTime?this.accumulator+this.offset:this.accumulator+(this.getDeltaTime()??0)}clone(){var t=new s;return t.startTime=this.startTime,t.stopTime=this.stopTime,t.offset=this.offset,t.accumulator=this.accumulator,t}}const r=s},51(t,e,i){i.d(e,{A:()=>r});class s{}s.AdPositions={PRE:\"pre\",MID:\"mid\",POST:\"post\"},s.COLLECTOR={US:[\"bam.nr-data.net\",\"bam-cell.nr-data.net\"],EU:\"bam.eu01.nr-data.net\",Staging:\"staging-bam-cell.nr-data.net\",GOV:\"gov-bam.nr-data.net\"},s.VALID_EVENT_TYPES=[\"VideoAction\",\"VideoAdAction\",\"VideoErrorAction\",\"VideoCustomAction\"],s.MAX_PAYLOAD_SIZE=1048576,s.MAX_BEACON_SIZE=61440,s.MAX_EVENTS_PER_BATCH=1e3,s.INTERVAL=1e4,s.QOE_KPI_KEYS=[\"startupTime\",\"peakBitrate\",\"averageBitrate\",\"totalPlaytime\",\"totalRebufferingTime\",\"rebufferingRatio\",\"hadStartupError\",\"hadPlaybackError\",\"numberOfErrors\"],s.QOE_AGGREGATE_KEYS=[\"coreVersion\",\"instrumentation.name\",\"instrumentation.provider\",\"instrumentation.version\",\"isBackgroundEvent\",\"playerName\",\"playerVersion\",\"src\",\"viewId\",\"viewSession\",\"contentIsAutoplayed\",\"contentIsMuted\",\"contentRenditionHeight\",\"contentRenditionWidth\",\"contentSrc\",\"numberOfVideos\",\"pageUrl\",\"trackerName\",\"trackerVersion\",\"contentDuration\",\"contentPlayrate\",\"contentPlayhead\",\"contentPreload\",\"elapsedTime\",\"contentTitle\",\"contentId\",\"contentIsLive\",\"deviceType\",\"deviceGroup\",\"deviceManufacturer\",\"deviceModel\",\"deviceName\",\"deviceSize\",\"deviceUuid\",\"contentRenditionName\",\"contentIsFullscreen\",\"contentCdn\",\"contentFps\",\"asnOrganization\",\"asnLongitude\",\"asnLatitude\",\"asn\",\"timeSinceRequested\",\"timeSinceStarted\"];const r=s},568(t,e,i){i.d(e,{A:()=>s});const s=class{on(t,e){if(this._listeners=this._listeners||{},\"function\"==typeof e)return this._listeners[t]=this._listeners[t]||[],this._listeners[t].push(e),this}off(t,e){if(this._listeners=this._listeners||{},this._listeners[t]){var i=this._listeners[t].indexOf(e);-1!==i&&this._listeners[t].splice(i,1)}return this}emit(t,e,i){return this._listeners=this._listeners||{},i=i||{},Array.isArray(this._listeners[e])&&this._listeners[e].forEach(s=>{s.call(this,{eventType:t,type:e,data:i,target:this})}),Array.isArray(this._listeners[\"*\"])&&this._listeners[\"*\"].forEach(s=>{s.call(this,{eventType:t,type:e,data:i,target:this})}),this}}},431(t,e,i){i.d(e,{t:()=>h});var s=i(144),r=i(51),a=i(347);const{MAX_PAYLOAD_SIZE:n,MAX_EVENTS_PER_BATCH:o}=r.A;class h{constructor(){this.buffer=[],this.maxPayloadSize=n,this.maxEventsPerBatch=o,this.currentPayloadSize=0,this.totalEvents=0,this.smartHarvestPayloadThreshold=Math.floor(.6*this.maxPayloadSize),this.overflowPayloadThreshold=Math.floor(.9*this.maxPayloadSize),this.smartHarvestEventThreshold=Math.floor(.6*this.maxEventsPerBatch),this.overflowEventThreshold=Math.floor(.9*this.maxEventsPerBatch),this.onSmartHarvestTrigger=null}addOrReplaceByActionName(t,e){const i=this.buffer.findIndex(e=>e.actionName===t);try{return-1===i?this.add(e):this.add(e,i),!0}catch(t){return s.A.error(\"Failed to set or replace the event to buffer:\",t.message),!1}}addOrReplaceByActionNameAndViewId(t,e,i){const r=this.buffer.findIndex(i=>i.actionName===t&&i.viewId===e);try{return-1===r?this.add(i):this.add(i,r),!0}catch(t){return s.A.error(\"Failed to set or replace the event to buffer:\",t.message),!1}}findByActionNameAndViewId(t,e){return this.buffer.find(i=>i.actionName===t&&i.viewId===e)||null}findByActionName(t){return this.buffer.find(e=>e.actionName===t)||null}add(t,e){try{const i=(0,a.Q3)(t),s=this.currentPayloadSize+i>=this.maxPayloadSize,r=this.totalEvents+1>=this.maxEventsPerBatch;if((s||r)&&this.makeRoom(i),null!=e&&e>-1){const s=(0,a.Q3)(this.buffer[e]);this.buffer[e]=t,this.currentPayloadSize+=i-s}else this.buffer.push(t),this.totalEvents++,this.currentPayloadSize+=i;return this.checkSmartHarvestTrigger(),!0}catch(t){return s.A.error(\"Failed to add event to buffer:\",t.message),!1}}checkSmartHarvestTrigger(){const t=this.currentPayloadSize/this.maxPayloadSize,e=this.totalEvents/this.maxEventsPerBatch,i=this.currentPayloadSize>=this.overflowPayloadThreshold,r=this.totalEvents>=this.overflowEventThreshold;if(i||r){const r=i?`payload ${this.currentPayloadSize}/${this.maxPayloadSize} bytes (${Math.round(100*t)}%)`:`events ${this.totalEvents}/${this.maxEventsPerBatch} (${Math.round(100*e)}%)`;s.A.warn(`OVERFLOW PREVENTION: ${r} - Emergency harvest triggered`),this.onSmartHarvestTrigger&&\"function\"==typeof this.onSmartHarvestTrigger&&this.onSmartHarvestTrigger(\"overflow\",90)}else{const t=this.currentPayloadSize>=this.smartHarvestPayloadThreshold,e=this.totalEvents>=this.smartHarvestEventThreshold;(t||e)&&this.onSmartHarvestTrigger&&\"function\"==typeof this.onSmartHarvestTrigger&&this.onSmartHarvestTrigger(\"smart\",60)}}setSmartHarvestCallback(t){this.onSmartHarvestTrigger=t}drain(){try{const t=this.buffer.splice(0);return this.totalEvents=0,this.currentPayloadSize=0,t}catch(t){return s.A.error(\"Failed to drain events from buffer:\",t.message),[]}}isEmpty(){return 0===this.totalEvents}size(){return this.totalEvents}clear(){this.buffer=[],this.totalEvents=0}makeRoom(t){if(t>this.maxPayloadSize)s.A.error(\"Event dropped: Event size exceeds maximum payload size.\");else for(;(this.totalEvents>=this.maxEventsPerBatch||this.currentPayloadSize+t>=this.maxPayloadSize)&&this.buffer.length>0;){const t=this.buffer.shift(),e=(0,a.Q3)(t);this.totalEvents--,this.currentPayloadSize-=e,s.A.warn(\"Event buffer full, oldest event removed.\")}}}},374(t,e,i){i.d(e,{n:()=>l});var s=i(431),r=i(413),a=i(481),n=i(347),o=i(51),h=i(302),d=i(144);class l{constructor(t){this.eventBuffer=t,this.retryQueueHandler=new r.u,this.httpClient=new a.X,this.fallBackUrl=\"\",this.retryCount=0,this.eventBuffer instanceof s.t&&this.eventBuffer.setSmartHarvestCallback((t,e)=>this.triggerSmartHarvest(t,e)),this.isStarted=!1,this.currentTimerId=null,this.harvestCycle=o.A.INTERVAL,this.isHarvesting=!1,this.qoeCycleCount=1,this.forceNextQoeCycle=!1,this.beforeDrainCallback=null,this._lastSentQoeKpis={},this.setupPageLifecycleHandlers()}startScheduler(){this.isStarted?d.A.warn(\"Harvest scheduler is already started\"):(this.isStarted=!0,d.A.notice(\"Starting harvest scheduler\",{harvestCycle:this.harvestCycle,eventBufferSize:this.eventBuffer?this.eventBuffer.size():0}),this.scheduleNextHarvest())}stopScheduler(){this.isStarted&&(this.isStarted=!1,this.currentTimerId&&(clearTimeout(this.currentTimerId),this.currentTimerId=null),d.A.notice(\"Harvest scheduler stopped\"))}async triggerSmartHarvest(t,e){if(d.A.notice(`${t} harvest triggered at ${e}% threshold`,{type:t,threshold:e}),this.eventBuffer&&!this.eventBuffer.isEmpty()){this.currentTimerId&&(clearTimeout(this.currentTimerId),this.currentTimerId=null);try{await this.triggerHarvest({})}catch(e){d.A.error(`${t} harvest failed:`,e.message)}finally{this.isStarted&&this.scheduleNextHarvest()}}}scheduleNextHarvest(){if(!this.isStarted)return;const t=this.harvestCycle;this.currentTimerId=setTimeout(()=>this.onHarvestInterval(),t)}async onHarvestInterval(){try{const t=this.eventBuffer&&!this.eventBuffer.isEmpty(),e=this.retryQueueHandler&&this.retryQueueHandler.getQueueSize()>0;if(!t&&!e)return;await this.triggerHarvest({})}catch(t){d.A.error(\"Error during scheduled harvest:\",t.message)}finally{this.scheduleNextHarvest()}}async triggerHarvest(t={}){if(this.isHarvesting)return{success:!1,reason:\"harvest_in_progress\"};this.isHarvesting=!0;try{let e=this.drainEvents(t);if(t.isFinalHarvest){const t=o.A.MAX_BEACON_SIZE;(0,n.Q3)(e)>t&&(e=this.trimEventsToFit(e,t))}const i=await this.sendChunk(e,t,!0);return{success:i.success,totalChunks:1,results:[i]}}catch(t){return d.A.error(\"Harvest cycle failed:\",t.message),this.handleHarvestFailure(t),{success:!1,error:t.message,consecutiveFailures:this.consecutiveFailures}}finally{this.isHarvesting=!1}}trimEventsToFit(t,e){if(0===t.length)return t;const i=[];let s=0;for(let r=t.length-1;r>=0;r--){const a=t[r],o=(0,n.Q3)({ins:[a,...i]});o>e||(i.unshift(a),s=o)}const r=t.length-i.length;if(r>0){const a=t.slice(0,r);d.A.warn(`Discarded ${r} events to fit beacon size limit`,{originalCount:t.length,trimmedCount:i.length,finalSize:s,maxSize:e}),this.retryQueueHandler&&this.retryQueueHandler.addFailedEvents(a)}return i}drainEvents(t={}){const e=window.NRVIDEO?.config?.qoeIntervalFactor??1,i=!!t.isFinalHarvest||this.forceNextQoeCycle,s=(this.qoeCycleCount-1)%e==0||i;if(this.forceNextQoeCycle&&(this.forceNextQoeCycle=!1),this.beforeDrainCallback&&\"function\"==typeof this.beforeDrainCallback)try{this.beforeDrainCallback()}catch(t){d.A.error(\"Before drain callback failed:\",t.message)}const r=this.eventBuffer.drain();let a;if(s)a=r;else{a=[];for(const t of r)t.actionName===h.A.Events.QOE_AGGREGATE?this.eventBuffer.add(t):a.push(t)}this.qoeCycleCount++;for(let t=a.length-1;t>=0;t--){const e=a[t];e.actionName===h.A.Events.QOE_AGGREGATE&&(!i&&this._qoeKpisUnchanged(e)?a.splice(t,1):this._saveQoeKpis(e))}let l=[...a],c=(0,n.Q3)(a);if(this.retryQueueHandler&&this.retryQueueHandler.getQueueSize()>0){const t=o.A.MAX_PAYLOAD_SIZE-c,e=o.A.MAX_EVENTS_PER_BATCH-l.length;if(t>0&&e>0){const i=this.retryQueueHandler.getRetryEventsToFit(t,e);i.length>0&&(l=[...i,...l])}}return l}async sendChunk(t,e,i){const s={url:(0,n.c$)(this.fallBackUrl),payload:{body:{ins:t}},options:{...e,isLastChunk:i}};return new Promise(e=>{this.httpClient.send(s,i=>{i.retry?this.handleRequestFailure(t):(this.retryCount=0,this.fallBackUrl=\"\"),e({success:!i.retry,status:i.status,error:i.error,chunk:t,eventCount:t.length})})})}handleRequestFailure(t){this.retryQueueHandler.addFailedEvents(t),\"US\"===window.NRVIDEO?.info?.region&&(this.retryCount++,this.retryCount>5?(this.retryCount=0,this.fallBackUrl=\"\"):this.retryCount>=2&&(this.fallBackUrl=o.A.COLLECTOR.US[1]))}handleHarvestFailure(t){this.consecutiveFailures++,d.A.warn(\"Harvest failure handled\",{error:t.message,consecutiveFailures:this.consecutiveFailures})}updateHarvestInterval(t){\"number\"!=typeof t&&isNaN(t)?d.A.warn(\"Invalid newInterval provided to updateHarvestInterval\"):t<1e3||t>3e5?d.A.warn(\"newInterval out of bounds (1000-300000), ignoring\"):this.harvestCycle!==t&&(this.harvestCycle=t,d.A.notice(\"Updated harvestCycle:\",this.harvestCycle),this.currentTimerId&&(clearTimeout(this.currentTimerId),this.currentTimerId=null),this.isStarted&&this.scheduleNextHarvest())}setupPageLifecycleHandlers(){let t=!1;const e=()=>{t||(t=!0,this.triggerHarvest({isFinalHarvest:!0,force:!0}))};document.addEventListener(\"visibilitychange\",()=>{document.hidden&&e()}),window.addEventListener(\"pagehide\",()=>{e()}),window.addEventListener(\"beforeunload\",()=>{e()})}_qoeKpisUnchanged(t){const e=this._lastSentQoeKpis[t.viewId];if(!e)return!1;for(const i of o.A.QOE_KPI_KEYS)if(t[i]!==e[i])return!1;return!0}_saveQoeKpis(t){const e={};for(const i of o.A.QOE_KPI_KEYS)e[i]=t[i];this._lastSentQoeKpis[t.viewId]=e}}},144(t,e,i){i.d(e,{A:()=>o});class s{static error(...t){r(t,s.Levels.ERROR,\"darkred\")}static warn(...t){r(t,s.Levels.WARNING,\"darkorange\")}static notice(...t){r([].slice.call(arguments),s.Levels.NOTICE,\"darkcyan\")}static debug(...t){r(t,s.Levels.DEBUG,\"indigo\")}static debugCommonVideoEvents(t,e,i){try{if(s.level<=s.Levels.DEBUG){i=i||function(t){s.debug(\"Event: \"+t.type)};var r=[\"canplay\",\"buffering\",\"waiting\",\"ended\",\"play\",\"playing\",\"pause\",\"resume\",\"error\",\"abort\",\"seek\",\"seeking\",\"seeked\",\"stalled\",\"dispose\",\"loadeddata\",\"loadstart\",\"loadedmetadata\"];e&&(null===e[0]?(e.shift(),r=e):r=r.concat(e));for(var a=0;a<r.length;a++)\"function\"==typeof t?t.call(window,r[a],i):t.on?t.on(r[a],i):t.addEventListener?t.addEventListener(r[a],i):t.addEventHandler?t.addEventHandler(r[a],i):s.warn(\"debugCommonVideoEvents: No common listener function found for \",t)}}catch(t){s.warn(t)}}}function r(t,e,i){e=e||s.Levels.NOTICE,i=i||\"darkcyan\";var r,o,h=s.prefix;s.includeTime&&(h+=\"[\"+(\"0\"+(r=new Date).getDate()).slice(-2)+\":\"+(\"0\"+r.getMinutes()).slice(-2)+\":\"+(\"0\"+r.getSeconds()).slice(-2)+\".\"+(\"00\"+r.getMilliseconds()).slice(-3)+\"] \"),h+=function(t){return n[t]}(e)+\":\",s.level<=e&&e!==s.Levels.SILENT&&(!s.colorful||\"undefined\"!=typeof document&&document.documentMode?a(t,h):(o=e===s.Levels.ERROR&&console.error?console.error:e===s.Levels.WARNING&&console.warn?console.warn:e===s.Levels.DEBUG&&console.debug&&null==window.cast?console.debug:console.log,h=\"%c\"+h,t.splice(0,0,h,\"color: \"+i),o.apply(console,t)))}function a(t,e){if(t instanceof Array)for(var i in t)a(t[i],e);else\"string\"==typeof t?console.log(e+\" \"+t):(console.log(e+\"↵\"),console.log(t))}s.Levels={SILENT:5,ERROR:4,WARNING:3,NOTICE:2,DEBUG:1,ALL:0},s.level=s.Levels.ERROR,s.colorful=!0,s.includeTime=!0,s.prefix=\"[nrvideo]\";const n={4:\"e\",3:\"w\",2:\"n\",1:\"d\"};!function(){if(\"undefined\"!=typeof window&&window.location&&window.location.search){var t=/\\?.*&*nrvideo-debug=(.+)/i.exec(window.location.search);null!==t&&(\"true\"===t[1]?s.level=s.Levels.ALL:s.level=t[1]),null!==/\\?.*&*nrvideo-colors=false/i.exec(window.location.search)&&(s.colorful=!1)}}();const o=s},481(t,e,i){i.d(e,{X:()=>a});var s=i(347),r=i(144);class a{async send(t,e){const{url:i,payload:s,options:a={}}=t;try{if(!i||!s)throw new Error(\"URL and payload are required\");const t={url:i,payload:s,options:a,callback:e};await this.executeRequest(t)}catch(t){r.A.error(\"Failed to send request:\",t.message),e({retry:!1,status:0,error:t.message})}}async executeRequest(t){const{url:e,payload:i,options:s,callback:a}=t,n=Date.now();try{const a=(o=JSON.stringify(i.body),h=window.NRVIDEO?.config?.obfuscate,h&&0!==h.length?h.reduce((t,e)=>{let i;try{if(e.regex instanceof RegExp){const t=e.regex.flags.includes(\"g\")?e.regex.flags:e.regex.flags+\"g\";i=new RegExp(e.regex.source,t)}else i=new RegExp(e.regex,\"g\")}catch(i){return r.A.warn(\"applyObfuscationRules: invalid regex, skipping rule:\",e.regex,i.message),t}return t.replace(i,e.replacement)},o):o);if(s.isFinalHarvest&&navigator.sendBeacon){const i=await this.sendWithBeacon(e,a),s={success:i,status:i?204:0};return void this.handleRequestComplete(t,s,n)}const d=await this.fetchWithTimeout(e,{method:\"POST\",body:a,headers:{\"Content-Type\":\"application/json\"},keepalive:s.isFinalHarvest},1e4),l={success:d.ok,status:d.status,statusText:d.statusText};this.handleRequestComplete(t,l,n)}catch(e){const i={success:!1,status:0,error:e.message};this.handleRequestComplete(t,i,n)}var o,h}handleRequestComplete(t,e){const{callback:i}=t;i({retry:!e.success&&(0===e.status||(0,s.Sc)(e.status)),status:e.status,error:e.error})}async sendWithBeacon(t,e){try{return navigator.sendBeacon(t,e)}catch(t){return r.A.warn(\"sendBeacon failed, falling back to fetch:\",t.message),!1}}async fetchWithTimeout(t,e,i){const s=new AbortController,r=setTimeout(()=>s.abort(),i);try{const i=await fetch(t,{...e,signal:s.signal});return clearTimeout(r),i}catch(t){if(clearTimeout(r),\"AbortError\"===t.name)throw new Error(`Request timeout after ${i}ms`);throw t}}}},413(t,e,i){i.d(e,{u:()=>h});var s=i(144),r=i(347),a=i(51);const{MAX_PAYLOAD_SIZE:n,MAX_EVENTS_PER_BATCH:o}=a.A;class h{constructor(){this.retryQueue=[],this.maxQueueSize=o,this.maxQueueSizeBytes=n}addFailedEvents(t){try{const e=Array.isArray(t)?t:[t];s.A.notice(`Adding ${e.length} failed events to retry queue`,{queueSizeBefore:this.retryQueue.length});for(const t of e){this.retryQueue.length>=this.maxQueueSize&&this.evictOldestEvent();const e=(0,r.Q3)(t);for(;(0,r.Q3)(this.retryQueue)+e>this.maxQueueSizeBytes;)this.evictOldestEvent();this.retryQueue.push({...t})}}catch(t){s.A.error(\"Failed to add events to retry queue:\",t.message)}}discardEvent(t,e){s.A.warn(\"Discarded event\",{reason:e,eventType:t.eventType})}evictOldestEvent(){if(this.retryQueue.length>0){const t=this.retryQueue.shift();this.discardEvent(t,\"Queue full - evicted oldest\")}}getRetryEventsToFit(t,e){const i=[];let s=0,a=0;for(let n=this.retryQueue.length-1;n>=0;n--){const o=this.retryQueue[n];if(a>=e)break;const h=(0,r.Q3)(o);if(s+h>t)break;i.unshift(o),s+=h,a++,this.retryQueue.splice(n,1)}return i}getQueueSize(){return this.retryQueue.length}clear(){this.retryQueue=[]}}},302(t,e,i){i.d(e,{A:()=>l});var s=i(330),r=i(568),a=i(455),n=i(51),o=i(487),h=i(144);class d extends r.A{constructor(t){super(),this.customData={},this.heartbeat=null,this.parentTracker=null,this._trackerReadyChrono=new a.A,this._trackerReadyChrono.start(),this._actionTable=n.A.ACTION_TABLE,this._actionAdTable=n.A.ACTION_AD_TABLE,t=t||{},this.setOptions(t)}setOptions(t){t&&(t.parentTracker&&(this.parentTracker=t.parentTracker),t.customData&&(this.customData=t.customData),t.heartbeat&&(this.heartbeat=t.heartbeat))}dispose(){this.unregisterListeners()}registerListeners(){}unregisterListeners(){}getHeartbeat(){return this.state._isAd?2e3:this.heartbeat?this.heartbeat:this.parentTracker&&this.parentTracker.heartbeat?this.parentTracker.heartbeat:3e4}startHeartbeat(){this._heartbeatInterval=setInterval(this.sendHeartbeat.bind(this),Math.max(this.getHeartbeat(),2e3))}stopHeartbeat(){this._heartbeatInterval&&clearInterval(this._heartbeatInterval)}sendHeartbeat(t){this.sendVideoAction(d.Events.HEARTBEAT,t)}getAttributes(t,e){(t=t||{}).trackerName=this.getTrackerName(),t.trackerVersion=this.getTrackerVersion(),t.coreVersion=s.rE,t.timeSinceTrackerReady=this._trackerReadyChrono.getDeltaTime();for(let e in this.customData)t[e]=this.customData[e];return null!=document.hidden&&(t.isBackgroundEvent=document.hidden),t}getTrackerVersion(){return s.rE}getTrackerName(){return\"base-tracker\"}sendVideoAction(t,e){this.emit(\"VideoAction\",t,this.getAttributes(e))}sendVideoAdAction(t,e){this.emit(\"VideoAdAction\",t,this.getAttributes(e))}sendVideoErrorAction(t,e){let i=this.isAd()?\"adError\":\"videoError\";this.emit(\"VideoErrorAction\",t,this.getAttributes(e,i))}sendVideoCustomAction(t,e){this.emit(\"VideoCustomAction\",t,this.getAttributes(e,\"customAction\"))}setHarvestInterval(t){if(o.videoAnalyticsHarvester)try{o.videoAnalyticsHarvester.setHarvestInterval(t)}catch(t){return void h.A.error(\"Failed to set harvest interval:\",t.message)}else h.A.error(\"VideoAnalyticsHarvester is not available\")}}d.Events={HEARTBEAT:\"HEARTBEAT\",QOE_AGGREGATE:\"QOE_AGGREGATE\"};const l=d},347(t,e,i){i.d(e,{Q3:()=>n,Sc:()=>o,c$:()=>a,z8:()=>h});var s=i(330),r=i(144);function a(t){try{if(!window.NRVIDEO||!window.NRVIDEO.info)throw new Error(\"NRVIDEO info is not available.\");let{beacon:e,licenseKey:i,applicationID:r}=window.NRVIDEO.info;if(!e||!i)throw new Error(\"Options object provided by New Relic is not correctly initialized\");return r?`https://${t||e}/ins/1/${i}?a=${r}&v=${s.rE}&ref=${window.location.href}&ca=VA`:`https://${t||e}/ins/1/${i}?&v=${s.rE}&ref=${window.location.href}&ca=VA`}catch(t){return console.error(t.message),null}}function n(t){if(\"string\"==typeof t&&t.length)return t.length;if(\"object\"==typeof t){if(\"undefined\"!=typeof ArrayBuffer&&t instanceof ArrayBuffer&&t.byteLength)return t.byteLength;if(\"undefined\"!=typeof Blob&&t instanceof Blob&&t.size)return t.size;if(!(\"undefined\"!=typeof FormData&&t instanceof FormData))try{return function(t){try{return JSON.stringify(t,(()=>{const t=new WeakSet;return(e,i)=>{if(\"object\"==typeof i&&null!==i){if(t.has(i))return;t.add(i)}return i}})())??\"\"}catch(t){return r.A.error(\"Error stringifying value:\",t.message),\"\"}}(t).length}catch(t){return}}}function o(t){switch(t){case 408:case 429:case 500:return!0;case 401:case 403:case 404:return!1}return t>=502&&t<=504||t>=512&&t<=530}function h(t,e){return t&&Array.isArray(t)&&0!==t.length?e&&\"object\"==typeof e?t.reduce((t,i)=>(i in e&&(t[i]=e[i]),t),{}):{}:e}},330(t){t.exports={rE:\"4.1.5\"}}},e={};function i(s){var r=e[s];if(void 0!==r)return r.exports;var a=e[s]={exports:{}};return t[s](a,a.exports,i),a.exports}i.d=(t,e)=>{for(var s in e)i.o(e,s)&&!i.o(t,s)&&Object.defineProperty(t,s,{enumerable:!0,get:e[s]})},i.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),i.r=t=>{\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(t,\"__esModule\",{value:!0})};var s=i(144),r=i(487),a=i(51),n=i(302),o=i(347);function h(t,e={}){try{if(!a.A.VALID_EVENT_TYPES.includes(t))return s.A.warn(\"Invalid event type provided to recordEvent\",{eventType:t}),!1;if(!window?.NRVIDEO?.info)return;const{appName:i,applicationID:h}=window.NRVIDEO.info,{qoe:d,...l}=e,c=d?{...d}:{},u={...h?{}:{appName:i},timestamp:Date.now(),timeSinceLoad:window.performance?window.performance.now()/1e3:null},A={...l,eventType:t,...u},g=(0,o.z8)(a.A.QOE_AGGREGATE_KEYS,e);let m=null;\"VideoAction\"===t&&(m={eventType:\"VideoAction\",actionName:n.A.Events.QOE_AGGREGATE,qoeAggregateVersion:\"1.0.0\",...c,...g,...u});const f=r.videoAnalyticsHarvester.addEvent(A);if(m&&window?.NRVIDEO?.config?.qoeAggregate){const t=r.videoAnalyticsHarvester.addEvent(m);return f&&t}return f}catch(t){return s.A.error(\"Failed to record event:\",t.message),!1}}const{COLLECTOR:d}=a.A;const l=new class{setConfiguration(t,e){return!!this.validateRequiredFields(t)&&!!this.validateConfigFields(e)&&(this.initializeGlobalConfig(t,e),s.A.notice(\"Video analytics configuration initialized successfully\"),!0)}validateRequiredFields(t){if(!t||\"object\"!=typeof t)return s.A.error(\"Configuration must be an object\"),!1;const{licenseKey:e,appName:i,region:r,applicationID:a,beacon:n}=t;if(!e)return s.A.error(\"licenseKey is required\"),!1;if(a){if(!n)return s.A.error(\"beacon is required when applicationID is provided\"),!1;if(!Object.values(d).flatMap(t=>t).includes(n))return s.A.error(`Invalid beacon: ${n}`),!1}else{if(!i||!r)return s.A.error(\"appName and region are required when applicationID is not provided\"),!1;if(!d[r])return s.A.error(`Invalid region: ${r}. Valid regions are: ${Object.keys(d).join(\", \")}`),!1}return!0}validateConfigFields(t){if(null==t)return!0;if(\"object\"!=typeof t||Array.isArray(t))return s.A.error(\"config must be an object\"),!1;const{qoeAggregate:e,obfuscate:i}=t;return void 0!==e&&\"boolean\"!=typeof e?(s.A.error(\"qoeAggregate must be a boolean\"),!1):!(void 0!==i&&!Array.isArray(i)&&(s.A.error(\"obfuscate must be an array\"),1))}filterObfuscateRules(t){return t?t.filter(t=>{const e=void 0!==t.regex&&(\"string\"==typeof t.regex||t.regex instanceof RegExp),i=void 0!==t.replacement&&\"string\"==typeof t.replacement;return!(!e||!i)||(s.A.warn(\"obfuscate rule missing required 'regex' (string|RegExp) and/or 'replacement' (string), skipping:\",t),!1)}):[]}sanitizeQoeIntervalFactor(t){return null==t?1:\"number\"==typeof t&&Number.isInteger(t)&&t>=1?t:(console.warn(`[nrvideo] Invalid qoeIntervalFactor \"${t}\" — must be a positive integer. Defaulting to 1.`),1)}initializeGlobalConfig(t,e){let{licenseKey:i,appName:s,region:r,beacon:n,applicationID:o}=t;n=\"US\"===r?a.A.COLLECTOR.US[0]:n||d[r],window.NRVIDEO={info:{...r?{region:r}:{},beacon:n,licenseKey:i,applicationID:o,...o?{}:{appName:s}},config:{qoeAggregate:e?.qoeAggregate??!1,qoeIntervalFactor:this.sanitizeQoeIntervalFactor(e?.qoeIntervalFactor),obfuscate:this.filterObfuscateRules(e?.obfuscate)}}}};class c{static addTracker(t,e){var i,r;e?.info&&(i=e.info,r=e?.config,l.setConfiguration(i,r)),t.on&&t.emit?(u.push(t),t.on(\"*\",A),\"function\"==typeof t.trackerInit&&t.trackerInit()):s.A.error(\"Tried to load a non-tracker.\",t)}static removeTracker(t){t.off(\"*\",A),t.dispose();let e=u.indexOf(t);-1!==e&&u.splice(e,1)}static getTrackers(){return u}static send(t,e,i){return h(t,{actionName:e,...i})}static sendError(t){return h(\"VideoErrorAction\",{actionName:\"ERROR\",...t})}static async forceHarvest(){try{const{videoAnalyticsHarvester:t}=i(487);return await t.forceHarvest()}catch(t){return s.A.error(\"Failed to force harvest:\",t.message),{success:!1,error:t.message}}}}let u=[];function A(t){try{let e=function(t){let e={};for(let i in t)null!==t[i]&&void 0!==t[i]&&(e[i]=t[i]);return e}(t.data);s.A.level<=s.A.Levels.DEBUG?s.A.notice(\"Sent\",t.type,e):s.A.notice(\"Sent\",t.type),c.send(t.eventType,t.type,e)}catch(t){s.A.error(\"Error in event handler:\",t.message)}}const g=c;var m=i(455),f=i(568);const E=class{constructor(){this.reset(),this._createdAt=Date.now(),this._hb=!0,this._acc=0,this._bufferAcc=0}reset(){this._viewSession=null,this._viewCount=0,this._isAd=!1,this.numberOfErrors=0,this.numberOfAds=0,this.numberOfVideos=0,this.totalPlaytime=0,this.weightedAverageBitrate=0,this.totalAdPlaytime=0,this.isAdBreak=!1,this.initialBufferingHappened=!1,this.startupTime=null,this.peakBitrate=0,this._lastBitrate=null,this._lastBitrateChangeTimestamp=null,this.partialAverageBitrate=0,this._totalBitrateDuration=0,this.hadStartupError=!1,this.hadPlaybackError=!1,this.totalRebufferingTime=0,this.resetFlags(),this.resetChronos()}resetFlags(){this.isPlayerReady=!1,this.isRequested=!1,this.isStarted=!1,this.isPaused=!1,this.isSeeking=!1,this.isBuffering=!1,this.isPlaying=!1}resetChronos(){this.timeSinceRequested=new m.A,this.timeSinceStarted=new m.A,this.timeSincePaused=new m.A,this.timeSinceSeekBegin=new m.A,this.timeSinceBufferBegin=new m.A,this.timeSinceAdBreakStart=new m.A,this.timeSinceLastDownload=new m.A,this.timeSinceLastHeartbeat=new m.A,this.timeSinceLastRenditionChange=new m.A,this.timeSinceLastAdQuartile=new m.A,this.timeSinceLastAd=new m.A,this.timeSinceLastError=new m.A,this.timeSinceLastAdError=new m.A,this.timeSinceResumed=new m.A,this.timeSinceSeekEnd=new m.A,this.playtimeSinceLastEvent=new m.A,this.customTimeSinceAttributes={},this.elapsedTime=new m.A,this.bufferElapsedTime=new m.A,this._totalAdPlaytime=new m.A}isAd(){return this._isAd}setIsAd(t){this._isAd=t}setTimeSinceAttribute(t){this.customTimeSinceAttributes[t]=new m.A,this.customTimeSinceAttributes[t].start()}removeTimeSinceAttribute(t){delete this.customTimeSinceAttributes[t]}getViewSession(){if(!this._viewSession){let t=(new Date).getTime(),e=Math.random().toString(36).substring(2)+Math.random().toString(36).substring(2);this._viewSession=t+\"-\"+e}return this._viewSession}getViewId(){return this.getViewSession()+\"-\"+this._viewCount}getStateAttributes(t){t=t||{},this.isAd()?(this.isRequested&&(t.timeSinceAdRequested=this.timeSinceRequested.getDeltaTime(),t.timeSinceLastAdHeartbeat=this.timeSinceLastHeartbeat.getDeltaTime()),this.isStarted&&(t.timeSinceAdStarted=this.timeSinceStarted.getDeltaTime()),this.isPaused&&(t.timeSinceAdPaused=this.timeSincePaused.getDeltaTime()),this.isBuffering&&(t.timeSinceAdBufferBegin=this.timeSinceBufferBegin.getDeltaTime()),this.isSeeking&&(t.timeSinceAdSeekBegin=this.timeSinceSeekBegin.getDeltaTime()),this.isAdBreak&&(t.timeSinceAdBreakBegin=this.timeSinceAdBreakStart.getDeltaTime()),this.numberOfErrors>0&&this.timeSinceLastAdError.startTime>0&&(t.timeSinceLastAdError=this.timeSinceLastAdError.getDeltaTime()),t.numberOfAds=this.numberOfAds):(this.isRequested&&(t.timeSinceRequested=this.timeSinceRequested.getDeltaTime(),t.timeSinceLastHeartbeat=this.timeSinceLastHeartbeat.getDeltaTime()),this.isStarted&&(t.timeSinceStarted=this.timeSinceStarted.getDeltaTime()),this.isPaused&&(t.timeSincePaused=this.timeSincePaused.getDeltaTime()),this.isBuffering&&(t.timeSinceBufferBegin=this.timeSinceBufferBegin.getDeltaTime()),this.isSeeking&&(t.timeSinceSeekBegin=this.timeSinceSeekBegin.getDeltaTime()),t.timeSinceLastAd=this.timeSinceLastAd.getDeltaTime(),this.numberOfErrors>0&&this.timeSinceLastError.startTime>0&&(t.timeSinceLastError=this.timeSinceLastError.getDeltaTime()),t.numberOfVideos=this.numberOfVideos),t.numberOfErrors=this.numberOfErrors,this.isAd()||(this.playtimeSinceLastEvent.startTime>0?t.playtimeSinceLastEvent=this.playtimeSinceLastEvent.getDeltaTime():t.playtimeSinceLastEvent=0,this.isPlaying?this.playtimeSinceLastEvent.start():this.playtimeSinceLastEvent.reset(),this.totalPlaytime+=t.playtimeSinceLastEvent,t.totalPlaytime=this.totalPlaytime);for(const[e,i]of Object.entries(this.customTimeSinceAttributes))t[e]=i.getDeltaTime();return t}getQoeAttributes(t){t=t||{};const e={};try{null!==this.startupTime&&(e.startupTime=this.startupTime),this.peakBitrate>0&&(e.peakBitrate=this.peakBitrate),e.hadStartupError=this.hadStartupError,e.hadPlaybackError=this.hadPlaybackError,e.totalRebufferingTime=this.totalRebufferingTime,e.rebufferingRatio=this.totalPlaytime>0?this.totalRebufferingTime/this.totalPlaytime*100:0,e.totalPlaytime=this.totalPlaytime,e.averageBitrate=this.weightedBitrate,e.numberOfErrors=this.numberOfErrors}catch(t){s.A.error(\"Failed to add attributes for QOE KPIs\",t.message)}return t.qoe=e,t}calculateBufferType(t){let e=\"\";return e=t?\"initial\":this.isSeeking?\"seek\":this.isPaused?\"pause\":\"connection\",s.A.debug(\"Buffer Type = \"+e),e}goViewCountUp(){this._viewCount++}goPlayerReady(){return!this.isPlayerReady&&(this.isPlayerReady=!0,!0)}goRequest(){return!this.isRequested&&(this.isRequested=!0,this.timeSinceLastAd.reset(),this.timeSinceRequested.start(),!0)}goStart(){return!(!this.isRequested||this.isStarted||(this.isAd()?this.numberOfAds++:this.numberOfVideos++,this.isStarted=!0,this.isPlaying=!0,this.timeSinceStarted.start(),this.playtimeSinceLastEvent.start(),0))}goEnd(){return!!this.isRequested&&(this.numberOfErrors=0,this.resetFlags(),this.timeSinceRequested.stop(),this.timeSinceStarted.stop(),this.playtimeSinceLastEvent.stop(),this.isPlaying=!1,!0)}goPause(){return!(!this.isStarted||this.isPaused||(this.isPaused=!0,this.isPlaying=!1,this.timeSincePaused.start(),this.playtimeSinceLastEvent.stop(),this.timeSinceResumed.reset(),this.isBuffering&&(this._bufferAcc+=this.bufferElapsedTime.getDeltaTime()),this.elapsedTime.start(),0))}goResume(){return!(!this.isStarted||!this.isPaused||(this.isPaused=!1,this.isPlaying=!0,this.timeSincePaused.stop(),this.timeSinceResumed.start(),this._hb?(this._acc=this.elapsedTime.getDeltaTime(),this._hb=!1):(this.isBuffering&&this.bufferElapsedTime.start(),this._acc+=this.elapsedTime.getDeltaTime()),0))}goBufferStart(){return!(!this.isRequested||this.isBuffering||(this.isBuffering=!0,this.isPlaying=!1,this.timeSinceBufferBegin.start(),this.bufferElapsedTime.start(),0))}goBufferEnd(){return!(!this.isRequested||!this.isBuffering||(this.isBuffering=!1,this.isPlaying=!0,this.timeSinceBufferBegin.stop(),this._hb?(this._bufferAcc=this.bufferElapsedTime.getDeltaTime(),this._hb=!1):this._bufferAcc+=this.bufferElapsedTime.getDeltaTime(),!this.isAd()&&this.initialBufferingHappened&&(this.totalRebufferingTime+=this.timeSinceBufferBegin.stopTime-this.timeSinceBufferBegin.startTime),0))}goSeekStart(){return!(!this.isStarted||this.isSeeking||(this.isSeeking=!0,this.isPlaying=!1,this.timeSinceSeekBegin.start(),this.timeSinceSeekEnd.reset(),0))}goSeekEnd(){return!(!this.isStarted||!this.isSeeking||(this.isSeeking=!1,this.isPlaying=!0,this.timeSinceSeekBegin.stop(),this.timeSinceSeekEnd.start(),0))}goAdBreakStart(){return!this.isAdBreak&&(this.isAdBreak=!0,this.timeSinceAdBreakStart.start(),!0)}goAdBreakEnd(){return!!this.isAdBreak&&(this.isRequested=!1,this.isAdBreak=!1,this.totalAdPlaytime=this.timeSinceAdBreakStart.getDeltaTime(),this.timeSinceAdBreakStart.stop(),!0)}goDownload(){this.timeSinceLastDownload.start()}goHeartbeat(){this.timeSinceLastHeartbeat.start()}goRenditionChange(){this.timeSinceLastRenditionChange.start()}goAdQuartile(){this.timeSinceLastAdQuartile.start()}goError(){this.isError=!0,this.numberOfErrors++,this.isAd()?this.timeSinceLastAdError.start():(this.timeSinceLastError.start(),this.isStarted?this.hadPlaybackError=!0:this.hadStartupError=!0)}goLastAd(){this.timeSinceLastAd.start()}trackContentBitrateState(t){if(t&&\"number\"==typeof t){this.peakBitrate=Math.max(this.peakBitrate,t);const e=Date.now();if(!this.isPlaying){if(null!==this._lastBitrate&&null!==this._lastBitrateChangeTimestamp){const t=e-this._lastBitrateChangeTimestamp;t>0&&(this.partialAverageBitrate+=this._lastBitrate*t,this._totalBitrateDuration+=t),this._lastBitrateChangeTimestamp=null}return void(this._lastBitrate=t)}if(null===this._lastBitrateChangeTimestamp&&null!==this._lastBitrate&&(this._lastBitrateChangeTimestamp=e),null!==this._lastBitrate&&this._lastBitrate!==t&&null!==this._lastBitrateChangeTimestamp){const t=e-this._lastBitrateChangeTimestamp;t>0&&(this.partialAverageBitrate+=this._lastBitrate*t,this._totalBitrateDuration+=t),this._lastBitrateChangeTimestamp=e}null===this._lastBitrateChangeTimestamp&&(this._lastBitrateChangeTimestamp=e),this._lastBitrate=t;let i=this.partialAverageBitrate,s=this._totalBitrateDuration;const r=e-this._lastBitrateChangeTimestamp;r>0&&(i+=t*r,s+=r),this.weightedBitrate=s>0?Math.round(i/s):t}}resetViewIdTrackedState(){this.peakBitrate=0,this.partialAverageBitrate=0,this._totalBitrateDuration=0,this.startupTime=null,this._lastBitrate=null,this._lastBitrateChangeTimestamp=null}clearTotalAdsTime(){s.A.debug(\"clear total ads time\",this.totalAdTime),this._totalAdPlaytime.reset()}totalAdTime(){return this._totalAdPlaytime.getDuration()}startAdsTime(){return s.A.debug(\"startAdsTime\"),this._totalAdPlaytime.start()}stopAdsTime(){return s.A.debug(\"stopAdsTime\"),this._totalAdPlaytime.stop()}setStartupTime(t){null===this.startupTime&&(this.startupTime=Math.max(this.timeSinceRequested.getDeltaTime()-t,0))}};var T=i(330);class v extends n.A{constructor(t,e){super(),this.state=new E,this.adsTracker=null,this._lastBufferType=null,this._userId=null,e=e||{},this.setOptions(e),t&&this.setPlayer(t,e.tag),s.A.notice(\"Tracker \"+this.getTrackerName()+\" v\"+this.getTrackerVersion()+\" is ready.\")}setUserId(t){this._userId=t}setOptions(t){t&&(t.adsTracker&&this.setAdsTracker(t.adsTracker),\"boolean\"==typeof t.isAd&&this.setIsAd(t.isAd),n.A.prototype.setOptions.apply(this,arguments))}setPlayer(t,e){(this.player||this.tag)&&this.dispose(),\"undefined\"!=typeof document&&document.getElementById&&(\"string\"==typeof t&&(t=document.getElementById(t)),\"string\"==typeof e&&(e=document.getElementById(e))),e=e||t,this.player=t,this.tag=e,this.registerListeners()}isAd(){return this.state.isAd()}setIsAd(t){this.state.setIsAd(t)}setAdsTracker(t){this.disposeAdsTracker(),t&&(this.adsTracker=t,this.adsTracker.setIsAd(!0),this.adsTracker.parentTracker=this,this.adsTracker.on(\"*\",S.bind(this)))}disposeAdsTracker(){this.adsTracker&&(this.adsTracker.off(\"*\",S),this.adsTracker.dispose())}dispose(){this.stopHeartbeat(),this.disposeAdsTracker(),this.unregisterListeners(),this.player=null,this.tag=null}registerListeners(){}unregisterListeners(){}getViewId(){return this.parentTracker?this.parentTracker.getViewId():this.state.getViewId()}getViewSession(){return this.parentTracker?this.parentTracker.getViewSession():this.state.getViewSession()}getVideoId(){return null}getTitle(){return null}isLive(){return null}getBitrate(){return null}getManifestBitrate(){return null}getSegmentDownloadBitrate(){return null}getNetworkDownloadBitrate(){return null}getWebkitBitrate(){if(this.tag&&this.tag.webkitVideoDecodedByteCount){let t;if(this._lastWebkitBitrate){t=this.tag.webkitVideoDecodedByteCount;let e=t-this._lastWebkitBitrate,i=this.getHeartbeat()/1e3;t=Math.round(e/i*8)}return this._lastWebkitBitrate=this.tag.webkitVideoDecodedByteCount,t||null}}getRenditionName(){return null}getRenditionBitrate(){return null}getRenditionShift(t){let e,i=this.getRenditionBitrate();return this.isAd()?(e=this._lastAdRendition,t&&(this._lastAdRendition=i)):(e=this._lastRendition,t&&(this._lastRendition=i)),i&&e?i>e?\"up\":i<e?\"down\":null:null}getRenditionHeight(){return this.tag?this.tag.videoHeight:null}getRenditionWidth(){return this.tag?this.tag.videoWidth:null}getDuration(){return this.tag?this.tag.duration:null}getPlayhead(){return this.tag?this.tag.currentTime:null}getLanguage(){return null}getSrc(){return this.tag?this.tag.currentSrc:null}getPlayrate(){return this.tag?this.tag.playbackRate:null}isMuted(){return this.tag?this.tag.muted:null}isFullscreen(){return null}getCdn(){return null}getPlayerName(){return this.getTrackerName()}getPlayerVersion(){return T.rE}getFps(){return null}isAutoplayed(){return this.tag?this.tag.autoplay:null}getPreload(){return this.tag?this.tag.preload:null}getAdQuartile(){return null}getAdPosition(){return this.parentTracker?this.parentTracker.state.isStarted?\"mid\":\"pre\":null}getAdPartner(){return null}getAdCreativeId(){return null}getInstrumentationProvider(){return null}getInstrumentationName(){return null}getInstrumentationVersion(){return null}getAttributes(t,e){if(void 0===(t=n.A.prototype.getAttributes.apply(this,arguments)).isAd&&(t.isAd=this.isAd()),t.viewSession=this.getViewSession(),t.viewId=this.getViewId(),t.playerName=this.getPlayerName(),t.playerVersion=this.getPlayerVersion(),t[\"instrumentation.provider\"]=this.getInstrumentationProvider(),t[\"instrumentation.name\"]=this.getInstrumentationName(),t[\"instrumentation.version\"]=this.getInstrumentationVersion(),t[\"enduser.id\"]=this._userId,t.src=\"Browser\",\"customAction\"===e)return t;try{t.pageUrl=window.location.href}catch(t){}this.isAd()?(t.adId=this.getVideoId(),t.adTitle=this.getTitle(),t.adSrc=this.getSrc(),t.adCdn=this.getCdn(),this.state.isStarted&&(t.adBitrate=this.getBitrate()||0),t.adRenditionName=this.getRenditionName(),t.adRenditionHeight=this.getRenditionHeight(),t.adRenditionWidth=this.getRenditionWidth(),t.adDuration=this.getDuration(),t.adPlayhead=this.getPlayhead(),t.adLanguage=this.getLanguage(),t.adIsMuted=this.isMuted(),t.adFps=this.getFps(),t.adPosition=this.getAdPosition(),t.adCreativeId=this.getAdCreativeId(),t.adPartner=this.getAdPartner()):(t.contentId=this.getVideoId(),t.contentTitle=this.getTitle(),t.contentSrc=this.getSrc(),t.contentCdn=this.getCdn(),t.contentPlayhead=this.getPlayhead(),t.contentIsLive=this.isLive(),this.state.isStarted&&(t.contentBitrate=this.getBitrate()||0,t.contentManifestBitrate=this.getManifestBitrate()||0,t.contentSegmentDownloadBitrate=this.getSegmentDownloadBitrate()||0,t.contentNetworkDownloadBitrate=this.getNetworkDownloadBitrate()||0),t.contentRenditionName=this.getRenditionName(),t.contentRenditionHeight=this.getRenditionHeight(),t.contentRenditionWidth=this.getRenditionWidth(),t.contentDuration=this.getDuration(),t.contentLanguage=this.getLanguage(),t.contentPlayrate=this.getPlayrate(),t.contentIsFullscreen=this.isFullscreen(),t.contentIsMuted=this.isMuted(),t.contentIsAutoplayed=this.isAutoplayed(),t.contentPreload=this.getPreload(),t.contentFps=this.getFps(),null!=this.adsTracker&&this.adsTracker.state.totalAdPlaytime>0&&(t.totalAdPlaytime=this.adsTracker.state.totalAdPlaytime)),this.state.getStateAttributes(t),this.state.isStarted&&!this.isAd()&&this.state.trackContentBitrateState(t.contentBitrate);for(let e in this.customData)t[e]=this.customData[e];return this.addQoeAttributes(t),t}addQoeAttributes(t){const e=(t=this.state.getQoeAttributes(t)).qoe;for(let t in this.customData)e[t]=this.customData[t]}sendCustom(t,e,i){i=i||{},this.sendVideoCustomAction(t,i),this.state.setTimeSinceAttribute(e)}sendPlayerReady(t){this.state.goPlayerReady()&&(t=t||{},this.sendVideoAction(v.Events.PLAYER_READY,t))}sendRequest(t){if(this.state.goRequest()){let e;this.isAd()?(e=v.Events.AD_REQUEST,this.sendVideoAdAction(e,t)):(e=v.Events.CONTENT_REQUEST,this.sendVideoAction(e,t))}}sendStart(t){if(this.state.goStart()){let e;if(this.isAd())e=v.Events.AD_START,this.parentTracker&&(this.parentTracker.state.isPlaying=!1),this.sendVideoAdAction(e,t),this.state.startAdsTime();else{e=v.Events.CONTENT_START;let i=0;this.adsTracker&&((this.adsTracker.state.isPlaying||this.adsTracker.state.isBuffering)&&(this.adsTracker.state.stopAdsTime(),this.adsTracker.state.isPlaying=!1,this.adsTracker.state.isBuffering=!1),i=this.adsTracker.state.totalAdTime()??0),this.state.setStartupTime(i),this.sendVideoAction(e,t),r.videoAnalyticsHarvester.setBeforeDrainCallback(()=>{if(this.state){const t=this.state.getQoeAttributes({}).qoe;r.videoAnalyticsHarvester.refreshQoeKpis(t,this.getViewId())}})}this.startHeartbeat(),this.state.goHeartbeat()}}sendEnd(t){if(this.state.goEnd()){let e;t=t||{},this.isAd()?(e=v.Events.AD_END,t.timeSinceAdRequested=this.state.timeSinceRequested.getDeltaTime(),t.timeSinceAdStarted=this.state.timeSinceStarted.getDeltaTime(),this.parentTracker&&(this.parentTracker.state.isPlaying=!0),this.state.stopAdsTime()):(e=v.Events.CONTENT_END,t.timeSinceRequested=this.state.timeSinceRequested.getDeltaTime(),t.timeSinceStarted=this.state.timeSinceStarted.getDeltaTime()),this.stopHeartbeat(),this.isAd()?this.sendVideoAdAction(e,t):this.sendVideoAction(e,t),this.parentTracker&&this.isAd()&&this.parentTracker.state.goLastAd(),this.state.goViewCountUp(),this.state.totalPlaytime=0,this.isAd()||(r.videoAnalyticsHarvester.forceNextQoeCycle(),r.videoAnalyticsHarvester.setBeforeDrainCallback(null),this.adsTracker&&this.adsTracker.state.clearTotalAdsTime(),this.state.resetViewIdTrackedState())}}sendPause(t){if(this.state.goPause()){let e=this.isAd()?v.Events.AD_PAUSE:v.Events.CONTENT_PAUSE;this.isAd()?this.sendVideoAdAction(e,t):this.sendVideoAction(e,t)}}sendResume(t){if(this.state.goResume()){let e;t=t||{},this.isAd()?(e=v.Events.AD_RESUME,t.timeSinceAdPaused=this.state.timeSincePaused.getDeltaTime()):(e=v.Events.CONTENT_RESUME,t.timeSincePaused=this.state.timeSincePaused.getDeltaTime()),this.isAd()?this.sendVideoAdAction(e,t):this.sendVideoAction(e,t)}}sendBufferStart(t){if(this.state.goBufferStart()){let e;t=t||{},e=this.isAd()?v.Events.AD_BUFFER_START:v.Events.CONTENT_BUFFER_START,t=this.buildBufferAttributes(t),this._lastBufferType=t.bufferType,this.isAd()?this.sendVideoAdAction(e,t):this.sendVideoAction(e,t)}}sendBufferEnd(t){if(this.state.goBufferEnd()){let e;t=t||{},this.isAd()?(e=v.Events.AD_BUFFER_END,t.timeSinceAdBufferBegin=this.state.timeSinceBufferBegin.getDeltaTime()):(e=v.Events.CONTENT_BUFFER_END,t.timeSinceBufferBegin=this.state.timeSinceBufferBegin.getDeltaTime()),t=this.buildBufferAttributes(t),null!=this._lastBufferType&&(t.bufferType=this._lastBufferType),this.isAd()?this.sendVideoAdAction(e,t):this.sendVideoAction(e,t),this.state.initialBufferingHappened=!0}}buildBufferAttributes(t){return null==t.timeSinceStarted||t.timeSinceStarted<100?t.isInitialBuffering=!this.state.initialBufferingHappened:t.isInitialBuffering=!1,t.bufferType=this.state.calculateBufferType(t.isInitialBuffering),t.timeSinceResumed=this.state.timeSinceResumed.getDeltaTime(),t.timeSinceSeekEnd=this.state.timeSinceSeekEnd.getDeltaTime(),t}sendSeekStart(t){if(this.state.goSeekStart()){let e;e=this.isAd()?v.Events.AD_SEEK_START:v.Events.CONTENT_SEEK_START,this.isAd()?this.sendVideoAdAction(e,t):this.sendVideoAction(e,t)}}sendSeekEnd(t){if(this.state.goSeekEnd()){let e;t=t||{},this.isAd()?(e=v.Events.AD_SEEK_END,t.timeSinceAdSeekBegin=this.state.timeSinceSeekBegin.getDeltaTime()):(e=v.Events.CONTENT_SEEK_END,t.timeSinceSeekBegin=this.state.timeSinceSeekBegin.getDeltaTime()),this.isAd()?this.sendVideoAdAction(e,t):this.sendVideoAction(e,t)}}sendDownload(t){(t=t||{}).state||s.A.warn(\"Called sendDownload without { state: xxxxx }.\"),this.sendVideoAction(v.Events.DOWNLOAD,t),this.state.goDownload()}sendError(t){(t=t||{}).isAd=this.isAd(),this.state.goError();let e=this.isAd()?v.Events.AD_ERROR:v.Events.CONTENT_ERROR;this.sendVideoErrorAction(e,t)}sendRenditionChanged(t){let e;(t=t||{}).timeSinceLastRenditionChange=this.state.timeSinceLastRenditionChange.getDeltaTime(),t.shift=this.getRenditionShift(!0),e=this.isAd()?v.Events.AD_RENDITION_CHANGE:v.Events.CONTENT_RENDITION_CHANGE,this.isAd()?this.sendVideoAdAction(e,t):this.sendVideoAction(e,t),this.state.goRenditionChange()}sendHeartbeat(t){if(this.state.isRequested){let e,i=this.getHeartbeat();this.state._hb=!0,i=this.adjustElapsedTimeForPause(i),this.isAd()?(e=v.Events.AD_HEARTBEAT,\"bitmovin-ads\"===this.getPlayerName()?this.sendVideoAdAction(e,t):this.sendVideoAdAction(e,{elapsedTime:i,...t})):(e=v.Events.CONTENT_HEARTBEAT,this.sendVideoAction(e,{elapsedTime:i,...t})),this.state.goHeartbeat()}}adjustElapsedTimeForPause(t){return this.state._acc&&(t-=this.state._acc,this.state._acc=0),this.state.isPaused&&((t-=this.state.elapsedTime.getDeltaTime())<10&&(t=0),this.state.elapsedTime.start()),this.state._bufferAcc?(t-=this.state._bufferAcc,this.state._bufferAcc=0):this.state.isBuffering&&((t-=this.state.bufferElapsedTime.getDeltaTime())<5&&(t=0),this.state.bufferElapsedTime.start()),Math.max(0,t)}sendAdBreakStart(t){this.isAd()&&this.state.goAdBreakStart()&&(this.state.totalAdPlaytime=0,this.parentTracker&&(this.parentTracker.state.isPlaying=!1),this.sendVideoAdAction(v.Events.AD_BREAK_START,t))}sendAdBreakEnd(t){this.isAd()&&this.state.goAdBreakEnd()&&((t=t||{}).timeSinceAdBreakBegin=this.state.timeSinceAdBreakStart.getDeltaTime(),this.sendVideoAdAction(v.Events.AD_BREAK_END,t),this.parentTracker&&(this.parentTracker.state.isPlaying=!0),this.stopHeartbeat(),this.parentTracker&&this.isAd()&&this.parentTracker.state.goLastAd())}sendAdQuartile(t){this.isAd()&&((t=t||{}).quartile||s.A.warn(\"Called sendAdQuartile without { quartile: xxxxx }.\"),t.timeSinceLastAdQuartile=this.state.timeSinceLastAdQuartile.getDeltaTime(),this.sendVideoAdAction(v.Events.AD_QUARTILE,t),this.state.goAdQuartile())}sendAdClick(t){this.isAd()&&((t=t||{}).url||s.A.warn(\"Called sendAdClick without { url: xxxxx }.\"),this.sendVideoAdAction(v.Events.AD_CLICK,t))}}function S(t){t.type!==v.Events.AD_ERROR?this.sendVideoAdAction(t.type,t.data):this.sendVideoErrorAction(t.type,t.data)}v.Events={PLAYER_READY:\"PLAYER_READY\",DOWNLOAD:\"DOWNLOAD\",ERROR:\"ERROR\",CONTENT_REQUEST:\"CONTENT_REQUEST\",CONTENT_START:\"CONTENT_START\",CONTENT_END:\"CONTENT_END\",CONTENT_PAUSE:\"CONTENT_PAUSE\",CONTENT_RESUME:\"CONTENT_RESUME\",CONTENT_SEEK_START:\"CONTENT_SEEK_START\",CONTENT_SEEK_END:\"CONTENT_SEEK_END\",CONTENT_BUFFER_START:\"CONTENT_BUFFER_START\",CONTENT_BUFFER_END:\"CONTENT_BUFFER_END\",CONTENT_HEARTBEAT:\"CONTENT_HEARTBEAT\",CONTENT_RENDITION_CHANGE:\"CONTENT_RENDITION_CHANGE\",CONTENT_ERROR:\"CONTENT_ERROR\",AD_REQUEST:\"AD_REQUEST\",AD_START:\"AD_START\",AD_END:\"AD_END\",AD_PAUSE:\"AD_PAUSE\",AD_RESUME:\"AD_RESUME\",AD_SEEK_START:\"AD_SEEK_START\",AD_SEEK_END:\"AD_SEEK_END\",AD_BUFFER_START:\"AD_BUFFER_START\",AD_BUFFER_END:\"AD_BUFFER_END\",AD_HEARTBEAT:\"AD_HEARTBEAT\",AD_RENDITION_CHANGE:\"AD_RENDITION_CHANGE\",AD_ERROR:\"AD_ERROR\",AD_BREAK_START:\"AD_BREAK_START\",AD_BREAK_END:\"AD_BREAK_END\",AD_QUARTILE:\"AD_QUARTILE\",AD_CLICK:\"AD_CLICK\"};const p=v;var y=i(431),_=i(413),R=i(481),B=i(374);const b={Constants:a.A,Chrono:m.A,Log:s.A,Emitter:f.A,Tracker:n.A,VideoTracker:p,VideoTrackerState:E,Core:g,version:T.rE,NrVideoEventAggregator:y.t,RetryQueueHandler:_.u,OptimizedHttpClient:R.X,HarvestScheduler:B.n,recordEvent:h};export{b as default};\n//# sourceMappingURL=index.js.map","/**\n * MediaTailor Utility Functions\n * Helper functions for AWS MediaTailor ad tracking\n */\n\nimport {\n DASH_MANIFEST_EXTENSION,\n DASH_SCTE35_EVENT_STREAM_SELECTOR,\n HLS_MANIFEST_EXTENSION,\n HLS_SEGMENT_DURATION_TAG,\n HLS_TAG_PREFIX,\n REGEX_CUE_OUT,\n REGEX_DASH_MINIMUM_UPDATE_PERIOD,\n REGEX_DISCONTINUITY,\n REGEX_HLS_TARGET_DURATION,\n REGEX_ISO_8601_DURATION,\n REGEX_MAP,\n REGEX_MANIFEST_FILE_SUFFIX,\n REGEX_SESSION_ID,\n REGEX_TRACKING_PATH_SEGMENT,\n MT_HLS_CUE_IN_TAG,\n MT_HLS_CUE_OUT_TAG,\n MT_SEGMENT_PATTERN,\n MIN_AD_DURATION,\n AD_TIMING_TOLERANCE,\n SCTE35_SCHEME_MARKER,\n STREAM_TYPE,\n MANIFEST_TYPE,\n AD_POSITION,\n AD_SOURCE,\n QUARTILES,\n} from './mt-constants.js';\n\n/**\n * Generates timestamp string for logging (HH:MM:SS.mmm format)\n */\nexport function getTimestamp() {\n const now = new Date();\n return now.toISOString().substring(11, 23);\n}\n\n/**\n * Detects manifest format from URL (.m3u8 = HLS, .mpd = DASH)\n */\nexport function detectManifestFormatFromUrl(url) {\n if (url.includes(HLS_MANIFEST_EXTENSION)) {\n return MANIFEST_TYPE.HLS;\n } else if (url.includes(DASH_MANIFEST_EXTENSION)) {\n return MANIFEST_TYPE.DASH;\n }\n return MANIFEST_TYPE.HLS; // Default fallback\n}\n\n/**\n * Detects stream type from player duration (Infinity = Live, else = VOD)\n */\nexport function detectPlaybackStreamType(duration) {\n return duration === Infinity ? STREAM_TYPE.LIVE : STREAM_TYPE.VOD;\n}\n\n/**\n * Builds a tracking endpoint URL from a sessionized manifest URL\n * Format: /v1/tracking/{customerId}/{configName}/{sessionId}\n */\nexport function buildTrackingEndpointUrl(manifestUrl) {\n const match = manifestUrl.match(REGEX_SESSION_ID);\n\n if (!match) {\n return null;\n }\n\n const sessionId = match[1];\n\n // Convert manifest URL to tracking URL:\n // /v1/master/{id}/{name}/master.m3u8?aws.sessionId=xxx → /v1/tracking/{id}/{name}/{sessionId}\n // /v1/dash/{id}/{name}/index.mpd?aws.sessionId=xxx → /v1/tracking/{id}/{name}/{sessionId}\n const trackingEndpointUrl = manifestUrl\n .replace(REGEX_TRACKING_PATH_SEGMENT, '/v1/tracking/')\n .replace(REGEX_MANIFEST_FILE_SUFFIX, `/${sessionId}`);\n\n return trackingEndpointUrl;\n}\n\n/**\n * Checks if segment is a MediaTailor ad segment\n */\nexport function isMediaTailorSegment(segment) {\n // Check MAP URL for MediaTailor pattern\n if (segment.map && segment.map.uri && segment.map.uri.includes(MT_SEGMENT_PATTERN)) {\n return true;\n }\n // Check segment URL for MediaTailor pattern\n if (segment.uri && segment.uri.includes(MT_SEGMENT_PATTERN)) {\n return true;\n }\n return false;\n}\n\n/**\n * Determines ad position based on schedule index (VOD only, Live returns null)\n */\nexport function determineAdPosition(adBreakIndex, totalAdBreaks, streamType) {\n if (streamType === STREAM_TYPE.LIVE) {\n return null; // Live streams have no position concept\n }\n\n // VOD: Determine position by schedule index\n if (adBreakIndex === 0) {\n return AD_POSITION.PRE_ROLL; // First ad\n } else if (adBreakIndex === totalAdBreaks - 1) {\n return AD_POSITION.POST_ROLL; // Last ad\n } else {\n return AD_POSITION.MID_ROLL; // Middle ad\n }\n}\n\n/**\n * Finds ad break index in schedule by start time\n */\nexport function findAdBreakIndex(adSchedule, startTime) {\n return adSchedule.findIndex(\n (ad) => Math.abs(ad.startTime - startTime) < AD_TIMING_TOLERANCE\n );\n}\n\n/**\n * Calculates quartile thresholds for an ad duration\n */\nexport function calculateQuartiles(duration) {\n return {\n q1: duration * QUARTILES.Q1,\n q2: duration * QUARTILES.Q2,\n q3: duration * QUARTILES.Q3,\n };\n}\n\n/**\n * Checks which quartile events should fire based on progress\n */\nexport function getQuartilesToFire(progress, duration, firedQuartiles) {\n const quartiles = calculateQuartiles(duration);\n const toFire = [];\n\n if (progress >= quartiles.q1 && !firedQuartiles.q1) {\n toFire.push({ quartile: 1, key: 'q1' });\n }\n if (progress >= quartiles.q2 && !firedQuartiles.q2) {\n toFire.push({ quartile: 2, key: 'q2' });\n }\n if (progress >= quartiles.q3 && !firedQuartiles.q3) {\n toFire.push({ quartile: 3, key: 'q3' });\n }\n\n return toFire;\n}\n\n/**\n * Finds active ad break at current playhead time\n */\nexport function findActiveAdBreak(adSchedule, currentTime) {\n return adSchedule.find(\n (ad) => currentTime >= ad.startTime && currentTime < ad.endTime\n );\n}\n\n/**\n * Finds active pod within ad break at current playhead time\n */\nexport function findActivePod(adBreak, currentTime) {\n if (!adBreak || !adBreak.pods || adBreak.pods.length === 0) {\n return null;\n }\n\n return adBreak.pods.find(\n (pod) => currentTime >= pod.startTime && currentTime < pod.endTime\n );\n}\n\n/**\n * Validates if ad break duration meets minimum threshold\n */\nexport function isValidAdBreak(adBreak) {\n return adBreak.duration > MIN_AD_DURATION;\n}\n\n/**\n * Merges new ads into existing schedule (deduplicates by start time)\n */\nexport function mergeAdSchedules(existingSchedule, newAds) {\n const scheduleMap = new Map();\n\n // Add existing ads to map (keyed by rounded start time)\n existingSchedule.forEach((ad) => {\n const key = Math.round(ad.startTime);\n scheduleMap.set(key, ad);\n });\n\n // Merge new ads\n const merged = [];\n newAds.forEach((newAd) => {\n const key = Math.round(newAd.startTime);\n const existingAd = scheduleMap.get(key);\n\n if (!existingAd) {\n merged.push(newAd);\n scheduleMap.set(key, newAd);\n } else if (!existingAd.confirmedByTracking && newAd.confirmedByTracking) {\n Object.assign(existingAd, newAd);\n }\n });\n\n // Combine and sort by start time\n const finalSchedule = [...existingSchedule, ...merged];\n finalSchedule.sort((a, b) => a.startTime - b.startTime);\n\n return finalSchedule;\n}\n\n/**\n * Parses HLS manifest text for CUE-OUT/CUE-IN markers\n */\nexport function parseHlsManifestForAdBreaks(manifestText) {\n const lines = manifestText.split('\\n');\n const adBreaks = [];\n\n let currentTime = 0;\n let currentAdBreak = null;\n let currentPodStartTime = null;\n let lastMapUrl = null;\n let adPods = [];\n let isInAdBreak = false;\n\n for (const line of lines) {\n // Detect DISCONTINUITY marker\n if (REGEX_DISCONTINUITY.test(line)) {\n if (isInAdBreak && lastMapUrl) {\n const mapMatch = line.match(REGEX_MAP);\n const mapUrl = mapMatch ? mapMatch[1] : null;\n\n if (mapUrl && mapUrl !== lastMapUrl) {\n // New MAP = new pod boundary\n if (currentPodStartTime !== null) {\n const podDuration = currentTime - currentPodStartTime;\n adPods.push({\n startTime: currentPodStartTime,\n duration: podDuration,\n endTime: currentTime,\n mapUrl: lastMapUrl,\n });\n }\n currentPodStartTime = currentTime;\n lastMapUrl = mapUrl;\n }\n }\n }\n\n // Detect MAP URL changes\n const mapMatch = line.match(REGEX_MAP);\n if (mapMatch && isInAdBreak) {\n const mapUrl = mapMatch[1];\n if (mapUrl && mapUrl !== lastMapUrl) {\n // New MAP = new pod\n if (currentPodStartTime !== null) {\n const podDuration = currentTime - currentPodStartTime;\n adPods.push({\n startTime: currentPodStartTime,\n duration: podDuration,\n endTime: currentTime,\n mapUrl: lastMapUrl,\n });\n }\n currentPodStartTime = currentTime;\n lastMapUrl = mapUrl;\n }\n }\n\n // Detect CUE-OUT (ad break start)\n if (line.startsWith(MT_HLS_CUE_OUT_TAG)) {\n const durationMatch = line.match(REGEX_CUE_OUT);\n const duration = durationMatch ? parseFloat(durationMatch[1]) : null;\n\n isInAdBreak = true;\n adPods = [];\n currentAdBreak = {\n id: `avail-${currentTime}`,\n startTime: currentTime,\n duration: duration,\n endTime: null,\n pods: [],\n hasFiredStart: false,\n hasFiredEnd: false,\n hasFiredAdStart: false,\n confirmedByTracking: false,\n };\n }\n\n // Detect CUE-IN (ad break end)\n if (line.startsWith(MT_HLS_CUE_IN_TAG)) {\n if (currentAdBreak) {\n // Close final pod\n if (currentPodStartTime !== null) {\n const podDuration = currentTime - currentPodStartTime;\n adPods.push({\n startTime: currentPodStartTime,\n duration: podDuration,\n endTime: currentTime,\n mapUrl: lastMapUrl,\n });\n }\n\n // Calculate actual duration\n const actualDuration = currentTime - currentAdBreak.startTime;\n\n // Filter zero-duration false positives\n if (actualDuration >= MIN_AD_DURATION) {\n currentAdBreak.duration = actualDuration;\n currentAdBreak.endTime = currentTime;\n currentAdBreak.pods = adPods;\n adBreaks.push(currentAdBreak);\n }\n\n // Reset state\n currentAdBreak = null;\n isInAdBreak = false;\n currentPodStartTime = null;\n lastMapUrl = null;\n adPods = [];\n }\n }\n\n // Track time via EXTINF\n if (line.startsWith(HLS_SEGMENT_DURATION_TAG)) {\n const duration = parseFloat(line.split(':')[1]);\n if (!isNaN(duration)) {\n currentTime += duration;\n }\n }\n }\n\n // Handle unclosed ad break\n if (currentAdBreak && currentAdBreak.duration) {\n currentAdBreak.endTime = currentAdBreak.startTime + currentAdBreak.duration;\n currentAdBreak.pods = adPods;\n adBreaks.push(currentAdBreak);\n }\n\n return adBreaks;\n}\n\n/**\n * Detects ads from VHS playlist using discontinuityStarts and MediaTailor segments\n */\nexport function detectAdBreaksFromVhsPlaylist(playlist) {\n const segments = playlist.segments;\n const discontinuityStarts = playlist.discontinuityStarts || [];\n const adBreaks = [];\n\n let currentAdBreak = null;\n let currentPod = null;\n let currentTime = 0;\n\n segments.forEach((segment, index) => {\n const isMTSegment = isMediaTailorSegment(segment);\n const hasDiscontinuity = discontinuityStarts.includes(index);\n\n if (isMTSegment) {\n // Discontinuity marks new pod boundary\n if (hasDiscontinuity && currentPod) {\n currentPod.endTime = currentTime;\n if (currentPod.duration > MIN_AD_DURATION) {\n currentAdBreak.pods.push(currentPod);\n }\n currentPod = null;\n }\n\n // Start new ad break if not in one\n if (!currentAdBreak) {\n currentAdBreak = {\n id: `avail-${currentTime}`,\n startTime: currentTime,\n duration: 0,\n endTime: null,\n source: 'vhs-discontinuity',\n confirmedByTracking: false,\n hasFiredStart: false,\n hasFiredEnd: false,\n hasFiredAdStart: false,\n hasFiredQ1: false,\n hasFiredQ2: false,\n hasFiredQ3: false,\n pods: [],\n };\n }\n\n // Start new pod if not in one\n if (!currentPod) {\n currentPod = {\n startTime: currentTime,\n duration: 0,\n endTime: null,\n hasFiredStart: false,\n hasFiredQ1: false,\n hasFiredQ2: false,\n hasFiredQ3: false,\n };\n }\n\n // Accumulate durations\n const segmentDuration = segment.duration || 0;\n currentAdBreak.duration += segmentDuration;\n currentPod.duration += segmentDuration;\n } else {\n // Not MediaTailor segment - end ad break\n if (currentAdBreak) {\n // Close current pod\n if (currentPod) {\n currentPod.endTime = currentTime;\n if (currentPod.duration > MIN_AD_DURATION) {\n currentAdBreak.pods.push(currentPod);\n }\n currentPod = null;\n }\n\n // Close ad break\n currentAdBreak.endTime = currentTime;\n if (currentAdBreak.duration > MIN_AD_DURATION) {\n adBreaks.push(currentAdBreak);\n }\n currentAdBreak = null;\n }\n }\n\n currentTime += segment.duration || 0;\n });\n\n // Handle unclosed pod/ad break at end\n if (currentAdBreak) {\n if (currentPod) {\n currentPod.endTime = currentTime;\n if (currentPod.duration > MIN_AD_DURATION) {\n currentAdBreak.pods.push(currentPod);\n }\n }\n currentAdBreak.endTime = currentTime;\n if (currentAdBreak.duration > MIN_AD_DURATION) {\n adBreaks.push(currentAdBreak);\n }\n }\n\n return adBreaks;\n}\n\n/**\n * Enriches ad schedule with tracking API metadata\n */\nexport function enrichAdScheduleWithTrackingMetadata(adSchedule, trackingAvails) {\n const scheduleMap = new Map();\n\n // Build map of existing ads\n adSchedule.forEach((ad) => {\n const key = Math.round(ad.startTime);\n scheduleMap.set(key, ad);\n });\n\n // Process each avail from tracking API\n const newAds = [];\n trackingAvails.forEach((avail) => {\n const firstAd = avail.ads && avail.ads.length > 0 ? avail.ads[0] : null;\n if (!firstAd) return;\n\n const key = Math.round(firstAd.startTimeInSeconds);\n const existingAd = scheduleMap.get(key);\n\n if (existingAd) {\n // Enrich existing ad with tracking metadata\n existingAd.id = avail.availId;\n existingAd.creativeId = firstAd.adId;\n existingAd.title = firstAd.adTitle;\n existingAd.confirmedByTracking = true;\n\n // Enrich pods with tracking ad metadata\n if (avail.ads && avail.ads.length > 0 && existingAd.pods) {\n avail.ads.forEach((trackingAd, adIndex) => {\n if (existingAd.pods[adIndex]) {\n // Update existing pod\n existingAd.pods[adIndex].title = trackingAd.adTitle;\n existingAd.pods[adIndex].creativeId = trackingAd.adId;\n existingAd.pods[adIndex].trackingStartTime = trackingAd.startTimeInSeconds;\n existingAd.pods[adIndex].trackingDuration = trackingAd.durationInSeconds;\n } else {\n // Add new pod from tracking\n existingAd.pods.push({\n startTime: trackingAd.startTimeInSeconds,\n duration: trackingAd.durationInSeconds,\n endTime: trackingAd.startTimeInSeconds + trackingAd.durationInSeconds,\n title: trackingAd.adTitle,\n creativeId: trackingAd.adId,\n hasFiredStart: false,\n hasFiredQ1: false,\n hasFiredQ2: false,\n hasFiredQ3: false,\n });\n }\n });\n }\n } else {\n // Add new ad from tracking\n newAds.push({\n id: avail.availId,\n startTime: firstAd.startTimeInSeconds,\n duration: avail.durationInSeconds,\n endTime: firstAd.startTimeInSeconds + avail.durationInSeconds,\n title: firstAd.adTitle,\n creativeId: firstAd.adId,\n source: 'tracking-api',\n confirmedByTracking: true,\n hasFiredStart: false,\n hasFiredEnd: false,\n hasFiredAdStart: false,\n hasFiredQ1: false,\n hasFiredQ2: false,\n hasFiredQ3: false,\n pods: avail.ads.map((ad) => ({\n startTime: ad.startTimeInSeconds,\n duration: ad.durationInSeconds,\n endTime: ad.startTimeInSeconds + ad.durationInSeconds,\n title: ad.adTitle,\n creativeId: ad.adId,\n hasFiredStart: false,\n hasFiredQ1: false,\n hasFiredQ2: false,\n hasFiredQ3: false,\n })),\n });\n }\n });\n\n return newAds;\n}\n\n/**\n * Extracts the HLS live target duration from manifest text.\n * In HLS, EXT-X-TARGETDURATION is the closest manifest-level hint for refresh cadence.\n */\nexport function extractHlsTargetDurationSeconds(manifestText) {\n const match = manifestText.match(REGEX_HLS_TARGET_DURATION);\n return match ? parseInt(match[1], 10) : null;\n}\n\n/**\n * Extracts the DASH live minimumUpdatePeriod from MPD manifest text.\n * In DASH, minimumUpdatePeriod is the MPD's refresh hint for clients polling a live manifest.\n */\nexport function extractDashMinimumUpdatePeriodSeconds(manifestText) {\n const match = manifestText.match(REGEX_DASH_MINIMUM_UPDATE_PERIOD);\n return match ? parseIsoDuration(match[1]) : null;\n}\n\nasync function fetchTextOrThrow(url) {\n const response = await fetch(url, { credentials: 'include' });\n\n if (response.ok === false) {\n throw new Error(\n `Manifest request failed: ${response.status || 'unknown'} ${\n response.statusText || 'Request failed'\n }`\n );\n }\n\n return await response.text();\n}\n\n/**\n * Fetches HLS master manifest and returns master text + first media playlist URL\n */\nexport async function fetchHlsMasterManifest(manifestUrl) {\n const masterText = await fetchTextOrThrow(manifestUrl);\n\n // Find first media playlist URL\n const lines = masterText.split('\\n');\n let mediaPlaylistUrl = null;\n\n for (const line of lines) {\n if (!line.startsWith(HLS_TAG_PREFIX) && line.includes(HLS_MANIFEST_EXTENSION)) {\n mediaPlaylistUrl = new URL(line.trim(), manifestUrl).href;\n break;\n }\n }\n\n return { masterText, mediaPlaylistUrl };\n}\n\n/**\n * Fetches HLS media playlist and returns text\n */\nexport async function fetchHlsMediaPlaylist(playlistUrl) {\n return await fetchTextOrThrow(playlistUrl);\n}\n\n/**\n * Fetches DASH MPD manifest and returns XML text\n */\nexport async function fetchDashManifest(manifestUrl) {\n return await fetchTextOrThrow(manifestUrl);\n}\n\n/**\n * Parses ISO 8601 duration string to seconds\n * e.g. \"PT1M14S\" → 74, \"PT10S\" → 10, \"PT12M54S\" → 774\n */\nexport function parseIsoDuration(durationStr) {\n if (!durationStr) return 0;\n const match = durationStr.match(REGEX_ISO_8601_DURATION);\n if (!match) return 0;\n const hours = parseFloat(match[1] || 0);\n const minutes = parseFloat(match[2] || 0);\n const seconds = parseFloat(match[3] || 0);\n return hours * 3600 + minutes * 60 + seconds;\n}\n\n/**\n * Parses DASH MPD for ad breaks — supports both MULTI_PERIOD and SINGLE_PERIOD formats.\n *\n * MULTI_PERIOD (MediaTailor default): ad breaks are separate <Period> elements\n * whose <BaseURL> points to segments.mediatailor.amazonaws.com.\n *\n * SINGLE_PERIOD: the entire stream is one period; ads are signalled via\n * SCTE-35 <EventStream> elements inside that period.\n */\nexport function parseDashManifestForAdBreaks(xmlText) {\n const parser = new DOMParser();\n const xml = parser.parseFromString(xmlText, 'text/xml');\n const ads = [];\n\n const parserError = xml.querySelector('parsererror');\n if (parserError) {\n console.error('[MT] DASH XML parse error:', parserError.textContent);\n return ads;\n }\n\n const periods = xml.querySelectorAll('Period');\n console.log(`[MT] Found ${periods.length} Period(s) in DASH manifest`);\n\n if (periods.length > 1) {\n // ── MULTI_PERIOD ──────────────────────────────────────────────────────────\n // Ad periods are identified by a BaseURL pointing to the MediaTailor CDN.\n periods.forEach((period) => {\n const baseUrlEl = period.querySelector('BaseURL');\n const baseUrl = baseUrlEl ? baseUrlEl.textContent.trim() : '';\n\n if (!baseUrl.includes(MT_SEGMENT_PATTERN)) {\n return; // content period\n }\n\n const periodId = period.getAttribute('id') || '';\n const startTime = parseIsoDuration(period.getAttribute('start') || 'PT0S');\n const duration = parseIsoDuration(period.getAttribute('duration') || '');\n\n if (duration < MIN_AD_DURATION) {\n console.log(`[MT] Skipping period ${periodId} - duration too short (${duration}s)`);\n return;\n }\n\n console.log(`[MT] Ad period detected: ${periodId}`, { startTime, duration });\n\n ads.push({\n id: periodId,\n startTime,\n duration,\n endTime: startTime + duration,\n source: AD_SOURCE.MANIFEST_CUE,\n confirmedByTracking: false,\n hasFiredStart: false,\n hasFiredEnd: false,\n hasFiredAdStart: false,\n hasFiredQ1: false,\n hasFiredQ2: false,\n hasFiredQ3: false,\n pods: [],\n });\n });\n } else {\n // ── SINGLE_PERIOD ─────────────────────────────────────────────────────────\n // Ads are signalled via SCTE-35 EventStream elements within the single period.\n const eventStreams = xml.querySelectorAll(\n DASH_SCTE35_EVENT_STREAM_SELECTOR,\n );\n\n console.log(`[MT] Found ${eventStreams.length} SCTE-35 EventStream(s) in single-period manifest`);\n\n eventStreams.forEach((stream) => {\n const timescale = parseFloat(stream.getAttribute('timescale') || '1');\n\n stream.querySelectorAll('Event').forEach((event) => {\n const presentationTime = parseFloat(event.getAttribute('presentationTime') || 0);\n const duration = parseFloat(event.getAttribute('duration') || 0);\n const eventId =\n event.getAttribute('id') ||\n `${SCTE35_SCHEME_MARKER}-${presentationTime}`;\n\n const startTime = timescale !== 1 ? presentationTime / timescale : presentationTime;\n const durationSeconds = timescale !== 1 ? duration / timescale : duration;\n\n if (durationSeconds < MIN_AD_DURATION) {\n console.log(`[MT] Skipping event ${eventId} - duration too short (${durationSeconds}s)`);\n return;\n }\n\n console.log(`[MT] SCTE-35 event detected: ${eventId}`, { startTime, durationSeconds });\n\n ads.push({\n id: eventId,\n startTime,\n duration: durationSeconds,\n endTime: startTime + durationSeconds,\n source: AD_SOURCE.MANIFEST_CUE,\n confirmedByTracking: false,\n hasFiredStart: false,\n hasFiredEnd: false,\n hasFiredAdStart: false,\n hasFiredQ1: false,\n hasFiredQ2: false,\n hasFiredQ3: false,\n pods: [],\n });\n });\n });\n }\n\n console.log(`[MT] Parsed ${ads.length} valid ad break(s) from DASH manifest`);\n return ads;\n}\n\n/**\n * Fetches tracking metadata from AWS MediaTailor Tracking API\n * @param {string} trackingEndpointUrl - The tracking API URL\n * @param {number} timeout - Timeout in milliseconds\n * @param {AbortSignal} externalSignal - Optional external abort signal for cancellation\n */\nexport async function getTrackingMetadata(trackingEndpointUrl, timeout = 8000, externalSignal = null) {\n // Create AbortController for timeout support\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n // If external signal provided, listen for its abort event\n const abortHandler = () => controller.abort();\n if (externalSignal) {\n externalSignal.addEventListener('abort', abortHandler);\n }\n\n try {\n const response = await fetch(`${trackingEndpointUrl}?t=${Date.now()}`, {\n signal: controller.signal,\n credentials: 'include',\n });\n\n clearTimeout(timeoutId);\n if (externalSignal) {\n externalSignal.removeEventListener('abort', abortHandler);\n }\n\n if (!response.ok) {\n throw new Error(`Tracking API error: ${response.status}`);\n }\n\n return await response.json();\n } catch (error) {\n clearTimeout(timeoutId);\n if (externalSignal) {\n externalSignal.removeEventListener('abort', abortHandler);\n }\n throw error;\n }\n}\n\n/**\n * Extracts first media playlist URL from HLS master manifest text\n */\nexport function extractMediaPlaylistUrl(masterText, baseUrl) {\n const lines = masterText.split('\\n');\n\n for (const line of lines) {\n if (\n !line.startsWith(HLS_TAG_PREFIX) &&\n line.includes(HLS_MANIFEST_EXTENSION)\n ) {\n return new URL(line.trim(), baseUrl).href;\n }\n }\n\n return null;\n}\n","/* eslint-disable no-undef */\nimport nrvideo from '@newrelic/video-core';\nimport VideojsAdsTracker from './videojs-ads';\nimport {\n DEFAULT_LIVE_POLL_INTERVAL_MS,\n HLS_MIME_TYPE,\n MEDIATAILOR_HOST_MARKER,\n SCTE35_SCHEME_MARKER,\n TRACKING_API_TIMEOUT_MS,\n STREAM_TYPE,\n MANIFEST_TYPE,\n} from './utils/mt-constants.js';\nimport {\n getTimestamp,\n detectManifestFormatFromUrl,\n detectPlaybackStreamType,\n buildTrackingEndpointUrl,\n determineAdPosition,\n getQuartilesToFire,\n findActiveAdBreak,\n findActivePod,\n mergeAdSchedules,\n parseHlsManifestForAdBreaks,\n parseDashManifestForAdBreaks,\n detectAdBreaksFromVhsPlaylist,\n enrichAdScheduleWithTrackingMetadata,\n extractHlsTargetDurationSeconds,\n extractDashMinimumUpdatePeriodSeconds,\n fetchHlsMasterManifest,\n fetchHlsMediaPlaylist,\n fetchDashManifest,\n getTrackingMetadata,\n} from './utils/mt.js';\n\n// Handle both direct and default export from video-core\nconst nrvideoCore = nrvideo.default || nrvideo;\nconst Log = nrvideoCore.Log;\n\n/**\n * AWS MediaTailor Ad Tracker\n * Tracks ads from AWS MediaTailor SSAI streams (HLS/DASH)\n *\n * Features:\n * - Client-side ad detection from manifest markers (CUE-OUT/CUE-IN)\n * - Pod-level tracking (multiple ads within one break)\n * - VOD and Live stream support\n * - Zero race conditions via VHS player hooks\n * - Tracking API metadata enrichment\n */\nexport default class MediaTailorAdsTracker extends VideojsAdsTracker {\n /**\n * Checks if tracker should be used for this player source\n */\n static isUsing(player) {\n return (\n player &&\n typeof player.currentSrc === 'function' &&\n player.currentSrc().includes(MEDIATAILOR_HOST_MARKER)\n );\n }\n\n /**\n * Returns tracker name for New Relic instrumentation\n */\n getTrackerName() {\n return 'aws-media-tailor';\n }\n\n /**\n * Returns player version (MediaTailor doesn't have version)\n */\n getPlayerVersion() {\n return 'MediaTailor';\n }\n\n /**\n * Override to return the correct ad position from our ad schedule\n * This overrides video-core's default logic which only checks if content started\n */\n getAdPosition() {\n if (this.currentAdBreak && this.currentAdBreak.adPosition) {\n return this.currentAdBreak.adPosition;\n }\n return super.getAdPosition();\n }\n\n constructor(player, options = {}) {\n super(player);\n\n // Initialize state\n this.streamType = null; // 'vod' or 'live'\n this.manifestFormat = null; // 'hls' or 'dash'\n this.playbackManifestUrl = player.currentSrc();\n\n // Ad tracking state\n this.adSchedule = [];\n this.currentAdBreak = null;\n this.currentAdPod = null;\n this.hasEndedContent = false;\n\n // Disposal and abort state\n this.isDisposed = false;\n this.trackingAbortController = null;\n this.manifestAbortController = null;\n this.isFetchingTracking = false;\n this.isFetchingManifest = false;\n\n // Tracking API state\n this.trackingEndpointUrl = null;\n this.hasAttemptedTrackingFetch = false;\n this.trackingFetchRetries = 0;\n this.maxTrackingRetries = 1;\n\n // Live polling timers\n this.manifestPollTimer = null;\n this.trackingPollTimer = null;\n this.liveRefreshIntervalSeconds = null;\n\n // Manifest parsing cache\n this.mediaPlaylistUrl = null;\n this.lastMediaPlaylistText = null;\n\n console.log(`[MT - ${getTimestamp()}] MediaTailorAdsTracker initialized`, {\n endpoint: this.playbackManifestUrl,\n trackingAPITimeout: TRACKING_API_TIMEOUT_MS,\n });\n\n this.manifestFormat = detectManifestFormatFromUrl(this.playbackManifestUrl);\n console.log(\n `[MT - ${getTimestamp()}] Manifest type: ${this.manifestFormat.toUpperCase()}`,\n );\n\n this.player.one('loadedmetadata', () => {\n this.streamType = detectPlaybackStreamType(this.player.duration());\n console.log(\n `[MT - ${getTimestamp()}] Stream type: ${this.streamType.toUpperCase()}`,\n );\n this.initializeTracking();\n });\n }\n\n /**\n * Initializes tracking based on detected stream type\n */\n initializeTracking() {\n console.log(\n `[MT - ${getTimestamp()}] Initializing ${this.manifestFormat.toUpperCase()} ${this.streamType.toUpperCase()} tracking`,\n );\n\n // Extract tracking URL from sessionized URL\n this.trackingEndpointUrl = buildTrackingEndpointUrl(this.playbackManifestUrl);\n if (this.trackingEndpointUrl) {\n console.log(\n `[MT - ${getTimestamp()}] Tracking URL extracted:`,\n this.trackingEndpointUrl,\n );\n } else {\n console.warn(\n `[MT - ${getTimestamp()}] No sessionId found - user must initialize session externally`,\n );\n }\n\n // Set up format-specific tracking\n if (this.streamType === STREAM_TYPE.VOD) {\n this.setupVODTracking();\n } else {\n this.setupLiveTracking();\n }\n }\n\n /**\n * Register listeners (overrides parent class method)\n */\n registerListeners() {\n super.registerListeners();\n\n // Bind before registering — super(player) calls registerListeners() before\n // the constructor body runs, so bindings must happen here, not in the constructor.\n this.onPause = this.onPause.bind(this);\n this.onPlaying = this.onPlaying.bind(this);\n this.onSeeking = this.onSeeking.bind(this);\n this.onSeeked = this.onSeeked.bind(this);\n this.onWaiting = this.onWaiting.bind(this);\n this.onEnded = this.onEnded.bind(this);\n this.onTimeUpdate = this.onTimeUpdate.bind(this);\n\n this.player.on('pause', this.onPause);\n this.player.on('playing', this.onPlaying);\n this.player.on('seeking', this.onSeeking);\n this.player.on('seeked', this.onSeeked);\n this.player.on('waiting', this.onWaiting);\n this.player.on('ended', this.onEnded);\n this.player.on('timeupdate', this.onTimeUpdate);\n console.log(`[MT - ${getTimestamp()}] Event listeners registered`);\n }\n\n /**\n * Unregister listeners (overrides parent class method)\n */\n unregisterListeners() {\n super.unregisterListeners();\n this.player.off('pause', this.onPause);\n this.player.off('playing', this.onPlaying);\n this.player.off('seeking', this.onSeeking);\n this.player.off('seeked', this.onSeeked);\n this.player.off('waiting', this.onWaiting);\n this.player.off('ended', this.onEnded);\n this.player.off('timeupdate', this.onTimeUpdate);\n this.stopLivePolling();\n }\n\n /**\n * Stops live polling timers\n */\n stopLivePolling() {\n if (this.manifestPollTimer) {\n clearTimeout(this.manifestPollTimer);\n this.manifestPollTimer = null;\n }\n\n if (this.trackingPollTimer) {\n clearInterval(this.trackingPollTimer);\n this.trackingPollTimer = null;\n }\n }\n\n /**\n * Sets up VOD tracking (single parse, no polling)\n */\n setupVODTracking() {\n console.log(`[MT - ${getTimestamp()}] VOD mode: Single manifest parse`);\n this.hookPlayerManifest();\n }\n\n /**\n * Sets up Live tracking (continuous polling)\n */\n setupLiveTracking() {\n console.log(`[MT - ${getTimestamp()}] Live mode: Continuous polling`);\n this.hookPlayerManifest();\n\n const pollingInterval = this.getLiveRefreshIntervalMs();\n\n // Start polling timers\n this.manifestPollTimer = setInterval(() => {\n this.pollManifestForNewAds();\n }, pollingInterval);\n\n this.trackingPollTimer = setInterval(() => {\n this.getAndProcessTrackingMetadata();\n }, pollingInterval);\n\n console.log(`[MT - ${getTimestamp()}] Live polling started`, {\n pollingInterval,\n });\n }\n\n /**\n * Returns the live polling interval in milliseconds\n */\n getLiveRefreshIntervalMs() {\n return this.liveRefreshIntervalSeconds\n ? this.liveRefreshIntervalSeconds * 1000\n : DEFAULT_LIVE_POLL_INTERVAL_MS;\n }\n\n /**\n * Updates live polling intervals after manifest metadata is detected\n */\n restartLivePollingTimers() {\n if (!this.liveRefreshIntervalSeconds) return;\n\n const newInterval = this.getLiveRefreshIntervalMs();\n console.log(\n `[MT - ${getTimestamp()}] Updating live polling interval: ${this.liveRefreshIntervalSeconds}s`,\n );\n\n // Restart timers with new interval\n if (this.manifestPollTimer) clearInterval(this.manifestPollTimer);\n if (this.trackingPollTimer) clearInterval(this.trackingPollTimer);\n\n this.manifestPollTimer = setInterval(() => {\n this.pollManifestForNewAds();\n }, newInterval);\n\n this.trackingPollTimer = setInterval(() => {\n this.getAndProcessTrackingMetadata();\n }, newInterval);\n }\n\n /**\n * Hooks into player's manifest loading (zero race condition)\n * Supports: VHS, Native HLS, contrib-hls, Shaka, dash.js\n */\n hookPlayerManifest() {\n const tech = this.player.tech({ IWillNotUseThisInPlugins: true });\n if (!tech) {\n console.log(`[MT - ${getTimestamp()}] No tech - using fallback fetch`);\n this.getManifestDirectly();\n return;\n }\n\n // Try hooks in order of preference\n if (this.manifestFormat === MANIFEST_TYPE.HLS) {\n if (\n this.hookHLSViaVHS(tech) ||\n this.hookHLSViaNative(tech) ||\n this.hookHLSViaContribHls(tech)\n ) {\n return; // Successfully hooked\n }\n } else if (this.manifestFormat === MANIFEST_TYPE.DASH) {\n if (this.hookDASHViaShaka(tech) || this.hookDASHViaDashJs(tech)) {\n return; // Successfully hooked\n }\n }\n\n // Fallback: Direct manifest fetch\n console.log(\n `[MT - ${getTimestamp()}] Using fallback: direct manifest fetch`,\n );\n this.getManifestDirectly();\n }\n\n /**\n * Hook: VHS (videojs-http-streaming) - Video.js 7.0+\n */\n hookHLSViaVHS(tech) {\n if (!tech.vhs || !tech.vhs.playlists) return false;\n\n console.log(`[MT - ${getTimestamp()}] Hooked: VHS`);\n\n // Parse already-loaded playlist\n const currentPlaylist = tech.vhs.playlists.media();\n if (\n currentPlaylist &&\n currentPlaylist.segments &&\n currentPlaylist.segments.length > 0\n ) {\n console.log(`[MT - ${getTimestamp()}] Parsing existing playlist`);\n this.parseVhsPlaylistForAdBreaks(currentPlaylist);\n }\n\n // Hook future playlist loads\n tech.vhs.on('loadedplaylist', () => {\n const playlist = tech.vhs.playlists.media();\n if (playlist) {\n this.parseVhsPlaylistForAdBreaks(playlist);\n }\n });\n\n return true;\n }\n\n /**\n * Hook: Native HLS (Safari)\n */\n hookHLSViaNative(tech) {\n // Safari uses native HLS - can't hook directly\n if (\n tech.el_ &&\n tech.el_.canPlayType &&\n tech.el_.canPlayType(HLS_MIME_TYPE)\n ) {\n console.log(\n `[MT - ${getTimestamp()}] Native HLS detected - using fallback`,\n );\n this.getManifestDirectly();\n return true;\n }\n return false;\n }\n\n /**\n * Hook: videojs-contrib-hls (legacy Video.js 5.x/6.x)\n */\n hookHLSViaContribHls(tech) {\n if (!tech.hls || !tech.hls.playlists) return false;\n\n console.log(`[MT - ${getTimestamp()}] Hooked: contrib-hls (legacy)`);\n\n // Parse already-loaded playlist\n const currentPlaylist = tech.hls.playlists.media();\n if (\n currentPlaylist &&\n currentPlaylist.segments &&\n currentPlaylist.segments.length > 0\n ) {\n this.parseVhsPlaylistForAdBreaks(currentPlaylist);\n }\n\n // Hook future playlist loads\n tech.hls.on('loadedplaylist', () => {\n const playlist = tech.hls.playlists.media();\n if (playlist) {\n this.parseVhsPlaylistForAdBreaks(playlist);\n }\n });\n\n return true;\n }\n\n /**\n * Hook: Shaka Player (DASH)\n */\n hookDASHViaShaka(tech) {\n if (!tech.shakaPlayer) return false;\n\n console.log(`[MT - ${getTimestamp()}] Hooked: Shaka Player`);\n tech.shakaPlayer.addEventListener('emsg', (event) => {\n this.handleDASHEmsgEvent(event);\n });\n\n return true;\n }\n\n /**\n * Hook: dash.js (DASH)\n */\n hookDASHViaDashJs(tech) {\n if (!tech.dash || !tech.dash.on) return false;\n\n console.log(`[MT - ${getTimestamp()}] Hooked: dash.js`);\n tech.dash.on('EVENT_MODE_ON_RECEIVE', (event) => {\n this.handleDASHEventStream(event);\n });\n\n return true;\n }\n\n /**\n * Fetches manifest directly (fallback when hooks unavailable)\n */\n async getManifestDirectly() {\n console.log(\n `[MT - ${getTimestamp()}] Fallback: fetching manifest directly`,\n );\n\n try {\n const manifestUrl = this.playbackManifestUrl;\n\n if (this.manifestFormat === MANIFEST_TYPE.HLS) {\n await this.fetchAndParseHlsManifest(manifestUrl);\n } else if (this.manifestFormat === MANIFEST_TYPE.DASH) {\n await this.fetchAndParseDashManifest(manifestUrl);\n }\n } catch (error) {\n console.log(`[MT - ${getTimestamp()}] Fallback fetch error:`, error);\n }\n }\n\n /**\n * Fetches and parses HLS master + media manifest\n */\n async fetchAndParseHlsManifest(manifestUrl) {\n try {\n console.log(`[MT - ${getTimestamp()}] Fetching HLS master manifest`);\n\n // Fetch master manifest\n const { mediaPlaylistUrl } = await fetchHlsMasterManifest(manifestUrl);\n\n if (!mediaPlaylistUrl) {\n console.log(`[MT - ${getTimestamp()}] No media playlist found`);\n return;\n }\n\n console.log(`[MT - ${getTimestamp()}] Fetching media playlist`);\n\n // Fetch media playlist\n const mediaText = await fetchHlsMediaPlaylist(mediaPlaylistUrl);\n\n const hlsTargetDurationSeconds = extractHlsTargetDurationSeconds(mediaText);\n this.updateLiveRefreshIntervalFromManifest(\n hlsTargetDurationSeconds,\n 'hls target duration',\n );\n\n // Parse for ads\n const ads = parseHlsManifestForAdBreaks(mediaText);\n if (ads.length > 0) {\n console.log(\n `[MT - ${getTimestamp()}] Detected ${ads.length} ad break(s)`,\n );\n this.mergeNewAds(ads);\n }\n } catch (error) {\n console.log(`[MT - ${getTimestamp()}] HLS fetch error:`, error);\n }\n }\n\n /**\n * Fetches and parses DASH MPD manifest\n */\n async fetchAndParseDashManifest(manifestUrl) {\n try {\n console.log(`[MT - ${getTimestamp()}] Fetching DASH manifest`);\n\n // Fetch DASH manifest\n const xmlText = await fetchDashManifest(manifestUrl);\n\n const dashMinimumUpdatePeriodSeconds =\n extractDashMinimumUpdatePeriodSeconds(xmlText);\n this.updateLiveRefreshIntervalFromManifest(\n dashMinimumUpdatePeriodSeconds,\n 'dash minimumUpdatePeriod',\n );\n\n // Parse for ads\n const ads = parseDashManifestForAdBreaks(xmlText);\n\n console.log(\n `[MT - ${getTimestamp()}] DASH: ${ads.length} ad break(s) found`,\n );\n\n if (ads.length > 0) {\n this.mergeNewAds(ads); // also triggers tracking fetch\n } else if (\n this.streamType === STREAM_TYPE.VOD &&\n this.trackingEndpointUrl &&\n !this.hasAttemptedTrackingFetch\n ) {\n // No SCTE-35 markers in manifest - fall back to tracking API directly\n console.log(\n `[MT - ${getTimestamp()}] DASH: no manifest cues, fetching tracking API`,\n );\n this.hasAttemptedTrackingFetch = true;\n this.getAndProcessTrackingMetadata();\n }\n } catch (error) {\n console.log(`[MT - ${getTimestamp()}] DASH fetch error:`, error);\n }\n }\n\n /**\n * Handles DASH emsg events from Shaka Player\n */\n handleDASHEmsgEvent(event) {\n console.log(`[MT - ${getTimestamp()}] DASH emsg event:`, event);\n\n try {\n // Shaka Player emits emsg events with event.detail containing the emsg box data\n const emsgData = event.detail;\n\n if (!emsgData) {\n console.log(`[MT - ${getTimestamp()}] No emsg data in event`);\n return;\n }\n\n // Check if this is a SCTE-35 event\n // schemeIdUri for SCTE-35: urn:scte:scte35:2013:bin or urn:scte:scte35:2014:xml\n const schemeIdUri = emsgData.schemeIdUri || '';\n\n if (!schemeIdUri.includes(SCTE35_SCHEME_MARKER)) {\n console.log(\n `[MT - ${getTimestamp()}] Non-SCTE-35 emsg, skipping:`,\n schemeIdUri,\n );\n return;\n }\n\n console.log(`[MT - ${getTimestamp()}] SCTE-35 emsg detected:`, {\n schemeIdUri: emsgData.schemeIdUri,\n value: emsgData.value,\n timescale: emsgData.timescale,\n presentationTime: emsgData.presentationTime,\n presentationTimeDelta: emsgData.presentationTimeDelta,\n eventDuration: emsgData.eventDuration,\n });\n\n // Calculate start time in seconds\n const timescale = emsgData.timescale || 1;\n const presentationTime = emsgData.presentationTime || 0;\n const eventDuration = emsgData.eventDuration || 0;\n\n const startTime = presentationTime / timescale;\n const duration = eventDuration / timescale;\n\n // Parse SCTE-35 message data\n const messageData = emsgData.messageData;\n\n if (messageData && duration > 0) {\n const adBreak = {\n id: `dash-emsg-${startTime}`,\n startTime: startTime,\n duration: duration,\n endTime: startTime + duration,\n source: 'dash-emsg',\n confirmedByTracking: false,\n hasFiredStart: false,\n hasFiredEnd: false,\n hasFiredAdStart: false,\n pods: [],\n };\n\n console.log(\n `[MT - ${getTimestamp()}] Adding ad break from DASH emsg:`,\n adBreak,\n );\n this.mergeNewAds([adBreak]);\n }\n } catch (error) {\n console.log(\n `[MT - ${getTimestamp()}] Error parsing DASH emsg event:`,\n error,\n );\n }\n }\n\n /**\n * Handles DASH event stream from dash.js\n */\n handleDASHEventStream(event) {\n console.log(`[MT - ${getTimestamp()}] DASH event stream:`, event);\n\n try {\n // dash.js emits events with different structure\n const eventData = event.event || event;\n\n if (!eventData) {\n console.log(`[MT - ${getTimestamp()}] No event data`);\n return;\n }\n\n // Check if this is a SCTE-35 event\n const schemeIdUri = eventData.schemeIdUri || '';\n\n if (!schemeIdUri.includes(SCTE35_SCHEME_MARKER)) {\n console.log(\n `[MT - ${getTimestamp()}] Non-SCTE-35 event, skipping:`,\n schemeIdUri,\n );\n return;\n }\n\n console.log(`[MT - ${getTimestamp()}] SCTE-35 event stream detected:`, {\n id: eventData.id,\n schemeIdUri: eventData.schemeIdUri,\n presentationTime: eventData.presentationTime,\n duration: eventData.duration,\n messageData: eventData.messageData,\n });\n\n // Calculate timing\n const startTime = parseFloat(eventData.presentationTime || 0);\n const duration = parseFloat(eventData.duration || 0);\n\n if (duration > 0) {\n const adBreak = {\n id: eventData.id || `dash-event-${startTime}`,\n startTime: startTime,\n duration: duration,\n endTime: startTime + duration,\n source: 'dash-event-stream',\n confirmedByTracking: false,\n hasFiredStart: false,\n hasFiredEnd: false,\n hasFiredAdStart: false,\n pods: [],\n };\n\n console.log(\n `[MT - ${getTimestamp()}] Adding ad break from DASH event stream:`,\n adBreak,\n );\n this.mergeNewAds([adBreak]);\n }\n } catch (error) {\n console.log(\n `[MT - ${getTimestamp()}] Error parsing DASH event stream:`,\n error,\n );\n }\n }\n\n /**\n * Parses VHS playlist object for ads\n */\n parseVhsPlaylistForAdBreaks(playlist) {\n console.log(\n `[MT - ${getTimestamp()}] Parsing VHS playlist (${\n playlist.segments?.length || 0\n } segments)`,\n );\n\n if (!playlist.segments || playlist.segments.length === 0) {\n console.log(`[MT - ${getTimestamp()}] No segments in playlist`);\n return;\n }\n\n this.updateLiveRefreshIntervalFromManifest(\n playlist.targetDuration,\n 'vhs target duration',\n );\n\n // VHS strips CUE tags - detect via discontinuityStarts + MediaTailor segments\n const ads = detectAdBreaksFromVhsPlaylist(playlist);\n\n if (ads.length > 0) {\n console.log(\n `[MT - ${getTimestamp()}] VHS detected ${ads.length} ad break(s), ${ads.reduce(\n (sum, ab) => sum + ab.pods.length,\n 0,\n )} pod(s)`,\n );\n this.mergeNewAds(ads);\n } else {\n console.log(`[MT - ${getTimestamp()}] No ads detected in VHS playlist`);\n }\n }\n\n /**\n * Polls manifest for new ads (Live streams only)\n */\n async pollManifestForNewAds() {\n if (this.isDisposed) return;\n if (this.streamType !== STREAM_TYPE.LIVE) return;\n\n if (this.isFetchingManifest) {\n console.log(\n `[MT - ${getTimestamp()}] Manifest fetch already in progress, skipping`,\n );\n return;\n }\n\n this.isFetchingManifest = true;\n\n try {\n const tech = this.player.tech({ IWillNotUseThisInPlugins: true });\n if (tech && tech.vhs) {\n const playlist = tech.vhs.playlists.media();\n if (playlist) {\n this.parseVhsPlaylistForAdBreaks(playlist);\n }\n } else if (this.manifestFormat === MANIFEST_TYPE.DASH) {\n await this.fetchAndParseDashManifest(this.playbackManifestUrl);\n }\n } catch (error) {\n console.log(`[MT - ${getTimestamp()}] Manifest poll error:`, error);\n } finally {\n this.isFetchingManifest = false;\n }\n }\n\n /**\n * Merges new ads into schedule (deduplicates)\n */\n mergeNewAds(newAds) {\n this.adSchedule = mergeAdSchedules(this.adSchedule, newAds);\n\n console.log(\n `[MT - ${getTimestamp()}] Ad schedule: ${this.adSchedule.length} ad break(s)`,\n );\n\n // VOD: Fetch tracking metadata after first manifest parse (AWS best practice)\n if (\n this.streamType === STREAM_TYPE.VOD &&\n this.trackingEndpointUrl &&\n !this.hasAttemptedTrackingFetch\n ) {\n this.hasAttemptedTrackingFetch = true;\n console.log(\n `[MT - ${getTimestamp()}] Fetching tracking metadata (first manifest parse)`,\n );\n this.getAndProcessTrackingMetadata();\n }\n }\n\n /**\n * Updates live polling cadence from manifest-derived metadata\n */\n updateLiveRefreshIntervalFromManifest(intervalSeconds, source) {\n if (\n this.streamType !== STREAM_TYPE.LIVE ||\n !intervalSeconds ||\n intervalSeconds <= 0\n ) {\n return;\n }\n\n if (this.liveRefreshIntervalSeconds === intervalSeconds) {\n return;\n }\n\n this.liveRefreshIntervalSeconds = intervalSeconds;\n console.log(\n `[MT - ${getTimestamp()}] Derived live polling interval from ${source}: ${intervalSeconds}s`,\n );\n\n if (this.manifestPollTimer || this.trackingPollTimer) {\n this.restartLivePollingTimers();\n }\n }\n\n /**\n * Fetches and processes tracking metadata from AWS MediaTailor Tracking API\n */\n async getAndProcessTrackingMetadata() {\n if (this.isDisposed || !this.trackingEndpointUrl) return;\n\n if (this.isFetchingTracking) {\n console.log(\n `[MT - ${getTimestamp()}] Tracking fetch already in progress, skipping`,\n );\n return;\n }\n\n this.isFetchingTracking = true;\n\n try {\n console.log(`[MT - ${getTimestamp()}] Fetching tracking metadata`);\n\n this.trackingAbortController = new AbortController();\n\n const data = await getTrackingMetadata(\n this.trackingEndpointUrl,\n TRACKING_API_TIMEOUT_MS,\n this.trackingAbortController.signal,\n );\n\n if (this.isDisposed) {\n console.log(\n `[MT - ${getTimestamp()}] Disposed during tracking fetch, ignoring result`,\n );\n return;\n }\n\n if (data.avails && data.avails.length > 0) {\n console.log(\n `[MT - ${getTimestamp()}] Enriching with ${data.avails.length} avail(s)`,\n );\n this.enrichWithTrackingMetadata(data.avails);\n this.trackingFetchRetries = 0;\n } else {\n console.log(`[MT - ${getTimestamp()}] Tracking API returned 0 avails`);\n }\n } catch (error) {\n if (error.name === 'AbortError' || this.isDisposed) {\n console.log(`[MT - ${getTimestamp()}] Tracking fetch aborted`);\n return;\n }\n\n console.log(\n `[MT - ${getTimestamp()}] Tracking API error: ${error.message}`,\n error,\n );\n\n if (this.trackingFetchRetries < this.maxTrackingRetries) {\n this.trackingFetchRetries++;\n console.log(\n `[MT - ${getTimestamp()}] Retrying tracking fetch (${this.trackingFetchRetries}/${this.maxTrackingRetries})`,\n );\n this.isFetchingTracking = false;\n await this.getAndProcessTrackingMetadata();\n return;\n }\n\n console.log(\n `[MT - ${getTimestamp()}] Max retries reached, continuing with manifest data only`,\n );\n } finally {\n this.isFetchingTracking = false;\n this.trackingAbortController = null;\n }\n }\n\n /**\n * Enriches ad schedule with tracking API metadata\n */\n enrichWithTrackingMetadata(avails) {\n const newAds = enrichAdScheduleWithTrackingMetadata(this.adSchedule, avails);\n\n // Add any new ads from tracking\n if (newAds.length > 0) {\n this.adSchedule.push(...newAds);\n this.adSchedule.sort((a, b) => a.startTime - b.startTime);\n }\n\n console.log(\n `[MT - ${getTimestamp()}] Enrichment complete: ${\n this.adSchedule.length\n } ad break(s)`,\n );\n\n // Log enriched schedule with full details\n console.log(\n `[MT - ${getTimestamp()}] Enriched schedule:`,\n this.adSchedule.map((ab) => ({\n id: ab.id,\n startTime: ab.startTime,\n endTime: ab.endTime,\n duration: ab.duration,\n title: ab.title,\n podCount: ab.pods.length,\n pods: ab.pods.map((p) => ({\n title: p.title,\n startTime: p.startTime,\n endTime: p.endTime,\n duration: p.duration,\n })),\n })),\n );\n\n // Log current player time for debugging\n console.log(\n `[MT - ${getTimestamp()}] Current player time: ${this.player.currentTime()}s`,\n );\n }\n\n /**\n * Tracks quartile events for active pod/ad\n */\n trackQuartiles(adObject, progress) {\n if (!adObject.duration || adObject.duration <= 0) return;\n\n const quartilesToFire = getQuartilesToFire(progress, adObject.duration, {\n q1: adObject.hasFiredQ1,\n q2: adObject.hasFiredQ2,\n q3: adObject.hasFiredQ3,\n });\n\n quartilesToFire.forEach(({ quartile, key }) => {\n console.log(`[MT - ${getTimestamp()}] → AD_QUARTILE ${quartile * 25}%`);\n this.sendAdQuartile({ quartile });\n adObject[`hasFired${key.toUpperCase()}`] = true;\n });\n }\n\n /**\n * Called on timeupdate - main event tracking logic\n */\n onTimeUpdate() {\n const currentTime = this.player.currentTime();\n const activeAdBreak = findActiveAdBreak(this.adSchedule, currentTime);\n\n // Debug logging (only log when schedule exists and every 5 seconds)\n if (\n this.adSchedule.length > 0 &&\n Math.floor(currentTime) % 5 === 0 &&\n Math.floor(currentTime * 10) % 10 === 0\n ) {\n console.log(\n `[MT - ${getTimestamp()}] TimeUpdate: ${currentTime.toFixed(2)}s, Active break: ${\n activeAdBreak ? activeAdBreak.id : 'none'\n }, Schedule count: ${this.adSchedule.length}`,\n );\n }\n\n if (activeAdBreak) {\n // === INSIDE AD BREAK ===\n\n // Fire AD_BREAK_START once\n if (!activeAdBreak.hasFiredStart) {\n this.currentAdBreak = activeAdBreak;\n this.setIsAd(true); // Switch to ad mode\n console.log(\n `[MT - ${getTimestamp()}] setIsAd(true) - Entering ad break`,\n );\n\n // Calculate ad position by finding index based on startTime\n const adBreakIndex = this.adSchedule.findIndex(\n (ad) => Math.abs(ad.startTime - activeAdBreak.startTime) < 0.5,\n );\n const adPosition = determineAdPosition(\n adBreakIndex,\n this.adSchedule.length,\n this.streamType,\n );\n\n // Store position on the ad break for reuse\n activeAdBreak.adPosition = adPosition;\n\n console.log(`[MT - ${getTimestamp()}] → AD_BREAK_START`, {\n startTime: activeAdBreak.startTime,\n duration: activeAdBreak.duration,\n podCount: activeAdBreak.pods?.length || 0,\n position: adPosition,\n breakIndex: adBreakIndex,\n totalBreaks: this.adSchedule.length,\n });\n this.sendAdBreakStart();\n activeAdBreak.hasFiredStart = true;\n }\n\n // Check for pod-level tracking\n if (activeAdBreak.pods && activeAdBreak.pods.length > 0) {\n const activePod = findActivePod(activeAdBreak, currentTime);\n\n if (activePod) {\n // Entering new pod\n if (!this.currentAdPod || this.currentAdPod !== activePod) {\n // End previous pod\n if (this.currentAdPod) {\n console.log(`[MT - ${getTimestamp()}] → AD_END (pod transition)`);\n this.sendEnd();\n }\n\n // Start new pod\n this.currentAdPod = activePod;\n\n console.log(`[MT - ${getTimestamp()}] → AD_START (new pod)`, {\n startTime: activePod.startTime,\n duration: activePod.duration,\n position: activeAdBreak.adPosition,\n });\n\n // NOTE: If the tracking API was slow to respond, the no-pods path\n // (below) will have already called sendStart() on this break.\n // Calling sendStart() again here is intentional — video-core's state\n // machine suppresses duplicate AD_START transitions (AD_START →\n // AD_START is a no-op), so nothing double-fires in New Relic. Once\n // pods are populated by the tracking API, this path takes over and\n // provides pod-level metadata (title, duration, creativeId) for all\n // subsequent events in the break.\n this.sendRequest({\n adPartner: 'aws-mediatailor',\n adPosition: activeAdBreak.adPosition,\n });\n\n this.sendStart({\n adPartner: 'aws-mediatailor',\n adPosition: activeAdBreak.adPosition,\n });\n activePod.hasFiredStart = true;\n }\n\n // Track quartiles for pod\n const podProgress = currentTime - activePod.startTime;\n this.trackQuartiles(activePod, podProgress);\n }\n } else {\n // No pods - treat entire break as single ad\n if (!activeAdBreak.hasFiredAdStart) {\n console.log(`[MT - ${getTimestamp()}] → AD_START (no pods)`, {\n startTime: activeAdBreak.startTime,\n duration: activeAdBreak.duration,\n position: activeAdBreak.adPosition,\n });\n\n // Send AD_REQUEST before AD_START (required sequence)\n this.sendRequest({\n adPartner: 'aws-mediatailor',\n adPosition: activeAdBreak.adPosition,\n });\n\n // Send AD_START\n this.sendStart({\n adPartner: 'aws-mediatailor',\n adPosition: activeAdBreak.adPosition,\n });\n activeAdBreak.hasFiredAdStart = true;\n }\n\n // Track quartiles for entire break\n const adProgress = currentTime - activeAdBreak.startTime;\n this.trackQuartiles(activeAdBreak, adProgress);\n }\n } else if (this.currentAdBreak) {\n // === EXITING AD BREAK ===\n\n // End last pod\n if (this.currentAdPod) {\n console.log(`[MT - ${getTimestamp()}] → AD_END (final pod)`);\n this.sendEnd();\n this.currentAdPod = null;\n }\n\n // End ad break\n if (!this.currentAdBreak.hasFiredEnd) {\n console.log(`[MT - ${getTimestamp()}] → AD_BREAK_END`);\n this.sendAdBreakEnd();\n this.currentAdBreak.hasFiredEnd = true;\n }\n\n this.currentAdBreak = null;\n this.setIsAd(false); // Switch back to content mode\n console.log(`[MT - ${getTimestamp()}] setIsAd(false) - Exiting ad break`);\n\n // Check if video has ended after exiting last ad break\n if (this.player.ended() && !this.hasEndedContent) {\n console.log(\n `[MT - ${getTimestamp()}] Video ended after last ad → CONTENT_END`,\n );\n this.sendContentEnd();\n this.hasEndedContent = true;\n }\n }\n }\n\n /**\n * Sends CONTENT_END event via parent content tracker\n */\n sendContentEnd() {\n if (this.parentTracker) {\n this.parentTracker.sendEnd();\n } else {\n super.sendEnd();\n }\n }\n\n /**\n * Generic handler for ad events - only fires if currently in an ad break\n * @param {string} eventName - The event name for logging (e.g., 'AD_PAUSE')\n * @param {Function} sendMethod - The method to call (e.g., this.sendPause)\n */\n handleAdEvent(eventName, sendMethod) {\n if (this.isAd()) {\n console.log(`[MT - ${getTimestamp()}] → ${eventName}`);\n sendMethod.call(this);\n }\n }\n\n /**\n * Handle pause events - sends AD_PAUSE only when ads are playing\n */\n onPause() {\n this.handleAdEvent('AD_PAUSE', this.sendPause);\n }\n\n /**\n * Handle playing events - sends AD_RESUME only when ads are playing\n */\n onPlaying() {\n if (this.isAd()) {\n console.log(`[MT - ${getTimestamp()}] → AD_RESUME`);\n this.sendResume();\n this.sendBufferEnd(); // Playing event also ends any buffering\n }\n }\n\n /**\n * Handle seeking events - sends AD_SEEK_START only when ads are playing\n */\n onSeeking() {\n this.handleAdEvent('AD_SEEK_START', this.sendSeekStart);\n }\n\n /**\n * Handle seeked events - sends AD_SEEK_END only when ads are playing\n */\n onSeeked() {\n this.handleAdEvent('AD_SEEK_END', this.sendSeekEnd);\n }\n\n /**\n * Handle waiting (buffering) events - sends AD_BUFFER_START only when ads are playing\n */\n onWaiting() {\n this.handleAdEvent('AD_BUFFER_START', this.sendBufferStart);\n }\n\n /**\n * Override: Fire CONTENT_END when video ends\n */\n onEnded() {\n if (!this.hasEndedContent) {\n console.log(`[MT - ${getTimestamp()}] Video ended → CONTENT_END`);\n this.sendContentEnd();\n this.hasEndedContent = true;\n }\n }\n\n /**\n * Returns ad title for New Relic\n */\n getTitle() {\n if (this.currentAdPod) {\n return this.currentAdPod.title || this.currentAdBreak?.id || null;\n }\n return this.currentAdBreak?.title || this.currentAdBreak?.id || null;\n }\n\n /**\n * Returns ad ID for New Relic (adId attribute)\n */\n getVideoId() {\n if (this.currentAdPod) {\n return (\n this.currentAdPod.creativeId ||\n this.currentAdPod.title ||\n this.currentAdBreak?.id ||\n null\n );\n }\n return this.currentAdBreak?.creativeId || this.currentAdBreak?.id || null;\n }\n\n /**\n * Returns ad source URL for New Relic (adSrc attribute)\n */\n getSrc() {\n // MediaTailor doesn't provide individual creative URLs\n return this.trackingEndpointUrl || this.playbackManifestUrl || null;\n }\n\n /**\n * Returns ad duration in milliseconds for New Relic\n */\n getDuration() {\n if (this.currentAdPod) {\n return this.currentAdPod.duration * 1000;\n }\n return this.currentAdBreak ? this.currentAdBreak.duration * 1000 : null;\n }\n\n /**\n * Stops polling timers\n */\n stopPolling() {\n if (this.manifestPollTimer) {\n clearInterval(this.manifestPollTimer);\n this.manifestPollTimer = null;\n }\n\n if (this.trackingPollTimer) {\n clearInterval(this.trackingPollTimer);\n this.trackingPollTimer = null;\n }\n\n console.log(`[MT - ${getTimestamp()}] Polling stopped`);\n }\n\n /**\n * Cleanup when tracker is destroyed\n */\n dispose() {\n console.log(`[MT - ${getTimestamp()}] Disposing MediaTailorAdsTracker`);\n\n this.isDisposed = true;\n\n if (this.trackingAbortController) {\n console.log(`[MT - ${getTimestamp()}] Aborting in-flight tracking fetch`);\n this.trackingAbortController.abort();\n this.trackingAbortController = null;\n }\n\n if (this.manifestAbortController) {\n console.log(`[MT - ${getTimestamp()}] Aborting in-flight manifest fetch`);\n this.manifestAbortController.abort();\n this.manifestAbortController = null;\n }\n\n this.stopLivePolling();\n this.unregisterListeners();\n super.dispose && super.dispose();\n }\n}\n","/* global google */\nimport nrvideo from '@newrelic/video-core';\nimport VideojsAdsTracker from './videojs-ads';\n\nconst daiEvents = {\n // Stream Events\n DAI_STREAM_INITIALIZED: 'dai-stream-initialized',\n DAI_STREAM_LOADED: 'dai-stream-loaded',\n DAI_STREAM_ERROR: 'dai-stream-error',\n\n // Ad Events\n DAI_AD_BREAK_STARTED: 'dai-ad-break-started',\n DAI_AD_BREAK_ENDED: 'dai-ad-break-ended',\n DAI_AD_PERIOD_STARTED: 'dai-ad-period-started',\n DAI_AD_PERIOD_ENDED: 'dai-ad-period-ended',\n DAI_AD_STARTED: 'dai-ad-started',\n DAI_AD_FIRST_QUARTILE: 'dai-ad-first-quartile',\n DAI_AD_MIDPOINT: 'dai-ad-midpoint',\n DAI_AD_THIRD_QUARTILE: 'dai-ad-third-quartile',\n DAI_AD_COMPLETE: 'dai-ad-complete',\n DAI_AD_SKIPPED: 'dai-ad-skipped',\n DAI_AD_PAUSED: 'dai-ad-paused',\n DAI_AD_RESUMED: 'dai-ad-resumed',\n DAI_AD_CLICKED: 'dai-ad-clicked',\n DAI_AD_ERROR: 'dai-ad-error',\n\n // Cue Point Events\n DAI_CUEPOINTS_CHANGED: 'dai-cuepoints-changed',\n\n // Timed Metadata Events\n DAI_TIMED_METADATA: 'dai-timed-metadata',\n};\n\nexport default class DaiAdsTracker extends VideojsAdsTracker {\n static isUsing(player) {\n // Check for DAI plugin or imaDai method\n return (\n (player.imaDai && typeof player.imaDai === 'function') ||\n (player.dai && typeof player.dai.VERSION !== 'undefined') ||\n (player.ima && player.ima.dai) ||\n player.streamManager\n );\n }\n\n constructor(player) {\n super(player);\n this.streamManager = null;\n this.currentAdData = null;\n this.adBreakData = null;\n this.streamData = null;\n this.cuePoints = [];\n this.initialized = false;\n this.eventHandlers = null;\n }\n\n setStreamManager(streamManager) {\n this.streamManager = streamManager;\n this.setupStreamManagerListeners();\n this.initialized = true;\n nrvideo.Log.debug(\n 'DaiAdsTracker: StreamManager set and listeners registered'\n );\n }\n\n setupStreamManagerListeners() {\n if (!this.streamManager || !google?.ima?.dai?.api?.StreamEvent) {\n nrvideo.Log.warn('DaiAdsTracker: StreamManager or DAI API not available');\n return;\n }\n\n const StreamEvent = google.ima.dai.api.StreamEvent.Type;\n\n // Create the event handler mapping\n this.eventHandlers = {\n // Stream Events\n [StreamEvent.LOADED]: this.onStreamLoaded.bind(this),\n [StreamEvent.STREAM_INITIALIZED]: this.onStreamInitialized.bind(this),\n [StreamEvent.ERROR]: this.onStreamError.bind(this),\n\n // Ad Break Events\n [StreamEvent.AD_BREAK_STARTED]: this.onAdBreakStarted.bind(this),\n [StreamEvent.AD_BREAK_ENDED]: this.onAdBreakEnded.bind(this),\n\n // Ad Period Events\n [StreamEvent.AD_PERIOD_STARTED]: this.onAdPeriodStarted.bind(this),\n [StreamEvent.AD_PERIOD_ENDED]: this.onAdPeriodEnded.bind(this),\n\n // Individual Ad Events\n [StreamEvent.STARTED]: this.onAdStarted.bind(this),\n [StreamEvent.FIRST_QUARTILE]: this.onAdFirstQuartile.bind(this),\n [StreamEvent.MIDPOINT]: this.onAdMidpoint.bind(this),\n [StreamEvent.THIRD_QUARTILE]: this.onAdThirdQuartile.bind(this),\n [StreamEvent.COMPLETE]: this.onAdComplete.bind(this),\n [StreamEvent.SKIPPED]: this.onAdSkipped.bind(this),\n [StreamEvent.PAUSED]: this.onAdPaused.bind(this),\n [StreamEvent.RESUMED]: this.onAdResumed.bind(this),\n [StreamEvent.CLICK]: this.onAdClicked.bind(this),\n [StreamEvent.VIDEO_CLICKED]: this.onAdClicked.bind(this),\n\n // Cue Points and Metadata Events\n [StreamEvent.CUEPOINTS_CHANGED]: this.onCuePointsChanged.bind(this),\n [StreamEvent.TIMED_METADATA]: this.onTimedMetadata.bind(this),\n };\n\n // Register all event listeners using the mapping\n Object.entries(this.eventHandlers).forEach(([eventType, handler]) => {\n this.streamManager.addEventListener(eventType, handler);\n });\n\n nrvideo.Log.debug('DaiAdsTracker: StreamManager listeners registered');\n }\n\n registerListeners() {\n // Call parent to register basic videojs-ads events\n super.registerListeners();\n\n nrvideo.Log.debugCommonVideoEvents(this.player, [\n null,\n Object.values(daiEvents),\n ]);\n }\n\n unregisterListeners() {\n // Call parent cleanup\n super.unregisterListeners();\n\n // Clean up StreamManager listeners using the same mapping\n if (this.streamManager && this.eventHandlers) {\n Object.entries(this.eventHandlers).forEach(([eventType, handler]) => {\n this.streamManager.removeEventListener(eventType, handler);\n });\n }\n\n // Reset state\n this.streamManager = null;\n this.currentAdData = null;\n this.adBreakData = null;\n this.streamData = null;\n this.cuePoints = [];\n this.initialized = false;\n this.eventHandlers = null;\n }\n\n // Stream Event Handlers\n onStreamLoaded(event) {\n this.streamData = this.extractStreamData(event);\n nrvideo.Log.debug('DaiAdsTracker: Stream loaded', this.streamData);\n this.sendRequest();\n }\n\n onStreamInitialized(event) {\n nrvideo.Log.debug('DaiAdsTracker: Stream initialized');\n this.sendDownload({ state: 'stream-initialized' });\n }\n\n onStreamError(event) {\n const errorData = this.extractErrorData(event);\n nrvideo.Log.error('DaiAdsTracker: Stream error', errorData);\n this.sendError(errorData);\n }\n\n // Ad Break Event Handlers\n onAdBreakStarted(event) {\n this.adBreakData = this.extractAdBreakData(event);\n nrvideo.Log.debug('DaiAdsTracker: Ad break started', this.adBreakData);\n this.sendAdBreakStart(this.adBreakData);\n }\n\n onAdBreakEnded(event) {\n nrvideo.Log.debug('DaiAdsTracker: Ad break ended');\n this.sendAdBreakEnd();\n this.adBreakData = null;\n }\n\n // Ad Period Event Handlers (for bumpers, etc.)\n onAdPeriodStarted(event) {\n nrvideo.Log.debug('DaiAdsTracker: Ad period started');\n // Track as ad break start if no current break\n if (!this.adBreakData) {\n this.onAdBreakStarted(event);\n }\n }\n\n onAdPeriodEnded(event) {\n nrvideo.Log.debug('DaiAdsTracker: Ad period ended');\n // Don't end the break here as there might be more ads\n }\n\n // Individual Ad Event Handlers\n onAdStarted(event) {\n this.currentAdData = this.extractAdData(event);\n nrvideo.Log.debug('DaiAdsTracker: Ad started', this.currentAdData);\n this.sendStart();\n }\n\n onAdFirstQuartile(event) {\n nrvideo.Log.debug('DaiAdsTracker: Ad first quartile');\n this.sendAdQuartile({ quartile: 1 });\n }\n\n onAdMidpoint(event) {\n nrvideo.Log.debug('DaiAdsTracker: Ad midpoint');\n this.sendAdQuartile({ quartile: 2 });\n }\n\n onAdThirdQuartile(event) {\n nrvideo.Log.debug('DaiAdsTracker: Ad third quartile');\n this.sendAdQuartile({ quartile: 3 });\n }\n\n onAdComplete(event) {\n nrvideo.Log.debug('DaiAdsTracker: Ad complete');\n this.sendEnd();\n this.currentAdData = null;\n }\n\n onAdSkipped(event) {\n nrvideo.Log.debug('DaiAdsTracker: Ad skipped');\n this.sendEnd({ skipped: true });\n this.currentAdData = null;\n }\n\n onAdPaused(event) {\n nrvideo.Log.debug('DaiAdsTracker: Ad paused');\n this.sendPause();\n }\n\n onAdResumed(event) {\n nrvideo.Log.debug('DaiAdsTracker: Ad resumed');\n this.sendResume();\n }\n\n onAdClicked(event) {\n nrvideo.Log.debug('DaiAdsTracker: Ad clicked');\n this.sendAdClick({ url: this.getClickThroughUrl() });\n }\n\n // Cue Points Handler\n onCuePointsChanged(event) {\n this.cuePoints = this.extractCuePoints(event);\n nrvideo.Log.debug('DaiAdsTracker: Cue points changed', this.cuePoints);\n }\n\n // Timed Metadata Handler\n onTimedMetadata(event) {\n const metadata = this.extractTimedMetadata(event);\n nrvideo.Log.debug('DaiAdsTracker: Timed metadata', metadata);\n }\n\n // Data Extraction Methods\n extractStreamData(event) {\n try {\n const streamData = event.getStreamData();\n return {\n streamId: streamData?.streamId,\n url: streamData?.url,\n adTagParameters: streamData?.adTagParameters,\n streamType: this.getStreamType(),\n };\n } catch (error) {\n nrvideo.Log.warn('DaiAdsTracker: Failed to extract stream data', error);\n return {};\n }\n }\n\n extractAdBreakData(event) {\n try {\n const adBreakData = event.getAdBreak();\n return {\n adBreakId: adBreakData?.id,\n adBreakTitle: adBreakData?.title,\n adCount: adBreakData?.ads?.length || 0,\n position: this.getAdPosition(),\n };\n } catch (error) {\n nrvideo.Log.warn('DaiAdsTracker: Failed to extract ad break data', error);\n return {};\n }\n }\n\n extractAdData(event) {\n try {\n const ad = event.getAd();\n return {\n adId: ad?.getAdId(),\n creativeId: ad?.getCreativeId(),\n duration: ad?.getDuration(),\n title: ad?.getTitle(),\n description: ad?.getDescription(),\n advertiserName: ad?.getAdvertiserName(),\n clickThroughUrl: ad?.getClickThroughUrl(),\n dealId: ad?.getDealId(),\n wrapperAdIds: ad?.getWrapperAdIds(),\n position: this.getAdPosition(),\n };\n } catch (error) {\n nrvideo.Log.warn('DaiAdsTracker: Failed to extract ad data', error);\n return {};\n }\n }\n\n extractErrorData(event) {\n try {\n const error = event.getError();\n return {\n errorCode: error?.getErrorCode(),\n errorMessage: error?.getMessage(),\n innerError: error?.getInnerError(),\n };\n } catch (error) {\n nrvideo.Log.warn('DaiAdsTracker: Failed to extract error data', error);\n return { errorMessage: 'Unknown DAI error' };\n }\n }\n\n extractCuePoints(event) {\n try {\n return event.getCuepoints() || [];\n } catch (error) {\n nrvideo.Log.warn('DaiAdsTracker: Failed to extract cue points', error);\n return [];\n }\n }\n\n extractTimedMetadata(event) {\n try {\n return {\n type: event.getType(),\n data: event.getData(),\n };\n } catch (error) {\n nrvideo.Log.warn(\n 'DaiAdsTracker: Failed to extract timed metadata',\n error\n );\n return {};\n }\n }\n\n // Override parent methods for DAI-specific implementations\n getTrackerName() {\n return 'dai-ads';\n }\n\n getPlayerName() {\n return 'videojs-dai';\n }\n\n getPlayerVersion() {\n if (this.player.dai?.VERSION) {\n return this.player.dai.VERSION;\n }\n if (this.player.ima?.VERSION) {\n return `ima-dai: ${this.player.ima.VERSION}`;\n }\n return 'unknown';\n }\n\n getAdCuePoints() {\n return this.cuePoints;\n }\n\n getAdPosition() {\n if (!this.currentAdData && !this.adBreakData) return null;\n\n // Try to determine position from current playback time\n const currentTime = this.player.currentTime();\n const duration = this.player.duration();\n\n if (currentTime < 5) {\n return 'pre';\n } else if (duration && currentTime > duration - 10) {\n return 'post';\n } else {\n return 'mid';\n }\n }\n\n getDuration() {\n if (this.currentAdData?.duration !== undefined) {\n return this.currentAdData.duration * 1000; // Convert to milliseconds\n }\n return null;\n }\n\n getVideoId() {\n return this.currentAdData?.adId || null;\n }\n\n getAdCreativeId() {\n return this.currentAdData?.creativeId || null;\n }\n\n getTitle() {\n return this.currentAdData?.title || null;\n }\n\n getSrc() {\n return this.streamData?.url || null;\n }\n\n getPlayhead() {\n if (this.streamManager) {\n try {\n const streamTime = this.streamManager.getStreamTime();\n return streamTime * 1000; // Convert to milliseconds\n } catch (error) {\n // Fallback to player current time\n return this.player.currentTime() * 1000;\n }\n }\n return this.player.currentTime() * 1000;\n }\n\n getAdPartner() {\n return 'google-dai';\n }\n\n getClickThroughUrl() {\n return this.currentAdData?.clickThroughUrl || null;\n }\n\n getStreamType() {\n // Determine if this is VOD or Live\n if (this.streamData?.streamType) {\n return this.streamData.streamType;\n }\n // Try to infer from player\n const duration = this.player.duration();\n return duration === Infinity ? 'live' : 'vod';\n }\n\n // Additional helper methods\n isLiveStream() {\n return this.getStreamType() === 'live';\n }\n\n getCurrentAdBreak() {\n return this.adBreakData;\n }\n\n getCurrentAd() {\n return this.currentAdData;\n }\n\n getStreamData() {\n return this.streamData;\n }\n\n getBitrate() {\n const tech = this.getTech()\n if (tech && tech.tech && tech.tech.stats && tech.tech.stats.bandwidth) {\n return Math.round(tech.tech.stats.bandwidth);\n }\n return null;\n }\n\n getRenditionBitrate() {\n const tech = this.getTech();\n if (tech && tech.getRenditionBitrate) {\n const bitrate = tech.getRenditionBitrate();\n return bitrate !== null ? Math.round(bitrate) : null;\n }\n return null;\n }\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import VideojsTracker from './tracker';\nexport default VideojsTracker;"],"names":["e","_videojsAds","require","__esModule","default","FreewheelAdsTracker","VideojsAdsTracker","isUsing","player","FreeWheelPlugin","tv","freewheel","getTrackerName","getPlayerName","getPlayerVersion","this","VERSION","getPlayhead","ads","ad","currentTime","getDuration","duration","getVideoId","id","getAdPartner","getAdCreativeId","provider","event","adInstance","getActiveCreativeRendition","getId","err","getSrc","getPrimaryCreativeRenditionAsset","getUrl","getTitle","getName","getAdPosition","type","nrvideo","Constants","AdPositions","PRE","MID","POST","exports","_videoCore","_interopRequireDefault","BrightcoveImaAdsTracker","ima3","adPlayer","registerListeners","Log","debugCommonVideoEvents","on","onStarted","bind","onPaused","onResume","onComplete","onSkipped","onError","onClick","unregisterListeners","off","sendRequest","sendStart","sendPause","sendResume","sendEnd","skipped","sendError","sendClick","HlsJs","constructor","tech","vhs_","el","getResource","url","getRenditionName","level","levels","currentLevel","name","getRenditionBitrate","bitrate","Math","round","getRenditionWidth","width","getRenditionHeight","height","getBitrate","getContentBitratePlayback","getManifestBitrate","length","max","map","l","getSegmentDownloadBitrate","stats","bandwidth","getNetworkDownloadBitrate","throughput","ImaAdsTracker","ima","google","getCuePoints","getAdsManager","lastAdData","podInfo","undefined","podIndex","adId","creativeId","mediaUrl","title","manager","getRemainingTime","getPlayrate","playbackRate","getWebkitBitrate","adVideoElement","getAdVideoElement","webkitVideoDecodedByteCount","_lastAdWebkitBitrate","delta","seconds","getHeartbeat","renditionBitrate","AdEvent","Type","AD_ERROR","AdErrorEvent","addEventListener","ALL_ADS_COMPLETED","LINEAR_CHANGED","COMPLETE","USER_CLOSE","IMPRESSION","CONTENT_PAUSE_REQUESTED","CONTENT_RESUME_REQUESTED","SKIPPED","SKIPPABLE_STATE_CHANGED","LOADED","PAUSED","RESUMED","STARTED","AD_CAN_PLAY","AD_METADATA","EXPANDED_CHANGED","AD_BREAK_READY","LOG","CLICK","FIRST_QUARTILE","MIDPOINT","THIRD_QUARTILE","onLoaded","onStart","onResumed","onFirstQuartile","onMidpoint","onThirdQuartile","removeEventListener","onImpression","getAdData","adError","getError","errorCode","getErrorCode","errorMessage","getMessage","sendAdClick","sendAdQuartile","adQuartile","adsManager","currentAd","getCurrentAd","getAdId","getCreativeId","getMediaUrl","getAdPodInfo","data","getVastMediaBitrate","controller","adUi","adContainerDiv","querySelector","_package","_contribHls","_hlsJs","_shaka","_ima","_brightcoveIma","_freewheel","_dai","_mediaTailor","VideojsTracker","VideoTracker","options","super","isContentEnd","imaAdCuePoints","daiInitialized","Core","addTracker","getTech","IWillNotUseThisInPlugins","ContribHlsTech","HlsJsTech","ShakaTech","getInstrumentationProvider","getInstrumentationName","getInstrumentationVersion","getTrackerVersion","pkg","version","state","snapshot","absoluteTime","mediainfo","getLanguage","language","currentSrc","videojs","isMuted","muted","vhs","playlists","media","activePlaylist","attributes","BANDWIDTH","techWrapper","allRenditions","master","maxBitrate","p","videoHeight","videoWidth","isAutoplayed","autoplay","isFullscreen","getPreload","preload","onDownload","onAdsready","onAdStart","onAdEnd","onPlay","onPause","onPlaying","onAbort","onEnded","onDispose","onSeeking","onSeeked","onWaiting","onTimeupdate","OnAdsAllpodsCompleted","onStreamManager","sendDownload","adsTracker","MediaTailorAdsTracker","console","log","setAdsTracker","setIsAd","StreamManager","daiTracker","DaiAdsTracker","setStreamManager","currentAdPlaying","FreewheelAdsCompleted","isAdsTrackerActive","isAd","ended","sendBufferEnd","includes","sendSeekStart","sendSeekEnd","error","code","message","sendBufferStart","VOD","LIVE","HLS","DASH","PRE_ROLL","MID_ROLL","POST_ROLL","MANIFEST_CUE","VHS_DISCONTINUITY","TRACKING_API","MANIFEST_AND_TRACKING","DASH_EMSG","DASH_EVENT_STREAM","Q1","Q2","Q3","shakaPlayer","getManifestUri","getStats","streamBandwidth","tracks","getVariantTracks","t","videoBandwidth","audioBandwidth","i","track","active","estimatedBandwidth","NAME","RESOLUTION","onAdrequest","onAdload","onAdstart","onAdend","onAdskip","onAdserror","onAdsClick","onPodStart","onPodEnd","onAdspause","onAdsplay","sendAdBreakStart","sendAdBreakEnd","quartile","r","d","videoAnalyticsHarvester","h","s","a","n","o","isInitialized","harvestScheduler","eventBuffer","initialize","A","warn","startScheduler","notice","addEvent","actionName","Events","QOE_AGGREGATE","viewId","addOrReplaceByActionNameAndViewId","addOrReplaceByActionName","add","setHarvestInterval","updateHarvestInterval","forceNextQoeCycle","setBeforeDrainCallback","beforeDrainCallback","refreshQoeKpis","findByActionNameAndViewId","findByActionName","QOE_KPI_KEYS","reset","startTime","stopTime","accumulator","offset","getDeltaTime","Date","getTime","start","stop","clone","COLLECTOR","US","EU","Staging","GOV","VALID_EVENT_TYPES","MAX_PAYLOAD_SIZE","MAX_BEACON_SIZE","MAX_EVENTS_PER_BATCH","INTERVAL","QOE_AGGREGATE_KEYS","_listeners","push","indexOf","splice","emit","Array","isArray","forEach","call","eventType","target","buffer","maxPayloadSize","maxEventsPerBatch","currentPayloadSize","totalEvents","smartHarvestPayloadThreshold","floor","overflowPayloadThreshold","smartHarvestEventThreshold","overflowEventThreshold","onSmartHarvestTrigger","findIndex","find","makeRoom","checkSmartHarvestTrigger","setSmartHarvestCallback","drain","isEmpty","size","clear","shift","retryQueueHandler","u","httpClient","X","fallBackUrl","retryCount","triggerSmartHarvest","isStarted","currentTimerId","harvestCycle","isHarvesting","qoeCycleCount","_lastSentQoeKpis","setupPageLifecycleHandlers","eventBufferSize","scheduleNextHarvest","stopScheduler","clearTimeout","threshold","triggerHarvest","setTimeout","onHarvestInterval","getQueueSize","success","reason","drainEvents","isFinalHarvest","trimEventsToFit","sendChunk","totalChunks","results","handleHarvestFailure","consecutiveFailures","ins","unshift","slice","originalCount","trimmedCount","finalSize","maxSize","addFailedEvents","window","NRVIDEO","config","qoeIntervalFactor","_qoeKpisUnchanged","_saveQoeKpis","c","getRetryEventsToFit","c$","payload","body","isLastChunk","Promise","send","retry","handleRequestFailure","status","chunk","eventCount","info","region","isNaN","force","document","hidden","Levels","ERROR","WARNING","arguments","NOTICE","debug","DEBUG","concat","addEventHandler","prefix","includeTime","getDate","getMinutes","getSeconds","getMilliseconds","SILENT","colorful","documentMode","cast","apply","ALL","location","search","exec","Error","callback","executeRequest","now","JSON","stringify","obfuscate","reduce","regex","RegExp","flags","source","replace","replacement","navigator","sendBeacon","sendWithBeacon","handleRequestComplete","fetchWithTimeout","method","headers","keepalive","ok","statusText","Sc","AbortController","abort","fetch","signal","retryQueue","maxQueueSize","maxQueueSizeBytes","queueSizeBefore","evictOldestEvent","discardEvent","customData","heartbeat","parentTracker","_trackerReadyChrono","_actionTable","ACTION_TABLE","_actionAdTable","ACTION_AD_TABLE","setOptions","dispose","_isAd","startHeartbeat","_heartbeatInterval","setInterval","sendHeartbeat","stopHeartbeat","clearInterval","sendVideoAction","HEARTBEAT","getAttributes","trackerName","trackerVersion","coreVersion","rE","timeSinceTrackerReady","isBackgroundEvent","sendVideoAdAction","sendVideoErrorAction","sendVideoCustomAction","z8","beacon","licenseKey","applicationID","href","ArrayBuffer","byteLength","Blob","FormData","WeakSet","has","Object","defineProperty","enumerable","get","prototype","hasOwnProperty","Symbol","toStringTag","value","appName","qoe","timestamp","timeSinceLoad","performance","g","m","qoeAggregateVersion","f","qoeAggregate","setConfiguration","validateRequiredFields","validateConfigFields","initializeGlobalConfig","values","flatMap","keys","join","filterObfuscateRules","filter","sanitizeQoeIntervalFactor","Number","isInteger","trackerInit","removeTracker","getTrackers","forceHarvest","E","_createdAt","_hb","_acc","_bufferAcc","_viewSession","_viewCount","numberOfErrors","numberOfAds","numberOfVideos","totalPlaytime","weightedAverageBitrate","totalAdPlaytime","isAdBreak","initialBufferingHappened","startupTime","peakBitrate","_lastBitrate","_lastBitrateChangeTimestamp","partialAverageBitrate","_totalBitrateDuration","hadStartupError","hadPlaybackError","totalRebufferingTime","resetFlags","resetChronos","isPlayerReady","isRequested","isPaused","isSeeking","isBuffering","isPlaying","timeSinceRequested","timeSinceStarted","timeSincePaused","timeSinceSeekBegin","timeSinceBufferBegin","timeSinceAdBreakStart","timeSinceLastDownload","timeSinceLastHeartbeat","timeSinceLastRenditionChange","timeSinceLastAdQuartile","timeSinceLastAd","timeSinceLastError","timeSinceLastAdError","timeSinceResumed","timeSinceSeekEnd","playtimeSinceLastEvent","customTimeSinceAttributes","elapsedTime","bufferElapsedTime","_totalAdPlaytime","setTimeSinceAttribute","removeTimeSinceAttribute","getViewSession","random","toString","substring","getViewId","getStateAttributes","timeSinceAdRequested","timeSinceLastAdHeartbeat","timeSinceAdStarted","timeSinceAdPaused","timeSinceAdBufferBegin","timeSinceAdSeekBegin","timeSinceAdBreakBegin","entries","getQoeAttributes","rebufferingRatio","averageBitrate","weightedBitrate","calculateBufferType","goViewCountUp","goPlayerReady","goRequest","goStart","goEnd","goPause","goResume","goBufferStart","goBufferEnd","goSeekStart","goSeekEnd","goAdBreakStart","goAdBreakEnd","goDownload","goHeartbeat","goRenditionChange","goAdQuartile","goError","isError","goLastAd","trackContentBitrateState","resetViewIdTrackedState","clearTotalAdsTime","totalAdTime","startAdsTime","stopAdsTime","setStartupTime","T","v","_lastBufferType","_userId","setPlayer","tag","setUserId","getElementById","disposeAdsTracker","S","isLive","_lastWebkitBitrate","getRenditionShift","_lastAdRendition","_lastRendition","getCdn","getFps","getAdQuartile","viewSession","playerName","playerVersion","src","pageUrl","adTitle","adSrc","adCdn","adBitrate","adRenditionName","adRenditionHeight","adRenditionWidth","adDuration","adPlayhead","adLanguage","adIsMuted","adFps","adPosition","adCreativeId","adPartner","contentId","contentTitle","contentSrc","contentCdn","contentPlayhead","contentIsLive","contentBitrate","contentManifestBitrate","contentSegmentDownloadBitrate","contentNetworkDownloadBitrate","contentRenditionName","contentRenditionHeight","contentRenditionWidth","contentDuration","contentLanguage","contentPlayrate","contentIsFullscreen","contentIsMuted","contentIsAutoplayed","contentPreload","contentFps","addQoeAttributes","sendCustom","sendPlayerReady","PLAYER_READY","AD_REQUEST","CONTENT_REQUEST","AD_START","CONTENT_START","AD_END","CONTENT_END","AD_PAUSE","CONTENT_PAUSE","AD_RESUME","CONTENT_RESUME","AD_BUFFER_START","CONTENT_BUFFER_START","buildBufferAttributes","bufferType","AD_BUFFER_END","CONTENT_BUFFER_END","isInitialBuffering","AD_SEEK_START","CONTENT_SEEK_START","AD_SEEK_END","CONTENT_SEEK_END","DOWNLOAD","CONTENT_ERROR","sendRenditionChanged","AD_RENDITION_CHANGE","CONTENT_RENDITION_CHANGE","adjustElapsedTimeForPause","AD_HEARTBEAT","CONTENT_HEARTBEAT","AD_BREAK_START","AD_BREAK_END","AD_QUARTILE","AD_CLICK","y","_","R","B","b","Chrono","Emitter","Tracker","VideoTrackerState","NrVideoEventAggregator","RetryQueueHandler","OptimizedHttpClient","HarvestScheduler","recordEvent","manifestUrl","match","REGEX_SESSION_ID","sessionId","REGEX_TRACKING_PATH_SEGMENT","REGEX_MANIFEST_FILE_SUFFIX","playlist","segments","discontinuityStarts","adBreaks","currentAdBreak","currentPod","segment","index","isMTSegment","isMediaTailorSegment","hasDiscontinuity","endTime","MIN_AD_DURATION","pods","confirmedByTracking","hasFiredStart","hasFiredEnd","hasFiredAdStart","hasFiredQ1","hasFiredQ2","hasFiredQ3","segmentDuration","HLS_MANIFEST_EXTENSION","MANIFEST_TYPE","DASH_MANIFEST_EXTENSION","Infinity","STREAM_TYPE","adBreakIndex","totalAdBreaks","streamType","AD_POSITION","adSchedule","trackingAvails","scheduleMap","Map","key","set","newAds","avail","firstAd","startTimeInSeconds","existingAd","availId","trackingAd","adIndex","trackingStartTime","trackingDuration","durationInSeconds","manifestText","REGEX_DASH_MINIMUM_UPDATE_PERIOD","parseIsoDuration","REGEX_HLS_TARGET_DURATION","parseInt","masterText","baseUrl","lines","split","line","startsWith","HLS_TAG_PREFIX","URL","trim","async","fetchTextOrThrow","mediaPlaylistUrl","playlistUrl","adBreak","pod","abs","AD_TIMING_TOLERANCE","progress","firedQuartiles","quartiles","calculateQuartiles","toFire","q1","q2","q3","toISOString","trackingEndpointUrl","timeout","externalSignal","timeoutId","abortHandler","response","credentials","json","existingSchedule","merged","newAd","assign","finalSchedule","sort","xmlText","xml","DOMParser","parseFromString","parserError","textContent","periods","querySelectorAll","period","baseUrlEl","MT_SEGMENT_PATTERN","periodId","getAttribute","AD_SOURCE","eventStreams","DASH_SCTE35_EVENT_STREAM_SELECTOR","stream","timescale","parseFloat","presentationTime","eventId","SCTE35_SCHEME_MARKER","durationSeconds","currentPodStartTime","lastMapUrl","adPods","isInAdBreak","REGEX_DISCONTINUITY","test","mapMatch","REGEX_MAP","mapUrl","podDuration","MT_HLS_CUE_OUT_TAG","durationMatch","REGEX_CUE_OUT","MT_HLS_CUE_IN_TAG","actualDuration","HLS_SEGMENT_DURATION_TAG","_mtConstants","uri","QUARTILES","text","durationStr","REGEX_ISO_8601_DURATION","_mt","MEDIATAILOR_HOST_MARKER","manifestFormat","playbackManifestUrl","currentAdPod","hasEndedContent","isDisposed","trackingAbortController","manifestAbortController","isFetchingTracking","isFetchingManifest","hasAttemptedTrackingFetch","trackingFetchRetries","maxTrackingRetries","manifestPollTimer","trackingPollTimer","liveRefreshIntervalSeconds","lastMediaPlaylistText","getTimestamp","endpoint","trackingAPITimeout","TRACKING_API_TIMEOUT_MS","detectManifestFormatFromUrl","toUpperCase","one","detectPlaybackStreamType","initializeTracking","buildTrackingEndpointUrl","setupVODTracking","setupLiveTracking","onTimeUpdate","stopLivePolling","hookPlayerManifest","pollingInterval","getLiveRefreshIntervalMs","pollManifestForNewAds","getAndProcessTrackingMetadata","DEFAULT_LIVE_POLL_INTERVAL_MS","restartLivePollingTimers","newInterval","getManifestDirectly","hookHLSViaVHS","hookHLSViaNative","hookHLSViaContribHls","hookDASHViaShaka","hookDASHViaDashJs","currentPlaylist","parseVhsPlaylistForAdBreaks","el_","canPlayType","HLS_MIME_TYPE","hls","handleDASHEmsgEvent","dash","handleDASHEventStream","fetchAndParseHlsManifest","fetchAndParseDashManifest","fetchHlsMasterManifest","mediaText","fetchHlsMediaPlaylist","hlsTargetDurationSeconds","extractHlsTargetDurationSeconds","updateLiveRefreshIntervalFromManifest","parseHlsManifestForAdBreaks","mergeNewAds","fetchDashManifest","dashMinimumUpdatePeriodSeconds","extractDashMinimumUpdatePeriodSeconds","parseDashManifestForAdBreaks","emsgData","detail","schemeIdUri","presentationTimeDelta","eventDuration","messageData","eventData","targetDuration","detectAdBreaksFromVhsPlaylist","sum","ab","mergeAdSchedules","intervalSeconds","getTrackingMetadata","avails","enrichWithTrackingMetadata","enrichAdScheduleWithTrackingMetadata","podCount","trackQuartiles","adObject","getQuartilesToFire","activeAdBreak","findActiveAdBreak","toFixed","determineAdPosition","position","breakIndex","totalBreaks","activePod","findActivePod","podProgress","adProgress","sendContentEnd","handleAdEvent","eventName","sendMethod","stopPolling","daiEvents","DAI_STREAM_INITIALIZED","DAI_STREAM_LOADED","DAI_STREAM_ERROR","DAI_AD_BREAK_STARTED","DAI_AD_BREAK_ENDED","DAI_AD_PERIOD_STARTED","DAI_AD_PERIOD_ENDED","DAI_AD_STARTED","DAI_AD_FIRST_QUARTILE","DAI_AD_MIDPOINT","DAI_AD_THIRD_QUARTILE","DAI_AD_COMPLETE","DAI_AD_SKIPPED","DAI_AD_PAUSED","DAI_AD_RESUMED","DAI_AD_CLICKED","DAI_AD_ERROR","DAI_CUEPOINTS_CHANGED","DAI_TIMED_METADATA","imaDai","dai","streamManager","currentAdData","adBreakData","streamData","cuePoints","initialized","eventHandlers","setupStreamManagerListeners","api","StreamEvent","onStreamLoaded","STREAM_INITIALIZED","onStreamInitialized","onStreamError","AD_BREAK_STARTED","onAdBreakStarted","AD_BREAK_ENDED","onAdBreakEnded","AD_PERIOD_STARTED","onAdPeriodStarted","AD_PERIOD_ENDED","onAdPeriodEnded","onAdStarted","onAdFirstQuartile","onAdMidpoint","onAdThirdQuartile","onAdComplete","onAdSkipped","onAdPaused","onAdResumed","onAdClicked","VIDEO_CLICKED","CUEPOINTS_CHANGED","onCuePointsChanged","TIMED_METADATA","onTimedMetadata","handler","extractStreamData","errorData","extractErrorData","extractAdBreakData","extractAdData","getClickThroughUrl","extractCuePoints","metadata","extractTimedMetadata","getStreamData","streamId","adTagParameters","getStreamType","getAdBreak","adBreakId","adBreakTitle","adCount","getAd","description","getDescription","advertiserName","getAdvertiserName","clickThroughUrl","dealId","getDealId","wrapperAdIds","getWrapperAdIds","innerError","getInnerError","getCuepoints","getType","getData","getAdCuePoints","getStreamTime","isLiveStream","getCurrentAdBreak","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","module","__webpack_modules__","definition","obj","prop","_tracker"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"index.js","mappings":"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","sources":["webpack://@newrelic/video-videojs/./node_modules/@newrelic/video-core/dist/esm/index.js","webpack://@newrelic/video-videojs/./src/ads/brightcove-ima.js","webpack://@newrelic/video-videojs/./src/ads/dai.js","webpack://@newrelic/video-videojs/./src/ads/freewheel.js","webpack://@newrelic/video-videojs/./src/ads/ima.js","webpack://@newrelic/video-videojs/./src/ads/media-tailor.js","webpack://@newrelic/video-videojs/./src/ads/utils/mt-constants.js","webpack://@newrelic/video-videojs/./src/ads/utils/mt.js","webpack://@newrelic/video-videojs/./src/ads/videojs-ads.js","webpack://@newrelic/video-videojs/./src/techs/contrib-hls.js","webpack://@newrelic/video-videojs/./src/techs/hls-js.js","webpack://@newrelic/video-videojs/./src/techs/shaka.js","webpack://@newrelic/video-videojs/./src/tracker.js","webpack://@newrelic/video-videojs/webpack/bootstrap","webpack://@newrelic/video-videojs/webpack/runtime/define property getters","webpack://@newrelic/video-videojs/webpack/runtime/hasOwnProperty shorthand","webpack://@newrelic/video-videojs/webpack/runtime/make namespace object","webpack://@newrelic/video-videojs/./src/index.js"],"sourcesContent":["/*! For license information please see index.js.LICENSE.txt */\nvar t={487(t,e,i){i.d(e,{videoAnalyticsHarvester:()=>h});var s=i(374),r=i(431),a=i(51),n=i(144),o=i(302);const h=new class{constructor(){this.isInitialized=!1,this.harvestScheduler=null,this.eventBuffer=null}initialize(){if(this.isInitialized)n.A.warn(\"Video analytics agent already initialized\");else try{this.eventBuffer=new r.t,this.harvestScheduler=new s.n(this.eventBuffer),this.harvestScheduler.startScheduler(),this.isInitialized=!0,n.A.notice(\"Video analytics agent initialized successfully\")}catch(t){n.A.error(\"Failed to initialize video analytics agent:\",t.message)}}addEvent(t){this.isInitialized||(n.A.warn(\"Video analytics agent not initialized, initializing now\"),this.initialize());try{return t.actionName&&t.actionName===o.A.Events.QOE_AGGREGATE?t.viewId?this.eventBuffer.addOrReplaceByActionNameAndViewId(o.A.Events.QOE_AGGREGATE,t.viewId,t):this.eventBuffer.addOrReplaceByActionName(o.A.Events.QOE_AGGREGATE,t):this.eventBuffer.add(t)}catch(t){return n.A.error(\"Failed to add event to harvesting system:\",t.message),!1}}setHarvestInterval(t){this.isInitialized||this.initialize(),this.harvestScheduler.updateHarvestInterval(t)}forceNextQoeCycle(){this.harvestScheduler&&(this.harvestScheduler.forceNextQoeCycle=!0)}setBeforeDrainCallback(t){this.harvestScheduler&&(this.harvestScheduler.beforeDrainCallback=t)}refreshQoeKpis(t,e){if(!this.eventBuffer||!t)return;const i=e?this.eventBuffer.findByActionNameAndViewId(o.A.Events.QOE_AGGREGATE,e):this.eventBuffer.findByActionName(o.A.Events.QOE_AGGREGATE);if(i){const s={...i};for(const e of a.A.QOE_KPI_KEYS)e in t&&(s[e]=t[e]);e?this.eventBuffer.addOrReplaceByActionNameAndViewId(o.A.Events.QOE_AGGREGATE,e,s):this.eventBuffer.addOrReplaceByActionName(o.A.Events.QOE_AGGREGATE,s)}}}},455(t,e,i){i.d(e,{A:()=>r});class s{constructor(){this.reset()}reset(){this.startTime=0,this.stopTime=0,this.accumulator=0,this.offset=0}getDeltaTime(){return this.startTime?this.offset+((new Date).getTime()-this.startTime):null}start(){this.startTime=(new Date).getTime(),this.stopTime=0}stop(){return this.stopTime=(new Date).getTime(),this.startTime<this.stopTime&&(this.accumulator+=this.stopTime-this.startTime),this.getDeltaTime()}getDuration(){return this.stopTime?this.accumulator+this.offset:this.accumulator+(this.getDeltaTime()??0)}clone(){var t=new s;return t.startTime=this.startTime,t.stopTime=this.stopTime,t.offset=this.offset,t.accumulator=this.accumulator,t}}const r=s},51(t,e,i){i.d(e,{A:()=>r});class s{}s.AdPositions={PRE:\"pre\",MID:\"mid\",POST:\"post\"},s.COLLECTOR={US:[\"bam.nr-data.net\",\"bam-cell.nr-data.net\"],EU:\"bam.eu01.nr-data.net\",Staging:\"staging-bam-cell.nr-data.net\",GOV:\"gov-bam.nr-data.net\"},s.VALID_EVENT_TYPES=[\"VideoAction\",\"VideoAdAction\",\"VideoErrorAction\",\"VideoCustomAction\"],s.MAX_PAYLOAD_SIZE=1048576,s.MAX_BEACON_SIZE=61440,s.MAX_EVENTS_PER_BATCH=1e3,s.INTERVAL=1e4,s.QOE_KPI_KEYS=[\"startupTime\",\"peakBitrate\",\"averageBitrate\",\"totalPlaytime\",\"totalRebufferingTime\",\"rebufferingRatio\",\"hadStartupError\",\"hadPlaybackError\",\"numberOfErrors\"],s.QOE_AGGREGATE_KEYS=[\"coreVersion\",\"instrumentation.name\",\"instrumentation.provider\",\"instrumentation.version\",\"isBackgroundEvent\",\"playerName\",\"playerVersion\",\"src\",\"viewId\",\"viewSession\",\"contentIsAutoplayed\",\"contentIsMuted\",\"contentRenditionHeight\",\"contentRenditionWidth\",\"contentSrc\",\"numberOfVideos\",\"pageUrl\",\"trackerName\",\"trackerVersion\",\"contentDuration\",\"contentPlayrate\",\"contentPlayhead\",\"contentPreload\",\"elapsedTime\",\"contentTitle\",\"contentId\",\"contentIsLive\",\"deviceType\",\"deviceGroup\",\"deviceManufacturer\",\"deviceModel\",\"deviceName\",\"deviceSize\",\"deviceUuid\",\"contentRenditionName\",\"contentIsFullscreen\",\"contentCdn\",\"contentFps\",\"asnOrganization\",\"asnLongitude\",\"asnLatitude\",\"asn\",\"timeSinceRequested\",\"timeSinceStarted\"];const r=s},568(t,e,i){i.d(e,{A:()=>s});const s=class{on(t,e){if(this._listeners=this._listeners||{},\"function\"==typeof e)return this._listeners[t]=this._listeners[t]||[],this._listeners[t].push(e),this}off(t,e){if(this._listeners=this._listeners||{},this._listeners[t]){var i=this._listeners[t].indexOf(e);-1!==i&&this._listeners[t].splice(i,1)}return this}emit(t,e,i){return this._listeners=this._listeners||{},i=i||{},Array.isArray(this._listeners[e])&&this._listeners[e].forEach(s=>{s.call(this,{eventType:t,type:e,data:i,target:this})}),Array.isArray(this._listeners[\"*\"])&&this._listeners[\"*\"].forEach(s=>{s.call(this,{eventType:t,type:e,data:i,target:this})}),this}}},431(t,e,i){i.d(e,{t:()=>h});var s=i(144),r=i(51),a=i(347);const{MAX_PAYLOAD_SIZE:n,MAX_EVENTS_PER_BATCH:o}=r.A;class h{constructor(){this.buffer=[],this.maxPayloadSize=n,this.maxEventsPerBatch=o,this.currentPayloadSize=0,this.totalEvents=0,this.smartHarvestPayloadThreshold=Math.floor(.6*this.maxPayloadSize),this.overflowPayloadThreshold=Math.floor(.9*this.maxPayloadSize),this.smartHarvestEventThreshold=Math.floor(.6*this.maxEventsPerBatch),this.overflowEventThreshold=Math.floor(.9*this.maxEventsPerBatch),this.onSmartHarvestTrigger=null}addOrReplaceByActionName(t,e){const i=this.buffer.findIndex(e=>e.actionName===t);try{return-1===i?this.add(e):this.add(e,i),!0}catch(t){return s.A.error(\"Failed to set or replace the event to buffer:\",t.message),!1}}addOrReplaceByActionNameAndViewId(t,e,i){const r=this.buffer.findIndex(i=>i.actionName===t&&i.viewId===e);try{return-1===r?this.add(i):this.add(i,r),!0}catch(t){return s.A.error(\"Failed to set or replace the event to buffer:\",t.message),!1}}findByActionNameAndViewId(t,e){return this.buffer.find(i=>i.actionName===t&&i.viewId===e)||null}findByActionName(t){return this.buffer.find(e=>e.actionName===t)||null}add(t,e){try{const i=(0,a.Q3)(t),s=this.currentPayloadSize+i>=this.maxPayloadSize,r=this.totalEvents+1>=this.maxEventsPerBatch;if((s||r)&&this.makeRoom(i),null!=e&&e>-1){const s=(0,a.Q3)(this.buffer[e]);this.buffer[e]=t,this.currentPayloadSize+=i-s}else this.buffer.push(t),this.totalEvents++,this.currentPayloadSize+=i;return this.checkSmartHarvestTrigger(),!0}catch(t){return s.A.error(\"Failed to add event to buffer:\",t.message),!1}}checkSmartHarvestTrigger(){const t=this.currentPayloadSize/this.maxPayloadSize,e=this.totalEvents/this.maxEventsPerBatch,i=this.currentPayloadSize>=this.overflowPayloadThreshold,r=this.totalEvents>=this.overflowEventThreshold;if(i||r){const r=i?`payload ${this.currentPayloadSize}/${this.maxPayloadSize} bytes (${Math.round(100*t)}%)`:`events ${this.totalEvents}/${this.maxEventsPerBatch} (${Math.round(100*e)}%)`;s.A.warn(`OVERFLOW PREVENTION: ${r} - Emergency harvest triggered`),this.onSmartHarvestTrigger&&\"function\"==typeof this.onSmartHarvestTrigger&&this.onSmartHarvestTrigger(\"overflow\",90)}else{const t=this.currentPayloadSize>=this.smartHarvestPayloadThreshold,e=this.totalEvents>=this.smartHarvestEventThreshold;(t||e)&&this.onSmartHarvestTrigger&&\"function\"==typeof this.onSmartHarvestTrigger&&this.onSmartHarvestTrigger(\"smart\",60)}}setSmartHarvestCallback(t){this.onSmartHarvestTrigger=t}drain(){try{const t=this.buffer.splice(0);return this.totalEvents=0,this.currentPayloadSize=0,t}catch(t){return s.A.error(\"Failed to drain events from buffer:\",t.message),[]}}isEmpty(){return 0===this.totalEvents}size(){return this.totalEvents}clear(){this.buffer=[],this.totalEvents=0}makeRoom(t){if(t>this.maxPayloadSize)s.A.error(\"Event dropped: Event size exceeds maximum payload size.\");else for(;(this.totalEvents>=this.maxEventsPerBatch||this.currentPayloadSize+t>=this.maxPayloadSize)&&this.buffer.length>0;){const t=this.buffer.shift(),e=(0,a.Q3)(t);this.totalEvents--,this.currentPayloadSize-=e,s.A.warn(\"Event buffer full, oldest event removed.\")}}}},374(t,e,i){i.d(e,{n:()=>l});var s=i(431),r=i(413),a=i(481),n=i(347),o=i(51),h=i(302),d=i(144);class l{constructor(t){this.eventBuffer=t,this.retryQueueHandler=new r.u,this.httpClient=new a.X,this.fallBackUrl=\"\",this.retryCount=0,this.eventBuffer instanceof s.t&&this.eventBuffer.setSmartHarvestCallback((t,e)=>this.triggerSmartHarvest(t,e)),this.isStarted=!1,this.currentTimerId=null,this.harvestCycle=o.A.INTERVAL,this.isHarvesting=!1,this.qoeCycleCount=1,this.forceNextQoeCycle=!1,this.beforeDrainCallback=null,this._lastSentQoeKpis={},this.setupPageLifecycleHandlers()}startScheduler(){this.isStarted?d.A.warn(\"Harvest scheduler is already started\"):(this.isStarted=!0,d.A.notice(\"Starting harvest scheduler\",{harvestCycle:this.harvestCycle,eventBufferSize:this.eventBuffer?this.eventBuffer.size():0}),this.scheduleNextHarvest())}stopScheduler(){this.isStarted&&(this.isStarted=!1,this.currentTimerId&&(clearTimeout(this.currentTimerId),this.currentTimerId=null),d.A.notice(\"Harvest scheduler stopped\"))}async triggerSmartHarvest(t,e){if(d.A.notice(`${t} harvest triggered at ${e}% threshold`,{type:t,threshold:e}),this.eventBuffer&&!this.eventBuffer.isEmpty()){this.currentTimerId&&(clearTimeout(this.currentTimerId),this.currentTimerId=null);try{await this.triggerHarvest({})}catch(e){d.A.error(`${t} harvest failed:`,e.message)}finally{this.isStarted&&this.scheduleNextHarvest()}}}scheduleNextHarvest(){if(!this.isStarted)return;const t=this.harvestCycle;this.currentTimerId=setTimeout(()=>this.onHarvestInterval(),t)}async onHarvestInterval(){try{const t=this.eventBuffer&&!this.eventBuffer.isEmpty(),e=this.retryQueueHandler&&this.retryQueueHandler.getQueueSize()>0;if(!t&&!e)return;await this.triggerHarvest({})}catch(t){d.A.error(\"Error during scheduled harvest:\",t.message)}finally{this.scheduleNextHarvest()}}async triggerHarvest(t={}){if(this.isHarvesting)return{success:!1,reason:\"harvest_in_progress\"};this.isHarvesting=!0;try{let e=this.drainEvents(t);if(t.isFinalHarvest){const t=o.A.MAX_BEACON_SIZE;(0,n.Q3)(e)>t&&(e=this.trimEventsToFit(e,t))}const i=await this.sendChunk(e,t,!0);return{success:i.success,totalChunks:1,results:[i]}}catch(t){return d.A.error(\"Harvest cycle failed:\",t.message),this.handleHarvestFailure(t),{success:!1,error:t.message,consecutiveFailures:this.consecutiveFailures}}finally{this.isHarvesting=!1}}trimEventsToFit(t,e){if(0===t.length)return t;const i=[];let s=0;for(let r=t.length-1;r>=0;r--){const a=t[r],o=(0,n.Q3)({ins:[a,...i]});o>e||(i.unshift(a),s=o)}const r=t.length-i.length;if(r>0){const a=t.slice(0,r);d.A.warn(`Discarded ${r} events to fit beacon size limit`,{originalCount:t.length,trimmedCount:i.length,finalSize:s,maxSize:e}),this.retryQueueHandler&&this.retryQueueHandler.addFailedEvents(a)}return i}drainEvents(t={}){const e=window.NRVIDEO?.config?.qoeIntervalFactor??1,i=!!t.isFinalHarvest||this.forceNextQoeCycle,s=(this.qoeCycleCount-1)%e==0||i;if(this.forceNextQoeCycle&&(this.forceNextQoeCycle=!1),this.beforeDrainCallback&&\"function\"==typeof this.beforeDrainCallback)try{this.beforeDrainCallback()}catch(t){d.A.error(\"Before drain callback failed:\",t.message)}const r=this.eventBuffer.drain();let a;if(s)a=r;else{a=[];for(const t of r)t.actionName===h.A.Events.QOE_AGGREGATE?this.eventBuffer.add(t):a.push(t)}this.qoeCycleCount++;for(let t=a.length-1;t>=0;t--){const e=a[t];e.actionName===h.A.Events.QOE_AGGREGATE&&(!i&&this._qoeKpisUnchanged(e)?a.splice(t,1):this._saveQoeKpis(e))}let l=[...a],c=(0,n.Q3)(a);if(this.retryQueueHandler&&this.retryQueueHandler.getQueueSize()>0){const t=o.A.MAX_PAYLOAD_SIZE-c,e=o.A.MAX_EVENTS_PER_BATCH-l.length;if(t>0&&e>0){const i=this.retryQueueHandler.getRetryEventsToFit(t,e);i.length>0&&(l=[...i,...l])}}return l}async sendChunk(t,e,i){const s={url:(0,n.c$)(this.fallBackUrl),payload:{body:{ins:t}},options:{...e,isLastChunk:i}};return new Promise(e=>{this.httpClient.send(s,i=>{i.retry?this.handleRequestFailure(t):(this.retryCount=0,this.fallBackUrl=\"\"),e({success:!i.retry,status:i.status,error:i.error,chunk:t,eventCount:t.length})})})}handleRequestFailure(t){this.retryQueueHandler.addFailedEvents(t),\"US\"===window.NRVIDEO?.info?.region&&(this.retryCount++,this.retryCount>5?(this.retryCount=0,this.fallBackUrl=\"\"):this.retryCount>=2&&(this.fallBackUrl=o.A.COLLECTOR.US[1]))}handleHarvestFailure(t){this.consecutiveFailures++,d.A.warn(\"Harvest failure handled\",{error:t.message,consecutiveFailures:this.consecutiveFailures})}updateHarvestInterval(t){\"number\"!=typeof t&&isNaN(t)?d.A.warn(\"Invalid newInterval provided to updateHarvestInterval\"):t<1e3||t>3e5?d.A.warn(\"newInterval out of bounds (1000-300000), ignoring\"):this.harvestCycle!==t&&(this.harvestCycle=t,d.A.notice(\"Updated harvestCycle:\",this.harvestCycle),this.currentTimerId&&(clearTimeout(this.currentTimerId),this.currentTimerId=null),this.isStarted&&this.scheduleNextHarvest())}setupPageLifecycleHandlers(){let t=!1;const e=()=>{t||(t=!0,this.triggerHarvest({isFinalHarvest:!0,force:!0}))};document.addEventListener(\"visibilitychange\",()=>{document.hidden&&e()}),window.addEventListener(\"pagehide\",()=>{e()}),window.addEventListener(\"beforeunload\",()=>{e()})}_qoeKpisUnchanged(t){const e=this._lastSentQoeKpis[t.viewId];if(!e)return!1;for(const i of o.A.QOE_KPI_KEYS)if(t[i]!==e[i])return!1;return!0}_saveQoeKpis(t){const e={};for(const i of o.A.QOE_KPI_KEYS)e[i]=t[i];this._lastSentQoeKpis[t.viewId]=e}}},144(t,e,i){i.d(e,{A:()=>o});class s{static error(...t){r(t,s.Levels.ERROR,\"darkred\")}static warn(...t){r(t,s.Levels.WARNING,\"darkorange\")}static notice(...t){r([].slice.call(arguments),s.Levels.NOTICE,\"darkcyan\")}static debug(...t){r(t,s.Levels.DEBUG,\"indigo\")}static debugCommonVideoEvents(t,e,i){try{if(s.level<=s.Levels.DEBUG){i=i||function(t){s.debug(\"Event: \"+t.type)};var r=[\"canplay\",\"buffering\",\"waiting\",\"ended\",\"play\",\"playing\",\"pause\",\"resume\",\"error\",\"abort\",\"seek\",\"seeking\",\"seeked\",\"stalled\",\"dispose\",\"loadeddata\",\"loadstart\",\"loadedmetadata\"];e&&(null===e[0]?(e.shift(),r=e):r=r.concat(e));for(var a=0;a<r.length;a++)\"function\"==typeof t?t.call(window,r[a],i):t.on?t.on(r[a],i):t.addEventListener?t.addEventListener(r[a],i):t.addEventHandler?t.addEventHandler(r[a],i):s.warn(\"debugCommonVideoEvents: No common listener function found for \",t)}}catch(t){s.warn(t)}}}function r(t,e,i){e=e||s.Levels.NOTICE,i=i||\"darkcyan\";var r,o,h=s.prefix;s.includeTime&&(h+=\"[\"+(\"0\"+(r=new Date).getDate()).slice(-2)+\":\"+(\"0\"+r.getMinutes()).slice(-2)+\":\"+(\"0\"+r.getSeconds()).slice(-2)+\".\"+(\"00\"+r.getMilliseconds()).slice(-3)+\"] \"),h+=function(t){return n[t]}(e)+\":\",s.level<=e&&e!==s.Levels.SILENT&&(!s.colorful||\"undefined\"!=typeof document&&document.documentMode?a(t,h):(o=e===s.Levels.ERROR&&console.error?console.error:e===s.Levels.WARNING&&console.warn?console.warn:e===s.Levels.DEBUG&&console.debug&&null==window.cast?console.debug:console.log,h=\"%c\"+h,t.splice(0,0,h,\"color: \"+i),o.apply(console,t)))}function a(t,e){if(t instanceof Array)for(var i in t)a(t[i],e);else\"string\"==typeof t?console.log(e+\" \"+t):(console.log(e+\"↵\"),console.log(t))}s.Levels={SILENT:5,ERROR:4,WARNING:3,NOTICE:2,DEBUG:1,ALL:0},s.level=s.Levels.ERROR,s.colorful=!0,s.includeTime=!0,s.prefix=\"[nrvideo]\";const n={4:\"e\",3:\"w\",2:\"n\",1:\"d\"};!function(){if(\"undefined\"!=typeof window&&window.location&&window.location.search){var t=/\\?.*&*nrvideo-debug=(.+)/i.exec(window.location.search);null!==t&&(\"true\"===t[1]?s.level=s.Levels.ALL:s.level=t[1]),null!==/\\?.*&*nrvideo-colors=false/i.exec(window.location.search)&&(s.colorful=!1)}}();const o=s},481(t,e,i){i.d(e,{X:()=>a});var s=i(347),r=i(144);class a{async send(t,e){const{url:i,payload:s,options:a={}}=t;try{if(!i||!s)throw new Error(\"URL and payload are required\");const t={url:i,payload:s,options:a,callback:e};await this.executeRequest(t)}catch(t){r.A.error(\"Failed to send request:\",t.message),e({retry:!1,status:0,error:t.message})}}async executeRequest(t){const{url:e,payload:i,options:s,callback:a}=t,n=Date.now();try{const a=(o=JSON.stringify(i.body),h=window.NRVIDEO?.config?.obfuscate,h&&0!==h.length?h.reduce((t,e)=>{let i;try{if(e.regex instanceof RegExp){const t=e.regex.flags.includes(\"g\")?e.regex.flags:e.regex.flags+\"g\";i=new RegExp(e.regex.source,t)}else i=new RegExp(e.regex,\"g\")}catch(i){return r.A.warn(\"applyObfuscationRules: invalid regex, skipping rule:\",e.regex,i.message),t}return t.replace(i,e.replacement)},o):o);if(s.isFinalHarvest&&navigator.sendBeacon){const i=await this.sendWithBeacon(e,a),s={success:i,status:i?204:0};return void this.handleRequestComplete(t,s,n)}const d=await this.fetchWithTimeout(e,{method:\"POST\",body:a,headers:{\"Content-Type\":\"application/json\"},keepalive:s.isFinalHarvest},1e4),l={success:d.ok,status:d.status,statusText:d.statusText};this.handleRequestComplete(t,l,n)}catch(e){const i={success:!1,status:0,error:e.message};this.handleRequestComplete(t,i,n)}var o,h}handleRequestComplete(t,e){const{callback:i}=t;i({retry:!e.success&&(0===e.status||(0,s.Sc)(e.status)),status:e.status,error:e.error})}async sendWithBeacon(t,e){try{return navigator.sendBeacon(t,e)}catch(t){return r.A.warn(\"sendBeacon failed, falling back to fetch:\",t.message),!1}}async fetchWithTimeout(t,e,i){const s=new AbortController,r=setTimeout(()=>s.abort(),i);try{const i=await fetch(t,{...e,signal:s.signal});return clearTimeout(r),i}catch(t){if(clearTimeout(r),\"AbortError\"===t.name)throw new Error(`Request timeout after ${i}ms`);throw t}}}},413(t,e,i){i.d(e,{u:()=>h});var s=i(144),r=i(347),a=i(51);const{MAX_PAYLOAD_SIZE:n,MAX_EVENTS_PER_BATCH:o}=a.A;class h{constructor(){this.retryQueue=[],this.maxQueueSize=o,this.maxQueueSizeBytes=n}addFailedEvents(t){try{const e=Array.isArray(t)?t:[t];s.A.notice(`Adding ${e.length} failed events to retry queue`,{queueSizeBefore:this.retryQueue.length});for(const t of e){this.retryQueue.length>=this.maxQueueSize&&this.evictOldestEvent();const e=(0,r.Q3)(t);for(;(0,r.Q3)(this.retryQueue)+e>this.maxQueueSizeBytes;)this.evictOldestEvent();this.retryQueue.push({...t})}}catch(t){s.A.error(\"Failed to add events to retry queue:\",t.message)}}discardEvent(t,e){s.A.warn(\"Discarded event\",{reason:e,eventType:t.eventType})}evictOldestEvent(){if(this.retryQueue.length>0){const t=this.retryQueue.shift();this.discardEvent(t,\"Queue full - evicted oldest\")}}getRetryEventsToFit(t,e){const i=[];let s=0,a=0;for(let n=this.retryQueue.length-1;n>=0;n--){const o=this.retryQueue[n];if(a>=e)break;const h=(0,r.Q3)(o);if(s+h>t)break;i.unshift(o),s+=h,a++,this.retryQueue.splice(n,1)}return i}getQueueSize(){return this.retryQueue.length}clear(){this.retryQueue=[]}}},302(t,e,i){i.d(e,{A:()=>l});var s=i(330),r=i(568),a=i(455),n=i(51),o=i(487),h=i(144);class d extends r.A{constructor(t){super(),this.customData={},this.heartbeat=null,this.parentTracker=null,this._trackerReadyChrono=new a.A,this._trackerReadyChrono.start(),this._actionTable=n.A.ACTION_TABLE,this._actionAdTable=n.A.ACTION_AD_TABLE,t=t||{},this.setOptions(t)}setOptions(t){t&&(t.parentTracker&&(this.parentTracker=t.parentTracker),t.customData&&(this.customData=t.customData),t.heartbeat&&(this.heartbeat=t.heartbeat))}dispose(){this.unregisterListeners()}registerListeners(){}unregisterListeners(){}getHeartbeat(){return this.state._isAd?2e3:this.heartbeat?this.heartbeat:this.parentTracker&&this.parentTracker.heartbeat?this.parentTracker.heartbeat:3e4}startHeartbeat(){this._heartbeatInterval=setInterval(this.sendHeartbeat.bind(this),Math.max(this.getHeartbeat(),2e3))}stopHeartbeat(){this._heartbeatInterval&&clearInterval(this._heartbeatInterval)}sendHeartbeat(t){this.sendVideoAction(d.Events.HEARTBEAT,t)}getAttributes(t,e){(t=t||{}).trackerName=this.getTrackerName(),t.trackerVersion=this.getTrackerVersion(),t.coreVersion=s.rE,t.timeSinceTrackerReady=this._trackerReadyChrono.getDeltaTime();for(let e in this.customData)t[e]=this.customData[e];return null!=document.hidden&&(t.isBackgroundEvent=document.hidden),t}getTrackerVersion(){return s.rE}getTrackerName(){return\"base-tracker\"}sendVideoAction(t,e){this.emit(\"VideoAction\",t,this.getAttributes(e))}sendVideoAdAction(t,e){this.emit(\"VideoAdAction\",t,this.getAttributes(e))}sendVideoErrorAction(t,e){let i=this.isAd()?\"adError\":\"videoError\";this.emit(\"VideoErrorAction\",t,this.getAttributes(e,i))}sendVideoCustomAction(t,e){this.emit(\"VideoCustomAction\",t,this.getAttributes(e,\"customAction\"))}setHarvestInterval(t){if(o.videoAnalyticsHarvester)try{o.videoAnalyticsHarvester.setHarvestInterval(t)}catch(t){return void h.A.error(\"Failed to set harvest interval:\",t.message)}else h.A.error(\"VideoAnalyticsHarvester is not available\")}}d.Events={HEARTBEAT:\"HEARTBEAT\",QOE_AGGREGATE:\"QOE_AGGREGATE\"};const l=d},347(t,e,i){i.d(e,{Q3:()=>n,Sc:()=>o,c$:()=>a,z8:()=>h});var s=i(330),r=i(144);function a(t){try{if(!window.NRVIDEO||!window.NRVIDEO.info)throw new Error(\"NRVIDEO info is not available.\");let{beacon:e,licenseKey:i,applicationID:r}=window.NRVIDEO.info;if(!e||!i)throw new Error(\"Options object provided by New Relic is not correctly initialized\");return r?`https://${t||e}/ins/1/${i}?a=${r}&v=${s.rE}&ref=${window.location.href}&ca=VA`:`https://${t||e}/ins/1/${i}?&v=${s.rE}&ref=${window.location.href}&ca=VA`}catch(t){return console.error(t.message),null}}function n(t){if(\"string\"==typeof t&&t.length)return t.length;if(\"object\"==typeof t){if(\"undefined\"!=typeof ArrayBuffer&&t instanceof ArrayBuffer&&t.byteLength)return t.byteLength;if(\"undefined\"!=typeof Blob&&t instanceof Blob&&t.size)return t.size;if(!(\"undefined\"!=typeof FormData&&t instanceof FormData))try{return function(t){try{return JSON.stringify(t,(()=>{const t=new WeakSet;return(e,i)=>{if(\"object\"==typeof i&&null!==i){if(t.has(i))return;t.add(i)}return i}})())??\"\"}catch(t){return r.A.error(\"Error stringifying value:\",t.message),\"\"}}(t).length}catch(t){return}}}function o(t){switch(t){case 408:case 429:case 500:return!0;case 401:case 403:case 404:return!1}return t>=502&&t<=504||t>=512&&t<=530}function h(t,e){return t&&Array.isArray(t)&&0!==t.length?e&&\"object\"==typeof e?t.reduce((t,i)=>(i in e&&(t[i]=e[i]),t),{}):{}:e}},330(t){t.exports={rE:\"4.1.7\"}}},e={};function i(s){var r=e[s];if(void 0!==r)return r.exports;var a=e[s]={exports:{}};return t[s](a,a.exports,i),a.exports}i.d=(t,e)=>{for(var s in e)i.o(e,s)&&!i.o(t,s)&&Object.defineProperty(t,s,{enumerable:!0,get:e[s]})},i.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e);var s=i(144),r=i(487),a=i(51),n=i(302),o=i(347);function h(t,e={}){try{if(!a.A.VALID_EVENT_TYPES.includes(t))return s.A.warn(\"Invalid event type provided to recordEvent\",{eventType:t}),!1;if(!window?.NRVIDEO?.info)return;const{appName:i,applicationID:h}=window.NRVIDEO.info,{qoe:d,...l}=e,c=d?{...d}:{},u={...h?{}:{appName:i},timestamp:Date.now(),timeSinceLoad:window.performance?window.performance.now()/1e3:null},A={...l,eventType:t,...u},g=(0,o.z8)(a.A.QOE_AGGREGATE_KEYS,e);let m=null;\"VideoAction\"===t&&(m={eventType:\"VideoAction\",actionName:n.A.Events.QOE_AGGREGATE,qoeAggregateVersion:\"1.0.0\",...c,...g,...u});const f=r.videoAnalyticsHarvester.addEvent(A);if(m&&window?.NRVIDEO?.config?.qoeAggregate){const t=r.videoAnalyticsHarvester.addEvent(m);return f&&t}return f}catch(t){return s.A.error(\"Failed to record event:\",t.message),!1}}const{COLLECTOR:d}=a.A;const l=new class{setConfiguration(t,e){return!!this.validateRequiredFields(t)&&!!this.validateConfigFields(e)&&(this.initializeGlobalConfig(t,e),s.A.notice(\"Video analytics configuration initialized successfully\"),!0)}validateRequiredFields(t){if(!t||\"object\"!=typeof t)return s.A.error(\"Configuration must be an object\"),!1;const{licenseKey:e,appName:i,region:r,applicationID:a,beacon:n}=t;if(!e)return s.A.error(\"licenseKey is required\"),!1;if(a){if(!n)return s.A.error(\"beacon is required when applicationID is provided\"),!1;if(!Object.values(d).flatMap(t=>t).includes(n))return s.A.error(`Invalid beacon: ${n}`),!1}else{if(!i||!r)return s.A.error(\"appName and region are required when applicationID is not provided\"),!1;if(!d[r])return s.A.error(`Invalid region: ${r}. Valid regions are: ${Object.keys(d).join(\", \")}`),!1}return!0}validateConfigFields(t){if(null==t)return!0;if(\"object\"!=typeof t||Array.isArray(t))return s.A.error(\"config must be an object\"),!1;const{qoeAggregate:e,obfuscate:i}=t;return void 0!==e&&\"boolean\"!=typeof e?(s.A.error(\"qoeAggregate must be a boolean\"),!1):!(void 0!==i&&!Array.isArray(i)&&(s.A.error(\"obfuscate must be an array\"),1))}filterObfuscateRules(t){return t?t.filter(t=>{const e=void 0!==t.regex&&(\"string\"==typeof t.regex||t.regex instanceof RegExp),i=void 0!==t.replacement&&\"string\"==typeof t.replacement;return!(!e||!i)||(s.A.warn(\"obfuscate rule missing required 'regex' (string|RegExp) and/or 'replacement' (string), skipping:\",t),!1)}):[]}sanitizeQoeIntervalFactor(t){return null==t?2:\"number\"==typeof t&&Number.isInteger(t)&&t>=1?t:(s.A.warn(`Invalid qoeIntervalFactor \"${t}\" — must be a positive integer. Defaulting to 2.`),2)}initializeGlobalConfig(t,e){let{licenseKey:i,appName:s,region:r,beacon:n,applicationID:o}=t;n=\"US\"===r?a.A.COLLECTOR.US[0]:n||d[r],window.NRVIDEO={info:{...r?{region:r}:{},beacon:n,licenseKey:i,applicationID:o,...o?{}:{appName:s}},config:{qoeAggregate:e?.qoeAggregate??!0,qoeIntervalFactor:this.sanitizeQoeIntervalFactor(e?.qoeIntervalFactor),obfuscate:this.filterObfuscateRules(e?.obfuscate)}}}};class c{static addTracker(t,e){var i,r;e?.info&&(i=e.info,r=e?.config,l.setConfiguration(i,r)),t.on&&t.emit?(u.push(t),t.on(\"*\",A),\"function\"==typeof t.trackerInit&&t.trackerInit()):s.A.error(\"Tried to load a non-tracker.\",t)}static removeTracker(t){t.off(\"*\",A),t.dispose();let e=u.indexOf(t);-1!==e&&u.splice(e,1)}static getTrackers(){return u}static send(t,e,i){return h(t,{actionName:e,...i})}static sendError(t){return h(\"VideoErrorAction\",{actionName:\"ERROR\",...t})}static async forceHarvest(){try{const{videoAnalyticsHarvester:t}=i(487);return await t.forceHarvest()}catch(t){return s.A.error(\"Failed to force harvest:\",t.message),{success:!1,error:t.message}}}}let u=[];function A(t){try{let e=function(t){let e={};for(let i in t)null!==t[i]&&void 0!==t[i]&&(e[i]=t[i]);return e}(t.data);s.A.level<=s.A.Levels.DEBUG?s.A.notice(\"Sent\",t.type,e):s.A.notice(\"Sent\",t.type),c.send(t.eventType,t.type,e)}catch(t){s.A.error(\"Error in event handler:\",t.message)}}const g=c;var m=i(455),f=i(568);const E=class{constructor(){this.reset(),this._createdAt=Date.now(),this._hb=!0,this._acc=0,this._bufferAcc=0}reset(){this._viewSession=null,this._viewCount=0,this._isAd=!1,this.numberOfErrors=0,this.numberOfAds=0,this.numberOfVideos=0,this.totalPlaytime=0,this.weightedAverageBitrate=0,this.totalAdPlaytime=0,this.isAdBreak=!1,this.initialBufferingHappened=!1,this.startupTime=null,this.peakBitrate=0,this._lastBitrate=null,this._lastBitrateChangeTimestamp=null,this.partialAverageBitrate=0,this._totalBitrateDuration=0,this.hadStartupError=!1,this.hadPlaybackError=!1,this.totalRebufferingTime=0,this.resetFlags(),this.resetChronos()}resetFlags(){this.isPlayerReady=!1,this.isRequested=!1,this.isStarted=!1,this.isPaused=!1,this.isSeeking=!1,this.isBuffering=!1,this.isPlaying=!1}resetChronos(){this.timeSinceRequested=new m.A,this.timeSinceStarted=new m.A,this.timeSincePaused=new m.A,this.timeSinceSeekBegin=new m.A,this.timeSinceBufferBegin=new m.A,this.timeSinceAdBreakStart=new m.A,this.timeSinceLastDownload=new m.A,this.timeSinceLastHeartbeat=new m.A,this.timeSinceLastRenditionChange=new m.A,this.timeSinceLastAdQuartile=new m.A,this.timeSinceLastAd=new m.A,this.timeSinceLastError=new m.A,this.timeSinceLastAdError=new m.A,this.timeSinceResumed=new m.A,this.timeSinceSeekEnd=new m.A,this.playtimeSinceLastEvent=new m.A,this.customTimeSinceAttributes={},this.elapsedTime=new m.A,this.bufferElapsedTime=new m.A,this._totalAdPlaytime=new m.A}isAd(){return this._isAd}setIsAd(t){this._isAd=t}setTimeSinceAttribute(t){this.customTimeSinceAttributes[t]=new m.A,this.customTimeSinceAttributes[t].start()}removeTimeSinceAttribute(t){delete this.customTimeSinceAttributes[t]}getViewSession(){if(!this._viewSession){let t=(new Date).getTime(),e=Math.random().toString(36).substring(2)+Math.random().toString(36).substring(2);this._viewSession=t+\"-\"+e}return this._viewSession}getViewId(){return this.getViewSession()+\"-\"+this._viewCount}getStateAttributes(t){t=t||{},this.isAd()?(this.isRequested&&(t.timeSinceAdRequested=this.timeSinceRequested.getDeltaTime(),t.timeSinceLastAdHeartbeat=this.timeSinceLastHeartbeat.getDeltaTime()),this.isStarted&&(t.timeSinceAdStarted=this.timeSinceStarted.getDeltaTime()),this.isPaused&&(t.timeSinceAdPaused=this.timeSincePaused.getDeltaTime()),this.isBuffering&&(t.timeSinceAdBufferBegin=this.timeSinceBufferBegin.getDeltaTime()),this.isSeeking&&(t.timeSinceAdSeekBegin=this.timeSinceSeekBegin.getDeltaTime()),this.isAdBreak&&(t.timeSinceAdBreakBegin=this.timeSinceAdBreakStart.getDeltaTime()),this.numberOfErrors>0&&this.timeSinceLastAdError.startTime>0&&(t.timeSinceLastAdError=this.timeSinceLastAdError.getDeltaTime()),t.numberOfAds=this.numberOfAds):(this.isRequested&&(t.timeSinceRequested=this.timeSinceRequested.getDeltaTime(),t.timeSinceLastHeartbeat=this.timeSinceLastHeartbeat.getDeltaTime()),this.isStarted&&(t.timeSinceStarted=this.timeSinceStarted.getDeltaTime()),this.isPaused&&(t.timeSincePaused=this.timeSincePaused.getDeltaTime()),this.isBuffering&&(t.timeSinceBufferBegin=this.timeSinceBufferBegin.getDeltaTime()),this.isSeeking&&(t.timeSinceSeekBegin=this.timeSinceSeekBegin.getDeltaTime()),t.timeSinceLastAd=this.timeSinceLastAd.getDeltaTime(),this.numberOfErrors>0&&this.timeSinceLastError.startTime>0&&(t.timeSinceLastError=this.timeSinceLastError.getDeltaTime()),t.numberOfVideos=this.numberOfVideos),t.numberOfErrors=this.numberOfErrors,this.isAd()||(this.playtimeSinceLastEvent.startTime>0?t.playtimeSinceLastEvent=this.playtimeSinceLastEvent.getDeltaTime():t.playtimeSinceLastEvent=0,this.isPlaying?this.playtimeSinceLastEvent.start():this.playtimeSinceLastEvent.reset(),this.totalPlaytime+=t.playtimeSinceLastEvent,t.totalPlaytime=this.totalPlaytime);for(const[e,i]of Object.entries(this.customTimeSinceAttributes))t[e]=i.getDeltaTime();return t}getQoeAttributes(t){t=t||{};const e={};try{null!==this.startupTime&&(e.startupTime=this.startupTime),this.peakBitrate>0&&(e.peakBitrate=this.peakBitrate),e.hadStartupError=this.hadStartupError,e.hadPlaybackError=this.hadPlaybackError,e.totalRebufferingTime=this.totalRebufferingTime,e.rebufferingRatio=this.totalPlaytime>0?this.totalRebufferingTime/this.totalPlaytime*100:0,e.totalPlaytime=this.totalPlaytime,e.averageBitrate=this.weightedBitrate,e.numberOfErrors=this.numberOfErrors}catch(t){s.A.error(\"Failed to add attributes for QOE KPIs\",t.message)}return t.qoe=e,t}calculateBufferType(t){let e=\"\";return e=t?\"initial\":this.isSeeking?\"seek\":this.isPaused?\"pause\":\"connection\",s.A.debug(\"Buffer Type = \"+e),e}goViewCountUp(){this._viewCount++}goPlayerReady(){return!this.isPlayerReady&&(this.isPlayerReady=!0,!0)}goRequest(){return!this.isRequested&&(this.isRequested=!0,this.timeSinceLastAd.reset(),this.timeSinceRequested.start(),!0)}goStart(){return!(!this.isRequested||this.isStarted||(this.isAd()?this.numberOfAds++:this.numberOfVideos++,this.isStarted=!0,this.isPlaying=!0,this.timeSinceStarted.start(),this.playtimeSinceLastEvent.start(),0))}goEnd(){return!!this.isRequested&&(this.numberOfErrors=0,this.resetFlags(),this.timeSinceRequested.stop(),this.timeSinceStarted.stop(),this.playtimeSinceLastEvent.stop(),this.isPlaying=!1,!0)}goPause(){return!(!this.isStarted||this.isPaused||(this.isPaused=!0,this.isPlaying=!1,this.timeSincePaused.start(),this.playtimeSinceLastEvent.stop(),this.timeSinceResumed.reset(),this.isBuffering&&(this._bufferAcc+=this.bufferElapsedTime.getDeltaTime()),this.elapsedTime.start(),0))}goResume(){return!(!this.isStarted||!this.isPaused||(this.isPaused=!1,this.isPlaying=!0,this.timeSincePaused.stop(),this.timeSinceResumed.start(),this._hb?(this._acc=this.elapsedTime.getDeltaTime(),this._hb=!1):(this.isBuffering&&this.bufferElapsedTime.start(),this._acc+=this.elapsedTime.getDeltaTime()),0))}goBufferStart(){return!(!this.isRequested||this.isBuffering||(this.isBuffering=!0,this.isPlaying=!1,this.timeSinceBufferBegin.start(),this.bufferElapsedTime.start(),0))}goBufferEnd(){return!(!this.isRequested||!this.isBuffering||(this.isBuffering=!1,this.isPlaying=!0,this.timeSinceBufferBegin.stop(),this._hb?(this._bufferAcc=this.bufferElapsedTime.getDeltaTime(),this._hb=!1):this._bufferAcc+=this.bufferElapsedTime.getDeltaTime(),!this.isAd()&&this.initialBufferingHappened&&(this.totalRebufferingTime+=this.timeSinceBufferBegin.stopTime-this.timeSinceBufferBegin.startTime),0))}goSeekStart(){return!(!this.isStarted||this.isSeeking||(this.isSeeking=!0,this.isPlaying=!1,this.timeSinceSeekBegin.start(),this.timeSinceSeekEnd.reset(),0))}goSeekEnd(){return!(!this.isStarted||!this.isSeeking||(this.isSeeking=!1,this.isPlaying=!0,this.timeSinceSeekBegin.stop(),this.timeSinceSeekEnd.start(),0))}goAdBreakStart(){return!this.isAdBreak&&(this.isAdBreak=!0,this.timeSinceAdBreakStart.start(),!0)}goAdBreakEnd(){return!!this.isAdBreak&&(this.isRequested=!1,this.isAdBreak=!1,this.totalAdPlaytime=this.timeSinceAdBreakStart.getDeltaTime(),this.timeSinceAdBreakStart.stop(),!0)}goDownload(){this.timeSinceLastDownload.start()}goHeartbeat(){this.timeSinceLastHeartbeat.start()}goRenditionChange(){this.timeSinceLastRenditionChange.start()}goAdQuartile(){this.timeSinceLastAdQuartile.start()}goError(){this.isError=!0,this.numberOfErrors++,this.isAd()?this.timeSinceLastAdError.start():(this.timeSinceLastError.start(),this.isStarted?this.hadPlaybackError=!0:this.hadStartupError=!0)}goLastAd(){this.timeSinceLastAd.start()}trackContentBitrateState(t){if(t&&\"number\"==typeof t){this.peakBitrate=Math.max(this.peakBitrate,t);const e=Date.now();if(!this.isPlaying){if(null!==this._lastBitrate&&null!==this._lastBitrateChangeTimestamp){const t=e-this._lastBitrateChangeTimestamp;t>0&&(this.partialAverageBitrate+=this._lastBitrate*t,this._totalBitrateDuration+=t),this._lastBitrateChangeTimestamp=null}return void(this._lastBitrate=t)}if(null===this._lastBitrateChangeTimestamp&&null!==this._lastBitrate&&(this._lastBitrateChangeTimestamp=e),null!==this._lastBitrate&&this._lastBitrate!==t&&null!==this._lastBitrateChangeTimestamp){const t=e-this._lastBitrateChangeTimestamp;t>0&&(this.partialAverageBitrate+=this._lastBitrate*t,this._totalBitrateDuration+=t),this._lastBitrateChangeTimestamp=e}null===this._lastBitrateChangeTimestamp&&(this._lastBitrateChangeTimestamp=e),this._lastBitrate=t;let i=this.partialAverageBitrate,s=this._totalBitrateDuration;const r=e-this._lastBitrateChangeTimestamp;r>0&&(i+=t*r,s+=r),this.weightedBitrate=s>0?Math.round(i/s):t}}resetViewIdTrackedState(){this.peakBitrate=0,this.partialAverageBitrate=0,this._totalBitrateDuration=0,this.startupTime=null,this._lastBitrate=null,this._lastBitrateChangeTimestamp=null}clearTotalAdsTime(){s.A.debug(\"clear total ads time\",this.totalAdTime),this._totalAdPlaytime.reset()}totalAdTime(){return this._totalAdPlaytime.getDuration()}startAdsTime(){return s.A.debug(\"startAdsTime\"),this._totalAdPlaytime.start()}stopAdsTime(){return s.A.debug(\"stopAdsTime\"),this._totalAdPlaytime.stop()}setStartupTime(t){null===this.startupTime&&(this.startupTime=Math.max(this.timeSinceRequested.getDeltaTime()-t,0))}};var T=i(330);class v extends n.A{constructor(t,e){super(),this.state=new E,this.adsTracker=null,this._lastBufferType=null,this._userId=null,e=e||{},this.setOptions(e),t&&this.setPlayer(t,e.tag),s.A.notice(\"Tracker \"+this.getTrackerName()+\" v\"+this.getTrackerVersion()+\" is ready.\")}setUserId(t){this._userId=t}setOptions(t){t&&(t.adsTracker&&this.setAdsTracker(t.adsTracker),\"boolean\"==typeof t.isAd&&this.setIsAd(t.isAd),n.A.prototype.setOptions.apply(this,arguments))}setPlayer(t,e){(this.player||this.tag)&&this.dispose(),\"undefined\"!=typeof document&&document.getElementById&&(\"string\"==typeof t&&(t=document.getElementById(t)),\"string\"==typeof e&&(e=document.getElementById(e))),e=e||t,this.player=t,this.tag=e,this.registerListeners()}isAd(){return this.state.isAd()}setIsAd(t){this.state.setIsAd(t)}setAdsTracker(t){this.disposeAdsTracker(),t&&(this.adsTracker=t,this.adsTracker.setIsAd(!0),this.adsTracker.parentTracker=this,this.adsTracker.on(\"*\",S.bind(this)))}disposeAdsTracker(){this.adsTracker&&(this.adsTracker.off(\"*\",S),this.adsTracker.dispose())}dispose(){this.stopHeartbeat(),this.disposeAdsTracker(),this.unregisterListeners(),this.player=null,this.tag=null}registerListeners(){}unregisterListeners(){}getViewId(){return this.parentTracker?this.parentTracker.getViewId():this.state.getViewId()}getViewSession(){return this.parentTracker?this.parentTracker.getViewSession():this.state.getViewSession()}getVideoId(){return null}getTitle(){return null}isLive(){return null}getBitrate(){return null}getManifestBitrate(){return null}getSegmentDownloadBitrate(){return null}getNetworkDownloadBitrate(){return null}getWebkitBitrate(){if(this.tag&&this.tag.webkitVideoDecodedByteCount){let t;if(this._lastWebkitBitrate){t=this.tag.webkitVideoDecodedByteCount;let e=t-this._lastWebkitBitrate,i=this.getHeartbeat()/1e3;t=Math.round(e/i*8)}return this._lastWebkitBitrate=this.tag.webkitVideoDecodedByteCount,t||null}}getRenditionName(){return null}getRenditionBitrate(){return null}getRenditionShift(t){let e,i=this.getRenditionBitrate();return this.isAd()?(e=this._lastAdRendition,t&&(this._lastAdRendition=i)):(e=this._lastRendition,t&&(this._lastRendition=i)),i&&e?i>e?\"up\":i<e?\"down\":null:null}getRenditionHeight(){return this.tag?this.tag.videoHeight:null}getRenditionWidth(){return this.tag?this.tag.videoWidth:null}getDuration(){return this.tag?this.tag.duration:null}getPlayhead(){return this.tag?this.tag.currentTime:null}getLanguage(){return null}getSrc(){return this.tag?this.tag.currentSrc:null}getPlayrate(){return this.tag?this.tag.playbackRate:null}isMuted(){return this.tag?this.tag.muted:null}isFullscreen(){return null}getCdn(){return null}getPlayerName(){return this.getTrackerName()}getPlayerVersion(){return T.rE}getFps(){return null}isAutoplayed(){return this.tag?this.tag.autoplay:null}getPreload(){return this.tag?this.tag.preload:null}getAdQuartile(){return null}getAdPosition(){return this.parentTracker?this.parentTracker.state.isStarted?\"mid\":\"pre\":null}getAdPartner(){return null}getAdCreativeId(){return null}getInstrumentationProvider(){return null}getInstrumentationName(){return null}getInstrumentationVersion(){return null}getAttributes(t,e){if(void 0===(t=n.A.prototype.getAttributes.apply(this,arguments)).isAd&&(t.isAd=this.isAd()),t.viewSession=this.getViewSession(),t.viewId=this.getViewId(),t.playerName=this.getPlayerName(),t.playerVersion=this.getPlayerVersion(),t[\"instrumentation.provider\"]=this.getInstrumentationProvider(),t[\"instrumentation.name\"]=this.getInstrumentationName(),t[\"instrumentation.version\"]=this.getInstrumentationVersion(),t[\"enduser.id\"]=this._userId,t.src=\"Browser\",\"customAction\"===e)return t;try{t.pageUrl=window.location.href}catch(t){}this.isAd()?(t.adId=this.getVideoId(),t.adTitle=this.getTitle(),t.adSrc=this.getSrc(),t.adCdn=this.getCdn(),this.state.isStarted&&(t.adBitrate=this.getBitrate()||0),t.adRenditionName=this.getRenditionName(),t.adRenditionHeight=this.getRenditionHeight(),t.adRenditionWidth=this.getRenditionWidth(),t.adDuration=this.getDuration(),t.adPlayhead=this.getPlayhead(),t.adLanguage=this.getLanguage(),t.adIsMuted=this.isMuted(),t.adFps=this.getFps(),t.adPosition=this.getAdPosition(),t.adCreativeId=this.getAdCreativeId(),t.adPartner=this.getAdPartner()):(t.contentId=this.getVideoId(),t.contentTitle=this.getTitle(),t.contentSrc=this.getSrc(),t.contentCdn=this.getCdn(),t.contentPlayhead=this.getPlayhead(),t.contentIsLive=this.isLive(),this.state.isStarted&&(t.contentBitrate=this.getBitrate()||0,t.contentManifestBitrate=this.getManifestBitrate()||0,t.contentSegmentDownloadBitrate=this.getSegmentDownloadBitrate()||0,t.contentNetworkDownloadBitrate=this.getNetworkDownloadBitrate()||0),t.contentRenditionName=this.getRenditionName(),t.contentRenditionHeight=this.getRenditionHeight(),t.contentRenditionWidth=this.getRenditionWidth(),t.contentDuration=this.getDuration(),t.contentLanguage=this.getLanguage(),t.contentPlayrate=this.getPlayrate(),t.contentIsFullscreen=this.isFullscreen(),t.contentIsMuted=this.isMuted(),t.contentIsAutoplayed=this.isAutoplayed(),t.contentPreload=this.getPreload(),t.contentFps=this.getFps(),null!=this.adsTracker&&this.adsTracker.state.totalAdPlaytime>0&&(t.totalAdPlaytime=this.adsTracker.state.totalAdPlaytime)),this.state.getStateAttributes(t),this.state.isStarted&&!this.isAd()&&this.state.trackContentBitrateState(t.contentBitrate);for(let e in this.customData)t[e]=this.customData[e];return this.addQoeAttributes(t),t}addQoeAttributes(t){const e=(t=this.state.getQoeAttributes(t)).qoe;for(let t in this.customData)e[t]=this.customData[t]}sendCustom(t,e,i){i=i||{},this.sendVideoCustomAction(t,i),this.state.setTimeSinceAttribute(e)}sendPlayerReady(t){this.state.goPlayerReady()&&(t=t||{},this.sendVideoAction(v.Events.PLAYER_READY,t))}sendRequest(t){if(this.state.goRequest()){let e;this.isAd()?(e=v.Events.AD_REQUEST,this.sendVideoAdAction(e,t)):(e=v.Events.CONTENT_REQUEST,this.sendVideoAction(e,t))}}sendStart(t){if(this.state.goStart()){let e;if(this.isAd())e=v.Events.AD_START,this.parentTracker&&(this.parentTracker.state.isPlaying=!1),this.sendVideoAdAction(e,t),this.state.startAdsTime();else{e=v.Events.CONTENT_START;let i=0;this.adsTracker&&((this.adsTracker.state.isPlaying||this.adsTracker.state.isBuffering)&&(this.adsTracker.state.stopAdsTime(),this.adsTracker.state.isPlaying=!1,this.adsTracker.state.isBuffering=!1),i=this.adsTracker.state.totalAdTime()??0),this.state.setStartupTime(i),this.sendVideoAction(e,t),r.videoAnalyticsHarvester.setBeforeDrainCallback(()=>{if(this.state){const t=this.state.getQoeAttributes({}).qoe;r.videoAnalyticsHarvester.refreshQoeKpis(t,this.getViewId())}})}this.startHeartbeat(),this.state.goHeartbeat()}}sendEnd(t){if(this.state.goEnd()){let e;t=t||{},this.isAd()?(e=v.Events.AD_END,t.timeSinceAdRequested=this.state.timeSinceRequested.getDeltaTime(),t.timeSinceAdStarted=this.state.timeSinceStarted.getDeltaTime(),this.parentTracker&&(this.parentTracker.state.isPlaying=!0),this.state.stopAdsTime()):(e=v.Events.CONTENT_END,t.timeSinceRequested=this.state.timeSinceRequested.getDeltaTime(),t.timeSinceStarted=this.state.timeSinceStarted.getDeltaTime()),this.stopHeartbeat(),this.isAd()?this.sendVideoAdAction(e,t):this.sendVideoAction(e,t),this.parentTracker&&this.isAd()&&this.parentTracker.state.goLastAd(),this.state.goViewCountUp(),this.state.totalPlaytime=0,this.isAd()||(r.videoAnalyticsHarvester.forceNextQoeCycle(),r.videoAnalyticsHarvester.setBeforeDrainCallback(null),this.adsTracker&&this.adsTracker.state.clearTotalAdsTime(),this.state.resetViewIdTrackedState())}}sendPause(t){if(this.state.goPause()){let e=this.isAd()?v.Events.AD_PAUSE:v.Events.CONTENT_PAUSE;this.isAd()?this.sendVideoAdAction(e,t):this.sendVideoAction(e,t)}}sendResume(t){if(this.state.goResume()){let e;t=t||{},this.isAd()?(e=v.Events.AD_RESUME,t.timeSinceAdPaused=this.state.timeSincePaused.getDeltaTime()):(e=v.Events.CONTENT_RESUME,t.timeSincePaused=this.state.timeSincePaused.getDeltaTime()),this.isAd()?this.sendVideoAdAction(e,t):this.sendVideoAction(e,t)}}sendBufferStart(t){if(this.state.goBufferStart()){let e;t=t||{},e=this.isAd()?v.Events.AD_BUFFER_START:v.Events.CONTENT_BUFFER_START,t=this.buildBufferAttributes(t),this._lastBufferType=t.bufferType,this.isAd()?this.sendVideoAdAction(e,t):this.sendVideoAction(e,t)}}sendBufferEnd(t){if(this.state.goBufferEnd()){let e;t=t||{},this.isAd()?(e=v.Events.AD_BUFFER_END,t.timeSinceAdBufferBegin=this.state.timeSinceBufferBegin.getDeltaTime()):(e=v.Events.CONTENT_BUFFER_END,t.timeSinceBufferBegin=this.state.timeSinceBufferBegin.getDeltaTime()),t=this.buildBufferAttributes(t),null!=this._lastBufferType&&(t.bufferType=this._lastBufferType),this.isAd()?this.sendVideoAdAction(e,t):this.sendVideoAction(e,t),this.state.initialBufferingHappened=!0}}buildBufferAttributes(t){return null==t.timeSinceStarted||t.timeSinceStarted<100?t.isInitialBuffering=!this.state.initialBufferingHappened:t.isInitialBuffering=!1,t.bufferType=this.state.calculateBufferType(t.isInitialBuffering),t.timeSinceResumed=this.state.timeSinceResumed.getDeltaTime(),t.timeSinceSeekEnd=this.state.timeSinceSeekEnd.getDeltaTime(),t}sendSeekStart(t){if(this.state.goSeekStart()){let e;e=this.isAd()?v.Events.AD_SEEK_START:v.Events.CONTENT_SEEK_START,this.isAd()?this.sendVideoAdAction(e,t):this.sendVideoAction(e,t)}}sendSeekEnd(t){if(this.state.goSeekEnd()){let e;t=t||{},this.isAd()?(e=v.Events.AD_SEEK_END,t.timeSinceAdSeekBegin=this.state.timeSinceSeekBegin.getDeltaTime()):(e=v.Events.CONTENT_SEEK_END,t.timeSinceSeekBegin=this.state.timeSinceSeekBegin.getDeltaTime()),this.isAd()?this.sendVideoAdAction(e,t):this.sendVideoAction(e,t)}}sendDownload(t){(t=t||{}).state||s.A.warn(\"Called sendDownload without { state: xxxxx }.\"),this.sendVideoAction(v.Events.DOWNLOAD,t),this.state.goDownload()}sendError(t){(t=t||{}).isAd=this.isAd(),this.state.goError();let e=this.isAd()?v.Events.AD_ERROR:v.Events.CONTENT_ERROR;this.sendVideoErrorAction(e,t)}sendRenditionChanged(t){let e;(t=t||{}).timeSinceLastRenditionChange=this.state.timeSinceLastRenditionChange.getDeltaTime(),t.shift=this.getRenditionShift(!0),e=this.isAd()?v.Events.AD_RENDITION_CHANGE:v.Events.CONTENT_RENDITION_CHANGE,this.isAd()?this.sendVideoAdAction(e,t):this.sendVideoAction(e,t),this.state.goRenditionChange()}sendHeartbeat(t){if(this.state.isRequested){let e,i=this.getHeartbeat();this.state._hb=!0,i=this.adjustElapsedTimeForPause(i),this.isAd()?(e=v.Events.AD_HEARTBEAT,\"bitmovin-ads\"===this.getPlayerName()?this.sendVideoAdAction(e,t):this.sendVideoAdAction(e,{elapsedTime:i,...t})):(e=v.Events.CONTENT_HEARTBEAT,this.sendVideoAction(e,{elapsedTime:i,...t})),this.state.goHeartbeat()}}adjustElapsedTimeForPause(t){return this.state._acc&&(t-=this.state._acc,this.state._acc=0),this.state.isPaused&&((t-=this.state.elapsedTime.getDeltaTime())<10&&(t=0),this.state.elapsedTime.start()),this.state._bufferAcc?(t-=this.state._bufferAcc,this.state._bufferAcc=0):this.state.isBuffering&&((t-=this.state.bufferElapsedTime.getDeltaTime())<5&&(t=0),this.state.bufferElapsedTime.start()),Math.max(0,t)}sendAdBreakStart(t){this.isAd()&&this.state.goAdBreakStart()&&(this.state.totalAdPlaytime=0,this.parentTracker&&(this.parentTracker.state.isPlaying=!1),this.sendVideoAdAction(v.Events.AD_BREAK_START,t))}sendAdBreakEnd(t){this.isAd()&&this.state.goAdBreakEnd()&&((t=t||{}).timeSinceAdBreakBegin=this.state.timeSinceAdBreakStart.getDeltaTime(),this.sendVideoAdAction(v.Events.AD_BREAK_END,t),this.parentTracker&&(this.parentTracker.state.isPlaying=!0),this.stopHeartbeat(),this.parentTracker&&this.isAd()&&this.parentTracker.state.goLastAd())}sendAdQuartile(t){this.isAd()&&((t=t||{}).quartile||s.A.warn(\"Called sendAdQuartile without { quartile: xxxxx }.\"),t.timeSinceLastAdQuartile=this.state.timeSinceLastAdQuartile.getDeltaTime(),this.sendVideoAdAction(v.Events.AD_QUARTILE,t),this.state.goAdQuartile())}sendAdClick(t){this.isAd()&&((t=t||{}).url||s.A.warn(\"Called sendAdClick without { url: xxxxx }.\"),this.sendVideoAdAction(v.Events.AD_CLICK,t))}}function S(t){t.type!==v.Events.AD_ERROR?this.sendVideoAdAction(t.type,t.data):this.sendVideoErrorAction(t.type,t.data)}v.Events={PLAYER_READY:\"PLAYER_READY\",DOWNLOAD:\"DOWNLOAD\",ERROR:\"ERROR\",CONTENT_REQUEST:\"CONTENT_REQUEST\",CONTENT_START:\"CONTENT_START\",CONTENT_END:\"CONTENT_END\",CONTENT_PAUSE:\"CONTENT_PAUSE\",CONTENT_RESUME:\"CONTENT_RESUME\",CONTENT_SEEK_START:\"CONTENT_SEEK_START\",CONTENT_SEEK_END:\"CONTENT_SEEK_END\",CONTENT_BUFFER_START:\"CONTENT_BUFFER_START\",CONTENT_BUFFER_END:\"CONTENT_BUFFER_END\",CONTENT_HEARTBEAT:\"CONTENT_HEARTBEAT\",CONTENT_RENDITION_CHANGE:\"CONTENT_RENDITION_CHANGE\",CONTENT_ERROR:\"CONTENT_ERROR\",AD_REQUEST:\"AD_REQUEST\",AD_START:\"AD_START\",AD_END:\"AD_END\",AD_PAUSE:\"AD_PAUSE\",AD_RESUME:\"AD_RESUME\",AD_SEEK_START:\"AD_SEEK_START\",AD_SEEK_END:\"AD_SEEK_END\",AD_BUFFER_START:\"AD_BUFFER_START\",AD_BUFFER_END:\"AD_BUFFER_END\",AD_HEARTBEAT:\"AD_HEARTBEAT\",AD_RENDITION_CHANGE:\"AD_RENDITION_CHANGE\",AD_ERROR:\"AD_ERROR\",AD_BREAK_START:\"AD_BREAK_START\",AD_BREAK_END:\"AD_BREAK_END\",AD_QUARTILE:\"AD_QUARTILE\",AD_CLICK:\"AD_CLICK\"};const p=v;var y=i(431),_=i(413),R=i(481),B=i(374);const b={Constants:a.A,Chrono:m.A,Log:s.A,Emitter:f.A,Tracker:n.A,VideoTracker:p,VideoTrackerState:E,Core:g,version:T.rE,NrVideoEventAggregator:y.t,RetryQueueHandler:_.u,OptimizedHttpClient:R.X,HarvestScheduler:B.n,recordEvent:h};export{b as default};\n//# sourceMappingURL=index.js.map","import nrvideo from '@newrelic/video-core'\nimport VideojsAdsTracker from './videojs-ads'\n\nexport default class BrightcoveImaAdsTracker extends VideojsAdsTracker {\n static isUsing (player) {\n return !!player.ima3\n }\n\n getTrackerName () {\n return 'brightcove-ima-ads'\n }\n\n getPlayerName () {\n return 'brightcove-ima-ads'\n }\n\n getPlayhead () {\n return this.player?.ima3?.adPlayer?.currentTime()\n }\n\n registerListeners () {\n nrvideo.Log.debugCommonVideoEvents(this.player, [\n null,\n 'ima3-ready',\n 'ima3error',\n 'ima3-ad-error',\n 'ima3-started',\n 'ima3-complete',\n 'ima3-paused',\n 'ima3-resumed',\n 'ads-request',\n 'ads-load',\n 'ads-ad-started',\n 'ads-ad-ended',\n 'ads-pause',\n 'ads-play',\n 'ads-click',\n 'ads-pod-started',\n 'ads-pod-ended',\n 'ads-allpods-completed'\n ])\n\n this.player.on('ima3-started', this.onStarted.bind(this))\n this.player.on('ima3-paused', this.onPaused.bind(this))\n this.player.on('ima3-resumed', this.onResume.bind(this))\n this.player.on('ima3-complete', this.onComplete.bind(this))\n this.player.on('ima3-skipped', this.onSkipped.bind(this))\n this.player.on('adserror', this.onError.bind(this))\n this.player.on('ads-click', this.onClick.bind(this))\n }\n\n unregisterListeners () {\n this.player.off('ima3-started', this.onStarted)\n this.player.off('ima3-paused', this.onPaused)\n this.player.off('ima3-resumed', this.onResume)\n this.player.off('ima3-complete', this.onComplete)\n this.player.off('ima3-skipped', this.onSkipped)\n this.player.off('adserror', this.onError)\n this.player.off('ads-click', this.onClick)\n }\n\n onStarted (e) {\n this.sendRequest()\n this.sendStart()\n }\n\n onPaused (e) {\n this.sendPause()\n }\n\n onResume (e) {\n this.sendResume()\n }\n\n onComplete (e) {\n this.sendEnd()\n }\n\n onSkipped (e) {\n this.sendEnd({ skipped: true })\n }\n\n onError (e) {\n this.sendError()\n }\n\n onClick (e) {\n this.sendClick()\n }\n}\n","/* global google */\nimport nrvideo from '@newrelic/video-core';\nimport VideojsAdsTracker from './videojs-ads';\n\nconst daiEvents = {\n // Stream Events\n DAI_STREAM_INITIALIZED: 'dai-stream-initialized',\n DAI_STREAM_LOADED: 'dai-stream-loaded',\n DAI_STREAM_ERROR: 'dai-stream-error',\n\n // Ad Events\n DAI_AD_BREAK_STARTED: 'dai-ad-break-started',\n DAI_AD_BREAK_ENDED: 'dai-ad-break-ended',\n DAI_AD_PERIOD_STARTED: 'dai-ad-period-started',\n DAI_AD_PERIOD_ENDED: 'dai-ad-period-ended',\n DAI_AD_STARTED: 'dai-ad-started',\n DAI_AD_FIRST_QUARTILE: 'dai-ad-first-quartile',\n DAI_AD_MIDPOINT: 'dai-ad-midpoint',\n DAI_AD_THIRD_QUARTILE: 'dai-ad-third-quartile',\n DAI_AD_COMPLETE: 'dai-ad-complete',\n DAI_AD_SKIPPED: 'dai-ad-skipped',\n DAI_AD_PAUSED: 'dai-ad-paused',\n DAI_AD_RESUMED: 'dai-ad-resumed',\n DAI_AD_CLICKED: 'dai-ad-clicked',\n DAI_AD_ERROR: 'dai-ad-error',\n\n // Cue Point Events\n DAI_CUEPOINTS_CHANGED: 'dai-cuepoints-changed',\n\n // Timed Metadata Events\n DAI_TIMED_METADATA: 'dai-timed-metadata',\n};\n\nexport default class DaiAdsTracker extends VideojsAdsTracker {\n static isUsing(player) {\n // Check for DAI plugin or imaDai method\n return (\n (player.imaDai && typeof player.imaDai === 'function') ||\n (player.dai && typeof player.dai.VERSION !== 'undefined') ||\n (player.ima && player.ima.dai) ||\n player.streamManager\n );\n }\n\n constructor(player) {\n super(player);\n this.streamManager = null;\n this.currentAdData = null;\n this.adBreakData = null;\n this.streamData = null;\n this.cuePoints = [];\n this.initialized = false;\n this.eventHandlers = null;\n }\n\n setStreamManager(streamManager) {\n this.streamManager = streamManager;\n this.setupStreamManagerListeners();\n this.initialized = true;\n nrvideo.Log.debug(\n 'DaiAdsTracker: StreamManager set and listeners registered'\n );\n }\n\n setupStreamManagerListeners() {\n if (!this.streamManager || !google?.ima?.dai?.api?.StreamEvent) {\n nrvideo.Log.warn('DaiAdsTracker: StreamManager or DAI API not available');\n return;\n }\n\n const StreamEvent = google.ima.dai.api.StreamEvent.Type;\n\n // Create the event handler mapping\n this.eventHandlers = {\n // Stream Events\n [StreamEvent.LOADED]: this.onStreamLoaded.bind(this),\n [StreamEvent.STREAM_INITIALIZED]: this.onStreamInitialized.bind(this),\n [StreamEvent.ERROR]: this.onStreamError.bind(this),\n\n // Ad Break Events\n [StreamEvent.AD_BREAK_STARTED]: this.onAdBreakStarted.bind(this),\n [StreamEvent.AD_BREAK_ENDED]: this.onAdBreakEnded.bind(this),\n\n // Ad Period Events\n [StreamEvent.AD_PERIOD_STARTED]: this.onAdPeriodStarted.bind(this),\n [StreamEvent.AD_PERIOD_ENDED]: this.onAdPeriodEnded.bind(this),\n\n // Individual Ad Events\n [StreamEvent.STARTED]: this.onAdStarted.bind(this),\n [StreamEvent.FIRST_QUARTILE]: this.onAdFirstQuartile.bind(this),\n [StreamEvent.MIDPOINT]: this.onAdMidpoint.bind(this),\n [StreamEvent.THIRD_QUARTILE]: this.onAdThirdQuartile.bind(this),\n [StreamEvent.COMPLETE]: this.onAdComplete.bind(this),\n [StreamEvent.SKIPPED]: this.onAdSkipped.bind(this),\n [StreamEvent.PAUSED]: this.onAdPaused.bind(this),\n [StreamEvent.RESUMED]: this.onAdResumed.bind(this),\n [StreamEvent.CLICK]: this.onAdClicked.bind(this),\n [StreamEvent.VIDEO_CLICKED]: this.onAdClicked.bind(this),\n\n // Cue Points and Metadata Events\n [StreamEvent.CUEPOINTS_CHANGED]: this.onCuePointsChanged.bind(this),\n [StreamEvent.TIMED_METADATA]: this.onTimedMetadata.bind(this),\n };\n\n // Register all event listeners using the mapping\n Object.entries(this.eventHandlers).forEach(([eventType, handler]) => {\n this.streamManager.addEventListener(eventType, handler);\n });\n\n nrvideo.Log.debug('DaiAdsTracker: StreamManager listeners registered');\n }\n\n registerListeners() {\n // Call parent to register basic videojs-ads events\n super.registerListeners();\n\n nrvideo.Log.debugCommonVideoEvents(this.player, [\n null,\n Object.values(daiEvents),\n ]);\n }\n\n unregisterListeners() {\n // Call parent cleanup\n super.unregisterListeners();\n\n // Clean up StreamManager listeners using the same mapping\n if (this.streamManager && this.eventHandlers) {\n Object.entries(this.eventHandlers).forEach(([eventType, handler]) => {\n this.streamManager.removeEventListener(eventType, handler);\n });\n }\n\n // Reset state\n this.streamManager = null;\n this.currentAdData = null;\n this.adBreakData = null;\n this.streamData = null;\n this.cuePoints = [];\n this.initialized = false;\n this.eventHandlers = null;\n }\n\n // Stream Event Handlers\n onStreamLoaded(event) {\n this.streamData = this.extractStreamData(event);\n nrvideo.Log.debug('DaiAdsTracker: Stream loaded', this.streamData);\n this.sendRequest();\n }\n\n onStreamInitialized(event) {\n nrvideo.Log.debug('DaiAdsTracker: Stream initialized');\n this.sendDownload({ state: 'stream-initialized' });\n }\n\n onStreamError(event) {\n const errorData = this.extractErrorData(event);\n nrvideo.Log.error('DaiAdsTracker: Stream error', errorData);\n this.sendError(errorData);\n }\n\n // Ad Break Event Handlers\n onAdBreakStarted(event) {\n this.adBreakData = this.extractAdBreakData(event);\n nrvideo.Log.debug('DaiAdsTracker: Ad break started', this.adBreakData);\n this.sendAdBreakStart(this.adBreakData);\n }\n\n onAdBreakEnded(event) {\n nrvideo.Log.debug('DaiAdsTracker: Ad break ended');\n this.sendAdBreakEnd();\n this.adBreakData = null;\n }\n\n // Ad Period Event Handlers (for bumpers, etc.)\n onAdPeriodStarted(event) {\n nrvideo.Log.debug('DaiAdsTracker: Ad period started');\n // Track as ad break start if no current break\n if (!this.adBreakData) {\n this.onAdBreakStarted(event);\n }\n }\n\n onAdPeriodEnded(event) {\n nrvideo.Log.debug('DaiAdsTracker: Ad period ended');\n // Don't end the break here as there might be more ads\n }\n\n // Individual Ad Event Handlers\n onAdStarted(event) {\n this.currentAdData = this.extractAdData(event);\n nrvideo.Log.debug('DaiAdsTracker: Ad started', this.currentAdData);\n this.sendStart();\n }\n\n onAdFirstQuartile(event) {\n nrvideo.Log.debug('DaiAdsTracker: Ad first quartile');\n this.sendAdQuartile({ quartile: 1 });\n }\n\n onAdMidpoint(event) {\n nrvideo.Log.debug('DaiAdsTracker: Ad midpoint');\n this.sendAdQuartile({ quartile: 2 });\n }\n\n onAdThirdQuartile(event) {\n nrvideo.Log.debug('DaiAdsTracker: Ad third quartile');\n this.sendAdQuartile({ quartile: 3 });\n }\n\n onAdComplete(event) {\n nrvideo.Log.debug('DaiAdsTracker: Ad complete');\n this.sendEnd();\n this.currentAdData = null;\n }\n\n onAdSkipped(event) {\n nrvideo.Log.debug('DaiAdsTracker: Ad skipped');\n this.sendEnd({ skipped: true });\n this.currentAdData = null;\n }\n\n onAdPaused(event) {\n nrvideo.Log.debug('DaiAdsTracker: Ad paused');\n this.sendPause();\n }\n\n onAdResumed(event) {\n nrvideo.Log.debug('DaiAdsTracker: Ad resumed');\n this.sendResume();\n }\n\n onAdClicked(event) {\n nrvideo.Log.debug('DaiAdsTracker: Ad clicked');\n this.sendAdClick({ url: this.getClickThroughUrl() });\n }\n\n // Cue Points Handler\n onCuePointsChanged(event) {\n this.cuePoints = this.extractCuePoints(event);\n nrvideo.Log.debug('DaiAdsTracker: Cue points changed', this.cuePoints);\n }\n\n // Timed Metadata Handler\n onTimedMetadata(event) {\n const metadata = this.extractTimedMetadata(event);\n nrvideo.Log.debug('DaiAdsTracker: Timed metadata', metadata);\n }\n\n // Data Extraction Methods\n extractStreamData(event) {\n try {\n const streamData = event.getStreamData();\n return {\n streamId: streamData?.streamId,\n url: streamData?.url,\n adTagParameters: streamData?.adTagParameters,\n streamType: this.getStreamType(),\n };\n } catch (error) {\n nrvideo.Log.warn('DaiAdsTracker: Failed to extract stream data', error);\n return {};\n }\n }\n\n extractAdBreakData(event) {\n try {\n const adBreakData = event.getAdBreak();\n return {\n adBreakId: adBreakData?.id,\n adBreakTitle: adBreakData?.title,\n adCount: adBreakData?.ads?.length || 0,\n position: this.getAdPosition(),\n };\n } catch (error) {\n nrvideo.Log.warn('DaiAdsTracker: Failed to extract ad break data', error);\n return {};\n }\n }\n\n extractAdData(event) {\n try {\n const ad = event.getAd();\n return {\n adId: ad?.getAdId(),\n creativeId: ad?.getCreativeId(),\n duration: ad?.getDuration(),\n title: ad?.getTitle(),\n description: ad?.getDescription(),\n advertiserName: ad?.getAdvertiserName(),\n clickThroughUrl: ad?.getClickThroughUrl(),\n dealId: ad?.getDealId(),\n wrapperAdIds: ad?.getWrapperAdIds(),\n position: this.getAdPosition(),\n };\n } catch (error) {\n nrvideo.Log.warn('DaiAdsTracker: Failed to extract ad data', error);\n return {};\n }\n }\n\n extractErrorData(event) {\n try {\n const error = event.getError();\n return {\n errorCode: error?.getErrorCode(),\n errorMessage: error?.getMessage(),\n innerError: error?.getInnerError(),\n };\n } catch (error) {\n nrvideo.Log.warn('DaiAdsTracker: Failed to extract error data', error);\n return { errorMessage: 'Unknown DAI error' };\n }\n }\n\n extractCuePoints(event) {\n try {\n return event.getCuepoints() || [];\n } catch (error) {\n nrvideo.Log.warn('DaiAdsTracker: Failed to extract cue points', error);\n return [];\n }\n }\n\n extractTimedMetadata(event) {\n try {\n return {\n type: event.getType(),\n data: event.getData(),\n };\n } catch (error) {\n nrvideo.Log.warn(\n 'DaiAdsTracker: Failed to extract timed metadata',\n error\n );\n return {};\n }\n }\n\n // Override parent methods for DAI-specific implementations\n getTrackerName() {\n return 'dai-ads';\n }\n\n getPlayerName() {\n return 'videojs-dai';\n }\n\n getPlayerVersion() {\n if (this.player.dai?.VERSION) {\n return this.player.dai.VERSION;\n }\n if (this.player.ima?.VERSION) {\n return `ima-dai: ${this.player.ima.VERSION}`;\n }\n return 'unknown';\n }\n\n getAdCuePoints() {\n return this.cuePoints;\n }\n\n getAdPosition() {\n if (!this.currentAdData && !this.adBreakData) return null;\n\n // Try to determine position from current playback time\n const currentTime = this.player.currentTime();\n const duration = this.player.duration();\n\n if (currentTime < 5) {\n return 'pre';\n } else if (duration && currentTime > duration - 10) {\n return 'post';\n } else {\n return 'mid';\n }\n }\n\n getDuration() {\n if (this.currentAdData?.duration !== undefined) {\n return this.currentAdData.duration * 1000; // Convert to milliseconds\n }\n return null;\n }\n\n getVideoId() {\n return this.currentAdData?.adId || null;\n }\n\n getAdCreativeId() {\n return this.currentAdData?.creativeId || null;\n }\n\n getTitle() {\n return this.currentAdData?.title || null;\n }\n\n getSrc() {\n return this.streamData?.url || null;\n }\n\n getPlayhead() {\n if (this.streamManager) {\n try {\n const streamTime = this.streamManager.getStreamTime();\n return streamTime * 1000; // Convert to milliseconds\n } catch (error) {\n // Fallback to player current time\n return this.player.currentTime() * 1000;\n }\n }\n return this.player.currentTime() * 1000;\n }\n\n getAdPartner() {\n return 'google-dai';\n }\n\n getClickThroughUrl() {\n return this.currentAdData?.clickThroughUrl || null;\n }\n\n getStreamType() {\n // Determine if this is VOD or Live\n if (this.streamData?.streamType) {\n return this.streamData.streamType;\n }\n // Try to infer from player\n const duration = this.player.duration();\n return duration === Infinity ? 'live' : 'vod';\n }\n\n // Additional helper methods\n isLiveStream() {\n return this.getStreamType() === 'live';\n }\n\n getCurrentAdBreak() {\n return this.adBreakData;\n }\n\n getCurrentAd() {\n return this.currentAdData;\n }\n\n getStreamData() {\n return this.streamData;\n }\n\n getBitrate() {\n const tech = this.getTech()\n if (tech && tech.tech && tech.tech.stats && tech.tech.stats.bandwidth) {\n return Math.round(tech.tech.stats.bandwidth);\n }\n return null;\n }\n\n getRenditionBitrate() {\n const tech = this.getTech();\n if (tech && tech.getRenditionBitrate) {\n const bitrate = tech.getRenditionBitrate();\n return bitrate !== null ? Math.round(bitrate) : null;\n }\n return null;\n }\n}\n","import VideojsAdsTracker from './videojs-ads'\n\nexport default class FreewheelAdsTracker extends VideojsAdsTracker {\n static isUsing (player) {\n return !!player.FreeWheelPlugin && typeof tv !== 'undefined' && tv.freewheel\n }\n\n getTrackerName () {\n return 'freewheel-ads'\n }\n\n getPlayerName () {\n return 'freewheel-ads'\n }\n\n getPlayerVersion () {\n return this.player.FreeWheelPlugin.VERSION\n }\n\n getPlayhead () {\n if (this.player.ads.ad.currentTime) {\n return this.player.ads.ad.currentTime() * 1000\n }\n }\n\n getDuration () {\n if (this.player.ads.ad.duration) {\n return this.player.ads.ad.duration * 1000\n }\n }\n\n getVideoId () {\n return this.player.ads.ad.id\n }\n\n getAdPartner () {\n return 'freewheel'\n }\n\n getAdCreativeId () {\n try {\n return this.player.ads.provider.event.adInstance.getActiveCreativeRendition().getId()\n } catch (err) { /* do nothing */ }\n }\n\n getSrc () {\n try {\n let acr = this.player.ads.provider.event.adInstance.getActiveCreativeRendition()\n return acr.getPrimaryCreativeRenditionAsset().getUrl()\n } catch (err) { /* do nothing */ }\n }\n\n getTitle () {\n try {\n let acr = this.player.ads.provider.event.adInstance.getActiveCreativeRendition()\n return acr.getPrimaryCreativeRenditionAsset().getName()\n } catch (err) { /* do nothing */ }\n }\n\n getAdPosition () {\n switch (this.player.ads.ad.type) {\n case 'PREROLL':\n return nrvideo.Constants.AdPositions.PRE\n case 'MIDROLL':\n return nrvideo.Constants.AdPositions.MID\n case 'POSTROLL':\n return nrvideo.Constants.AdPositions.POST\n }\n }\n}\n","/* global google */\nimport nrvideo from '@newrelic/video-core';\nimport VideojsAdsTracker from './videojs-ads';\n\nexport default class ImaAdsTracker extends VideojsAdsTracker {\n static isUsing(player) {\n return player.ima && typeof google !== 'undefined';\n }\n\n getTrackerName() {\n return 'ima-ads';\n }\n\n getPlayerName() {\n return 'ima';\n }\n\n getPlayerVersion() {\n return (\n 'ima: ' + google.ima.VERSION + '; contrib-ads: ' + this.player.ads.VERSION\n );\n }\n\n getCuePoints() {\n return this.player.ima.getAdsManager().getCuePoints();\n }\n\n getAdPosition() {\n if (\n this.lastAdData &&\n this.lastAdData.podInfo &&\n this.lastAdData.podInfo.podIndex !== undefined\n ) {\n const podIndex = this.lastAdData.podInfo.podIndex;\n\n if (podIndex === 0) {\n return 'pre';\n } else if (podIndex === -1) {\n return 'post';\n } else {\n return 'mid';\n }\n }\n return null;\n }\n\n getDuration() {\n if (this.lastAdData && this.lastAdData.duration !== undefined) {\n return this.lastAdData.duration * 1000;\n }\n return null;\n }\n\n getVideoId() {\n if (this.lastAdData && this.lastAdData.adId) {\n return this.lastAdData.adId;\n }\n return null;\n }\n\n getAdCreativeId() {\n if (this.lastAdData && this.lastAdData.creativeId) {\n return this.lastAdData.creativeId;\n }\n return null;\n }\n\n getSrc() {\n if (this.lastAdData && this.lastAdData.mediaUrl) {\n return this.lastAdData.mediaUrl;\n }\n return null;\n }\n\n getTitle() {\n if (this.lastAdData && this.lastAdData.title) {\n return this.lastAdData.title;\n }\n return null;\n }\n\n getPlayhead() {\n let manager = this.player.ima.getAdsManager();\n if (manager) {\n return (this.getDuration() - manager.getRemainingTime()) * 1000;\n }\n }\n\n getPlayrate() {\n return this.player.playbackRate();\n }\n\n getAdPartner() {\n return 'ima';\n }\n\n getWebkitBitrate() {\n const adVideoElement = this.getAdVideoElement();\n if (adVideoElement && adVideoElement.webkitVideoDecodedByteCount) {\n let bitrate;\n if (this._lastAdWebkitBitrate > 0) {\n const current = adVideoElement.webkitVideoDecodedByteCount;\n const delta = current - this._lastAdWebkitBitrate;\n const seconds = this.getHeartbeat() / 1000;\n bitrate = Math.round((delta / seconds) * 8);\n }\n \n this._lastAdWebkitBitrate = adVideoElement.webkitVideoDecodedByteCount;\n return bitrate ?? null;\n }\n return null;\n }\n\n getRenditionBitrate() {\n if (this.lastAdData && this.lastAdData.renditionBitrate) {\n return Math.round(this.lastAdData.renditionBitrate);\n }\n return null;\n }\n\n registerListeners() {\n // Shortcut events\n let e = google.ima.AdEvent.Type;\n let AD_ERROR = google.ima.AdErrorEvent.Type.AD_ERROR;\n\n //store ad data\n this.lastAdData = null;\n // debug\n nrvideo.Log.debugCommonVideoEvents(this.player.ima.addEventListener, [\n null,\n e.ALL_ADS_COMPLETED,\n e.LINEAR_CHANGED,\n e.COMPLETE,\n e.USER_CLOSE,\n e.IMPRESSION,\n e.CONTENT_PAUSE_REQUESTED,\n e.CONTENT_RESUME_REQUESTED,\n e.SKIPPED,\n e.SKIPPABLE_STATE_CHANGED,\n e.LOADED,\n e.PAUSED,\n e.RESUMED,\n e.STARTED,\n e.AD_CAN_PLAY,\n e.AD_METADATA,\n e.EXPANDED_CHANGED,\n e.AD_BREAK_READY,\n e.LOG,\n e.CLICK,\n e.FIRST_QUARTILE,\n e.MIDPOINT,\n e.THIRD_QUARTILE,\n AD_ERROR,\n ]);\n\n // Register listeners\n this.player.ima.addEventListener(e.LOADED, this.onLoaded.bind(this));\n this.player.ima.addEventListener(e.STARTED, this.onStart.bind(this));\n this.player.ima.addEventListener(e.PAUSED, this.onPaused.bind(this));\n this.player.ima.addEventListener(e.RESUMED, this.onResumed.bind(this));\n this.player.ima.addEventListener(e.COMPLETE, this.onComplete.bind(this));\n this.player.ima.addEventListener(e.SKIPPED, this.onSkipped.bind(this));\n this.player.ima.addEventListener(e.CLICK, this.onClick.bind(this));\n this.player.ima.addEventListener(\n e.FIRST_QUARTILE,\n this.onFirstQuartile.bind(this)\n );\n this.player.ima.addEventListener(e.MIDPOINT, this.onMidpoint.bind(this));\n this.player.ima.addEventListener(\n e.THIRD_QUARTILE,\n this.onThirdQuartile.bind(this)\n );\n this.player.ima.addEventListener(AD_ERROR, this.onError.bind(this));\n }\n\n unregisterListeners() {\n // Shortcut events\n let e = google.ima.AdEvent.Type;\n let AD_ERROR = google.ima.AdErrorEvent.Type.AD_ERROR;\n\n // unregister listeners\n this.player.ima.removeEventListener(e.LOADED, this.onLoaded);\n this.player.ima.removeEventListener(e.STARTED, this.onLoaded.bind(this));\n this.player.ima.removeEventListener(e.IMPRESSION, this.onImpression);\n this.player.ima.removeEventListener(e.PAUSED, this.onPaused);\n this.player.ima.removeEventListener(e.RESUMED, this.onResumed);\n this.player.ima.removeEventListener(e.COMPLETE, this.onComplete);\n this.player.ima.removeEventListener(e.SKIPPED, this.onSkipped);\n this.player.ima.removeEventListener(e.CLICK, this.onClick);\n this.player.ima.removeEventListener(e.FIRST_QUARTILE, this.onFirstQuartile);\n this.player.ima.removeEventListener(e.MIDPOINT, this.onMidpoint);\n this.player.ima.removeEventListener(e.THIRD_QUARTILE, this.onThirdQuartile);\n this.player.ima.removeEventListener(AD_ERROR, this.onError);\n //clear ad data\n this.lastAdData = null;\n }\n\n onLoaded(e) {\n this.lastAdData = this.getAdData();\n this.sendRequest();\n }\n\n onStart(e) {\n this.lastAdData = this.getAdData();\n this._lastAdWebkitBitrate = 0;\n this.sendStart();\n }\n\n onComplete(e) {\n this.sendEnd();\n this.lastAdData = null; // Clear the data\n }\n\n onSkipped(e) {\n this.sendEnd({ skipped: true });\n this.lastAdData = null; // Clear the data\n }\n\n onError(e) {\n const adError = e.getError();\n\n const errorCode = adError.getErrorCode();\n const errorMessage = adError.getMessage();\n this.sendError({ adError, errorCode, errorMessage });\n }\n\n onClick(e) {\n this.sendAdClick();\n }\n\n onFirstQuartile() {\n this.sendAdQuartile({ adQuartile: 1 });\n }\n\n onMidpoint() {\n this.sendAdQuartile({ adQuartile: 2 });\n }\n\n onThirdQuartile() {\n this.sendAdQuartile({ adQuartile: 3 });\n }\n\n onPaused() {\n this.sendPause();\n }\n\n onResumed() {\n this.sendResume();\n }\n\n getAdData() {\n try {\n const adsManager = this.player.ima.getAdsManager();\n if (adsManager) {\n const currentAd = adsManager.getCurrentAd();\n if (currentAd) {\n return {\n adId: currentAd.getAdId(),\n creativeId: currentAd.getCreativeId(),\n duration: currentAd.getDuration(),\n mediaUrl: currentAd.getMediaUrl(),\n title: currentAd.getTitle(),\n podInfo: currentAd.getAdPodInfo()?.data,\n renditionBitrate: currentAd.getVastMediaBitrate(),\n // Add other properties as needed\n };\n }\n }\n return null;\n } catch (err) {\n return null;\n }\n }\n\n getAdVideoElement() {\n if (this.player.ima && this.player.ima.controller && this.player.ima.controller.adUi) {\n const adContainerDiv = this.player.ima.controller.adUi.adContainerDiv;\n if (adContainerDiv) {\n const adVideoElement = adContainerDiv.querySelector('video');\n if (adVideoElement) {\n return adVideoElement;\n }\n }\n }\n }\n}\n","/* eslint-disable no-undef */\nimport nrvideo from '@newrelic/video-core';\nimport VideojsAdsTracker from './videojs-ads';\nimport {\n DEFAULT_LIVE_POLL_INTERVAL_MS,\n HLS_MIME_TYPE,\n MEDIATAILOR_HOST_MARKER,\n SCTE35_SCHEME_MARKER,\n TRACKING_API_TIMEOUT_MS,\n STREAM_TYPE,\n MANIFEST_TYPE,\n} from './utils/mt-constants.js';\nimport {\n getTimestamp,\n detectManifestFormatFromUrl,\n detectPlaybackStreamType,\n buildTrackingEndpointUrl,\n determineAdPosition,\n getQuartilesToFire,\n findActiveAdBreak,\n findActivePod,\n mergeAdSchedules,\n parseHlsManifestForAdBreaks,\n parseDashManifestForAdBreaks,\n detectAdBreaksFromVhsPlaylist,\n whichAdSegmentMarker,\n enrichAdScheduleWithTrackingMetadata,\n extractHlsTargetDurationSeconds,\n extractDashMinimumUpdatePeriodSeconds,\n fetchHlsMasterManifest,\n fetchHlsMediaPlaylist,\n fetchDashManifest,\n getTrackingMetadata,\n} from './utils/mt.js';\n\n// Handle both direct and default export from video-core\nconst nrvideoCore = nrvideo.default || nrvideo;\nconst Log = nrvideoCore.Log;\n\n/**\n * AWS MediaTailor Ad Tracker\n * Tracks ads from AWS MediaTailor SSAI streams (HLS/DASH)\n *\n * Features:\n * - Client-side ad detection from manifest markers (CUE-OUT/CUE-IN)\n * - Pod-level tracking (multiple ads within one break)\n * - VOD and Live stream support\n * - Zero race conditions via VHS player hooks\n * - Tracking API metadata enrichment\n */\nexport default class MediaTailorAdsTracker extends VideojsAdsTracker {\n /**\n * Checks if tracker should be used for this player source\n */\n static isUsing(player, options = {}) {\n // Opt-in flag is the single source of truth.\n // Accepts { mediatailor: true } or { mediatailor: { trackingUrl, adSegmentPrefix } }.\n return Boolean(options && options.mediatailor);\n }\n\n /**\n * Returns tracker name for New Relic instrumentation\n */\n getTrackerName() {\n return 'aws-media-tailor';\n }\n\n /**\n * Returns player version (MediaTailor doesn't have version)\n */\n getPlayerVersion() {\n return 'MediaTailor';\n }\n\n /**\n * Override to return the correct ad position from our ad schedule\n * This overrides video-core's default logic which only checks if content started\n */\n getAdPosition() {\n if (this.currentAdBreak && this.currentAdBreak.adPosition) {\n return this.currentAdBreak.adPosition;\n }\n return super.getAdPosition();\n }\n\n constructor(player, options = {}) {\n super(player);\n\n // Normalize mediatailor option: true | { trackingUrl, adSegmentPrefix } | undefined\n const mtOptions =\n options.mediatailor === true ? {} : options.mediatailor || {};\n\n // Initialize state\n this.streamType = null; // 'vod' or 'live'\n this.manifestFormat = null; // 'hls' or 'dash'\n this.playbackManifestUrl = player.currentSrc();\n\n // trackingUrl: optional override for the MediaTailor tracking endpoint.\n // When not provided, the tracker derives it automatically from the playback URL.\n this.explicitTrackingUrl = mtOptions.trackingUrl || null;\n\n // adSegmentPrefix: only needed when the customer configured a CDN ad-segment\n // prefix in AWS MediaTailor that does NOT follow the AWS-recommended /tm/ path.\n // Most setups (default AWS hostname or CDN following AWS conventions) are\n // detected automatically via MT_DEFAULT_AD_SEGMENT_PATH ('/tm/') and do not\n // need this override.\n this.adSegmentPrefix = mtOptions.adSegmentPrefix || null;\n\n if (this.adSegmentPrefix) {\n Log.debug(`[MT] ad segment detection: custom prefix \"${this.adSegmentPrefix}\"`);\n } else {\n Log.debug('[MT] ad segment detection: default (segments.mediatailor hostname or /tm/ path)');\n }\n\n // Ad tracking state\n this.adSchedule = [];\n this.currentAdBreak = null;\n this.currentAdPod = null;\n this.hasEndedContent = false;\n\n // Disposal and abort state\n this.isDisposed = false;\n this.trackingAbortController = null;\n this.manifestAbortController = null;\n this.isFetchingTracking = false;\n this.isFetchingManifest = false;\n\n // Tracking API state\n this.trackingEndpointUrl = null;\n this.hasAttemptedTrackingFetch = false;\n this.trackingFetchRetries = 0;\n this.maxTrackingRetries = 1;\n\n // Live polling timers\n this.manifestPollTimer = null;\n this.trackingPollTimer = null;\n this.liveRefreshIntervalSeconds = null;\n\n // Manifest parsing cache\n this.mediaPlaylistUrl = null;\n this.lastMediaPlaylistText = null;\n\n Log.debug(`[MT - ${getTimestamp()}] MediaTailorAdsTracker initialized`, {\n endpoint: this.playbackManifestUrl,\n trackingAPITimeout: TRACKING_API_TIMEOUT_MS,\n });\n\n this.manifestFormat = detectManifestFormatFromUrl(this.playbackManifestUrl);\n Log.debug(\n `[MT - ${getTimestamp()}] Manifest type: ${this.manifestFormat.toUpperCase()}`,\n );\n\n this.player.one('loadedmetadata', () => {\n this.streamType = detectPlaybackStreamType(this.player.duration());\n Log.debug(\n `[MT - ${getTimestamp()}] Stream type: ${this.streamType.toUpperCase()}`,\n );\n this.initializeTracking();\n });\n }\n\n /**\n * Initializes tracking based on detected stream type\n */\n initializeTracking() {\n Log.debug(\n `[MT - ${getTimestamp()}] Initializing ${this.manifestFormat.toUpperCase()} ${this.streamType.toUpperCase()} tracking`,\n );\n\n // Prefer explicit tracking URL (explicit POST session) over derived one\n this.trackingEndpointUrl =\n this.explicitTrackingUrl ||\n buildTrackingEndpointUrl(this.playbackManifestUrl);\n if (this.trackingEndpointUrl) {\n Log.debug(\n `[MT - ${getTimestamp()}] Tracking URL extracted:`,\n this.trackingEndpointUrl,\n );\n } else {\n Log.warn(\n `[MT - ${getTimestamp()}] Could not derive tracking URL from playback URL — pass trackingUrl in mediatailor options if needed`,\n );\n }\n\n // Set up format-specific tracking\n if (this.streamType === STREAM_TYPE.VOD) {\n this.setupVODTracking();\n } else {\n this.setupLiveTracking();\n }\n }\n\n /**\n * Register listeners (overrides parent class method)\n */\n registerListeners() {\n super.registerListeners();\n\n // Bind before registering — super(player) calls registerListeners() before\n // the constructor body runs, so bindings must happen here, not in the constructor.\n this.onPause = this.onPause.bind(this);\n this.onPlaying = this.onPlaying.bind(this);\n this.onSeeking = this.onSeeking.bind(this);\n this.onSeeked = this.onSeeked.bind(this);\n this.onWaiting = this.onWaiting.bind(this);\n this.onEnded = this.onEnded.bind(this);\n this.onTimeUpdate = this.onTimeUpdate.bind(this);\n\n this.player.on('pause', this.onPause);\n this.player.on('playing', this.onPlaying);\n this.player.on('seeking', this.onSeeking);\n this.player.on('seeked', this.onSeeked);\n this.player.on('waiting', this.onWaiting);\n this.player.on('ended', this.onEnded);\n this.player.on('timeupdate', this.onTimeUpdate);\n Log.debug(`[MT - ${getTimestamp()}] Event listeners registered`);\n }\n\n /**\n * Unregister listeners (overrides parent class method)\n */\n unregisterListeners() {\n super.unregisterListeners();\n this.player.off('pause', this.onPause);\n this.player.off('playing', this.onPlaying);\n this.player.off('seeking', this.onSeeking);\n this.player.off('seeked', this.onSeeked);\n this.player.off('waiting', this.onWaiting);\n this.player.off('ended', this.onEnded);\n this.player.off('timeupdate', this.onTimeUpdate);\n this.stopLivePolling();\n }\n\n /**\n * Stops live polling timers\n */\n stopLivePolling() {\n if (this.manifestPollTimer) {\n clearTimeout(this.manifestPollTimer);\n this.manifestPollTimer = null;\n }\n\n if (this.trackingPollTimer) {\n clearInterval(this.trackingPollTimer);\n this.trackingPollTimer = null;\n }\n }\n\n /**\n * Sets up VOD tracking (single parse, no polling)\n */\n setupVODTracking() {\n Log.debug(`[MT - ${getTimestamp()}] VOD mode: Single manifest parse`);\n this.hookPlayerManifest();\n }\n\n /**\n * Sets up Live tracking (continuous polling)\n */\n setupLiveTracking() {\n Log.debug(`[MT - ${getTimestamp()}] Live mode: Continuous polling`);\n this.hookPlayerManifest();\n\n const pollingInterval = this.getLiveRefreshIntervalMs();\n\n // Start polling timers\n this.manifestPollTimer = setInterval(() => {\n this.pollManifestForNewAds();\n }, pollingInterval);\n\n this.trackingPollTimer = setInterval(() => {\n this.getAndProcessTrackingMetadata();\n }, pollingInterval);\n\n Log.debug(`[MT - ${getTimestamp()}] Live polling started`, {\n pollingInterval,\n });\n }\n\n /**\n * Returns the live polling interval in milliseconds\n */\n getLiveRefreshIntervalMs() {\n return this.liveRefreshIntervalSeconds\n ? this.liveRefreshIntervalSeconds * 1000\n : DEFAULT_LIVE_POLL_INTERVAL_MS;\n }\n\n /**\n * Updates live polling intervals after manifest metadata is detected\n */\n restartLivePollingTimers() {\n if (!this.liveRefreshIntervalSeconds) return;\n\n const newInterval = this.getLiveRefreshIntervalMs();\n Log.debug(\n `[MT - ${getTimestamp()}] Updating live polling interval: ${this.liveRefreshIntervalSeconds}s`,\n );\n\n // Restart timers with new interval\n if (this.manifestPollTimer) clearInterval(this.manifestPollTimer);\n if (this.trackingPollTimer) clearInterval(this.trackingPollTimer);\n\n this.manifestPollTimer = setInterval(() => {\n this.pollManifestForNewAds();\n }, newInterval);\n\n this.trackingPollTimer = setInterval(() => {\n this.getAndProcessTrackingMetadata();\n }, newInterval);\n }\n\n /**\n * Hooks into player's manifest loading (zero race condition)\n * Supports: VHS, Native HLS, contrib-hls, Shaka, dash.js\n */\n hookPlayerManifest() {\n const tech = this.player.tech({ IWillNotUseThisInPlugins: true });\n if (!tech) {\n Log.debug(`[MT - ${getTimestamp()}] No tech - using fallback fetch`);\n this.getManifestDirectly();\n return;\n }\n\n // Try hooks in order of preference\n if (this.manifestFormat === MANIFEST_TYPE.HLS) {\n if (\n this.hookHLSViaVHS(tech) ||\n this.hookHLSViaNative(tech) ||\n this.hookHLSViaContribHls(tech)\n ) {\n return; // Successfully hooked\n }\n } else if (this.manifestFormat === MANIFEST_TYPE.DASH) {\n if (this.hookDASHViaShaka(tech) || this.hookDASHViaDashJs(tech)) {\n return; // Successfully hooked\n }\n }\n\n // Fallback: Direct manifest fetch\n Log.debug(\n `[MT - ${getTimestamp()}] Using fallback: direct manifest fetch`,\n );\n this.getManifestDirectly();\n }\n\n /**\n * Hook: VHS (videojs-http-streaming) - Video.js 7.0+\n */\n hookHLSViaVHS(tech) {\n if (!tech.vhs || !tech.vhs.playlists) return false;\n\n Log.debug(`[MT - ${getTimestamp()}] Hooked: VHS`);\n\n // Parse already-loaded playlist\n const currentPlaylist = tech.vhs.playlists.media();\n if (\n currentPlaylist &&\n currentPlaylist.segments &&\n currentPlaylist.segments.length > 0\n ) {\n Log.debug(`[MT - ${getTimestamp()}] Parsing existing playlist`);\n this.parseVhsPlaylistForAdBreaks(currentPlaylist);\n }\n\n // Hook future playlist loads\n tech.vhs.on('loadedplaylist', () => {\n const playlist = tech.vhs.playlists.media();\n if (playlist) {\n this.parseVhsPlaylistForAdBreaks(playlist);\n }\n });\n\n return true;\n }\n\n /**\n * Hook: Native HLS (Safari)\n */\n hookHLSViaNative(tech) {\n // Safari uses native HLS - can't hook directly\n if (\n tech.el_ &&\n tech.el_.canPlayType &&\n tech.el_.canPlayType(HLS_MIME_TYPE)\n ) {\n Log.debug(\n `[MT - ${getTimestamp()}] Native HLS detected - using fallback`,\n );\n this.getManifestDirectly();\n return true;\n }\n return false;\n }\n\n /**\n * Hook: videojs-contrib-hls (legacy Video.js 5.x/6.x)\n */\n hookHLSViaContribHls(tech) {\n if (!tech.hls || !tech.hls.playlists) return false;\n\n Log.debug(`[MT - ${getTimestamp()}] Hooked: contrib-hls (legacy)`);\n\n // Parse already-loaded playlist\n const currentPlaylist = tech.hls.playlists.media();\n if (\n currentPlaylist &&\n currentPlaylist.segments &&\n currentPlaylist.segments.length > 0\n ) {\n this.parseVhsPlaylistForAdBreaks(currentPlaylist);\n }\n\n // Hook future playlist loads\n tech.hls.on('loadedplaylist', () => {\n const playlist = tech.hls.playlists.media();\n if (playlist) {\n this.parseVhsPlaylistForAdBreaks(playlist);\n }\n });\n\n return true;\n }\n\n /**\n * Hook: Shaka Player (DASH)\n */\n hookDASHViaShaka(tech) {\n if (!tech.shakaPlayer) return false;\n\n Log.debug(`[MT - ${getTimestamp()}] Hooked: Shaka Player`);\n tech.shakaPlayer.addEventListener('emsg', (event) => {\n this.handleDASHEmsgEvent(event);\n });\n\n return true;\n }\n\n /**\n * Hook: dash.js (DASH)\n */\n hookDASHViaDashJs(tech) {\n if (!tech.dash || !tech.dash.on) return false;\n\n Log.debug(`[MT - ${getTimestamp()}] Hooked: dash.js`);\n tech.dash.on('EVENT_MODE_ON_RECEIVE', (event) => {\n this.handleDASHEventStream(event);\n });\n\n return true;\n }\n\n /**\n * Fetches manifest directly (fallback when hooks unavailable)\n */\n async getManifestDirectly() {\n Log.debug(\n `[MT - ${getTimestamp()}] Fallback: fetching manifest directly`,\n );\n\n try {\n const manifestUrl = this.playbackManifestUrl;\n\n if (this.manifestFormat === MANIFEST_TYPE.HLS) {\n await this.fetchAndParseHlsManifest(manifestUrl);\n } else if (this.manifestFormat === MANIFEST_TYPE.DASH) {\n await this.fetchAndParseDashManifest(manifestUrl);\n }\n } catch (error) {\n Log.debug(`[MT - ${getTimestamp()}] Fallback fetch error:`, error);\n }\n }\n\n /**\n * Fetches and parses HLS master + media manifest\n */\n async fetchAndParseHlsManifest(manifestUrl) {\n try {\n Log.debug(`[MT - ${getTimestamp()}] Fetching HLS master manifest`);\n\n // Fetch master manifest\n const { mediaPlaylistUrl } = await fetchHlsMasterManifest(manifestUrl);\n\n if (!mediaPlaylistUrl) {\n Log.debug(`[MT - ${getTimestamp()}] No media playlist found`);\n return;\n }\n\n Log.debug(`[MT - ${getTimestamp()}] Fetching media playlist`);\n\n // Fetch media playlist\n const mediaText = await fetchHlsMediaPlaylist(mediaPlaylistUrl);\n\n const hlsTargetDurationSeconds = extractHlsTargetDurationSeconds(mediaText);\n this.updateLiveRefreshIntervalFromManifest(\n hlsTargetDurationSeconds,\n 'hls target duration',\n );\n\n // Parse for ads\n const ads = parseHlsManifestForAdBreaks(mediaText);\n if (ads.length > 0) {\n Log.debug(\n `[MT - ${getTimestamp()}] Detected ${ads.length} ad break(s)`,\n );\n this.mergeNewAds(ads);\n }\n } catch (error) {\n Log.debug(`[MT - ${getTimestamp()}] HLS fetch error:`, error);\n }\n }\n\n /**\n * Fetches and parses DASH MPD manifest\n */\n async fetchAndParseDashManifest(manifestUrl) {\n try {\n Log.debug(`[MT - ${getTimestamp()}] Fetching DASH manifest`);\n\n // Fetch DASH manifest\n const xmlText = await fetchDashManifest(manifestUrl);\n\n const dashMinimumUpdatePeriodSeconds =\n extractDashMinimumUpdatePeriodSeconds(xmlText);\n this.updateLiveRefreshIntervalFromManifest(\n dashMinimumUpdatePeriodSeconds,\n 'dash minimumUpdatePeriod',\n );\n\n // Parse for ads\n const ads = parseDashManifestForAdBreaks(xmlText);\n\n Log.debug(\n `[MT - ${getTimestamp()}] DASH: ${ads.length} ad break(s) found`,\n );\n\n if (ads.length > 0) {\n this.mergeNewAds(ads); // also triggers tracking fetch\n } else if (\n this.streamType === STREAM_TYPE.VOD &&\n this.trackingEndpointUrl &&\n !this.hasAttemptedTrackingFetch\n ) {\n // No SCTE-35 markers in manifest - fall back to tracking API directly\n Log.debug(\n `[MT - ${getTimestamp()}] DASH: no manifest cues, fetching tracking API`,\n );\n this.hasAttemptedTrackingFetch = true;\n this.getAndProcessTrackingMetadata();\n }\n } catch (error) {\n Log.debug(`[MT - ${getTimestamp()}] DASH fetch error:`, error);\n }\n }\n\n /**\n * Handles DASH emsg events from Shaka Player\n */\n handleDASHEmsgEvent(event) {\n Log.debug(`[MT - ${getTimestamp()}] DASH emsg event:`, event);\n\n try {\n // Shaka Player emits emsg events with event.detail containing the emsg box data\n const emsgData = event.detail;\n\n if (!emsgData) {\n Log.debug(`[MT - ${getTimestamp()}] No emsg data in event`);\n return;\n }\n\n // Check if this is a SCTE-35 event\n // schemeIdUri for SCTE-35: urn:scte:scte35:2013:bin or urn:scte:scte35:2014:xml\n const schemeIdUri = emsgData.schemeIdUri || '';\n\n if (!schemeIdUri.includes(SCTE35_SCHEME_MARKER)) {\n Log.debug(\n `[MT - ${getTimestamp()}] Non-SCTE-35 emsg, skipping:`,\n schemeIdUri,\n );\n return;\n }\n\n Log.debug(`[MT - ${getTimestamp()}] SCTE-35 emsg detected:`, {\n schemeIdUri: emsgData.schemeIdUri,\n value: emsgData.value,\n timescale: emsgData.timescale,\n presentationTime: emsgData.presentationTime,\n presentationTimeDelta: emsgData.presentationTimeDelta,\n eventDuration: emsgData.eventDuration,\n });\n\n // Calculate start time in seconds\n const timescale = emsgData.timescale || 1;\n const presentationTime = emsgData.presentationTime || 0;\n const eventDuration = emsgData.eventDuration || 0;\n\n const startTime = presentationTime / timescale;\n const duration = eventDuration / timescale;\n\n // Parse SCTE-35 message data\n const messageData = emsgData.messageData;\n\n if (messageData && duration > 0) {\n const adBreak = {\n id: `dash-emsg-${startTime}`,\n startTime: startTime,\n duration: duration,\n endTime: startTime + duration,\n source: 'dash-emsg',\n confirmedByTracking: false,\n hasFiredStart: false,\n hasFiredEnd: false,\n hasFiredAdStart: false,\n pods: [],\n };\n\n Log.debug(\n `[MT - ${getTimestamp()}] Adding ad break from DASH emsg:`,\n adBreak,\n );\n this.mergeNewAds([adBreak]);\n }\n } catch (error) {\n Log.debug(\n `[MT - ${getTimestamp()}] Error parsing DASH emsg event:`,\n error,\n );\n }\n }\n\n /**\n * Handles DASH event stream from dash.js\n */\n handleDASHEventStream(event) {\n Log.debug(`[MT - ${getTimestamp()}] DASH event stream:`, event);\n\n try {\n // dash.js emits events with different structure\n const eventData = event.event || event;\n\n if (!eventData) {\n Log.debug(`[MT - ${getTimestamp()}] No event data`);\n return;\n }\n\n // Check if this is a SCTE-35 event\n const schemeIdUri = eventData.schemeIdUri || '';\n\n if (!schemeIdUri.includes(SCTE35_SCHEME_MARKER)) {\n Log.debug(\n `[MT - ${getTimestamp()}] Non-SCTE-35 event, skipping:`,\n schemeIdUri,\n );\n return;\n }\n\n Log.debug(`[MT - ${getTimestamp()}] SCTE-35 event stream detected:`, {\n id: eventData.id,\n schemeIdUri: eventData.schemeIdUri,\n presentationTime: eventData.presentationTime,\n duration: eventData.duration,\n messageData: eventData.messageData,\n });\n\n // Calculate timing\n const startTime = parseFloat(eventData.presentationTime || 0);\n const duration = parseFloat(eventData.duration || 0);\n\n if (duration > 0) {\n const adBreak = {\n id: eventData.id || `dash-event-${startTime}`,\n startTime: startTime,\n duration: duration,\n endTime: startTime + duration,\n source: 'dash-event-stream',\n confirmedByTracking: false,\n hasFiredStart: false,\n hasFiredEnd: false,\n hasFiredAdStart: false,\n pods: [],\n };\n\n Log.debug(\n `[MT - ${getTimestamp()}] Adding ad break from DASH event stream:`,\n adBreak,\n );\n this.mergeNewAds([adBreak]);\n }\n } catch (error) {\n Log.debug(\n `[MT - ${getTimestamp()}] Error parsing DASH event stream:`,\n error,\n );\n }\n }\n\n /**\n * Parses VHS playlist object for ads\n */\n parseVhsPlaylistForAdBreaks(playlist) {\n Log.debug(\n `[MT - ${getTimestamp()}] Parsing VHS playlist (${\n playlist.segments?.length || 0\n } segments)`,\n );\n\n if (!playlist.segments || playlist.segments.length === 0) {\n Log.debug(`[MT - ${getTimestamp()}] No segments in playlist`);\n return;\n }\n\n this.updateLiveRefreshIntervalFromManifest(\n playlist.targetDuration,\n 'vhs target duration',\n );\n\n // VHS strips CUE tags - detect via discontinuityStarts + MediaTailor segments\n const ads = detectAdBreaksFromVhsPlaylist(playlist, {\n adSegmentPrefix: this.adSegmentPrefix,\n });\n\n if (ads.length > 0) {\n // Log which detection path matched — only on first detection to avoid noise\n if (!this._detectionPathLogged) {\n const firstSeg = playlist.segments && playlist.segments.find(s =>\n whichAdSegmentMarker(s, { adSegmentPrefix: this.adSegmentPrefix })\n );\n if (firstSeg) {\n const path = whichAdSegmentMarker(firstSeg, { adSegmentPrefix: this.adSegmentPrefix });\n Log.debug(`[MT] ad segment detection matched via: ${path}`);\n this._detectionPathLogged = true;\n }\n }\n Log.debug(\n `[MT - ${getTimestamp()}] VHS detected ${ads.length} ad break(s), ${ads.reduce(\n (sum, ab) => sum + ab.pods.length,\n 0,\n )} pod(s)`,\n );\n this.mergeNewAds(ads);\n } else {\n Log.debug(`[MT - ${getTimestamp()}] No ads detected in VHS playlist`);\n }\n }\n\n /**\n * Polls manifest for new ads (Live streams only)\n */\n async pollManifestForNewAds() {\n if (this.isDisposed) return;\n if (this.streamType !== STREAM_TYPE.LIVE) return;\n\n if (this.isFetchingManifest) {\n Log.debug(\n `[MT - ${getTimestamp()}] Manifest fetch already in progress, skipping`,\n );\n return;\n }\n\n this.isFetchingManifest = true;\n\n try {\n const tech = this.player.tech({ IWillNotUseThisInPlugins: true });\n if (tech && tech.vhs) {\n const playlist = tech.vhs.playlists.media();\n if (playlist) {\n this.parseVhsPlaylistForAdBreaks(playlist);\n }\n } else if (this.manifestFormat === MANIFEST_TYPE.DASH) {\n await this.fetchAndParseDashManifest(this.playbackManifestUrl);\n }\n } catch (error) {\n Log.debug(`[MT - ${getTimestamp()}] Manifest poll error:`, error);\n } finally {\n this.isFetchingManifest = false;\n }\n }\n\n /**\n * Merges new ads into schedule (deduplicates)\n */\n mergeNewAds(newAds) {\n this.adSchedule = mergeAdSchedules(this.adSchedule, newAds);\n\n Log.debug(\n `[MT - ${getTimestamp()}] Ad schedule: ${this.adSchedule.length} ad break(s)`,\n );\n\n // VOD: Fetch tracking metadata after first manifest parse (AWS best practice)\n if (\n this.streamType === STREAM_TYPE.VOD &&\n this.trackingEndpointUrl &&\n !this.hasAttemptedTrackingFetch\n ) {\n this.hasAttemptedTrackingFetch = true;\n Log.debug(\n `[MT - ${getTimestamp()}] Fetching tracking metadata (first manifest parse)`,\n );\n this.getAndProcessTrackingMetadata();\n }\n }\n\n /**\n * Updates live polling cadence from manifest-derived metadata\n */\n updateLiveRefreshIntervalFromManifest(intervalSeconds, source) {\n if (\n this.streamType !== STREAM_TYPE.LIVE ||\n !intervalSeconds ||\n intervalSeconds <= 0\n ) {\n return;\n }\n\n if (this.liveRefreshIntervalSeconds === intervalSeconds) {\n return;\n }\n\n this.liveRefreshIntervalSeconds = intervalSeconds;\n Log.debug(\n `[MT - ${getTimestamp()}] Derived live polling interval from ${source}: ${intervalSeconds}s`,\n );\n\n if (this.manifestPollTimer || this.trackingPollTimer) {\n this.restartLivePollingTimers();\n }\n }\n\n /**\n * Fetches and processes tracking metadata from AWS MediaTailor Tracking API\n */\n async getAndProcessTrackingMetadata() {\n if (this.isDisposed || !this.trackingEndpointUrl) return;\n\n if (this.isFetchingTracking) {\n Log.debug(\n `[MT - ${getTimestamp()}] Tracking fetch already in progress, skipping`,\n );\n return;\n }\n\n this.isFetchingTracking = true;\n\n try {\n Log.debug(`[MT - ${getTimestamp()}] Fetching tracking metadata`);\n\n this.trackingAbortController = new AbortController();\n\n const data = await getTrackingMetadata(\n this.trackingEndpointUrl,\n TRACKING_API_TIMEOUT_MS,\n this.trackingAbortController.signal,\n );\n\n if (this.isDisposed) {\n Log.debug(\n `[MT - ${getTimestamp()}] Disposed during tracking fetch, ignoring result`,\n );\n return;\n }\n\n if (data.avails && data.avails.length > 0) {\n Log.debug(\n `[MT - ${getTimestamp()}] Enriching with ${data.avails.length} avail(s)`,\n );\n this.enrichWithTrackingMetadata(data.avails);\n this.trackingFetchRetries = 0;\n } else {\n Log.debug(`[MT - ${getTimestamp()}] Tracking API returned 0 avails`);\n }\n } catch (error) {\n if (error.name === 'AbortError' || this.isDisposed) {\n Log.debug(`[MT - ${getTimestamp()}] Tracking fetch aborted`);\n return;\n }\n\n Log.debug(\n `[MT - ${getTimestamp()}] Tracking API error: ${error.message}`,\n error,\n );\n\n if (this.trackingFetchRetries < this.maxTrackingRetries) {\n this.trackingFetchRetries++;\n Log.debug(\n `[MT - ${getTimestamp()}] Retrying tracking fetch (${this.trackingFetchRetries}/${this.maxTrackingRetries})`,\n );\n this.isFetchingTracking = false;\n await this.getAndProcessTrackingMetadata();\n return;\n }\n\n Log.debug(\n `[MT - ${getTimestamp()}] Max retries reached, continuing with manifest data only`,\n );\n } finally {\n this.isFetchingTracking = false;\n this.trackingAbortController = null;\n }\n }\n\n /**\n * Enriches ad schedule with tracking API metadata\n */\n enrichWithTrackingMetadata(avails) {\n const newAds = enrichAdScheduleWithTrackingMetadata(this.adSchedule, avails);\n\n // Add any new ads from tracking\n if (newAds.length > 0) {\n this.adSchedule.push(...newAds);\n this.adSchedule.sort((a, b) => a.startTime - b.startTime);\n }\n\n Log.debug(\n `[MT - ${getTimestamp()}] Enrichment complete: ${\n this.adSchedule.length\n } ad break(s)`,\n );\n\n // Log enriched schedule with full details\n Log.debug(\n `[MT - ${getTimestamp()}] Enriched schedule:`,\n this.adSchedule.map((ab) => ({\n id: ab.id,\n startTime: ab.startTime,\n endTime: ab.endTime,\n duration: ab.duration,\n title: ab.title,\n podCount: ab.pods.length,\n pods: ab.pods.map((p) => ({\n title: p.title,\n startTime: p.startTime,\n endTime: p.endTime,\n duration: p.duration,\n })),\n })),\n );\n\n // Log current player time for debugging\n Log.debug(\n `[MT - ${getTimestamp()}] Current player time: ${this.player.currentTime()}s`,\n );\n }\n\n /**\n * Tracks quartile events for active pod/ad\n */\n trackQuartiles(adObject, progress) {\n if (!adObject.duration || adObject.duration <= 0) return;\n\n const quartilesToFire = getQuartilesToFire(progress, adObject.duration, {\n q1: adObject.hasFiredQ1,\n q2: adObject.hasFiredQ2,\n q3: adObject.hasFiredQ3,\n });\n\n quartilesToFire.forEach(({ quartile, key }) => {\n Log.debug(`[MT - ${getTimestamp()}] → AD_QUARTILE ${quartile * 25}%`);\n this.sendAdQuartile({ quartile });\n adObject[`hasFired${key.toUpperCase()}`] = true;\n });\n }\n\n /**\n * Called on timeupdate - main event tracking logic\n */\n onTimeUpdate() {\n const currentTime = this.player.currentTime();\n const activeAdBreak = findActiveAdBreak(this.adSchedule, currentTime);\n\n // Debug logging (only log when schedule exists and every 5 seconds)\n if (\n this.adSchedule.length > 0 &&\n Math.floor(currentTime) % 5 === 0 &&\n Math.floor(currentTime * 10) % 10 === 0\n ) {\n Log.debug(\n `[MT - ${getTimestamp()}] TimeUpdate: ${currentTime.toFixed(2)}s, Active break: ${\n activeAdBreak ? activeAdBreak.id : 'none'\n }, Schedule count: ${this.adSchedule.length}`,\n );\n }\n\n if (activeAdBreak) {\n // === INSIDE AD BREAK ===\n\n // Fire AD_BREAK_START once\n if (!activeAdBreak.hasFiredStart) {\n this.currentAdBreak = activeAdBreak;\n this.setIsAd(true); // Switch to ad mode\n Log.debug(\n `[MT - ${getTimestamp()}] setIsAd(true) - Entering ad break`,\n );\n\n // Calculate ad position by finding index based on startTime\n const adBreakIndex = this.adSchedule.findIndex(\n (ad) => Math.abs(ad.startTime - activeAdBreak.startTime) < 0.5,\n );\n const adPosition = determineAdPosition(\n adBreakIndex,\n this.adSchedule.length,\n this.streamType,\n );\n\n // Store position on the ad break for reuse\n activeAdBreak.adPosition = adPosition;\n\n Log.debug(`[MT - ${getTimestamp()}] → AD_BREAK_START`, {\n startTime: activeAdBreak.startTime,\n duration: activeAdBreak.duration,\n podCount: activeAdBreak.pods?.length || 0,\n position: adPosition,\n breakIndex: adBreakIndex,\n totalBreaks: this.adSchedule.length,\n });\n this.sendAdBreakStart();\n activeAdBreak.hasFiredStart = true;\n }\n\n // Check for pod-level tracking\n if (activeAdBreak.pods && activeAdBreak.pods.length > 0) {\n const activePod = findActivePod(activeAdBreak, currentTime);\n\n if (activePod) {\n // Entering new pod\n if (!this.currentAdPod || this.currentAdPod !== activePod) {\n // End previous pod\n if (this.currentAdPod) {\n Log.debug(`[MT - ${getTimestamp()}] → AD_END (pod transition)`);\n this.sendEnd();\n }\n\n // Start new pod\n this.currentAdPod = activePod;\n\n Log.debug(`[MT - ${getTimestamp()}] → AD_START (new pod)`, {\n startTime: activePod.startTime,\n duration: activePod.duration,\n position: activeAdBreak.adPosition,\n });\n\n // NOTE: If the tracking API was slow to respond, the no-pods path\n // (below) will have already called sendStart() on this break.\n // Calling sendStart() again here is intentional — video-core's state\n // machine suppresses duplicate AD_START transitions (AD_START →\n // AD_START is a no-op), so nothing double-fires in New Relic. Once\n // pods are populated by the tracking API, this path takes over and\n // provides pod-level metadata (title, duration, creativeId) for all\n // subsequent events in the break.\n this.sendRequest({\n adPartner: 'aws-mediatailor',\n adPosition: activeAdBreak.adPosition,\n });\n\n this.sendStart({\n adPartner: 'aws-mediatailor',\n adPosition: activeAdBreak.adPosition,\n });\n activePod.hasFiredStart = true;\n }\n\n // Track quartiles for pod\n const podProgress = currentTime - activePod.startTime;\n this.trackQuartiles(activePod, podProgress);\n }\n } else {\n // No pods - treat entire break as single ad\n if (!activeAdBreak.hasFiredAdStart) {\n Log.debug(`[MT - ${getTimestamp()}] → AD_START (no pods)`, {\n startTime: activeAdBreak.startTime,\n duration: activeAdBreak.duration,\n position: activeAdBreak.adPosition,\n });\n\n // Send AD_REQUEST before AD_START (required sequence)\n this.sendRequest({\n adPartner: 'aws-mediatailor',\n adPosition: activeAdBreak.adPosition,\n });\n\n // Send AD_START\n this.sendStart({\n adPartner: 'aws-mediatailor',\n adPosition: activeAdBreak.adPosition,\n });\n activeAdBreak.hasFiredAdStart = true;\n }\n\n // Track quartiles for entire break\n const adProgress = currentTime - activeAdBreak.startTime;\n this.trackQuartiles(activeAdBreak, adProgress);\n }\n } else if (this.currentAdBreak) {\n // === EXITING AD BREAK ===\n\n // End last pod\n if (this.currentAdPod) {\n Log.debug(`[MT - ${getTimestamp()}] → AD_END (final pod)`);\n this.sendEnd();\n this.currentAdPod = null;\n }\n\n // End ad break\n if (!this.currentAdBreak.hasFiredEnd) {\n Log.debug(`[MT - ${getTimestamp()}] → AD_BREAK_END`);\n this.sendAdBreakEnd();\n this.currentAdBreak.hasFiredEnd = true;\n }\n\n this.currentAdBreak = null;\n this.setIsAd(false); // Switch back to content mode\n Log.debug(`[MT - ${getTimestamp()}] setIsAd(false) - Exiting ad break`);\n\n // Check if video has ended after exiting last ad break\n if (this.player.ended() && !this.hasEndedContent) {\n Log.debug(\n `[MT - ${getTimestamp()}] Video ended after last ad → CONTENT_END`,\n );\n this.sendContentEnd();\n this.hasEndedContent = true;\n }\n }\n }\n\n /**\n * Sends CONTENT_END event via parent content tracker\n */\n sendContentEnd() {\n if (this.parentTracker) {\n this.parentTracker.sendEnd();\n } else {\n super.sendEnd();\n }\n }\n\n /**\n * Generic handler for ad events - only fires if currently in an ad break\n * @param {string} eventName - The event name for logging (e.g., 'AD_PAUSE')\n * @param {Function} sendMethod - The method to call (e.g., this.sendPause)\n */\n handleAdEvent(eventName, sendMethod) {\n if (this.isAd()) {\n Log.debug(`[MT - ${getTimestamp()}] → ${eventName}`);\n sendMethod.call(this);\n }\n }\n\n /**\n * Handle pause events - sends AD_PAUSE only when ads are playing\n */\n onPause() {\n this.handleAdEvent('AD_PAUSE', this.sendPause);\n }\n\n /**\n * Handle playing events - sends AD_RESUME only when ads are playing\n */\n onPlaying() {\n if (this.isAd()) {\n Log.debug(`[MT - ${getTimestamp()}] → AD_RESUME`);\n this.sendResume();\n this.sendBufferEnd(); // Playing event also ends any buffering\n }\n }\n\n /**\n * Handle seeking events - sends AD_SEEK_START only when ads are playing\n */\n onSeeking() {\n this.handleAdEvent('AD_SEEK_START', this.sendSeekStart);\n }\n\n /**\n * Handle seeked events - sends AD_SEEK_END only when ads are playing\n */\n onSeeked() {\n this.handleAdEvent('AD_SEEK_END', this.sendSeekEnd);\n }\n\n /**\n * Handle waiting (buffering) events - sends AD_BUFFER_START only when ads are playing\n */\n onWaiting() {\n this.handleAdEvent('AD_BUFFER_START', this.sendBufferStart);\n }\n\n /**\n * Override: Fire CONTENT_END when video ends\n */\n onEnded() {\n if (!this.hasEndedContent) {\n Log.debug(`[MT - ${getTimestamp()}] Video ended → CONTENT_END`);\n this.sendContentEnd();\n this.hasEndedContent = true;\n }\n }\n\n /**\n * Returns ad title for New Relic\n */\n getTitle() {\n if (this.currentAdPod) {\n return this.currentAdPod.title || this.currentAdBreak?.id || null;\n }\n return this.currentAdBreak?.title || this.currentAdBreak?.id || null;\n }\n\n /**\n * Returns ad ID for New Relic (adId attribute)\n */\n getVideoId() {\n if (this.currentAdPod) {\n return (\n this.currentAdPod.creativeId ||\n this.currentAdPod.title ||\n this.currentAdBreak?.id ||\n null\n );\n }\n return this.currentAdBreak?.creativeId || this.currentAdBreak?.id || null;\n }\n\n /**\n * Returns ad source URL for New Relic (adSrc attribute)\n */\n getSrc() {\n // MediaTailor doesn't provide individual creative URLs\n return this.trackingEndpointUrl || this.playbackManifestUrl || null;\n }\n\n /**\n * Returns ad duration in milliseconds for New Relic\n */\n getDuration() {\n if (this.currentAdPod) {\n return this.currentAdPod.duration * 1000;\n }\n return this.currentAdBreak ? this.currentAdBreak.duration * 1000 : null;\n }\n\n /**\n * Stops polling timers\n */\n stopPolling() {\n if (this.manifestPollTimer) {\n clearInterval(this.manifestPollTimer);\n this.manifestPollTimer = null;\n }\n\n if (this.trackingPollTimer) {\n clearInterval(this.trackingPollTimer);\n this.trackingPollTimer = null;\n }\n\n Log.debug(`[MT - ${getTimestamp()}] Polling stopped`);\n }\n\n /**\n * Cleanup when tracker is destroyed\n */\n dispose() {\n Log.debug(`[MT - ${getTimestamp()}] Disposing MediaTailorAdsTracker`);\n\n this.isDisposed = true;\n\n if (this.trackingAbortController) {\n Log.debug(`[MT - ${getTimestamp()}] Aborting in-flight tracking fetch`);\n this.trackingAbortController.abort();\n this.trackingAbortController = null;\n }\n\n if (this.manifestAbortController) {\n Log.debug(`[MT - ${getTimestamp()}] Aborting in-flight manifest fetch`);\n this.manifestAbortController.abort();\n this.manifestAbortController = null;\n }\n\n this.stopLivePolling();\n this.unregisterListeners();\n super.dispose && super.dispose();\n }\n}\n","/**\n * MediaTailor Constants\n * Contains all regex patterns, config defaults, and constant values for AWS MediaTailor ad tracking\n */\n\n// HLS manifest regex patterns used while scanning raw MediaTailor playlists.\n// Example inputs:\n// - #EXT-X-CUE-OUT:DURATION=29.988\n// - #EXT-X-DISCONTINUITY\n// - #EXT-X-MAP:URI=\"https://segments.mediatailor.../init.mp4\"\nexport const REGEX_CUE_OUT = /#EXT-X-CUE-OUT:DURATION=([\\d.]+)/; // Captures the numeric ad break duration from a MediaTailor CUE-OUT tag so the tracker can seed an ad break before CUE-IN arrives\nexport const REGEX_DISCONTINUITY = /#EXT-X-DISCONTINUITY/; // Detects HLS discontinuity boundaries, which MediaTailor playlists can use around ad/content transitions and pod boundaries\nexport const REGEX_MAP = /#EXT-X-MAP:URI=\"([^\"]+)\"/; // Captures the MAP URI from fMP4 playlists so MAP changes can be used to split one avail into multiple ad pods\n\n// MediaTailor URL and manifest regex patterns.\n// These are used to derive the tracking endpoint and to read manifest refresh metadata\n// directly from HLS and DASH payloads.\nexport const REGEX_SESSION_ID = /sessionId=([^&]+)/; // Captures the session id from a sessionized playback URL query string such as ?aws.sessionId=abc123 so we can construct the MediaTailor tracking endpoint\nexport const REGEX_TRACKING_PATH_SEGMENT = /\\/v1\\/(master|session|dash)\\//; // Matches the playback path prefix in URLs like /v1/master/... or /v1/dash/... so it can be rewritten to /v1/tracking/...\nexport const REGEX_MANIFEST_FILE_SUFFIX = /\\/[^/]*\\.(m3u8|mpd).*$/; // Matches the trailing manifest filename and any query string, such as /master.m3u8?... or /index.mpd?..., so it can be replaced with /{sessionId}\nexport const REGEX_HLS_TARGET_DURATION = /#EXT-X-TARGETDURATION:(\\d+)/; // Captures the HLS target duration value from a line like #EXT-X-TARGETDURATION:6, which we use as the live polling cadence when available\nexport const REGEX_DASH_MINIMUM_UPDATE_PERIOD = /minimumUpdatePeriod=\"([^\"]+)\"/; // Captures the DASH MPD minimumUpdatePeriod attribute, for example minimumUpdatePeriod=\"PT5S\", so live polling follows the manifest's declared refresh rate\nexport const REGEX_ISO_8601_DURATION = /PT(?:(\\d+)H)?(?:(\\d+)M)?(?:([\\d.]+)S)?/; // Parses ISO 8601 duration values like PT5S, PT1M14S, or PT1H2M3.5S into hour, minute, and second groups for DASH timing calculations\n\n// MediaTailor string markers used across tracker selection and manifest parsing\nexport const HLS_MANIFEST_EXTENSION = '.m3u8'; // Identifies HLS manifest URLs and child playlist references\nexport const DASH_MANIFEST_EXTENSION = '.mpd'; // Identifies DASH manifest URLs\nexport const MEDIATAILOR_HOST_MARKER = '.mediatailor.'; // Identifies MediaTailor playback URLs when selecting this ads tracker\nexport const MT_HLS_CUE_OUT_TAG = '#EXT-X-CUE-OUT'; // Marks the start of an HLS ad break in MediaTailor manifests\nexport const MT_HLS_CUE_IN_TAG = '#EXT-X-CUE-IN'; // Marks the end of an HLS ad break in MediaTailor manifests\nexport const HLS_SEGMENT_DURATION_TAG = '#EXTINF:'; // Carries HLS segment duration values used to advance manifest time\nexport const HLS_TAG_PREFIX = '#'; // Distinguishes HLS tags from playlist URI lines in manifest scans\nexport const SCTE35_SCHEME_MARKER = 'scte35'; // Identifies SCTE-35 DASH signaling in schemeIdUri values\nexport const DASH_SCTE35_EVENT_STREAM_SELECTOR =\n 'EventStream[schemeIdUri*=\"scte35\"], EventStream[schemeIdUri*=\"SCTE35\"]'; // Selects DASH EventStream nodes that carry SCTE-35 ad markers\nexport const HLS_MIME_TYPE = 'application/vnd.apple.mpegurl'; // MIME type used to detect Safari/native HLS playback support\n\n// MediaTailor URL Patterns\nexport const MT_SEGMENT_PATTERN = 'segments.mediatailor'; // Identifies MediaTailor ad segments (AWS default hostname)\nexport const MT_DEFAULT_AD_SEGMENT_PATH = '/tm/'; // Default ad-segment path per AWS CDN integration guide (custom-CDN setups)\n\nexport const TRACKING_API_TIMEOUT_MS = 5000; // Keep tracking metadata requests within the guide's 5s end-to-end budget\nexport const DEFAULT_LIVE_POLL_INTERVAL_MS = 5000; // Temporary fallback until manifest metadata provides cadence\n// Timing Thresholds\nexport const MIN_AD_DURATION = 0.5; // Minimum ad duration in seconds (filter false positives)\nexport const AD_TIMING_TOLERANCE = 0.5; // Tolerance for matching ad times in seconds\nexport const POST_AD_PAUSE_THRESHOLD = 500; // Ignore pause events within 500ms after ad break (avoids false CONTENT_PAUSE)\n\n// Stream Types\nexport const STREAM_TYPE = {\n VOD: 'vod', // Video on Demand\n LIVE: 'live', // Live streaming\n};\n\n// Manifest Types\nexport const MANIFEST_TYPE = {\n HLS: 'hls', // HTTP Live Streaming (.m3u8)\n DASH: 'dash', // Dynamic Adaptive Streaming over HTTP (.mpd)\n};\n\n// Ad Position Types (for VOD only)\nexport const AD_POSITION = {\n PRE_ROLL: 'pre', // First ad break\n MID_ROLL: 'mid', // Middle ad break\n POST_ROLL: 'post', // Last ad break\n};\n\n// Ad Detection Sources\nexport const AD_SOURCE = {\n MANIFEST_CUE: 'manifest-cue', // Detected from CUE-OUT/CUE-IN tags (HLS) or EventStream (DASH)\n VHS_DISCONTINUITY: 'vhs-discontinuity', // Detected from VHS discontinuityStarts\n TRACKING_API: 'tracking-api', // Added from tracking API response\n MANIFEST_AND_TRACKING: 'manifest+tracking', // Enriched by both sources\n DASH_EMSG: 'dash-emsg', // Detected from DASH emsg events (Shaka Player)\n DASH_EVENT_STREAM: 'dash-event-stream', // Detected from DASH EventStream (dash.js)\n};\n\n// Quartile Percentages\nexport const QUARTILES = {\n Q1: 0.25, // 25% progress\n Q2: 0.5, // 50% progress\n Q3: 0.75, // 75% progress\n};\n","/**\n * MediaTailor Utility Functions\n * Helper functions for AWS MediaTailor ad tracking\n */\n\nimport nrvideo from '@newrelic/video-core';\n\nconst nrvideoCore = nrvideo.default || nrvideo;\nconst Log = nrvideoCore.Log;\n\nimport {\n DASH_MANIFEST_EXTENSION,\n DASH_SCTE35_EVENT_STREAM_SELECTOR,\n HLS_MANIFEST_EXTENSION,\n HLS_SEGMENT_DURATION_TAG,\n HLS_TAG_PREFIX,\n REGEX_CUE_OUT,\n REGEX_DASH_MINIMUM_UPDATE_PERIOD,\n REGEX_DISCONTINUITY,\n REGEX_HLS_TARGET_DURATION,\n REGEX_ISO_8601_DURATION,\n REGEX_MAP,\n REGEX_MANIFEST_FILE_SUFFIX,\n REGEX_SESSION_ID,\n REGEX_TRACKING_PATH_SEGMENT,\n MT_HLS_CUE_IN_TAG,\n MT_HLS_CUE_OUT_TAG,\n MT_SEGMENT_PATTERN,\n MT_DEFAULT_AD_SEGMENT_PATH,\n MIN_AD_DURATION,\n AD_TIMING_TOLERANCE,\n SCTE35_SCHEME_MARKER,\n STREAM_TYPE,\n MANIFEST_TYPE,\n AD_POSITION,\n AD_SOURCE,\n QUARTILES,\n} from './mt-constants.js';\n\n/**\n * Generates timestamp string for logging (HH:MM:SS.mmm format)\n */\nexport function getTimestamp() {\n const now = new Date();\n return now.toISOString().substring(11, 23);\n}\n\n/**\n * Detects manifest format from URL (.m3u8 = HLS, .mpd = DASH)\n */\nexport function detectManifestFormatFromUrl(url) {\n if (url.includes(HLS_MANIFEST_EXTENSION)) {\n return MANIFEST_TYPE.HLS;\n } else if (url.includes(DASH_MANIFEST_EXTENSION)) {\n return MANIFEST_TYPE.DASH;\n }\n return MANIFEST_TYPE.HLS; // Default fallback\n}\n\n/**\n * Detects stream type from player duration (Infinity = Live, else = VOD)\n */\nexport function detectPlaybackStreamType(duration) {\n return duration === Infinity ? STREAM_TYPE.LIVE : STREAM_TYPE.VOD;\n}\n\n/**\n * Builds a tracking endpoint URL from a sessionized manifest URL\n * Format: /v1/tracking/{customerId}/{configName}/{sessionId}\n */\nexport function buildTrackingEndpointUrl(manifestUrl) {\n const match = manifestUrl.match(REGEX_SESSION_ID);\n\n if (!match) {\n return null;\n }\n\n const sessionId = match[1];\n\n // Convert manifest URL to tracking URL:\n // /v1/master/{id}/{name}/master.m3u8?aws.sessionId=xxx → /v1/tracking/{id}/{name}/{sessionId}\n // /v1/dash/{id}/{name}/index.mpd?aws.sessionId=xxx → /v1/tracking/{id}/{name}/{sessionId}\n const trackingEndpointUrl = manifestUrl\n .replace(REGEX_TRACKING_PATH_SEGMENT, '/v1/tracking/')\n .replace(REGEX_MANIFEST_FILE_SUFFIX, `/${sessionId}`);\n\n return trackingEndpointUrl;\n}\n\n/**\n * Checks if segment is a MediaTailor ad segment\n */\nexport function isMediaTailorSegment(segment, { adSegmentPrefix } = {}) {\n const candidates = [MT_SEGMENT_PATTERN, MT_DEFAULT_AD_SEGMENT_PATH];\n if (adSegmentPrefix) candidates.push(adSegmentPrefix);\n\n const mapUri = (segment.map && segment.map.uri) || '';\n const segUri = segment.uri || '';\n\n return candidates.some(\n (marker) => mapUri.includes(marker) || segUri.includes(marker),\n );\n}\n\nexport function whichAdSegmentMarker(segment, { adSegmentPrefix } = {}) {\n const labeled = [\n { marker: MT_SEGMENT_PATTERN, label: 'aws-hostname (segments.mediatailor)' },\n { marker: MT_DEFAULT_AD_SEGMENT_PATH, label: 'default-cdn-path (/tm/)' },\n ];\n if (adSegmentPrefix) labeled.push({ marker: adSegmentPrefix, label: `custom-prefix (${adSegmentPrefix})` });\n\n const mapUri = (segment.map && segment.map.uri) || '';\n const segUri = segment.uri || '';\n\n const hit = labeled.find(({ marker }) => mapUri.includes(marker) || segUri.includes(marker));\n return hit ? hit.label : null;\n}\n\n/**\n * Determines ad position based on schedule index (VOD only, Live returns null)\n */\nexport function determineAdPosition(adBreakIndex, totalAdBreaks, streamType) {\n if (streamType === STREAM_TYPE.LIVE) {\n return null; // Live streams have no position concept\n }\n\n // VOD: Determine position by schedule index\n if (adBreakIndex === 0) {\n return AD_POSITION.PRE_ROLL; // First ad\n } else if (adBreakIndex === totalAdBreaks - 1) {\n return AD_POSITION.POST_ROLL; // Last ad\n } else {\n return AD_POSITION.MID_ROLL; // Middle ad\n }\n}\n\n/**\n * Finds ad break index in schedule by start time\n */\nexport function findAdBreakIndex(adSchedule, startTime) {\n return adSchedule.findIndex(\n (ad) => Math.abs(ad.startTime - startTime) < AD_TIMING_TOLERANCE\n );\n}\n\n/**\n * Calculates quartile thresholds for an ad duration\n */\nexport function calculateQuartiles(duration) {\n return {\n q1: duration * QUARTILES.Q1,\n q2: duration * QUARTILES.Q2,\n q3: duration * QUARTILES.Q3,\n };\n}\n\n/**\n * Checks which quartile events should fire based on progress\n */\nexport function getQuartilesToFire(progress, duration, firedQuartiles) {\n const quartiles = calculateQuartiles(duration);\n const toFire = [];\n\n if (progress >= quartiles.q1 && !firedQuartiles.q1) {\n toFire.push({ quartile: 1, key: 'q1' });\n }\n if (progress >= quartiles.q2 && !firedQuartiles.q2) {\n toFire.push({ quartile: 2, key: 'q2' });\n }\n if (progress >= quartiles.q3 && !firedQuartiles.q3) {\n toFire.push({ quartile: 3, key: 'q3' });\n }\n\n return toFire;\n}\n\n/**\n * Finds active ad break at current playhead time\n */\nexport function findActiveAdBreak(adSchedule, currentTime) {\n return adSchedule.find(\n (ad) => currentTime >= ad.startTime && currentTime < ad.endTime\n );\n}\n\n/**\n * Finds active pod within ad break at current playhead time\n */\nexport function findActivePod(adBreak, currentTime) {\n if (!adBreak || !adBreak.pods || adBreak.pods.length === 0) {\n return null;\n }\n\n return adBreak.pods.find(\n (pod) => currentTime >= pod.startTime && currentTime < pod.endTime\n );\n}\n\n/**\n * Validates if ad break duration meets minimum threshold\n */\nexport function isValidAdBreak(adBreak) {\n return adBreak.duration > MIN_AD_DURATION;\n}\n\n/**\n * Merges new ads into existing schedule (deduplicates by start time)\n */\nexport function mergeAdSchedules(existingSchedule, newAds) {\n const scheduleMap = new Map();\n\n // Add existing ads to map (keyed by rounded start time)\n existingSchedule.forEach((ad) => {\n const key = Math.round(ad.startTime);\n scheduleMap.set(key, ad);\n });\n\n // Merge new ads\n const merged = [];\n newAds.forEach((newAd) => {\n const key = Math.round(newAd.startTime);\n const existingAd = scheduleMap.get(key);\n\n if (!existingAd) {\n merged.push(newAd);\n scheduleMap.set(key, newAd);\n } else if (!existingAd.confirmedByTracking && newAd.confirmedByTracking) {\n Object.assign(existingAd, newAd);\n }\n });\n\n // Combine and sort by start time\n const finalSchedule = [...existingSchedule, ...merged];\n finalSchedule.sort((a, b) => a.startTime - b.startTime);\n\n return finalSchedule;\n}\n\n/**\n * Parses HLS manifest text for CUE-OUT/CUE-IN markers\n */\nexport function parseHlsManifestForAdBreaks(manifestText) {\n const lines = manifestText.split('\\n');\n const adBreaks = [];\n\n let currentTime = 0;\n let currentAdBreak = null;\n let currentPodStartTime = null;\n let lastMapUrl = null;\n let adPods = [];\n let isInAdBreak = false;\n\n for (const line of lines) {\n // Detect DISCONTINUITY marker\n if (REGEX_DISCONTINUITY.test(line)) {\n if (isInAdBreak && lastMapUrl) {\n const mapMatch = line.match(REGEX_MAP);\n const mapUrl = mapMatch ? mapMatch[1] : null;\n\n if (mapUrl && mapUrl !== lastMapUrl) {\n // New MAP = new pod boundary\n if (currentPodStartTime !== null) {\n const podDuration = currentTime - currentPodStartTime;\n adPods.push({\n startTime: currentPodStartTime,\n duration: podDuration,\n endTime: currentTime,\n mapUrl: lastMapUrl,\n });\n }\n currentPodStartTime = currentTime;\n lastMapUrl = mapUrl;\n }\n }\n }\n\n // Detect MAP URL changes\n const mapMatch = line.match(REGEX_MAP);\n if (mapMatch && isInAdBreak) {\n const mapUrl = mapMatch[1];\n if (mapUrl && mapUrl !== lastMapUrl) {\n // New MAP = new pod\n if (currentPodStartTime !== null) {\n const podDuration = currentTime - currentPodStartTime;\n adPods.push({\n startTime: currentPodStartTime,\n duration: podDuration,\n endTime: currentTime,\n mapUrl: lastMapUrl,\n });\n }\n currentPodStartTime = currentTime;\n lastMapUrl = mapUrl;\n }\n }\n\n // Detect CUE-OUT (ad break start)\n if (line.startsWith(MT_HLS_CUE_OUT_TAG)) {\n const durationMatch = line.match(REGEX_CUE_OUT);\n const duration = durationMatch ? parseFloat(durationMatch[1]) : null;\n\n isInAdBreak = true;\n adPods = [];\n currentAdBreak = {\n id: `avail-${currentTime}`,\n startTime: currentTime,\n duration: duration,\n endTime: null,\n pods: [],\n hasFiredStart: false,\n hasFiredEnd: false,\n hasFiredAdStart: false,\n confirmedByTracking: false,\n };\n }\n\n // Detect CUE-IN (ad break end)\n if (line.startsWith(MT_HLS_CUE_IN_TAG)) {\n if (currentAdBreak) {\n // Close final pod\n if (currentPodStartTime !== null) {\n const podDuration = currentTime - currentPodStartTime;\n adPods.push({\n startTime: currentPodStartTime,\n duration: podDuration,\n endTime: currentTime,\n mapUrl: lastMapUrl,\n });\n }\n\n // Calculate actual duration\n const actualDuration = currentTime - currentAdBreak.startTime;\n\n // Filter zero-duration false positives\n if (actualDuration >= MIN_AD_DURATION) {\n currentAdBreak.duration = actualDuration;\n currentAdBreak.endTime = currentTime;\n currentAdBreak.pods = adPods;\n adBreaks.push(currentAdBreak);\n }\n\n // Reset state\n currentAdBreak = null;\n isInAdBreak = false;\n currentPodStartTime = null;\n lastMapUrl = null;\n adPods = [];\n }\n }\n\n // Track time via EXTINF\n if (line.startsWith(HLS_SEGMENT_DURATION_TAG)) {\n const duration = parseFloat(line.split(':')[1]);\n if (!isNaN(duration)) {\n currentTime += duration;\n }\n }\n }\n\n // Handle unclosed ad break\n if (currentAdBreak && currentAdBreak.duration) {\n currentAdBreak.endTime = currentAdBreak.startTime + currentAdBreak.duration;\n currentAdBreak.pods = adPods;\n adBreaks.push(currentAdBreak);\n }\n\n return adBreaks;\n}\n\n/**\n * Detects ads from VHS playlist using discontinuityStarts and MediaTailor segments\n */\nexport function detectAdBreaksFromVhsPlaylist(playlist, { adSegmentPrefix } = {}) {\n const segments = playlist.segments;\n const discontinuityStarts = playlist.discontinuityStarts || [];\n const adBreaks = [];\n\n let currentAdBreak = null;\n let currentPod = null;\n let currentTime = 0;\n\n segments.forEach((segment, index) => {\n const isMTSegment = isMediaTailorSegment(segment, { adSegmentPrefix });\n const hasDiscontinuity = discontinuityStarts.includes(index);\n\n if (isMTSegment) {\n // Discontinuity marks new pod boundary\n if (hasDiscontinuity && currentPod) {\n currentPod.endTime = currentTime;\n if (currentPod.duration > MIN_AD_DURATION) {\n currentAdBreak.pods.push(currentPod);\n }\n currentPod = null;\n }\n\n // Start new ad break if not in one\n if (!currentAdBreak) {\n currentAdBreak = {\n id: `avail-${currentTime}`,\n startTime: currentTime,\n duration: 0,\n endTime: null,\n source: 'vhs-discontinuity',\n confirmedByTracking: false,\n hasFiredStart: false,\n hasFiredEnd: false,\n hasFiredAdStart: false,\n hasFiredQ1: false,\n hasFiredQ2: false,\n hasFiredQ3: false,\n pods: [],\n };\n }\n\n // Start new pod if not in one\n if (!currentPod) {\n currentPod = {\n startTime: currentTime,\n duration: 0,\n endTime: null,\n hasFiredStart: false,\n hasFiredQ1: false,\n hasFiredQ2: false,\n hasFiredQ3: false,\n };\n }\n\n // Accumulate durations\n const segmentDuration = segment.duration || 0;\n currentAdBreak.duration += segmentDuration;\n currentPod.duration += segmentDuration;\n } else {\n // Not MediaTailor segment - end ad break\n if (currentAdBreak) {\n // Close current pod\n if (currentPod) {\n currentPod.endTime = currentTime;\n if (currentPod.duration > MIN_AD_DURATION) {\n currentAdBreak.pods.push(currentPod);\n }\n currentPod = null;\n }\n\n // Close ad break\n currentAdBreak.endTime = currentTime;\n if (currentAdBreak.duration > MIN_AD_DURATION) {\n adBreaks.push(currentAdBreak);\n }\n currentAdBreak = null;\n }\n }\n\n currentTime += segment.duration || 0;\n });\n\n // Handle unclosed pod/ad break at end\n if (currentAdBreak) {\n if (currentPod) {\n currentPod.endTime = currentTime;\n if (currentPod.duration > MIN_AD_DURATION) {\n currentAdBreak.pods.push(currentPod);\n }\n }\n currentAdBreak.endTime = currentTime;\n if (currentAdBreak.duration > MIN_AD_DURATION) {\n adBreaks.push(currentAdBreak);\n }\n }\n\n return adBreaks;\n}\n\n/**\n * Enriches ad schedule with tracking API metadata\n */\nexport function enrichAdScheduleWithTrackingMetadata(adSchedule, trackingAvails) {\n const scheduleMap = new Map();\n\n // Build map of existing ads\n adSchedule.forEach((ad) => {\n const key = Math.round(ad.startTime);\n scheduleMap.set(key, ad);\n });\n\n // Process each avail from tracking API\n const newAds = [];\n trackingAvails.forEach((avail) => {\n const firstAd = avail.ads && avail.ads.length > 0 ? avail.ads[0] : null;\n if (!firstAd) return;\n\n const key = Math.round(firstAd.startTimeInSeconds);\n const existingAd = scheduleMap.get(key);\n\n if (existingAd) {\n // Enrich existing ad with tracking metadata\n existingAd.id = avail.availId;\n existingAd.creativeId = firstAd.adId;\n existingAd.title = firstAd.adTitle;\n existingAd.confirmedByTracking = true;\n\n // Enrich pods with tracking ad metadata\n if (avail.ads && avail.ads.length > 0 && existingAd.pods) {\n avail.ads.forEach((trackingAd, adIndex) => {\n if (existingAd.pods[adIndex]) {\n // Update existing pod\n existingAd.pods[adIndex].title = trackingAd.adTitle;\n existingAd.pods[adIndex].creativeId = trackingAd.adId;\n existingAd.pods[adIndex].trackingStartTime = trackingAd.startTimeInSeconds;\n existingAd.pods[adIndex].trackingDuration = trackingAd.durationInSeconds;\n } else {\n // Add new pod from tracking\n existingAd.pods.push({\n startTime: trackingAd.startTimeInSeconds,\n duration: trackingAd.durationInSeconds,\n endTime: trackingAd.startTimeInSeconds + trackingAd.durationInSeconds,\n title: trackingAd.adTitle,\n creativeId: trackingAd.adId,\n hasFiredStart: false,\n hasFiredQ1: false,\n hasFiredQ2: false,\n hasFiredQ3: false,\n });\n }\n });\n }\n } else {\n // Add new ad from tracking\n newAds.push({\n id: avail.availId,\n startTime: firstAd.startTimeInSeconds,\n duration: avail.durationInSeconds,\n endTime: firstAd.startTimeInSeconds + avail.durationInSeconds,\n title: firstAd.adTitle,\n creativeId: firstAd.adId,\n source: 'tracking-api',\n confirmedByTracking: true,\n hasFiredStart: false,\n hasFiredEnd: false,\n hasFiredAdStart: false,\n hasFiredQ1: false,\n hasFiredQ2: false,\n hasFiredQ3: false,\n pods: avail.ads.map((ad) => ({\n startTime: ad.startTimeInSeconds,\n duration: ad.durationInSeconds,\n endTime: ad.startTimeInSeconds + ad.durationInSeconds,\n title: ad.adTitle,\n creativeId: ad.adId,\n hasFiredStart: false,\n hasFiredQ1: false,\n hasFiredQ2: false,\n hasFiredQ3: false,\n })),\n });\n }\n });\n\n return newAds;\n}\n\n/**\n * Extracts the HLS live target duration from manifest text.\n * In HLS, EXT-X-TARGETDURATION is the closest manifest-level hint for refresh cadence.\n */\nexport function extractHlsTargetDurationSeconds(manifestText) {\n const match = manifestText.match(REGEX_HLS_TARGET_DURATION);\n return match ? parseInt(match[1], 10) : null;\n}\n\n/**\n * Extracts the DASH live minimumUpdatePeriod from MPD manifest text.\n * In DASH, minimumUpdatePeriod is the MPD's refresh hint for clients polling a live manifest.\n */\nexport function extractDashMinimumUpdatePeriodSeconds(manifestText) {\n const match = manifestText.match(REGEX_DASH_MINIMUM_UPDATE_PERIOD);\n return match ? parseIsoDuration(match[1]) : null;\n}\n\nasync function fetchTextOrThrow(url) {\n const response = await fetch(url, { credentials: 'include' });\n\n if (response.ok === false) {\n throw new Error(\n `Manifest request failed: ${response.status || 'unknown'} ${\n response.statusText || 'Request failed'\n }`\n );\n }\n\n return await response.text();\n}\n\n/**\n * Fetches HLS master manifest and returns master text + first media playlist URL\n */\nexport async function fetchHlsMasterManifest(manifestUrl) {\n const masterText = await fetchTextOrThrow(manifestUrl);\n\n // Find first media playlist URL\n const lines = masterText.split('\\n');\n let mediaPlaylistUrl = null;\n\n for (const line of lines) {\n if (!line.startsWith(HLS_TAG_PREFIX) && line.includes(HLS_MANIFEST_EXTENSION)) {\n mediaPlaylistUrl = new URL(line.trim(), manifestUrl).href;\n break;\n }\n }\n\n return { masterText, mediaPlaylistUrl };\n}\n\n/**\n * Fetches HLS media playlist and returns text\n */\nexport async function fetchHlsMediaPlaylist(playlistUrl) {\n return await fetchTextOrThrow(playlistUrl);\n}\n\n/**\n * Fetches DASH MPD manifest and returns XML text\n */\nexport async function fetchDashManifest(manifestUrl) {\n return await fetchTextOrThrow(manifestUrl);\n}\n\n/**\n * Parses ISO 8601 duration string to seconds\n * e.g. \"PT1M14S\" → 74, \"PT10S\" → 10, \"PT12M54S\" → 774\n */\nexport function parseIsoDuration(durationStr) {\n if (!durationStr) return 0;\n const match = durationStr.match(REGEX_ISO_8601_DURATION);\n if (!match) return 0;\n const hours = parseFloat(match[1] || 0);\n const minutes = parseFloat(match[2] || 0);\n const seconds = parseFloat(match[3] || 0);\n return hours * 3600 + minutes * 60 + seconds;\n}\n\n/**\n * Parses DASH MPD for ad breaks — supports both MULTI_PERIOD and SINGLE_PERIOD formats.\n *\n * MULTI_PERIOD (MediaTailor default): ad breaks are separate <Period> elements\n * whose <BaseURL> points to segments.mediatailor.amazonaws.com.\n *\n * SINGLE_PERIOD: the entire stream is one period; ads are signalled via\n * SCTE-35 <EventStream> elements inside that period.\n */\nexport function parseDashManifestForAdBreaks(xmlText, { adSegmentPrefix } = {}) {\n const parser = new DOMParser();\n const xml = parser.parseFromString(xmlText, 'text/xml');\n const ads = [];\n\n const parserError = xml.querySelector('parsererror');\n if (parserError) {\n Log.error('[MT] DASH XML parse error:', parserError.textContent);\n return ads;\n }\n\n const periods = xml.querySelectorAll('Period');\n Log.debug(`[MT] Found ${periods.length} Period(s) in DASH manifest`);\n\n if (periods.length > 1) {\n // ── MULTI_PERIOD ──────────────────────────────────────────────────────────\n // Ad periods are identified by a BaseURL pointing to the MediaTailor CDN.\n periods.forEach((period) => {\n const baseUrlEl = period.querySelector('BaseURL');\n const baseUrl = baseUrlEl ? baseUrlEl.textContent.trim() : '';\n\n const adCandidates = [MT_SEGMENT_PATTERN, MT_DEFAULT_AD_SEGMENT_PATH];\n if (adSegmentPrefix) adCandidates.push(adSegmentPrefix);\n if (!adCandidates.some((m) => baseUrl.includes(m))) {\n return; // content period\n }\n\n const periodId = period.getAttribute('id') || '';\n const startTime = parseIsoDuration(period.getAttribute('start') || 'PT0S');\n const duration = parseIsoDuration(period.getAttribute('duration') || '');\n\n if (duration < MIN_AD_DURATION) {\n Log.debug(`[MT] Skipping period ${periodId} - duration too short (${duration}s)`);\n return;\n }\n\n Log.debug(`[MT] Ad period detected: ${periodId}`, { startTime, duration });\n\n ads.push({\n id: periodId,\n startTime,\n duration,\n endTime: startTime + duration,\n source: AD_SOURCE.MANIFEST_CUE,\n confirmedByTracking: false,\n hasFiredStart: false,\n hasFiredEnd: false,\n hasFiredAdStart: false,\n hasFiredQ1: false,\n hasFiredQ2: false,\n hasFiredQ3: false,\n pods: [],\n });\n });\n } else {\n // ── SINGLE_PERIOD ─────────────────────────────────────────────────────────\n // Ads are signalled via SCTE-35 EventStream elements within the single period.\n const eventStreams = xml.querySelectorAll(\n DASH_SCTE35_EVENT_STREAM_SELECTOR,\n );\n\n Log.debug(`[MT] Found ${eventStreams.length} SCTE-35 EventStream(s) in single-period manifest`);\n\n eventStreams.forEach((stream) => {\n const timescale = parseFloat(stream.getAttribute('timescale') || '1');\n\n stream.querySelectorAll('Event').forEach((event) => {\n const presentationTime = parseFloat(event.getAttribute('presentationTime') || 0);\n const duration = parseFloat(event.getAttribute('duration') || 0);\n const eventId =\n event.getAttribute('id') ||\n `${SCTE35_SCHEME_MARKER}-${presentationTime}`;\n\n const startTime = timescale !== 1 ? presentationTime / timescale : presentationTime;\n const durationSeconds = timescale !== 1 ? duration / timescale : duration;\n\n if (durationSeconds < MIN_AD_DURATION) {\n Log.debug(`[MT] Skipping event ${eventId} - duration too short (${durationSeconds}s)`);\n return;\n }\n\n Log.debug(`[MT] SCTE-35 event detected: ${eventId}`, { startTime, durationSeconds });\n\n ads.push({\n id: eventId,\n startTime,\n duration: durationSeconds,\n endTime: startTime + durationSeconds,\n source: AD_SOURCE.MANIFEST_CUE,\n confirmedByTracking: false,\n hasFiredStart: false,\n hasFiredEnd: false,\n hasFiredAdStart: false,\n hasFiredQ1: false,\n hasFiredQ2: false,\n hasFiredQ3: false,\n pods: [],\n });\n });\n });\n }\n\n Log.debug(`[MT] Parsed ${ads.length} valid ad break(s) from DASH manifest`);\n return ads;\n}\n\n/**\n * Fetches tracking metadata from AWS MediaTailor Tracking API\n * @param {string} trackingEndpointUrl - The tracking API URL\n * @param {number} timeout - Timeout in milliseconds\n * @param {AbortSignal} externalSignal - Optional external abort signal for cancellation\n */\nexport async function getTrackingMetadata(trackingEndpointUrl, timeout = 8000, externalSignal = null) {\n // Create AbortController for timeout support\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n // If external signal provided, listen for its abort event\n const abortHandler = () => controller.abort();\n if (externalSignal) {\n externalSignal.addEventListener('abort', abortHandler);\n }\n\n try {\n const response = await fetch(`${trackingEndpointUrl}?t=${Date.now()}`, {\n signal: controller.signal,\n credentials: 'include',\n });\n\n clearTimeout(timeoutId);\n if (externalSignal) {\n externalSignal.removeEventListener('abort', abortHandler);\n }\n\n if (!response.ok) {\n throw new Error(`Tracking API error: ${response.status}`);\n }\n\n return await response.json();\n } catch (error) {\n clearTimeout(timeoutId);\n if (externalSignal) {\n externalSignal.removeEventListener('abort', abortHandler);\n }\n throw error;\n }\n}\n\n/**\n * Extracts first media playlist URL from HLS master manifest text\n */\nexport function extractMediaPlaylistUrl(masterText, baseUrl) {\n const lines = masterText.split('\\n');\n\n for (const line of lines) {\n if (\n !line.startsWith(HLS_TAG_PREFIX) &&\n line.includes(HLS_MANIFEST_EXTENSION)\n ) {\n return new URL(line.trim(), baseUrl).href;\n }\n }\n\n return null;\n}\n","import nrvideo from '@newrelic/video-core'\nimport pkg from '../../package.json'\nimport ContribHlsTech from '../techs/contrib-hls';\nimport HlsJsTech from '../techs/hls-js';\nimport ShakaTech from '../techs/shaka';\n\nexport default class VideojsAdsTracker extends nrvideo.VideoTracker {\n\n getTech() {\n const tech = this.player.tech({ IWillNotUseThisInPlugins: true });\n \n if (tech) {\n if (ContribHlsTech.isUsing(tech)) {\n return new ContribHlsTech(tech);\n } else if (HlsJsTech.isUsing(tech)) {\n return new HlsJsTech(tech);\n } else if (ShakaTech.isUsing(tech)) {\n return new ShakaTech(tech);\n }\n }\n }\n \n getTrackerName () {\n return 'videojs-ads'\n }\n\n getTrackerVersion () {\n return pkg.version\n }\n\n isMuted () {\n return this.player.muted()\n }\n\n getRenditionHeight () {\n return null\n }\n\n getRenditionWidth () {\n return null\n }\n\n getPlayerName () {\n return 'videojs-ads'\n }\n\n getPlayerVersion () {\n return this.player.ads.VERSION\n }\n\n registerListeners () {\n nrvideo.Log.debugCommonVideoEvents(this.player, [\n null,\n 'ads-request',\n 'ads-load',\n 'adstart',\n 'adend',\n 'adskip',\n 'adserror',\n 'ads-click',\n 'ads-pod-started',\n 'ads-pod-ended',\n 'ads-first-quartile',\n 'ads-midpoint',\n 'ads-third-quartile',\n 'ads-pause',\n 'ads-play',\n 'adtimeout'\n ])\n\n // Register listeners\n this.player.on('ads-request', this.onAdrequest.bind(this))\n this.player.on('ads-load', this.onAdload.bind(this))\n this.player.on('adstart', this.onAdstart.bind(this))\n this.player.on('adend', this.onAdend.bind(this))\n this.player.on('adskip', this.onAdskip.bind(this))\n this.player.on('adserror', this.onAdserror.bind(this))\n this.player.on('ads-click', this.onAdsClick.bind(this))\n this.player.on('ads-pod-started', this.onPodStart.bind(this))\n this.player.on('ads-pod-ended', this.onPodEnd.bind(this))\n this.player.on('ads-first-quartile', this.onFirstQuartile.bind(this))\n this.player.on('ads-midpoint', this.onMidpoint.bind(this))\n this.player.on('ads-third-quartile', this.onThirdQuartile.bind(this))\n this.player.on('ads-pause', this.onAdspause.bind(this))\n this.player.on('ads-play', this.onAdsplay.bind(this))\n }\n\n unregisterListeners () {\n // unregister listeners\n this.player.off('ads-request', this.onAdrequest)\n this.player.off('ads-load', this.onAdload)\n this.player.off('adstart', this.onAdstart)\n this.player.off('adend', this.onAdend)\n this.player.off('adskip', this.onAdskip)\n this.player.off('adserror', this.onAdserror)\n this.player.off('ads-click', this.onAdsClick)\n this.player.off('ads-pod-started', this.onPodStart)\n this.player.off('ads-pod-ended', this.onPodEnd)\n this.player.off('ads-first-quartile', this.onFirstQuartile)\n this.player.off('ads-midpoint', this.onMidpoint)\n this.player.off('ads-third-quartile', this.onThirdQuartile)\n this.player.off('ads-pause', this.onAdspause)\n this.player.off('ads-play', this.onAdsplay)\n }\n\n onAdrequest (e) {\n this.sendRequest()\n this.sendDownload({ state: 'ads-request' })\n }\n\n onAdload (e) {\n this.sendDownload({ state: 'ads-load' })\n }\n\n onAdstart (e) {\n this.sendRequest()\n this.sendStart()\n }\n\n onAdend (e) {\n this.sendEnd()\n }\n\n onAdskip (e) {\n this.sendEnd({ skipped: true })\n }\n\n onAdserror (e) {\n this.sendError()\n }\n\n onAdsClick (e) {\n this.sendAdClick({ url: 'unknown' })\n }\n\n onPodStart (e) {\n this.sendAdBreakStart()\n }\n\n onPodEnd (e) {\n this.sendAdBreakEnd()\n }\n\n onFirstQuartile () {\n this.sendAdQuartile({ quartile: 1 })\n }\n\n onMidpoint () {\n this.sendAdQuartile({ quartile: 2 })\n }\n\n onThirdQuartile () {\n this.sendAdQuartile({ quartile: 3 })\n }\n\n onAdspause () {\n this.sendPause()\n }\n\n onAdsplay () {\n this.sendResume()\n }\n}\n","export default class ContribHlsTech {\n constructor(tech) {\n this.tech = tech.vhs;\n this.player = tech.el().player; // Store player reference for playback bitrate calculation\n }\n\n getRenditionName() {\n try {\n var media = this.tech.playlists.media();\n if (media && media.attributes) return media.attributes.NAME;\n } catch (err) {}\n return null;\n }\n\n getRenditionBitrate() {\n try {\n var media = this.tech.playlists.media();\n if (media && media.attributes) return Math.round(media.attributes.BANDWIDTH);\n } catch (err) {}\n return null;\n }\n\n getRenditionWidth() {\n try {\n var media = this.tech.playlists.media();\n if (media && media.attributes && media.attributes.RESOLUTION) {\n return media.attributes.RESOLUTION.width;\n }\n } catch (err) {}\n return null;\n }\n\n getRenditionHeight() {\n try {\n var media = this.tech.playlists.media();\n if (media && media.attributes && media.attributes.RESOLUTION) {\n return media.attributes.RESOLUTION.height;\n }\n } catch (err) {}\n return null;\n }\n\n getBitrate() {\n // Calculate playback bitrate (actual content consumption rate)\n return this.getContentBitratePlayback();\n }\n\n getManifestBitrate() {\n try {\n // Return highest available bitrate from all renditions\n const playlists = this.tech.playlists.master.playlists;\n if (playlists && playlists.length > 0) {\n return Math.round(Math.max(...playlists.map((p) => p.attributes.BANDWIDTH)));\n }\n } catch (err) {}\n return null;\n }\n\n getSegmentDownloadBitrate() {\n if (\n this.tech.stats?.bandwidth !== undefined &&\n this.tech.stats.bandwidth > 0\n ) {\n return Math.round(this.tech.stats.bandwidth);\n }\n return null;\n }\n\n getNetworkDownloadBitrate() {\n if (this.tech.throughput !== undefined && this.tech.throughput > 0) {\n return Math.round(this.tech.throughput);\n }\n return null;\n }\n\n getContentBitratePlayback() {\n try {\n // Get the current active rendition's bitrate from manifest\n const media = this.tech.playlists.media();\n if (media && media.attributes) {\n // Use AVERAGE-BANDWIDTH if available, fallback to BANDWIDTH\n const bitrate = media.attributes['AVERAGE-BANDWIDTH'] ||\n media.attributes.BANDWIDTH ||\n null;\n return bitrate !== null ? Math.round(bitrate) : null;\n }\n } catch (err) {}\n return null;\n }\n}\n\nContribHlsTech.isUsing = function (tech) {\n return !!tech.vhs;\n};\n","export default class HlsJs {\n constructor(tech) {\n this.tech = tech.vhs_;\n this.player = tech.el().player; // Store player reference for currentTime\n }\n\n getResource(tech) {\n return this.tech.url;\n }\n\n getRenditionName(tech) {\n try {\n var level = this.tech.levels[this.tech.currentLevel];\n if (level && level.name) return level.name;\n } catch (err) {}\n return null;\n }\n\n getRenditionBitrate(tech) {\n try {\n var level = this.tech.levels[this.tech.currentLevel];\n if (level && level.bitrate) return Math.round(level.bitrate);\n } catch (err) {}\n return null;\n }\n\n getRenditionWidth(tech) {\n try {\n var level = this.tech.levels[this.tech.currentLevel];\n if (level && level.width) return level.width;\n } catch (err) {}\n return null;\n }\n\n getRenditionHeight(tech) {\n try {\n var level = this.tech.levels[this.tech.currentLevel];\n if (level && level.height) return level.height;\n } catch (err) {}\n return null;\n }\n\n getBitrate() {\n // Default uses playback bitrate (Method 4)\n return this.getContentBitratePlayback();\n }\n\n getContentBitratePlayback() {\n try {\n // Get the current active level's bitrate from manifest\n const level = this.tech.levels[this.tech.currentLevel];\n if (level && level.bitrate) {\n return Math.round(level.bitrate);\n }\n } catch (err) {}\n return null;\n }\n\n getManifestBitrate() {\n try {\n // Return highest available bitrate from all renditions\n if (this.tech.levels && this.tech.levels.length > 0) {\n return Math.round(Math.max(...this.tech.levels.map(l => l.bitrate)));\n }\n } catch (err) {}\n return null;\n }\n\n getSegmentDownloadBitrate() {\n try {\n // VHS stats.bandwidth\n if (this.tech.stats && this.tech.stats.bandwidth > 0)\n return Math.round(this.tech.stats.bandwidth);\n } catch (err) {}\n return null;\n }\n\n getNetworkDownloadBitrate() {\n if (this.tech.throughput && this.tech.throughput > 0) {\n return Math.round(this.tech.throughput);\n }\n return null;\n }\n}\n\nHlsJs.isUsing = function (tech) {\n return !!tech.vhs_;\n};\n","export default class ShakaTech {\n constructor(tech) {\n this.tech = tech.shakaPlayer;\n this.player = tech.el().player; // Store player reference for playback bitrate calculation\n }\n\n getSrc(tech) {\n try {\n return this.tech.getManifestUri();\n } catch (err) {}\n return null;\n }\n\n getRenditionBitrate(tech) {\n try {\n const bitrate = this.tech.getStats().streamBandwidth;\n return bitrate ? Math.round(bitrate) : null;\n } catch (err) {}\n return null;\n }\n\n getManifestBitrate() {\n try {\n // Return highest available bitrate from all variants\n const tracks = this.tech.getVariantTracks();\n if (tracks && tracks.length > 0) {\n return Math.round(Math.max(\n ...tracks.map((t) => t.videoBandwidth + (t.audioBandwidth || 0)),\n ));\n }\n } catch (err) {}\n return null;\n }\n\n getRenditionWidth(tech) {\n try {\n var tracks = this.tech.getVariantTracks();\n for (var i in tracks) {\n var track = tracks[i];\n if (track.active && track.type === 'video') {\n return track.width;\n }\n }\n } catch (err) {}\n return null;\n }\n\n getRenditionHeight(tech) {\n try {\n var tracks = this.tech.getVariantTracks();\n for (var i in tracks) {\n var track = tracks[i];\n if (track.active && track.type === 'video') {\n return track.height;\n }\n }\n } catch (err) {}\n return null;\n }\n\n getBitrate() {\n // Calculate playback bitrate (actual content consumption rate)\n return this.getContentBitratePlayback();\n }\n\n getContentBitratePlayback() {\n try {\n // Get the current variant's bitrate from manifest (streamBandwidth)\n var stats = this.tech.getStats();\n if (stats && stats.streamBandwidth && stats.streamBandwidth > 0) {\n return Math.round(stats.streamBandwidth);\n }\n } catch (err) {}\n return null;\n }\n\n getSegmentDownloadBitrate() {\n try {\n // Use estimatedBandwidth for measured bitrate\n var stats = this.tech.getStats();\n if (stats && stats.estimatedBandwidth > 0) {\n return Math.round(stats.estimatedBandwidth);\n }\n } catch (err) {}\n return null;\n }\n\n getNetworkDownloadBitrate() {\n try {\n // Shaka: use estimatedBandwidth for download bitrate (no separate property)\n var stats = this.tech.getStats();\n if (stats && stats.estimatedBandwidth > 0) {\n return Math.round(stats.estimatedBandwidth);\n }\n } catch (err) {}\n return null;\n }\n}\n\nShakaTech.isUsing = function (tech) {\n return !!tech.shakaPlayer;\n};\n","import nrvideo from '@newrelic/video-core';\nimport pkg from '../package.json';\nimport ContribHlsTech from './techs/contrib-hls';\nimport HlsJsTech from './techs/hls-js';\nimport ShakaTech from './techs/shaka';\nimport VideojsAdsTracker from './ads/videojs-ads';\nimport ImaAdsTracker from './ads/ima';\nimport BrightcoveImaAdsTracker from './ads/brightcove-ima';\nimport FreewheelAdsTracker from './ads/freewheel';\nimport DaiAdsTracker from './ads/dai';\nimport MediaTailorAdsTracker from './ads/media-tailor';\n\n/**\n * Explicit ad tracking modes. Pass via config.ad.type.\n *\n * CSAI (Client-Side Ad Insertion)\n * All CSAI frameworks share the adsready event path. The tracker auto-detects\n * the right framework (Brightcove IMA → IMA → Freewheel → generic) — no sub-type needed.\n *\n * SSAI (Server-Side Ad Insertion) — sub-type is always required.\n * Each SSAI platform has its own SDK and a different activation path.\n * Cannot be auto-detected — declare which one you are using.\n * SSAI.DAI — Google DAI (google.ima.dai.api)\n * SSAI.MT — AWS MediaTailor\n *\n * If config.ad is not set, no ad tracking runs (safe default).\n * To add a new SSAI platform: add a key to SSAI — validation derives from this object.\n */\nexport const AD_TRACKING = {\n CSAI: 'csai',\n SSAI: Object.freeze({\n DAI: 'ssai:dai',\n MT: 'ssai:mt',\n }),\n};\n\nexport default class VideojsTracker extends nrvideo.VideoTracker {\n constructor(player, options) {\n super(player, options);\n this.options = options;\n this.isContentEnd = false;\n this.imaAdCuePoints = '';\n this.daiInitialized = false;\n this.adTracking = options?.config?.ad?.type || null;\n this.previousBitrate = null;\n\n // When options are provided but config.ad is not declared, no ad tracking\n // will run. Warn so the caller knows to set it explicitly.\n if (options && !this.adTracking) {\n nrvideo.Log.warn(\n 'VideojsTracker: config.ad not set — no ad tracking will run. ' +\n 'Set config.ad.type to enable it (e.g. AD_TRACKING.CSAI, AD_TRACKING.SSAI.MT).',\n );\n }\n\n // Merge config.ad options (segmentPrefix, trackingUrl) into the internal\n // mediatailor object that MediaTailorAdsTracker reads.\n if (this.adTracking === AD_TRACKING.SSAI.MT) {\n const adConfig = options?.config?.ad || {};\n this.options = Object.assign({}, this.options, {\n mediatailor: {\n segmentPrefix: adConfig.segmentPrefix,\n trackingUrl: adConfig.trackingUrl,\n ...this.options?.mediatailor,\n },\n });\n }\n\n nrvideo.Core.addTracker(this, options);\n }\n\n /**\n * Sets the ad tracking mode at runtime.\n * Must be called before the first loadstart / adsready event to take effect.\n * @param {'csai'|'ssai:dai'|'ssai:mt'} type\n */\n setAdTracking(type) {\n const valid = [AD_TRACKING.CSAI, ...Object.values(AD_TRACKING.SSAI)];\n if (!valid.includes(type)) {\n nrvideo.Log.warn(\n `VideojsTracker.setAdTracking: unknown value \"${type}\". Valid values: ${valid.join(', ')}`,\n );\n return;\n }\n this.adTracking = type;\n nrvideo.Log.debug(`VideojsTracker: adTracking set to \"${type}\"`);\n }\n\n getTech() {\n let tech = this.player.tech({ IWillNotUseThisInPlugins: true });\n\n if (tech) {\n if (ContribHlsTech.isUsing(tech)) {\n return new ContribHlsTech(tech);\n } else if (HlsJsTech.isUsing(tech)) {\n return new HlsJsTech(tech);\n } else if (ShakaTech.isUsing(tech)) {\n return new ShakaTech(tech);\n }\n }\n }\n\n getTrackerName() {\n return 'videojs';\n }\n\n getInstrumentationProvider() {\n return 'New Relic';\n }\n\n getInstrumentationName() {\n return this.getPlayerName();\n }\n\n getInstrumentationVersion() {\n return this.getPlayerVersion();\n }\n\n getTrackerVersion() {\n return pkg.version;\n }\n\n getPlayhead() {\n if (\n this.player.ads &&\n this.player.ads.state === 'ads-playback' &&\n this.player.ads.snapshot &&\n this.player.ads.snapshot.currentTime\n ) {\n return this.player.ads.snapshot.currentTime * 1000;\n } else if (this.player.absoluteTime) {\n return this.player.absoluteTime() * 1000;\n } else {\n return this.player.currentTime() * 1000;\n }\n }\n\n getDuration() {\n if (\n this.player.mediainfo &&\n typeof this.player.mediainfo.duration !== 'undefined'\n ) {\n return this.player.mediainfo.duration * 1000; // Brightcove\n } else {\n return this.player.duration() * 1000;\n }\n }\n\n getTitle() {\n return this.player?.mediainfo?.name; // Brightcove\n }\n\n getId() {\n return this.player?.mediainfo?.id; // Brightcove\n }\n\n getLanguage() {\n return this.player?.language();\n }\n\n getSrc() {\n let tech = this.getTech();\n if (tech && tech.getSrc) {\n return tech.getSrc();\n } else {\n return this.player.currentSrc();\n }\n }\n\n getPlayerName() {\n return this.player?.name() || 'videojs';\n }\n\n getPlayerVersion() {\n return this.player?.version || videojs.VERSION;\n }\n\n isMuted() {\n return this.player.muted();\n }\n\n getBitrate() {\n return this.getContentBitratePlayback();\n }\n\n // Measures: Actual content consumption rate during playback\n getContentBitratePlayback() {\n try {\n const tech = this.player.tech({ IWillNotUseThisInPlugins: true });\n\n // 1. Get the current active rendition (The most accurate \"Playback Bitrate\")\n if (tech?.vhs?.playlists?.media()) {\n const activePlaylist = tech.vhs.playlists.media();\n // Use AVERAGE-BANDWIDTH if available, fallback to BANDWIDTH\n const bitrate =\n activePlaylist.attributes['AVERAGE-BANDWIDTH'] ||\n activePlaylist.attributes.BANDWIDTH ||\n null;\n return bitrate !== null ? Math.round(bitrate) : null;\n }\n\n // 2. Fallback to tech wrappers (Shaka/Hls.js) if they have a getBitrate method\n const techWrapper = this.getTech();\n if (techWrapper?.getBitrate) {\n const bitrate = techWrapper.getBitrate();\n return bitrate !== null ? Math.round(bitrate) : null;\n }\n } catch (err) {\n /* ignore */\n }\n return null;\n }\n\n getRenditionName() {\n let tech = this.getTech();\n if (tech && tech.getRenditionName) {\n return tech.getRenditionName();\n }\n }\n\n getManifestBitrate() {\n try {\n const tech = this.player.tech({ IWillNotUseThisInPlugins: true });\n // tech.vhs.playlists.master.playlists contains the array of all renditions\n const allRenditions = tech?.vhs?.playlists?.master?.playlists;\n\n if (allRenditions && allRenditions.length > 0) {\n // Find the highest BANDWIDTH value in the list\n const maxBitrate = Math.max(\n ...allRenditions.map((p) => p.attributes.BANDWIDTH || 0),\n );\n return maxBitrate > 0 ? Math.round(maxBitrate) : null;\n }\n\n // Fallback to tech wrappers (Shaka/Hls.js)\n const techWrapper = this.getTech();\n if (techWrapper?.getManifestBitrate) {\n const bitrate = techWrapper.getManifestBitrate();\n return bitrate !== null ? Math.round(bitrate) : null;\n }\n } catch (e) {\n /* ignore */\n }\n return null;\n }\n\n getSegmentDownloadBitrate() {\n try {\n const tech = this.player.tech({ IWillNotUseThisInPlugins: true });\n\n // VHS stats.bandwidth\n if (tech?.vhs?.stats?.bandwidth && tech.vhs.stats.bandwidth > 0) {\n return Math.round(tech.vhs.stats.bandwidth);\n }\n\n // Fallback to tech wrappers (Shaka/Hls.js)\n const techWrapper = this.getTech();\n if (techWrapper?.getSegmentDownloadBitrate) {\n const bitrate = techWrapper.getSegmentDownloadBitrate();\n return bitrate !== null ? Math.round(bitrate) : null;\n }\n } catch (err) {\n /* ignore */\n }\n return null;\n }\n\n getNetworkDownloadBitrate() {\n const tech = this.player.tech({ IWillNotUseThisInPlugins: true });\n\n if (tech?.vhs?.throughput && tech.vhs.throughput > 0) {\n return Math.round(tech.vhs.throughput);\n }\n\n // Fallback to tech wrapper implementation\n const techWrapper = this.getTech();\n if (techWrapper?.getNetworkDownloadBitrate) {\n const bitrate = techWrapper.getNetworkDownloadBitrate();\n return bitrate !== null ? Math.round(bitrate) : null;\n }\n\n return null;\n }\n\n getRenditionHeight() {\n let tech = this.getTech();\n\n if (tech && tech.getRenditionHeight) {\n return tech.getRenditionHeight();\n }\n return this.player.videoHeight();\n }\n\n getRenditionWidth() {\n let tech = this.getTech();\n if (tech && tech.getRenditionWidth) {\n return tech.getRenditionWidth();\n }\n return this.player.videoWidth();\n }\n\n getPlayrate() {\n return this.player.playbackRate();\n }\n\n isAutoplayed() {\n return this.player.autoplay();\n }\n\n isFullscreen() {\n return this.player.isFullscreen();\n }\n\n getPreload() {\n return this.player.preload();\n }\n\n registerListeners() {\n nrvideo.Log.debugCommonVideoEvents(this.player, [\n 'adstart',\n 'adend',\n 'adskip',\n 'adsready',\n 'adserror',\n 'dispose',\n ]);\n\n // BIND LISTENER METHODS\n this.onDownload = this.onDownload.bind(this);\n this.onAdsready = this.onAdsready.bind(this);\n this.onAdStart = this.onAdStart.bind(this);\n this.onAdEnd = this.onAdEnd.bind(this);\n this.onPlay = this.onPlay.bind(this);\n this.onPause = this.onPause.bind(this);\n this.onPlaying = this.onPlaying.bind(this);\n this.onAbort = this.onAbort.bind(this);\n this.onEnded = this.onEnded.bind(this);\n this.onDispose = this.onDispose.bind(this);\n this.onSeeking = this.onSeeking.bind(this);\n this.onSeeked = this.onSeeked.bind(this);\n this.onError = this.onError.bind(this);\n this.onWaiting = this.onWaiting.bind(this);\n this.onTimeupdate = this.onTimeupdate.bind(this);\n this.OnAdsAllpodsCompleted = this.OnAdsAllpodsCompleted.bind(this);\n this.onStreamManager = this.onStreamManager.bind(this);\n this.onCanPlayThrough = this.onCanPlayThrough.bind(this);\n\n this.player.on('loadstart', this.onDownload);\n this.player.on('loadeddata', this.onDownload);\n this.player.on('loadedmetadata', this.onDownload);\n this.player.on('adsready', this.onAdsready);\n this.player.on('adstart', this.onAdStart);\n this.player.on('adend', this.onAdEnd);\n this.player.on('play', this.onPlay);\n this.player.on('pause', this.onPause);\n this.player.on('playing', this.onPlaying);\n this.player.on('abort', this.onAbort);\n this.player.on('ended', this.onEnded);\n this.player.on('dispose', this.onDispose);\n this.player.on('seeking', this.onSeeking);\n this.player.on('seeked', this.onSeeked);\n this.player.on('error', this.onError);\n this.player.on('waiting', this.onWaiting);\n this.player.on('timeupdate', this.onTimeupdate);\n this.player.on('ads-allpods-completed', this.OnAdsAllpodsCompleted);\n this.player.on('stream-manager', this.onStreamManager);\n this.player.on('canplaythrough', this.onCanPlayThrough);\n\n this.onQualityLevelChange = this.onQualityLevelChange.bind(this);\n // Get qualityLevels lazily after player is ready\n if (typeof this.player.qualityLevels === 'function') {\n this.qualityLevels = this.player.qualityLevels();\n if (this.qualityLevels) {\n this.qualityLevels.on('change', this.onQualityLevelChange);\n }\n }\n }\n\n unregisterListeners() {\n this.player.off('loadstart', this.onDownload);\n this.player.off('loadeddata', this.onDownload);\n this.player.off('loadedmetadata', this.onDownload);\n this.player.off('adsready', this.onAdsready);\n this.player.off('adstart', this.onAdStart);\n this.player.off('adend', this.onAdEnd);\n this.player.off('play', this.onPlay);\n this.player.off('pause', this.onPause);\n this.player.off('playing', this.onPlaying);\n this.player.off('abort', this.onAbort);\n this.player.off('ended', this.onEnded);\n this.player.off('dispose', this.onDispose);\n this.player.off('seeking', this.onSeeking);\n this.player.off('seeked', this.onSeeked);\n this.player.off('error', this.onError);\n this.player.off('waiting', this.onWaiting);\n this.player.off('timeupdate', this.onTimeupdate);\n this.player.off('ads-allpods-completed', this.OnAdsAllpodsCompleted);\n this.player.off('stream-manager', this.onStreamManager);\n this.player.off('canplaythrough', this.onCanPlayThrough);\n if (this.qualityLevels) {\n this.qualityLevels.off('change', this.onQualityLevelChange);\n }\n }\n\n onDownload(e) {\n this.sendDownload({ state: e.type });\n\n if (\n this.adTracking === AD_TRACKING.SSAI.MT &&\n !this.adsTracker &&\n e.type === 'loadstart'\n ) {\n nrvideo.Log.debug('VideojsTracker: Creating MediaTailorAdsTracker');\n this.setAdsTracker(new MediaTailorAdsTracker(this.player, this.options));\n // MediaTailor SSAI starts with content, not ads (unlike client-side frameworks)\n this.adsTracker.setIsAd(false);\n }\n }\n\n // DAI methods\n onStreamManager(event) {\n if (\n this.adTracking === AD_TRACKING.SSAI.DAI &&\n !this.adsTracker &&\n event.StreamManager\n ) {\n const daiTracker = new DaiAdsTracker(this.player);\n daiTracker.setStreamManager(event.StreamManager);\n this.setAdsTracker(daiTracker);\n }\n }\n // DAI methods end\n\n onAdsready() {\n // SSAI platforms never fire adsready — skip when an SSAI type is explicitly set.\n if (Object.values(AD_TRACKING.SSAI).includes(this.adTracking)) return;\n\n // config.ad.type is not set — warn and fall back to auto-detection.\n if (!this.adTracking) {\n nrvideo.Log.warn(\n 'VideojsTracker: adsready fired but config.ad.type is not set — ' +\n 'attempting CSAI auto-detection for backward compatibility.',\n );\n }\n\n if (!this.adsTracker) {\n if (BrightcoveImaAdsTracker.isUsing(this.player)) {\n nrvideo.Log.debug(\n 'VideojsTracker: auto-detected BrightcoveImaAdsTracker',\n );\n this.setAdsTracker(new BrightcoveImaAdsTracker(this.player));\n } else if (ImaAdsTracker.isUsing(this.player)) {\n nrvideo.Log.debug('VideojsTracker: auto-detected ImaAdsTracker');\n this.setAdsTracker(new ImaAdsTracker(this.player));\n } else if (FreewheelAdsTracker.isUsing(this.player)) {\n nrvideo.Log.debug('VideojsTracker: auto-detected FreewheelAdsTracker');\n this.setAdsTracker(new FreewheelAdsTracker(this.player));\n } else {\n nrvideo.Log.debug(\n 'VideojsTracker: no specific CSAI framework detected, using generic VideojsAdsTracker',\n );\n this.setAdsTracker(new VideojsAdsTracker(this.player));\n }\n }\n }\n\n onAdStart() {\n this.currentAdPlaying = true;\n\n /* get the array with all the cue points which will be played */\n if (!this.imaAdCuePoints) {\n this.imaAdCuePoints = this.player?.ima?.getAdsManager().getCuePoints();\n }\n }\n onAdEnd() {\n if (this.isContentEnd) {\n this.sendEnd();\n }\n }\n\n OnAdsAllpodsCompleted() {\n this.onEnded.bind(this);\n this.FreewheelAdsCompleted = true;\n }\n\n /**\n * Check if ads tracker is currently in ad mode\n * @returns {boolean} True if ads are playing\n */\n isAdsTrackerActive() {\n // For CSAI: videojs-contrib-ads manages ad state exclusively\n if (this.player.ads) {\n return this.player.ads.state === 'ads-playback';\n }\n // For SSAI (no player.ads): check tracker's isAd flag (manually toggled)\n return this.adsTracker && this.adsTracker.isAd && this.adsTracker.isAd();\n }\n\n onPlay() {\n this.sendRequest();\n }\n\n onPause() {\n // Don't send CONTENT_PAUSE if ads are playing (ads tracker handles it)\n if (this.isAdsTrackerActive()) {\n return;\n }\n // Don't send CONTENT_PAUSE if video has ended (CONTENT_END will be sent instead)\n if (this.player.ended()) {\n return;\n }\n this.sendPause();\n }\n\n onCanPlayThrough() {\n // Don't send CONTENT_BUFFER_END if ads are playing (ads tracker handles it)\n if (this.isAdsTrackerActive()) {\n return;\n }\n // Send BUFFER_END when buffer fills, even if paused\n // This ensures accurate buffer duration metrics when user pauses during buffering\n this.sendBufferEnd();\n }\n\n onPlaying() {\n // Don't send CONTENT_RESUME if ads are playing (ads tracker handles it)\n if (this.isAdsTrackerActive()) {\n return;\n }\n this.sendResume();\n this.sendBufferEnd();\n }\n\n onAbort() {\n this.sendEnd();\n }\n\n onEnded() {\n if (this.adsTracker) {\n this.isContentEnd = true;\n if (this.imaAdCuePoints && !this.imaAdCuePoints.includes(-1)) {\n this.sendEnd();\n }\n } else {\n this.sendEnd();\n }\n }\n\n onDispose() {\n this.sendEnd();\n }\n\n onSeeking() {\n // Don't send CONTENT_SEEK_START if ads are playing (ads tracker handles it)\n if (this.isAdsTrackerActive()) {\n return;\n }\n this.sendSeekStart();\n }\n\n onSeeked() {\n // Don't send CONTENT_SEEK_END if ads are playing (ads tracker handles it)\n if (this.isAdsTrackerActive()) {\n return;\n }\n this.sendSeekEnd();\n }\n\n onError() {\n const error = this.player.error();\n\n const errorCode = error.code;\n const errorMessage = error.message;\n if (this.player.error && this.player.error()) {\n this.sendError({ errorCode, errorMessage });\n }\n }\n\n onWaiting(e) {\n // Don't send CONTENT_BUFFER_START if ads are playing (ads tracker handles it)\n if (this.isAdsTrackerActive()) {\n return;\n }\n this.sendBufferStart();\n }\n\n onTimeupdate(e) {\n if (this.getPlayhead() > 0.1) {\n this.sendStart();\n }\n }\n\n onQualityLevelChange(e) {\n if (this.qualityLevels && this.qualityLevels.selectedIndex >= 0) {\n const selectedLevel =\n this.qualityLevels[this.qualityLevels.selectedIndex];\n if (selectedLevel) {\n const newBitrate = selectedLevel.bitrate;\n const oldBitrate = this.previousBitrate;\n\n this.sendRenditionChanged({\n oldBitrate,\n newBitrate,\n });\n\n this.previousBitrate = newBitrate;\n }\n }\n }\n}\n\n// Attach AD_TRACKING and Log as static properties so UMD callers can use\n// VideojsTracker.AD_TRACKING and VideojsTracker.Log without importing named exports.\nVideojsTracker.AD_TRACKING = AD_TRACKING;\nVideojsTracker.Log = nrvideo.Log;\n\n// Static members\nexport {\n HlsJsTech,\n ContribHlsTech,\n ShakaTech,\n VideojsAdsTracker,\n ImaAdsTracker,\n BrightcoveImaAdsTracker,\n FreewheelAdsTracker,\n DaiAdsTracker,\n MediaTailorAdsTracker,\n};\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import VideojsTracker from './tracker';\nexport default VideojsTracker;"],"names":["t","e","i","d","videoAnalyticsHarvester","h","s","r","a","n","o","constructor","this","isInitialized","harvestScheduler","eventBuffer","initialize","A","warn","startScheduler","notice","error","message","addEvent","actionName","Events","QOE_AGGREGATE","viewId","addOrReplaceByActionNameAndViewId","addOrReplaceByActionName","add","setHarvestInterval","updateHarvestInterval","forceNextQoeCycle","setBeforeDrainCallback","beforeDrainCallback","refreshQoeKpis","findByActionNameAndViewId","findByActionName","QOE_KPI_KEYS","reset","startTime","stopTime","accumulator","offset","getDeltaTime","Date","getTime","start","stop","getDuration","clone","AdPositions","PRE","MID","POST","COLLECTOR","US","EU","Staging","GOV","VALID_EVENT_TYPES","MAX_PAYLOAD_SIZE","MAX_BEACON_SIZE","MAX_EVENTS_PER_BATCH","INTERVAL","QOE_AGGREGATE_KEYS","on","_listeners","push","off","indexOf","splice","emit","Array","isArray","forEach","call","eventType","type","data","target","buffer","maxPayloadSize","maxEventsPerBatch","currentPayloadSize","totalEvents","smartHarvestPayloadThreshold","Math","floor","overflowPayloadThreshold","smartHarvestEventThreshold","overflowEventThreshold","onSmartHarvestTrigger","findIndex","find","Q3","makeRoom","checkSmartHarvestTrigger","round","setSmartHarvestCallback","drain","isEmpty","size","clear","length","shift","l","retryQueueHandler","u","httpClient","X","fallBackUrl","retryCount","triggerSmartHarvest","isStarted","currentTimerId","harvestCycle","isHarvesting","qoeCycleCount","_lastSentQoeKpis","setupPageLifecycleHandlers","eventBufferSize","scheduleNextHarvest","stopScheduler","clearTimeout","threshold","triggerHarvest","setTimeout","onHarvestInterval","getQueueSize","success","reason","drainEvents","isFinalHarvest","trimEventsToFit","sendChunk","totalChunks","results","handleHarvestFailure","consecutiveFailures","ins","unshift","slice","originalCount","trimmedCount","finalSize","maxSize","addFailedEvents","window","NRVIDEO","config","qoeIntervalFactor","_qoeKpisUnchanged","_saveQoeKpis","c","getRetryEventsToFit","url","c$","payload","body","options","isLastChunk","Promise","send","retry","handleRequestFailure","status","chunk","eventCount","info","region","isNaN","force","document","addEventListener","hidden","Levels","ERROR","WARNING","arguments","NOTICE","debug","DEBUG","debugCommonVideoEvents","level","concat","addEventHandler","prefix","includeTime","getDate","getMinutes","getSeconds","getMilliseconds","SILENT","colorful","documentMode","console","cast","log","apply","ALL","location","search","exec","Error","callback","executeRequest","now","JSON","stringify","obfuscate","reduce","regex","RegExp","flags","includes","source","replace","replacement","navigator","sendBeacon","sendWithBeacon","handleRequestComplete","fetchWithTimeout","method","headers","keepalive","ok","statusText","Sc","AbortController","abort","fetch","signal","name","retryQueue","maxQueueSize","maxQueueSizeBytes","queueSizeBefore","evictOldestEvent","discardEvent","super","customData","heartbeat","parentTracker","_trackerReadyChrono","_actionTable","ACTION_TABLE","_actionAdTable","ACTION_AD_TABLE","setOptions","dispose","unregisterListeners","registerListeners","getHeartbeat","state","_isAd","startHeartbeat","_heartbeatInterval","setInterval","sendHeartbeat","bind","max","stopHeartbeat","clearInterval","sendVideoAction","HEARTBEAT","getAttributes","trackerName","getTrackerName","trackerVersion","getTrackerVersion","coreVersion","rE","timeSinceTrackerReady","isBackgroundEvent","sendVideoAdAction","sendVideoErrorAction","isAd","sendVideoCustomAction","z8","beacon","licenseKey","applicationID","href","ArrayBuffer","byteLength","Blob","FormData","WeakSet","has","exports","Object","defineProperty","enumerable","get","prototype","hasOwnProperty","appName","qoe","timestamp","timeSinceLoad","performance","g","m","qoeAggregateVersion","f","qoeAggregate","setConfiguration","validateRequiredFields","validateConfigFields","initializeGlobalConfig","values","flatMap","keys","join","filterObfuscateRules","filter","sanitizeQoeIntervalFactor","Number","isInteger","addTracker","trackerInit","removeTracker","getTrackers","sendError","forceHarvest","E","_createdAt","_hb","_acc","_bufferAcc","_viewSession","_viewCount","numberOfErrors","numberOfAds","numberOfVideos","totalPlaytime","weightedAverageBitrate","totalAdPlaytime","isAdBreak","initialBufferingHappened","startupTime","peakBitrate","_lastBitrate","_lastBitrateChangeTimestamp","partialAverageBitrate","_totalBitrateDuration","hadStartupError","hadPlaybackError","totalRebufferingTime","resetFlags","resetChronos","isPlayerReady","isRequested","isPaused","isSeeking","isBuffering","isPlaying","timeSinceRequested","timeSinceStarted","timeSincePaused","timeSinceSeekBegin","timeSinceBufferBegin","timeSinceAdBreakStart","timeSinceLastDownload","timeSinceLastHeartbeat","timeSinceLastRenditionChange","timeSinceLastAdQuartile","timeSinceLastAd","timeSinceLastError","timeSinceLastAdError","timeSinceResumed","timeSinceSeekEnd","playtimeSinceLastEvent","customTimeSinceAttributes","elapsedTime","bufferElapsedTime","_totalAdPlaytime","setIsAd","setTimeSinceAttribute","removeTimeSinceAttribute","getViewSession","random","toString","substring","getViewId","getStateAttributes","timeSinceAdRequested","timeSinceLastAdHeartbeat","timeSinceAdStarted","timeSinceAdPaused","timeSinceAdBufferBegin","timeSinceAdSeekBegin","timeSinceAdBreakBegin","entries","getQoeAttributes","rebufferingRatio","averageBitrate","weightedBitrate","calculateBufferType","goViewCountUp","goPlayerReady","goRequest","goStart","goEnd","goPause","goResume","goBufferStart","goBufferEnd","goSeekStart","goSeekEnd","goAdBreakStart","goAdBreakEnd","goDownload","goHeartbeat","goRenditionChange","goAdQuartile","goError","isError","goLastAd","trackContentBitrateState","resetViewIdTrackedState","clearTotalAdsTime","totalAdTime","startAdsTime","stopAdsTime","setStartupTime","T","v","adsTracker","_lastBufferType","_userId","setPlayer","tag","setUserId","setAdsTracker","player","getElementById","disposeAdsTracker","S","getVideoId","getTitle","isLive","getBitrate","getManifestBitrate","getSegmentDownloadBitrate","getNetworkDownloadBitrate","getWebkitBitrate","webkitVideoDecodedByteCount","_lastWebkitBitrate","getRenditionName","getRenditionBitrate","getRenditionShift","_lastAdRendition","_lastRendition","getRenditionHeight","videoHeight","getRenditionWidth","videoWidth","duration","getPlayhead","currentTime","getLanguage","getSrc","currentSrc","getPlayrate","playbackRate","isMuted","muted","isFullscreen","getCdn","getPlayerName","getPlayerVersion","getFps","isAutoplayed","autoplay","getPreload","preload","getAdQuartile","getAdPosition","getAdPartner","getAdCreativeId","getInstrumentationProvider","getInstrumentationName","getInstrumentationVersion","viewSession","playerName","playerVersion","src","pageUrl","adId","adTitle","adSrc","adCdn","adBitrate","adRenditionName","adRenditionHeight","adRenditionWidth","adDuration","adPlayhead","adLanguage","adIsMuted","adFps","adPosition","adCreativeId","adPartner","contentId","contentTitle","contentSrc","contentCdn","contentPlayhead","contentIsLive","contentBitrate","contentManifestBitrate","contentSegmentDownloadBitrate","contentNetworkDownloadBitrate","contentRenditionName","contentRenditionHeight","contentRenditionWidth","contentDuration","contentLanguage","contentPlayrate","contentIsFullscreen","contentIsMuted","contentIsAutoplayed","contentPreload","contentFps","addQoeAttributes","sendCustom","sendPlayerReady","PLAYER_READY","sendRequest","AD_REQUEST","CONTENT_REQUEST","sendStart","AD_START","CONTENT_START","sendEnd","AD_END","CONTENT_END","sendPause","AD_PAUSE","CONTENT_PAUSE","sendResume","AD_RESUME","CONTENT_RESUME","sendBufferStart","AD_BUFFER_START","CONTENT_BUFFER_START","buildBufferAttributes","bufferType","sendBufferEnd","AD_BUFFER_END","CONTENT_BUFFER_END","isInitialBuffering","sendSeekStart","AD_SEEK_START","CONTENT_SEEK_START","sendSeekEnd","AD_SEEK_END","CONTENT_SEEK_END","sendDownload","DOWNLOAD","AD_ERROR","CONTENT_ERROR","sendRenditionChanged","AD_RENDITION_CHANGE","CONTENT_RENDITION_CHANGE","adjustElapsedTimeForPause","AD_HEARTBEAT","CONTENT_HEARTBEAT","sendAdBreakStart","AD_BREAK_START","sendAdBreakEnd","AD_BREAK_END","sendAdQuartile","quartile","AD_QUARTILE","sendAdClick","AD_CLICK","p","y","_","R","B","b","Constants","Chrono","Log","Emitter","Tracker","VideoTracker","VideoTrackerState","Core","version","NrVideoEventAggregator","RetryQueueHandler","OptimizedHttpClient","HarvestScheduler","recordEvent","_videoCore","_interopRequireDefault","require","_videojsAds","__esModule","default","BrightcoveImaAdsTracker","VideojsAdsTracker","isUsing","ima3","adPlayer","nrvideo","onStarted","onPaused","onResume","onComplete","onSkipped","onError","onClick","skipped","sendClick","daiEvents","DAI_STREAM_INITIALIZED","DAI_STREAM_LOADED","DAI_STREAM_ERROR","DAI_AD_BREAK_STARTED","DAI_AD_BREAK_ENDED","DAI_AD_PERIOD_STARTED","DAI_AD_PERIOD_ENDED","DAI_AD_STARTED","DAI_AD_FIRST_QUARTILE","DAI_AD_MIDPOINT","DAI_AD_THIRD_QUARTILE","DAI_AD_COMPLETE","DAI_AD_SKIPPED","DAI_AD_PAUSED","DAI_AD_RESUMED","DAI_AD_CLICKED","DAI_AD_ERROR","DAI_CUEPOINTS_CHANGED","DAI_TIMED_METADATA","DaiAdsTracker","imaDai","dai","VERSION","ima","streamManager","currentAdData","adBreakData","streamData","cuePoints","initialized","eventHandlers","setStreamManager","setupStreamManagerListeners","google","api","StreamEvent","Type","LOADED","onStreamLoaded","STREAM_INITIALIZED","onStreamInitialized","onStreamError","AD_BREAK_STARTED","onAdBreakStarted","AD_BREAK_ENDED","onAdBreakEnded","AD_PERIOD_STARTED","onAdPeriodStarted","AD_PERIOD_ENDED","onAdPeriodEnded","STARTED","onAdStarted","FIRST_QUARTILE","onAdFirstQuartile","MIDPOINT","onAdMidpoint","THIRD_QUARTILE","onAdThirdQuartile","COMPLETE","onAdComplete","SKIPPED","onAdSkipped","PAUSED","onAdPaused","RESUMED","onAdResumed","CLICK","onAdClicked","VIDEO_CLICKED","CUEPOINTS_CHANGED","onCuePointsChanged","TIMED_METADATA","onTimedMetadata","handler","removeEventListener","event","extractStreamData","errorData","extractErrorData","extractAdBreakData","extractAdData","getClickThroughUrl","extractCuePoints","metadata","extractTimedMetadata","getStreamData","streamId","adTagParameters","streamType","getStreamType","getAdBreak","adBreakId","id","adBreakTitle","title","adCount","ads","position","ad","getAd","getAdId","creativeId","getCreativeId","description","getDescription","advertiserName","getAdvertiserName","clickThroughUrl","dealId","getDealId","wrapperAdIds","getWrapperAdIds","getError","errorCode","getErrorCode","errorMessage","getMessage","innerError","getInnerError","getCuepoints","getType","getData","getAdCuePoints","undefined","getStreamTime","Infinity","isLiveStream","getCurrentAdBreak","getCurrentAd","tech","getTech","stats","bandwidth","bitrate","FreewheelAdsTracker","FreeWheelPlugin","tv","freewheel","provider","adInstance","getActiveCreativeRendition","getId","err","getPrimaryCreativeRenditionAsset","getUrl","getName","ImaAdsTracker","getCuePoints","getAdsManager","lastAdData","podInfo","podIndex","mediaUrl","manager","getRemainingTime","adVideoElement","getAdVideoElement","_lastAdWebkitBitrate","delta","seconds","renditionBitrate","AdEvent","AdErrorEvent","ALL_ADS_COMPLETED","LINEAR_CHANGED","USER_CLOSE","IMPRESSION","CONTENT_PAUSE_REQUESTED","CONTENT_RESUME_REQUESTED","SKIPPABLE_STATE_CHANGED","AD_CAN_PLAY","AD_METADATA","EXPANDED_CHANGED","AD_BREAK_READY","LOG","onLoaded","onStart","onResumed","onFirstQuartile","onMidpoint","onThirdQuartile","onImpression","getAdData","adError","adQuartile","adsManager","currentAd","getMediaUrl","getAdPodInfo","getVastMediaBitrate","controller","adUi","adContainerDiv","querySelector","_mtConstants","_mt","MediaTailorAdsTracker","Boolean","mediatailor","currentAdBreak","mtOptions","manifestFormat","playbackManifestUrl","explicitTrackingUrl","trackingUrl","adSegmentPrefix","adSchedule","currentAdPod","hasEndedContent","isDisposed","trackingAbortController","manifestAbortController","isFetchingTracking","isFetchingManifest","trackingEndpointUrl","hasAttemptedTrackingFetch","trackingFetchRetries","maxTrackingRetries","manifestPollTimer","trackingPollTimer","liveRefreshIntervalSeconds","mediaPlaylistUrl","lastMediaPlaylistText","getTimestamp","endpoint","trackingAPITimeout","TRACKING_API_TIMEOUT_MS","detectManifestFormatFromUrl","toUpperCase","one","detectPlaybackStreamType","initializeTracking","buildTrackingEndpointUrl","STREAM_TYPE","VOD","setupVODTracking","setupLiveTracking","onPause","onPlaying","onSeeking","onSeeked","onWaiting","onEnded","onTimeUpdate","stopLivePolling","hookPlayerManifest","pollingInterval","getLiveRefreshIntervalMs","pollManifestForNewAds","getAndProcessTrackingMetadata","DEFAULT_LIVE_POLL_INTERVAL_MS","restartLivePollingTimers","newInterval","IWillNotUseThisInPlugins","getManifestDirectly","MANIFEST_TYPE","HLS","hookHLSViaVHS","hookHLSViaNative","hookHLSViaContribHls","DASH","hookDASHViaShaka","hookDASHViaDashJs","vhs","playlists","currentPlaylist","media","segments","parseVhsPlaylistForAdBreaks","playlist","el_","canPlayType","HLS_MIME_TYPE","hls","shakaPlayer","handleDASHEmsgEvent","dash","handleDASHEventStream","manifestUrl","fetchAndParseHlsManifest","fetchAndParseDashManifest","fetchHlsMasterManifest","mediaText","fetchHlsMediaPlaylist","hlsTargetDurationSeconds","extractHlsTargetDurationSeconds","updateLiveRefreshIntervalFromManifest","parseHlsManifestForAdBreaks","mergeNewAds","xmlText","fetchDashManifest","dashMinimumUpdatePeriodSeconds","extractDashMinimumUpdatePeriodSeconds","parseDashManifestForAdBreaks","emsgData","detail","schemeIdUri","SCTE35_SCHEME_MARKER","value","timescale","presentationTime","presentationTimeDelta","eventDuration","messageData","adBreak","endTime","confirmedByTracking","hasFiredStart","hasFiredEnd","hasFiredAdStart","pods","eventData","parseFloat","targetDuration","detectAdBreaksFromVhsPlaylist","_detectionPathLogged","firstSeg","whichAdSegmentMarker","path","sum","ab","LIVE","newAds","mergeAdSchedules","intervalSeconds","getTrackingMetadata","avails","enrichWithTrackingMetadata","enrichAdScheduleWithTrackingMetadata","sort","map","podCount","trackQuartiles","adObject","progress","getQuartilesToFire","q1","hasFiredQ1","q2","hasFiredQ2","q3","hasFiredQ3","key","activeAdBreak","findActiveAdBreak","toFixed","adBreakIndex","abs","determineAdPosition","breakIndex","totalBreaks","activePod","findActivePod","podProgress","adProgress","ended","sendContentEnd","handleAdEvent","eventName","sendMethod","stopPolling","PRE_ROLL","MID_ROLL","POST_ROLL","MANIFEST_CUE","VHS_DISCONTINUITY","TRACKING_API","MANIFEST_AND_TRACKING","DASH_EMSG","DASH_EVENT_STREAM","Q1","Q2","match","REGEX_SESSION_ID","sessionId","REGEX_TRACKING_PATH_SEGMENT","REGEX_MANIFEST_FILE_SUFFIX","discontinuityStarts","adBreaks","currentPod","segment","index","isMTSegment","isMediaTailorSegment","hasDiscontinuity","MIN_AD_DURATION","segmentDuration","HLS_MANIFEST_EXTENSION","DASH_MANIFEST_EXTENSION","totalAdBreaks","AD_POSITION","trackingAvails","scheduleMap","Map","set","avail","firstAd","startTimeInSeconds","existingAd","availId","trackingAd","adIndex","trackingStartTime","trackingDuration","durationInSeconds","manifestText","REGEX_DASH_MINIMUM_UPDATE_PERIOD","parseIsoDuration","REGEX_HLS_TARGET_DURATION","parseInt","masterText","baseUrl","lines","split","line","startsWith","HLS_TAG_PREFIX","URL","trim","async","fetchTextOrThrow","playlistUrl","pod","AD_TIMING_TOLERANCE","firedQuartiles","quartiles","calculateQuartiles","toFire","toISOString","timeout","externalSignal","timeoutId","abortHandler","response","credentials","json","existingSchedule","merged","newAd","assign","finalSchedule","xml","DOMParser","parseFromString","parserError","textContent","periods","querySelectorAll","period","baseUrlEl","adCandidates","MT_SEGMENT_PATTERN","MT_DEFAULT_AD_SEGMENT_PATH","some","periodId","getAttribute","AD_SOURCE","eventStreams","DASH_SCTE35_EVENT_STREAM_SELECTOR","stream","eventId","durationSeconds","currentPodStartTime","lastMapUrl","adPods","isInAdBreak","REGEX_DISCONTINUITY","test","mapMatch","REGEX_MAP","mapUrl","podDuration","MT_HLS_CUE_OUT_TAG","durationMatch","REGEX_CUE_OUT","MT_HLS_CUE_IN_TAG","actualDuration","HLS_SEGMENT_DURATION_TAG","labeled","marker","label","mapUri","uri","segUri","hit","candidates","QUARTILES","text","durationStr","REGEX_ISO_8601_DURATION","_package","_contribHls","_hlsJs","_shaka","ContribHlsTech","HlsJsTech","ShakaTech","pkg","onAdrequest","onAdload","onAdstart","onAdend","onAdskip","onAdserror","onAdsClick","onPodStart","onPodEnd","onAdspause","onAdsplay","el","attributes","NAME","BANDWIDTH","RESOLUTION","width","height","getContentBitratePlayback","master","throughput","HlsJs","vhs_","getResource","levels","currentLevel","getManifestUri","getStats","streamBandwidth","tracks","getVariantTracks","videoBandwidth","audioBandwidth","track","active","estimatedBandwidth","_ima","_brightcoveIma","_freewheel","_dai","_mediaTailor","AD_TRACKING","CSAI","SSAI","freeze","DAI","MT","VideojsTracker","isContentEnd","imaAdCuePoints","daiInitialized","adTracking","previousBitrate","adConfig","segmentPrefix","setAdTracking","valid","snapshot","absoluteTime","mediainfo","language","videojs","activePlaylist","techWrapper","allRenditions","maxBitrate","onDownload","onAdsready","onAdStart","onAdEnd","onPlay","onAbort","onDispose","onTimeupdate","OnAdsAllpodsCompleted","onStreamManager","onCanPlayThrough","onQualityLevelChange","qualityLevels","StreamManager","daiTracker","currentAdPlaying","FreewheelAdsCompleted","isAdsTrackerActive","code","selectedIndex","selectedLevel","newBitrate","oldBitrate","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","module","__webpack_modules__","definition","obj","prop","Symbol","toStringTag","_tracker"],"sourceRoot":""}
|