{"mappings":";AAgBA,SAASA,EAAUC,EAAQ,CACvB,GAAI,EAAE,gBAAgBD,GAClB,MAAM,IAAI,MAAM,wDAAwD,EAG5E,GAAI,OAAOC,GAAW,UAAY,CAACC,EAASD,CAAM,EAC9C,MAAM,IAAI,MAAM,iHAAiH,EAGrI,GAAIC,EAASD,CAAM,EAAG,CAClB,IAAME,EAAqB,iBAAkBF,EACvC,CAAC,UAAU,EACX,CAAC,MAAO,QAAS,UAAU,EAEjC,QAAWG,KAAYD,EACnB,GAAI,CAACF,EAAOG,CAAQ,EAChB,MAAM,IAAI,MAAM,qDAAqDA,CAAQ,aAAa,CAGtG,CAEA,IAAIC,EAAK,KACLC,EACAC,EAAe,CAAC,EAChBC,EAEAC,EAAc,CACd,OAAQ,GACR,aAAc,CAAC,EACf,SAAU,CACd,EAEAJ,EAAG,cAAgB,GAEnB,IAAIK,EAAW,GACXC,EAAUC,EAAa,QAAQ,IAAI,EACnCC,EAAUD,EAAa,QAAQ,IAAI,EAElC,WAAW,iBACZC,EACI;AAAA;AAAA;AAAA,gGAGJ,EAGJR,EAAG,KAAO,SAAUS,EAAc,CAAC,EAAG,CAClC,GAAIT,EAAG,cACH,MAAM,IAAI,MAAM,qDAAqD,EAGzEA,EAAG,cAAgB,GAEnBA,EAAG,cAAgB,GAEnBG,EAAkBO,GAAsB,EACxC,IAAIC,EAAW,CAAC,UAAW,UAAW,gBAAgB,EA8BtD,GA5BIA,EAAS,QAAQF,EAAY,OAAO,EAAI,GACxCR,EAAUW,EAAYH,EAAY,OAAO,EAClC,OAAOA,EAAY,SAAY,SACtCR,EAAUQ,EAAY,QAElB,OAAO,SAAW,OAAO,QACzBR,EAAUW,EAAY,SAAS,EAE/BX,EAAUW,EAAY,EAI1B,OAAOH,EAAY,SAAa,MAChCJ,EAAWI,EAAY,UAGvB,OAAOA,EAAY,iBAAqB,MACxCL,EAAY,OAASK,EAAY,kBAGjCA,EAAY,2BACZL,EAAY,SAAWK,EAAY,0BAGnCA,EAAY,SAAW,mBACvBT,EAAG,cAAgB,IAGnBS,EAAY,aACZ,GAAIA,EAAY,eAAiB,SAAWA,EAAY,eAAiB,WACrET,EAAG,aAAeS,EAAY,iBAE9B,MAAM,iCAId,GAAIA,EAAY,KAAM,CAClB,OAAQA,EAAY,KAAM,CACtB,IAAK,WACDT,EAAG,aAAe,OAClB,MACJ,IAAK,WACDA,EAAG,aAAe,iBAClB,MACJ,IAAK,SACDA,EAAG,aAAe,sBAClB,MACJ,QACI,KAAM,wBACd,CACAA,EAAG,KAAOS,EAAY,IAC1B,CAoBA,GAlBIA,EAAY,UAAY,OACxBT,EAAG,SAAWS,EAAY,UAG3BA,EAAY,cACXT,EAAG,YAAcS,EAAY,aAG7BA,EAAY,4BACZT,EAAG,0BAA4BS,EAAY,2BAG3C,OAAOA,EAAY,wBAA2B,UAC9CT,EAAG,uBAAyBS,EAAY,uBAExCT,EAAG,uBAAyB,GAG5B,OAAOS,EAAY,WAAe,IAAa,CAC/C,GAAIA,EAAY,aAAe,QAAUA,EAAY,aAAe,GAChE,MAAM,IAAI,UAAU,mEAAmEA,EAAY,UAAU,GAAG,EAGpHT,EAAG,WAAaS,EAAY,UAChC,MACIT,EAAG,WAAa,OAGhB,OAAOS,EAAY,eAAkB,UACrCT,EAAG,cAAgBS,EAAY,cAE/BT,EAAG,cAAgB,GAGnBS,EAAY,eAAiB,OAC7BT,EAAG,aAAe,OAElBA,EAAG,aAAe,MAGlB,OAAOS,EAAY,OAAU,WAC7BT,EAAG,MAAQS,EAAY,OAGvB,OAAOA,EAAY,WAAc,WACjCT,EAAG,UAAYS,EAAY,WAG3B,OAAOA,EAAY,uBAA0B,UAAYA,EAAY,sBAAwB,EAC7FT,EAAG,sBAAwBS,EAAY,sBAEvCT,EAAG,sBAAwB,IAG1BA,EAAG,eACJA,EAAG,aAAe,YAEjBA,EAAG,eACJA,EAAG,aAAe,OAClBA,EAAG,KAAO,YAGd,IAAIa,EAAUC,EAAc,EAExBC,EAAcD,EAAc,EAChCC,EAAY,QAAQ,KAAK,UAAW,CAChCf,EAAG,SAAWA,EAAG,QAAQA,EAAG,aAAa,EACzCa,EAAQ,WAAWb,EAAG,aAAa,CACvC,CAAC,EAAE,MAAM,SAASgB,EAAO,CACrBH,EAAQ,SAASG,CAAK,CAC1B,CAAC,EAED,IAAIC,EAAgBC,EAAW,EAE/B,SAASC,GAAS,CACd,IAAIC,EAAU,SAASC,EAAQ,CACtBA,IACDC,EAAQ,OAAS,QAGjBb,EAAY,SACZa,EAAQ,OAASb,EAAY,QAEjCT,EAAG,MAAMsB,CAAO,EAAE,KAAK,UAAY,CAC/BP,EAAY,WAAW,CAC3B,CAAC,EAAE,MAAM,SAAUC,EAAO,CACtBD,EAAY,SAASC,CAAK,CAC9B,CAAC,CACL,EAEIO,EAAmB,gBAAiB,CACpC,IAAIC,EAAO,SAAS,cAAc,QAAQ,EACtCC,EAAM,MAAMzB,EAAG,eAAe,CAAC,OAAQ,OAAQ,YAAaA,EAAG,yBAAyB,CAAC,EAC7FwB,EAAK,aAAa,MAAOC,CAAG,EAC5BD,EAAK,aAAa,UAAW,yEAAyE,EACtGA,EAAK,aAAa,QAAS,2BAA2B,EACtDA,EAAK,MAAM,QAAU,OACrB,SAAS,KAAK,YAAYA,CAAI,EAE9B,IAAIE,EAAkB,SAASC,EAAO,CAClC,GAAI,EAAAA,EAAM,SAAW,OAAO,SAAS,QAAUH,EAAK,gBAAkBG,EAAM,QAI5E,KAAIC,EAAQC,EAAcF,EAAM,IAAI,EACpCG,EAAgBF,EAAOb,CAAW,EAElC,SAAS,KAAK,YAAYS,CAAI,EAC9B,OAAO,oBAAoB,UAAWE,CAAe,EACzD,EAEA,OAAO,iBAAiB,UAAWA,CAAe,CACtD,EAEIJ,EAAU,CAAC,EACf,OAAQb,EAAY,OAAQ,CACxB,IAAK,YACGL,EAAY,OACZ2B,EAAsB,EAAE,KAAK,UAAW,CACpCC,EAAiB,EAAE,KAAK,SAAUC,EAAW,CACpCA,EAGDlB,EAAY,WAAW,EAFvBf,EAAG,0BAA4BuB,EAAiB,EAAIH,EAAQ,EAAK,CAIzE,CAAC,EAAE,MAAM,SAAUJ,EAAO,CACtBD,EAAY,SAASC,CAAK,CAC9B,CAAC,CACL,CAAC,EAEDhB,EAAG,0BAA4BuB,EAAiB,EAAIH,EAAQ,EAAK,EAErE,MACJ,IAAK,iBACDA,EAAQ,EAAI,EACZ,MACJ,QACI,KAAM,0BACd,CACJ,CAEA,SAASc,GAAc,CACnB,IAAIC,EAAWN,EAAc,OAAO,SAAS,IAAI,EAMjD,GAJIM,GACA,OAAO,QAAQ,aAAa,OAAO,QAAQ,MAAO,KAAMA,EAAS,MAAM,EAGvEA,GAAYA,EAAS,MACrB,OAAOJ,EAAsB,EAAE,KAAK,UAAW,CAC3CD,EAAgBK,EAAUpB,CAAW,CACzC,CAAC,EAAE,MAAM,SAAUC,EAAO,CACtBD,EAAY,SAASC,CAAK,CAC9B,CAAC,EAGDP,EAAY,OAASA,EAAY,cACjC2B,EAAS3B,EAAY,MAAOA,EAAY,aAAcA,EAAY,OAAO,EAErEL,EAAY,OACZ2B,EAAsB,EAAE,KAAK,UAAW,CACpCC,EAAiB,EAAE,KAAK,SAAUC,EAAW,CACrCA,GACAjC,EAAG,eAAiBA,EAAG,cAAc,EACrCe,EAAY,WAAW,EACvBsB,EAAoB,GAEpBtB,EAAY,WAAW,CAE/B,CAAC,EAAE,MAAM,SAAUC,EAAO,CACtBD,EAAY,SAASC,CAAK,CAC9B,CAAC,CACL,CAAC,EAEDhB,EAAG,YAAY,EAAE,EAAE,KAAK,UAAW,CAC/BA,EAAG,eAAiBA,EAAG,cAAc,EACrCe,EAAY,WAAW,CAC3B,CAAC,EAAE,MAAM,SAASC,EAAO,CACrBhB,EAAG,aAAeA,EAAG,YAAY,EAC7BS,EAAY,OACZU,EAAO,EAEPJ,EAAY,SAASC,CAAK,CAElC,CAAC,GAEEP,EAAY,OACnBU,EAAO,EAEPJ,EAAY,WAAW,CAE/B,CAEA,OAAAE,EAAc,KAAK,UAAY,CAC3BqB,EAAwB,EACnB,KAAKJ,CAAW,EAChB,MAAM,SAAUlB,EAAO,CACpBH,EAAQ,SAASG,CAAK,CAC1B,CAAC,CACT,CAAC,EACDC,EAAc,MAAM,SAAUD,EAAO,CACjCH,EAAQ,SAASG,CAAK,CAC1B,CAAC,EAEMH,EAAQ,OACnB,EAEAb,EAAG,MAAQ,SAAUsB,EAAS,CAC1B,OAAOrB,EAAQ,MAAMqB,CAAO,CAChC,EAEA,SAASiB,EAAmBC,EAAK,CAC7B,GAAI,OAAO,OAAW,KAAe,OAAO,OAAO,gBAAoB,IACnE,MAAM,IAAI,MAAM,kCAAkC,EAGtD,OAAO,OAAO,gBAAgB,IAAI,WAAWA,CAAG,CAAC,CACrD,CAEA,SAASC,EAAqBD,EAAK,CAC/B,OAAOE,EAAqBF,EAAK,gEAAgE,CACrG,CAEA,SAASE,EAAqBF,EAAKG,EAAS,CAGxC,QAFIC,EAAaL,EAAmBC,CAAG,EACnCK,EAAQ,IAAI,MAAML,CAAG,EAChBM,EAAI,EAAGA,EAAIN,EAAKM,IACrBD,EAAMC,CAAC,EAAIH,EAAS,WAAWC,EAAWE,CAAC,EAAIH,EAAS,MAAM,EAElE,OAAO,OAAO,aAAa,MAAM,KAAME,CAAK,CAChD,CAEA,eAAeE,EAAsBC,EAAYC,EAAc,CAC3D,GAAID,IAAe,OACf,MAAM,IAAI,UAAU,4DAA4DA,CAAU,IAAI,EAIlG,IAAME,EAAY,IAAI,WAAW,MAAMC,GAAaF,CAAY,CAAC,EAMjE,OALoBG,GAAcF,CAAS,EACtC,QAAQ,MAAO,GAAG,EAClB,QAAQ,MAAO,GAAG,EAClB,QAAQ,MAAO,EAAE,CAG1B,CAEA,SAASG,EAAqBC,EAAa,CACvC,IAAIC,EAAS,CACT,SAAU,CACN,IAAKD,CACT,CACJ,EACA,OAAO,KAAK,UAAUC,CAAM,CAChC,CAEAvD,EAAG,eAAiB,eAAesB,EAAS,CACxC,IAAIkC,EAAQC,EAAW,EACnBC,EAAQD,EAAW,EAEnBE,EAAc1D,EAAQ,YAAYqB,CAAO,EAEzCsC,EAAgB,CAChB,MAAOJ,EACP,MAAOE,EACP,YAAa,mBAAmBC,CAAW,EAC3C,aAAcrC,CAClB,EAEIA,GAAWA,EAAQ,SACnBsC,EAAc,OAAStC,EAAQ,QAGnC,IAAIuC,EACAvC,GAAWA,EAAQ,QAAU,WAC7BuC,EAAU7D,EAAG,UAAU,SAAS,EAEhC6D,EAAU7D,EAAG,UAAU,UAAU,EAGrC,IAAI8D,EAAQxC,GAAWA,EAAQ,OAAStB,EAAG,MACtC8D,EAGMA,EAAM,QAAQ,QAAQ,IAAM,KAEnCA,EAAQ,UAAYA,GAHpBA,EAAQ,SAMZ,IAAIC,EAAMF,EACJ,cAAgB,mBAAmB7D,EAAG,QAAQ,EAC9C,iBAAmB,mBAAmB2D,CAAW,EACjD,UAAY,mBAAmBH,CAAK,EACpC,kBAAoB,mBAAmBxD,EAAG,YAAY,EACtD,kBAAoB,mBAAmBA,EAAG,YAAY,EACtD,UAAY,mBAAmB8D,CAAK,EA6B1C,GA5BIzD,IACA0D,EAAMA,EAAM,UAAY,mBAAmBL,CAAK,GAGhDpC,GAAWA,EAAQ,SACnByC,GAAO,WAAa,mBAAmBzC,EAAQ,MAAM,GAGrDA,GAAW,OAAOA,EAAQ,QAAW,WACrCyC,GAAO,YAAc,mBAAmBzC,EAAQ,MAAM,GAGtDA,GAAWA,EAAQ,YACnByC,GAAO,eAAiB,mBAAmBzC,EAAQ,SAAS,GAG5DA,GAAWA,EAAQ,UACnByC,GAAO,gBAAkB,mBAAmBzC,EAAQ,OAAO,GAG3DA,GAAWA,EAAQ,QAAUA,EAAQ,QAAU,aAC/CyC,GAAO,cAAgB,mBAAmBzC,EAAQ,MAAM,GAGxDA,GAAWA,EAAQ,SACnByC,GAAO,eAAiB,mBAAmBzC,EAAQ,MAAM,GAGzDA,GAAWA,EAAQ,IAAK,CACxB,IAAI0C,EAAkBX,EAAqB/B,EAAQ,GAAG,EACtDyC,GAAO,WAAa,mBAAmBC,CAAe,CAC1D,CAMA,IAJK1C,GAAWA,EAAQ,WAActB,EAAG,aACrC+D,GAAO,eAAiB,mBAAmBzC,EAAQ,WAAatB,EAAG,SAAS,GAG5EA,EAAG,WACH,GAAI,CACA,IAAMiD,EAAeR,EAAqB,EAAE,EACtCwB,EAAgB,MAAMlB,EAAsB/C,EAAG,WAAYiD,CAAY,EAE7EW,EAAc,iBAAmBX,EAEjCc,GAAO,mBAAqBE,EAC5BF,GAAO,0BAA4B/D,EAAG,UAC1C,OAASgB,EAAO,CACZ,MAAM,IAAI,MAAM,qCAAsC,CAAE,MAAOA,CAAM,CAAC,CAC1E,CAGJ,OAAAb,EAAgB,IAAIyD,CAAa,EAE1BG,CACX,EAEA/D,EAAG,OAAS,SAASsB,EAAS,CAC1B,OAAOrB,EAAQ,OAAOqB,CAAO,CACjC,EAEAtB,EAAG,gBAAkB,SAASsB,EAAS,CAGnC,IADqBA,GAAS,cAAgBtB,EAAG,gBAC5B,OACjB,OAAOA,EAAG,UAAU,OAAO,EAG/B,IAAI+D,EAAM/D,EAAG,UAAU,OAAO,EACxB,cAAgB,mBAAmBA,EAAG,QAAQ,EAC9C,6BAA+B,mBAAmBC,EAAQ,YAAYqB,EAAS,EAAK,CAAC,EAE3F,OAAItB,EAAG,UACH+D,GAAO,kBAAoB,mBAAmB/D,EAAG,OAAO,GAGrD+D,CACX,EAEA/D,EAAG,SAAW,SAAUsB,EAAS,CAC7B,OAAOrB,EAAQ,SAASqB,CAAO,CACnC,EAEAtB,EAAG,kBAAoB,eAAesB,EAAS,CAC3C,OAAKA,IACDA,EAAU,CAAC,GAEfA,EAAQ,OAAS,WACV,MAAMtB,EAAG,eAAesB,CAAO,CAC1C,EAEAtB,EAAG,iBAAmB,SAASsB,EAAS,CACpC,IAAI4C,EAAQC,EAAY,EACpBJ,EAAM,OACV,OAAI,OAAOG,EAAU,MACjBH,EAAMG,EACJ,qBACe,mBAAmBlE,EAAG,QAAQ,EAC7C,iBAAmB,mBAAmBC,EAAQ,YAAYqB,CAAO,CAAC,GAEjEyC,CACX,EAEA/D,EAAG,kBAAoB,UAAW,CAC9B,OAAOC,EAAQ,kBAAkB,CACrC,EAEAD,EAAG,aAAe,SAAUoE,EAAM,CAC9B,IAAIC,EAASrE,EAAG,YAChB,MAAO,CAAC,CAACqE,GAAUA,EAAO,MAAM,QAAQD,CAAI,GAAK,CACrD,EAEApE,EAAG,gBAAkB,SAASoE,EAAME,EAAU,CAC1C,GAAI,CAACtE,EAAG,eACJ,MAAO,GAGX,IAAIqE,EAASrE,EAAG,eAAesE,GAAYtE,EAAG,QAAQ,EACtD,MAAO,CAAC,CAACqE,GAAUA,EAAO,MAAM,QAAQD,CAAI,GAAK,CACrD,EAEApE,EAAG,gBAAkB,UAAW,CAC5B,IAAI+D,EAAMI,EAAY,EAAI,WACtBI,EAAM,IAAI,eACdA,EAAI,KAAK,MAAOR,EAAK,EAAI,EACzBQ,EAAI,iBAAiB,SAAU,kBAAkB,EACjDA,EAAI,iBAAiB,gBAAiB,UAAYvE,EAAG,KAAK,EAE1D,IAAIa,EAAUC,EAAc,EAE5B,OAAAyD,EAAI,mBAAqB,UAAY,CAC7BA,EAAI,YAAc,IACdA,EAAI,QAAU,KACdvE,EAAG,QAAU,KAAK,MAAMuE,EAAI,YAAY,EACxC1D,EAAQ,WAAWb,EAAG,OAAO,GAE7Ba,EAAQ,SAAS,EAG7B,EAEA0D,EAAI,KAAK,EAEF1D,EAAQ,OACnB,EAEAb,EAAG,aAAe,UAAW,CACzB,IAAI+D,EAAM/D,EAAG,UAAU,SAAS,EAC5BuE,EAAM,IAAI,eACdA,EAAI,KAAK,MAAOR,EAAK,EAAI,EACzBQ,EAAI,iBAAiB,SAAU,kBAAkB,EACjDA,EAAI,iBAAiB,gBAAiB,UAAYvE,EAAG,KAAK,EAE1D,IAAIa,EAAUC,EAAc,EAE5B,OAAAyD,EAAI,mBAAqB,UAAY,CAC7BA,EAAI,YAAc,IACdA,EAAI,QAAU,KACdvE,EAAG,SAAW,KAAK,MAAMuE,EAAI,YAAY,EACzC1D,EAAQ,WAAWb,EAAG,QAAQ,GAE9Ba,EAAQ,SAAS,EAG7B,EAEA0D,EAAI,KAAK,EAEF1D,EAAQ,OACnB,EAEAb,EAAG,eAAiB,SAASwE,EAAa,CACtC,GAAI,CAACxE,EAAG,aAAgB,CAACA,EAAG,cAAgBA,EAAG,MAAQ,WACnD,KAAM,oBAGV,GAAIA,EAAG,UAAY,KACf,OAAAM,EAAQ,2EAA2E,EAC5E,GAGX,IAAImE,EAAYzE,EAAG,YAAY,IAAS,KAAK,KAAK,IAAI,KAAK,EAAE,QAAQ,EAAI,GAAI,EAAIA,EAAG,SACpF,GAAIwE,EAAa,CACb,GAAI,MAAMA,CAAW,EACjB,KAAM,sBAEVC,GAAaD,CACjB,CACA,OAAOC,EAAY,CACvB,EAEAzE,EAAG,YAAc,SAASwE,EAAa,CACnC,IAAI3D,EAAUC,EAAc,EAE5B,GAAI,CAACd,EAAG,aACJ,OAAAa,EAAQ,SAAS,EACVA,EAAQ,QAGnB2D,EAAcA,GAAe,EAE7B,IAAIE,EAAO,UAAW,CAClB,IAAIC,EAAe,GASnB,GARIH,GAAe,IACfG,EAAe,GACfrE,EAAQ,6CAA6C,IAC9C,CAACN,EAAG,aAAeA,EAAG,eAAewE,CAAW,KACvDG,EAAe,GACfrE,EAAQ,4CAA4C,GAGpD,CAACqE,EACD9D,EAAQ,WAAW,EAAK,MACrB,CACH,IAAI+D,EAAS,0CAAiD5E,EAAG,aAC7D+D,EAAM/D,EAAG,UAAU,MAAM,EAI7B,GAFAE,EAAa,KAAKW,CAAO,EAErBX,EAAa,QAAU,EAAG,CAC1B,IAAIqE,EAAM,IAAI,eACdA,EAAI,KAAK,OAAQR,EAAK,EAAI,EAC1BQ,EAAI,iBAAiB,eAAgB,mCAAmC,EACxEA,EAAI,gBAAkB,GAEtBK,GAAU,cAAgB,mBAAmB5E,EAAG,QAAQ,EAExD,IAAI6E,EAAY,IAAI,KAAK,EAAE,QAAQ,EAEnCN,EAAI,mBAAqB,UAAY,CACjC,GAAIA,EAAI,YAAc,EAClB,GAAIA,EAAI,QAAU,IAAK,CACnBjE,EAAQ,4BAA4B,EAEpCuE,GAAaA,EAAY,IAAI,KAAK,EAAE,QAAQ,GAAK,EAEjD,IAAIC,EAAgB,KAAK,MAAMP,EAAI,YAAY,EAE/CnC,EAAS0C,EAAc,aAAiBA,EAAc,cAAkBA,EAAc,SAAaD,CAAS,EAE5G7E,EAAG,sBAAwBA,EAAG,qBAAqB,EACnD,QAAS+E,EAAI7E,EAAa,IAAI,EAAG6E,GAAK,KAAMA,EAAI7E,EAAa,IAAI,EAC7D6E,EAAE,WAAW,EAAI,CAEzB,KAAO,CACHvE,EAAQ,oCAAoC,EAExC+D,EAAI,QAAU,KACdvE,EAAG,WAAW,EAGlBA,EAAG,oBAAsBA,EAAG,mBAAmB,EAC/C,QAAS+E,EAAI7E,EAAa,IAAI,EAAG6E,GAAK,KAAMA,EAAI7E,EAAa,IAAI,EAC7D6E,EAAE,SAAS,EAAI,CAEvB,CAER,EAEAR,EAAI,KAAKK,CAAM,CACnB,CACJ,CACJ,EAEA,GAAIxE,EAAY,OAAQ,CACpB,IAAI4E,EAAgBhD,EAAiB,EACrCgD,EAAc,KAAK,UAAW,CAC1BN,EAAK,CACT,CAAC,EAAE,MAAM,SAAS1D,EAAO,CACrBH,EAAQ,SAASG,CAAK,CAC1B,CAAC,CACL,MACI0D,EAAK,EAGT,OAAO7D,EAAQ,OACnB,EAEAb,EAAG,WAAa,UAAW,CACnBA,EAAG,QACHoC,EAAS,KAAM,KAAM,IAAI,EACzBpC,EAAG,cAAgBA,EAAG,aAAa,EAC/BA,EAAG,eACHA,EAAG,MAAM,EAGrB,EAEA,SAASmE,GAAc,CACnB,GAAI,OAAOnE,EAAG,cAAkB,IAC5B,OAAIA,EAAG,cAAc,OAAOA,EAAG,cAAc,OAAS,CAAC,GAAK,IACjDA,EAAG,cAAgB,UAAY,mBAAmBA,EAAG,KAAK,EAE1DA,EAAG,cAAgB,WAAa,mBAAmBA,EAAG,KAAK,CAK9E,CAEA,SAASiF,GAAY,CACjB,OAAK,OAAO,SAAS,OAGV,OAAO,SAAS,OAFhB,OAAO,SAAS,SAAW,KAAO,OAAO,SAAS,UAAY,OAAO,SAAS,KAAO,IAAM,OAAO,SAAS,KAAM,GAIhI,CAEA,SAASnD,EAAgBF,EAAOf,EAAS,CACrC,IAAIqE,EAAOtD,EAAM,KACbZ,EAAQY,EAAM,MACdP,EAASO,EAAM,OAEfiD,EAAY,IAAI,KAAK,EAAE,QAAQ,EAMnC,GAJIjD,EAAM,kBACN5B,EAAG,gBAAkBA,EAAG,eAAe4B,EAAM,iBAAqBA,EAAM,SAAY,EAGpFZ,EAAO,CACP,GAAIK,GAAU,OACV,GAAIO,EAAM,mBAAqBA,EAAM,oBAAsB,yBACvD5B,EAAG,MAAM4B,EAAM,YAAY,MACxB,CACH,IAAIuD,EAAY,CAAE,MAAOnE,EAAO,kBAAmBY,EAAM,iBAAkB,EAC3E5B,EAAG,aAAeA,EAAG,YAAYmF,CAAS,EAC1CtE,GAAWA,EAAQ,SAASsE,CAAS,CACzC,MAEAtE,GAAWA,EAAQ,WAAW,EAElC,MACJ,MAAYb,EAAG,MAAQ,aAAgB4B,EAAM,cAAgBA,EAAM,WAC/DwD,EAAYxD,EAAM,aAAc,KAAMA,EAAM,SAAU,EAAI,EAG9D,GAAK5B,EAAG,MAAQ,YAAekF,EAAM,CACjC,IAAIN,EAAS,QAAUM,EAAO,iCAC1BnB,EAAM/D,EAAG,UAAU,MAAM,EAEzBuE,EAAM,IAAI,eACdA,EAAI,KAAK,OAAQR,EAAK,EAAI,EAC1BQ,EAAI,iBAAiB,eAAgB,mCAAmC,EAExEK,GAAU,cAAgB,mBAAmB5E,EAAG,QAAQ,EACxD4E,GAAU,iBAAmBhD,EAAM,YAE/BA,EAAM,mBACNgD,GAAU,kBAAoBhD,EAAM,kBAGxC2C,EAAI,gBAAkB,GAEtBA,EAAI,mBAAqB,UAAW,CAChC,GAAIA,EAAI,YAAc,EAClB,GAAIA,EAAI,QAAU,IAAK,CAEnB,IAAIO,EAAgB,KAAK,MAAMP,EAAI,YAAY,EAC/Ca,EAAYN,EAAc,aAAiBA,EAAc,cAAkBA,EAAc,SAAa9E,EAAG,OAAS,UAAU,EAC5HqC,EAAoB,CACxB,MACIrC,EAAG,aAAeA,EAAG,YAAY,EACjCa,GAAWA,EAAQ,SAAS,CAGxC,EAEA0D,EAAI,KAAKK,CAAM,CACnB,CAEA,SAASQ,EAAYC,EAAaV,EAAcW,EAASC,EAAgB,CACrEV,GAAaA,EAAY,IAAI,KAAK,EAAE,QAAQ,GAAK,EAEjDzC,EAASiD,EAAaV,EAAcW,EAAST,CAAS,EAElDxE,GAAaL,EAAG,eAAiBA,EAAG,cAAc,OAAS4B,EAAM,aACjEtB,EAAQ,0CAA0C,EAClDN,EAAG,WAAW,EACda,GAAWA,EAAQ,SAAS,GAExB0E,IACAvF,EAAG,eAAiBA,EAAG,cAAc,EACrCa,GAAWA,EAAQ,WAAW,EAG1C,CAEJ,CAEA,SAASK,GAAa,CAClB,IAAIL,EAAUC,EAAc,EACxB0E,EAEA,OAAO5F,GAAW,WAClB4F,EAAY5F,GAGhB,SAAS6F,EAAkBC,EAAmB,CACpCA,EAyBF1F,EAAG,UAAY,CACX,UAAW,UAAW,CAClB,OAAO0F,EAAkB,sBAC7B,EACA,MAAO,UAAW,CACd,OAAOA,EAAkB,cAC7B,EACA,OAAQ,UAAW,CACf,GAAI,CAACA,EAAkB,qBACnB,KAAM,mCAEV,OAAOA,EAAkB,oBAC7B,EACA,mBAAoB,UAAW,CAC3B,GAAI,CAACA,EAAkB,qBACnB,KAAM,mCAEV,OAAOA,EAAkB,oBAC7B,EACA,SAAU,UAAW,CACjB,KAAM,yEACV,EACA,SAAU,UAAW,CACjB,GAAI,CAACA,EAAkB,kBACnB,KAAM,mCAEV,OAAOA,EAAkB,iBAC7B,CACJ,EApDA1F,EAAG,UAAY,CACX,UAAW,UAAW,CAClB,OAAOmE,EAAY,EAAI,+BAC3B,EACA,MAAO,UAAW,CACd,OAAOA,EAAY,EAAI,gCAC3B,EACA,OAAQ,UAAW,CACf,OAAOA,EAAY,EAAI,iCAC3B,EACA,mBAAoB,UAAW,CAC3B,OAAOA,EAAY,EAAI,mDAC3B,EACA,wBAAyB,UAAW,CAChC,OAAOA,EAAY,EAAI,gDAC3B,EACA,SAAU,UAAW,CACjB,OAAOA,EAAY,EAAI,wCAC3B,EACA,SAAU,UAAW,CACjB,OAAOA,EAAY,EAAI,mCAC3B,CACJ,CAgCR,CAEA,GAAIqB,EAAW,CACX,IAAIjB,EAAM,IAAI,eACdA,EAAI,KAAK,MAAOiB,EAAW,EAAI,EAC/BjB,EAAI,iBAAiB,SAAU,kBAAkB,EAEjDA,EAAI,mBAAqB,UAAY,CACjC,GAAIA,EAAI,YAAc,EAClB,GAAIA,EAAI,QAAU,KAAOoB,EAAWpB,CAAG,EAAG,CACtC,IAAI3E,EAAS,KAAK,MAAM2E,EAAI,YAAY,EAExCvE,EAAG,cAAgBJ,EAAO,iBAAiB,EAC3CI,EAAG,MAAQJ,EAAO,MAClBI,EAAG,SAAWJ,EAAO,SACrB6F,EAAkB,IAAI,EACtB5E,EAAQ,WAAW,CACvB,MACIA,EAAQ,SAAS,CAG7B,EAEA0D,EAAI,KAAK,CACb,KAAO,CACHvE,EAAG,SAAWJ,EAAO,SAErB,IAAIgG,EAAehG,EAAO,aAC1B,GAAI,CAACgG,EACD5F,EAAG,cAAgBJ,EAAO,IAC1BI,EAAG,MAAQJ,EAAO,MAClB6F,EAAkB,IAAI,EACtB5E,EAAQ,WAAW,UAEf,OAAO+E,GAAiB,SAAU,CAClC,IAAIC,EACAD,EAAa,OAAOA,EAAa,OAAS,CAAC,GAAK,IAChDC,EAAwBD,EAAe,mCAEvCC,EAAwBD,EAAe,oCAE3C,IAAIrB,EAAM,IAAI,eACdA,EAAI,KAAK,MAAOsB,EAAuB,EAAI,EAC3CtB,EAAI,iBAAiB,SAAU,kBAAkB,EAEjDA,EAAI,mBAAqB,UAAY,CACjC,GAAIA,EAAI,YAAc,EAClB,GAAIA,EAAI,QAAU,KAAOoB,EAAWpB,CAAG,EAAG,CACtC,IAAIuB,EAAqB,KAAK,MAAMvB,EAAI,YAAY,EACpDkB,EAAkBK,CAAkB,EACpCjF,EAAQ,WAAW,CACvB,MACIA,EAAQ,SAAS,CAG7B,EAEA0D,EAAI,KAAK,CACb,MACIkB,EAAkBG,CAAY,EAC9B/E,EAAQ,WAAW,CAG/B,CAEA,OAAOA,EAAQ,OACnB,CAEA,SAAS8E,EAAWI,EAAK,CACrB,OAAOA,EAAI,QAAU,GAAKA,EAAI,cAAgBA,EAAI,YAAY,WAAW,OAAO,CACpF,CAEA,SAAS3D,EAAS4D,EAAOrB,EAAcW,EAAST,EAAW,CAsBvD,GArBI7E,EAAG,qBACH,aAAaA,EAAG,kBAAkB,EAClCA,EAAG,mBAAqB,MAGxB2E,GACA3E,EAAG,aAAe2E,EAClB3E,EAAG,mBAAqBiG,EAAYtB,CAAY,IAEhD,OAAO3E,EAAG,aACV,OAAOA,EAAG,oBAGVsF,GACAtF,EAAG,QAAUsF,EACbtF,EAAG,cAAgBiG,EAAYX,CAAO,IAEtC,OAAOtF,EAAG,QACV,OAAOA,EAAG,eAGVgG,GAaA,GAZAhG,EAAG,MAAQgG,EACXhG,EAAG,YAAciG,EAAYD,CAAK,EAClChG,EAAG,UAAYA,EAAG,YAAY,IAC9BA,EAAG,cAAgB,GACnBA,EAAG,QAAUA,EAAG,YAAY,IAC5BA,EAAG,YAAcA,EAAG,YAAY,aAChCA,EAAG,eAAiBA,EAAG,YAAY,gBAE/B6E,IACA7E,EAAG,SAAW,KAAK,MAAM6E,EAAY,GAAI,EAAI7E,EAAG,YAAY,KAG5DA,EAAG,UAAY,OACfM,EAAQ,sEAAwEN,EAAG,SAAW,UAAU,EAEpGA,EAAG,gBAAgB,CACnB,IAAIyE,GAAazE,EAAG,YAAY,IAAU,IAAI,KAAK,EAAE,QAAQ,EAAI,IAAQA,EAAG,UAAY,IACxFM,EAAQ,+BAAiC,KAAK,MAAMmE,EAAY,GAAI,EAAI,IAAI,EACxEA,GAAa,EACbzE,EAAG,eAAe,EAElBA,EAAG,mBAAqB,WAAWA,EAAG,eAAgByE,CAAS,CAEvE,OAGJ,OAAOzE,EAAG,MACV,OAAOA,EAAG,YACV,OAAOA,EAAG,QACV,OAAOA,EAAG,YACV,OAAOA,EAAG,eAEVA,EAAG,cAAgB,EAE3B,CAEA,SAASyD,GAAa,CAClB,GAAI,OAAO,OAAW,KAAe,OAAO,OAAO,WAAe,IAC9D,MAAM,IAAI,MAAM,kCAAkC,EAGtD,OAAO,OAAO,WAAW,CAC7B,CAEA,SAAS5B,EAAckC,EAAK,CACxB,IAAInC,EAAQsE,EAAiBnC,CAAG,EAChC,GAAKnC,EAIL,KAAIuE,EAAahG,EAAgB,IAAIyB,EAAM,KAAK,EAEhD,OAAIuE,IACAvE,EAAM,MAAQ,GACdA,EAAM,YAAcuE,EAAW,YAC/BvE,EAAM,YAAcuE,EAAW,MAC/BvE,EAAM,OAASuE,EAAW,OAC1BvE,EAAM,iBAAmBuE,EAAW,iBACpCvE,EAAM,aAAeuE,EAAW,cAG7BvE,EACX,CAEA,SAASsE,EAAiBnC,EAAK,CAC3B,IAAIqC,EACJ,OAAQpG,EAAG,KAAM,CACb,IAAK,WACDoG,EAAkB,CAAC,OAAQ,QAAS,gBAAiB,mBAAoB,YAAa,KAAK,EAC3F,MACJ,IAAK,WACDA,EAAkB,CAAC,eAAgB,aAAc,WAAY,QAAS,gBAAiB,aAAc,mBAAoB,YAAa,KAAK,EAC3I,MACJ,IAAK,SACDA,EAAkB,CAAC,eAAgB,aAAc,WAAY,OAAQ,QAAS,gBAAiB,aAAc,mBAAoB,YAAa,KAAK,EACnJ,KACR,CAEAA,EAAgB,KAAK,OAAO,EAC5BA,EAAgB,KAAK,mBAAmB,EACxCA,EAAgB,KAAK,WAAW,EAEhC,IAAIC,EAAatC,EAAI,QAAQ,GAAG,EAC5BuC,EAAgBvC,EAAI,QAAQ,GAAG,EAE/BwC,EACAC,EAmBJ,GAjBIxG,EAAG,eAAiB,SAAWqG,IAAe,IAC9CE,EAASxC,EAAI,UAAU,EAAGsC,CAAU,EACpCG,EAASC,EAAoB1C,EAAI,UAAUsC,EAAa,EAAGC,IAAkB,GAAKA,EAAgBvC,EAAI,MAAM,EAAGqC,CAAe,EAC1HI,EAAO,eAAiB,KACxBD,GAAU,IAAMC,EAAO,cAEvBF,IAAkB,KAClBC,GAAUxC,EAAI,UAAUuC,CAAa,IAElCtG,EAAG,eAAiB,YAAcsG,IAAkB,KAC3DC,EAASxC,EAAI,UAAU,EAAGuC,CAAa,EACvCE,EAASC,EAAoB1C,EAAI,UAAUuC,EAAgB,CAAC,EAAGF,CAAe,EAC1EI,EAAO,eAAiB,KACxBD,GAAU,IAAMC,EAAO,eAI3BA,GAAUA,EAAO,aACjB,GAAIxG,EAAG,OAAS,YAAcA,EAAG,OAAS,UACtC,IAAKwG,EAAO,YAAY,MAAQA,EAAO,YAAY,QAAUA,EAAO,YAAY,MAC5E,OAAAA,EAAO,YAAY,OAASD,EACrBC,EAAO,oBAEXxG,EAAG,OAAS,aACdwG,EAAO,YAAY,cAAgBA,EAAO,YAAY,QAAUA,EAAO,YAAY,MACpF,OAAAA,EAAO,YAAY,OAASD,EACrBC,EAAO,YAI9B,CAEA,SAASC,EAAoBC,EAAcN,EAAiB,CAMxD,QALIrB,EAAI2B,EAAa,MAAM,GAAG,EAC1BC,EAAS,CACT,aAAc,GACd,YAAa,CAAC,CAClB,EACS7D,EAAI,EAAGA,EAAIiC,EAAE,OAAQjC,IAAK,CAC/B,IAAI8D,EAAQ7B,EAAEjC,CAAC,EAAE,QAAQ,GAAG,EACxB+D,EAAM9B,EAAEjC,CAAC,EAAE,MAAM,EAAG8D,CAAK,EACzBR,EAAgB,QAAQS,CAAG,IAAM,GACjCF,EAAO,YAAYE,CAAG,EAAI9B,EAAEjC,CAAC,EAAE,MAAM8D,EAAQ,CAAC,GAE1CD,EAAO,eAAiB,KACxBA,EAAO,cAAgB,KAE3BA,EAAO,cAAgB5B,EAAEjC,CAAC,EAElC,CACA,OAAO6D,CACX,CAEA,SAAS7F,GAAgB,CAGrB,IAAIiE,EAAI,CACJ,WAAY,SAAS4B,EAAQ,CACzB5B,EAAE,QAAQ4B,CAAM,CACpB,EAEA,SAAU,SAASA,EAAQ,CACvB5B,EAAE,OAAO4B,CAAM,CACnB,CACJ,EACA,OAAA5B,EAAE,QAAU,IAAI,QAAQ,SAAS+B,EAASC,EAAQ,CAC9ChC,EAAE,QAAU+B,EACZ/B,EAAE,OAASgC,CACf,CAAC,EAEMhC,CACX,CAGA,SAASiC,EAAsBnG,EAASoG,EAASC,EAAc,CAC3D,IAAIC,EAAgB,KAChBC,EAAiB,IAAI,QAAQ,SAAUN,EAASC,EAAQ,CACxDI,EAAgB,WAAW,UAAY,CACnCJ,EAAO,CAAE,MAASG,GAAgB,4CAA8CD,EAAU,IAAK,CAAC,CACpG,EAAGA,CAAO,CACd,CAAC,EAED,OAAO,QAAQ,KAAK,CAACpG,EAASuG,CAAc,CAAC,EAAE,QAAQ,UAAY,CAC/D,aAAaD,CAAa,CAC9B,CAAC,CACL,CAEA,SAASpF,GAAwB,CAC7B,IAAIlB,EAAUC,EAAc,EAO5B,GALI,CAACV,EAAY,QAKbA,EAAY,OACZ,OAAAS,EAAQ,WAAW,EACZA,EAAQ,QAGnB,IAAIwG,EAAS,SAAS,cAAc,QAAQ,EAC5CjH,EAAY,OAASiH,EAErBA,EAAO,OAAS,UAAW,CACvB,IAAIC,EAAUtH,EAAG,UAAU,UAAU,EACjCsH,EAAQ,OAAO,CAAC,IAAM,IACtBlH,EAAY,aAAe6E,EAAU,EAErC7E,EAAY,aAAekH,EAAQ,UAAU,EAAGA,EAAQ,QAAQ,IAAK,CAAC,CAAC,EAE3EzG,EAAQ,WAAW,CACvB,EAEA,IAAIY,EAAMzB,EAAG,UAAU,mBAAmB,EAC1CqH,EAAO,aAAa,MAAO5F,CAAI,EAC/B4F,EAAO,aAAa,UAAW,yEAAyE,EACxGA,EAAO,aAAa,QAAS,yBAA0B,EACvDA,EAAO,MAAM,QAAU,OACvB,SAAS,KAAK,YAAYA,CAAM,EAEhC,IAAI3F,EAAkB,SAASC,EAAO,CAClC,GAAK,EAAAA,EAAM,SAAWvB,EAAY,cAAkBA,EAAY,OAAO,gBAAkBuB,EAAM,UAIzFA,EAAM,MAAQ,aAAeA,EAAM,MAAQ,WAAaA,EAAM,MAAQ,SAK5E,CAAIA,EAAM,MAAQ,aACd3B,EAAG,WAAW,EAKlB,QAFIuH,EAAYnH,EAAY,aAAa,OAAO,EAAGA,EAAY,aAAa,MAAM,EAEzE0C,EAAIyE,EAAU,OAAS,EAAGzE,GAAK,EAAG,EAAEA,EAAG,CAC5C,IAAIjC,EAAU0G,EAAUzE,CAAC,EACrBnB,EAAM,MAAQ,QACdd,EAAQ,SAAS,EAEjBA,EAAQ,WAAWc,EAAM,MAAQ,WAAW,CAEpD,EACJ,EAEA,cAAO,iBAAiB,UAAWD,EAAiB,EAAK,EAElDb,EAAQ,OACnB,CAEA,SAASwB,GAAsB,CACvBjC,EAAY,QACRJ,EAAG,OACH,WAAW,UAAW,CAClBgC,EAAiB,EAAE,KAAK,SAASC,EAAW,CACpCA,GACAI,EAAoB,CAE5B,CAAC,CACL,EAAGjC,EAAY,SAAW,GAAI,CAG1C,CAEA,SAAS4B,GAAmB,CACxB,IAAInB,EAAUC,EAAc,EAE5B,GAAIV,EAAY,QAAUA,EAAY,aAAe,CACjD,IAAIoH,EAAMxH,EAAG,SAAW,KAAOA,EAAG,UAAYA,EAAG,UAAY,IAC7DI,EAAY,aAAa,KAAKS,CAAO,EACrC,IAAI4G,EAASrH,EAAY,aACrBA,EAAY,aAAa,QAAU,GACnCA,EAAY,OAAO,cAAc,YAAYoH,EAAKC,CAAM,CAEhE,MACI5G,EAAQ,WAAW,EAGvB,OAAOA,EAAQ,OACnB,CAEA,SAASyB,GAA0B,CAC/B,IAAIzB,EAAUC,EAAc,EAE5B,IAAKV,EAAY,QAAUJ,EAAG,4BAA8B,OAAOA,EAAG,UAAU,yBAA4B,WAAY,CACpH,IAAIqH,EAAS,SAAS,cAAc,QAAQ,EAC5CA,EAAO,aAAa,MAAOrH,EAAG,UAAU,wBAAwB,CAAC,EACjEqH,EAAO,aAAa,UAAW,yEAAyE,EACxGA,EAAO,aAAa,QAAS,0BAA2B,EACxDA,EAAO,MAAM,QAAU,OACvB,SAAS,KAAK,YAAYA,CAAM,EAEhC,IAAI3F,EAAkB,SAASC,EAAO,CAC9B0F,EAAO,gBAAkB1F,EAAM,SAI/BA,EAAM,OAAS,aAAeA,EAAM,OAAS,gBAEtCA,EAAM,OAAS,gBACtBnB,EACI;AAAA;AAAA;AAAA;AAAA;AAAA,+FAIJ,EAEAJ,EAAY,OAAS,GACjBJ,EAAG,yBACHA,EAAG,0BAA4B,KAIvC,SAAS,KAAK,YAAYqH,CAAM,EAChC,OAAO,oBAAoB,UAAW3F,CAAe,EACrDb,EAAQ,WAAW,GACvB,EAEA,OAAO,iBAAiB,UAAWa,EAAiB,EAAK,CAC7D,MACIb,EAAQ,WAAW,EAGvB,OAAOmG,EAAsBnG,EAAQ,QAASb,EAAG,sBAAuB,0DAA0D,CACtI,CAEA,SAASY,EAAY8G,EAAM,CACvB,GAAI,CAACA,GAAQA,GAAQ,UACjB,MAAO,CACH,MAAO,eAAepG,EAAS,CAC3B,cAAO,SAAS,OAAO,MAAMtB,EAAG,eAAesB,CAAO,CAAC,EAChDR,EAAc,EAAE,OAC3B,EAEA,OAAQ,eAAeQ,EAAS,CAG5B,IADqBA,GAAS,cAAgBtB,EAAG,gBAC5B,MAAO,CACxB,OAAO,SAAS,QAAQA,EAAG,gBAAgBsB,CAAO,CAAC,EACnD,MACJ,CAEA,IAAMqG,EAAY3H,EAAG,gBAAgBsB,CAAO,EACtCsG,EAAW,MAAM,MAAMD,EAAW,CACpC,OAAQ,OACR,QAAS,CACL,eAAgB,mCACpB,EACA,KAAM,IAAI,gBAAgB,CACtB,cAAe3H,EAAG,QAClB,UAAWA,EAAG,SACd,yBAA0BC,EAAQ,YAAYqB,EAAS,EAAK,CAChE,CAAC,CACL,CAAC,EAED,GAAIsG,EAAS,WAAY,CACrB,OAAO,SAAS,KAAOA,EAAS,IAChC,MACJ,CAEA,GAAIA,EAAS,GAAI,CACb,OAAO,SAAS,OAAO,EACvB,MACJ,CAEA,MAAM,IAAI,MAAM,gDAAgD,CACpE,EAEA,SAAU,eAAetG,EAAS,CAC9B,cAAO,SAAS,OAAO,MAAMtB,EAAG,kBAAkBsB,CAAO,CAAC,EACnDR,EAAc,EAAE,OAC3B,EAEA,kBAAoB,UAAW,CAC3B,IAAI+G,EAAa7H,EAAG,iBAAiB,EACrC,GAAI,OAAO6H,EAAe,IACtB,OAAO,SAAS,KAAOA,MAEvB,MAAM,mCAEV,OAAO/G,EAAc,EAAE,OAC3B,EAEA,YAAa,SAASQ,EAASwG,EAAY,CAKvC,OAJI,UAAU,QAAU,IACpBA,EAAa,IAGbxG,GAAWA,EAAQ,YACZA,EAAQ,YACRtB,EAAG,YACHA,EAAG,YAEH,SAAS,IAExB,CACJ,EAGJ,GAAI0H,GAAQ,UAAW,CACnBtH,EAAY,OAAS,GACrB,IAAI2H,EAA2B,SAASC,EAAUC,EAAQ3G,EAAS,CAC/D,OAAI,OAAO,SAAW,OAAO,QAAQ,aAE1B,OAAO,QAAQ,aAAa,KAAK0G,EAAUC,EAAQ3G,CAAO,EAE1D,OAAO,KAAK0G,EAAUC,EAAQ3G,CAAO,CAEpD,EAEI4G,EAA6B,SAAUC,EAAa,CACpD,OAAIA,GAAeA,EAAY,eACpB,OAAO,KAAKA,EAAY,cAAc,EAAE,OAAO,SAAU7G,EAAS8G,EAAY,CACjF,OAAA9G,EAAQ8G,CAAU,EAAID,EAAY,eAAeC,CAAU,EACpD9G,CACX,EAAG,CAAC,CAAC,EAEE,CAAC,CAEhB,EAEI+G,EAAuB,SAAUC,EAAgB,CACjD,OAAO,OAAO,KAAKA,CAAc,EAAE,OAAO,SAAUhH,EAAS8G,EAAY,CACrE,OAAA9G,EAAQ,KAAK8G,EAAW,IAAIE,EAAeF,CAAU,CAAC,EAC/C9G,CACX,EAAG,CAAC,CAAC,EAAE,KAAK,GAAG,CACnB,EAEIiH,EAAuB,SAAUJ,EAAa,CAC9C,IAAIG,EAAiBJ,EAA2BC,CAAW,EAC3D,OAAAG,EAAe,SAAW,KACtBH,GAAeA,EAAY,QAAU,SACrCG,EAAe,OAAS,OAErBD,EAAqBC,CAAc,CAC9C,EAEIE,EAAwB,UAAW,CACnC,OAAOxI,EAAG,aAAe,kBAC7B,EAEA,MAAO,CACH,MAAO,eAAesB,EAAS,CAC3B,IAAIT,EAAUC,EAAc,EAExBwH,EAAiBC,EAAqBjH,CAAO,EAC7C0G,EAAW,MAAMhI,EAAG,eAAesB,CAAO,EAC1CmH,EAAMV,EAAyBC,EAAU,SAAUM,CAAc,EACjEI,EAAY,GAEZC,EAAS,GACTC,EAAe,UAAW,CAC1BD,EAAS,GACTF,EAAI,MAAM,CACd,EAEA,OAAAA,EAAI,iBAAiB,YAAa,SAAS9G,EAAO,CAC9C,GAAIA,EAAM,IAAI,QAAQ6G,EAAsB,CAAC,GAAK,EAAG,CACjD,IAAIrG,EAAWN,EAAcF,EAAM,GAAG,EACtCG,EAAgBK,EAAUtB,CAAO,EACjC+H,EAAa,EACbF,EAAY,EAChB,CACJ,CAAC,EAEDD,EAAI,iBAAiB,YAAa,SAAS9G,EAAO,CAC9C,GAAI,CAAC+G,EACD,GAAI/G,EAAM,IAAI,QAAQ6G,EAAsB,CAAC,GAAK,EAAG,CACjD,IAAIrG,EAAWN,EAAcF,EAAM,GAAG,EACtCG,EAAgBK,EAAUtB,CAAO,EACjC+H,EAAa,EACbF,EAAY,EAChB,MACI7H,EAAQ,SAAS,EACjB+H,EAAa,CAGzB,CAAC,EAEDH,EAAI,iBAAiB,OAAQ,SAAS9G,EAAO,CACpCgH,GACD9H,EAAQ,SAAS,CACb,OAAQ,gBACZ,CAAC,CAET,CAAC,EAEMA,EAAQ,OACnB,EAEA,OAAQ,SAASS,EAAS,CACtB,IAAIT,EAAUC,EAAc,EAExB6G,EAAY3H,EAAG,gBAAgBsB,CAAO,EACtCmH,EAAMV,EAAyBJ,EAAW,SAAU,uCAAuC,EAE3F3G,EAEJ,OAAAyH,EAAI,iBAAiB,YAAa,SAAS9G,EAAO,CAC1CA,EAAM,IAAI,QAAQ6G,EAAsB,CAAC,GAAK,GAC9CC,EAAI,MAAM,CAElB,CAAC,EAEDA,EAAI,iBAAiB,YAAa,SAAS9G,EAAO,CAC1CA,EAAM,IAAI,QAAQ6G,EAAsB,CAAC,GAAK,IAG9CxH,EAAQ,IACRyH,EAAI,MAAM,CAElB,CAAC,EAEDA,EAAI,iBAAiB,OAAQ,SAAS9G,EAAO,CACrCX,EACAH,EAAQ,SAAS,GAEjBb,EAAG,WAAW,EACda,EAAQ,WAAW,EAE3B,CAAC,EAEMA,EAAQ,OACnB,EAEA,SAAW,eAAeS,EAAS,CAC/B,IAAIT,EAAUC,EAAc,EACxB+H,EAAc,MAAM7I,EAAG,kBAAkB,EACzCsI,EAAiBC,EAAqBjH,CAAO,EAC7CmH,EAAMV,EAAyBc,EAAa,SAAUP,CAAc,EACxE,OAAAG,EAAI,iBAAiB,YAAa,SAAS9G,EAAO,CAC9C,GAAIA,EAAM,IAAI,QAAQ6G,EAAsB,CAAC,GAAK,EAAG,CACjDC,EAAI,MAAM,EACV,IAAI7G,EAAQC,EAAcF,EAAM,GAAG,EACnCG,EAAgBF,EAAOf,CAAO,CAClC,CACJ,CAAC,EACMA,EAAQ,OACnB,EAEA,kBAAoB,UAAW,CAC3B,IAAIgH,EAAa7H,EAAG,iBAAiB,EACrC,GAAI,OAAO6H,EAAe,IAAa,CACnC,IAAIY,EAAMV,EAAyBF,EAAY,SAAU,aAAa,EACtEY,EAAI,iBAAiB,YAAa,SAAS9G,EAAO,CAC1CA,EAAM,IAAI,QAAQ6G,EAAsB,CAAC,GAAK,GAC9CC,EAAI,MAAM,CAElB,CAAC,CACL,KACI,MAAM,kCAEd,EAEA,YAAa,SAASnH,EAAS,CAC3B,OAAOkH,EAAsB,CACjC,CACJ,CACJ,CAEA,GAAId,GAAQ,iBACR,OAAAtH,EAAY,OAAS,GAEd,CACH,MAAO,eAAekB,EAAS,CAC3B,IAAIT,EAAUC,EAAc,EACxBkH,EAAW,MAAMhI,EAAG,eAAesB,CAAO,EAE9C,sBAAe,UAAU,WAAY,SAASK,EAAO,CACjD,eAAe,YAAY,UAAU,EACrC,OAAO,QAAQ,QAAQ,WAAW,MAAM,EACxC,IAAIC,EAAQC,EAAcF,EAAM,GAAG,EACnCG,EAAgBF,EAAOf,CAAO,CAClC,CAAC,EAED,OAAO,QAAQ,QAAQ,WAAW,QAAQmH,CAAQ,EAC3CnH,EAAQ,OACnB,EAEA,OAAQ,SAASS,EAAS,CACtB,IAAIT,EAAUC,EAAc,EACxB6G,EAAY3H,EAAG,gBAAgBsB,CAAO,EAE1C,sBAAe,UAAU,WAAY,SAASK,EAAO,CACjD,eAAe,YAAY,UAAU,EACrC,OAAO,QAAQ,QAAQ,WAAW,MAAM,EACxC3B,EAAG,WAAW,EACda,EAAQ,WAAW,CACvB,CAAC,EAED,OAAO,QAAQ,QAAQ,WAAW,QAAQ8G,CAAS,EAC5C9G,EAAQ,OACnB,EAEA,SAAW,eAAeS,EAAS,CAC/B,IAAIT,EAAUC,EAAc,EACxB+H,EAAc,MAAM7I,EAAG,kBAAkBsB,CAAO,EACpD,sBAAe,UAAU,WAAa,SAASK,EAAO,CAClD,eAAe,YAAY,UAAU,EACrC,OAAO,QAAQ,QAAQ,WAAW,MAAM,EACxC,IAAIC,EAAQC,EAAcF,EAAM,GAAG,EACnCG,EAAgBF,EAAOf,CAAO,CAClC,CAAC,EACD,OAAO,QAAQ,QAAQ,WAAW,QAAQgI,CAAW,EAC9ChI,EAAQ,OAEnB,EAEA,kBAAoB,UAAW,CAC3B,IAAIgH,EAAa7H,EAAG,iBAAiB,EACrC,GAAI,OAAO6H,EAAe,IACtB,OAAO,QAAQ,QAAQ,WAAW,QAAQA,CAAU,MAEpD,MAAM,kCAEd,EAEA,YAAa,SAASvG,EAAS,CAC3B,OAAIA,GAAWA,EAAQ,YACZA,EAAQ,YACRtB,EAAG,YACHA,EAAG,YAEH,kBAEf,CACJ,EAGJ,KAAM,yBAA2B0H,CACrC,CAEA,IAAMoB,EAAqB,eAE3B,IAAIC,EAAe,UAAW,CAC1B,GAAI,EAAE,gBAAgBA,GAClB,OAAO,IAAIA,EAGf,aAAa,QAAQ,UAAW,MAAM,EACtC,aAAa,WAAW,SAAS,EAEjC,IAAIC,EAAK,KAKT,SAASC,GAAqB,CAC1B,IAAMC,EAAc,KAAK,IAAI,EAE7B,OAAW,CAACrC,EAAKsC,CAAK,IAAKC,EAAiB,EAAG,CAE3C,IAAMC,EAASC,EAAYH,CAAK,GAG5BE,IAAW,MAAQA,EAASH,IAC5B,aAAa,WAAWrC,CAAG,CAEnC,CACJ,CAKA,SAAS0C,GAAiB,CACtB,OAAW,CAAC1C,CAAG,IAAKuC,EAAiB,EACjC,aAAa,WAAWvC,CAAG,CAEnC,CAMA,SAASuC,GAAmB,CACxB,OAAO,OAAO,QAAQ,YAAY,EAAE,OAAO,CAAC,CAACvC,CAAG,IAAMA,EAAI,WAAWiC,CAAkB,CAAC,CAC5F,CAOA,SAASQ,EAAYH,EAAO,CACxB,IAAIK,EAGJ,GAAI,CACAA,EAAc,KAAK,MAAML,CAAK,CAClC,MAAgB,CACZ,OAAO,IACX,CAGA,OAAItJ,EAAS2J,CAAW,GAAK,YAAaA,GAAe,OAAOA,EAAY,SAAY,SAC7EA,EAAY,QAGhB,IACX,CAEAR,EAAG,IAAM,SAASxF,EAAO,CACrB,GAAKA,EAIL,KAAIqD,EAAMiC,EAAqBtF,EAC3B2F,EAAQ,aAAa,QAAQtC,CAAG,EACpC,OAAIsC,IACA,aAAa,WAAWtC,CAAG,EAC3BsC,EAAQ,KAAK,MAAMA,CAAK,GAG5BF,EAAmB,EACZE,EACX,EAEAH,EAAG,IAAM,SAASxF,EAAO,CACrByF,EAAmB,EAEnB,IAAMpC,EAAMiC,EAAqBtF,EAAM,MACjC2F,EAAQ,KAAK,UAAU,CACzB,GAAG3F,EAEH,QAAS,KAAK,IAAI,EAAK,KAAU,GACrC,CAAC,EAED,GAAI,CACA,aAAa,QAAQqD,EAAKsC,CAAK,CACnC,MAAgB,CAEZI,EAAe,EACf,aAAa,QAAQ1C,EAAKsC,CAAK,CACnC,CACJ,CACJ,EAEIM,EAAgB,UAAW,CAC3B,GAAI,EAAE,gBAAgBA,GAClB,OAAO,IAAIA,EAGf,IAAIT,EAAK,KAETA,EAAG,IAAM,SAASxF,EAAO,CACrB,GAAKA,EAIL,KAAI2F,EAAQO,EAAUZ,EAAqBtF,CAAK,EAEhD,GADAmG,EAAUb,EAAqBtF,EAAO,GAAIoG,EAAiB,IAAI,CAAC,EAC5DT,EACA,OAAO,KAAK,MAAMA,CAAK,EAE/B,EAEAH,EAAG,IAAM,SAASxF,EAAO,CACrBmG,EAAUb,EAAqBtF,EAAM,MAAO,KAAK,UAAUA,CAAK,EAAGoG,EAAiB,EAAE,CAAC,CAC3F,EAEAZ,EAAG,WAAa,SAASnC,EAAK,CAC1B8C,EAAU9C,EAAK,GAAI+C,EAAiB,IAAI,CAAC,CAC7C,EAEA,IAAIA,EAAmB,SAAUC,EAAS,CACtC,IAAIC,EAAM,IAAI,KACd,OAAAA,EAAI,QAAQA,EAAI,QAAQ,EAAKD,EAAQ,GAAG,GAAK,EACtCC,CACX,EAEIJ,EAAY,SAAU7C,EAAK,CAG3B,QAFIkD,EAAOlD,EAAM,IACbmD,EAAK,SAAS,OAAO,MAAM,GAAG,EACzBlH,EAAI,EAAGA,EAAIkH,EAAG,OAAQlH,IAAK,CAEhC,QADImH,EAAID,EAAGlH,CAAC,EACLmH,EAAE,OAAO,CAAC,GAAK,KAClBA,EAAIA,EAAE,UAAU,CAAC,EAErB,GAAIA,EAAE,QAAQF,CAAI,GAAK,EACnB,OAAOE,EAAE,UAAUF,EAAK,OAAQE,EAAE,MAAM,CAEhD,CACA,MAAO,EACX,EAEIN,EAAY,SAAU9C,EAAKsC,EAAOe,EAAgB,CAClD,IAAIC,EAAStD,EAAM,IAAMsC,EAAQ,aACde,EAAe,YAAY,EAAI,KAClD,SAAS,OAASC,CACtB,CACJ,EAEA,SAASzJ,IAAwB,CAC7B,GAAI,CACA,OAAO,IAAIqI,CACf,MAAc,CACd,CAEA,OAAO,IAAIU,CACf,CAEA,SAASlJ,EAAa6J,EAAI,CACtB,OAAO,UAAW,CACVpK,EAAG,eACHoK,EAAG,MAAM,QAAS,MAAM,UAAU,MAAM,KAAK,SAAS,CAAC,CAE/D,CACJ,CACJ,CAEA,IAAOC,GAAQ1K,EAMf,SAASyD,GAAckH,EAAO,CAC1B,IAAMC,EAAY,OAAO,cAAc,GAAGD,CAAK,EAC/C,OAAO,KAAKC,CAAS,CACzB,CAMA,eAAepH,GAAaqH,EAAS,CAEjC,IAAMC,EADU,IAAI,YAAY,EACX,OAAOD,CAAO,EAEnC,GAAI,OAAO,OAAW,KAAe,OAAO,OAAO,OAAW,IAC1D,MAAM,IAAI,MAAM,kCAAkC,EAGtD,OAAO,MAAM,OAAO,OAAO,OAAO,UAAWC,CAAI,CACrD,CAKA,SAASxE,EAAYD,EAAO,CACxB,GAAM,CAAC0E,EAAQC,CAAO,EAAI3E,EAAM,MAAM,GAAG,EAEzC,GAAI,OAAO2E,GAAY,SACnB,MAAM,IAAI,MAAM,4CAA4C,EAGhE,IAAIC,EAEJ,GAAI,CACAA,EAAUC,GAAgBF,CAAO,CACrC,OAAS3J,EAAO,CACZ,MAAM,IAAI,MAAM,kEAAmE,CAAE,MAAOA,CAAM,CAAC,CACvG,CAEA,GAAI,CACA,OAAO,KAAK,MAAM4J,CAAO,CAC7B,OAAS5J,EAAO,CACZ,MAAM,IAAI,MAAM,6DAA8D,CAAE,MAAOA,CAAM,CAAC,CAClG,CACJ,CAKA,SAAS6J,GAAgBC,EAAO,CAC5B,IAAIC,EAASD,EACR,WAAW,IAAK,GAAG,EACnB,WAAW,IAAK,GAAG,EAExB,OAAQC,EAAO,OAAS,EAAG,CACvB,IAAK,GACD,MACJ,IAAK,GACDA,GAAU,KACV,MACJ,IAAK,GACDA,GAAU,IACV,MACJ,QACI,MAAM,IAAI,MAAM,qCAAqC,CAC7D,CAEA,GAAI,CACA,OAAOC,GAAiBD,CAAM,CAClC,MAAgB,CACZ,OAAO,KAAKA,CAAM,CACtB,CACJ,CAKA,SAASC,GAAiBF,EAAO,CAC7B,OAAO,mBAAmB,KAAKA,CAAK,EAAE,QAAQ,OAAQ,CAACG,EAAGlG,IAAM,CAC5D,IAAIG,EAAOH,EAAE,WAAW,CAAC,EAAE,SAAS,EAAE,EAAE,YAAY,EAEpD,OAAIG,EAAK,OAAS,IACdA,EAAO,IAAMA,GAGV,IAAMA,CACjB,CAAC,CAAC,CACN,CAMA,SAASrF,EAASiL,EAAO,CACrB,OAAO,OAAOA,GAAU,UAAYA,IAAU,IAClD","names":["Keycloak","config","isObject","requiredProperties","property","kc","adapter","refreshQueue","callbackStorage","loginIframe","useNonce","logInfo","createLogger","logWarn","initOptions","createCallbackStorage","adapters","loadAdapter","promise","createPromise","initPromise","error","configPromise","loadConfig","onLoad","doLogin","prompt","options","checkSsoSilently","ifrm","src","messageCallback","event","oauth","parseCallback","processCallback","setupCheckLoginIframe","checkLoginIframe","unchanged","processInit","callback","setToken","scheduleCheckIframe","check3pCookiesSupported","generateRandomData","len","generateCodeVerifier","generateRandomString","alphabet","randomData","chars","i","generatePkceChallenge","pkceMethod","codeVerifier","hashBytes","sha256Digest","bytesToBase64","buildClaimsParameter","requestedAcr","claims","state","createUUID","nonce","redirectUri","callbackState","baseUrl","scope","url","claimsParameter","pkceChallenge","realm","getRealmUrl","role","access","resource","req","minValidity","expiresIn","exec","refreshToken","params","timeLocal","tokenResponse","p","iframePromise","getOrigin","code","errorData","authSuccess","accessToken","idToken","fulfillPromise","configUrl","setupOidcEndoints","oidcConfiguration","fileLoaded","oidcProvider","oidcProviderConfigUrl","oidcProviderConfig","xhr","token","decodeToken","parseCallbackUrl","oauthState","supportedParams","queryIndex","fragmentIndex","newUrl","parsed","parseCallbackParams","paramsString","result","split","key","resolve","reject","applyTimeoutToPromise","timeout","errorMessage","timeoutHandle","timeoutPromise","iframe","authUrl","callbacks","msg","origin","type","logoutUrl","response","accountUrl","encodeHash","cordovaOpenWindowWrapper","loginUrl","target","shallowCloneCordovaOptions","userOptions","optionName","formatCordovaOptions","cordovaOptions","createCordovaOptions","getCordovaRedirectUri","ref","completed","closed","closeBrowser","registerUrl","STORAGE_KEY_PREFIX","LocalStorage","cs","clearInvalidValues","currentTime","value","getStoredEntries","expiry","parseExpiry","clearAllValues","parsedValue","CookieStorage","getCookie","setCookie","cookieExpiration","minutes","exp","name","ca","c","expirationDate","cookie","fn","keycloak_default","bytes","binString","message","data","header","payload","decoded","base64UrlDecode","input","output","b64DecodeUnicode","m"],"sources":["../esm/npm/keycloak-js@26.0.5/node_modules/keycloak-js/lib/keycloak.js"],"sourcesContent":["/*\n * Copyright 2016 Red Hat, Inc. and/or its affiliates\n * and other contributors as indicated by the @author tags.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nfunction Keycloak (config) {\n    if (!(this instanceof Keycloak)) {\n        throw new Error(\"The 'Keycloak' constructor must be invoked with 'new'.\")\n    }\n\n    if (typeof config !== 'string' \u0026\u0026 !isObject(config)) {\n        throw new Error(\"The 'Keycloak' constructor must be provided with a configuration object, or a URL to a JSON configuration file.\");\n    }\n\n    if (isObject(config)) {\n        const requiredProperties = 'oidcProvider' in config\n            ? ['clientId']\n            : ['url', 'realm', 'clientId'];\n\n        for (const property of requiredProperties) {\n            if (!config[property]) {\n                throw new Error(`The configuration object is missing the required '${property}' property.`);\n            }\n        }\n    }\n\n    var kc = this;\n    var adapter;\n    var refreshQueue = [];\n    var callbackStorage;\n\n    var loginIframe = {\n        enable: true,\n        callbackList: [],\n        interval: 5\n    };\n\n    kc.didInitialize = false;\n\n    var useNonce = true;\n    var logInfo = createLogger(console.info);\n    var logWarn = createLogger(console.warn);\n\n    if (!globalThis.isSecureContext) {\n        logWarn(\n            \"[KEYCLOAK] Keycloak JS must be used in a 'secure context' to function properly as it relies on browser APIs that are otherwise not available.\\n\" +\n            \"Continuing to run your application insecurely will lead to unexpected behavior and breakage.\\n\\n\" +\n            \"For more information see: https://developer.mozilla.org/en-US/docs/Web/Security/Secure_Contexts\"\n        );\n    }\n\n    kc.init = function (initOptions = {}) {\n        if (kc.didInitialize) {\n            throw new Error(\"A 'Keycloak' instance can only be initialized once.\");\n        }\n\n        kc.didInitialize = true;\n\n        kc.authenticated = false;\n\n        callbackStorage = createCallbackStorage();\n        var adapters = ['default', 'cordova', 'cordova-native'];\n\n        if (adapters.indexOf(initOptions.adapter) \u003e -1) {\n            adapter = loadAdapter(initOptions.adapter);\n        } else if (typeof initOptions.adapter === \"object\") {\n            adapter = initOptions.adapter;\n        } else {\n            if (window.Cordova || window.cordova) {\n                adapter = loadAdapter('cordova');\n            } else {\n                adapter = loadAdapter();\n            }\n        }\n\n        if (typeof initOptions.useNonce !== 'undefined') {\n            useNonce = initOptions.useNonce;\n        }\n\n        if (typeof initOptions.checkLoginIframe !== 'undefined') {\n            loginIframe.enable = initOptions.checkLoginIframe;\n        }\n\n        if (initOptions.checkLoginIframeInterval) {\n            loginIframe.interval = initOptions.checkLoginIframeInterval;\n        }\n\n        if (initOptions.onLoad === 'login-required') {\n            kc.loginRequired = true;\n        }\n\n        if (initOptions.responseMode) {\n            if (initOptions.responseMode === 'query' || initOptions.responseMode === 'fragment') {\n                kc.responseMode = initOptions.responseMode;\n            } else {\n                throw 'Invalid value for responseMode';\n            }\n        }\n\n        if (initOptions.flow) {\n            switch (initOptions.flow) {\n                case 'standard':\n                    kc.responseType = 'code';\n                    break;\n                case 'implicit':\n                    kc.responseType = 'id_token token';\n                    break;\n                case 'hybrid':\n                    kc.responseType = 'code id_token token';\n                    break;\n                default:\n                    throw 'Invalid value for flow';\n            }\n            kc.flow = initOptions.flow;\n        }\n\n        if (initOptions.timeSkew != null) {\n            kc.timeSkew = initOptions.timeSkew;\n        }\n\n        if(initOptions.redirectUri) {\n            kc.redirectUri = initOptions.redirectUri;\n        }\n\n        if (initOptions.silentCheckSsoRedirectUri) {\n            kc.silentCheckSsoRedirectUri = initOptions.silentCheckSsoRedirectUri;\n        }\n\n        if (typeof initOptions.silentCheckSsoFallback === 'boolean') {\n            kc.silentCheckSsoFallback = initOptions.silentCheckSsoFallback;\n        } else {\n            kc.silentCheckSsoFallback = true;\n        }\n\n        if (typeof initOptions.pkceMethod !== \"undefined\") {\n            if (initOptions.pkceMethod !== \"S256\" \u0026\u0026 initOptions.pkceMethod !== false) {\n                throw new TypeError(`Invalid value for pkceMethod', expected 'S256' or false but got ${initOptions.pkceMethod}.`);\n            }\n\n            kc.pkceMethod = initOptions.pkceMethod;\n        } else {\n            kc.pkceMethod = \"S256\";\n        }\n\n        if (typeof initOptions.enableLogging === 'boolean') {\n            kc.enableLogging = initOptions.enableLogging;\n        } else {\n            kc.enableLogging = false;\n        }\n\n        if (initOptions.logoutMethod === 'POST') {\n            kc.logoutMethod = 'POST';\n        } else {\n            kc.logoutMethod = 'GET';\n        }\n\n        if (typeof initOptions.scope === 'string') {\n            kc.scope = initOptions.scope;\n        }\n\n        if (typeof initOptions.acrValues === 'string') {\n            kc.acrValues = initOptions.acrValues;\n        }\n\n        if (typeof initOptions.messageReceiveTimeout === 'number' \u0026\u0026 initOptions.messageReceiveTimeout \u003e 0) {\n            kc.messageReceiveTimeout = initOptions.messageReceiveTimeout;\n        } else {\n            kc.messageReceiveTimeout = 10000;\n        }\n\n        if (!kc.responseMode) {\n            kc.responseMode = 'fragment';\n        }\n        if (!kc.responseType) {\n            kc.responseType = 'code';\n            kc.flow = 'standard';\n        }\n\n        var promise = createPromise();\n\n        var initPromise = createPromise();\n        initPromise.promise.then(function() {\n            kc.onReady \u0026\u0026 kc.onReady(kc.authenticated);\n            promise.setSuccess(kc.authenticated);\n        }).catch(function(error) {\n            promise.setError(error);\n        });\n\n        var configPromise = loadConfig();\n\n        function onLoad() {\n            var doLogin = function(prompt) {\n                if (!prompt) {\n                    options.prompt = 'none';\n                }\n\n                if (initOptions.locale) {\n                    options.locale = initOptions.locale;\n                }\n                kc.login(options).then(function () {\n                    initPromise.setSuccess();\n                }).catch(function (error) {\n                    initPromise.setError(error);\n                });\n            }\n\n            var checkSsoSilently = async function() {\n                var ifrm = document.createElement(\"iframe\");\n                var src = await kc.createLoginUrl({prompt: 'none', redirectUri: kc.silentCheckSsoRedirectUri});\n                ifrm.setAttribute(\"src\", src);\n                ifrm.setAttribute(\"sandbox\", \"allow-storage-access-by-user-activation allow-scripts allow-same-origin\");\n                ifrm.setAttribute(\"title\", \"keycloak-silent-check-sso\");\n                ifrm.style.display = \"none\";\n                document.body.appendChild(ifrm);\n\n                var messageCallback = function(event) {\n                    if (event.origin !== window.location.origin || ifrm.contentWindow !== event.source) {\n                        return;\n                    }\n\n                    var oauth = parseCallback(event.data);\n                    processCallback(oauth, initPromise);\n\n                    document.body.removeChild(ifrm);\n                    window.removeEventListener(\"message\", messageCallback);\n                };\n\n                window.addEventListener(\"message\", messageCallback);\n            };\n\n            var options = {};\n            switch (initOptions.onLoad) {\n                case 'check-sso':\n                    if (loginIframe.enable) {\n                        setupCheckLoginIframe().then(function() {\n                            checkLoginIframe().then(function (unchanged) {\n                                if (!unchanged) {\n                                    kc.silentCheckSsoRedirectUri ? checkSsoSilently() : doLogin(false);\n                                } else {\n                                    initPromise.setSuccess();\n                                }\n                            }).catch(function (error) {\n                                initPromise.setError(error);\n                            });\n                        });\n                    } else {\n                        kc.silentCheckSsoRedirectUri ? checkSsoSilently() : doLogin(false);\n                    }\n                    break;\n                case 'login-required':\n                    doLogin(true);\n                    break;\n                default:\n                    throw 'Invalid value for onLoad';\n            }\n        }\n\n        function processInit() {\n            var callback = parseCallback(window.location.href);\n\n            if (callback) {\n                window.history.replaceState(window.history.state, null, callback.newUrl);\n            }\n\n            if (callback \u0026\u0026 callback.valid) {\n                return setupCheckLoginIframe().then(function() {\n                    processCallback(callback, initPromise);\n                }).catch(function (error) {\n                    initPromise.setError(error);\n                });\n            }\n\n            if (initOptions.token \u0026\u0026 initOptions.refreshToken) {\n                setToken(initOptions.token, initOptions.refreshToken, initOptions.idToken);\n\n                if (loginIframe.enable) {\n                    setupCheckLoginIframe().then(function() {\n                        checkLoginIframe().then(function (unchanged) {\n                            if (unchanged) {\n                                kc.onAuthSuccess \u0026\u0026 kc.onAuthSuccess();\n                                initPromise.setSuccess();\n                                scheduleCheckIframe();\n                            } else {\n                                initPromise.setSuccess();\n                            }\n                        }).catch(function (error) {\n                            initPromise.setError(error);\n                        });\n                    });\n                } else {\n                    kc.updateToken(-1).then(function() {\n                        kc.onAuthSuccess \u0026\u0026 kc.onAuthSuccess();\n                        initPromise.setSuccess();\n                    }).catch(function(error) {\n                        kc.onAuthError \u0026\u0026 kc.onAuthError();\n                        if (initOptions.onLoad) {\n                            onLoad();\n                        } else {\n                            initPromise.setError(error);\n                        }\n                    });\n                }\n            } else if (initOptions.onLoad) {\n                onLoad();\n            } else {\n                initPromise.setSuccess();\n            }\n        }\n\n        configPromise.then(function () {\n            check3pCookiesSupported()\n                .then(processInit)\n                .catch(function (error) {\n                    promise.setError(error);\n                });\n        });\n        configPromise.catch(function (error) {\n            promise.setError(error);\n        });\n\n        return promise.promise;\n    }\n\n    kc.login = function (options) {\n        return adapter.login(options);\n    }\n\n    function generateRandomData(len) {\n        if (typeof crypto === \"undefined\" || typeof crypto.getRandomValues === \"undefined\") {\n            throw new Error(\"Web Crypto API is not available.\");\n        }\n\n        return crypto.getRandomValues(new Uint8Array(len));\n    }\n\n    function generateCodeVerifier(len) {\n        return generateRandomString(len, 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789');\n    }\n\n    function generateRandomString(len, alphabet){\n        var randomData = generateRandomData(len);\n        var chars = new Array(len);\n        for (var i = 0; i \u003c len; i++) {\n            chars[i] = alphabet.charCodeAt(randomData[i] % alphabet.length);\n        }\n        return String.fromCharCode.apply(null, chars);\n    }\n\n    async function generatePkceChallenge(pkceMethod, codeVerifier) {\n        if (pkceMethod !== \"S256\") {\n            throw new TypeError(`Invalid value for 'pkceMethod', expected 'S256' but got '${pkceMethod}'.`);\n        }\n\n        // hash codeVerifier, then encode as url-safe base64 without padding\n        const hashBytes = new Uint8Array(await sha256Digest(codeVerifier));\n        const encodedHash = bytesToBase64(hashBytes)\n            .replace(/\\+/g, '-')\n            .replace(/\\//g, '_')\n            .replace(/\\=/g, '');\n\n        return encodedHash;\n    }\n\n    function buildClaimsParameter(requestedAcr){\n        var claims = {\n            id_token: {\n                acr: requestedAcr\n            }\n        }\n        return JSON.stringify(claims);\n    }\n\n    kc.createLoginUrl = async function(options) {\n        var state = createUUID();\n        var nonce = createUUID();\n\n        var redirectUri = adapter.redirectUri(options);\n\n        var callbackState = {\n            state: state,\n            nonce: nonce,\n            redirectUri: encodeURIComponent(redirectUri),\n            loginOptions: options\n        };\n\n        if (options \u0026\u0026 options.prompt) {\n            callbackState.prompt = options.prompt;\n        }\n\n        var baseUrl;\n        if (options \u0026\u0026 options.action == 'register') {\n            baseUrl = kc.endpoints.register();\n        } else {\n            baseUrl = kc.endpoints.authorize();\n        }\n\n        var scope = options \u0026\u0026 options.scope || kc.scope;\n        if (!scope) {\n            // if scope is not set, default to \"openid\"\n            scope = \"openid\";\n        } else if (scope.indexOf(\"openid\") === -1) {\n            // if openid scope is missing, prefix the given scopes with it\n            scope = \"openid \" + scope;\n        }\n\n        var url = baseUrl\n            + '?client_id=' + encodeURIComponent(kc.clientId)\n            + '\u0026redirect_uri=' + encodeURIComponent(redirectUri)\n            + '\u0026state=' + encodeURIComponent(state)\n            + '\u0026response_mode=' + encodeURIComponent(kc.responseMode)\n            + '\u0026response_type=' + encodeURIComponent(kc.responseType)\n            + '\u0026scope=' + encodeURIComponent(scope);\n        if (useNonce) {\n            url = url + '\u0026nonce=' + encodeURIComponent(nonce);\n        }\n\n        if (options \u0026\u0026 options.prompt) {\n            url += '\u0026prompt=' + encodeURIComponent(options.prompt);\n        }\n\n        if (options \u0026\u0026 typeof options.maxAge === 'number') {\n            url += '\u0026max_age=' + encodeURIComponent(options.maxAge);\n        }\n\n        if (options \u0026\u0026 options.loginHint) {\n            url += '\u0026login_hint=' + encodeURIComponent(options.loginHint);\n        }\n\n        if (options \u0026\u0026 options.idpHint) {\n            url += '\u0026kc_idp_hint=' + encodeURIComponent(options.idpHint);\n        }\n\n        if (options \u0026\u0026 options.action \u0026\u0026 options.action != 'register') {\n            url += '\u0026kc_action=' + encodeURIComponent(options.action);\n        }\n\n        if (options \u0026\u0026 options.locale) {\n            url += '\u0026ui_locales=' + encodeURIComponent(options.locale);\n        }\n\n        if (options \u0026\u0026 options.acr) {\n            var claimsParameter = buildClaimsParameter(options.acr);\n            url += '\u0026claims=' + encodeURIComponent(claimsParameter);\n        }\n\n        if ((options \u0026\u0026 options.acrValues) || kc.acrValues) {\n            url += '\u0026acr_values=' + encodeURIComponent(options.acrValues || kc.acrValues);\n        }\n\n        if (kc.pkceMethod) {\n            try {\n                const codeVerifier = generateCodeVerifier(96);\n                const pkceChallenge = await generatePkceChallenge(kc.pkceMethod, codeVerifier);\n\n                callbackState.pkceCodeVerifier = codeVerifier;\n\n                url += '\u0026code_challenge=' + pkceChallenge;\n                url += '\u0026code_challenge_method=' + kc.pkceMethod;\n            } catch (error) {\n                throw new Error(\"Failed to generate PKCE challenge.\", { cause: error });\n            }\n        }\n\n        callbackStorage.add(callbackState);\n\n        return url;\n    }\n\n    kc.logout = function(options) {\n        return adapter.logout(options);\n    }\n\n    kc.createLogoutUrl = function(options) {\n\n        const logoutMethod = options?.logoutMethod ?? kc.logoutMethod;\n        if (logoutMethod === 'POST') {\n            return kc.endpoints.logout();\n        }\n\n        var url = kc.endpoints.logout()\n            + '?client_id=' + encodeURIComponent(kc.clientId)\n            + '\u0026post_logout_redirect_uri=' + encodeURIComponent(adapter.redirectUri(options, false));\n\n        if (kc.idToken) {\n            url += '\u0026id_token_hint=' + encodeURIComponent(kc.idToken);\n        }\n\n        return url;\n    }\n\n    kc.register = function (options) {\n        return adapter.register(options);\n    }\n\n    kc.createRegisterUrl = async function(options) {\n        if (!options) {\n            options = {};\n        }\n        options.action = 'register';\n        return await kc.createLoginUrl(options);\n    }\n\n    kc.createAccountUrl = function(options) {\n        var realm = getRealmUrl();\n        var url = undefined;\n        if (typeof realm !== 'undefined') {\n            url = realm\n            + '/account'\n            + '?referrer=' + encodeURIComponent(kc.clientId)\n            + '\u0026referrer_uri=' + encodeURIComponent(adapter.redirectUri(options));\n        }\n        return url;\n    }\n\n    kc.accountManagement = function() {\n        return adapter.accountManagement();\n    }\n\n    kc.hasRealmRole = function (role) {\n        var access = kc.realmAccess;\n        return !!access \u0026\u0026 access.roles.indexOf(role) \u003e= 0;\n    }\n\n    kc.hasResourceRole = function(role, resource) {\n        if (!kc.resourceAccess) {\n            return false;\n        }\n\n        var access = kc.resourceAccess[resource || kc.clientId];\n        return !!access \u0026\u0026 access.roles.indexOf(role) \u003e= 0;\n    }\n\n    kc.loadUserProfile = function() {\n        var url = getRealmUrl() + '/account';\n        var req = new XMLHttpRequest();\n        req.open('GET', url, true);\n        req.setRequestHeader('Accept', 'application/json');\n        req.setRequestHeader('Authorization', 'bearer ' + kc.token);\n\n        var promise = createPromise();\n\n        req.onreadystatechange = function () {\n            if (req.readyState == 4) {\n                if (req.status == 200) {\n                    kc.profile = JSON.parse(req.responseText);\n                    promise.setSuccess(kc.profile);\n                } else {\n                    promise.setError();\n                }\n            }\n        }\n\n        req.send();\n\n        return promise.promise;\n    }\n\n    kc.loadUserInfo = function() {\n        var url = kc.endpoints.userinfo();\n        var req = new XMLHttpRequest();\n        req.open('GET', url, true);\n        req.setRequestHeader('Accept', 'application/json');\n        req.setRequestHeader('Authorization', 'bearer ' + kc.token);\n\n        var promise = createPromise();\n\n        req.onreadystatechange = function () {\n            if (req.readyState == 4) {\n                if (req.status == 200) {\n                    kc.userInfo = JSON.parse(req.responseText);\n                    promise.setSuccess(kc.userInfo);\n                } else {\n                    promise.setError();\n                }\n            }\n        }\n\n        req.send();\n\n        return promise.promise;\n    }\n\n    kc.isTokenExpired = function(minValidity) {\n        if (!kc.tokenParsed || (!kc.refreshToken \u0026\u0026 kc.flow != 'implicit' )) {\n            throw 'Not authenticated';\n        }\n\n        if (kc.timeSkew == null) {\n            logInfo('[KEYCLOAK] Unable to determine if token is expired as timeskew is not set');\n            return true;\n        }\n\n        var expiresIn = kc.tokenParsed['exp'] - Math.ceil(new Date().getTime() / 1000) + kc.timeSkew;\n        if (minValidity) {\n            if (isNaN(minValidity)) {\n                throw 'Invalid minValidity';\n            }\n            expiresIn -= minValidity;\n        }\n        return expiresIn \u003c 0;\n    }\n\n    kc.updateToken = function(minValidity) {\n        var promise = createPromise();\n\n        if (!kc.refreshToken) {\n            promise.setError();\n            return promise.promise;\n        }\n\n        minValidity = minValidity || 5;\n\n        var exec = function() {\n            var refreshToken = false;\n            if (minValidity == -1) {\n                refreshToken = true;\n                logInfo('[KEYCLOAK] Refreshing token: forced refresh');\n            } else if (!kc.tokenParsed || kc.isTokenExpired(minValidity)) {\n                refreshToken = true;\n                logInfo('[KEYCLOAK] Refreshing token: token expired');\n            }\n\n            if (!refreshToken) {\n                promise.setSuccess(false);\n            } else {\n                var params = 'grant_type=refresh_token\u0026' + 'refresh_token=' + kc.refreshToken;\n                var url = kc.endpoints.token();\n\n                refreshQueue.push(promise);\n\n                if (refreshQueue.length == 1) {\n                    var req = new XMLHttpRequest();\n                    req.open('POST', url, true);\n                    req.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');\n                    req.withCredentials = true;\n\n                    params += '\u0026client_id=' + encodeURIComponent(kc.clientId);\n\n                    var timeLocal = new Date().getTime();\n\n                    req.onreadystatechange = function () {\n                        if (req.readyState == 4) {\n                            if (req.status == 200) {\n                                logInfo('[KEYCLOAK] Token refreshed');\n\n                                timeLocal = (timeLocal + new Date().getTime()) / 2;\n\n                                var tokenResponse = JSON.parse(req.responseText);\n\n                                setToken(tokenResponse['access_token'], tokenResponse['refresh_token'], tokenResponse['id_token'], timeLocal);\n\n                                kc.onAuthRefreshSuccess \u0026\u0026 kc.onAuthRefreshSuccess();\n                                for (var p = refreshQueue.pop(); p != null; p = refreshQueue.pop()) {\n                                    p.setSuccess(true);\n                                }\n                            } else {\n                                logWarn('[KEYCLOAK] Failed to refresh token');\n\n                                if (req.status == 400) {\n                                    kc.clearToken();\n                                }\n\n                                kc.onAuthRefreshError \u0026\u0026 kc.onAuthRefreshError();\n                                for (var p = refreshQueue.pop(); p != null; p = refreshQueue.pop()) {\n                                    p.setError(true);\n                                }\n                            }\n                        }\n                    };\n\n                    req.send(params);\n                }\n            }\n        }\n\n        if (loginIframe.enable) {\n            var iframePromise = checkLoginIframe();\n            iframePromise.then(function() {\n                exec();\n            }).catch(function(error) {\n                promise.setError(error);\n            });\n        } else {\n            exec();\n        }\n\n        return promise.promise;\n    }\n\n    kc.clearToken = function() {\n        if (kc.token) {\n            setToken(null, null, null);\n            kc.onAuthLogout \u0026\u0026 kc.onAuthLogout();\n            if (kc.loginRequired) {\n                kc.login();\n            }\n        }\n    }\n\n    function getRealmUrl() {\n        if (typeof kc.authServerUrl !== 'undefined') {\n            if (kc.authServerUrl.charAt(kc.authServerUrl.length - 1) == '/') {\n                return kc.authServerUrl + 'realms/' + encodeURIComponent(kc.realm);\n            } else {\n                return kc.authServerUrl + '/realms/' + encodeURIComponent(kc.realm);\n            }\n        } else {\n            return undefined;\n        }\n    }\n\n    function getOrigin() {\n        if (!window.location.origin) {\n            return window.location.protocol + \"//\" + window.location.hostname + (window.location.port ? ':' + window.location.port: '');\n        } else {\n            return window.location.origin;\n        }\n    }\n\n    function processCallback(oauth, promise) {\n        var code = oauth.code;\n        var error = oauth.error;\n        var prompt = oauth.prompt;\n\n        var timeLocal = new Date().getTime();\n\n        if (oauth['kc_action_status']) {\n            kc.onActionUpdate \u0026\u0026 kc.onActionUpdate(oauth['kc_action_status'], oauth['kc_action']);\n        }\n\n        if (error) {\n            if (prompt != 'none') {\n                if (oauth.error_description \u0026\u0026 oauth.error_description === \"authentication_expired\") {\n                    kc.login(oauth.loginOptions);\n                } else {\n                    var errorData = { error: error, error_description: oauth.error_description };\n                    kc.onAuthError \u0026\u0026 kc.onAuthError(errorData);\n                    promise \u0026\u0026 promise.setError(errorData);\n                }\n            } else {\n                promise \u0026\u0026 promise.setSuccess();\n            }\n            return;\n        } else if ((kc.flow != 'standard') \u0026\u0026 (oauth.access_token || oauth.id_token)) {\n            authSuccess(oauth.access_token, null, oauth.id_token, true);\n        }\n\n        if ((kc.flow != 'implicit') \u0026\u0026 code) {\n            var params = 'code=' + code + '\u0026grant_type=authorization_code';\n            var url = kc.endpoints.token();\n\n            var req = new XMLHttpRequest();\n            req.open('POST', url, true);\n            req.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');\n\n            params += '\u0026client_id=' + encodeURIComponent(kc.clientId);\n            params += '\u0026redirect_uri=' + oauth.redirectUri;\n\n            if (oauth.pkceCodeVerifier) {\n                params += '\u0026code_verifier=' + oauth.pkceCodeVerifier;\n            }\n\n            req.withCredentials = true;\n\n            req.onreadystatechange = function() {\n                if (req.readyState == 4) {\n                    if (req.status == 200) {\n\n                        var tokenResponse = JSON.parse(req.responseText);\n                        authSuccess(tokenResponse['access_token'], tokenResponse['refresh_token'], tokenResponse['id_token'], kc.flow === 'standard');\n                        scheduleCheckIframe();\n                    } else {\n                        kc.onAuthError \u0026\u0026 kc.onAuthError();\n                        promise \u0026\u0026 promise.setError();\n                    }\n                }\n            };\n\n            req.send(params);\n        }\n\n        function authSuccess(accessToken, refreshToken, idToken, fulfillPromise) {\n            timeLocal = (timeLocal + new Date().getTime()) / 2;\n\n            setToken(accessToken, refreshToken, idToken, timeLocal);\n\n            if (useNonce \u0026\u0026 (kc.idTokenParsed \u0026\u0026 kc.idTokenParsed.nonce != oauth.storedNonce)) {\n                logInfo('[KEYCLOAK] Invalid nonce, clearing token');\n                kc.clearToken();\n                promise \u0026\u0026 promise.setError();\n            } else {\n                if (fulfillPromise) {\n                    kc.onAuthSuccess \u0026\u0026 kc.onAuthSuccess();\n                    promise \u0026\u0026 promise.setSuccess();\n                }\n            }\n        }\n\n    }\n\n    function loadConfig() {\n        var promise = createPromise();\n        var configUrl;\n\n        if (typeof config === 'string') {\n            configUrl = config;\n        }\n\n        function setupOidcEndoints(oidcConfiguration) {\n            if (! oidcConfiguration) {\n                kc.endpoints = {\n                    authorize: function() {\n                        return getRealmUrl() + '/protocol/openid-connect/auth';\n                    },\n                    token: function() {\n                        return getRealmUrl() + '/protocol/openid-connect/token';\n                    },\n                    logout: function() {\n                        return getRealmUrl() + '/protocol/openid-connect/logout';\n                    },\n                    checkSessionIframe: function() {\n                        return getRealmUrl() + '/protocol/openid-connect/login-status-iframe.html';\n                    },\n                    thirdPartyCookiesIframe: function() {\n                        return getRealmUrl() + '/protocol/openid-connect/3p-cookies/step1.html';\n                    },\n                    register: function() {\n                        return getRealmUrl() + '/protocol/openid-connect/registrations';\n                    },\n                    userinfo: function() {\n                        return getRealmUrl() + '/protocol/openid-connect/userinfo';\n                    }\n                };\n            } else {\n                kc.endpoints = {\n                    authorize: function() {\n                        return oidcConfiguration.authorization_endpoint;\n                    },\n                    token: function() {\n                        return oidcConfiguration.token_endpoint;\n                    },\n                    logout: function() {\n                        if (!oidcConfiguration.end_session_endpoint) {\n                            throw \"Not supported by the OIDC server\";\n                        }\n                        return oidcConfiguration.end_session_endpoint;\n                    },\n                    checkSessionIframe: function() {\n                        if (!oidcConfiguration.check_session_iframe) {\n                            throw \"Not supported by the OIDC server\";\n                        }\n                        return oidcConfiguration.check_session_iframe;\n                    },\n                    register: function() {\n                        throw 'Redirection to \"Register user\" page not supported in standard OIDC mode';\n                    },\n                    userinfo: function() {\n                        if (!oidcConfiguration.userinfo_endpoint) {\n                            throw \"Not supported by the OIDC server\";\n                        }\n                        return oidcConfiguration.userinfo_endpoint;\n                    }\n                }\n            }\n        }\n\n        if (configUrl) {\n            var req = new XMLHttpRequest();\n            req.open('GET', configUrl, true);\n            req.setRequestHeader('Accept', 'application/json');\n\n            req.onreadystatechange = function () {\n                if (req.readyState == 4) {\n                    if (req.status == 200 || fileLoaded(req)) {\n                        var config = JSON.parse(req.responseText);\n\n                        kc.authServerUrl = config['auth-server-url'];\n                        kc.realm = config['realm'];\n                        kc.clientId = config['resource'];\n                        setupOidcEndoints(null);\n                        promise.setSuccess();\n                    } else {\n                        promise.setError();\n                    }\n                }\n            };\n\n            req.send();\n        } else {\n            kc.clientId = config.clientId;\n\n            var oidcProvider = config['oidcProvider'];\n            if (!oidcProvider) {\n                kc.authServerUrl = config.url;\n                kc.realm = config.realm;\n                setupOidcEndoints(null);\n                promise.setSuccess();\n            } else {\n                if (typeof oidcProvider === 'string') {\n                    var oidcProviderConfigUrl;\n                    if (oidcProvider.charAt(oidcProvider.length - 1) == '/') {\n                        oidcProviderConfigUrl = oidcProvider + '.well-known/openid-configuration';\n                    } else {\n                        oidcProviderConfigUrl = oidcProvider + '/.well-known/openid-configuration';\n                    }\n                    var req = new XMLHttpRequest();\n                    req.open('GET', oidcProviderConfigUrl, true);\n                    req.setRequestHeader('Accept', 'application/json');\n\n                    req.onreadystatechange = function () {\n                        if (req.readyState == 4) {\n                            if (req.status == 200 || fileLoaded(req)) {\n                                var oidcProviderConfig = JSON.parse(req.responseText);\n                                setupOidcEndoints(oidcProviderConfig);\n                                promise.setSuccess();\n                            } else {\n                                promise.setError();\n                            }\n                        }\n                    };\n\n                    req.send();\n                } else {\n                    setupOidcEndoints(oidcProvider);\n                    promise.setSuccess();\n                }\n            }\n        }\n\n        return promise.promise;\n    }\n\n    function fileLoaded(xhr) {\n        return xhr.status == 0 \u0026\u0026 xhr.responseText \u0026\u0026 xhr.responseURL.startsWith('file:');\n    }\n\n    function setToken(token, refreshToken, idToken, timeLocal) {\n        if (kc.tokenTimeoutHandle) {\n            clearTimeout(kc.tokenTimeoutHandle);\n            kc.tokenTimeoutHandle = null;\n        }\n\n        if (refreshToken) {\n            kc.refreshToken = refreshToken;\n            kc.refreshTokenParsed = decodeToken(refreshToken);\n        } else {\n            delete kc.refreshToken;\n            delete kc.refreshTokenParsed;\n        }\n\n        if (idToken) {\n            kc.idToken = idToken;\n            kc.idTokenParsed = decodeToken(idToken);\n        } else {\n            delete kc.idToken;\n            delete kc.idTokenParsed;\n        }\n\n        if (token) {\n            kc.token = token;\n            kc.tokenParsed = decodeToken(token);\n            kc.sessionId = kc.tokenParsed.sid;\n            kc.authenticated = true;\n            kc.subject = kc.tokenParsed.sub;\n            kc.realmAccess = kc.tokenParsed.realm_access;\n            kc.resourceAccess = kc.tokenParsed.resource_access;\n\n            if (timeLocal) {\n                kc.timeSkew = Math.floor(timeLocal / 1000) - kc.tokenParsed.iat;\n            }\n\n            if (kc.timeSkew != null) {\n                logInfo('[KEYCLOAK] Estimated time difference between browser and server is ' + kc.timeSkew + ' seconds');\n\n                if (kc.onTokenExpired) {\n                    var expiresIn = (kc.tokenParsed['exp'] - (new Date().getTime() / 1000) + kc.timeSkew) * 1000;\n                    logInfo('[KEYCLOAK] Token expires in ' + Math.round(expiresIn / 1000) + ' s');\n                    if (expiresIn \u003c= 0) {\n                        kc.onTokenExpired();\n                    } else {\n                        kc.tokenTimeoutHandle = setTimeout(kc.onTokenExpired, expiresIn);\n                    }\n                }\n            }\n        } else {\n            delete kc.token;\n            delete kc.tokenParsed;\n            delete kc.subject;\n            delete kc.realmAccess;\n            delete kc.resourceAccess;\n\n            kc.authenticated = false;\n        }\n    }\n\n    function createUUID() {\n        if (typeof crypto === \"undefined\" || typeof crypto.randomUUID === \"undefined\") {\n            throw new Error(\"Web Crypto API is not available.\");\n        }\n\n        return crypto.randomUUID();\n    }\n\n    function parseCallback(url) {\n        var oauth = parseCallbackUrl(url);\n        if (!oauth) {\n            return;\n        }\n\n        var oauthState = callbackStorage.get(oauth.state);\n\n        if (oauthState) {\n            oauth.valid = true;\n            oauth.redirectUri = oauthState.redirectUri;\n            oauth.storedNonce = oauthState.nonce;\n            oauth.prompt = oauthState.prompt;\n            oauth.pkceCodeVerifier = oauthState.pkceCodeVerifier;\n            oauth.loginOptions = oauthState.loginOptions;\n        }\n\n        return oauth;\n    }\n\n    function parseCallbackUrl(url) {\n        var supportedParams;\n        switch (kc.flow) {\n            case 'standard':\n                supportedParams = ['code', 'state', 'session_state', 'kc_action_status', 'kc_action', 'iss'];\n                break;\n            case 'implicit':\n                supportedParams = ['access_token', 'token_type', 'id_token', 'state', 'session_state', 'expires_in', 'kc_action_status', 'kc_action', 'iss'];\n                break;\n            case 'hybrid':\n                supportedParams = ['access_token', 'token_type', 'id_token', 'code', 'state', 'session_state', 'expires_in', 'kc_action_status', 'kc_action', 'iss'];\n                break;\n        }\n\n        supportedParams.push('error');\n        supportedParams.push('error_description');\n        supportedParams.push('error_uri');\n\n        var queryIndex = url.indexOf('?');\n        var fragmentIndex = url.indexOf('#');\n\n        var newUrl;\n        var parsed;\n\n        if (kc.responseMode === 'query' \u0026\u0026 queryIndex !== -1) {\n            newUrl = url.substring(0, queryIndex);\n            parsed = parseCallbackParams(url.substring(queryIndex + 1, fragmentIndex !== -1 ? fragmentIndex : url.length), supportedParams);\n            if (parsed.paramsString !== '') {\n                newUrl += '?' + parsed.paramsString;\n            }\n            if (fragmentIndex !== -1) {\n                newUrl += url.substring(fragmentIndex);\n            }\n        } else if (kc.responseMode === 'fragment' \u0026\u0026 fragmentIndex !== -1) {\n            newUrl = url.substring(0, fragmentIndex);\n            parsed = parseCallbackParams(url.substring(fragmentIndex + 1), supportedParams);\n            if (parsed.paramsString !== '') {\n                newUrl += '#' + parsed.paramsString;\n            }\n        }\n\n        if (parsed \u0026\u0026 parsed.oauthParams) {\n            if (kc.flow === 'standard' || kc.flow === 'hybrid') {\n                if ((parsed.oauthParams.code || parsed.oauthParams.error) \u0026\u0026 parsed.oauthParams.state) {\n                    parsed.oauthParams.newUrl = newUrl;\n                    return parsed.oauthParams;\n                }\n            } else if (kc.flow === 'implicit') {\n                if ((parsed.oauthParams.access_token || parsed.oauthParams.error) \u0026\u0026 parsed.oauthParams.state) {\n                    parsed.oauthParams.newUrl = newUrl;\n                    return parsed.oauthParams;\n                }\n            }\n        }\n    }\n\n    function parseCallbackParams(paramsString, supportedParams) {\n        var p = paramsString.split('\u0026');\n        var result = {\n            paramsString: '',\n            oauthParams: {}\n        }\n        for (var i = 0; i \u003c p.length; i++) {\n            var split = p[i].indexOf(\"=\");\n            var key = p[i].slice(0, split);\n            if (supportedParams.indexOf(key) !== -1) {\n                result.oauthParams[key] = p[i].slice(split + 1);\n            } else {\n                if (result.paramsString !== '') {\n                    result.paramsString += '\u0026';\n                }\n                result.paramsString += p[i];\n            }\n        }\n        return result;\n    }\n\n    function createPromise() {\n        // Need to create a native Promise which also preserves the\n        // interface of the custom promise type previously used by the API\n        var p = {\n            setSuccess: function(result) {\n                p.resolve(result);\n            },\n\n            setError: function(result) {\n                p.reject(result);\n            }\n        };\n        p.promise = new Promise(function(resolve, reject) {\n            p.resolve = resolve;\n            p.reject = reject;\n        });\n\n        return p;\n    }\n\n    // Function to extend existing native Promise with timeout\n    function applyTimeoutToPromise(promise, timeout, errorMessage) {\n        var timeoutHandle = null;\n        var timeoutPromise = new Promise(function (resolve, reject) {\n            timeoutHandle = setTimeout(function () {\n                reject({ \"error\": errorMessage || \"Promise is not settled within timeout of \" + timeout + \"ms\" });\n            }, timeout);\n        });\n\n        return Promise.race([promise, timeoutPromise]).finally(function () {\n            clearTimeout(timeoutHandle);\n        });\n    }\n\n    function setupCheckLoginIframe() {\n        var promise = createPromise();\n\n        if (!loginIframe.enable) {\n            promise.setSuccess();\n            return promise.promise;\n        }\n\n        if (loginIframe.iframe) {\n            promise.setSuccess();\n            return promise.promise;\n        }\n\n        var iframe = document.createElement('iframe');\n        loginIframe.iframe = iframe;\n\n        iframe.onload = function() {\n            var authUrl = kc.endpoints.authorize();\n            if (authUrl.charAt(0) === '/') {\n                loginIframe.iframeOrigin = getOrigin();\n            } else {\n                loginIframe.iframeOrigin = authUrl.substring(0, authUrl.indexOf('/', 8));\n            }\n            promise.setSuccess();\n        }\n\n        var src = kc.endpoints.checkSessionIframe();\n        iframe.setAttribute('src', src );\n        iframe.setAttribute('sandbox', 'allow-storage-access-by-user-activation allow-scripts allow-same-origin');\n        iframe.setAttribute('title', 'keycloak-session-iframe' );\n        iframe.style.display = 'none';\n        document.body.appendChild(iframe);\n\n        var messageCallback = function(event) {\n            if ((event.origin !== loginIframe.iframeOrigin) || (loginIframe.iframe.contentWindow !== event.source)) {\n                return;\n            }\n\n            if (!(event.data == 'unchanged' || event.data == 'changed' || event.data == 'error')) {\n                return;\n            }\n\n\n            if (event.data != 'unchanged') {\n                kc.clearToken();\n            }\n\n            var callbacks = loginIframe.callbackList.splice(0, loginIframe.callbackList.length);\n\n            for (var i = callbacks.length - 1; i \u003e= 0; --i) {\n                var promise = callbacks[i];\n                if (event.data == 'error') {\n                    promise.setError();\n                } else {\n                    promise.setSuccess(event.data == 'unchanged');\n                }\n            }\n        };\n\n        window.addEventListener('message', messageCallback, false);\n\n        return promise.promise;\n    }\n\n    function scheduleCheckIframe() {\n        if (loginIframe.enable) {\n            if (kc.token) {\n                setTimeout(function() {\n                    checkLoginIframe().then(function(unchanged) {\n                        if (unchanged) {\n                            scheduleCheckIframe();\n                        }\n                    });\n                }, loginIframe.interval * 1000);\n            }\n        }\n    }\n\n    function checkLoginIframe() {\n        var promise = createPromise();\n\n        if (loginIframe.iframe \u0026\u0026 loginIframe.iframeOrigin ) {\n            var msg = kc.clientId + ' ' + (kc.sessionId ? kc.sessionId : '');\n            loginIframe.callbackList.push(promise);\n            var origin = loginIframe.iframeOrigin;\n            if (loginIframe.callbackList.length == 1) {\n                loginIframe.iframe.contentWindow.postMessage(msg, origin);\n            }\n        } else {\n            promise.setSuccess();\n        }\n\n        return promise.promise;\n    }\n\n    function check3pCookiesSupported() {\n        var promise = createPromise();\n\n        if ((loginIframe.enable || kc.silentCheckSsoRedirectUri) \u0026\u0026 typeof kc.endpoints.thirdPartyCookiesIframe === 'function') {\n            var iframe = document.createElement('iframe');\n            iframe.setAttribute('src', kc.endpoints.thirdPartyCookiesIframe());\n            iframe.setAttribute('sandbox', 'allow-storage-access-by-user-activation allow-scripts allow-same-origin');\n            iframe.setAttribute('title', 'keycloak-3p-check-iframe' );\n            iframe.style.display = 'none';\n            document.body.appendChild(iframe);\n\n            var messageCallback = function(event) {\n                if (iframe.contentWindow !== event.source) {\n                    return;\n                }\n\n                if (event.data !== \"supported\" \u0026\u0026 event.data !== \"unsupported\") {\n                    return;\n                } else if (event.data === \"unsupported\") {\n                    logWarn(\n                        \"[KEYCLOAK] Your browser is blocking access to 3rd-party cookies, this means:\\n\\n\" +\n                        \" - It is not possible to retrieve tokens without redirecting to the Keycloak server (a.k.a. no support for silent authentication).\\n\" +\n                        \" - It is not possible to automatically detect changes to the session status (such as the user logging out in another tab).\\n\\n\" +\n                        \"For more information see: https://www.keycloak.org/docs/latest/securing_apps/#_modern_browsers\"\n                    );\n\n                    loginIframe.enable = false;\n                    if (kc.silentCheckSsoFallback) {\n                        kc.silentCheckSsoRedirectUri = false;\n                    }\n                }\n\n                document.body.removeChild(iframe);\n                window.removeEventListener(\"message\", messageCallback);\n                promise.setSuccess();\n            };\n\n            window.addEventListener('message', messageCallback, false);\n        } else {\n            promise.setSuccess();\n        }\n\n        return applyTimeoutToPromise(promise.promise, kc.messageReceiveTimeout, \"Timeout when waiting for 3rd party check iframe message.\");\n    }\n\n    function loadAdapter(type) {\n        if (!type || type == 'default') {\n            return {\n                login: async function(options) {\n                    window.location.assign(await kc.createLoginUrl(options));\n                    return createPromise().promise;\n                },\n\n                logout: async function(options) {\n\n                    const logoutMethod = options?.logoutMethod ?? kc.logoutMethod;\n                    if (logoutMethod === \"GET\") {\n                        window.location.replace(kc.createLogoutUrl(options));\n                        return;\n                    }\n\n                    const logoutUrl = kc.createLogoutUrl(options);\n                    const response = await fetch(logoutUrl, {\n                        method: \"POST\",\n                        headers: {\n                            \"Content-Type\": \"application/x-www-form-urlencoded\"\n                        },\n                        body: new URLSearchParams({\n                            id_token_hint: kc.idToken,\n                            client_id: kc.clientId,\n                            post_logout_redirect_uri: adapter.redirectUri(options, false)\n                        })\n                    });\n\n                    if (response.redirected) {\n                        window.location.href = response.url;\n                        return;\n                    }\n\n                    if (response.ok) {\n                        window.location.reload();\n                        return;\n                    }\n\n                    throw new Error(\"Logout failed, request returned an error code.\");\n                },\n\n                register: async function(options) {\n                    window.location.assign(await kc.createRegisterUrl(options));\n                    return createPromise().promise;\n                },\n\n                accountManagement : function() {\n                    var accountUrl = kc.createAccountUrl();\n                    if (typeof accountUrl !== 'undefined') {\n                        window.location.href = accountUrl;\n                    } else {\n                        throw \"Not supported by the OIDC server\";\n                    }\n                    return createPromise().promise;\n                },\n\n                redirectUri: function(options, encodeHash) {\n                    if (arguments.length == 1) {\n                        encodeHash = true;\n                    }\n\n                    if (options \u0026\u0026 options.redirectUri) {\n                        return options.redirectUri;\n                    } else if (kc.redirectUri) {\n                        return kc.redirectUri;\n                    } else {\n                        return location.href;\n                    }\n                }\n            };\n        }\n\n        if (type == 'cordova') {\n            loginIframe.enable = false;\n            var cordovaOpenWindowWrapper = function(loginUrl, target, options) {\n                if (window.cordova \u0026\u0026 window.cordova.InAppBrowser) {\n                    // Use inappbrowser for IOS and Android if available\n                    return window.cordova.InAppBrowser.open(loginUrl, target, options);\n                } else {\n                    return window.open(loginUrl, target, options);\n                }\n            };\n\n            var shallowCloneCordovaOptions = function (userOptions) {\n                if (userOptions \u0026\u0026 userOptions.cordovaOptions) {\n                    return Object.keys(userOptions.cordovaOptions).reduce(function (options, optionName) {\n                        options[optionName] = userOptions.cordovaOptions[optionName];\n                        return options;\n                    }, {});\n                } else {\n                    return {};\n                }\n            };\n\n            var formatCordovaOptions = function (cordovaOptions) {\n                return Object.keys(cordovaOptions).reduce(function (options, optionName) {\n                    options.push(optionName+\"=\"+cordovaOptions[optionName]);\n                    return options;\n                }, []).join(\",\");\n            };\n\n            var createCordovaOptions = function (userOptions) {\n                var cordovaOptions = shallowCloneCordovaOptions(userOptions);\n                cordovaOptions.location = 'no';\n                if (userOptions \u0026\u0026 userOptions.prompt == 'none') {\n                    cordovaOptions.hidden = 'yes';\n                }\n                return formatCordovaOptions(cordovaOptions);\n            };\n\n            var getCordovaRedirectUri = function() {\n                return kc.redirectUri || 'http://localhost';\n            }\n\n            return {\n                login: async function(options) {\n                    var promise = createPromise();\n\n                    var cordovaOptions = createCordovaOptions(options);\n                    var loginUrl = await kc.createLoginUrl(options);\n                    var ref = cordovaOpenWindowWrapper(loginUrl, '_blank', cordovaOptions);\n                    var completed = false;\n\n                    var closed = false;\n                    var closeBrowser = function() {\n                        closed = true;\n                        ref.close();\n                    };\n\n                    ref.addEventListener('loadstart', function(event) {\n                        if (event.url.indexOf(getCordovaRedirectUri()) == 0) {\n                            var callback = parseCallback(event.url);\n                            processCallback(callback, promise);\n                            closeBrowser();\n                            completed = true;\n                        }\n                    });\n\n                    ref.addEventListener('loaderror', function(event) {\n                        if (!completed) {\n                            if (event.url.indexOf(getCordovaRedirectUri()) == 0) {\n                                var callback = parseCallback(event.url);\n                                processCallback(callback, promise);\n                                closeBrowser();\n                                completed = true;\n                            } else {\n                                promise.setError();\n                                closeBrowser();\n                            }\n                        }\n                    });\n\n                    ref.addEventListener('exit', function(event) {\n                        if (!closed) {\n                            promise.setError({\n                                reason: \"closed_by_user\"\n                            });\n                        }\n                    });\n\n                    return promise.promise;\n                },\n\n                logout: function(options) {\n                    var promise = createPromise();\n\n                    var logoutUrl = kc.createLogoutUrl(options);\n                    var ref = cordovaOpenWindowWrapper(logoutUrl, '_blank', 'location=no,hidden=yes,clearcache=yes');\n\n                    var error;\n\n                    ref.addEventListener('loadstart', function(event) {\n                        if (event.url.indexOf(getCordovaRedirectUri()) == 0) {\n                            ref.close();\n                        }\n                    });\n\n                    ref.addEventListener('loaderror', function(event) {\n                        if (event.url.indexOf(getCordovaRedirectUri()) == 0) {\n                            ref.close();\n                        } else {\n                            error = true;\n                            ref.close();\n                        }\n                    });\n\n                    ref.addEventListener('exit', function(event) {\n                        if (error) {\n                            promise.setError();\n                        } else {\n                            kc.clearToken();\n                            promise.setSuccess();\n                        }\n                    });\n\n                    return promise.promise;\n                },\n\n                register : async function(options) {\n                    var promise = createPromise();\n                    var registerUrl = await kc.createRegisterUrl();\n                    var cordovaOptions = createCordovaOptions(options);\n                    var ref = cordovaOpenWindowWrapper(registerUrl, '_blank', cordovaOptions);\n                    ref.addEventListener('loadstart', function(event) {\n                        if (event.url.indexOf(getCordovaRedirectUri()) == 0) {\n                            ref.close();\n                            var oauth = parseCallback(event.url);\n                            processCallback(oauth, promise);\n                        }\n                    });\n                    return promise.promise;\n                },\n\n                accountManagement : function() {\n                    var accountUrl = kc.createAccountUrl();\n                    if (typeof accountUrl !== 'undefined') {\n                        var ref = cordovaOpenWindowWrapper(accountUrl, '_blank', 'location=no');\n                        ref.addEventListener('loadstart', function(event) {\n                            if (event.url.indexOf(getCordovaRedirectUri()) == 0) {\n                                ref.close();\n                            }\n                        });\n                    } else {\n                        throw \"Not supported by the OIDC server\";\n                    }\n                },\n\n                redirectUri: function(options) {\n                    return getCordovaRedirectUri();\n                }\n            }\n        }\n\n        if (type == 'cordova-native') {\n            loginIframe.enable = false;\n\n            return {\n                login: async function(options) {\n                    var promise = createPromise();\n                    var loginUrl = await kc.createLoginUrl(options);\n\n                    universalLinks.subscribe('keycloak', function(event) {\n                        universalLinks.unsubscribe('keycloak');\n                        window.cordova.plugins.browsertab.close();\n                        var oauth = parseCallback(event.url);\n                        processCallback(oauth, promise);\n                    });\n\n                    window.cordova.plugins.browsertab.openUrl(loginUrl);\n                    return promise.promise;\n                },\n\n                logout: function(options) {\n                    var promise = createPromise();\n                    var logoutUrl = kc.createLogoutUrl(options);\n\n                    universalLinks.subscribe('keycloak', function(event) {\n                        universalLinks.unsubscribe('keycloak');\n                        window.cordova.plugins.browsertab.close();\n                        kc.clearToken();\n                        promise.setSuccess();\n                    });\n\n                    window.cordova.plugins.browsertab.openUrl(logoutUrl);\n                    return promise.promise;\n                },\n\n                register : async function(options) {\n                    var promise = createPromise();\n                    var registerUrl = await kc.createRegisterUrl(options);\n                    universalLinks.subscribe('keycloak' , function(event) {\n                        universalLinks.unsubscribe('keycloak');\n                        window.cordova.plugins.browsertab.close();\n                        var oauth = parseCallback(event.url);\n                        processCallback(oauth, promise);\n                    });\n                    window.cordova.plugins.browsertab.openUrl(registerUrl);\n                    return promise.promise;\n\n                },\n\n                accountManagement : function() {\n                    var accountUrl = kc.createAccountUrl();\n                    if (typeof accountUrl !== 'undefined') {\n                        window.cordova.plugins.browsertab.openUrl(accountUrl);\n                    } else {\n                        throw \"Not supported by the OIDC server\";\n                    }\n                },\n\n                redirectUri: function(options) {\n                    if (options \u0026\u0026 options.redirectUri) {\n                        return options.redirectUri;\n                    } else if (kc.redirectUri) {\n                        return kc.redirectUri;\n                    } else {\n                        return \"http://localhost\";\n                    }\n                }\n            }\n        }\n\n        throw 'invalid adapter type: ' + type;\n    }\n\n    const STORAGE_KEY_PREFIX = 'kc-callback-';\n\n    var LocalStorage = function() {\n        if (!(this instanceof LocalStorage)) {\n            return new LocalStorage();\n        }\n\n        localStorage.setItem('kc-test', 'test');\n        localStorage.removeItem('kc-test');\n\n        var cs = this;\n\n        /**\n         * Clears all values from local storage that are no longer valid.\n         */\n        function clearInvalidValues() {\n            const currentTime = Date.now();\n\n            for (const [key, value] of getStoredEntries()) {\n                // Attempt to parse the expiry time from the value.\n                const expiry = parseExpiry(value);\n\n                // Discard the value if it is malformed or expired.\n                if (expiry === null || expiry \u003c currentTime) {\n                    localStorage.removeItem(key);\n                }\n            }\n        }\n\n        /**\n         * Clears all known values from local storage.\n         */\n        function clearAllValues() {\n            for (const [key] of getStoredEntries()) {\n                localStorage.removeItem(key);\n            }\n        }\n\n        /**\n         * Gets all entries stored in local storage that are known to be managed by this class.\n         * @returns {Array\u003c[string, unknown]\u003e} An array of key-value pairs.\n         */\n        function getStoredEntries() {\n            return Object.entries(localStorage).filter(([key]) =\u003e key.startsWith(STORAGE_KEY_PREFIX));\n        }\n\n        /**\n         * Parses the expiry time from a value stored in local storage.\n         * @param {unknown} value\n         * @returns {number | null} The expiry time in milliseconds, or `null` if the value is malformed.\n         */\n        function parseExpiry(value) {\n            let parsedValue;\n\n            // Attempt to parse the value as JSON.\n            try {\n                parsedValue = JSON.parse(value);\n            } catch (error) {\n                return null;\n            }\n\n            // Attempt to extract the 'expires' property.\n            if (isObject(parsedValue) \u0026\u0026 'expires' in parsedValue \u0026\u0026 typeof parsedValue.expires === 'number') {\n                return parsedValue.expires;\n            }\n\n            return null;\n        }\n\n        cs.get = function(state) {\n            if (!state) {\n                return;\n            }\n\n            var key = STORAGE_KEY_PREFIX + state;\n            var value = localStorage.getItem(key);\n            if (value) {\n                localStorage.removeItem(key);\n                value = JSON.parse(value);\n            }\n\n            clearInvalidValues();\n            return value;\n        };\n\n        cs.add = function(state) {\n            clearInvalidValues();\n\n            const key = STORAGE_KEY_PREFIX + state.state;\n            const value = JSON.stringify({\n                ...state,\n                // Set the expiry time to 1 hour from now.\n                expires: Date.now() + (60 * 60 * 1000)\n            });\n\n            try {\n                localStorage.setItem(key, value);\n            } catch (error) {\n                // If the storage is full, clear all known values and try again.\n                clearAllValues();\n                localStorage.setItem(key, value);\n            }\n        };\n    };\n\n    var CookieStorage = function() {\n        if (!(this instanceof CookieStorage)) {\n            return new CookieStorage();\n        }\n\n        var cs = this;\n\n        cs.get = function(state) {\n            if (!state) {\n                return;\n            }\n\n            var value = getCookie(STORAGE_KEY_PREFIX + state);\n            setCookie(STORAGE_KEY_PREFIX + state, '', cookieExpiration(-100));\n            if (value) {\n                return JSON.parse(value);\n            }\n        };\n\n        cs.add = function(state) {\n            setCookie(STORAGE_KEY_PREFIX + state.state, JSON.stringify(state), cookieExpiration(60));\n        };\n\n        cs.removeItem = function(key) {\n            setCookie(key, '', cookieExpiration(-100));\n        };\n\n        var cookieExpiration = function (minutes) {\n            var exp = new Date();\n            exp.setTime(exp.getTime() + (minutes*60*1000));\n            return exp;\n        };\n\n        var getCookie = function (key) {\n            var name = key + '=';\n            var ca = document.cookie.split(';');\n            for (var i = 0; i \u003c ca.length; i++) {\n                var c = ca[i];\n                while (c.charAt(0) == ' ') {\n                    c = c.substring(1);\n                }\n                if (c.indexOf(name) == 0) {\n                    return c.substring(name.length, c.length);\n                }\n            }\n            return '';\n        };\n\n        var setCookie = function (key, value, expirationDate) {\n            var cookie = key + '=' + value + '; '\n                + 'expires=' + expirationDate.toUTCString() + '; ';\n            document.cookie = cookie;\n        }\n    };\n\n    function createCallbackStorage() {\n        try {\n            return new LocalStorage();\n        } catch (err) {\n        }\n\n        return new CookieStorage();\n    }\n\n    function createLogger(fn) {\n        return function() {\n            if (kc.enableLogging) {\n                fn.apply(console, Array.prototype.slice.call(arguments));\n            }\n        };\n    }\n}\n\nexport default Keycloak;\n\n/**\n * @param {ArrayBuffer} bytes\n * @see https://developer.mozilla.org/en-US/docs/Glossary/Base64#the_unicode_problem\n */\nfunction bytesToBase64(bytes) {\n    const binString = String.fromCodePoint(...bytes);\n    return btoa(binString);\n}\n\n/**\n * @param {string} message\n * @see https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/digest#basic_example\n */\nasync function sha256Digest(message) {\n    const encoder = new TextEncoder();\n    const data = encoder.encode(message);\n\n    if (typeof crypto === \"undefined\" || typeof crypto.subtle === \"undefined\") {\n        throw new Error(\"Web Crypto API is not available.\");\n    }\n\n    return await crypto.subtle.digest(\"SHA-256\", data);\n}\n\n/**\n * @param {string} token\n */\nfunction decodeToken(token) {\n    const [header, payload] = token.split(\".\");\n\n    if (typeof payload !== \"string\") {\n        throw new Error(\"Unable to decode token, payload not found.\");\n    }\n\n    let decoded;\n\n    try {\n        decoded = base64UrlDecode(payload);\n    } catch (error) {\n        throw new Error(\"Unable to decode token, payload is not a valid Base64URL value.\", { cause: error });\n    }\n\n    try {\n        return JSON.parse(decoded);\n    } catch (error) {\n        throw new Error(\"Unable to decode token, payload is not a valid JSON value.\", { cause: error });\n    }\n}\n\n/**\n * @param {string} input\n */\nfunction base64UrlDecode(input) {\n    let output = input\n        .replaceAll(\"-\", \"+\")\n        .replaceAll(\"_\", \"/\");\n\n    switch (output.length % 4) {\n        case 0:\n            break;\n        case 2:\n            output += \"==\";\n            break;\n        case 3:\n            output += \"=\";\n            break;\n        default:\n            throw new Error(\"Input is not of the correct length.\");\n    }\n\n    try {\n        return b64DecodeUnicode(output);\n    } catch (error) {\n        return atob(output);\n    }\n}\n\n/**\n * @param {string} input\n */\nfunction b64DecodeUnicode(input) {\n    return decodeURIComponent(atob(input).replace(/(.)/g, (m, p) =\u003e {\n        let code = p.charCodeAt(0).toString(16).toUpperCase();\n\n        if (code.length \u003c 2) {\n            code = \"0\" + code;\n        }\n\n        return \"%\" + code;\n    }));\n}\n\n/**\n * Check if the input is an object that can be operated on.\n * @param {unknown} input\n */\nfunction isObject(input) {\n    return typeof input === 'object' \u0026\u0026 input !== null;\n}\n"],"version":3}
