{"version":3,"file":"app-a1c2fb66.xxxxxxxx.bundle.js","mappings":"mpBAGA,UAFW,8M,shECaLA,EAA0B,IAAIC,IAC9BC,EAA0B,IAAID,IAC9BE,EAAwC,IAAIF,IAC5CG,EAAsB,IAAIC,QAiG1BC,EAA2B,IArFjC,wBACW,KAAAC,KAAO,IAAIC,IACH,KAAAC,UAAY,IAAID,IACzB,KAAAE,SAAoC,KACpC,KAAAC,WAAY,EACZ,KAAAC,mBAAmC,WAAM,SA8EnD,QAzEE,YAAAC,mBAAA,SAAmBD,GACjBE,KAAKF,mBAAqBA,CAC5B,EAEA,YAAAG,MAAA,SAAMC,G,QAAN,OACEF,KAAKG,kBACLH,KAAKL,UAAUS,IAAIF,G,IACnB,IAAkB,QAAAF,KAAKP,MAAI,8BAAE,CAAxB,IAAMY,EAAG,QACZH,EAAMG,EACR,C,kGACA,OAAO,WACL,EAAKV,UAAUW,OAAOJ,EACxB,CACF,EAEA,YAAAK,4BAAA,W,QACE,GAAuB,IAAnBP,KAAKP,KAAKe,KAAd,CAIA,IAAMC,EAAaC,MAAMC,KACvBC,SAASC,KAAKC,iBAAkC,2B,IAElD,IAAmB,QAAAL,GAAU,8BAAE,CAA1B,IAAMM,EAAI,QACTA,EAAKC,MAAQhB,KAAKP,KAAKwB,IAAIF,EAAKC,OAClCD,EAAKG,QAET,C,kGATA,CAUF,EAEQ,YAAAf,gBAAR,sBACMH,KAAKH,YAGTG,KAAKH,WAAY,EACjBG,KAAKmB,WAE2B,oBAArBC,mBAIXpB,KAAKJ,SAAW,IAAIwB,iBAAiB,WAAM,SAAKD,UAAL,GAC3CnB,KAAKJ,SAASyB,QAAQT,SAASC,KAAM,CAAES,WAAW,KACpD,EAEQ,YAAAH,SAAR,W,QACQI,EAAQX,SAASC,KAAKC,iBAAkC,0BACxDU,EAAkBxB,KAAKF,qB,IAE7B,IAAmB,QAAAY,MAAMC,KAAKY,IAAM,8BAAE,CAAjC,IAAMR,EAAI,QACRA,EAAKC,MAGLD,EAAKC,KAAKS,SAAS,iBAGpBV,EAAKC,OAASQ,IAGdxB,KAAKP,KAAKwB,IAAIF,EAAKC,QAIvBhB,KAAKP,KAAKW,IAAIW,EAAKC,MACnBhB,KAAK0B,OAAOX,EAAKC,OACnB,C,kGACF,EAEQ,YAAAU,OAAR,SAAerB,G,YACb,IAAuB,QAAAL,KAAKL,WAAS,+BACnCgC,EADiB,SACRtB,E,kGAEb,EACF,EAnFA,IA6FauB,EAAoB,CAC/BC,aAAc3C,EACd4C,aAAc1C,EACd2C,gCAAiC1C,EACjCC,oBAAmB,EACnB0C,yBAA0BxC,EAAyBC,MAQrD,aAME,WAA6BwC,GAAA,KAAAA,KAAAA,EAFrB,KAAAC,uBAA8C,IAES,CAmJjE,OAjJQ,YAAAC,yBAAN,SAA+BC,G,qBAA6BC,QAAO,W,mEAEjE,KADMC,EAAYtC,KAAKiC,KAAKM,gBAE1B,U,GAGIC,EAAYxC,KAAKiC,KAAKQ,eACtBC,EAAgB,IAAIC,IAAIL,EAAWM,OAAOC,SAAS7B,MAAM8B,aAE3DN,aAAqBO,YAArB,Y,iBAEA,O,sBAAA,GAAM/C,KAAKgD,kCAAkCR,EAAWE,EAAeN,I,cAAvE,S,+BAEAa,QAAQC,KAAK,yDAAkDR,EAAa,MAAM,G,aAEpF,U,cAGIS,EAAkBjE,EAAwBkE,IAAIV,IAGlD,GAAMS,GADJ,M,OAEF,OADA,SACA,I,OAGIE,EAAcC,EAAyBd,EAAWE,GAAea,MAAM,SAACC,GAE5E,MADAtE,EAAwBoB,OAAOoC,GACzBc,CACR,GAEAtE,EAAwBuE,IAAIf,EAAeW,G,iBAGzC,O,wBAAA,GAAMA,G,cAAN,S,iCAEAJ,QAAQC,KAAK,yDAAkDR,EAAa,MAAM,G,+BAIhF,YAAAgB,8BAAN,SAAoCtB,G,qBAA6BC,QAAO,W,kEAEtE,OADMG,EAAYxC,KAAKiC,KAAKQ,0BACDM,YAI3BvD,EAAyBO,mBAAmB,WAC1C,IAAMuC,EAAY,EAAKL,KAAKM,eAC5B,OAAOD,EAAY,IAAIK,IAAIL,EAAWM,OAAOC,SAAS7B,MAAM8B,WAAa,EAC3E,GAK2B,QAA3B,EAAA9C,KAAKkC,8BAAsB,oBAErByB,EAAkC,GACxC3D,KAAKkC,uBAAyB1C,EAAyBS,MAAM,SAACI,GACxD+B,KAIJuB,EAAeC,KACb,EAAKZ,kCAAkCR,EAAWnC,EAAK+B,GAAamB,MAAM,SAACC,GACzEP,QAAQC,KAAK,2DAAoD7C,EAAG,MAAMmD,EAC5E,GAEJ,GAEA,GAAMnB,QAAQwB,IAAIF,KA1BhB,I,OA+BF,OALA,SAKIvB,KAIJ5C,EAAyBe,8BAHvB,I,MAMJ,YAAAuD,OAAA,W,MAC6B,QAA3B,EAAA9D,KAAKkC,8BAAsB,oBAC3BlC,KAAKkC,uBAAyB,IAChC,EAEc,YAAAc,kCAAd,SACEe,EACA1D,EACA+B,G,qBACCC,QAAO,W,mEAER,GADM2B,EAuGV,SAAgCD,GAC9B,IAAItE,EAAOH,EAAoB8D,IAAIW,GAMnC,OALKtE,IACHA,EAAO,IAAIC,IACXJ,EAAoBmE,IAAIM,EAAYtE,IAG/BA,CACT,CA/G6BwE,CAAuBF,GAC5CC,EAAiB/C,IAAIZ,GACvB,U,iBAImB,O,sBAAA,GAAM6D,EAAiC7D,I,OAC1D,OADM8D,EAAa,SACf/B,IACF,IAEE+B,GAuGV,SAA6BJ,GAC3B,MAAO,uBAAwBA,GACJ,oBAAlBK,eAC+E,mBAA9EA,cAAcC,UAAoDC,OAC9E,CA3GwBC,CAAoBR,KAC9BS,EAA4BT,GACHU,mBAAmBhD,SAAS0C,KACzDK,EAA0BC,mBAAqB,EAAH,K,uRAAA,CACvCD,EAA0BC,qBAAkB,IAC/CN,I,IAGJH,EAAiB5D,IAAIC,GACrB,KAGc,GAAMqE,EAA0BrE,I,OAChD,OADMsE,EAAU,SACZvC,IACF,KAEIwC,EAAgBlE,MAAMC,KAAKoD,EAAWjD,iBAAiB,wCAAwC+D,KACnG,SAACC,GAAc,OAACA,EAA+BC,QAAQC,cAAgB3E,CAAxD,IAEX4E,EAAQL,QAAAA,EAAiBhE,SAASsE,cAAc,UAChDC,YAAcR,EACpBM,EAAMG,aAAa,wBAAyB,QAC5CH,EAAMF,QAAQC,YAAc3E,EAEvBuE,GACHb,EAAWsB,aAAaJ,EAAOlB,EAAWuB,YAG5CtB,EAAiB5D,IAAIC,G,cAErB,G,WAAI+B,IACF,U,iBAGA,O,sBAAA,GAAMkB,EAAyBS,EAAY1D,I,OAC3C,OADA,SACI+B,IACF,KAEF4B,EAAiB5D,IAAIC,G,cAErB,M,SAAM,E,0CAKd,EAzJA,GA2JA,SAASiD,EAAyBiC,EAAwBlF,GACxD,IAAMmF,EAAYD,aAAsBxC,WAAawC,EAAa3E,SAASC,KACrE4E,EAAaF,aAAsBxC,WAAawC,EAAa3E,SAASC,KAEtE6E,EAAehF,MAAMC,KAAK6E,EAAU1E,iBAAiB,uCAAuC+D,KAChG,SAACC,GAAc,OAACA,EAA8B9D,OAASX,CAAxC,GAGXU,EAAO2E,QAAAA,EAAgB9E,SAASsE,cAAc,QAOpD,OANKQ,IACH3E,EAAK4E,IAAM,aACX5E,EAAKC,KAAOX,EACZU,EAAKqE,aAAa,wBAAyB,SAGA,SAAzCrE,EAAK6E,aAAa,oBAAmC7E,EAAK8E,OAC5D9E,EAAKqE,aAAa,kBAAmB,QAC9B/C,QAAQyD,WAGV,IAAIzD,QAAc,SAACyD,EAASC,GACjC,IAAMC,EAAS,WACbC,IACAlF,EAAKqE,aAAa,kBAAmB,QACrCU,GACF,EAEMI,EAAU,WACdD,IACAF,EAAO,IAAII,MAAM,oCAA6B9F,IAChD,EAEM4F,EAAU,WACdlF,EAAKqF,oBAAoB,OAAQJ,GACjCjF,EAAKqF,oBAAoB,QAASF,EACpC,EAEAnF,EAAKsF,iBAAiB,OAAQL,GAC9BjF,EAAKsF,iBAAiB,QAASH,GAE1BR,GACHD,EAAWa,YAAYvF,EAE3B,EACF,CAkBA,SAASmD,EAAiC7D,GAA1C,WACE,GAA6B,oBAAlB+D,eAC6E,mBAA9EA,cAAcC,UAAoDC,QAC1E,OAAOjC,QAAQyD,QAAQ,MAGzB,IAAM3C,EAAkB9D,EAAsC+D,IAAI/C,GAClE,GAAI8C,EACF,OAAOA,EAGT,IAAMoD,EAAU7B,EAA0BrE,GACvCmG,KAAK,SAAO7B,GAAO,oC,uDAElB,UADMR,EAAa,IAAIC,eAGpBE,QAAQK,I,OACX,OAHA,SAGO,CAAP,EAAOR,G,OAERZ,MAAM,SAACC,GAEN,MADAnE,EAAsCiB,OAAOD,GACvCmD,CACR,GAGF,OADAnE,EAAsCoE,IAAIpD,EAAKkG,GACxCA,CACT,CAEA,SAAS7B,EAA0BrE,GAAnC,WACQ8C,EAAkB/D,EAAwBgE,IAAI/C,GACpD,GAAI8C,EACF,OAAOA,EAGT,IAAMoD,EAAUE,MAAMpG,EAAK,CAAEqG,YAAa,gBACvCF,KAAK,SAAOG,GAAQ,oC,uDACnB,IAAKA,EAASC,GACZ,MAAM,IAAIT,MAAM,qCAA8B9F,EAAG,aAAKsG,EAASE,SAGpC,OAAtB,EAAAC,EAAsB,GAAMH,EAASI,Q,OAA5C,MAAO,CAAP,EAAO,gBAAsB,SAAuB1G,K,OAErDkD,MAAM,SAACC,GAEN,MADApE,EAAwBkB,OAAOD,GACzBmD,CACR,GAGF,OADApE,EAAwBqE,IAAIpD,EAAKkG,GAC1BA,CACT,CAEA,SAASO,EAAsBnC,EAAiBqC,GAC9C,OAAOrC,EAAQL,QACb,+DACA,SAAC2C,EAAQC,EAAQC,GACf,IAAMC,EAAc,IAAIzE,IAAIwE,EAAYE,OAAQL,GAAelE,WAC/D,MAAO,eAAQsE,EAAW,KAC5B,EAEJ,C,4wBC5XA,aAGE,WAA6BnF,GAAA,KAAAA,KAAAA,EAFrB,KAAAqF,mBAAqB,IAAI/H,OAE6B,CAqIhE,OAnIE,YAAAgI,kBAAA,W,MACEvH,KAAKwH,qBACL,IAAMC,EAAqD,QAAlC,EAAAzH,KAAKiC,KAAKyF,gCAAwB,QAAI1H,KAAKiC,KAAK0F,YACzE,OAAKF,EAIE/G,MAAMC,KAAK8G,EAAiBG,YAAYC,OAAO,SAACC,GAAS,OAAAC,EAAkBD,EAAlB,GAHvD,EAIX,EAEA,YAAAE,sBAAA,SAAsBC,G,wBACdC,EAAYlI,KAAKiC,KAAKkG,eAC5B,GAAKD,GAA8B,IAAjBD,EAAMG,OAAxB,CAIA,IAAMC,EAAe,IAAIlJ,I,IAEzB,IAAmB,QAAA8I,GAAK,8BACtB,IADSH,EAAI,SACJQ,WAAaC,KAAKC,cAAiBV,EAAqBW,aAAa,iBAA9E,CACE,IAAMC,EAAcZ,EACda,EAAWD,EAAY9C,aAAa,kBAAoB,UAG9D,GAAyB,KAFnBgD,EAAYlI,MAAMC,KAAK+H,EAAYd,YAAYC,OAAO,SAACgB,GAAc,OAAAd,EAAkBc,EAAlB,IAE7DT,OACZ,SAGF,IAAM,EAAmC,QAA1B,EAAAC,EAAajF,IAAIuF,UAAS,QAAI,G,IAC7C,IAAuB,kBAAAC,IAAS,8BAAE,CAA7B,IAAME,EAAQ,QACjB9I,KAAK+I,uBAAuBD,EAC9B,C,kGACA,EAAOlF,KAAI,MAAX,EAAM,OAASgF,IAAS,IACxBP,EAAa5E,IAAIkF,EAAU,EAE7B,KAhBA,CAkBA,IAAMK,EAAoC,QAA3B,EAAAX,EAAajF,IAAI,kBAAU,QAAI,GAC9CpD,KAAK+I,uBAAuBjB,GAC5BkB,EAAOpF,KAAKkE,GACZO,EAAa5E,IAAI,UAAWuF,EAL5B,C,sGAQF,IAAoC,QAAAX,EAAaY,WAAS,8BAAE,CAAjD,mBAAWL,GAAVD,EAAQ,KAAW,MACvBO,EAASlJ,KAAKmJ,qBAAqBjB,EAAWS,GACpD,GAAKO,E,IASL,IAAmB,kBAAAN,IAAS,8BAAE,CAAzB,IAAMd,EAAI,QACboB,EAAO5C,YAAYwB,EACrB,C,sGAXA,CACE,IAAMsB,EAAyB,YAAbT,EAAyB,eAAiB,gBAASA,EAAQ,KAC7E1F,QAAQO,MACN,6CAAsC4F,EAAS,qCAA6BpJ,KAAKiC,KAAKoH,mBAAkB,OACtG,uFAGN,CAKF,C,kGA3CA,CA4CF,EAEA,YAAAC,sBAAA,W,cACQpB,EAAYlI,KAAKiC,KAAKkG,eAC5B,GAAKD,EAAL,CAIA,IAAMqB,EAAsBvJ,KAAKiC,KAAKyF,yB,IACtC,IAAqB,QAAAhH,MAAMC,KAAKuH,EAAUpH,iBAAiB,kCAAgC,8BAAE,CAAxF,IAAMoI,EAAM,QACTjB,EAAQvH,MAAMC,KAAKuI,EAAOtB,YAAYC,OAAO,SAACC,GAAS,OAAAC,EAAkBD,EAAlB,G,IAC7D,IAAmB,kBAAAG,IAAK,8BAAE,CAArB,IAAMH,EAAI,QACP0B,EAAwC,QAAjC,EAAAxJ,KAAKsH,mBAAmBlE,IAAI0E,UAAK,QAAI,CAChD2B,OAAQF,QAAAA,EAAuBvJ,KAAKiC,KAAK0F,YACzC+B,YAAa,MAETA,EAAcF,EAAKE,aAAeF,EAAKE,YAAYC,aAAeH,EAAKC,OACzED,EAAKE,YACL,KACJF,EAAKC,OAAOpE,aAAayC,EAAM4B,EACjC,C,kGACF,C,kGAfA,CAgBF,EAEQ,YAAAlC,mBAAR,W,QACQG,EAAc3H,KAAKiC,KAAK0F,YAC1B4B,EAAsBvJ,KAAKiC,KAAKyF,yBAC9BkC,EAAmBlJ,MAAMC,KAAKgH,EAAYC,YAAYC,OAAO,SAACC,GAClE,OAAOA,IAASyB,GAAuBxB,EAAkBD,EAC3D,GAUA,IARKyB,GAAuBK,EAAiBxB,OAAS,KACpDmB,EAAsB3I,SAASsE,cAAc,QACzB2E,QAAS,EAC7BN,EAAoBnE,aAAa,6BAA8B,QAC/DuC,EAAYrB,YAAYiD,GACxBvJ,KAAKiC,KAAK6H,uBAAuBP,IAG9BA,E,IAIL,IAAmB,QAAAK,GAAgB,8BAAE,CAAhC,IAAM9B,EAAI,QACbyB,EAAoBjD,YAAYwB,EAClC,C,kGACF,EAEQ,YAAAqB,qBAAR,SAA6BjB,EAAwBS,G,QACnD,MAAiB,YAAbA,EACKT,EAAU6B,cAAc,uCAAgCpB,EAAQ,OAQrE,QAJF,EAAiE,QAAjE,EAAAT,EAAU6B,cAAc,iDAAyC,QACjErJ,MAAMC,KAAKuH,EAAUpH,iBAAiB,iCAAiC+D,KAAK,SAACC,GAC3E,IAAMkF,EAAalF,EAAUc,aAAa,8BAC1C,MAAsB,KAAfoE,GAAoC,YAAfA,GAA2C,OAAfA,CAC1D,UAAE,QACF,IAEJ,EAEQ,YAAAjB,uBAAR,SAA+BjB,G,QACzB9H,KAAKsH,mBAAmBrG,IAAI6G,IAIhC9H,KAAKsH,mBAAmB7D,IAAIqE,EAAM,CAChC2B,OAA6D,QAArD,EAAe,QAAf,EAAA3B,EAAK6B,kBAAU,QAAI3J,KAAKiC,KAAKyF,gCAAwB,QAAI1H,KAAKiC,KAAK0F,YAC3E+B,YAAa5B,EAAK4B,aAEtB,EACF,EAxIA,GA0IA,SAAS3B,EAAkBD,G,QACzB,OAAIA,EAAKQ,WAAaC,KAAK0B,eAIvBnC,EAAKQ,WAAaC,KAAK2B,YACc,QAA/B,EAAgB,QAAhB,EAAApC,EAAK3C,mBAAW,eAAEkC,OAAOe,cAAM,QAAI,GAAK,EAIpD,C,ICjKM+B,EAAmB,YAKnBC,EAAgC,CAAC,IAAK,MAoC/BC,EAAoB,CAC/BhH,YAAa,MAGR,SAASiH,EAAcC,GAC5B,QAASA,GACgB,mBAAhBA,EAAIC,SACiB,mBAArBD,EAAIE,cACsB,mBAA1BF,EAAIG,iBACf,CAEO,SAASC,IACd,OAAIN,EAAkBhH,cAItBgH,EAAkBhH,YAAcuH,EAAwB,GAAGrH,MAAM,SAACC,GAMhE,MAFA6G,EAAkBhH,YAAc,KAyEpC,SAAmCG,GACjC,IACEZ,OAAOiI,cACL,IAAIC,YAvI4B,yBAuIe,CAC7CC,SAAS,EACTC,YAAY,EACZC,OAAQ,CAAEzH,MAAK,KAGrB,CAAE,MAAO0H,GACPjI,QAAQC,KAAK,gEAAiEgI,EAChF,CACF,CApFIC,CAA0B3H,GACpBA,CACR,IAVS6G,EAAkBhH,WAa7B,CAEA,SAAeuH,EAAwBQ,G,yBAAyB,W,0rCAE5D,O,sBAAA,GAAMC,K,cAAN,S,aAEA,G,WAAID,GAAWhB,EAA8BhC,OAC3C,MAAM,EAQR,OALM,EAAQgC,EAA8BgB,GAC5CnI,QAAQC,KACN,0DAAmDkI,EAAU,EAAC,eAAOhB,EAA8BhC,OAAS,EAAC,0BAAkB,EAAK,OACpI,GAEF,GAAM,IAAI/F,QAAc,SAACyD,GAAY,OAAAwF,WAAWxF,EAAS,EAApB,I,OACrC,OADA,SACO,CAAP,EAAO8E,EAAwBQ,EAAU,I,4BAdY/I,W,0QAkBzD,SAASgJ,I,MACDE,EAAuC,QAA3B,EAAA3I,OAAO4I,4BAAoB,QAAI,gBAC7CC,EAAiB7K,SAASmJ,cAC5B,yCAGF,MAAwD,UAApD0B,aAAc,EAAdA,EAAgB7F,aAAa,oBACxBvD,QAAQyD,WAMuC,UAApD2F,aAAc,EAAdA,EAAgB7F,aAAa,sBAC/B6F,EAAevK,SACfuK,EAAiB,MAGZ,IAAIpJ,QAAc,SAACyD,EAASC,GACjC,IAAM2F,EAASD,QAAAA,EAAkB7K,SAASsE,cAAc,UAClDe,EAAU,WACdyF,EAAOtF,oBAAoB,OAAQJ,GACnC0F,EAAOtF,oBAAoB,QAASF,EACtC,EACMF,EAAS,WACbC,IACAyF,EAAOtG,aAAa,kBAAmB,QACvCU,GACF,EACMI,EAAU,WACdD,IACAyF,EAAOtG,aAAa,kBAAmB,QACvCW,EAAO,IAAII,MAAM,2CAAoCoF,IACvD,EAEAG,EAAOrF,iBAAiB,OAAQL,GAChC0F,EAAOrF,iBAAiB,QAASH,GAE5BuF,IACHC,EAAOC,KAAO,SACdD,EAAOE,IAAML,EACbG,EAAOtG,aAAa,yBAA0B,QAC9CxE,SAASC,KAAKyF,YAAYoF,GAE9B,GACF,CAuBA,iBAME,WAA6BzJ,GAAA,KAAAA,KAAAA,EALrB,KAAA4J,aAAqD,KACrD,KAAAC,cAA8D,KAC9D,KAAAC,kBAAyC,KACzC,KAAAC,eAAgC,IAEoB,CAsG9D,OA/FE,YAAAC,YAAA,WACE,OAAI3B,EAAc1H,OAAOsJ,KAChB7J,QAAQyD,QAAQlD,OAAOsJ,MAGE,IAA9BtJ,OAAOuJ,oBACTlJ,QAAQO,MAAM,8DACPnB,QAAQyD,QAAQ,OAGlB9F,KAAKoM,YACd,EAMA,YAAAC,OAAA,WACErM,KAAKsM,SAAS,KAChB,EAEQ,YAAAF,WAAR,sBACE,OAAI9B,EAAc1H,OAAOsJ,KAChB7J,QAAQyD,QAAQlD,OAAOsJ,MAG5BlM,KAAK6L,eAIT7L,KAAK6L,aAAe,IAAIxJ,QAAQ,SAACyD,GAC/B,EAAKgG,cAAgBhG,EAErB,IAAMyG,EAAiB,WACjB,EAAKtK,KAAKuK,mBACZ,EAAKF,SAAS,MAIZhC,EAAc1H,OAAOsJ,MACvB,EAAKI,SAAS1J,OAAOsJ,IAEzB,EAEA,EAAKH,kBAAoB,WACvBQ,GACF,EAEA3J,OAAOyD,iBAAiB8D,EAAkB,EAAK4B,mBAE/C,EAAKC,eAAiBpJ,OAAO0I,WAAW,WACtCrI,QAAQO,MAAM,sDACd,EAAK8I,SAAS,KAChB,EA5NmB,MAiOnB3B,IACGnE,KAAK+F,GACLhJ,MAAM,SAACC,GACNP,QAAQO,MAAM,iDAAkDA,GAChE,EAAK8I,SAAS,KAChB,GAIFC,GACF,IAzCSvM,KAAK6L,aA4ChB,EAEQ,YAAAS,SAAR,SAAiB/B,GACf,IAAMkC,EAAWzM,KAAK8L,cACtB9L,KAAK8L,cAAgB,KACrB9L,KAAK0M,eACL1M,KAAK6L,aAAe,KAEhBY,GACFA,EAASlC,EAEb,EAEQ,YAAAmC,aAAR,WACM1M,KAAK+L,oBACPnJ,OAAOwD,oBAAoB+D,EAAkBnK,KAAK+L,mBAClD/L,KAAK+L,kBAAoB,MAGC,OAAxB/L,KAAKgM,iBACPpJ,OAAO+J,aAAa3M,KAAKgM,gBACzBhM,KAAKgM,eAAiB,KAE1B,EACF,EA5GA,G,4iEC1JA,aAmCE,WACUY,EACAC,GAFV,WACU,KAAAD,QAAAA,EACA,KAAAC,UAAAA,EAxBA,KAAAC,cAAwB,GACoB,KAAAC,MAA6B,CAAC,EAC1E,KAAAC,eAAyB,GAE3B,KAAA9E,UAAmC,KAKnC,KAAAqB,oBAA6C,KAC7C,KAAA0D,cAAsC,KACtC,KAAAC,aAAc,EACd,KAAAC,aAAc,EACd,KAAAC,gBAAkB,EAClB,KAAAC,kBAAqD,KACrD,KAAA7K,UAA+B,KAC/B,KAAA8K,aAA2C,KAC3C,KAAAC,gBAA8C,KASpDvN,KAAKwN,aAAe,IAAIC,EAAmB,CACzClL,aAAc,iBAAM,OAAU,QAAV,EAAAK,OAAOsJ,WAAG,eAAE5J,SAAS,EACzCG,aAAc,WAAM,SAAKA,cAAL,IAEtBzC,KAAK0N,WAAa,IAAIC,EAAkB,CACtChG,YAAa3H,KAAK4M,QAClBzE,aAAc,WAAM,SAAKD,SAAL,EACpBR,uBAAwB,WAAM,SAAK6B,mBAAL,EAC9BO,uBAAwB,SAAC5B,GAAgB,EAAKqB,oBAAsBrB,CAAW,EAC/EmB,iBAAkB,WAAM,SAAKyD,aAAL,IAE1B9M,KAAK4N,UAAY,IAAIC,EAAgB,CACnCrB,iBAAkB,WAAM,SAAKU,WAAL,GAE5B,C,UA8TF,OAzWE,sBAAmB,4BAAuB,C,IAA1C,WAAqE,OAAO7C,EAAkBhH,WAAa,E,IAC3G,SAA2CyK,GAA+BzD,EAAkBhH,YAAcyK,CAAO,E,gCA4C3G,YAAAC,SAAN,W,qBAAkB1L,QAAO,W,iDAIvB,OAHArC,KAAKkN,aAAc,EACnBlN,KAAKmN,aAAc,EAEdnN,KAAK8M,cAKV,GAAM9M,KAAKgO,mBAJT/K,QAAQC,KAAK,4CACb,K,cAGF,S,UAGF,YAAA+K,SAAA,WACEjO,KAAKkN,aAAc,EACnBlN,KAAKmN,aAAc,EACnBnN,KAAK4N,UAAUvB,SACfrM,KAAKiG,SACP,EAEA,YAAAiI,qBAAA,SAAqBC,EAAkBC,GAAvC,WACOD,IAAYnO,KAAKkN,aAAgBlN,KAAKmN,cAItCiB,IAAapO,KAAKiN,gBAAiBjN,KAAKkI,YAIzCiG,IAAaC,IACfpO,KAAKiG,UACLjG,KAAK6M,UAAUwB,eAAe,WACvB,EAAKL,gBACZ,GAEJ,EAEA,YAAAM,aAAA,SAAaC,EAA+BC,GACtCxO,KAAKkN,cAILlN,KAAKiN,cACPjN,KAAKyO,eAAeF,GAItBvO,KAAKsN,aAAetN,KAAK0O,cAAcH,GACzC,EAEA,YAAAI,sBAAA,SAAsBR,GAChBnO,KAAKkI,YACPlI,KAAKkI,UAAU0G,UAAYT,GAAY,GAE3C,EAOA,YAAAU,UAAA,WACE,IAAM9B,EAAQ/M,KAAK0O,cAAc1O,KAAK+M,OAEtC,GAAI/M,KAAKiN,cAGP,OAFAjN,KAAKiN,cAAc6B,YAAY/B,QAC/B/M,KAAKuN,gBAAkBR,GAIzB/M,KAAKsN,aAAeP,CACtB,EAEc,YAAAiB,eAAd,W,qBAAgC3L,QAAO,W,8DACrC,OAAIrC,KAAKkN,cAAgBlN,KAAK8M,cAC5B,KAMIiC,IAAe/O,KAAKoN,gBAEd,GAAMpN,KAAK4N,UAAU3B,gB,OACjC,OADY,WACAjM,KAAKgP,QAAQD,IAAgB/O,KAAK8M,eAI9C9M,KAAKyC,eACL,GAAMzC,KAAKwN,aAAarL,yBAAyB,WAAM,SAAK6M,QAAQD,EAAb,KAJrD,I,OAKF,OADA,SACI/O,KAAKgP,QAAQD,GACf,IAGF,GAAM/O,KAAKiP,kBAAkBF,I,cAA7B,S,UAGY,YAAAE,kBAAd,SAAgCF,G,qBAAqB1M,QAAO,W,wEAC1D,GAAIrC,KAAKgP,QAAQD,KAAgBzE,EAAc1H,OAAOsJ,KAAM,UACtDA,EAAMtJ,OAAOsJ,IACbgD,EAAelP,KAAK0O,cAAc1O,KAAK+M,O,iBAG3C,O,sBAAKb,EAAIzB,aAAazK,KAAK8M,gBAQ3B9M,KAAKmP,kBACCC,EAAiBpP,KAAK0N,WAAWnG,oBACvCvH,KAAKqP,qBACLrP,KAAKsP,oBAAoB,kBAAmB,CAC1CxC,cAAe9M,KAAK8M,gBAIA,GAAMZ,EAAI1B,QAC9BxK,KAAKkI,UACLlI,KAAK8M,cACLoC,MAlBAjM,QAAQO,MACN,kCAA2BxD,KAAK8M,cAAa,iBAC3C,qBAAcZ,EAAIxB,oBAAoB6E,KAAK,QAE/C,K,OAiBF,GANMtC,EAAgB,SAMlBjN,KAAKgP,QAAQD,KAAgB/O,KAAKkI,UAAW,CAC/C,IACE+E,EAAcuC,SAChB,CAAE,MAAOhM,GACPP,QAAQC,KAAK,8CAA+CM,EAC9D,CACA,SACF,CAMA,OAJAxD,KAAKiN,cAAgBA,EACrBjN,KAAKuN,gBAAkB2B,EACvBlP,KAAKyO,eAAgC,QAAjB,EAAAzO,KAAKsN,oBAAY,QAAItN,KAAK0O,cAAc1O,KAAK+M,QACjE/M,KAAKsN,aAAe,KACpB,GAAMtN,KAAKwN,aAAa9J,8BAA8B,WAAM,SAAKsL,QAAQD,EAAb,I,OAK5D,OALA,SAKI/O,KAAKgP,QAAQD,GACf,KAEF/O,KAAK0N,WAAW1F,sBAAsBoH,GACtCpP,KAAK6M,UAAU4C,UAAU,WACnB,EAAKT,QAAQD,IAIjB,EAAKrB,WAAW1F,sBAAsB,EAAK0F,WAAWnG,oBACxD,GACAvH,KAAKsP,oBAAoB,cAAe,CACtCxC,cAAe9M,KAAK8M,cACpB5E,UAAWlI,KAAKkI,Y,gCAGlBjF,QAAQO,MAAM,0CAA2C,GACzDxD,KAAKsP,oBAAoB,kBAAmB,CAC1CxC,cAAe9M,KAAK8M,cACpBtJ,MAAK,IAEFxD,KAAKgP,QAAQD,IAChB/O,KAAKiG,U,6BAKH,YAAA+I,QAAR,SAAgBD,GACd,OAAO/O,KAAKkN,aAAe6B,IAAe/O,KAAKoN,eACjD,EAEQ,YAAA+B,gBAAR,WACE,IAAInP,KAAKkI,UAAT,CAEA,IAAM1F,EAAYxC,KAAKyC,eACvBzC,KAAKkI,UAAYtH,SAASsE,cAAc,OACxClF,KAAKkI,UAAU9C,aAAa,kBAAmB,QAC/CpF,KAAKkI,UAAU9C,aAAa,qBAAsBpF,KAAK8M,eAEnD9M,KAAKgN,iBACPhN,KAAKkI,UAAU0G,UAAY5O,KAAKgN,gBAGlCxK,EAAU8D,YAAYtG,KAAKkI,UAXD,CAY5B,EAEQ,YAAAuG,eAAR,SAAuBF,G,UACrB,GAAKvO,KAAKiN,cAAV,CAMA,IAAMyC,EAAW1P,KAAK0O,cAAcH,GAC9BoB,EAA+B,QAApB,EAAA3P,KAAKuN,uBAAe,QAAI,CAAC,EACpCqC,EAA+B,CAAC,EAClCC,GAAa,E,IAEjB,IAAkB,M,ySAAA,CAAAC,OAAOC,KAAKL,IAAS,8BAAE,CAApC,IAAMM,EAAG,QACPF,OAAOG,GAAGN,EAASK,GAAMN,EAASM,MACrCJ,EAAQI,GAAON,EAASM,GACxBH,GAAa,EAEjB,C,kGAEKA,IAEL7P,KAAKiN,cAAc6B,YAAYc,GAC/B5P,KAAKuN,gBAAkBmC,EArBQ,CAsBjC,EAEQ,YAAAhB,cAAR,SAAsB3B,GACpB,OAAKA,GAA0B,iBAAVA,EAId,EAAP,GAAYA,GAHH,CAAC,CAIZ,EAEQ,YAAAuC,oBAAR,SAA4BY,EAAcjF,GACxC,IAAMkF,EAAQ,EAAAC,IAAIC,kBAAkBH,EAAM,CACxCnF,SAAS,EACTC,YAAY,EACZC,OAAM,IAERjL,KAAK4M,QAAQ/B,cAAcsF,EAC7B,EAEQ,YAAAd,mBAAR,sBACOrP,KAAKkI,YAKNlI,KAAKqN,oBACPrN,KAAKkI,UAAU9B,oBAAoB,kBAAmBpG,KAAKqN,mBAC3DrN,KAAKqN,kBAAoB,MAG3BrN,KAAKqN,kBAAoB,SAAC8C,GACnB,EAAKpD,OAA+B,iBAAf,EAAKA,QAC7B,EAAKA,MAAQ,CAAC,GAGhB,IACM,EADcoD,EACoBlF,QAAU,CAAC,EAA3CqF,EAAQ,WAAExC,EAAK,QAEvB,GAAIwC,GAAYR,OAAOzL,UAAUkM,eAAeC,KAAK,EAAKzD,MAAOuD,GAAW,CAC1E,EAAKvD,MAAMuD,GAAYxC,EAGnB,EAAKP,kBACP,EAAKA,gBAAgB+C,GAAYxC,GAGnC,IAAM2C,EAAc,EAAAL,IAAIC,kBAAkB,gBAAiB,CACzDtF,SAAS,EACTC,YAAY,EACZC,OAAQ,CAAEqF,SAAQ,EAAExC,MAAK,KAE3B,EAAKlB,QAAQ/B,cAAc4F,EAC7B,CACF,EAEAzQ,KAAKkI,UAAU7B,iBAAiB,kBAAmBrG,KAAKqN,mBAC1D,EAEQ,YAAApH,QAAR,WAUE,GATAjG,KAAKoN,kBACLpN,KAAKwN,aAAa1J,SAClB9D,KAAK0N,WAAWpE,wBAEZtJ,KAAKkI,WAAalI,KAAKqN,oBACzBrN,KAAKkI,UAAU9B,oBAAoB,kBAAmBpG,KAAKqN,mBAC3DrN,KAAKqN,kBAAoB,MAGvBrN,KAAKiN,cAAe,CACtB,IACEjN,KAAKiN,cAAcuC,SACrB,CAAE,MAAOhM,GACPP,QAAQC,KAAK,wCAAyCM,EACxD,CACAxD,KAAKiN,cAAgB,IACvB,CAEIjN,KAAKkI,WAAalI,KAAKkI,UAAUyB,aACnC3J,KAAKkI,UAAUyB,WAAW+G,YAAY1Q,KAAKkI,WAC3ClI,KAAKkI,UAAY,MAGnBlI,KAAKsN,aAAe,KACpBtN,KAAKuN,gBAAkB,KACvBvN,KAAKsP,oBAAoB,eAAgB,CACvCxC,cAAe9M,KAAK8M,eAExB,EAEQ,YAAArK,aAAR,W,MACE,GAAIzC,KAAKwC,UACP,OAAOxC,KAAKwC,UAGd,IAAMmF,EAAc3H,KAAK4M,QAEzB,OAAIjF,GAAmD,mBAA7BA,EAAYgJ,cACpC3Q,KAAKwC,UAAkC,QAAtB,EAAAmF,EAAY5D,kBAAU,QAAI4D,EAAYgJ,aAAa,CAAEC,KAAM,SACrE5Q,KAAKwC,YAGdxC,KAAKwC,UAAYxC,KAAK4M,QACf5M,KAAKwC,UACd,EAhXO,EAAAqO,OAAS,CAACC,QAAS,EAAAC,WAKF,EAAA7R,wBAA0B0C,EAAkBC,aAC5C,EAAAzC,wBAA0BwC,EAAkBE,aAC5C,EAAAzC,sCAAwCuC,EAAkBG,gCAC1D,EAAAiP,+BAAiCpP,EAAkBI,yBAIjE,GAAT,EAAAiP,S,6DACqD,IAArD,IAAAA,UAAS,CAAEC,mBAAoB,EAAAC,YAAYC,S,gBAAuB,mB,EAAA,oBAANC,QAAAA,QAAM,W,4BACzD,GAAT,EAAAJ,S,8DAfmB,IADrB,IAAAK,eAAc,c,uBAqCa,mB,EAAA,oBAAPR,SAAAA,SAAO,SACI,mBADJ,OACI,IAAT,EAAAC,WAAA,EAAAA,WAAS,YArCnBQ,E,CAAb,E","sources":["webpack://iadviser/./src/components/au2-bridge/au2-render.html","webpack://iadviser/./src/components/au2-bridge/bridge-styles.ts","webpack://iadviser/./src/components/au2-bridge/bridge-projection.ts","webpack://iadviser/./src/components/au2-bridge/bridge-api-loader.ts","webpack://iadviser/./src/components/au2-bridge/au2-render.ts"],"sourcesContent":["// Module\nvar code = \"\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n\\r\\n\";\n// Exports\nexport default code;","/**\r\n * Stylesheet handling for the Au2 bridge.\r\n *\r\n * Lives outside `Au2Render` so the custom element stays focused on Aurelia 1\r\n * lifecycle wiring. The caches below are module-scoped and intentionally\r\n * shared across every `` instance — bridge asset URLs are global,\r\n * so once one mount has fetched, parsed, or constructed a stylesheet, every\r\n * subsequent mount should reuse it.\r\n *\r\n * Methods that touch the DOM after an await accept a `shouldAbort` callback\r\n * so a caller that has been detached (or remounted with a new component name)\r\n * can short-circuit before the DOM mutation runs.\r\n */\r\n\r\nconst bridgeStyleLoadPromises = new Map>();\r\nconst bridgeStyleTextPromises = new Map>();\r\nconst bridgeConstructableStyleSheetPromises = new Map>();\r\nconst shadowRootStyleUrls = new WeakMap>();\r\n\r\ntype BridgeAssetUrlListener = (url: string) => void;\r\n\r\n/**\r\n * Page-wide pub/sub for `/au2/assets/...` stylesheet URLs that Vite emits as\r\n * `` tags when component chunks load. Replaces the per-mount head scan:\r\n * every shadow root subscribes once and is replayed the current backlog plus\r\n * notified of any future links. The MutationObserver covers components whose\r\n * CSS is injected after the initial mount, which the old scan-then-remove\r\n * loop could miss.\r\n */\r\nclass BridgeAssetStyleRegistry {\r\n readonly urls = new Set();\r\n private readonly listeners = new Set();\r\n private observer: MutationObserver | null = null;\r\n private observing = false;\r\n private getExcludedBaseUrl: () => string = () => '';\r\n\r\n // Caller is the bridge-style manager which knows its own base stylesheet URL;\r\n // we only want chunk styles in the registry, not the main bridge CSS the\r\n // owner loads explicitly.\r\n configureExclusion(getExcludedBaseUrl: () => string): void {\r\n this.getExcludedBaseUrl = getExcludedBaseUrl;\r\n }\r\n\r\n watch(onUrl: BridgeAssetUrlListener): () => void {\r\n this.ensureObserving();\r\n this.listeners.add(onUrl);\r\n for (const url of this.urls) {\r\n onUrl(url);\r\n }\r\n return () => {\r\n this.listeners.delete(onUrl);\r\n };\r\n }\r\n\r\n removeHeadLinksForKnownUrls(): void {\r\n if (this.urls.size === 0) {\r\n return;\r\n }\r\n\r\n const candidates = Array.from(\r\n document.head.querySelectorAll('link[rel=\"stylesheet\"]')\r\n );\r\n for (const link of candidates) {\r\n if (link.href && this.urls.has(link.href)) {\r\n link.remove();\r\n }\r\n }\r\n }\r\n\r\n private ensureObserving(): void {\r\n if (this.observing) {\r\n return;\r\n }\r\n this.observing = true;\r\n this.scanHead();\r\n\r\n if (typeof MutationObserver === 'undefined') {\r\n return;\r\n }\r\n\r\n this.observer = new MutationObserver(() => this.scanHead());\r\n this.observer.observe(document.head, { childList: true });\r\n }\r\n\r\n private scanHead(): void {\r\n const links = document.head.querySelectorAll('link[rel=\"stylesheet\"]');\r\n const excludedBaseUrl = this.getExcludedBaseUrl();\r\n\r\n for (const link of Array.from(links)) {\r\n if (!link.href) {\r\n continue;\r\n }\r\n if (!link.href.includes('/au2/assets/')) {\r\n continue;\r\n }\r\n if (link.href === excludedBaseUrl) {\r\n continue;\r\n }\r\n if (this.urls.has(link.href)) {\r\n continue;\r\n }\r\n\r\n this.urls.add(link.href);\r\n this.notify(link.href);\r\n }\r\n }\r\n\r\n private notify(url: string): void {\r\n for (const listener of this.listeners) {\r\n listener(url);\r\n }\r\n }\r\n}\r\n\r\nconst bridgeAssetStyleRegistry = new BridgeAssetStyleRegistry();\r\n\r\n/**\r\n * Read-only view over the module-scope caches. Re-exported via aliases on\r\n * `Au2Render` so the existing jest spec, which reaches into the class via\r\n * `(Au2Render as any).bridgeStyleLoadPromises.clear()` between tests, keeps\r\n * resetting the same underlying Map references.\r\n */\r\nexport const bridgeStyleCaches = {\r\n loadPromises: bridgeStyleLoadPromises,\r\n textPromises: bridgeStyleTextPromises,\r\n constructableStyleSheetPromises: bridgeConstructableStyleSheetPromises,\r\n shadowRootStyleUrls,\r\n discoveredAssetStyleUrls: bridgeAssetStyleRegistry.urls,\r\n};\r\n\r\nexport interface BridgeStyleManagerOptions {\r\n getStylesUrl: () => string | undefined;\r\n getMountRoot: () => ParentNode;\r\n}\r\n\r\nexport class BridgeStyleManager {\r\n // Held so detach() can tear down the per-instance subscription when the\r\n // owning Au2Render unmounts. Without this, the registry would keep firing\r\n // applies against a dead shadow root.\r\n private unsubscribeAssetStyles: (() => void) | null = null;\r\n\r\n constructor(private readonly opts: BridgeStyleManagerOptions) {}\r\n\r\n async ensureBridgeStylesLoaded(shouldAbort: () => boolean): Promise {\r\n const stylesUrl = this.opts.getStylesUrl();\r\n if (!stylesUrl) {\r\n return;\r\n }\r\n\r\n const mountRoot = this.opts.getMountRoot();\r\n const normalizedUrl = new URL(stylesUrl, window.location.href).toString();\r\n\r\n if (mountRoot instanceof ShadowRoot) {\r\n try {\r\n await this.applyBridgeStylesheetToShadowRoot(mountRoot, normalizedUrl, shouldAbort);\r\n } catch (error) {\r\n console.warn(`[au2-render] Failed to load bridge stylesheet '${normalizedUrl}'.`, error);\r\n }\r\n return;\r\n }\r\n\r\n const existingPromise = bridgeStyleLoadPromises.get(normalizedUrl);\r\n\r\n if (existingPromise) {\r\n await existingPromise;\r\n return;\r\n }\r\n\r\n const loadPromise = loadBridgeStylesheetLink(mountRoot, normalizedUrl).catch((error) => {\r\n bridgeStyleLoadPromises.delete(normalizedUrl);\r\n throw error;\r\n });\r\n\r\n bridgeStyleLoadPromises.set(normalizedUrl, loadPromise);\r\n\r\n try {\r\n await loadPromise;\r\n } catch (error) {\r\n console.warn(`[au2-render] Failed to load bridge stylesheet '${normalizedUrl}'.`, error);\r\n }\r\n }\r\n\r\n async mirrorLoadedBridgeAssetStyles(shouldAbort: () => boolean): Promise {\r\n const mountRoot = this.opts.getMountRoot();\r\n if (!(mountRoot instanceof ShadowRoot)) {\r\n return;\r\n }\r\n\r\n bridgeAssetStyleRegistry.configureExclusion(() => {\r\n const stylesUrl = this.opts.getStylesUrl();\r\n return stylesUrl ? new URL(stylesUrl, window.location.href).toString() : '';\r\n });\r\n\r\n // Drop any previous subscription before opening a new one — guards against\r\n // a remount on the same instance leaving the old listener attached to a\r\n // stale shadow root.\r\n this.unsubscribeAssetStyles?.();\r\n\r\n const pendingApplies: Promise[] = [];\r\n this.unsubscribeAssetStyles = bridgeAssetStyleRegistry.watch((url) => {\r\n if (shouldAbort()) {\r\n return;\r\n }\r\n\r\n pendingApplies.push(\r\n this.applyBridgeStylesheetToShadowRoot(mountRoot, url, shouldAbort).catch((error) => {\r\n console.warn(`[au2-render] Failed to mirror bridge stylesheet '${url}'.`, error);\r\n })\r\n );\r\n });\r\n\r\n await Promise.all(pendingApplies);\r\n\r\n // If we became stale mid-mirror, leave the head s in place so a\r\n // subsequent mount can discover them. Removing them on a dead mount would\r\n // orphan the styles for the next mount.\r\n if (shouldAbort()) {\r\n return;\r\n }\r\n\r\n bridgeAssetStyleRegistry.removeHeadLinksForKnownUrls();\r\n }\r\n\r\n detach(): void {\r\n this.unsubscribeAssetStyles?.();\r\n this.unsubscribeAssetStyles = null;\r\n }\r\n\r\n private async applyBridgeStylesheetToShadowRoot(\r\n shadowRoot: ShadowRoot,\r\n url: string,\r\n shouldAbort: () => boolean\r\n ): Promise {\r\n const appliedStyleUrls = getShadowRootStyleUrls(shadowRoot);\r\n if (appliedStyleUrls.has(url)) {\r\n return;\r\n }\r\n\r\n try {\r\n const stylesheet = await getConstructableBridgeStylesheet(url);\r\n if (shouldAbort()) {\r\n return;\r\n }\r\n if (stylesheet && canAdoptStylesheets(shadowRoot)) {\r\n const shadowRootWithStylesheets = shadowRoot as ShadowRoot & { adoptedStyleSheets: CSSStyleSheet[] };\r\n if (!shadowRootWithStylesheets.adoptedStyleSheets.includes(stylesheet)) {\r\n shadowRootWithStylesheets.adoptedStyleSheets = [\r\n ...shadowRootWithStylesheets.adoptedStyleSheets,\r\n stylesheet,\r\n ];\r\n }\r\n appliedStyleUrls.add(url);\r\n return;\r\n }\r\n\r\n const cssText = await fetchBridgeStylesheetText(url);\r\n if (shouldAbort()) {\r\n return;\r\n }\r\n const existingStyle = Array.from(shadowRoot.querySelectorAll('style[data-au2-bridge-style=\"true\"]')).find(\r\n (candidate) => (candidate as HTMLStyleElement).dataset.au2StyleUrl === url\r\n ) as HTMLStyleElement | undefined;\r\n const style = existingStyle ?? document.createElement('style');\r\n style.textContent = cssText;\r\n style.setAttribute('data-au2-bridge-style', 'true');\r\n style.dataset.au2StyleUrl = url;\r\n\r\n if (!existingStyle) {\r\n shadowRoot.insertBefore(style, shadowRoot.firstChild);\r\n }\r\n\r\n appliedStyleUrls.add(url);\r\n } catch (error) {\r\n if (shouldAbort()) {\r\n return;\r\n }\r\n try {\r\n await loadBridgeStylesheetLink(shadowRoot, url);\r\n if (shouldAbort()) {\r\n return;\r\n }\r\n appliedStyleUrls.add(url);\r\n } catch {\r\n throw error;\r\n }\r\n }\r\n }\r\n\r\n}\r\n\r\nfunction loadBridgeStylesheetLink(targetRoot: ParentNode, url: string): Promise {\r\n const queryRoot = targetRoot instanceof ShadowRoot ? targetRoot : document.head;\r\n const appendRoot = targetRoot instanceof ShadowRoot ? targetRoot : document.head;\r\n\r\n const existingLink = Array.from(queryRoot.querySelectorAll('link[data-au2-bridge-style=\"true\"]')).find(\r\n (candidate) => (candidate as HTMLLinkElement).href === url\r\n ) as HTMLLinkElement | undefined;\r\n\r\n const link = existingLink ?? document.createElement('link');\r\n if (!existingLink) {\r\n link.rel = 'stylesheet';\r\n link.href = url;\r\n link.setAttribute('data-au2-bridge-style', 'true');\r\n }\r\n\r\n if (link.getAttribute('data-au2-loaded') === 'true' || !!link.sheet) {\r\n link.setAttribute('data-au2-loaded', 'true');\r\n return Promise.resolve();\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n const onLoad = (): void => {\r\n cleanup();\r\n link.setAttribute('data-au2-loaded', 'true');\r\n resolve();\r\n };\r\n\r\n const onError = (): void => {\r\n cleanup();\r\n reject(new Error(`Could not load stylesheet ${url}`));\r\n };\r\n\r\n const cleanup = (): void => {\r\n link.removeEventListener('load', onLoad);\r\n link.removeEventListener('error', onError);\r\n };\r\n\r\n link.addEventListener('load', onLoad);\r\n link.addEventListener('error', onError);\r\n\r\n if (!existingLink) {\r\n appendRoot.appendChild(link);\r\n }\r\n });\r\n}\r\n\r\nfunction getShadowRootStyleUrls(shadowRoot: ShadowRoot): Set {\r\n let urls = shadowRootStyleUrls.get(shadowRoot);\r\n if (!urls) {\r\n urls = new Set();\r\n shadowRootStyleUrls.set(shadowRoot, urls);\r\n }\r\n\r\n return urls;\r\n}\r\n\r\nfunction canAdoptStylesheets(shadowRoot: ShadowRoot): boolean {\r\n return 'adoptedStyleSheets' in shadowRoot &&\r\n typeof CSSStyleSheet !== 'undefined' &&\r\n typeof (CSSStyleSheet.prototype as CSSStyleSheet & { replace?: unknown }).replace === 'function';\r\n}\r\n\r\nfunction getConstructableBridgeStylesheet(url: string): Promise {\r\n if (typeof CSSStyleSheet === 'undefined' ||\r\n typeof (CSSStyleSheet.prototype as CSSStyleSheet & { replace?: unknown }).replace !== 'function') {\r\n return Promise.resolve(null);\r\n }\r\n\r\n const existingPromise = bridgeConstructableStyleSheetPromises.get(url);\r\n if (existingPromise) {\r\n return existingPromise;\r\n }\r\n\r\n const promise = fetchBridgeStylesheetText(url)\r\n .then(async (cssText) => {\r\n const stylesheet = new CSSStyleSheet();\r\n await (stylesheet as CSSStyleSheet & {\r\n replace: (text: string) => Promise;\r\n }).replace(cssText);\r\n return stylesheet;\r\n })\r\n .catch((error) => {\r\n bridgeConstructableStyleSheetPromises.delete(url);\r\n throw error;\r\n });\r\n\r\n bridgeConstructableStyleSheetPromises.set(url, promise);\r\n return promise;\r\n}\r\n\r\nfunction fetchBridgeStylesheetText(url: string): Promise {\r\n const existingPromise = bridgeStyleTextPromises.get(url);\r\n if (existingPromise) {\r\n return existingPromise;\r\n }\r\n\r\n const promise = fetch(url, { credentials: 'same-origin' })\r\n .then(async (response) => {\r\n if (!response.ok) {\r\n throw new Error(`Could not fetch stylesheet ${url}: ${response.status}`);\r\n }\r\n\r\n return rebaseRelativeCssUrls(await response.text(), url);\r\n })\r\n .catch((error) => {\r\n bridgeStyleTextPromises.delete(url);\r\n throw error;\r\n });\r\n\r\n bridgeStyleTextPromises.set(url, promise);\r\n return promise;\r\n}\r\n\r\nfunction rebaseRelativeCssUrls(cssText: string, stylesheetUrl: string): string {\r\n return cssText.replace(\r\n /url\\(\\s*(['\"]?)(?!data:|https?:|\\/\\/|#|\\/)([^'\")]+)\\1\\s*\\)/gi,\r\n (_match, _quote, relativeUrl: string) => {\r\n const absoluteUrl = new URL(relativeUrl.trim(), stylesheetUrl).toString();\r\n return `url(\"${absoluteUrl}\")`;\r\n }\r\n );\r\n}\r\n","/**\r\n * Projection handling for the Au2 bridge.\r\n *\r\n * Aurelia 2 components rendered through `` typically live inside a\r\n * shadow root, so the Aurelia 1 wrapper's child nodes need to be moved into\r\n * matching `data-au2-projection-target` elements after enhance resolves. The\r\n * `ProjectionManager` tracks the original DOM home of every projected node so\r\n * detach can restore the wrapper to its pre-mount shape — this is what lets\r\n * Aurelia 1 keep ownership of the host element while Aurelia 2 owns whatever\r\n * is inside the bridge container.\r\n */\r\n\r\ninterface ProjectionHome {\r\n parent: Node;\r\n nextSibling: Node | null;\r\n}\r\n\r\nexport interface ProjectionManagerOptions {\r\n hostElement: HTMLElement;\r\n // Resolved lazily — the projection manager outlives any single mount and the\r\n // container can be created and torn down repeatedly.\r\n getContainer: () => HTMLElement | null;\r\n // The Au1 template binds its hidden `` wrapper to the owner via\r\n // `ref=\"projectionContainer\"`, so the owner is the source of truth for that\r\n // element. The manager defers to it through these callbacks and only falls\r\n // back to creating one when the template-bound wrapper is missing.\r\n getProjectionContainer: () => HTMLDivElement | null;\r\n setProjectionContainer: (container: HTMLDivElement | null) => void;\r\n getComponentName: () => string;\r\n}\r\n\r\nexport class ProjectionManager {\r\n private projectedNodeHomes = new WeakMap();\r\n\r\n constructor(private readonly opts: ProjectionManagerOptions) {}\r\n\r\n getProjectedNodes(): Node[] {\r\n this.parkProjectedNodes();\r\n const projectionSource = this.opts.getProjectionContainer() ?? this.opts.hostElement;\r\n if (!projectionSource) {\r\n return [];\r\n }\r\n\r\n return Array.from(projectionSource.childNodes).filter((node) => isProjectableNode(node));\r\n }\r\n\r\n projectProjectedNodes(nodes: Node[]): void {\r\n const container = this.opts.getContainer();\r\n if (!container || nodes.length === 0) {\r\n return;\r\n }\r\n\r\n const slottedNodes = new Map();\r\n\r\n for (const node of nodes) {\r\n if (node.nodeType === Node.ELEMENT_NODE && (node as HTMLElement).hasAttribute('data-au2-slot')) {\r\n const slotWrapper = node as HTMLElement;\r\n const slotName = slotWrapper.getAttribute('data-au2-slot') || 'default';\r\n const slotNodes = Array.from(slotWrapper.childNodes).filter((childNode) => isProjectableNode(childNode));\r\n\r\n if (slotNodes.length === 0) {\r\n continue;\r\n }\r\n\r\n const bucket = slottedNodes.get(slotName) ?? [];\r\n for (const slotNode of slotNodes) {\r\n this.rememberProjectionHome(slotNode);\r\n }\r\n bucket.push(...slotNodes);\r\n slottedNodes.set(slotName, bucket);\r\n continue;\r\n }\r\n\r\n const bucket = slottedNodes.get('default') ?? [];\r\n this.rememberProjectionHome(node);\r\n bucket.push(node);\r\n slottedNodes.set('default', bucket);\r\n }\r\n\r\n for (const [slotName, slotNodes] of slottedNodes.entries()) {\r\n const target = this.findProjectionTarget(container, slotName);\r\n if (!target) {\r\n const slotLabel = slotName === 'default' ? 'default slot' : `slot '${slotName}'`;\r\n console.error(\r\n `[au2-render] Projection target for ${slotLabel} not found for component '${this.opts.getComponentName()}'. ` +\r\n 'Ensure the Au2 template defines data-au2-projection-target for every projected slot.'\r\n );\r\n continue;\r\n }\r\n\r\n for (const node of slotNodes) {\r\n target.appendChild(node);\r\n }\r\n }\r\n }\r\n\r\n restoreProjectedNodes(): void {\r\n const container = this.opts.getContainer();\r\n if (!container) {\r\n return;\r\n }\r\n\r\n const projectionContainer = this.opts.getProjectionContainer();\r\n for (const target of Array.from(container.querySelectorAll('[data-au2-projection-target]'))) {\r\n const nodes = Array.from(target.childNodes).filter((node) => isProjectableNode(node));\r\n for (const node of nodes) {\r\n const home = this.projectedNodeHomes.get(node) ?? {\r\n parent: projectionContainer ?? this.opts.hostElement,\r\n nextSibling: null,\r\n };\r\n const nextSibling = home.nextSibling && home.nextSibling.parentNode === home.parent\r\n ? home.nextSibling\r\n : null;\r\n home.parent.insertBefore(node, nextSibling);\r\n }\r\n }\r\n }\r\n\r\n private parkProjectedNodes(): void {\r\n const hostElement = this.opts.hostElement;\r\n let projectionContainer = this.opts.getProjectionContainer();\r\n const projectableNodes = Array.from(hostElement.childNodes).filter((node) => {\r\n return node !== projectionContainer && isProjectableNode(node);\r\n });\r\n\r\n if (!projectionContainer && projectableNodes.length > 0) {\r\n projectionContainer = document.createElement('div');\r\n projectionContainer.hidden = true;\r\n projectionContainer.setAttribute('data-au2-projection-source', 'true');\r\n hostElement.appendChild(projectionContainer);\r\n this.opts.setProjectionContainer(projectionContainer);\r\n }\r\n\r\n if (!projectionContainer) {\r\n return;\r\n }\r\n\r\n for (const node of projectableNodes) {\r\n projectionContainer.appendChild(node);\r\n }\r\n }\r\n\r\n private findProjectionTarget(container: HTMLElement, slotName: string): Element | null {\r\n if (slotName !== 'default') {\r\n return container.querySelector(`[data-au2-projection-target=\"${slotName}\"]`);\r\n }\r\n\r\n return (\r\n container.querySelector('[data-au2-projection-target=\"default\"]') ??\r\n Array.from(container.querySelectorAll('[data-au2-projection-target]')).find((candidate) => {\r\n const targetName = candidate.getAttribute('data-au2-projection-target');\r\n return targetName === '' || targetName === 'default' || targetName === null;\r\n }) ??\r\n null\r\n );\r\n }\r\n\r\n private rememberProjectionHome(node: Node): void {\r\n if (this.projectedNodeHomes.has(node)) {\r\n return;\r\n }\r\n\r\n this.projectedNodeHomes.set(node, {\r\n parent: node.parentNode ?? this.opts.getProjectionContainer() ?? this.opts.hostElement,\r\n nextSibling: node.nextSibling,\r\n });\r\n }\r\n}\r\n\r\nfunction isProjectableNode(node: Node): boolean {\r\n if (node.nodeType === Node.COMMENT_NODE) {\r\n return false;\r\n }\r\n\r\n if (node.nodeType === Node.TEXT_NODE) {\r\n return (node.textContent?.trim().length ?? 0) > 0;\r\n }\r\n\r\n return true;\r\n}\r\n","/**\r\n * Bridge script loader and Au2 API ready-state coordination.\r\n *\r\n * Two responsibilities split across this module:\r\n *\r\n * 1. **One-shot script load** — `/au2/index.js` is fetched exactly once per\r\n * page, no matter how many `` instances exist. The promise\r\n * lives in a module-scope holder so multiple instances share it.\r\n * 2. **Per-instance ready-wait** — `BridgeApiWaiter` owns the timeout, the\r\n * `au2-ready` listener, and the resolver so a single host's detach can\r\n * tear those down without affecting other live waiters.\r\n *\r\n * The script-load holder is reachable from `Au2Render.bridgeScriptLoadPromise`\r\n * via static accessors so the existing jest spec, which clears it via\r\n * `(Au2Render as any).bridgeScriptLoadPromise = null` between tests, still\r\n * resets the same underlying cell that `loadBridgeScript` reads.\r\n */\r\n\r\nconst READY_EVENT_NAME = 'au2-ready';\r\nconst READY_TIMEOUT_MS = 15000;\r\nconst BRIDGE_UNAVAILABLE_EVENT_NAME = 'au2-bridge-unavailable';\r\n// Two retries after the first attempt covers the common case of a transient\r\n// CDN/network blip without pushing total time past the ready-wait budget.\r\nconst BRIDGE_SCRIPT_RETRY_DELAYS_MS = [500, 1500] as const;\r\n\r\n/**\r\n * Result from enhancing a DOM element with an Au2 component.\r\n */\r\nexport interface EnhanceResult {\r\n aurelia: any;\r\n context: Record;\r\n dispose: () => void;\r\n updateProp: (key: string, value: unknown) => void;\r\n updateProps: (props: Record) => void;\r\n}\r\n\r\n/**\r\n * Global Au2 API contract (set by iadviser-v2/src/enhance.ts).\r\n */\r\nexport interface Au2EnhanceAPI {\r\n enhance: (\r\n host: HTMLElement,\r\n componentName: string,\r\n data: Record\r\n ) => Promise;\r\n hasComponent: (name: string) => boolean;\r\n getComponentNames: () => string[];\r\n getComponentMetadata?: (name: string) => Promise>;\r\n stylesUrl?: string;\r\n}\r\n\r\ndeclare global {\r\n interface Window {\r\n au2?: Au2EnhanceAPI;\r\n __au2BridgeEnabled?: boolean;\r\n __au2BridgeScriptUrl?: string;\r\n }\r\n}\r\n\r\nexport const bridgeScriptState = {\r\n loadPromise: null as Promise | null,\r\n};\r\n\r\nexport function isAu2ApiReady(api: Au2EnhanceAPI | undefined): api is Au2EnhanceAPI {\r\n return !!api &&\r\n typeof api.enhance === 'function' &&\r\n typeof api.hasComponent === 'function' &&\r\n typeof api.getComponentNames === 'function';\r\n}\r\n\r\nexport function loadBridgeScript(): Promise {\r\n if (bridgeScriptState.loadPromise) {\r\n return bridgeScriptState.loadPromise;\r\n }\r\n\r\n bridgeScriptState.loadPromise = attemptLoadBridgeScript(0).catch((error) => {\r\n // Drop the cached failure so a future call (e.g., user navigating, or a\r\n // host page choosing to retry after surfacing the unavailable event) can\r\n // restart the load chain from scratch.\r\n bridgeScriptState.loadPromise = null;\r\n dispatchBridgeUnavailable(error);\r\n throw error;\r\n });\r\n\r\n return bridgeScriptState.loadPromise;\r\n}\r\n\r\nasync function attemptLoadBridgeScript(attempt: number): Promise {\r\n try {\r\n await loadBridgeScriptOnce();\r\n } catch (error) {\r\n if (attempt >= BRIDGE_SCRIPT_RETRY_DELAYS_MS.length) {\r\n throw error;\r\n }\r\n\r\n const delay = BRIDGE_SCRIPT_RETRY_DELAYS_MS[attempt];\r\n console.warn(\r\n `[au2-render] Bridge script load failed (attempt ${attempt + 1} of ${BRIDGE_SCRIPT_RETRY_DELAYS_MS.length + 1}); retrying in ${delay}ms.`,\r\n error\r\n );\r\n await new Promise((resolve) => setTimeout(resolve, delay));\r\n return attemptLoadBridgeScript(attempt + 1);\r\n }\r\n}\r\n\r\nfunction loadBridgeScriptOnce(): Promise {\r\n const scriptUrl = window.__au2BridgeScriptUrl ?? '/au2/index.js';\r\n let existingScript = document.querySelector(\r\n 'script[data-au2-bridge-script=\"true\"]'\r\n );\r\n\r\n if (existingScript?.getAttribute('data-au2-loaded') === 'true') {\r\n return Promise.resolve();\r\n }\r\n\r\n // A leftover script from a previous failed attempt can't recover via re-load\r\n // event — the browser already finished resolving it. Drop it so the retry\r\n // gets a fresh fetch.\r\n if (existingScript?.getAttribute('data-au2-failed') === 'true') {\r\n existingScript.remove();\r\n existingScript = null;\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n const script = existingScript ?? document.createElement('script');\r\n const cleanup = (): void => {\r\n script.removeEventListener('load', onLoad);\r\n script.removeEventListener('error', onError);\r\n };\r\n const onLoad = (): void => {\r\n cleanup();\r\n script.setAttribute('data-au2-loaded', 'true');\r\n resolve();\r\n };\r\n const onError = (): void => {\r\n cleanup();\r\n script.setAttribute('data-au2-failed', 'true');\r\n reject(new Error(`Could not load Au2 bridge script ${scriptUrl}`));\r\n };\r\n\r\n script.addEventListener('load', onLoad);\r\n script.addEventListener('error', onError);\r\n\r\n if (!existingScript) {\r\n script.type = 'module';\r\n script.src = scriptUrl;\r\n script.setAttribute('data-au2-bridge-script', 'true');\r\n document.head.appendChild(script);\r\n }\r\n });\r\n}\r\n\r\nfunction dispatchBridgeUnavailable(error: unknown): void {\r\n try {\r\n window.dispatchEvent(\r\n new CustomEvent(BRIDGE_UNAVAILABLE_EVENT_NAME, {\r\n bubbles: false,\r\n cancelable: false,\r\n detail: { error },\r\n })\r\n );\r\n } catch (dispatchError) {\r\n console.warn('[au2-render] Failed to dispatch au2-bridge-unavailable event:', dispatchError);\r\n }\r\n}\r\n\r\nexport interface BridgeApiWaiterOptions {\r\n // Returns true when the owner has been detached — used so a long-running\r\n // wait resolves to null instead of leaking a pending listener/timeout past\r\n // the owner's lifetime.\r\n isOwnerDestroyed: () => boolean;\r\n}\r\n\r\nexport class BridgeApiWaiter {\r\n private readyPromise: Promise | null = null;\r\n private readyResolver: ((api: Au2EnhanceAPI | null) => void) | null = null;\r\n private readyEventHandler: (() => void) | null = null;\r\n private readyTimeoutId: number | null = null;\r\n\r\n constructor(private readonly opts: BridgeApiWaiterOptions) {}\r\n\r\n /**\r\n * Resolves with the Au2 bridge API if it becomes ready before the timeout,\r\n * or `null` if the bridge is disabled or the owner is detached. Reuses any\r\n * pending wait so concurrent calls share the same listener.\r\n */\r\n ensureReady(): Promise {\r\n if (isAu2ApiReady(window.au2)) {\r\n return Promise.resolve(window.au2);\r\n }\r\n\r\n if (window.__au2BridgeEnabled === false) {\r\n console.error('[au2-render] Au2 bridge support is disabled for this page.');\r\n return Promise.resolve(null);\r\n }\r\n\r\n return this.waitForApi();\r\n }\r\n\r\n /**\r\n * Aborts any in-flight wait and resolves outstanding callers with null.\r\n * Called when the owner detaches.\r\n */\r\n cancel(): void {\r\n this.finalize(null);\r\n }\r\n\r\n private waitForApi(): Promise {\r\n if (isAu2ApiReady(window.au2)) {\r\n return Promise.resolve(window.au2);\r\n }\r\n\r\n if (this.readyPromise) {\r\n return this.readyPromise;\r\n }\r\n\r\n this.readyPromise = new Promise((resolve) => {\r\n this.readyResolver = resolve;\r\n\r\n const resolveIfReady = (): void => {\r\n if (this.opts.isOwnerDestroyed()) {\r\n this.finalize(null);\r\n return;\r\n }\r\n\r\n if (isAu2ApiReady(window.au2)) {\r\n this.finalize(window.au2);\r\n }\r\n };\r\n\r\n this.readyEventHandler = () => {\r\n resolveIfReady();\r\n };\r\n\r\n window.addEventListener(READY_EVENT_NAME, this.readyEventHandler);\r\n\r\n this.readyTimeoutId = window.setTimeout(() => {\r\n console.error('[au2-render] Timed out waiting for Au2 bridge API.');\r\n this.finalize(null);\r\n }, READY_TIMEOUT_MS);\r\n\r\n // Re-check after the script load resolves: the bridge body runs (and\r\n // dispatches au2-ready) before the script's load event fires, so if we\r\n // attached our listener after that point we'd miss the event entirely.\r\n loadBridgeScript()\r\n .then(resolveIfReady)\r\n .catch((error) => {\r\n console.error('[au2-render] Failed to load Au2 bridge bundle:', error);\r\n this.finalize(null);\r\n });\r\n\r\n // Catch the case where the API became ready between the outer ready\r\n // check and our listener attaching above.\r\n resolveIfReady();\r\n });\r\n\r\n return this.readyPromise;\r\n }\r\n\r\n private finalize(api: Au2EnhanceAPI | null): void {\r\n const resolver = this.readyResolver;\r\n this.readyResolver = null;\r\n this.clearWaiters();\r\n this.readyPromise = null;\r\n\r\n if (resolver) {\r\n resolver(api);\r\n }\r\n }\r\n\r\n private clearWaiters(): void {\r\n if (this.readyEventHandler) {\r\n window.removeEventListener(READY_EVENT_NAME, this.readyEventHandler);\r\n this.readyEventHandler = null;\r\n }\r\n\r\n if (this.readyTimeoutId !== null) {\r\n window.clearTimeout(this.readyTimeoutId);\r\n this.readyTimeoutId = null;\r\n }\r\n }\r\n}\r\n","import { customElement, bindable, bindingMode, TaskQueue, DOM } from 'aurelia-framework';\r\nimport { BridgeStyleManager, bridgeStyleCaches } from './bridge-styles';\r\nimport { ProjectionManager } from './bridge-projection';\r\nimport { BridgeApiWaiter, bridgeScriptState, isAu2ApiReady, type EnhanceResult } from './bridge-api-loader';\r\n\r\n/**\r\n * Bridge component that renders Aurelia 2 components inside Aurelia 1.\r\n *\r\n * The Au2 bundle must be loaded before this component is used. The bundle\r\n * sets up `window.au2.enhance()` which this component calls to mount Au2\r\n * components.\r\n *\r\n * @example\r\n * \r\n * \r\n */\r\n@customElement('au2-render')\r\nexport class Au2Render {\r\n static inject = [Element, TaskQueue];\r\n // Aliases preserved so the existing jest spec — which clears caches via\r\n // `(Au2Render as any).bridgeStyleLoadPromises.clear()` and assigns\r\n // `(Au2Render as any).bridgeScriptLoadPromise = null` between tests — keeps\r\n // resetting the same underlying state that the helper modules use.\r\n private static readonly bridgeStyleLoadPromises = bridgeStyleCaches.loadPromises;\r\n private static readonly bridgeStyleTextPromises = bridgeStyleCaches.textPromises;\r\n private static readonly bridgeConstructableStyleSheetPromises = bridgeStyleCaches.constructableStyleSheetPromises;\r\n private static readonly discoveredBridgeAssetStyleUrls = bridgeStyleCaches.discoveredAssetStyleUrls;\r\n private static get bridgeScriptLoadPromise(): Promise | null { return bridgeScriptState.loadPromise; }\r\n private static set bridgeScriptLoadPromise(value: Promise | null) { bridgeScriptState.loadPromise = value; }\r\n\r\n @bindable componentName: string = '';\r\n @bindable({ defaultBindingMode: bindingMode.twoWay }) props: Record = {};\r\n @bindable containerClass: string = '';\r\n\r\n private container: HTMLDivElement | null = null;\r\n // Bound by the Au1 view via `ref=\"projectionContainer\"` so this view-model\r\n // field is the source of truth for the hidden `` wrapper that Au1\r\n // distributes the host's children into. ProjectionManager reads/writes this\r\n // through opts callbacks instead of owning its own copy.\r\n private projectionContainer: HTMLDivElement | null = null;\r\n private enhanceResult: EnhanceResult | null = null;\r\n private isDestroyed = false;\r\n private hasAttached = false;\r\n private mountGeneration = 0;\r\n private boundEventHandler: ((event: Event) => void) | null = null;\r\n private mountRoot: ParentNode | null = null;\r\n private pendingProps: Record | null = null;\r\n private lastSyncedProps: Record | null = null;\r\n private readonly bridgeStyles: BridgeStyleManager;\r\n private readonly projection: ProjectionManager;\r\n private readonly apiWaiter: BridgeApiWaiter;\r\n\r\n constructor(\r\n private element: Element,\r\n private taskQueue: TaskQueue\r\n ) {\r\n this.bridgeStyles = new BridgeStyleManager({\r\n getStylesUrl: () => window.au2?.stylesUrl,\r\n getMountRoot: () => this.getMountRoot(),\r\n });\r\n this.projection = new ProjectionManager({\r\n hostElement: this.element as HTMLElement,\r\n getContainer: () => this.container,\r\n getProjectionContainer: () => this.projectionContainer,\r\n setProjectionContainer: (container) => { this.projectionContainer = container; },\r\n getComponentName: () => this.componentName,\r\n });\r\n this.apiWaiter = new BridgeApiWaiter({\r\n isOwnerDestroyed: () => this.isDestroyed,\r\n });\r\n }\r\n\r\n async attached(): Promise {\r\n this.isDestroyed = false;\r\n this.hasAttached = true;\r\n\r\n if (!this.componentName) {\r\n console.warn('[au2-render] No component-name specified');\r\n return;\r\n }\r\n\r\n await this.mountWhenReady();\r\n }\r\n\r\n detached(): void {\r\n this.isDestroyed = true;\r\n this.hasAttached = false;\r\n this.apiWaiter.cancel();\r\n this.cleanup();\r\n }\r\n\r\n componentNameChanged(newValue: string, oldValue: string): void {\r\n if (!newValue || this.isDestroyed || !this.hasAttached) {\r\n return;\r\n }\r\n\r\n if (!oldValue && (this.enhanceResult || this.container)) {\r\n return;\r\n }\r\n\r\n if (newValue !== oldValue) {\r\n this.cleanup();\r\n this.taskQueue.queueMicroTask(() => {\r\n void this.mountWhenReady();\r\n });\r\n }\r\n }\r\n\r\n propsChanged(newProps: Record, _oldProps: Record): void {\r\n if (this.isDestroyed) {\r\n return;\r\n }\r\n\r\n if (this.enhanceResult) {\r\n this.syncPropsToAu2(newProps);\r\n return;\r\n }\r\n\r\n this.pendingProps = this.snapshotProps(newProps);\r\n }\r\n\r\n containerClassChanged(newValue: string): void {\r\n if (this.container) {\r\n this.container.className = newValue || '';\r\n }\r\n }\r\n\r\n /**\r\n * Force-sync current props to the Au2 component.\r\n * Use this after mutating arrays or nested objects where the reference\r\n * hasn't changed and propsChanged won't fire automatically.\r\n */\r\n forceSync(): void {\r\n const props = this.snapshotProps(this.props);\r\n\r\n if (this.enhanceResult) {\r\n this.enhanceResult.updateProps(props);\r\n this.lastSyncedProps = props;\r\n return;\r\n }\r\n\r\n this.pendingProps = props;\r\n }\r\n\r\n private async mountWhenReady(): Promise {\r\n if (this.isDestroyed || !this.componentName) {\r\n return;\r\n }\r\n\r\n // Capture generation at the start so any later detach/remount or\r\n // componentName flip invalidates every async step below in one place,\r\n // rather than having each helper bump its own counter.\r\n const generation = ++this.mountGeneration;\r\n\r\n const api = await this.apiWaiter.ensureReady();\r\n if (!api || this.isStale(generation) || !this.componentName) {\r\n return;\r\n }\r\n\r\n this.getMountRoot();\r\n await this.bridgeStyles.ensureBridgeStylesLoaded(() => this.isStale(generation));\r\n if (this.isStale(generation)) {\r\n return;\r\n }\r\n\r\n await this.mountAu2Component(generation);\r\n }\r\n\r\n private async mountAu2Component(generation: number): Promise {\r\n if (this.isStale(generation) || !isAu2ApiReady(window.au2)) return;\r\n const au2 = window.au2;\r\n const initialProps = this.snapshotProps(this.props);\r\n\r\n try {\r\n if (!au2.hasComponent(this.componentName)) {\r\n console.error(\r\n `[au2-render] Component '${this.componentName}' not found. ` +\r\n `Available: ${au2.getComponentNames().join(', ')}`\r\n );\r\n return;\r\n }\r\n\r\n this.createContainer();\r\n const projectedNodes = this.projection.getProjectedNodes();\r\n this.setupEventListener();\r\n this.dispatchBridgeEvent('au2-mount-start', {\r\n componentName: this.componentName,\r\n });\r\n\r\n // Use the global Au2 API to enhance\r\n const enhanceResult = await au2.enhance(\r\n this.container!,\r\n this.componentName,\r\n initialProps\r\n );\r\n\r\n if (this.isStale(generation) || !this.container) {\r\n try {\r\n enhanceResult.dispose();\r\n } catch (error) {\r\n console.warn('[au2-render] Error disposing stale Au2 app:', error);\r\n }\r\n return;\r\n }\r\n\r\n this.enhanceResult = enhanceResult;\r\n this.lastSyncedProps = initialProps;\r\n this.syncPropsToAu2(this.pendingProps ?? this.snapshotProps(this.props));\r\n this.pendingProps = null;\r\n await this.bridgeStyles.mirrorLoadedBridgeAssetStyles(() => this.isStale(generation));\r\n // mirrorLoadedBridgeAssetStyles awaits; if a detach happened during\r\n // that await, cleanup() has already disposed enhanceResult and removed\r\n // the container. Bail before projecting or dispatching au2-mounted on\r\n // a dead host.\r\n if (this.isStale(generation)) {\r\n return;\r\n }\r\n this.projection.projectProjectedNodes(projectedNodes);\r\n this.taskQueue.queueTask(() => {\r\n if (this.isStale(generation)) {\r\n return;\r\n }\r\n\r\n this.projection.projectProjectedNodes(this.projection.getProjectedNodes());\r\n });\r\n this.dispatchBridgeEvent('au2-mounted', {\r\n componentName: this.componentName,\r\n container: this.container,\r\n });\r\n } catch (error) {\r\n console.error('[au2-render] Failed to mount component:', error);\r\n this.dispatchBridgeEvent('au2-mount-error', {\r\n componentName: this.componentName,\r\n error,\r\n });\r\n if (!this.isStale(generation)) {\r\n this.cleanup();\r\n }\r\n }\r\n }\r\n\r\n private isStale(generation: number): boolean {\r\n return this.isDestroyed || generation !== this.mountGeneration;\r\n }\r\n\r\n private createContainer(): void {\r\n if (this.container) return;\r\n\r\n const mountRoot = this.getMountRoot();\r\n this.container = document.createElement('div');\r\n this.container.setAttribute('data-au2-bridge', 'true');\r\n this.container.setAttribute('data-au2-component', this.componentName);\r\n\r\n if (this.containerClass) {\r\n this.container.className = this.containerClass;\r\n }\r\n\r\n mountRoot.appendChild(this.container);\r\n }\r\n\r\n private syncPropsToAu2(newProps: Record): void {\r\n if (!this.enhanceResult) return;\r\n\r\n // Diff against the last known snapshot we sent to Au2, not against the\r\n // oldProps argument from Aurelia's change handler — the Au2-to-Au1 event\r\n // handler mutates this.props in place, so by the time propsChanged fires\r\n // oldProps already reflects the new value.\r\n const snapshot = this.snapshotProps(newProps);\r\n const baseline = this.lastSyncedProps ?? {};\r\n const changed: Record = {};\r\n let hasChanges = false;\r\n\r\n for (const key of Object.keys(snapshot)) {\r\n if (!Object.is(baseline[key], snapshot[key])) {\r\n changed[key] = snapshot[key];\r\n hasChanges = true;\r\n }\r\n }\r\n\r\n if (!hasChanges) return;\r\n\r\n this.enhanceResult.updateProps(changed);\r\n this.lastSyncedProps = snapshot;\r\n }\r\n\r\n private snapshotProps(props: Record | null | undefined): Record {\r\n if (!props || typeof props !== 'object') {\r\n return {};\r\n }\r\n\r\n return { ...props };\r\n }\r\n\r\n private dispatchBridgeEvent(name: string, detail: Record): void {\r\n const event = DOM.createCustomEvent(name, {\r\n bubbles: true,\r\n cancelable: true,\r\n detail,\r\n });\r\n this.element.dispatchEvent(event);\r\n }\r\n\r\n private setupEventListener(): void {\r\n if (!this.container) return;\r\n\r\n // Defensive: if a prior mount on this instance already bound a handler\r\n // and cleanup hasn't run, detach it before binding a new one so we never\r\n // leak duplicate listeners on the same container.\r\n if (this.boundEventHandler) {\r\n this.container.removeEventListener('au2-prop-change', this.boundEventHandler);\r\n this.boundEventHandler = null;\r\n }\r\n\r\n this.boundEventHandler = (event: Event) => {\r\n if (!this.props || typeof this.props !== 'object') {\r\n this.props = {};\r\n }\r\n\r\n const customEvent = event as CustomEvent;\r\n const { property, value } = customEvent.detail || {};\r\n\r\n if (property && Object.prototype.hasOwnProperty.call(this.props, property)) {\r\n this.props[property] = value;\r\n // Keep the sync baseline aligned so the wrapper writing the same\r\n // value back to its bindable doesn't bounce it back to Au2.\r\n if (this.lastSyncedProps) {\r\n this.lastSyncedProps[property] = value;\r\n }\r\n\r\n const changeEvent = DOM.createCustomEvent('props-changed', {\r\n bubbles: true,\r\n cancelable: true,\r\n detail: { property, value },\r\n });\r\n this.element.dispatchEvent(changeEvent);\r\n }\r\n };\r\n\r\n this.container.addEventListener('au2-prop-change', this.boundEventHandler);\r\n }\r\n\r\n private cleanup(): void {\r\n this.mountGeneration++;\r\n this.bridgeStyles.detach();\r\n this.projection.restoreProjectedNodes();\r\n\r\n if (this.container && this.boundEventHandler) {\r\n this.container.removeEventListener('au2-prop-change', this.boundEventHandler);\r\n this.boundEventHandler = null;\r\n }\r\n\r\n if (this.enhanceResult) {\r\n try {\r\n this.enhanceResult.dispose();\r\n } catch (error) {\r\n console.warn('[au2-render] Error disposing Au2 app:', error);\r\n }\r\n this.enhanceResult = null;\r\n }\r\n\r\n if (this.container && this.container.parentNode) {\r\n this.container.parentNode.removeChild(this.container);\r\n this.container = null;\r\n }\r\n\r\n this.pendingProps = null;\r\n this.lastSyncedProps = null;\r\n this.dispatchBridgeEvent('au2-disposed', {\r\n componentName: this.componentName,\r\n });\r\n }\r\n\r\n private getMountRoot(): ParentNode {\r\n if (this.mountRoot) {\r\n return this.mountRoot;\r\n }\r\n\r\n const hostElement = this.element as HTMLElement;\r\n\r\n if (hostElement && typeof hostElement.attachShadow === 'function') {\r\n this.mountRoot = hostElement.shadowRoot ?? hostElement.attachShadow({ mode: 'open' });\r\n return this.mountRoot;\r\n }\r\n\r\n this.mountRoot = this.element as unknown as ParentNode;\r\n return this.mountRoot;\r\n }\r\n\r\n}\r\n"],"names":["bridgeStyleLoadPromises","Map","bridgeStyleTextPromises","bridgeConstructableStyleSheetPromises","shadowRootStyleUrls","WeakMap","bridgeAssetStyleRegistry","urls","Set","listeners","observer","observing","getExcludedBaseUrl","configureExclusion","this","watch","onUrl","ensureObserving","add","url","delete","removeHeadLinksForKnownUrls","size","candidates","Array","from","document","head","querySelectorAll","link","href","has","remove","scanHead","MutationObserver","observe","childList","links","excludedBaseUrl","includes","notify","listener","bridgeStyleCaches","loadPromises","textPromises","constructableStyleSheetPromises","discoveredAssetStyleUrls","opts","unsubscribeAssetStyles","ensureBridgeStylesLoaded","shouldAbort","Promise","stylesUrl","getStylesUrl","mountRoot","getMountRoot","normalizedUrl","URL","window","location","toString","ShadowRoot","applyBridgeStylesheetToShadowRoot","console","warn","existingPromise","get","loadPromise","loadBridgeStylesheetLink","catch","error","set","mirrorLoadedBridgeAssetStyles","pendingApplies","push","all","detach","shadowRoot","appliedStyleUrls","getShadowRootStyleUrls","getConstructableBridgeStylesheet","stylesheet","CSSStyleSheet","prototype","replace","canAdoptStylesheets","shadowRootWithStylesheets","adoptedStyleSheets","fetchBridgeStylesheetText","cssText","existingStyle","find","candidate","dataset","au2StyleUrl","style","createElement","textContent","setAttribute","insertBefore","firstChild","targetRoot","queryRoot","appendRoot","existingLink","rel","getAttribute","sheet","resolve","reject","onLoad","cleanup","onError","Error","removeEventListener","addEventListener","appendChild","promise","then","fetch","credentials","response","ok","status","rebaseRelativeCssUrls","text","stylesheetUrl","_match","_quote","relativeUrl","absoluteUrl","trim","projectedNodeHomes","getProjectedNodes","parkProjectedNodes","projectionSource","getProjectionContainer","hostElement","childNodes","filter","node","isProjectableNode","projectProjectedNodes","nodes","container","getContainer","length","slottedNodes","nodeType","Node","ELEMENT_NODE","hasAttribute","slotWrapper","slotName","slotNodes","childNode","slotNode","rememberProjectionHome","bucket","entries","target","findProjectionTarget","slotLabel","getComponentName","restoreProjectedNodes","projectionContainer","home","parent","nextSibling","parentNode","projectableNodes","hidden","setProjectionContainer","querySelector","targetName","COMMENT_NODE","TEXT_NODE","READY_EVENT_NAME","BRIDGE_SCRIPT_RETRY_DELAYS_MS","bridgeScriptState","isAu2ApiReady","api","enhance","hasComponent","getComponentNames","loadBridgeScript","attemptLoadBridgeScript","dispatchEvent","CustomEvent","bubbles","cancelable","detail","dispatchError","dispatchBridgeUnavailable","attempt","loadBridgeScriptOnce","setTimeout","scriptUrl","__au2BridgeScriptUrl","existingScript","script","type","src","readyPromise","readyResolver","readyEventHandler","readyTimeoutId","ensureReady","au2","__au2BridgeEnabled","waitForApi","cancel","finalize","resolveIfReady","isOwnerDestroyed","resolver","clearWaiters","clearTimeout","element","taskQueue","componentName","props","containerClass","enhanceResult","isDestroyed","hasAttached","mountGeneration","boundEventHandler","pendingProps","lastSyncedProps","bridgeStyles","BridgeStyleManager","projection","ProjectionManager","apiWaiter","BridgeApiWaiter","value","attached","mountWhenReady","detached","componentNameChanged","newValue","oldValue","queueMicroTask","propsChanged","newProps","_oldProps","syncPropsToAu2","snapshotProps","containerClassChanged","className","forceSync","updateProps","generation","isStale","mountAu2Component","initialProps","createContainer","projectedNodes","setupEventListener","dispatchBridgeEvent","join","dispose","queueTask","snapshot","baseline","changed","hasChanges","Object","keys","key","is","name","event","DOM","createCustomEvent","property","hasOwnProperty","call","changeEvent","removeChild","attachShadow","mode","inject","Element","TaskQueue","discoveredBridgeAssetStyleUrls","bindable","defaultBindingMode","bindingMode","twoWay","Record","customElement","Au2Render"],"sourceRoot":""}